]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Correctly check for empty containers and unmap the stack_win
authorMichael Stapelberg <michael+x200@stapelberg.de>
Fri, 6 Mar 2009 18:08:59 +0000 (19:08 +0100)
committerMichael Stapelberg <michael+x200@stapelberg.de>
Fri, 6 Mar 2009 18:08:59 +0000 (19:08 +0100)
include/util.h
src/commands.c
src/handlers.c
src/util.c

index 4e4e3d057b72708087c53d9eb7cb9b95ba0f2db5..c17f7d01df28581deb2d0b0520ae440480ddc9c8 100644 (file)
@@ -34,6 +34,7 @@ void *scalloc(size_t size);
 char *sstrdup(const char *str);
 void start_application(const char *command);
 void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie, char *err_message);
+void remove_client_from_container(xcb_connection_t *conn, Client *client, Container *container);
 void set_focus(xcb_connection_t *conn, Client *client);
 void leave_stack_mode(xcb_connection_t *conn, Container *container);
 void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode);
index d7d0fa901eb5589ea0b352ba4445aa40af450e74..77b3e58fd8c7a3920ef553e5538ba5ef3375cbdb 100644 (file)
@@ -217,7 +217,7 @@ static void move_current_window(xcb_connection_t *conn, direction_t direction) {
         }
 
         /* Remove it from the old container and put it into the new one */
-        CIRCLEQ_REMOVE(&(container->clients), current_client, clients);
+        remove_client_from_container(conn, current_client, container);
         CIRCLEQ_INSERT_TAIL(&(new->clients), current_client, clients);
 
         /* Update data structures */
index 939fe63659188ddc3c46db140a83defd79676cbc..88b09b6bc2b338c0b3bcd25f1f31032db6f82f78 100644 (file)
@@ -433,16 +433,8 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
                 if (client->fullscreen)
                         con->workspace->fullscreen_client = NULL;
 
-                /* If the container will be empty now and is in stacking mode, we need to
-                   correctly resize the stack_win */
-                if (CIRCLEQ_EMPTY(&(con->clients)) && con->mode == MODE_STACK) {
-                        struct Stack_Window *stack_win = &(con->stack_win);
-                        stack_win->rect.height = 0;
-                        xcb_unmap_window(conn, stack_win->window);
-                }
-
                 /* Remove the client from the list of clients */
-                CIRCLEQ_REMOVE(&(con->clients), client, clients);
+                remove_client_from_container(conn, client, con);
 
                 /* Remove from the focus stack */
                 LOG("Removing from focus stack\n");
index 5642ca597c465826a060d6c74e4d1bfa0da1f39d..c1cb9571c5a27b18309219dc975744aa947603e1 100644 (file)
@@ -135,6 +135,23 @@ void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie, char *err_mes
         }
 }
 
+/*
+ * Removes the given client from the container, either because it will be inserted into another
+ * one or because it was unmapped
+ *
+ */
+void remove_client_from_container(xcb_connection_t *conn, Client *client, Container *container) {
+        CIRCLEQ_REMOVE(&(container->clients), client, clients);
+
+        /* If the container will be empty now and is in stacking mode, we need to
+           unmap the stack_win */
+        if (CIRCLEQ_EMPTY(&(container->clients)) && container->mode == MODE_STACK) {
+                struct Stack_Window *stack_win = &(container->stack_win);
+                stack_win->rect.height = 0;
+                xcb_unmap_window(conn, stack_win->window);
+        }
+}
+
 /*
  * Sets the given client as focused by updating the data structures correctly,
  * updating the X input focus and finally re-decorating both windows (to signalize