Bugfix: Correctly check for empty containers and unmap the stack_win

This commit is contained in:
Michael Stapelberg 2009-03-06 19:08:59 +01:00
parent 017a0c0d08
commit a411ed24cb
4 changed files with 20 additions and 10 deletions

View File

@ -34,6 +34,7 @@ void *scalloc(size_t size);
char *sstrdup(const char *str); char *sstrdup(const char *str);
void start_application(const char *command); void start_application(const char *command);
void check_error(xcb_connection_t *conn, xcb_void_cookie_t cookie, char *err_message); 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 set_focus(xcb_connection_t *conn, Client *client);
void leave_stack_mode(xcb_connection_t *conn, Container *container); void leave_stack_mode(xcb_connection_t *conn, Container *container);
void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode); void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode);

View 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 */ /* 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); CIRCLEQ_INSERT_TAIL(&(new->clients), current_client, clients);
/* Update data structures */ /* Update data structures */

View File

@ -433,16 +433,8 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
if (client->fullscreen) if (client->fullscreen)
con->workspace->fullscreen_client = NULL; 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 */ /* 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 */ /* Remove from the focus stack */
LOG("Removing from focus stack\n"); LOG("Removing from focus stack\n");

View 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, * 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 * updating the X input focus and finally re-decorating both windows (to signalize