* Please see COPYING for details
*
* Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
- * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
+ * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al.
* (see AUTHORS)
* All rights reserved.
*
#ifdef XOAP
#include <libxml/parser.h>
#endif /* XOAP */
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+#endif
/* local headers */
#include "core.h"
#include "diskio.h"
#include "entropy.h"
#include "exec.h"
+#include "i8k.h"
#include "proc.h"
#include "user.h"
#ifdef X11
/* debugging level, used by logging.h */
int global_debug_level = 0;
+/* disable inotify auto reload feature if desired */
+int disable_auto_reload = 0;
+
/* two strings for internal use */
static char *tmpstring1, *tmpstring2;
#ifdef IOSTATS
int top_io;
#endif
-#ifdef __linux__
int top_running;
-#endif
-static unsigned int top_name_width = 15;
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;
int argc_copy;
char** argv_copy;
# ifdef XFT
" * Xft\n"
# endif /* XFT */
+# ifdef USE_ARGB
+ " * ARGB visual\n"
+# endif /* USE_ARGB */
#endif /* X11 */
"\n Music detection:\n"
#ifdef AUDACIOUS
#ifdef IMLIB2
" * Imlib2\n"
#endif /* IMLIB2 */
-#ifdef MIXER_IS_ALSA
- " * ALSA mixer support\n"
-#endif /* MIXER_IS_ALSA */
#ifdef APCUPSD
" * apcupsd\n"
#endif /* APCUPSD */
/* alignments */
enum alignment {
- TOP_LEFT = 1,
+ ALIGNMENT_ERROR,
+ TOP_LEFT,
TOP_RIGHT,
TOP_MIDDLE,
BOTTOM_LEFT,
/* fork? */
static int fork_to_background;
+/* set to 0 after the first time conky is run, so we don't fork again after the
+ * first forking */
+static int first_pass = 1;
+
static int cpu_avg_samples, net_avg_samples, diskio_avg_samples;
/* filenames for output */
}
fclose(where);
} else {
- NORM_ERR("Could not open the file");
+ NORM_ERR("Could not open the file '%s'", f);
}
return ret;
}
#define SECRIT_MULTILINE_CHAR '\x02'
-static inline int calc_text_width(const char *s)
+int calc_text_width(const char *s)
{
size_t slen = strlen(s);
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
generate_text_internal(p, p_max_size, *root, cur);
}
-static inline void format_media_player_time(char *buf, const int size,
- int seconds)
-{
- int days, hours, minutes;
-
- days = seconds / (24 * 60 * 60);
- seconds %= (24 * 60 * 60);
- hours = seconds / (60 * 60);
- seconds %= (60 * 60);
- minutes = seconds / 60;
- seconds %= 60;
-
- if (days > 0) {
- snprintf(buf, size, "%i days %i:%02i:%02i", days,
- hours, minutes, seconds);
- } else if (hours > 0) {
- snprintf(buf, size, "%i:%02i:%02i", hours, minutes,
- seconds);
- } else {
- snprintf(buf, size, "%i:%02i", minutes, seconds);
- }
-}
-
/* substitutes all occurrences of '\n' with SECRIT_MULTILINE_CHAR, which allows
* multiline objects like $exec work with $align[rc] and friends
*/
buff_in[0] = 0;
#endif /* HAVE_ICONV */
+ if(! p) return;
+
p[0] = 0;
obj = root.next;
while (obj && p_max_size > 0) {
}
#if defined(__linux__)
OBJ(voltage_mv) {
- static int ok = 1;
- if (ok) {
- ok = get_voltage(p, p_max_size, "%.0f", 1,
- obj->data.i);
- }
+ print_voltage_mv(obj, p, p_max_size);
}
OBJ(voltage_v) {
- static int ok = 1;
- if (ok) {
- ok = get_voltage(p, p_max_size, "%'.3f", 1000,
- obj->data.i);
- }
+ print_voltage_v(obj, p, p_max_size);
}
#ifdef HAVE_IWLIB
get_acpi_fan(p, p_max_size);
}
OBJ(acpiacadapter) {
- get_acpi_ac_adapter(p, p_max_size);
+ get_acpi_ac_adapter(p, p_max_size, (const char *)obj->data.opaque);
}
OBJ(battery) {
get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_STATUS);
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_bar) {
-#ifdef X11
- if(output_methods & TO_X) {
- new_bar(obj, p, get_battery_perct_bar(obj->data.s));
- }else
-#endif /* X11 */
- new_bar_in_shell(obj, p, p_max_size, get_battery_perct_bar(obj->data.s) / 2.55);
+ new_bar(obj, p, p_max_size, get_battery_perct_bar(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) {
print_cmdline_to_pid(obj, p, p_max_size);
}
OBJ(cpu) {
- if (obj->data.i > info.cpu_count) {
- NORM_ERR("obj->data.i %i info.cpu_count %i",
- obj->data.i, info.cpu_count);
- CRIT_ERR(NULL, NULL, "attempting to use more CPUs than you have!");
- }
- percent_print(p, p_max_size,
+ if (cur->cpu_usage) {
+ if (obj->data.i > info.cpu_count) {
+ NORM_ERR("obj->data.i %i info.cpu_count %i",
+ obj->data.i, info.cpu_count);
+ CRIT_ERR(NULL, NULL, "attempting to use more CPUs than you have!");
+ }
+ percent_print(p, p_max_size,
round_to_int(cur->cpu_usage[obj->data.i] * 100.0));
+ }
}
-#ifdef X11
OBJ(cpugauge)
- new_gauge(obj, p, round_to_int(cur->cpu_usage[obj->data.i] * 255.0));
-#endif /* X11 */
+ new_gauge(obj, p, p_max_size, round_to_int(cur->cpu_usage[obj->data.i] * 255.0));
OBJ(cpubar) {
-#ifdef X11
- if(output_methods & TO_X) {
- new_bar(obj, p, round_to_int(cur->cpu_usage[obj->data.i] * 255.0));
- }else
-#endif /* X11 */
- new_bar_in_shell(obj, p, p_max_size, round_to_int(cur->cpu_usage[obj->data.i] * 100));
+ new_bar(obj, p, p_max_size, round_to_int(cur->cpu_usage[obj->data.i] * 255.0));
}
#ifdef X11
OBJ(cpugraph) {
- new_graph(obj, p, round_to_int(cur->cpu_usage[obj->data.i] * 100));
+ new_graph(obj, p, p_max_size, round_to_int(cur->cpu_usage[obj->data.i] * 100));
}
OBJ(loadgraph) {
- print_loadgraph(obj, p);
+ print_loadgraph(obj, p, p_max_size);
}
#endif /* X11 */
OBJ(color) {
new_fg(p, color9);
}
#endif /* X11 */
- OBJ(conky_version) {
- snprintf(p, p_max_size, "%s", VERSION);
- }
- OBJ(conky_build_date) {
- snprintf(p, p_max_size, "%s", BUILD_DATE);
- }
- OBJ(conky_build_arch) {
- snprintf(p, p_max_size, "%s", BUILD_ARCH);
- }
#if defined(__linux__)
OBJ(disk_protect) {
snprintf(p, p_max_size, "%s",
get_disk_protect_queue(obj->data.s));
}
OBJ(i8k_version) {
- snprintf(p, p_max_size, "%s", i8k.version);
+ print_i8k_version(obj, p, p_max_size);
}
OBJ(i8k_bios) {
- snprintf(p, p_max_size, "%s", i8k.bios);
+ print_i8k_bios(obj, p, p_max_size);
}
OBJ(i8k_serial) {
- snprintf(p, p_max_size, "%s", i8k.serial);
+ print_i8k_serial(obj, p, p_max_size);
}
OBJ(i8k_cpu_temp) {
- int cpu_temp;
-
- sscanf(i8k.cpu_temp, "%d", &cpu_temp);
- temp_print(p, p_max_size, (double)cpu_temp, TEMP_CELSIUS);
+ print_i8k_cpu_temp(obj, p, p_max_size);
}
OBJ(i8k_left_fan_status) {
- int left_fan_status;
-
- sscanf(i8k.left_fan_status, "%d", &left_fan_status);
- if (left_fan_status == 0) {
- snprintf(p, p_max_size, "off");
- }
- if (left_fan_status == 1) {
- snprintf(p, p_max_size, "low");
- }
- if (left_fan_status == 2) {
- snprintf(p, p_max_size, "high");
- }
+ print_i8k_left_fan_status(obj, p, p_max_size);
}
OBJ(i8k_right_fan_status) {
- int right_fan_status;
-
- sscanf(i8k.right_fan_status, "%d", &right_fan_status);
- if (right_fan_status == 0) {
- snprintf(p, p_max_size, "off");
- }
- if (right_fan_status == 1) {
- snprintf(p, p_max_size, "low");
- }
- if (right_fan_status == 2) {
- snprintf(p, p_max_size, "high");
- }
+ print_i8k_right_fan_status(obj, p, p_max_size);
}
OBJ(i8k_left_fan_rpm) {
- snprintf(p, p_max_size, "%s", i8k.left_fan_rpm);
+ print_i8k_left_fan_rpm(obj, p, p_max_size);
}
OBJ(i8k_right_fan_rpm) {
- snprintf(p, p_max_size, "%s", i8k.right_fan_rpm);
+ print_i8k_right_fan_rpm(obj, p, p_max_size);
}
OBJ(i8k_ac_status) {
- int ac_status;
-
- sscanf(i8k.ac_status, "%d", &ac_status);
- if (ac_status == -1) {
- snprintf(p, p_max_size, "disabled (read i8k docs)");
- }
- if (ac_status == 0) {
- snprintf(p, p_max_size, "off");
- }
- if (ac_status == 1) {
- snprintf(p, p_max_size, "on");
- }
+ print_i8k_ac_status(obj, p, p_max_size);
}
OBJ(i8k_buttons_status) {
- snprintf(p, p_max_size, "%s", i8k.buttons_status);
+ print_i8k_buttons_status(obj, p, p_max_size);
}
#if defined(IBM)
OBJ(ibm_fan) {
- get_ibm_acpi_fan(p, p_max_size);
+ get_ibm_acpi_fan(obj, p, p_max_size);
}
OBJ(ibm_temps) {
print_ibm_temps(obj, p, p_max_size);
}
OBJ(ibm_volume) {
- get_ibm_acpi_volume(p, p_max_size);
+ get_ibm_acpi_volume(obj, p, p_max_size);
}
OBJ(ibm_brightness) {
- get_ibm_acpi_brightness(p, p_max_size);
+ get_ibm_acpi_brightness(obj, p, p_max_size);
}
#endif /* IBM */
/* information from sony_laptop kernel module
}
#endif /* X11 */
OBJ(diskio) {
- print_diskio(obj, 0, p, p_max_size);
+ print_diskio(obj, p, p_max_size);
}
OBJ(diskio_write) {
- print_diskio(obj, 1, p, p_max_size);
+ print_diskio_write(obj, p, p_max_size);
}
OBJ(diskio_read) {
- print_diskio(obj, -1, p, p_max_size);
+ print_diskio_read(obj, p, p_max_size);
}
#ifdef X11
OBJ(diskiograph) {
- print_diskiograph(obj, 0, p);
+ print_diskiograph(obj, p, p_max_size);
}
OBJ(diskiograph_read) {
- print_diskiograph(obj, -1, p);
+ print_diskiograph_read(obj, p, p_max_size);
}
OBJ(diskiograph_write) {
- print_diskiograph(obj, 1, p);
+ print_diskiograph_write(obj, p, p_max_size);
}
#endif /* X11 */
OBJ(downspeed) {
}
#ifdef X11
OBJ(downspeedgraph) {
- print_downspeedgraph(obj, p);
+ print_downspeedgraph(obj, p, p_max_size);
}
#endif /* X11 */
OBJ(else) {
OBJ(execp) {
print_execp(obj, p, p_max_size);
}
-#ifdef X11
OBJ(execgauge) {
print_execgauge(obj, p, p_max_size);
}
-#endif /* X11 */
OBJ(execbar) {
print_execbar(obj, p, p_max_size);
}
OBJ(execigraph) {
print_execigraph(obj, p, p_max_size);
}
+#endif /* X11 */
OBJ(execigauge) {
print_execigauge(obj, p, p_max_size);
}
-#endif /* X11 */
OBJ(execi) {
print_execi(obj, p, p_max_size);
}
#endif
#ifdef HAVE_LUA
OBJ(lua) {
- char *str = llua_getstring(obj->data.s);
- if (str) {
- snprintf(p, p_max_size, "%s", str);
- free(str);
- }
+ print_lua(obj, p, p_max_size);
}
OBJ(lua_parse) {
- char *str = llua_getstring(obj->data.s);
- if (str) {
- evaluate(str, p, p_max_size);
- free(str);
- }
+ print_lua_parse(obj, p, p_max_size);
}
OBJ(lua_bar) {
- double per;
- if (llua_getnumber(obj->data.s, &per)) {
-#ifdef X11
- if(output_methods & TO_X) {
- new_bar(obj, p, (per/100.0 * 255));
- } else
-#endif /* X11 */
- new_bar_in_shell(obj, p, p_max_size, per);
- }
+ print_lua_bar(obj, p, p_max_size);
}
#ifdef X11
OBJ(lua_graph) {
- double per;
- if (llua_getnumber(obj->data.s, &per)) {
- new_graph(obj, p, per);
- }
+ print_lua_graph(obj, p, p_max_size);
}
+#endif /* X11 */
OBJ(lua_gauge) {
- double per;
- if (llua_getnumber(obj->data.s, &per)) {
- new_gauge(obj, p, (per/100.0 * 255));
- }
+ print_lua_gauge(obj, p, p_max_size);
}
-#endif /* X11 */
#endif /* HAVE_LUA */
#ifdef HDDTEMP
OBJ(hddtemp) {
DO_JUMP;
} else if (spc) {
*spc = '\0';
- if (check_contains(obj->data.s, spc + 1))
+ if (!check_contains(obj->data.s, spc + 1))
DO_JUMP;
*spc = ' ';
}
if (cur->memmax)
percent_print(p, p_max_size, cur->mem * 100 / cur->memmax);
}
-#ifdef X11
OBJ(memgauge){
- new_gauge(obj, p, cur->memmax ? (cur->mem * 255) / (cur->memmax) : 0);
+ new_gauge(obj, p, p_max_size, cur->memmax ? (cur->mem * 255) / (cur->memmax) : 0);
}
-#endif /* X11 */
OBJ(membar) {
-#ifdef X11
- if(output_methods & TO_X) {
- new_bar(obj, p, cur->memmax ? (cur->mem * 255) / (cur->memmax) : 0);
- }else
-#endif /* X11 */
- new_bar_in_shell(obj, p, p_max_size, cur->memmax ? (cur->mem * 100) / (cur->memmax) : 0);
+ new_bar(obj, p, p_max_size, cur->memmax ? (cur->mem * 255) / (cur->memmax) : 0);
}
#ifdef X11
OBJ(memgraph) {
- new_graph(obj, p, cur->memmax ? (cur->mem * 100.0) / (cur->memmax) : 0.0);
+ new_graph(obj, p, p_max_size, cur->memmax ? (cur->mem * 100.0) / (cur->memmax) : 0.0);
}
#endif /* X11 */
/* mixer stuff */
OBJ(mixer) {
- print_mixer(obj, 0, p, p_max_size);
+ print_mixer(obj, p, p_max_size);
}
OBJ(mixerl) {
- print_mixer(obj, -1, p, p_max_size);
+ print_mixerl(obj, p, p_max_size);
}
OBJ(mixerr) {
- print_mixer(obj, 1, p, p_max_size);
+ print_mixerr(obj, p, p_max_size);
}
-#ifdef X11
OBJ(mixerbar) {
- print_mixer_bar(obj, 0, p);
+ print_mixer_bar(obj, p, p_max_size);
}
OBJ(mixerlbar) {
- print_mixer_bar(obj, -1, p);
+ print_mixerl_bar(obj, p, p_max_size);
}
OBJ(mixerrbar) {
- print_mixer_bar(obj, 1, p);
+ print_mixerr_bar(obj, p, p_max_size);
}
-#endif /* X11 */
OBJ(if_mixer_mute) {
if (!check_mixer_muted(obj)) {
DO_JUMP;
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->data.s = buf;
print_pid_fsgid(obj, p, p_max_size);
}
+ OBJ(pid_read) {
+ char buf[max_user_text];
+
+ generate_text_internal(buf, max_user_text, *obj->sub, cur);
+ obj->data.s = buf;
+ print_pid_read(obj, p, p_max_size);
+ }
OBJ(pid_vmpeak) {
char buf[max_user_text];
obj->data.s = buf;
print_pid_vmpte(obj, p, p_max_size);
}
+ OBJ(pid_write) {
+ char buf[max_user_text];
+
+ generate_text_internal(buf, max_user_text, *obj->sub, cur);
+ obj->data.s = buf;
+ print_pid_write(obj, p, p_max_size);
+ }
OBJ(processes) {
spaced_print(p, p_max_size, "%hu", 4, cur->procs);
}
}
}
OBJ(swapbar) {
-#ifdef X11
- if(output_methods & TO_X) {
- new_bar(obj, p, cur->swapmax ? (cur->swap * 255) / (cur->swapmax) : 0);
- }else
-#endif /* X11 */
- new_bar_in_shell(obj, p, p_max_size, cur->swapmax ? (cur->swap * 100) / (cur->swapmax) : 0);
+ new_bar(obj, p, p_max_size, cur->swapmax ? (cur->swap * 255) / (cur->swapmax) : 0);
}
OBJ(sysname) {
snprintf(p, p_max_size, "%s", cur->uname_s.sysname);
}
#ifdef X11
OBJ(upspeedgraph) {
- print_upspeedgraph(obj, p);
+ print_upspeedgraph(obj, p, p_max_size);
}
#endif /* X11 */
OBJ(uptime_short) {
#endif /* __FreeBSD__ __OpenBSD__ */
#ifdef MPD
-#define mpd_printf(fmt, val) \
- snprintf(p, p_max_size, fmt, mpd_get_info()->val)
-#define mpd_sprintf(val) { \
- if (!obj->data.i || obj->data.i > p_max_size) \
- mpd_printf("%s", val); \
- else \
- snprintf(p, obj->data.i, "%s", mpd_get_info()->val); \
-}
OBJ(mpd_title)
- mpd_sprintf(title);
+ print_mpd_title(obj, p, p_max_size);
OBJ(mpd_artist)
- mpd_sprintf(artist);
+ print_mpd_artist(obj, p, p_max_size);
OBJ(mpd_album)
- mpd_sprintf(album);
+ print_mpd_album(obj, p, p_max_size);
OBJ(mpd_random)
- mpd_printf("%s", random);
+ print_mpd_random(obj, p, p_max_size);
OBJ(mpd_repeat)
- mpd_printf("%s", repeat);
+ print_mpd_repeat(obj, p, p_max_size);
OBJ(mpd_track)
- mpd_sprintf(track);
+ print_mpd_track(obj, p, p_max_size);
OBJ(mpd_name)
- mpd_sprintf(name);
+ print_mpd_name(obj, p, p_max_size);
OBJ(mpd_file)
- mpd_sprintf(file);
+ print_mpd_file(obj, p, p_max_size);
OBJ(mpd_vol)
- mpd_printf("%d", volume);
+ print_mpd_vol(obj, p, p_max_size);
OBJ(mpd_bitrate)
- mpd_printf("%d", bitrate);
+ print_mpd_bitrate(obj, p, p_max_size);
OBJ(mpd_status)
- mpd_printf("%s", status);
+ print_mpd_status(obj, p, p_max_size);
OBJ(mpd_elapsed) {
- format_media_player_time(p, p_max_size, mpd_get_info()->elapsed);
+ print_mpd_elapsed(obj, p, p_max_size);
}
OBJ(mpd_length) {
- format_media_player_time(p, p_max_size, mpd_get_info()->length);
+ print_mpd_length(obj, p, p_max_size);
}
OBJ(mpd_percent) {
- percent_print(p, p_max_size, (int)(mpd_get_info()->progress * 100));
+ print_mpd_percent(obj, p, p_max_size);
}
OBJ(mpd_bar) {
-#ifdef X11
- if(output_methods & TO_X) {
- new_bar(obj, p, (int) (mpd_get_info()->progress * 255.0f));
- } else
-#endif /* X11 */
- new_bar_in_shell(obj, p, p_max_size, (int) (mpd_get_info()->progress * 100.0f));
+ print_mpd_bar(obj, p, p_max_size);
}
OBJ(mpd_smart) {
- struct mpd_s *mpd = mpd_get_info();
- int len = obj->data.i;
- if (len == 0 || len > p_max_size)
- len = p_max_size;
-
- memset(p, 0, p_max_size);
- if (mpd->artist && *mpd->artist &&
- mpd->title && *mpd->title) {
- snprintf(p, len, "%s - %s", mpd->artist,
- mpd->title);
- } else if (mpd->title && *mpd->title) {
- snprintf(p, len, "%s", mpd->title);
- } else if (mpd->artist && *mpd->artist) {
- snprintf(p, len, "%s", mpd->artist);
- } else if (mpd->file && *mpd->file) {
- snprintf(p, len, "%s", mpd->file);
- } else {
- *p = 0;
- }
+ print_mpd_smart(obj, p, p_max_size);
}
OBJ(if_mpd_playing) {
if (!mpd_get_info()->is_playing) {
DO_JUMP;
}
}
-#undef mpd_sprintf
-#undef mpd_printf
#endif
#ifdef MOC
}
#ifdef X11
OBJ(xmms2_bar) {
- new_bar(obj, p, (int) (cur->xmms2.progress * 255.0f));
+ new_bar(obj, p, p_max_size, (int) (cur->xmms2.progress * 255.0f));
}
#endif /* X11 */
OBJ(xmms2_playlist) {
progress =
atof(cur->audacious.items[AUDACIOUS_POSITION_SECONDS]) /
atof(cur->audacious.items[AUDACIOUS_LENGTH_SECONDS]);
- new_bar(obj, p, (int) (progress * 255.0f));
+ new_bar(obj, p, p_max_size, (int) (progress * 255.0f));
}
#endif /* X11 */
#endif /* AUDACIOUS */
/* 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:
#ifdef IOSTATS
case OBJ_top_io:
#endif
- /* yes, passing top_name_width instead
- * of p_max_size is intended here */
- print_top(obj, p, top_name_width);
-#endif /* __linux__ */
+ print_top(obj, p, p_max_size);
OBJ(tail) {
print_tailhead("tail", obj, p, p_max_size);
}
print_tailhead("head", obj, p, p_max_size);
}
OBJ(lines) {
- static int rep = 0;
- FILE *fp = open_file(obj->data.s, &rep);
-
- if(fp != NULL) {
-/* FIXME: use something more general (see also tail.c, head.c */
-#define BUFSZ 0x1000
- char buf[BUFSZ];
- int j, lines;
-
- lines = 0;
- while(fgets(buf, BUFSZ, fp) != NULL){
- for(j = 0; buf[j] != 0; j++) {
- if(buf[j] == '\n') {
- lines++;
- }
- }
- }
- sprintf(p, "%d", lines);
- fclose(fp);
- } else {
- sprintf(p, "File Unreadable");
- }
+ print_lines(obj, p, p_max_size);
}
OBJ(words) {
- static int rep = 0;
- FILE *fp = open_file(obj->data.s, &rep);
-
- if(fp != NULL) {
- char buf[BUFSZ];
- int j, words;
- char inword = FALSE;
-
- words = 0;
- while(fgets(buf, BUFSZ, fp) != NULL){
- for(j = 0; buf[j] != 0; j++) {
- if(!isspace(buf[j])) {
- if(inword == FALSE) {
- words++;
- inword = TRUE;
- }
- } else {
- inword = FALSE;
- }
- }
- }
- sprintf(p, "%d", words);
- fclose(fp);
- } else {
- sprintf(p, "File Unreadable");
- }
+ print_words(obj, p, p_max_size);
}
#ifdef TCP_PORT_MONITOR
OBJ(tcp_portmon) {
}
#ifdef IBM
OBJ(smapi) {
- char *s;
- if(obj->data.s) {
- s = smapi_get_val(obj->data.s);
- snprintf(p, p_max_size, "%s", s);
- free(s);
- }
+ print_smapi(obj, p, p_max_size);
}
OBJ(if_smapi_bat_installed) {
int idx;
NORM_ERR("argument to if_smapi_bat_installed must be an integer");
}
OBJ(smapi_bat_perc) {
- int idx, val;
- if(obj->data.s && sscanf(obj->data.s, "%i", &idx) == 1) {
- val = smapi_bat_installed(idx) ?
- smapi_get_bat_int(idx, "remaining_percent") : 0;
- percent_print(p, p_max_size, val);
- } else
- NORM_ERR("argument to smapi_bat_perc must be an integer");
+ print_smapi_bat_perc(obj, p, p_max_size);
}
OBJ(smapi_bat_temp) {
- int idx, val;
- if(obj->data.s && sscanf(obj->data.s, "%i", &idx) == 1) {
- val = smapi_bat_installed(idx) ?
- smapi_get_bat_int(idx, "temperature") : 0;
- /* temperature is in milli degree celsius */
- temp_print(p, p_max_size, val / 1000, TEMP_CELSIUS);
- } else
- NORM_ERR("argument to smapi_bat_temp must be an integer");
+ print_smapi_bat_temp(obj, p, p_max_size);
}
OBJ(smapi_bat_power) {
- int idx, val;
- if(obj->data.s && sscanf(obj->data.s, "%i", &idx) == 1) {
- val = smapi_bat_installed(idx) ?
- smapi_get_bat_int(idx, "power_now") : 0;
- /* power_now is in mW, set to W with one digit precision */
- snprintf(p, p_max_size, "%.1f", ((double)val / 1000));
- } else
- NORM_ERR("argument to smapi_bat_power must be an integer");
+ print_smapi_bat_power(obj, p, p_max_size);
}
-#ifdef X11
OBJ(smapi_bat_bar) {
- if(obj->data.i >= 0 && smapi_bat_installed(obj->data.i))
- new_bar(obj, p, (int)
- (255 * smapi_get_bat_int(obj->data.i, "remaining_percent") / 100));
- else
- new_bar(obj, p, 0);
+ print_smapi_bat_bar(obj, p, p_max_size);
}
-#endif /* X11 */
#endif /* IBM */
OBJ(include) {
if(obj->sub) {
}
}
}
- 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
}
OBJ(apcupsd_loadbar) {
double progress;
-#ifdef X11
- if(output_methods & TO_X) {
- progress = atof(cur->apcupsd.items[APCUPSD_LOAD]) / 100.0 * 255.0;
- new_bar(obj, p, (int) progress);
- } else
-#endif /* X11 */
- {
- progress = atof(cur->apcupsd.items[APCUPSD_LOAD]);
- new_bar_in_shell(obj, p, p_max_size, (int) progress);
- }
+ progress = atof(cur->apcupsd.items[APCUPSD_LOAD]) / 100.0 * 255.0;
+ new_bar(obj, p, p_max_size, (int) progress);
}
#ifdef X11
OBJ(apcupsd_loadgraph) {
double progress;
progress = atof(cur->apcupsd.items[APCUPSD_LOAD]);
- new_graph(obj, p, (int)progress);
+ new_graph(obj, p, p_max_size, (int)progress);
}
+#endif /* X11 */
OBJ(apcupsd_loadgauge) {
double progress;
progress = atof(cur->apcupsd.items[APCUPSD_LOAD]) / 100.0 * 255.0;
- new_gauge(obj, p, (int)progress);
+ new_gauge(obj, p, p_max_size, (int)progress);
}
-#endif /* X11 */
OBJ(apcupsd_charge) {
snprintf(p, p_max_size, "%s",
cur->apcupsd.items[APCUPSD_CHARGE]);
#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);
tmp_info = malloc(sizeof(struct information));
memcpy(tmp_info, &info, sizeof(struct information));
parse_conky_vars(&subroot, text, p, p_max_size, tmp_info);
- DBGP("evaluated '%s' to '%s'", text, p);
+ DBGP2("evaluated '%s' to '%s'", text, p);
free_text_objects(&subroot, 1);
free(tmp_info);
{
struct information *cur = &info;
char *p;
+ unsigned int i, j, k;
special_count = 0;
p = text_buffer;
generate_text_internal(p, max_user_text, global_root_object, cur);
+ if(max_text_width > 0) {
+ for(i = 0, j = 0; p[i] != 0; i++) {
+ if(p[i] == '\n') j = 0;
+ else if(j == max_text_width) {
+ k = i + strlen(p + i) + 1;
+ if(k < text_buffer_size) {
+ while(k != i) {
+ p[k] = p[k-1];
+ k--;
+ }
+ p[k] = '\n';
+ j = 0;
+ } else NORM_ERR("The end of the text_buffer is reached, increase \"text_buffer_size\"");
+ } else j++;
+ }
+ }
if (stuff_in_uppercase) {
char *tmp_p;
update_interval_old = interval;
}
-static inline int get_string_width(const char *s)
+int get_string_width(const char *s)
{
return *s ? calc_text_width(s) : 0;
}
static int text_size_updater(char *s, int special_index)
{
int w = 0;
+ int lw;
+ int contain_SECRIT_MULTILINE_CHAR = 0;
char *p;
if ((output_methods & TO_X) == 0)
special_index++;
s = p + 1;
} else if (*p == SECRIT_MULTILINE_CHAR) {
- int lw;
+ contain_SECRIT_MULTILINE_CHAR = 1;
*p = '\0';
lw = get_string_width(s);
*p = SECRIT_MULTILINE_CHAR;
}
p++;
}
- w += get_string_width(s);
+ /* Check also last substring if string contains SECRIT_MULTILINE_CHAR */
+ if (contain_SECRIT_MULTILINE_CHAR) {
+ lw = get_string_width(s);
+ w = lw > w ? lw : w;
+ } else {
+ w += get_string_width(s);
+ }
if (w > text_width) {
text_width = w;
}
{
#ifdef X11
if (output_methods & TO_X) {
- current_color = c;
- XSetForeground(display, window.gc, c);
+#ifdef USE_ARGB
+ if (have_argb_visual) {
+ current_color = c | (own_window_argb_value << 24);
+ } else {
+#endif /* USE_ARGB */
+ current_color = c;
+#ifdef USE_ARGB
+ }
+#endif /* USE_ARGB */
+ XSetForeground(display, window.gc, current_color);
}
#endif /* X11 */
#ifdef NCURSES
XftColor c2;
c.pixel = current_color;
- XQueryColor(display, DefaultColormap(display, screen), &c);
+ // query color on custom colormap
+ XQueryColor(display, window.colourmap, &c);
c2.pixel = c.pixel;
c2.color.red = c.red;
);
}
#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 */
if (seconds != 0) {
timeunits = seconds / 86400; seconds %= 86400;
if (timeunits > 0) {
- asprintf(&tmp_day_str, "%dd", timeunits);
+ if (asprintf(&tmp_day_str, "%dd", timeunits) < 0) {
+ tmp_day_str = 0;
+ }
} else {
tmp_day_str = strdup("");
}
timeunits = seconds / 3600; seconds %= 3600;
if (timeunits > 0) {
- asprintf(&tmp_hour_str, "%dh", timeunits);
+ if (asprintf(&tmp_hour_str, "%dh", timeunits) < 0) {
+ tmp_day_str = 0;
+ }
} else {
tmp_hour_str = strdup("");
}
timeunits = seconds / 60; seconds %= 60;
if (timeunits > 0) {
- asprintf(&tmp_min_str, "%dm", timeunits);
+ if (asprintf(&tmp_min_str, "%dm", timeunits) < 0) {
+ tmp_min_str = 0;
+ }
} else {
tmp_min_str = strdup("");
}
if (seconds > 0) {
- asprintf(&tmp_sec_str, "%ds", seconds);
+ if (asprintf(&tmp_sec_str, "%ds", seconds) < 0) {
+ tmp_sec_str = 0;
+ }
} else {
tmp_sec_str = strdup("");
}
- asprintf(&tmp_str, "%s%s%s%s", tmp_day_str, tmp_hour_str, tmp_min_str, tmp_sec_str);
- free(tmp_day_str); free(tmp_hour_str); free(tmp_min_str); free(tmp_sec_str);
+ if (asprintf(&tmp_str, "%s%s%s%s", tmp_day_str,
+ tmp_hour_str, tmp_min_str, tmp_sec_str) < 0) {
+ tmp_str = 0;
+ }
+#define FREE(a) if ((a)) free((a));
+ FREE(tmp_day_str); FREE(tmp_hour_str); FREE(tmp_min_str); FREE(tmp_sec_str);
} else {
- asprintf(&tmp_str, "Range not possible"); // should never happen, but better safe then sorry
+ tmp_str = strdup("Range not possible"); /* should never happen, but better safe then sorry */
}
cur_x += (w / 2) - (font_ascent() * (strlen(tmp_str) / 2));
cur_y += font_h / 2;
draw_string(tmp_str);
- free(tmp_str);
+ FREE(tmp_str);
+#undef FREE
cur_x = tmp_x;
cur_y = tmp_y;
}
{
#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 */
- set_transparent_background(window.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 */
xdbe_swap_buffers();
#ifdef OWN_WINDOW
case ReparentNotify:
- /* set background to ParentRelative for all parents */
+ /* make background transparent */
if (own_window) {
- set_transparent_background(window.window);
+ set_transparent_background(window.window, own_window_argb_value);
}
break;
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();
break;
}
#ifdef HAVE_SYS_INOTIFY_H
- if (inotify_fd != -1 && inotify_config_wd == -1 && current_config != 0) {
+ if (!disable_auto_reload && inotify_fd != -1 && inotify_config_wd == -1 && current_config != 0) {
inotify_config_wd = inotify_add_watch(inotify_fd,
current_config,
IN_MODIFY);
}
- if (inotify_fd != -1 && inotify_config_wd != -1 && current_config != 0) {
+ if (!disable_auto_reload && inotify_fd != -1 && inotify_config_wd != -1 && current_config != 0) {
int len = 0, idx = 0;
fd_set descriptors;
struct timeval time_to_wait;
current_config,
IN_MODIFY);
}
+ break;
}
#ifdef HAVE_LUA
else {
idx += INOTIFY_EVENT_SIZE + ev->len;
}
}
+ } else if (disable_auto_reload && inotify_fd != -1) {
+ inotify_rm_watch(inotify_fd, inotify_config_wd);
+ close(inotify_fd);
+ inotify_fd = inotify_config_wd = 0;
}
#endif /* HAVE_SYS_INOTIFY_H */
llua_update_info(&info, update_interval);
#endif /* HAVE_LUA */
g_signal_pending = 0;
- }
- clean_up(NULL, NULL);
+ }//end of while{} (the real loop)
+ clean_up(current_mail_spool, NULL);
#ifdef HAVE_SYS_INOTIFY_H
if (inotify_fd != -1) {
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 *);
{
char *current_config_copy = strdup(current_config);
clean_up(NULL, NULL);
+ sleep(1); /* slight pause */
current_config = current_config_copy;
initialisation(argc_copy, argv_copy);
}
-void clean_up(void *memtofree1, void* memtofree2)
+#ifdef X11
+void clean_up_x11(void)
{
+ 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
+
+void clean_up_without_threads(void *memtofree1, void* memtofree2) {
int i;
#ifdef NCURSES
}
#ifdef X11
if (x_initialised == YES) {
- 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_update_callbacks();
-
free_templates();
free_text_objects(&global_root_object, 0);
}
}
+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) {
} else if (strcasecmp(s, "none") == EQUAL) {
return NONE;
}
- return TOP_LEFT;
+ return ALIGNMENT_ERROR;
}
#endif /* X11 */
#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;
window.hints = 0;
strcpy(window.class_name, PACKAGE_NAME);
sprintf(window.title, PACKAGE_NAME" (%s)", info.uname_s.nodename);
+#ifdef USE_ARGB
+ use_argb_visual = 0;
+ own_window_argb_value = 255;
+#endif
#endif
stippled_borders = 0;
window.border_inner_margin = 3;
text_alignment = BOTTOM_LEFT;
info.x11.monitor.number = 1;
info.x11.monitor.current = 0;
- info.x11.desktop.current = 1;
+ info.x11.desktop.current = 1;
info.x11.desktop.number = 1;
info.x11.desktop.nitems = 0;
- info.x11.desktop.all_names = NULL;
- info.x11.desktop.name = NULL;
+ info.x11.desktop.all_names = NULL;
+ info.x11.desktop.name = NULL;
#endif /* X11 */
free_templates();
stuff_in_uppercase = 0;
info.users.number = 1;
+ set_times_in_seconds(0);
+
#ifdef TCP_PORT_MONITOR
/* set default connection limit */
tcp_portmon_set_max_connections(0);
NORM_ERR("X Error: Display %lx\n",
(long unsigned)d
);
- abort();
+ exit(1);
}
#endif /* DEBUG */
XMoveWindow(display, window.window, window.x, window.y);
}
if (own_window) {
- set_transparent_background(window.window);
+ set_transparent_background(window.window, own_window_argb_value);
}
#endif
return 0;
}
+#ifdef X11
+void setalignment(int* ltext_alignment, unsigned int windowtype, const char* value, const char *f, int line, char setbyconffile) {
+#ifdef OWN_WINDOW
+ if (windowtype == TYPE_DOCK) {
+ NORM_ERR("alignment is disabled when own_window_type is dock");
+ } else
+#endif /*OWN_WINDOW */
+ if (value) {
+ int a = string_to_alignment(value);
+
+ if (a <= 0) {
+ if (setbyconffile) {
+ CONF_ERR;
+ } else NORM_ERR("'%s' is not a alignment setting", value);
+ } else {
+ *ltext_alignment = a;
+ }
+ } else if (setbyconffile) {
+ CONF_ERR;
+ }
+}
+#endif /* X11 */
+
char load_config_file(const char *f)
{
int line = 0;
#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") {
-#ifdef OWN_WINDOW
- if (window.type == TYPE_DOCK)
- ;
- else
-#endif /*OWN_WINDOW */
- if (value) {
- int a = string_to_alignment(value);
-
- if (a <= 0) {
- CONF_ERR;
- } else {
- text_alignment = a;
- }
- } else {
- CONF_ERR;
- }
+ setalignment(&text_alignment, window.type, value, f, line, 1);
}
CONF("background") {
fork_to_background = string_to_bool(value);
CONF("border_width") {
if (value) {
window.border_width = strtol(value, 0, 0);
- if (window.border_width < 0) window.border_width = 0;
+ if (window.border_width < 1) window.border_width = 1;
} else {
CONF_ERR;
}
draw_outline = string_to_bool(value);
}
#endif /* X11 */
+ CONF("times_in_seconds") {
+ set_times_in_seconds(string_to_bool(value));
+ }
+ CONF("max_text_width") {
+ max_text_width = atoi(value);
+ }
CONF("out_to_console") {
if(string_to_bool(value)) {
output_methods |= TO_STDOUT;
CONF("extra_newline") {
extra_newline = string_to_bool(value);
}
+ CONF("disable_auto_reload") {
+ disable_auto_reload = string_to_bool(value);
+ }
CONF("out_to_stderr") {
if(string_to_bool(value))
output_methods |= TO_STDERR;
no_buffers = string_to_bool(value);
}
CONF("top_name_width") {
- if (value) {
- if (sscanf(value, "%u", &top_name_width) != 1) {
- CONF_ERR;
- }
- } else {
+ if (set_top_name_width(value))
CONF_ERR;
- }
- if (top_name_width >= max_user_text) {
- top_name_width = max_user_text - 1;
- }
}
CONF("top_cpu_separate") {
cpu_separate = string_to_bool(value);
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;
}
CONF_ERR;
}
}
+#ifdef USE_ARGB
+ CONF("own_window_argb_visual") {
+ use_argb_visual = string_to_bool(value);
+ }
+ CONF("own_window_argb_value") {
+ own_window_argb_value = strtol(value, 0, 0);
+ if (own_window_argb_value > 255 || own_window_argb_value < 0) {
+ CONF_ERR2("own_window_argb_value must be <= 255 and >= 0");
+ }
+ }
+#endif /* USE_ARGB */
#endif
CONF("stippled_borders") {
if (value) {
}
#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);
static const struct option longopts[] = {
{ "help", 0, NULL, 'h' },
{ "version", 0, NULL, 'V' },
+ { "quiet", 0, NULL, 'q' },
{ "debug", 0, NULL, 'D' },
{ "config", 1, NULL, 'c' },
#ifdef CONFIG_OUTPUT
{ "window-id", 1, NULL, 'w' },
#endif /* X11 */
{ "text", 1, NULL, 't' },
- { "interval", 0, NULL, 'u' },
- { "pause", 0, NULL, 'p' },
+ { "interval", 1, NULL, 'u' },
+ { "pause", 1, NULL, 'p' },
{ 0, 0, 0, 0 }
};
+void set_current_config(void);
+void set_current_config(void)
+{
+ /* check if specified config file is valid */
+ if (current_config) {
+ struct stat sb;
+ if (stat(current_config, &sb) ||
+ (!S_ISREG(sb.st_mode) && !S_ISLNK(sb.st_mode))) {
+ NORM_ERR("invalid configuration file '%s'\n", current_config);
+ free(current_config);
+ current_config = 0;
+ }
+ }
+
+ /* load current_config, CONFIG_FILE or SYSTEM_CONFIG_FILE */
+
+ if (!current_config) {
+ /* load default config file */
+ char buf[DEFAULT_TEXT_BUFFER_SIZE];
+ FILE *fp;
+
+ /* Try to use personal config file first */
+ to_real_path(buf, CONFIG_FILE);
+ if (buf[0] && (fp = fopen(buf, "r"))) {
+ current_config = strndup(buf, max_user_text);
+ fclose(fp);
+ }
+
+ /* Try to use system config file if personal config not readable */
+ if (!current_config && (fp = fopen(SYSTEM_CONFIG_FILE, "r"))) {
+ current_config = strndup(SYSTEM_CONFIG_FILE, max_user_text);
+ fclose(fp);
+ }
+
+ /* No readable config found */
+ if (!current_config) {
+#define NOCFGFILEFOUND "no readable personal or system-wide config file found"
+#ifdef BUILD_BUILTIN_CONFIG
+ current_config = strdup("==builtin==");
+ NORM_ERR(NOCFGFILEFOUND
+ ", using builtin default");
+#else
+ CRIT_ERR(NULL, NULL, NOCFGFILEFOUND);
+#endif /* ! CONF_OUTPUT */
+ }
+ }
+}
+
void initialisation(int argc, char **argv) {
struct sigaction act, oact;
set_default_configurations();
+ set_current_config();
load_config_file(current_config);
currentconffile = conftree_add(currentconffile, current_config);
"kvm_open")) == NULL) {
CRIT_ERR(NULL, NULL, "cannot read kvm");
}
+ pthread_mutex_init(&kvm_proc_mutex, NULL);
#endif
while (1) {
set_first_font(optarg);
break;
case 'a':
- text_alignment = string_to_alignment(optarg);
+ setalignment(&text_alignment, window.type, optarg, NULL, 0, 0);
break;
#ifdef OWN_WINDOW
break;
#endif /* X11 */
case 'p':
- startup_pause = atoi(optarg);
- sleep(startup_pause);
+ if (first_pass) {
+ startup_pause = atoi(optarg);
+ sleep(startup_pause);
+ }
break;
case '?':
}
global_text = NULL;
/* fork */
- if (fork_to_background) {
+ if (fork_to_background && first_pass) {
int pid = fork();
switch (pid) {
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)
current_config = strndup(optarg, max_user_text);
break;
case 'q':
- freopen("/dev/null", "w", stderr);
+ if (!freopen("/dev/null", "w", stderr)) {
+ NORM_ERR("unable to redirect stderr to /dev/null");
+ }
break;
case 'h':
print_help(argv[0]);
}
}
- /* check if specified config file is valid */
- if (current_config) {
- struct stat sb;
- if (stat(current_config, &sb) ||
- (!S_ISREG(sb.st_mode) && !S_ISLNK(sb.st_mode))) {
- NORM_ERR("invalid configuration file '%s'\n", current_config);
- free(current_config);
- current_config = 0;
- }
- }
-
- /* load current_config, CONFIG_FILE or SYSTEM_CONFIG_FILE */
-
- if (!current_config) {
- /* load default config file */
- char buf[DEFAULT_TEXT_BUFFER_SIZE];
- FILE *fp;
-
- /* Try to use personal config file first */
- to_real_path(buf, CONFIG_FILE);
- if (buf[0] && (fp = fopen(buf, "r"))) {
- current_config = strndup(buf, max_user_text);
- fclose(fp);
- }
-
- /* Try to use system config file if personal config not readable */
- if (!current_config && (fp = fopen(SYSTEM_CONFIG_FILE, "r"))) {
- current_config = strndup(SYSTEM_CONFIG_FILE, max_user_text);
- fclose(fp);
- }
-
- /* No readable config found */
- if (!current_config) {
-#ifdef CONFIG_OUTPUT
- current_config = strdup("==builtin==");
- NORM_ERR("no readable personal or system-wide config file found,"
- " using builtin default");
-#else
- CRIT_ERR(NULL, NULL, "no readable personal or system-wide config file found");
-#endif /* ! CONF_OUTPUT */
- }
- }
+ set_current_config();
#ifdef XOAP
/* Load xoap keys, if existing */
#endif /* XOAP */
#ifdef HAVE_SYS_INOTIFY_H
- inotify_fd = inotify_init1(IN_NONBLOCK);
+ inotify_fd = inotify_init();
+ if(inotify_fd != -1) {
+ int fl;
+
+ fl = fcntl(inotify_fd, F_GETFL);
+ fcntl(inotify_fd, F_SETFL, fl | O_NONBLOCK);
+ }
#endif /* HAVE_SYS_INOTIFY_H */
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();