]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Reconfigure x/y of stack_windows when necessary
authorMichael Stapelberg <michael+x200@stapelberg.de>
Wed, 4 Mar 2009 20:49:29 +0000 (21:49 +0100)
committerMichael Stapelberg <michael+x200@stapelberg.de>
Wed, 4 Mar 2009 20:49:29 +0000 (21:49 +0100)
include/data.h
include/util.h
src/handlers.c
src/layout.c
src/table.c
src/util.c

index 605d5bf74a8341025f95b8fb0d6bf51fa2e43dee..1665139b0071710285b2f684318ab271a052eb1d 100644 (file)
@@ -101,7 +101,7 @@ struct Colorpixel {
 struct Stack_Window {
         xcb_window_t window;
         xcb_gcontext_t gc;
-        uint32_t width, height;
+        Rect rect;
 
         /* Backpointer to the container this stack window is in */
         Container *container;
index c2a42a7087234556d71a4db9eaeadafd4e389bb2..d75b20dcb9347b7433659ecb26d03d20da9bee8e 100644 (file)
@@ -31,6 +31,7 @@ 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 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);
 void warp_pointer_into(xcb_connection_t *conn, Client *client);
 void toggle_fullscreen(xcb_connection_t *conn, Client *client);
index 091cd7ed1a9374f27a7652ce796e2f5c67a75a82..07493f3ec7ecddbf4daa157b0fd64eee9eb7d880 100644 (file)
@@ -436,7 +436,7 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
                    correctly resize the stack_win */
                 if (con->currently_focused == NULL && con->mode == MODE_STACK) {
                         struct Stack_Window *stack_win = &(con->stack_win);
-                        stack_win->height = 0;
+                        stack_win->rect.height = 0;
                         xcb_unmap_window(conn, stack_win->window);
                 }
 
index a05ca4f361396b4f95e1ede94ce97d658128b1e6..7be9bde06fc61e4dad16efc707c37a13ebc9d259 100644 (file)
@@ -33,6 +33,8 @@
 
 static int old_value_1;
 static int old_value_2;
+static int old_value_3;
+static int old_value_4;
 
 /*
  * Gets the unoccupied space (= space which is available for windows which were resized by the user)
@@ -279,17 +281,24 @@ void render_container(xcb_connection_t *conn, Container *container) {
 
                 /* Check if we need to remap our stack title window, it gets unmapped when the container
                    is empty in src/handlers.c:unmap_notify() */
-                if (stack_win->height == 0)
+                if (stack_win->rect.height == 0)
                         xcb_map_window(conn, stack_win->window);
 
                 /* Check if we need to reconfigure our stack title window */
-                if (HAS_CHANGED(old_value_1, stack_win->width, container->width) |
-                    HAS_CHANGED(old_value_2, stack_win->height, decoration_height * num_clients)) {
-                        uint32_t values[] = { stack_win->width, stack_win->height, XCB_STACK_MODE_ABOVE };
+                if (HAS_CHANGED(old_value_1, stack_win->rect.x, container->x) |
+                    HAS_CHANGED(old_value_2, stack_win->rect.y, container->y) |
+                    HAS_CHANGED(old_value_3, stack_win->rect.width, container->width) |
+                    HAS_CHANGED(old_value_4, stack_win->rect.height, decoration_height * num_clients)) {
+
+                        uint32_t values[] = { stack_win->rect.x, stack_win->rect.y,
+                                              stack_win->rect.width, stack_win->rect.height,
+                                              XCB_STACK_MODE_ABOVE };
 
                         xcb_configure_window(conn, stack_win->window,
-                                XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | XCB_CONFIG_WINDOW_STACK_MODE,
-                                values);
+                                             XCB_CONFIG_WINDOW_X     | XCB_CONFIG_WINDOW_Y      |
+                                             XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT |
+                                             XCB_CONFIG_WINDOW_STACK_MODE,
+                                             values);
                 }
 
                 /* Reconfigure the currently focused client, if necessary. It is the only visible one */
index a3066f478a0fa465aeedaf515bc31de7423a3d26..eeb93a0ce026c186c2db45eea111cd89b51cba24 100644 (file)
@@ -118,12 +118,8 @@ static void move_columns_from(xcb_connection_t *conn, Workspace *workspace, int
                         CIRCLEQ_FOREACH(client, &(old_container->clients), clients)
                                 client->container = new_container;
 
-                        struct Stack_Window *stack_win;
-                        SLIST_FOREACH(stack_win, &stack_wins, stack_windows)
-                                if (stack_win == &(old_container->stack_win)) {
-                                        xcb_destroy_window(conn, stack_win->window);
-                                        SLIST_REMOVE(&stack_wins, stack_win, Stack_Window, stack_windows);
-                                }
+                        if (old_container->mode == MODE_STACK)
+                                leave_stack_mode(conn, old_container);
 
                         free(old_container);
 
@@ -148,12 +144,8 @@ static void move_rows_from(xcb_connection_t *conn, Workspace *workspace, int row
                         CIRCLEQ_FOREACH(client, &(old_container->clients), clients)
                                 client->container = new_container;
 
-                        struct Stack_Window *stack_win;
-                        SLIST_FOREACH(stack_win, &stack_wins, stack_windows)
-                                if (stack_win == &(old_container->stack_win)) {
-                                        xcb_destroy_window(conn, stack_win->window);
-                                        SLIST_REMOVE(&stack_wins, stack_win, Stack_Window, stack_windows);
-                                }
+                        if (old_container->mode == MODE_STACK)
+                                leave_stack_mode(conn, old_container);
 
                         free(old_container);
 
index fd0c870dc2086100ab0b892e951d4f107754b643..9d9ef693648a2f1a9d2f10cf59135b88783a819a 100644 (file)
@@ -156,6 +156,24 @@ void set_focus(xcb_connection_t *conn, Client *client) {
         redecorate_window(conn, client);
 }
 
+/*
+ * Called when the user switches to another mode or when the container is
+ * destroyed and thus needs to be cleaned up.
+ *
+ */
+void leave_stack_mode(xcb_connection_t *conn, Container *container) {
+        /* When going out of stacking mode, we need to close the window */
+        struct Stack_Window *stack_win = &(container->stack_win);
+
+        SLIST_REMOVE(&stack_wins, stack_win, Stack_Window, stack_windows);
+
+        xcb_free_gc(conn, stack_win->gc);
+        xcb_destroy_window(conn, stack_win->window);
+
+        stack_win->rect.width = -1;
+        stack_win->rect.height = -1;
+}
+
 /*
  * Switches the layout of the given container taking care of the necessary house-keeping
  *
@@ -194,18 +212,8 @@ void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode)
 
                 SLIST_INSERT_HEAD(&stack_wins, stack_win, stack_windows);
         } else {
-                if (container->mode == MODE_STACK) {
-                        /* When going out of stacking mode, we need to close the window */
-                        struct Stack_Window *stack_win = &(container->stack_win);
-
-                        SLIST_REMOVE(&stack_wins, stack_win, Stack_Window, stack_windows);
-
-                        xcb_free_gc(conn, stack_win->gc);
-                        xcb_destroy_window(conn, stack_win->window);
-
-                        stack_win->width = -1;
-                        stack_win->height = -1;
-                }
+                if (container->mode == MODE_STACK)
+                        leave_stack_mode(conn, container);
         }
         container->mode = mode;