]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*fix* ignore SIGCHLD in way that BSD and linux support
[chaz/tint2] / src / tint.c
index fbe62ace07d5a19be7cd9f9666c81b469ab1a613..4f5c67372f18132a3f27b4f7c51e33001176888b 100644 (file)
@@ -91,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);
@@ -708,6 +709,7 @@ int main (int argc, char *argv[])
        Panel *panel;
        GSList *it;
        struct timeval* timeout;
+       int hidden_dnd = 0;
 
 start:
        init (argc, argv);
@@ -790,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) {
@@ -871,8 +883,7 @@ start:
                                                                // 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) {
This page took 0.023813 seconds and 4 git commands to generate.