Don't pass mouse clicks when window is desktop type.
[monky] / src / conky.c
index 43122fa..8668d6d 100644 (file)
@@ -68,6 +68,9 @@
 #ifdef NCURSES
 #include <ncurses.h>
 #endif
+#ifdef XOAP
+#include <libxml/parser.h>
+#endif /* XOAP */
 
 /* local headers */
 #include "algebra.h"
@@ -992,6 +995,12 @@ static void free_text_objects(struct text_object *root, int internal)
                                free(data.weather.data_type);
                                break;
 #endif
+#ifdef XOAP
+                       case OBJ_weather_forecast:
+                               free(data.weather_forecast.uri);
+                               free(data.weather_forecast.data_type);
+                               break;
+#endif
 #ifdef HAVE_LUA
                        case OBJ_lua:
                        case OBJ_lua_parse:
@@ -1780,6 +1789,30 @@ static struct text_object *construct_text_object(const char *s,
                        current_text_color = obj->data.l;
                }
 #endif /* X11 */
+#ifdef NCURSES
+               if (output_methods & TO_NCURSES) {
+                       obj->data.l = COLOR_WHITE;
+                       if(arg) {
+                               if(strcasecmp(arg, "red") == 0) {
+                                       obj->data.l = COLOR_RED;
+                               }else if(strcasecmp(arg, "green") == 0) {
+                                       obj->data.l = COLOR_GREEN;
+                               }else if(strcasecmp(arg, "yellow") == 0) {
+                                       obj->data.l = COLOR_YELLOW;
+                               }else if(strcasecmp(arg, "blue") == 0) {
+                                       obj->data.l = COLOR_BLUE;
+                               }else if(strcasecmp(arg, "magenta") == 0) {
+                                       obj->data.l = COLOR_MAGENTA;
+                               }else if(strcasecmp(arg, "cyan") == 0) {
+                                       obj->data.l = COLOR_CYAN;
+                               }else if(strcasecmp(arg, "black") == 0) {
+                                       obj->data.l = COLOR_BLACK;
+                               }
+                       }
+                       current_text_color = obj->data.l;
+                       init_pair(obj->data.l, obj->data.l, COLOR_BLACK);
+               }
+#endif /* NCURSES */
        END OBJ(color0, 0)
                obj->data.l = color0;
                current_text_color = obj->data.l;
@@ -2115,7 +2148,7 @@ static struct text_object *construct_text_object(const char *s,
                        obj->type = OBJ_text;
                        return NULL;
                }
-               DBGP("parsed platform args: '%s' '%s' %d %f %f\n", buf1, buf2, n, factor, offset);
+               DBGP("parsed platform args: '%s' '%s' %d %f %f", buf1, buf2, n, factor, offset);
                obj->data.sysfs.fd = open_platform_sensor((*buf1) ? buf1 : 0, buf2, n,
                                &obj->data.sysfs.arg, obj->data.sysfs.devtype);
                strncpy(obj->data.sysfs.type, buf2, 63);
