]> git.sur5r.net Git - i3/i3/commitdiff
i3bar: kick tray clients after output configuration changed
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 22 Apr 2012 18:43:52 +0000 (20:43 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 22 Apr 2012 18:43:52 +0000 (20:43 +0200)
This makes i3bar reflect xrandr --output foo --primary changes immediately.

i3bar/include/xcb.h
i3bar/src/ipc.c
i3bar/src/xcb.c

index c5a507877c9444c744dd3faaf163633bd4b0ab30..9ed2149675d6e5d2975e064bbf425edb53d7afbf 100644 (file)
@@ -77,6 +77,17 @@ void clean_xcb();
  */
 void get_atoms();
 
+/*
+ * Reparents all tray clients of the specified output to the root window. This
+ * is either used when shutting down, when an output appears (xrandr --output
+ * VGA1 --off) or when the primary output changes.
+ *
+ * Applications using the tray will start the protocol from the beginning again
+ * afterwards.
+ *
+ */
+void kick_tray_clients(i3_output *output);
+
 /*
  * Destroy the bar of the specified output
  *
index 8f8174e569f4f26c210ac5873d4f6421f8ee04e2..2ebc4c64ee9c61ff970f5fcdc7cb3cb300655d7f 100644 (file)
@@ -65,6 +65,11 @@ void got_output_reply(char *reply) {
     DLOG("Reconfiguring Windows...\n");
     realloc_sl_buffer();
     reconfig_windows();
+
+    i3_output *o_walk;
+    SLIST_FOREACH(o_walk, outputs, slist) {
+        kick_tray_clients(o_walk);
+    }
 }
 
 /*
index 53ea0d312d73497e1cf31974d6526be3bd26f28b..9907665e7ff0d6ae18ffd732c11747629f49baba 100644 (file)
@@ -1088,17 +1088,15 @@ void get_atoms() {
 }
 
 /*
- * Destroy the bar of the specified output
+ * Reparents all tray clients of the specified output to the root window. This
+ * is either used when shutting down, when an output appears (xrandr --output
+ * VGA1 --off) or when the primary output changes.
+ *
+ * Applications using the tray will start the protocol from the beginning again
+ * afterwards.
  *
  */
-void destroy_window(i3_output *output) {
-    if (output == NULL) {
-        return;
-    }
-    if (output->bar == XCB_NONE) {
-        return;
-    }
-
+void kick_tray_clients(i3_output *output) {
     trayclient *trayclient;
     TAILQ_FOREACH(trayclient, output->trayclients, tailq) {
         /* Unmap, then reparent (to root) the tray client windows */
@@ -1109,7 +1107,21 @@ void destroy_window(i3_output *output) {
                             0,
                             0);
     }
+}
+
+/*
+ * Destroy the bar of the specified output
+ *
+ */
+void destroy_window(i3_output *output) {
+    if (output == NULL) {
+        return;
+    }
+    if (output->bar == XCB_NONE) {
+        return;
+    }
 
+    kick_tray_clients(output);
     xcb_destroy_window(xcb_connection, output->bar);
     output->bar = XCB_NONE;
 }