Fix last commit which fails to build when X11 is not enabled
[monky] / src / conky.c
index a7fa5d2..b9e1761 100644 (file)
@@ -147,6 +147,9 @@ char *get_apm_battery_time(void);
 /* 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;
 
@@ -317,7 +320,8 @@ static int text_width, text_height;
 
 /* alignments */
 enum alignment {
-       TOP_LEFT = 1,
+       ALIGNMENT_ERROR,
+       TOP_LEFT,
        TOP_RIGHT,
        TOP_MIDDLE,
        BOTTOM_LEFT,
@@ -350,6 +354,10 @@ static unsigned long total_run_times;
 /* 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 */
@@ -462,7 +470,7 @@ int check_contains(char *f, char *s)
 
 #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);
 
@@ -862,7 +870,7 @@ void generate_text_internal(char *p, int p_max_size,
                                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);
@@ -891,13 +899,15 @@ void generate_text_internal(char *p, int p_max_size,
                                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));
+                               }
                        }
                        OBJ(cpugauge)
                                new_gauge(obj, p, p_max_size, round_to_int(cur->cpu_usage[obj->data.i] * 255.0));
@@ -1063,10 +1073,10 @@ void generate_text_internal(char *p, int p_max_size,
                                print_diskiograph(obj, p, p_max_size);
                        }
                        OBJ(diskiograph_read) {
-                               print_diskiograph(obj, p, p_max_size);
+                               print_diskiograph_read(obj, p, p_max_size);
                        }
                        OBJ(diskiograph_write) {
-                               print_diskiograph(obj, p, p_max_size);
+                               print_diskiograph_write(obj, p, p_max_size);
                        }
 #endif /* X11 */
                        OBJ(downspeed) {
@@ -2466,7 +2476,7 @@ void set_update_interval(double interval)
        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;
 }
@@ -3884,12 +3894,12 @@ static void main_loop(void)
                                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;
@@ -3916,6 +3926,7 @@ static void main_loop(void)
                                                                        current_config,
                                                                        IN_MODIFY);
                                                }
+                                               break;
                                        }
 #ifdef HAVE_LUA
                                        else {
@@ -3925,6 +3936,10 @@ static void main_loop(void)
                                        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 */
 
@@ -3954,6 +3969,7 @@ static void reload_config(void)
 {
        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);
 }
@@ -3962,6 +3978,8 @@ void clean_up(void *memtofree1, void* memtofree2)
 {
        int i;
 
+       free_update_callbacks();
+
 #ifdef NCURSES
        if(output_methods & TO_NCURSES) {
                endwin();
@@ -4013,8 +4031,6 @@ void clean_up(void *memtofree1, void* memtofree2)
 
 #endif /* X11 */
 
-       free_update_callbacks();
-
        free_templates();
 
        free_text_objects(&global_root_object, 0);
@@ -4138,7 +4154,7 @@ static enum alignment string_to_alignment(const char *s)
        } else if (strcasecmp(s, "none") == EQUAL) {
                return NONE;
        }
-       return TOP_LEFT;
+       return ALIGNMENT_ERROR;
 }
 #endif /* X11 */
 
@@ -4491,6 +4507,29 @@ static int do_config_step(int *line, FILE *fp, char *buf, char **name, char **va
        return 0;
 }
 
+#ifdef X11
+void setalignment(int* text_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 == true) {
+                               CONF_ERR;
+                       } else NORM_ERR("'%s' is not a alignment setting", value);
+               } else {
+                       *text_alignment = a;
+               }
+       } else if(setbyconffile == true) {
+               CONF_ERR;
+       }
+}
+#endif /* X11 */
+
 char load_config_file(const char *f)
 {
        int line = 0;
@@ -4534,22 +4573,7 @@ char load_config_file(const char *f)
                        }
                }
                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, true);
                }
                CONF("background") {
                        fork_to_background = string_to_bool(value);
@@ -4773,6 +4797,9 @@ char load_config_file(const char *f)
                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;
@@ -5619,7 +5646,7 @@ void initialisation(int argc, char **argv) {
                                set_first_font(optarg);
                                break;
                        case 'a':
-                               text_alignment = string_to_alignment(optarg);
+                               setalignment(&text_alignment, window.type, optarg, NULL, 0, false);
                                break;
 
 #ifdef OWN_WINDOW
@@ -5664,8 +5691,10 @@ void initialisation(int argc, char **argv) {
                                break;
 #endif /* X11 */
                        case 'p':
-                               startup_pause = atoi(optarg);
-                               sleep(startup_pause);
+                               if (first_pass) {
+                                       startup_pause = atoi(optarg);
+                                       sleep(startup_pause);
+                               }
                                break;
 
                        case '?':
@@ -5688,7 +5717,7 @@ void initialisation(int argc, char **argv) {
        }
        global_text = NULL;
        /* fork */
-       if (fork_to_background) {
+       if (fork_to_background && first_pass) {
                int pid = fork();
 
                switch (pid) {
@@ -5896,6 +5925,8 @@ int main(int argc, char **argv)
 
        initialisation(argc, argv);
 
+       first_pass = 0; /* don't ever call fork() again */
+
        main_loop();
 
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)