]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*fix* ignore SIGCHLD in way that BSD and linux support
[chaz/tint2] / src / tint.c
index f88b57fd7f3cb7fb1e549d25fbca40f205ae45d2..4f5c67372f18132a3f27b4f7c51e33001176888b 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"
@@ -59,7 +59,9 @@ void init (int argc, char *argv[])
        default_timeout();
        default_systray();
        memset(&server, 0, sizeof(Server_global));
+#ifdef ENABLE_BATTERY
        default_battery();
+#endif
        default_clock();
        default_taskbar();
        default_tooltip();
@@ -89,14 +91,15 @@ void init (int argc, char *argv[])
        // Set signal handler
        signal_pending = 0;
        struct sigaction sa = { .sa_handler = signal_handler };
+       struct sigaction sa_chld = { .sa_handler = SIG_DFL, .sa_flags = SA_NOCLDWAIT };
        sigaction(SIGUSR1, &sa, 0);
        sigaction(SIGINT, &sa, 0);
        sigaction(SIGTERM, &sa, 0);
        sigaction(SIGHUP, &sa, 0);
-       signal(SIGCHLD, SIG_IGN);               // don't have to wait() after fork()
+       sigaction(SIGCHLD, &sa_chld, 0);
 
-       // BSD is too stupid to support pselect(), therefore we have to use select and hope that we do not
-       // end up in a race condition there
+       // BSD does not support pselect(), therefore we have to use select and hope that we do not
+       // end up in a race condition there (see 'man select()' on a linux machine for more information)
        // block all signals, such that no race conditions occur before pselect in our main loop
 //     sigset_t block_mask;
 //     sigaddset(&block_mask, SIGINT);
@@ -128,6 +131,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;
@@ -151,7 +156,6 @@ void cleanup()
 {
        cleanup_timeout();
        cleanup_systray();
-       stop_net();
        cleanup_panel();
        cleanup_tooltip();
        cleanup_clock();
@@ -315,7 +319,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)
@@ -380,7 +385,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;
        }
@@ -409,7 +415,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;
        }
@@ -417,7 +424,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;
        }
@@ -439,7 +447,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);
 }
 
 
@@ -700,6 +709,7 @@ int main (int argc, char *argv[])
        Panel *panel;
        GSList *it;
        struct timeval* timeout;
+       int hidden_dnd = 0;
 
 start:
        init (argc, argv);
@@ -782,8 +792,18 @@ start:
                                                autohide_trigger_show(panel);
                                        else if (e.type == LeaveNotify)
                                                autohide_trigger_hide(panel);
-                                       if (panel->is_hidden)
-                                               continue;   // discard further processing of this event because the panel is not visible yet
+                                       if (panel->is_hidden) {
+                                               if (e.type == ClientMessage && e.xclient.message_type == server.atom.XdndPosition) {
+                                                       hidden_dnd = 1;
+                                                       autohide_show(panel);
+                                               }
+                                               else
+                                                       continue;   // discard further processing of this event because the panel is not visible yet
+                                       }
+                                       else if (hidden_dnd && e.type == ClientMessage && e.xclient.message_type == server.atom.XdndLeave) {
+                                               hidden_dnd = 0;
+                                               autohide_hide(panel);
+                                       }
                                }
 
                                switch (e.type) {
@@ -839,8 +859,8 @@ start:
                                        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)
@@ -857,16 +877,13 @@ start:
                                                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) {
+                                               if (systray.area.on_screen && e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) {
                                                        net_message(&e.xclient);
                                                }
                                                else if (e.xclient.message_type == server.atom.XdndPosition) {
@@ -900,7 +917,7 @@ start:
                        if (signal_pending == SIGUSR1) {
                                // restart tint2
                                // SIGUSR1 used when : user's signal, composite manager stop/start or xrandr
-                               FD_CLR (x11_fd, &fdset);
+                               FD_CLR (x11_fd, &fdset); // not sure if needed
                                goto start;
                        }
                        else {
This page took 0.028119 seconds and 4 git commands to generate.