]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*add* include svn revision in the VERSION_STRING if building with cmake
[chaz/tint2] / src / tint.c
index 235c2e2763ac44ffeaf65fab4b06345d4122b1d6..23394d9ef5a3f6f64ce35b10c7a9b8321d9b682b 100644 (file)
@@ -31,7 +31,7 @@
 #include <Imlib2.h>
 #include <signal.h>
 
-#include "version.h"
+#include <version.h>
 #include "server.h"
 #include "window.h"
 #include "config.h"
@@ -42,6 +42,7 @@
 #include "tooltip.h"
 #include "timer.h"
 
+
 void signal_handler(int sig)
 {
        // signal handler is light as it should be
@@ -53,6 +54,19 @@ void init (int argc, char *argv[])
 {
        int i;
 
+       // set global data
+       default_config();
+       default_timeout();
+       default_systray();
+       memset(&server, 0, sizeof(Server_global));
+#ifdef ENABLE_BATTERY
+       default_battery();
+#endif
+       default_clock();
+       default_taskbar();
+       default_tooltip();
+       default_panel();
+
        // read options
        for (i = 1; i < argc; ++i) {
                if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))       {
@@ -75,6 +89,7 @@ void init (int argc, char *argv[])
                }
        }
        // Set signal handler
+       signal_pending = 0;
        struct sigaction sa = { .sa_handler = signal_handler };
        sigaction(SIGUSR1, &sa, 0);
        sigaction(SIGINT, &sa, 0);
@@ -91,10 +106,6 @@ void init (int argc, char *argv[])
 //     sigaddset(&block_mask, SIGHUP);
 //     sigaddset(&block_mask, SIGUSR1);
 //     sigprocmask(SIG_BLOCK, &block_mask, 0);
-
-       // set global data
-       memset(&server, 0, sizeof(Server_global));
-       memset(&systray, 0, sizeof(Systraybar));
 }
 
 void init_X11()
@@ -119,6 +130,8 @@ void init_X11()
        XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
 
        setlocale (LC_ALL, "");
+       // config file use '.' as decimal separator
+       setlocale(LC_NUMERIC, "POSIX");
 
        // load default icon
        gchar *path;
@@ -140,22 +153,21 @@ void init_X11()
 
 void cleanup()
 {
-       stop_all_timeouts();
+       cleanup_timeout();
        cleanup_systray();
-       stop_net();
        cleanup_panel();
        cleanup_tooltip();
        cleanup_clock();
 #ifdef ENABLE_BATTERY
        cleanup_battery();
 #endif
+       cleanup_config();
 
        if (default_icon) {
                imlib_context_set_image(default_icon);
                imlib_free_image();
        }
-       if (config_path) g_free(config_path);
-       if (snapshot_path) g_free(snapshot_path);
+       imlib_context_disconnect_display();
 
        cleanup_server();
        if (server.dsp) XCloseDisplay(server.dsp);
@@ -177,9 +189,13 @@ void get_snapshot(const char *path)
        img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 0);
 
        imlib_context_set_image(img);
+       if (!panel_horizontal) {
+               // rotate 90° vertical panel
+               imlib_image_flip_horizontal();
+               imlib_image_flip_diagonal();
+       }
        imlib_save_image(path);
        imlib_free_image();
-       XFreePixmap(server.dsp, panel->temp_pmap);
 }
 
 
@@ -302,7 +318,8 @@ void event_button_press (XEvent *e)
        }
        task_drag = click_task(panel, e->xbutton.x, e->xbutton.y);
 
-       XLowerWindow (server.dsp, panel->main_win);
+       if (panel_layer == BOTTOM_LAYER)
+               XLowerWindow (server.dsp, panel->main_win);
 }
 
 void event_button_motion_notify (XEvent *e)
@@ -367,7 +384,8 @@ void event_button_release (XEvent *e)
 
        if (wm_menu && !tint2_handles_click(panel, &e->xbutton)) {
                forward_click(e);
-               XLowerWindow (server.dsp, panel->main_win);
+               if (panel_layer == BOTTOM_LAYER)
+                       XLowerWindow (server.dsp, panel->main_win);
                task_drag = 0;
                return;
        }
