#ifdef XOAP
#include <libxml/parser.h>
#endif /* XOAP */
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+#endif
/* local headers */
#include "core.h"
#ifdef IOSTATS
int top_io;
#endif
-#ifdef __linux__
int top_running;
-#endif
int output_methods;
static int extra_newline;
enum x_initialiser_state x_initialised = NO;
double update_interval;
double update_interval_old;
double update_interval_bat;
+int update_heartbeat_battery_skip = 1;
+int update_skips_when_sleeping = 5;
+int update_heartbeat_min = 0;
+int update_heartbeat_max = 0;
void *global_cpu = NULL;
unsigned int max_text_width = 0;
#ifdef IMLIB2
" * Imlib2\n"
#endif /* IMLIB2 */
-#ifdef MIXER_IS_ALSA
- " * ALSA mixer support\n"
-#endif /* MIXER_IS_ALSA */
#ifdef APCUPSD
" * apcupsd\n"
#endif /* APCUPSD */
char *ps, *pe;
int special_index = 0; /* specials index */
+ if(! b) return;
for (ps = b, pe = b; *pe; pe++) {
if (*pe == '\n') {
*pe = '\0';
spaced_print(buf, size, "%d", 6, round_to_int(num));
return;
}
- if (short_units) {
+ if (short_units || llabs(num) < 1000LL) {
width = 5;
format = "%.*f%.1s";
} else {
* adjusting the decimal part of the number. Sample output:
* 123MiB
* 23.4GiB
- * 5.12B
+ * 5.12B
* so the point of alignment resides between number and unit. The
* upside of this is that there is minimal padding necessary, though
* there should be a way to make alignment take place at the decimal
- * dot (then with fixed width decimal part).
+ * dot (then with fixed width decimal part).
*
* Note the repdigits below: when given a precision value, printf()
* rounds the float to it, not just cuts off the remaining digits. So
buff_in[0] = 0;
#endif /* HAVE_ICONV */
+ if(! p) return;
+
p[0] = 0;
obj = root.next;
while (obj && p_max_size > 0) {
OBJ(battery_time) {
get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_TIME);
}
+ OBJ(battery_volts) {
+ get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_VOLTS);
+ }
+ OBJ(battery_temp) {
+ get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_TEMP);
+ }
+ OBJ(battery_rate) {
+ get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_RATE);
+ }
OBJ(battery_percent) {
percent_print(p, p_max_size, get_battery_perct(obj->data.s));
}
OBJ(battery_short) {
get_battery_short_status(p, p_max_size, obj->data.s);
}
+ OBJ(cell_radio_dbm) {
+ get_dbus_stuff(p, p_max_size, DBUS_CELL_DBM);
+ }
+ OBJ(cell_radio_percent) {
+ get_dbus_stuff(p, p_max_size, DBUS_CELL_PERCENT);
+ }
#endif /* __OpenBSD__ */
OBJ(buffers) {
OBJ(nodename) {
snprintf(p, p_max_size, "%s", cur->uname_s.nodename);
}
+ OBJ(nodename_short) {
+ char *pos;
+ pos = strstr(cur->uname_s.nodename, ".");
+ if(pos != NULL) {
+ snprintf(p, MIN(pos-cur->uname_s.nodename+1, p_max_size), "%s", cur->uname_s.nodename);
+ } else {
+ snprintf(p, p_max_size, "%s", cur->uname_s.nodename);
+ }
+ }
OBJ(outlinecolor) {
new_outline(p, obj->data.l);
}
OBJ(xmms2_percent) {
snprintf(p, p_max_size, "%2.0f", cur->xmms2.progress * 100);
}
+#ifdef X11
OBJ(xmms2_bar) {
new_bar(obj, p, p_max_size, (int) (cur->xmms2.progress * 255.0f));
}
+#endif /* X11 */
OBJ(xmms2_playlist) {
snprintf(p, p_max_size, "%s", cur->xmms2.playlist);
}
snprintf(p, p_max_size, "%s",
cur->audacious.items[AUDACIOUS_MAIN_VOLUME]);
}
+#ifdef X11
OBJ(audacious_bar) {
double progress;
atof(cur->audacious.items[AUDACIOUS_LENGTH_SECONDS]);
new_bar(obj, p, p_max_size, (int) (progress * 255.0f));
}
+#endif /* X11 */
#endif /* AUDACIOUS */
#ifdef BMPX
/* we have four different types of top (top, top_mem,
* top_time and top_io). To avoid having almost-same code four
* times, we have this special handler. */
-#ifdef __linux__
break;
case OBJ_top:
case OBJ_top_mem:
case OBJ_top_io:
#endif
print_top(obj, p, p_max_size);
-#endif /* __linux__ */
OBJ(tail) {
print_tailhead("tail", obj, p, p_max_size);
}
}
}
}
- OBJ(to_bytes) {
+ OBJ(to_bytes) {//commented code is original - not working when input value contains a decimal point
char buf[max_user_text];
- long long bytes;
+ //long long bytes;
+ long double bytes;
char unit[16]; // 16 because we can also have long names (like mega-bytes)
generate_text_internal(buf, max_user_text, *obj->sub, cur);
- if(sscanf(buf, "%lli%s", &bytes, unit) == 2 && strlen(unit) < 16){
- if(strncasecmp("b", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes);
- else if(strncasecmp("k", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024);
- else if(strncasecmp("m", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024 * 1024);
- else if(strncasecmp("g", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024 * 1024 * 1024);
- else if(strncasecmp("t", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024 * 1024 * 1024 * 1024);
+// if(sscanf(buf, "%lli%s", &bytes, unit) == 2 && strlen(unit) < 16){
+// if(strncasecmp("b", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes);
+// else if(strncasecmp("k", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024);
+// else if(strncasecmp("m", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024 * 1024);
+// else if(strncasecmp("g", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024 * 1024 * 1024);
+// else if(strncasecmp("t", unit, 1) == 0) snprintf(buf, max_user_text, "%lli", bytes * 1024 * 1024 * 1024 * 1024);
+// }
+ if(sscanf(buf, "%Lf%s", &bytes, unit) == 2 && strlen(unit) < 16){
+ if(strncasecmp("b", unit, 1) == 0) snprintf(buf, max_user_text, "%Lf", bytes);
+ else if(strncasecmp("k", unit, 1) == 0) snprintf(buf, max_user_text, "%Lf", bytes * 1024);
+ else if(strncasecmp("m", unit, 1) == 0) snprintf(buf, max_user_text, "%Lf", bytes * 1024 * 1024);
+ else if(strncasecmp("g", unit, 1) == 0) snprintf(buf, max_user_text, "%Lf", bytes * 1024 * 1024 * 1024);
+ else if(strncasecmp("t", unit, 1) == 0) snprintf(buf, max_user_text, "%Lf", bytes * 1024 * 1024 * 1024 * 1024);
}
snprintf(p, p_max_size, "%s", buf);
}
}
#ifdef NVIDIA
OBJ(nvidia) {
- print_nvidia_value(obj, display, p, p_max_size);
+ print_nvidia_value(obj, p, p_max_size);
}
#endif /* NVIDIA */
#ifdef APCUPSD
#ifdef HAVE_ICONV
iconv_convert(&a, buff_in, p, p_max_size);
#endif /* HAVE_ICONV */
- if (obj->type != OBJ_text && obj->type != OBJ_execp && obj->type != OBJ_execpi
+ if (obj->type == OBJ_execp || obj->type == OBJ_execpi || obj->type
+ == OBJ_exec
#ifdef HAVE_LUA
- && obj->type != OBJ_lua && obj->type != OBJ_lua_parse
+ || obj->type == OBJ_lua || obj->type == OBJ_lua_parse
#endif /* HAVE_LUA */
) {
substitute_newlines(p, a - 2);
);
}
#endif /* DEBUG_lol */
- XSetForeground(display, window.gc, tmpcolour[
- (int)((float)(w - 2) - specials[special_index].graph[j] *
- (w - 2) / (float)specials[special_index].graph_scale)
- ]);
+ set_foreground_color(tmpcolour[
+ (int)((float)(w - 2) -
+ specials[special_index].graph[j]
+ * (w - 2) /
+ (float)specials[special_index].graph_scale)
+ ]);
} else {
- XSetForeground(display, window.gc, tmpcolour[colour_idx++]);
+ set_foreground_color(tmpcolour[colour_idx++]);
}
}
/* this is mugfugly, but it works */
{
#ifdef HAVE_XDBE
if (use_xdbe) {
- /* The swap action is XdbeBackground, which clears */
+/*
+ The swap action is XdbeBackground, which clears
return;
+*/
+ if (display && window.back_buffer) { // make sure these are !null
+ /* there is some extra space for borders and outlines */
+ XFillRectangle(display, window.back_buffer, window.gc_back,
+ text_start_x - window.border_inner_margin - window.border_outer_margin - window.border_width,
+ text_start_y - window.border_inner_margin - window.border_outer_margin - window.border_width,
+ text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2,
+ text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2);
+ }
+
+
} else
#endif
if (display && window.window) { // make sure these are !null
last_update_time = 0.0;
next_update_time = get_time();
info.looped = 0;
+
+
+ // append arguments
+ if (update_heartbeat_min < update_heartbeat_max){
+ msg = dbus_message_new_method_call("net.appcheck.Proximus", // target service
+ "/Proximus", // object path
+ "net.appcheck.Proximus", // interface to call on
+ "startTimer"); // method name
+ if (NULL == msg) {
+ fprintf(stderr, "Message Null\n");
+ exit(1);
+ }
+ if (!dbus_message_append_args(msg, DBUS_TYPE_INT32, &update_heartbeat_min, DBUS_TYPE_INT32, &update_heartbeat_max, DBUS_TYPE_INVALID)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+ DBusMessage *reply;
+ dbus_error_init (&err);
+ reply = dbus_connection_send_with_reply_and_block (conn, msg, 1500, &err);
+
+ if (dbus_error_is_set(&err))
+ {
+ fprintf (stderr, "dbus Error %s: %s\n",err.name,err.message);
+ }
+
+
+ if(reply) {
+ //fprintf (stderr, "got dbus reply to startTimer\n");
+ dbus_message_unref (reply);
+ }
+ else{
+ fprintf (stderr, "no reply to startTimer\n");
+ update_heartbeat_min = update_heartbeat_max;
+ }
+ dbus_message_unref (msg);
+ }
+
+ int WantSkips;
+ int DoneSkips;
+ bool sleeping = false; //i assume it's pretty hard to start this with the screen off...
+
while (terminate == 0 && (total_run_times == 0 || info.looped < total_run_times)) {
+ //fprintf(stderr, "started main_loop_while\n");
if(update_interval_bat != NOBATTERY && update_interval_bat != update_interval_old) {
char buf[max_user_text];
- get_battery_short_status(buf, max_user_text, "BAT0");
+ get_battery_short_status(buf, max_user_text, "bq27200-0"); //why is this even hardcoded here? oh well.
if(buf[0] == 'D') {
update_interval = update_interval_bat;
+ WantSkips = update_heartbeat_battery_skip;
} else {
update_interval = update_interval_old;
+ WantSkips = 0;
}
}
+ if (sleeping) WantSkips = update_skips_when_sleeping;
info.looped++;
+ DoneSkips = 0;
#ifdef SIGNAL_BLOCKING
/* block signals. we will inspect for pending signals later */
fd_set fdsr;
struct timeval tv;
int s;
- t = next_update_time - get_time();
-
- if (t < 0) {
- t = 0;
- } else if (t > update_interval) {
- t = update_interval;
- }
+ //should look for /org/freedesktop/Hal/devices/bme com.nokia.bme.signal
+ if (update_heartbeat_min != update_heartbeat_max) { //wait for signal
+ // add a rule for which messages we want to see
+ dbus_bus_add_match(conn,
+ "type='signal',interface='net.appcheck.Proximus'",
+ &err); // see signals from the given interface
+ dbus_bus_add_match(conn2,
+ "type='signal',interface='com.nokia.mce.signal'",
+ &err); // see signals from the given interface
+ dbus_connection_flush(conn);
+ dbus_connection_flush(conn2);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Match Error (%s)\n", err.message);
+ exit(1);
+ }
+
+ int exitloop = 0;
+ while (exitloop == 0 && info.looped >= 10) { //first 10 frames drawn fast because if using lua + cairo it takes a while to get going
+ // non blocking read of the next available message
+ dbus_connection_read_write(conn, 0);
+ dbus_connection_read_write(conn2, 0);
+ msg = dbus_connection_pop_message(conn);
+
+ // loop again if we haven't read a message
+ if (NULL == msg) {
+ msg = dbus_connection_pop_message(conn2);
+ if (NULL == msg){
+ sleep(1);
+ continue;
+ }
+ }
+ // check if the message is a signal from the correct interface and with the correct name
+ if (dbus_message_is_signal(msg, "net.appcheck.Proximus", "heartbeat")) {
+ if(WantSkips == 0 || DoneSkips >= WantSkips){
+ exitloop = 1;
+ fprintf(stderr, PACKAGE_NAME": woke by heartbeat\n");
+ }
+ else {
+ fprintf(stderr, PACKAGE_NAME": ignoring this heartbeat\n");
+ DoneSkips++;
+ }
+ }
+ else if (dbus_message_is_signal(msg, "com.nokia.mce.signal", "display_status_ind")){
+ // read the parameters
+ if (!dbus_message_iter_init(msg, &args))
+ fprintf(stderr, "Message has no arguments!\n");
+ else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args))
+ fprintf(stderr, "Argument is not string!\n");
+ else {
+ char* sigvalue;
+ dbus_message_iter_get_basic(&args, &sigvalue);
+ if(!strcmp(sigvalue, MCE_DISPLAY_ON_STRING)){
+ printf("wakeup because got display_status_ind signal with value %s\n", sigvalue);
+ exitloop = 1;
+ sleeping = false;
+ }
+ else if(!strcmp(sigvalue, MCE_DISPLAY_OFF_STRING)){
+ printf("sleeping because got display_status_ind signal with value %s\n", sigvalue);
+ WantSkips = update_skips_when_sleeping;
+ sleeping = true;
+ }
+ }
+ }
+ else{
+ //fprintf(stderr, PACKAGE_NAME": got dbus junk\n");
+ }
+ dbus_message_unref(msg);
+ }
+ t = 0;//force legacy timer to skip -- update now or as soon as x is ready
+ }
+ else{ //signal not available, set up for legacy timer
+ t = next_update_time - get_time();
+ if (t < 0) {
+ t = 0;
+ }
+ else if (t > update_interval) {
+ t = update_interval;
+ }
+ }
tv.tv_sec = (long) t;
tv.tv_usec = (long) (t * 1000000) % 1000000;
draw_stuff(); /* redraw everything in our newly sized window */
XResizeWindow(display, window.window, window.width,
window.height); /* resize window */
+ fprintf(stderr, PACKAGE_NAME": resizing window to %d x %d\n",window.width,window.height);
+#ifdef HAVE_XDBE
+ if (use_xdbe) {
+ XFreePixmap(display, window.back_buffer);
+ window.back_buffer = XCreatePixmap(display, window.window,
+ window.width, window.height, window.depth);
+ if (window.back_buffer != None)
+ window.drawable = window.back_buffer;
+ else {
+ window.drawable = window.window;
+ use_xdbe = 0;
+ }
+#ifdef IMLIB2
+ {
+ cimlib_init(display, window.drawable, window.visual, window.colourmap);
+ }
+#endif /* IMLIB2 */
+ }
+#endif
set_transparent_background(window.window, own_window_argb_value);
#ifdef HAVE_XDBE
/* swap buffers */
window.window, &attrs)) {
window.width = attrs.width;
window.height = attrs.height;
+ fprintf(stderr, PACKAGE_NAME": x11? resized our window to %d x %d\n",window.width,window.height);
}
+#ifdef HAVE_XDBE
+ if (use_xdbe) {
+ XFreePixmap(display, window.back_buffer);
+ window.back_buffer = XCreatePixmap(display, window.window,
+ window.width, window.height, window.depth);
+ if (window.back_buffer != None)
+ window.drawable = window.back_buffer;
+ else {
+ window.drawable = window.window;
+ use_xdbe = 0;
+ }
+#ifdef IMLIB2
+ {
+ cimlib_init(display, window.drawable, window.visual, window.colourmap);
+ }
+#endif /* IMLIB2 */
+
+ }
+#endif
}
text_width = window.width - window.border_inner_margin * 2 - window.border_outer_margin * 2 - window.border_width * 2;
window.type == TYPE_DESKTOP) {
/* allow conky to hold input focus. */
break;
+ } else if(TEST_HINT(window.hints,HINT_FULLSCREEN)) {
+ //detect top right click
+ if (ev.xbutton.x > 750 && ev.xbutton.y < 50)
+ {
+ terminate = 1;
+ }
+ if (ev.xbutton.x <= 50 && ev.xbutton.y <= 50)
+ { //minimize / goto task switcher
+ dbus_exit_app_view();
+ }
+ break;
} else {
/* forward the click to the desktop window */
XUngrabPointer(display, ev.xbutton.time);
} else {
#endif /* X11 */
t = (next_update_time - get_time()) * 1000000;
+ //fprintf(stderr, PACKAGE_NAME": trying to sleep %d microseconds\n",t);
if(t > 0) usleep((useconds_t)t);
update_text();
draw_stuff();
llua_update_info(&info, update_interval);
#endif /* HAVE_LUA */
g_signal_pending = 0;
- }
+ }//end of while{} (the real loop)
clean_up(current_mail_spool, NULL);
#ifdef HAVE_SYS_INOTIFY_H
inotify_fd = inotify_config_wd = 0;
}
#endif /* HAVE_SYS_INOTIFY_H */
-}
+}//end of main_loop()
#ifdef X11
static void load_config_file_x11(const char *);
initialisation(argc_copy, argv_copy);
}
-void clean_up(void *memtofree1, void* memtofree2)
+#ifdef X11
+void clean_up_x11(void)
{
- int i;
+ if(window_created == 1) {
+ XClearArea(display, window.window, text_start_x - window.border_inner_margin - window.border_outer_margin - window.border_width,
+ text_start_y - window.border_inner_margin - window.border_outer_margin - window.border_width,
+ text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2,
+ text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2, 0);
+ }
+ destroy_window();
+ free_fonts();
+ fonts = NULL;
+ if(x11_stuff.region) {
+ XDestroyRegion(x11_stuff.region);
+ x11_stuff.region = NULL;
+ }
+ if(display) {
+ XCloseDisplay(display);
+ display = NULL;
+ }
+ if(info.x11.desktop.all_names) {
+ free(info.x11.desktop.all_names);
+ info.x11.desktop.all_names = NULL;
+ }
+ if (info.x11.desktop.name) {
+ free(info.x11.desktop.name);
+ info.x11.desktop.name = NULL;
+ }
+ x_initialised = NO;
+}
+#endif
- free_update_callbacks();
+void clean_up_without_threads(void *memtofree1, void* memtofree2) {
+ int i;
#ifdef NCURSES
if(output_methods & TO_NCURSES) {
}
#ifdef X11
if (x_initialised == YES) {
- if(window_created == 1) {
- XClearArea(display, window.window, text_start_x - window.border_inner_margin - window.border_outer_margin - window.border_width,
- text_start_y - window.border_inner_margin - window.border_outer_margin - window.border_width,
- text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2,
- text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2, 0);
- }
- destroy_window();
- free_fonts();
- if(x11_stuff.region) {
- XDestroyRegion(x11_stuff.region);
- x11_stuff.region = NULL;
- }
- XCloseDisplay(display);
- display = NULL;
- if(info.x11.desktop.all_names) {
- free(info.x11.desktop.all_names);
- info.x11.desktop.all_names = NULL;
- }
- if (info.x11.desktop.name) {
- free(info.x11.desktop.name);
- info.x11.desktop.name = NULL;
- }
- x_initialised = NO;
+ clean_up_x11();
}else{
free(fonts); //in set_default_configurations a font is set but not loaded
font_count = -1;
}
+#ifdef NVIDIA
+ set_nvidia_display(NULL);
+#endif
#endif /* X11 */
free_templates();
}
}
+void clean_up(void *memtofree1, void* memtofree2)
+{
+ free_update_callbacks();
+ clean_up_without_threads(memtofree1, memtofree2);
+}
+
static int string_to_bool(const char *s)
{
if (!s) {
#ifdef IOSTATS
top_io = 0;
#endif
-#ifdef __linux__
top_running = 0;
-#endif
#ifdef MPD
mpd_env_host = getenv("MPD_HOST");
mpd_env_port = getenv("MPD_PORT");
output_methods = TO_STDOUT;
#endif
#ifdef X11
+#ifdef BUILD_XFT
+ use_xft = 0;
+#endif
show_graph_scale = 0;
show_graph_range = 0;
draw_shades = 1;
#ifdef X11
CONF2("out_to_x") {
- /* don't listen if X is already initialised or
- * if we already know we don't want it */
- if(x_initialised != YES) {
- if (string_to_bool(value)) {
- output_methods &= TO_X;
- } else {
- output_methods &= ~TO_X;
- x_initialised = NEVER;
- }
+ if (string_to_bool(value)) {
+ output_methods &= TO_X;
+ } else {
+ clean_up_x11();
+ output_methods &= ~TO_X;
+ x_initialised = NEVER;
}
}
CONF("display") {
disp = strdup(value);
}
}
+#ifdef NVIDIA
+ CONF("nvidia_display") {
+ if(value)
+ set_nvidia_display(value);
+ }
+#endif
CONF("alignment") {
setalignment(&text_alignment, window.type, value, f, line, 1);
}
SET_HINT(window.hints, HINT_STICKY);
} else if (strncmp(p_hint, "skip_taskbar", 12) == EQUAL) {
SET_HINT(window.hints, HINT_SKIP_TASKBAR);
- } else if (strncmp(p_hint, "skip_pager", 10) == EQUAL) {
- SET_HINT(window.hints, HINT_SKIP_PAGER);
+ } else if (strncmp(p_hint, "fullscreen", 10) == EQUAL) {
+ SET_HINT(window.hints, HINT_FULLSCREEN);
} else {
CONF_ERR;
}
}
#endif /* IMLIB2 */
#endif /* X11 */
+ CONF("update_heartbeat_min") {
+ if (value) {
+ update_heartbeat_min = strtod(value, 0);
+ } else {
+ CONF_ERR;
+ }
+ }
+ CONF("update_heartbeat_max") {
+ if (value) {
+ update_heartbeat_max = strtod(value, 0);
+ } else {
+ CONF_ERR;
+ }
+ }
+ CONF("update_heartbeat_battery_skip") {
+ if (value) {
+ update_heartbeat_battery_skip = strtod(value, 0);
+ } else {
+ CONF_ERR;
+ }
+ }
+ CONF("update_skips_when_sleeping") {
+ if (value) {
+ update_skips_when_sleeping = strtod(value, 0);
+ } else {
+ CONF_ERR;
+ }
+ }
CONF("update_interval_on_battery") {
if (value) {
update_interval_bat = strtod(value, 0);
"kvm_open")) == NULL) {
CRIT_ERR(NULL, NULL, "cannot read kvm");
}
+ pthread_mutex_init(&kvm_proc_mutex, NULL);
#endif
while (1) {
tcp_portmon_set_max_connections(0);
#endif
+#ifdef HAVE_CURL
+ if(curl_global_init(CURL_GLOBAL_ALL))
+ NORM_ERR("curl_global_init() failed, you may not be able to use curl variables");
+#endif
+
/* handle command line parameters that don't change configs */
#ifdef X11
if (((s = getenv("LC_ALL")) && *s) || ((s = getenv("LC_CTYPE")) && *s)
initialisation(argc, argv);
first_pass = 0; /* don't ever call fork() again */
+
+ //dbus code from http://www.matthew.ath.cx/misc/dbus
+ dbus_error_init(&err);
+ // connect to the bus
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ conn2 = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (NULL == conn || NULL == conn2) {
+ exit(1);
+ }
+ // request a name on the bus (we don't use it for now)
+ ret = dbus_bus_request_name(conn, "net.appcheck.Conky",
+ DBUS_NAME_FLAG_REPLACE_EXISTING
+ , &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Name Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
+ //dbus_connection_close(conn);
+ fprintf(stderr, "some other dbus Name Error\n");
+ // exit(1);
+ }
+
main_loop();
+
+ dbus_connection_close(conn);
+ dbus_connection_close(conn2);
+
+#ifdef HAVE_CURL
+ curl_global_cleanup();
+#endif
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
kvm_close(kd);
+ pthread_mutex_destroy(&kvm_proc_mutex);
#endif
return 0;
{
/* signal handler is light as a feather, as it should be.
* we will poll g_signal_pending with each loop of conky
- * and do any signal processing there, NOT here (except
+ * and do any signal processing there, NOT here (except
* SIGALRM because this is caused when conky is hanging) */
if(sig == SIGALRM) {
alarm_handler();