]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
*fix* issue 175
[chaz/tint2] / src / tint.c
index 27458b8d87a4569c4487179012f391d81cf141e7..01db88cc73ce580f179c522151e7a6ccff0ef741 100644 (file)
@@ -27,6 +27,7 @@
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
 #include <X11/Xlocale.h>
+#include <X11/extensions/Xdamage.h>
 #include <Imlib2.h>
 #include <signal.h>
 
@@ -72,7 +73,6 @@ void init (int argc, char *argv[])
                                snapshot_path = strdup(argv[i]);
                }
        }
-
        // Set signal handler
        struct sigaction sa = { .sa_handler = signal_handler };
        sigaction(SIGUSR1, &sa, 0);
@@ -88,11 +88,13 @@ void init (int argc, char *argv[])
        sigaddset(&block_mask, SIGUSR1);
        sigprocmask(SIG_BLOCK, &block_mask, 0);
 
-
        // set global data
        memset(&server, 0, sizeof(Server_global));
-//     memset(&systray, 0, sizeof(Systraybar));
+       memset(&systray, 0, sizeof(Systraybar));
+}
 
+void init_X11()
+{
        server.dsp = XOpenDisplay (NULL);
        if (!server.dsp) {
                fprintf(stderr, "tint2 exit : could not open display.\n");
@@ -118,6 +120,7 @@ void init (int argc, char *argv[])
        gchar *path;
        const gchar * const *data_dirs;
        data_dirs = g_get_system_data_dirs ();
+       int i;
        for (i = 0; data_dirs[i] != NULL; i++)  {
                path = g_build_filename(data_dirs[i], "tint2", "default_icon.png", NULL);
                if (g_file_test (path, G_FILE_TEST_EXISTS))
@@ -609,9 +612,10 @@ void event_configure_notify (Window win)
        GSList *l;
        for (l = systray.list_icons; l ; l = l->next) {
                traywin = (TrayWindow*)l->data;
-               if (traywin->id == win) {
+               if (traywin->tray_id == win) {
                        //printf("move tray %d\n", traywin->x);
                        XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, traywin->width, traywin->height);
+                       XResizeWindow(server.dsp, traywin->tray_id, traywin->width, traywin->height);
                        panel_refresh = 1;
                        return;
                }
@@ -679,6 +683,7 @@ int main (int argc, char *argv[])
        GSList *it;
        const struct timespec* timeout;
 
+       init (argc, argv);
        init_config();
        i = 0;
        if (config_path)
@@ -691,8 +696,7 @@ int main (int argc, char *argv[])
                exit(1);
        }
 
-       init (argc, argv);
-
+       init_X11();
        init_panel();
        cleanup_config();
        if (snapshot_path) {
@@ -701,6 +705,8 @@ int main (int argc, char *argv[])
                exit(0);
        }
 
+       int damage_event, damage_error;
+       XDamageQueryExtension(server.dsp, &damage_event, &damage_error);
        x11_fd = ConnectionNumber(server.dsp);
        XSync(server.dsp, False);
 
@@ -807,7 +813,7 @@ int main (int argc, char *argv[])
                                                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) {
+                                                       if (((TrayWindow*)it->data)->tray_id == e.xany.window) {
                                                                remove_icon((TrayWindow*)it->data);
                                                                break;
                                                        }
@@ -823,6 +829,11 @@ int main (int argc, char *argv[])
                                                        dnd_message(&e.xclient);
                                                }
                                                break;
+
+                                       default:
+                                               if (e.type == XDamageNotify+damage_event)
+                                                       // TODO: update only the damaged icon, not all of them
+                                                       systray.area.redraw = 1;
                                }
                        }
                }
This page took 0.025008 seconds and 4 git commands to generate.