From d8d4d0182d749862d34f3336505f7cfe2717af3d Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 28 Feb 2009 02:36:40 +0100 Subject: [PATCH] Revert 43d471b9ab736f5ff5b458a672d54319e3366464 and apply correct bugfix: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before, all clients were reconfigured to just raise them, when focus should be set. However, this generated lots of notify events, which in turn lead to an endless loop of setting focus, reconfiguring, setting focus, … --- src/handlers.c | 5 ----- src/layout.c | 38 +++++++++++++++++++++----------------- src/util.c | 13 ++----------- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/handlers.c b/src/handlers.c index 32b0b03c..6b9ac7f1 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -110,11 +110,6 @@ int handle_enter_notify(void *ignored, xcb_connection_t *conn, xcb_enter_notify_ return 1; } - /* When in stacking, enter notifications on the parent are ignored. Focus will be changed via keyboard only. */ - if (client->container->mode == MODE_STACK && - client == table_get(byParent, event->event)) - return 1; - set_focus(conn, client); return 1; diff --git a/src/layout.c b/src/layout.c index c1386778..a3935996 100644 --- a/src/layout.c +++ b/src/layout.c @@ -232,27 +232,31 @@ void render_container(xcb_connection_t *connection, Container *container) { xcb_configure_window(connection, stack_win->window, XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, &(stack_win->width)); - /* All clients are repositioned */ - CIRCLEQ_FOREACH(client, &(container->clients), clients) { - /* Check if we changed client->x or client->y by updating it. - * Note the bitwise OR instead of logical OR to force evaluation of both statements */ - if (client->force_reconfigure | - (client->rect.x != (client->rect.x = container->x)) | - (client->rect.y != (client->rect.y = container->y + (decoration_height * num_clients)))) - reposition_client(connection, client); + /* Reconfigure the currently focused client, if necessary. It is the only visible one */ + client = container->currently_focused; - if (client->force_reconfigure | - (client->rect.width != (client->rect.width = container->width)) | - (client->rect.height != - (client->rect.height = container->height - (decoration_height * num_clients)))) - resize_client(connection, client); + /* Check if we changed client->x or client->y by updating it. + * Note the bitwise OR instead of logical OR to force evaluation of both statements */ + if (client->force_reconfigure | + (client->rect.x != (client->rect.x = container->x)) | + (client->rect.y != (client->rect.y = container->y + (decoration_height * num_clients)))) + reposition_client(connection, client); - client->force_reconfigure = false; + if (client->force_reconfigure | + (client->rect.width != (client->rect.width = container->width)) | + (client->rect.height != + (client->rect.height = container->height - (decoration_height * num_clients)))) + resize_client(connection, client); + client->force_reconfigure = false; + + uint32_t values[] = { XCB_STACK_MODE_ABOVE }; + xcb_configure_window(connection, client->frame, XCB_CONFIG_WINDOW_STACK_MODE, values); + + /* Render the decorations of all clients */ + CIRCLEQ_FOREACH(client, &(container->clients), clients) decorate_window(connection, client, stack_win->window, stack_win->gc, - current_client * decoration_height); - current_client++; - } + current_client++ * decoration_height); } } diff --git a/src/util.c b/src/util.c index d565508b..a25e6376 100644 --- a/src/util.c +++ b/src/util.c @@ -149,13 +149,9 @@ void set_focus(xcb_connection_t *conn, Client *client) { decorate_window(conn, client, client->frame, client->titlegc, 0); /* If we’re in stacking mode, we render the container to update changes in the title - bars and raise the focused client */ - if (client->container->mode == MODE_STACK) { + bars and to raise the focused client */ + if (client->container->mode == MODE_STACK) render_container(conn, client->container); - uint32_t values[] = { XCB_STACK_MODE_ABOVE }; - xcb_configure_window(conn, client->frame, - XCB_CONFIG_WINDOW_STACK_MODE, values); - } xcb_flush(conn); } @@ -193,11 +189,6 @@ void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode) stack_win->container = container; SLIST_INSERT_HEAD(&stack_wins, stack_win, stack_windows); - /* Raise the focused window */ - values[0] = XCB_STACK_MODE_ABOVE; - xcb_configure_window(conn, container->currently_focused->frame, - XCB_CONFIG_WINDOW_STACK_MODE, values); - } else { if (container->mode == MODE_STACK) { /* When going out of stacking mode, we need to close the window */