]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*fix* use XFlush to really make use of the tooltip timeouts and do not rely on some...
[chaz/tint2] / src / tint.c
index 3c535c740a236afcf3c5b8d54d4c17b5f471d14b..9b10732694603585bca70406aa9a00d63ca25787 100644 (file)
@@ -610,15 +610,11 @@ void event_property_notify (XEvent *e)
 
 void event_expose (XEvent *e)
 {
-       if (e->xany.window == g_tooltip.window)
-               tooltip_update();
-       else {
-               Panel *panel;
-               panel = get_panel(e->xany.window);
-               if (!panel) return;
-               // TODO : one panel_refresh per panel ?
-               panel_refresh = 1;
-       }
+       Panel *panel;
+       panel = get_panel(e->xany.window);
+       if (!panel) return;
+       // TODO : one panel_refresh per panel ?
+       panel_refresh = 1;
 }
 
 
@@ -666,11 +662,6 @@ void event_configure_notify (Window win)
 }
 
 
-void event_timer()
-{
-}
-
-
 void dnd_message(XClientMessageEvent *e)
 {
        Panel *panel = get_panel(e->window);
@@ -704,7 +695,7 @@ void dnd_message(XClientMessageEvent *e)
 int main (int argc, char *argv[])
 {
        XEvent e;
-       fd_set fd_set;
+       fd_set fdset;
        int x11_fd, i;
        Panel *panel;
        GSList *it;
@@ -739,21 +730,49 @@ int main (int argc, char *argv[])
        sigemptyset(&empty_mask);
 
        while (1) {
+               if (panel_refresh) {
+                       panel_refresh = 0;
+
+                       if (refresh_systray) {
+                               panel = (Panel*)systray.area.panel;
+                               XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None);
+                       }
+                       for (i=0 ; i < nb_panel ; i++) {
+                               panel = &panel1[i];
+
+                               if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap);
+                               panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth);
+
+                               refresh(&panel->area);
+                               XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0);
+                       }
+                       XFlush (server.dsp);
+
+                       if (refresh_systray) {
+                               refresh_systray = 0;
+                               panel = (Panel*)systray.area.panel;
+                               // tint2 doen't draw systray icons. it just redraw background.
+                               XSetWindowBackgroundPixmap (server.dsp, panel->main_win, panel->temp_pmap);
+                               // force icon's refresh
+                               refresh_systray_icon();
+                       }
+               }
+
                // thanks to AngryLlama for the timer
                // Create a File Description Set containing x11_fd, and every timer_fd
-               FD_ZERO (&fd_set);
-               FD_SET (x11_fd, &fd_set);
+               FD_ZERO (&fdset);
+               FD_SET (x11_fd, &fdset);
                int max_fd = x11_fd;
                timer_iter = timer_list;
                while (timer_iter) {
                        timer = timer_iter->data;
                        max_fd = timer->id > max_fd ? timer->id : max_fd;
-                       FD_SET(timer->id, &fd_set);
+                       FD_SET(timer->id, &fdset);
                        timer_iter = timer_iter->next;
                }
 
                // Wait for X Event or a Timer
-               if (pselect(max_fd+1, &fd_set, 0, 0, 0, &empty_mask) > 0) {
+               if (pselect(max_fd+1, &fdset, 0, 0, 0, &empty_mask) > 0) {
                        while (XPending (server.dsp)) {
                                XNextEvent(server.dsp, &e);
 
@@ -786,6 +805,12 @@ int main (int argc, char *argv[])
                                                event_expose(&e);
                                                break;
 
+                                       case MapNotify:
+                                               if (e.xany.window == g_tooltip.window)
+                                                       tooltip_update();
+                                               break;
+
+
                                        case PropertyNotify:
                                                event_property_notify(&e);
                                                break;
@@ -804,7 +829,7 @@ int main (int argc, char *argv[])
                                                break;
                                        case UnmapNotify:
                                        case DestroyNotify:
-                                               if (!systray.area.on_screen)
+                                               if (e.xany.window == g_tooltip.window || !systray.area.on_screen)
                                                        break;
                                                for (it = systray.list_icons; it; it = g_slist_next(it)) {
                                                        if (((TrayWindow*)it->data)->id == e.xany.window) {
@@ -831,7 +856,7 @@ int main (int argc, char *argv[])
                        timer_iter = timer_list;
                        while (timer_iter) {
                                timer = timer_iter->data;
-                               if (FD_ISSET(timer->id, &fd_set)) {
+                               if (FD_ISSET(timer->id, &fdset)) {
                                        uint64_t dummy;
                                        read(timer->id, &dummy, sizeof(uint64_t));
                                        timer->_callback();
@@ -854,34 +879,6 @@ int main (int argc, char *argv[])
                        cleanup ();
                        return 0;
                }
-
-               if (panel_refresh) {
-                       panel_refresh = 0;
-
-                       if (refresh_systray) {
-                               panel = (Panel*)systray.area.panel;
-                               XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None);
-                       }
-                       for (i=0 ; i < nb_panel ; i++) {
-                               panel = &panel1[i];
-
-                               if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap);
-                               panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth);
-
-                               refresh(&panel->area);
-                               XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0);
-                       }
-                       XFlush (server.dsp);
-
-                       if (refresh_systray) {
-                               refresh_systray = 0;
-                               panel = (Panel*)systray.area.panel;
-                               // tint2 doen't draw systray icons. it just redraw background.
-                               XSetWindowBackgroundPixmap (server.dsp, panel->main_win, panel->temp_pmap);
-                               // force icon's refresh
-                               refresh_systray_icon();
-                       }
-               }
        }
 }
 
This page took 0.028936 seconds and 4 git commands to generate.