@@ -2952,7 +2985,7 @@ static struct text_object *construct_text_object(const char *s,
        END OBJ(rss, 0)
                if (arg) {
                        float interval = 0;
-                       int argc, act_par;
+                       int argc, act_par = 0;
                        unsigned int nrspaces = 0;
                        char *uri = (char *) malloc(128 * sizeof(char));
                        char *action = (char *) malloc(64 * sizeof(char));
@@ -2985,7 +3018,7 @@ static struct text_object *construct_text_object(const char *s,
                        argc = sscanf(arg, "%119s %8s %31s %f", uri, locID, data_type, &interval);
 
                        if (argc >= 3) {
-                               if (process_weather_uri(uri, locID)) {
+                               if (process_weather_uri(uri, locID, 0)) {
                                        free(data_type);
                                        free(uri);
                                        free(locID);
@@ -3017,6 +3050,57 @@ static struct text_object *construct_text_object(const char *s,
                        CRIT_ERR(obj, free_at_crash, "weather needs arguments: <uri> <locID> <data_type> [interval in minutes]");
                }
 #endif
+#ifdef XOAP
+       END OBJ(weather_forecast, 0)
+               if (arg) {
+                       int argc;
+                       unsigned int day;
+                       float interval = 0;
+                       char *locID = (char *) malloc(9 * sizeof(char));
+                       char *uri = (char *) malloc(128 * sizeof(char));
+                       char *data_type = (char *) malloc(32 * sizeof(char));
+
+                       argc = sscanf(arg, "%119s %8s %1u %31s %f", uri, locID, &day, data_type, &interval);
+
+                       if (argc >= 4) {
+                               if (process_weather_uri(uri, locID, 1)) {
+                                       free(data_type);
+                                       free(uri);
+                                       free(locID);
+                                       CRIT_ERR(obj, free_at_crash, \
+                                                       "could not recognize the weather forecast uri");
+                               }
+
+                               obj->data.weather_forecast.uri = uri;
+                               obj->data.weather_forecast.data_type = data_type;
+
+                               /* Limit the day between 0 (today) and FORECAST_DAYS */
+                               if (day >= FORECAST_DAYS) {
+                                       day = FORECAST_DAYS-1;
+                               }
+                               obj->data.weather_forecast.day = day;
+
+                               /* Limit the data retrieval interval to 3 hours and an half */
+                               if (interval < 210) {
+                                       interval = 210;
+                               }
+
+                               /* Convert to seconds */
+                               obj->data.weather_forecast.interval = interval * 60;
+                               free(locID);
+
+                               DBGP("weather_forecast: fetching %s for day %d from %s every %d seconds", \
+                                        data_type, day, uri, obj->data.weather_forecast.interval);
+                       } else {
+                               free(data_type);
+                               free(uri);
+                               free(locID);
+                               CRIT_ERR(obj, free_at_crash, "wrong number of arguments for $weather_forecast");
+                       }
+               } else {
+                       CRIT_ERR(obj, free_at_crash, "weather_forecast needs arguments: <uri> <locID> <day> <data_type> [interval in minutes]");
+               }
+#endif
 #ifdef HAVE_LUA
        END OBJ(lua, 0)
                if (arg) {
@@ -4098,9 +4182,11 @@ static void generate_text_internal(char *p, int p_max_size,
                                new_graph(p, obj->a, obj->b, obj->c, obj->d, cur->loadavg[0],
                                                obj->e, 1, obj->char_a, obj->char_b);
                        }
+#endif /* X11 */
                        OBJ(color) {
                                new_fg(p, obj->data.l);
                        }
+#ifdef X11
                        OBJ(color0) {
                                new_fg(p, color0);
                        }
@@ -4787,6 +4873,15 @@ static void generate_text_internal(char *p, int p_max_size,
                                }
                        }
 #endif
+#ifdef XOAP
+                       OBJ(weather_forecast) {
+                               if (obj->data.weather_forecast.uri != NULL) {
+                                       weather_forecast_process_info(p, p_max_size, obj->data.weather_forecast.uri, obj->data.weather_forecast.day, obj->data.weather_forecast.data_type, obj->data.weather_forecast.interval);
+                               } else {
+                                       NORM_ERR("error processing weather forecast data, check that you have a valid XOAP key if using XOAP.");
+                               }
+                       }
+#endif
 #ifdef HAVE_LUA
                        OBJ(lua) {
                                char *str = llua_getstring(obj->data.s);
@@ -6474,15 +6569,24 @@ static int text_size_updater(char *s, int special_index)
        last_font_height = font_height();
        return special_index;
 }
+#endif /* X11 */
 
 static inline void set_foreground_color(long c)
 {
-       if ((output_methods & TO_X) == 0)
-               return;
-       current_color = c;
-       XSetForeground(display, window.gc, c);
-}
+#ifdef X11
+       if (output_methods & TO_X) {
+               current_color = c;
+               XSetForeground(display, window.gc, c);
+       }
 #endif /* X11 */
+#ifdef NCURSES
+       if (output_methods & TO_NCURSES) {
+               attron(COLOR_PAIR(c));
+       }
+#endif /* NCURSES */
+       UNUSED(c);
+       return;
+}
 
 static void draw_string(const char *s)
 {
@@ -6519,7 +6623,7 @@ static void draw_string(const char *s)
        }
 #ifdef NCURSES
        if ((output_methods & TO_NCURSES) && draw_mode == FG) {
-               printw("%s\n", s_with_newlines);
+               printw("%s", s_with_newlines);
        }
 #endif
        free(s_with_newlines);
@@ -6599,18 +6703,21 @@ static void draw_string(const char *s)
        memcpy(tmpstring1, s, text_buffer_size);
 }
 
-#ifdef X11
 int draw_each_line_inner(char *s, int special_index, int last_special_applied)
 {
+#ifdef X11
        int font_h = font_height();
        int cur_y_add = 0;
+#endif /* X11 */
        char *recurse = 0;
        char *p = s;
        int last_special_needed = -1;
        int orig_special_index = special_index;
 
+#ifdef X11
        cur_x = text_start_x;
        cur_y += font_ascent();
+#endif /* X11 */
 
        while (*p) {
                if (*p == SECRIT_MULTILINE_CHAR) {
@@ -6620,7 +6727,9 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied)
                        break;
                }
                if (*p == SPECIAL_CHAR || last_special_applied > -1) {
+#ifdef X11
                        int w = 0;
+#endif /* X11 */
 
                        /* draw string before special, unless we're dealing multiline
                         * specials */
@@ -6634,6 +6743,7 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied)
                        }
                        /* draw special */
                        switch (specials[special_index].type) {
+#ifdef X11
                                case HORIZONTAL_LINE:
                                {
                                        int h = specials[special_index].height;
@@ -6928,12 +7038,14 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied)
                                        font_h = font_height();
                                        break;
                                }
+#endif /* X11 */
                                case FG:
                                        if (draw_mode == FG) {
                                                set_foreground_color(specials[special_index].arg);
                                        }
                                        break;
 
+#ifdef X11
                                case BG:
                                        if (draw_mode == BG) {
                                                set_foreground_color(specials[special_index].arg);
@@ -7015,9 +7127,12 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied)
                                        last_special_needed = special_index;
                                        break;
                                }
+#endif /* X11 */
                        }
 
+#ifdef X11
                        cur_x += w;
+#endif /* X11 */
 
                        if (special_index != last_special_applied) {
                                special_index++;
@@ -7029,31 +7144,40 @@ int draw_each_line_inner(char *s, int special_index, int last_special_applied)
                p++;
        }
 
+#ifdef X11
        cur_y += cur_y_add;
+#endif /* X11 */
        draw_string(s);
+#ifdef NCURSES
+       if (output_methods & TO_NCURSES) {
+               printw("\n");
+       }
+#endif /* NCURSES */
+#ifdef X11
        cur_y += font_descent();
+#endif /* X11 */
        if (recurse && *recurse) {
                special_index = draw_each_line_inner(recurse, special_index, last_special_needed);
                *(recurse - 1) = SECRIT_MULTILINE_CHAR;
        }
        return special_index;
 }
-#endif /* X11 */
 
 static int draw_line(char *s, int special_index)
 {
 #ifdef X11
-       if ((output_methods & TO_X) == 0) {
-#endif /* X11 */
-               draw_string(s);
-               //'special_index - special_index' instead of 0 otherwise gcc complains about not using special_index when build without X11
-               return special_index - special_index;
-#ifdef X11
+       if (output_methods & TO_X) {
+               return draw_each_line_inner(s, special_index, -1);
        }
-
-       /* find specials and draw stuff */
-       return draw_each_line_inner(s, special_index, -1);
 #endif /* X11 */
+#ifdef NCURSES
+       if (output_methods & TO_NCURSES) {
+               return draw_each_line_inner(s, special_index, -1);
+       }
+#endif /* NCURSES */
+       draw_string(s);
+       UNUSED(special_index);
+       return 0;
 }
 
 static void draw_text(void)
@@ -7088,6 +7212,10 @@ static void draw_text(void)
        }
        setup_fonts();
 #endif /* X11 */
+#ifdef NCURSES
+       init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
+       attron(COLOR_PAIR(COLOR_WHITE));
+#endif /* NCURSES */
        for_each_line(text_buffer, draw_line);
 #if defined(HAVE_LUA) && defined(X11)
        llua_draw_post_hook();
@@ -7304,15 +7432,19 @@ static void main_loop(void)
 
                                        /* resize window if it isn't right size */
                                        if (!fixed_size
-                                               && (text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2 != window.width
-                                               || text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2 != window.height)) {
-                                                       window.width = text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2;
-                                                       window.height = text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2;
-                                                       XResizeWindow(display, window.window, window.width,
+                                                       && (text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2 != window.width
+                                                               || text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2 != window.height)) {
+                                               window.width = text_width + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2;
+                                               window.height = text_height + window.border_inner_margin * 2 + window.border_outer_margin * 2 + window.border_width * 2;
+                                               XResizeWindow(display, window.window, window.width,
                                                                window.height);
-                                                       set_transparent_background(window.window);
+                                               set_transparent_background(window.window);
 
-                                                       changed++;
+                                               changed++;
+#ifdef HAVE_LUA
+                                               /* update lua window globals */
+                                               llua_update_window_table(text_start_x, text_start_y, text_width, text_height);
+#endif /* HAVE_LUA */
                                        }
 
                                        /* move window if it isn't in right position */
@@ -7321,42 +7453,42 @@ static void main_loop(void)
                                                changed++;
                                        }
 
-                                        /* update struts */
-                                        if (changed && window.type == TYPE_PANEL) {
+                                       /* update struts */
+                                       if (changed && window.type == TYPE_PANEL) {
                                                int sidenum = -1;
 
-                                                fprintf(stderr, PACKAGE_NAME": defining struts\n");
-                                                fflush(stderr);
+                                               fprintf(stderr, PACKAGE_NAME": defining struts\n");
+                                               fflush(stderr);
 
                                                switch (text_alignment) {
                                                        case TOP_LEFT:
                                                        case TOP_RIGHT:
                                                        case TOP_MIDDLE:
-                                                       {
-                                                               sidenum = 2;
-                                                               break;
-                                                       }
+                                                               {
+                                                                       sidenum = 2;
+                                                                       break;
+                                                               }
                                                        case BOTTOM_LEFT:
                                                        case BOTTOM_RIGHT:
                                                        case BOTTOM_MIDDLE:
-                                                       {
-                                                               sidenum = 3;
-                                                               break;
-                                                       }
+                                                               {
+                                                                       sidenum = 3;
+                                                                       break;
+                                                               }
                                                        case MIDDLE_LEFT:
-                                                       {
-                                                               sidenum = 0;
-                                                               break;
-                                                       }
+                                                               {
+                                                                       sidenum = 0;
+                                                                       break;
+                                                               }
                                                        case MIDDLE_RIGHT:
-                                                       {
-                                                               sidenum = 1;
-                                                               break;
-                                                       }
+                                                               {
+                                                                       sidenum = 1;
+                                                                       break;
+                                                               }
                                                }
 
                                                set_struts(sidenum);
-                                        }
+                                       }
                                }
 #endif
 
