]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*fix* finish dnd problems and autohide
[chaz/tint2] / src / tint.c
index 90100668feaeee64177bbae9f013fda088c8c1a4..8316bdde59a56f8a0fb841731f72391b2fce2d00 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();
@@ -93,10 +95,10 @@ void init (int argc, char *argv[])
        sigaction(SIGINT, &sa, 0);
        sigaction(SIGTERM, &sa, 0);
        sigaction(SIGHUP, &sa, 0);
-       signal(SIGCHLD, SIG_IGN);               // don't have to wait() after fork()
+//     signal(SIGCHLD, SIG_IGN);               // don't have to wait() after fork()
 
-       // 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 +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;
@@ -151,7 +155,6 @@ void cleanup()
 {
        cleanup_timeout();
        cleanup_systray();
-       stop_net();
        cleanup_panel();
        cleanup_tooltip();
        cleanup_clock();
@@ -315,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)
@@ -380,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;
        }
@@ -409,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;
        }
@@ -417,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;
        }
@@ -439,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);
 }
 
 
@@ -700,6 +708,7 @@ int main (int argc, char *argv[])
        Panel *panel;
        GSList *it;
        struct timeval* timeout;
+       int hidden_dnd = 0;
 
 start:
        init (argc, argv);
@@ -782,8 +791,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) {
@@ -863,8 +882,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.029463 seconds and 4 git commands to generate.