]> git.sur5r.net Git - i3/i3/commitdiff
Handle destroy notify events like unmap notify events
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 24 Mar 2010 15:52:16 +0000 (16:52 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 24 Mar 2010 15:52:16 +0000 (16:52 +0100)
This helps for windows which are immediately destroyed instead of
unmapped, like when starting i3status | ./foobar | dzen2 -dock
and foobar does not exist (i3status and dzen2 will get a SIGPIPE).

include/handlers.h
src/handlers.c
src/mainx.c

index 03be5281f902e64ed4ed8379110ec20394bedc86..c7cbb3226a44b960c0caf5e9022db34dfc7df99b 100644 (file)
@@ -94,6 +94,18 @@ int handle_configure_request(void *prophs, xcb_connection_t *conn,
  */
 int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_notify_event_t *event);
 
+/**
+ * A destroy notify event is sent when the window is not unmapped, but
+ * immediately destroyed (for example when starting a window and immediately
+ * killing the program which started it).
+ *
+ * We just pass on the event to the unmap notify handler (by copying the
+ * important fields in the event data structure).
+ *
+ */
+int handle_destroy_notify_event(void *data, xcb_connection_t *conn,
+                                xcb_destroy_notify_event_t *event);
+
 /**
  * Called when a window changes its title
  *
index 53a5cf38ebe4c0acb61df80b13f01fabf4267bd2..624c34305d5bd78caa9bcdbe89ab6291ad0e5095 100644 (file)
@@ -571,6 +571,26 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
         return 1;
 }
 
+/*
+ * A destroy notify event is sent when the window is not unmapped, but
+ * immediately destroyed (for example when starting a window and immediately
+ * killing the program which started it).
+ *
+ * We just pass on the event to the unmap notify handler (by copying the
+ * important fields in the event data structure).
+ *
+ */
+int handle_destroy_notify_event(void *data, xcb_connection_t *conn, xcb_destroy_notify_event_t *event) {
+        DLOG("destroy notify for 0x%08x, 0x%08x\n", event->event, event->window);
+
+        xcb_unmap_notify_event_t unmap;
+        unmap.sequence = event->sequence;
+        unmap.event = event->event;
+        unmap.window = event->window;
+
+        return handle_unmap_notify_event(NULL, conn, &unmap);
+}
+
 /*
  * Called when a window changes its title
  *
index c80b8168be0f4bb69e9565b52ce58951fa18c508..e779361bf94b5b14be38b0079b9efa445476ea5f 100644 (file)
@@ -414,6 +414,9 @@ int main(int argc, char *argv[], char *env[]) {
            it any longer. Usually, the client destroys the window shortly afterwards. */
         xcb_event_set_unmap_notify_handler(&evenths, handle_unmap_notify_event, NULL);
 
+        /* Destroy notify is handled the same as unmap notify */
+        xcb_event_set_destroy_notify_handler(&evenths, handle_destroy_notify_event, NULL);
+
         /* Configure notify = window’s configuration (geometry, stacking, …). We only need
            it to set up ignore the following enter_notify events */
         xcb_event_set_configure_notify_handler(&evenths, handle_configure_event, NULL);