@@ -396,7 +414,8 @@ void event_button_release (XEvent *e)
 
        if ( click_clock(panel, e->xbutton.x, e->xbutton.y)) {
                clock_action(e->xbutton.button);
-               XLowerWindow (server.dsp, panel->main_win);
+               if (panel_layer == BOTTOM_LAYER)
+                       XLowerWindow (server.dsp, panel->main_win);
                task_drag = 0;
                return;
        }
@@ -404,7 +423,8 @@ void event_button_release (XEvent *e)
        Taskbar *tskbar;
        if ( !(tskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y)) ) {
                // TODO: check better solution to keep window below
-               XLowerWindow (server.dsp, panel->main_win);
+               if (panel_layer == BOTTOM_LAYER)
+                       XLowerWindow (server.dsp, panel->main_win);
                task_drag = 0;
                return;
        }
@@ -426,7 +446,8 @@ void event_button_release (XEvent *e)
        window_action( click_task(panel, e->xbutton.x, e->xbutton.y), action);
 
        // to keep window below
-       XLowerWindow (server.dsp, panel->main_win);
+       if (panel_layer == BOTTOM_LAYER)
+               XLowerWindow (server.dsp, panel->main_win);
 }
 
 
@@ -612,11 +633,7 @@ void event_configure_notify (Window win)
 {
        // change in root window (xrandr)
        if (win == server.root_win) {
-               get_monitors();
-               init_config();
-               config_read_file (config_path);
-               init_panel();
-               cleanup_config();
+               signal_pending = SIGUSR1;
                return;
        }
 
@@ -692,8 +709,8 @@ int main (int argc, char *argv[])
        GSList *it;
        struct timeval* timeout;
 
+start:
        init (argc, argv);
-       init_config();
        init_X11();
 
        i = 0;
@@ -708,7 +725,6 @@ int main (int argc, char *argv[])
        }
 
        init_panel();
-       cleanup_config();
        if (snapshot_path) {
                get_snapshot(snapshot_path);
                cleanup();
@@ -831,8 +847,8 @@ int main (int argc, char *argv[])
                                        case UnmapNotify:
                                        case DestroyNotify:
                                                if (e.xany.window == server.composite_manager) {
-                                                       // TODO: Stop real_transparency
-                                                       //signal_pending = SIGUSR2;
+                                                       // Stop real_transparency
+                                                       signal_pending = SIGUSR1;
                                                        break;
                                                }
                                                if (e.xany.window == g_tooltip.window || !systray.area.on_screen)
@@ -849,13 +865,11 @@ int main (int argc, char *argv[])
                                                ev = &e.xclient;
                                                if (ev->data.l[1] == server.atom._NET_WM_CM_S0) {
                                                        if (ev->data.l[2] == None)
-                                                               // TODO: Stop real_transparency
-                                                               //signal_pending = SIGUSR2;
-                                                               ;
+                                                               // Stop real_transparency
+                                                               signal_pending = SIGUSR1;
                                                        else
-                                                               // TODO: Start real_transparency
-                                                               //signal_pending = SIGUSR2;
-                                                               ;
+                                                               // Start real_transparency
+                                                               signal_pending = SIGUSR1;
                                                }
                                                if (!systray.area.on_screen) break;
                                                if (e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) {
@@ -887,19 +901,18 @@ int main (int argc, char *argv[])
 
                callback_timeout_expired();
 
-               switch (signal_pending) {
-               case SIGUSR1: // reload config file
-                       signal_pending = 0;
-                       init_config();
-                       config_read_file (config_path);
-                       init_panel();
-                       cleanup_config();
-                       break;
-               case SIGINT:
-               case SIGTERM:
-               case SIGHUP:
-                       cleanup ();
-                       return 0;
+               if (signal_pending) {
+                       cleanup();
+                       if (signal_pending == SIGUSR1) {
+                               // restart tint2
+                               // SIGUSR1 used when : user's signal, composite manager stop/start or xrandr
+                               FD_CLR (x11_fd, &fdset); // not sure if needed
+                               goto start;
+                       }
+                       else {
+                               // SIGINT, SIGTERM, SIGHUP
+                               return 0;
+                       }
                }
        }
 }
This page took 0.031412 seconds and 4 git commands to generate.