mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-28 13:00:45 +00:00
380 lines
11 KiB
C++
380 lines
11 KiB
C++
/*
|
|
*
|
|
* Conky, a system monitor, based on torsmo
|
|
*
|
|
* Any original torsmo code is licensed under the BSD license
|
|
*
|
|
* All code written since the fork of torsmo is licensed under the GPL
|
|
*
|
|
* Please see COPYING for details
|
|
*
|
|
* Copyright (c) 2005-2019 Brenden Matthews, Philip Kovacs, et. al.
|
|
* (see AUTHORS)
|
|
* All rights reserved.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include <getopt.h>
|
|
#include <cstdio>
|
|
#include <iostream>
|
|
|
|
#include "build.h"
|
|
#include "config.h"
|
|
#include "conky.h"
|
|
#include "lua-config.hh"
|
|
|
|
#ifdef BUILD_X11
|
|
#include "x11.h"
|
|
#endif /* BUILD_X11 */
|
|
|
|
#ifdef BUILD_CURL
|
|
#include "ccurl_thread.h"
|
|
#endif /* BUILD_CURL */
|
|
|
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
|
#include "freebsd.h"
|
|
#endif /* FreeBSD */
|
|
|
|
#ifdef BUILD_BUILTIN_CONFIG
|
|
#include "defconfig.h"
|
|
|
|
#ifdef BUILD_OLD_CONFIG
|
|
#include "convertconf.h"
|
|
#endif /* BUILD_OLD_CONFIG */
|
|
#endif /* BUILD_BUILTIN_CONFIG */
|
|
|
|
static void print_version() {
|
|
std::cout << _(PACKAGE_NAME " " VERSION " compiled " BUILD_DATE
|
|
" for " BUILD_ARCH
|
|
"\n"
|
|
"\nCompiled in features:\n\n"
|
|
"System config file: " SYSTEM_CONFIG_FILE
|
|
"\n"
|
|
"Package library path: " PACKAGE_LIBDIR "\n\n")
|
|
<< _("\n General:\n")
|
|
#ifdef HAVE_OPENMP
|
|
<< _(" * OpenMP\n")
|
|
#endif /* HAVE_OPENMP */
|
|
#ifdef BUILD_MATH
|
|
<< _(" * math\n")
|
|
#endif /* BUILD_MATH */
|
|
#ifdef BUILD_HDDTEMP
|
|
<< _(" * hddtemp\n")
|
|
#endif /* BUILD_HDDTEMP */
|
|
#ifdef BUILD_PORT_MONITORS
|
|
<< _(" * portmon\n")
|
|
#endif /* BUILD_PORT_MONITORS */
|
|
#ifdef BUILD_HTTP
|
|
<< _(" * HTTP\n")
|
|
#endif /* BUILD_HTTP */
|
|
#ifdef BUILD_IPV6
|
|
<< _(" * IPv6\n")
|
|
#endif /* BUILD_IPV6 */
|
|
#ifdef BUILD_IRC
|
|
<< _(" * IRC\n")
|
|
#endif
|
|
#ifdef BUILD_CURL
|
|
<< _(" * Curl\n")
|
|
#endif /* BUILD_CURL */
|
|
#ifdef BUILD_RSS
|
|
<< _(" * RSS\n")
|
|
#endif /* BUILD_RSS */
|
|
#ifdef BUILD_ICAL
|
|
<< _(" * ICal\n")
|
|
#endif /* BUILD_ICAL */
|
|
#ifdef BUILD_ICONV
|
|
<< _(" * iconv\n")
|
|
#endif /* BUILD_ICONV */
|
|
#ifdef BUILD_MYSQL
|
|
<< _(" * MySQL\n")
|
|
#endif /* BUILD_MYSQL */
|
|
#ifdef BUILD_WEATHER_METAR
|
|
<< _(" * Weather (METAR)\n")
|
|
#endif /* BUILD_WEATHER_METAR */
|
|
#ifdef BUILD_WLAN
|
|
<< _(" * wireless\n")
|
|
#endif /* BUILD_WLAN */
|
|
#ifdef BUILD_IBM
|
|
<< _(" * support for IBM/Lenovo notebooks\n")
|
|
#endif /* BUILD_IBM */
|
|
#ifdef BUILD_NVIDIA
|
|
<< _(" * nvidia\n")
|
|
#endif /* BUILD_NVIDIA */
|
|
#ifdef BUILD_BUILTIN_CONFIG
|
|
<< _(" * builtin default configuration\n")
|
|
#endif /* BUILD_BUILTIN_CONFIG */
|
|
#ifdef BUILD_OLD_CONFIG
|
|
<< _(" * old configuration syntax\n")
|
|
#endif /* BUILD_OLD_CONFIG */
|
|
#ifdef BUILD_IMLIB2
|
|
<< _(" * Imlib2\n")
|
|
#endif /* BUILD_IMLIB2 */
|
|
#ifdef HAVE_SOME_SOUNDCARD_H
|
|
<< _(" * OSS mixer support\n")
|
|
#endif /* HAVE_SOME_SOUNDCARD_H */
|
|
#ifdef BUILD_MIXER_ALSA
|
|
<< _(" * ALSA mixer support\n")
|
|
#endif /* BUILD_MIXER_ALSA */
|
|
#ifdef BUILD_APCUPSD
|
|
<< _(" * apcupsd\n")
|
|
#endif /* BUILD_APCUPSD */
|
|
#ifdef BUILD_IOSTATS
|
|
<< _(" * iostats\n")
|
|
#endif /* BUILD_IOSTATS */
|
|
#ifdef BUILD_NCURSES
|
|
<< _(" * ncurses\n")
|
|
#endif /* BUILD_NCURSES */
|
|
#ifdef BUILD_I18N
|
|
<< _(" * Internationalization support\n")
|
|
#endif
|
|
#ifdef BUILD_PULSEAUDIO
|
|
<< _(" * PulseAudio\n")
|
|
#endif /* BUIL_PULSEAUDIO */
|
|
#ifdef DEBUG
|
|
<< _(" * Debugging extensions\n")
|
|
#endif
|
|
#if defined BUILD_LUA_CAIRO || defined BUILD_LUA_IMLIB2 || BUILD_LUA_RSVG
|
|
<< _("\n Lua bindings:\n")
|
|
#endif
|
|
#ifdef BUILD_LUA_CAIRO
|
|
<< _(" * Cairo\n")
|
|
#endif /* BUILD_LUA_CAIRO */
|
|
#ifdef BUILD_LUA_IMLIB2
|
|
<< _(" * Imlib2\n")
|
|
#endif /* BUILD_LUA_IMLIB2 */
|
|
#ifdef BUILD_LUA_RSVG
|
|
<< _(" * RSVG\n")
|
|
#endif /* BUILD_LUA_RSVG */
|
|
#ifdef BUILD_X11
|
|
<< _(" X11:\n")
|
|
#ifdef BUILD_XDAMAGE
|
|
<< _(" * Xdamage extension\n")
|
|
#endif /* BUILD_XDAMAGE */
|
|
#ifdef BUILD_XINERAMA
|
|
<< _(" * Xinerama extension (virtual display)\n")
|
|
#endif /* BUILD_XINERAMA */
|
|
#ifdef BUILD_XSHAPE
|
|
<< _(" * Xshape extension (click through)\n")
|
|
#endif /* BUILD_XSHAPE */
|
|
#ifdef BUILD_XDBE
|
|
<< _(" * XDBE (double buffer extension)\n")
|
|
#endif /* BUILD_XDBE */
|
|
#ifdef BUILD_XFT
|
|
<< _(" * Xft\n")
|
|
#endif /* BUILD_XFT */
|
|
#ifdef BUILD_ARGB
|
|
<< _(" * ARGB visual\n")
|
|
#endif /* BUILD_ARGB */
|
|
#ifdef OWN_WINDOW
|
|
<< _(" * Own window\n")
|
|
#endif
|
|
#endif /* BUILD_X11 */
|
|
#ifdef BUILD_HSV_GRADIENT
|
|
<< _(" * HSV Gradient\n")
|
|
#endif /* BUILD_HSV_GRADIENT */
|
|
#if defined BUILD_AUDACIOUS || defined BUILD_CMUS || defined BUILD_MPD || \
|
|
defined BUILD_MOC || defined BUILD_XMMS2
|
|
<< _("\n Music detection:\n")
|
|
#endif
|
|
#ifdef BUILD_AUDACIOUS
|
|
<< _(" * Audacious\n")
|
|
#endif /* BUILD_AUDACIOUS */
|
|
#ifdef BUILD_CMUS
|
|
<< _(" * CMUS\n")
|
|
#endif /* BUILD_CMUS */
|
|
#ifdef BUILD_MPD
|
|
<< _(" * MPD\n")
|
|
#endif /* BUILD_MPD */
|
|
#ifdef BUILD_MOC
|
|
<< _(" * MOC\n")
|
|
#endif /* BUILD_MOC */
|
|
#ifdef BUILD_XMMS2
|
|
<< _(" * XMMS2\n")
|
|
#endif /* BUILD_XMMS2 */
|
|
<< _("\n Default values:\n") << " * Netdevice: " DEFAULTNETDEV "\n"
|
|
<< " * Local configfile: " CONFIG_FILE "\n"
|
|
#ifdef BUILD_I18N
|
|
<< " * Localedir: " LOCALE_DIR "\n"
|
|
#endif /* BUILD_I18N */
|
|
#ifdef BUILD_HTTP
|
|
<< " * HTTP-port: " << HTTPPORT << "\n"
|
|
#endif /* BUILD_HTTP */
|
|
<< " * Maximum netdevices: " << MAX_NET_INTERFACES << "\n"
|
|
<< " * Maximum text size: " << MAX_USER_TEXT_DEFAULT << "\n"
|
|
<< " * Size text buffer: " << DEFAULT_TEXT_BUFFER_SIZE << "\n";
|
|
}
|
|
|
|
static void print_help(const char *prog_name) {
|
|
printf("Usage: %s [OPTION]...\n" PACKAGE_NAME
|
|
" is a system monitor that renders text on desktop or to own "
|
|
"transparent\n"
|
|
"window. Command line options will override configurations defined in "
|
|
"config\n"
|
|
"file.\n"
|
|
" -v, --version version\n"
|
|
" -q, --quiet quiet mode\n"
|
|
" -D, --debug increase debugging output, ie. -DD for "
|
|
"more debugging\n"
|
|
" -c, --config=FILE config file to load\n"
|
|
#ifdef BUILD_BUILTIN_CONFIG
|
|
" -C, --print-config print the builtin default config to "
|
|
"stdout\n"
|
|
" e.g. 'conky -C > ~/.conkyrc' will "
|
|
"create a new default config\n"
|
|
#endif
|
|
" -d, --daemonize daemonize, fork to background\n"
|
|
" -h, --help help\n"
|
|
#ifdef BUILD_X11
|
|
" -a, --alignment=ALIGNMENT text alignment on screen, "
|
|
"{top,bottom,middle}_{left,right,middle}\n"
|
|
" -X, --display=DISPLAY X11 display to use\n"
|
|
" -m, --xinerama-head=N Xinerama monitor index (0=first)\n"
|
|
" -f, --font=FONT font to use\n"
|
|
#ifdef OWN_WINDOW
|
|
" -o, --own-window create own window to draw\n"
|
|
#endif
|
|
" -b, --double-buffer double buffer (prevents flickering)\n"
|
|
" -w, --window-id=WIN_ID window id to draw\n"
|
|
" -x X x position\n"
|
|
" -y Y y position\n"
|
|
#endif /* BUILD_X11 */
|
|
" -t, --text=TEXT text to render, remember single quotes, "
|
|
"like -t '$uptime'\n"
|
|
" -u, --interval=SECS update interval\n"
|
|
" -i COUNT number of times to update " PACKAGE_NAME
|
|
" (and quit)\n"
|
|
" -p, --pause=SECS pause for SECS seconds at startup "
|
|
"before doing anything\n",
|
|
prog_name);
|
|
}
|
|
|
|
inline void reset_optind() {
|
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
|
|
defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
|
|
optind = optreset = 1;
|
|
#else
|
|
optind = 0;
|
|
#endif
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
#ifdef BUILD_I18N
|
|
setlocale(LC_ALL, "");
|
|
bindtextdomain(PACKAGE_NAME, LOCALE_DIR);
|
|
textdomain(PACKAGE_NAME);
|
|
#endif
|
|
argc_copy = argc;
|
|
argv_copy = argv;
|
|
g_sigterm_pending = 0;
|
|
g_sighup_pending = 0;
|
|
g_sigusr2_pending = 0;
|
|
|
|
#ifdef BUILD_CURL
|
|
struct curl_global_initializer {
|
|
curl_global_initializer() {
|
|
if (curl_global_init(CURL_GLOBAL_ALL)) {
|
|
NORM_ERR(
|
|
"curl_global_init() failed, you may not be able to use curl "
|
|
"variables");
|
|
}
|
|
}
|
|
~curl_global_initializer() { curl_global_cleanup(); }
|
|
};
|
|
curl_global_initializer curl_global;
|
|
#endif
|
|
|
|
/* handle command line parameters that don't change configs */
|
|
#ifdef BUILD_X11
|
|
if (!setlocale(LC_CTYPE, "")) {
|
|
NORM_ERR("Can't set the specified locale!\nCheck LANG, LC_CTYPE, LC_ALL.");
|
|
}
|
|
#endif /* BUILD_X11 */
|
|
while (1) {
|
|
int c = getopt_long(argc, argv, getopt_string, longopts, nullptr);
|
|
|
|
if (c == -1) { break; }
|
|
|
|
switch (c) {
|
|
case 'D':
|
|
global_debug_level++;
|
|
break;
|
|
case 'v':
|
|
case 'V':
|
|
print_version();
|
|
return EXIT_SUCCESS;
|
|
case 'c':
|
|
current_config = optarg;
|
|
break;
|
|
case 'q':
|
|
if (freopen("/dev/null", "w", stderr) == nullptr) {
|
|
CRIT_ERR(nullptr, nullptr, "could not open /dev/null as stderr!");
|
|
}
|
|
break;
|
|
case 'h':
|
|
print_help(argv[0]);
|
|
return 0;
|
|
#ifdef BUILD_BUILTIN_CONFIG
|
|
case 'C':
|
|
std::cout << defconfig;
|
|
return 0;
|
|
#endif
|
|
#ifdef BUILD_X11
|
|
case 'w':
|
|
window.window = strtol(optarg, nullptr, 0);
|
|
break;
|
|
#endif /* BUILD_X11 */
|
|
|
|
case '?':
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
|
|
try {
|
|
set_current_config();
|
|
|
|
state = std::make_unique<lua::state>();
|
|
|
|
conky::export_symbols(*state);
|
|
|
|
setup_inotify();
|
|
|
|
initialisation(argc, argv);
|
|
|
|
first_pass = 0; /* don't ever call fork() again */
|
|
|
|
main_loop();
|
|
} catch (fork_throw &e) {
|
|
return EXIT_SUCCESS;
|
|
} catch (unknown_arg_throw &e) {
|
|
return EXIT_FAILURE;
|
|
} catch (obj_create_error &e) {
|
|
std::cerr << e.what() << std::endl;
|
|
clean_up(nullptr, nullptr);
|
|
return EXIT_FAILURE;
|
|
} catch (std::exception &e) {
|
|
std::cerr << PACKAGE_NAME ": " << e.what() << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
|
kvm_close(kd);
|
|
#endif
|
|
|
|
#ifdef LEAKFREE_NCURSES
|
|
_nc_free_and_exit(0); // hide false memleaks
|
|
#endif
|
|
return 0;
|
|
}
|