@@ -7455,9 +7587,10 @@ static void main_loop(void)
                                        case ButtonPress:
                                                if (own_window) {
                                                        /* if an ordinary window with decorations */
-                                                       if ((window.type == TYPE_NORMAL)
-                                                               && (!TEST_HINT(window.hints,
-                                                               HINT_UNDECORATED))) {
+                                                       if ((window.type == TYPE_NORMAL &&
+                                                                               (!TEST_HINT(window.hints,
+                                                                                                       HINT_UNDECORATED))) ||
+                                                                       window.type == TYPE_DESKTOP) {
                                                                /* allow conky to hold input focus. */
                                                                break;
                                                        } else {
@@ -7693,7 +7826,6 @@ void clean_up(void *memtofree1, void* memtofree2)
 
 #ifdef NCURSES
        if(output_methods & TO_NCURSES) {
-               delwin(stdscr);
                endwin();
        }
 #endif
@@ -7783,6 +7915,12 @@ void clean_up(void *memtofree1, void* memtofree2)
        llua_shutdown_hook();
        llua_close();
 #endif /* HAVE_LUA */
+#ifdef IMLIB2
+       cimlib_deinit();
+#endif /* IMLIB2 */
+#ifdef XOAP
+       xmlCleanupParser();
+#endif /* XOAP */
 
        if (specials) {
                for (i = 0; i < special_count; i++) {
@@ -8492,6 +8630,7 @@ char load_config_file(const char *f)
                CONF("out_to_ncurses") {
                        if(string_to_bool(value)) {
                                initscr();
+                               start_color();
                                output_methods |= TO_NCURSES;
                        }
                }
@@ -8932,6 +9071,13 @@ char load_config_file(const char *f)
                                CONF_ERR;
                        }
                }
+               CONF("lua_startup_hook") {
+                       if (value) {
+                               llua_set_startup_hook(value);
+                       } else {
+                               CONF_ERR;
+                       }
+               }
                CONF("lua_shutdown_hook") {
                        if (value) {
                                llua_set_shutdown_hook(value);
@@ -9401,6 +9547,9 @@ void initialisation(int argc, char **argv) {
 #ifdef HAVE_LUA
        llua_setup_info(&info, update_interval);
 #endif /* HAVE_LUA */
+#ifdef XOAP
+       xmlInitParser();
+#endif /* XOAP */
 
        /* Set signal handlers */
        act.sa_handler = signal_handler;
@@ -9418,6 +9567,9 @@ void initialisation(int argc, char **argv) {
                NORM_ERR("error setting signal handler: %s", strerror(errno));
        }
 
+#ifdef HAVE_LUA
+       llua_startup_hook();
+#endif /* HAVE_LUA */
 }
 
 int main(int argc, char **argv)