]> git.sur5r.net Git - i3/i3/blobdiff - i3bar/src/xcb.c
Fix i3bar when using multiple displays (Thanks brimstone)
[i3/i3] / i3bar / src / xcb.c
index b4af10ba77535ec9ee9556f186b6e956a1d4bee5..afcfaa397420791d68f21928a3f87646ccd4b0ea 100644 (file)
@@ -10,6 +10,7 @@
 #include <xcb/xcb.h>
 #include <xcb/xproto.h>
 #include <xcb/xcb_atom.h>
+#include <xcb/xcb_aux.h>
 
 #ifdef XCB_COMPAT
 #include "xcb_compat.h"
@@ -686,38 +687,37 @@ void xcb_chk_cb(struct ev_loop *loop, ev_check *watcher, int revents) {
         exit(1);
     }
 
-    while ((event = xcb_poll_for_event(xcb_connection)) == NULL) {
-        return;
-    }
-
-    switch (event->response_type & ~0x80) {
-        case XCB_EXPOSE:
-            /* Expose-events happen, when the window needs to be redrawn */
-            redraw_bars();
-            break;
-        case XCB_BUTTON_PRESS:
-            /* Button-press-events are mouse-buttons clicked on one of our bars */
-            handle_button((xcb_button_press_event_t*) event);
-            break;
-        case XCB_CLIENT_MESSAGE:
-            /* Client messages are used for client-to-client communication, for
-             * example system tray widgets talk to us directly via client messages. */
-            handle_client_message((xcb_client_message_event_t*) event);
-            break;
-        case XCB_UNMAP_NOTIFY:
-            /* UnmapNotifies are received when a tray window unmaps itself */
-            handle_unmap_notify((xcb_unmap_notify_event_t*) event);
-            break;
-        case XCB_PROPERTY_NOTIFY:
-            /* PropertyNotify */
-            handle_property_notify((xcb_property_notify_event_t*) event);
-            break;
-        case XCB_CONFIGURE_REQUEST:
-            /* ConfigureRequest, sent by a tray child */
-            handle_configure_request((xcb_configure_request_event_t*) event);
-            break;
+    while ((event = xcb_poll_for_event(xcb_connection)) != NULL) {
+        switch (event->response_type & ~0x80) {
+            case XCB_EXPOSE:
+                /* Expose-events happen, when the window needs to be redrawn */
+                redraw_bars();
+                break;
+            case XCB_BUTTON_PRESS:
+                /* Button-press-events are mouse-buttons clicked on one of our bars */
+                handle_button((xcb_button_press_event_t*) event);
+                break;
+            case XCB_CLIENT_MESSAGE:
+                /* Client messages are used for client-to-client communication, for
+                 * example system tray widgets talk to us directly via client messages. */
+                handle_client_message((xcb_client_message_event_t*) event);
+                break;
+            case XCB_UNMAP_NOTIFY:
+            case XCB_DESTROY_NOTIFY:
+                /* UnmapNotifies are received when a tray window unmaps itself */
+                handle_unmap_notify((xcb_unmap_notify_event_t*) event);
+                break;
+            case XCB_PROPERTY_NOTIFY:
+                /* PropertyNotify */
+                handle_property_notify((xcb_property_notify_event_t*) event);
+                break;
+            case XCB_CONFIGURE_REQUEST:
+                /* ConfigureRequest, sent by a tray child */
+                handle_configure_request((xcb_configure_request_event_t*) event);
+                break;
+        }
+        free(event);
     }
-    FREE(event);
 }
 
 /*
@@ -785,7 +785,7 @@ char *init_xcb_early() {
     #define ATOM_DO(name) atom_cookies[name] = xcb_intern_atom(xcb_connection, 0, strlen(#name), #name);
     #include "xcb_atoms.def"
 
-    xcb_screen = xcb_setup_roots_iterator(xcb_get_setup(xcb_connection)).data;
+    xcb_screen = xcb_aux_get_screen(xcb_connection, screen);
     xcb_root = xcb_screen->root;
 
     /* We draw the statusline to a seperate pixmap, because it looks the same on all bars and