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;
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);
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);
}
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)
/* 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 */
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);
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);
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
*
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;