From: Michael Stapelberg Date: Fri, 19 Jun 2009 22:31:57 +0000 (+0200) Subject: Bugfix: Correctly raise the currently focused client when going into stack mode X-Git-Tag: 3.b~39 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=83d3146b65a486da744bd70474181729b0da7270;p=i3%2Fi3 Bugfix: Correctly raise the currently focused client when going into stack mode --- diff --git a/src/handlers.c b/src/handlers.c index 803c6f3b..3a422171 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -364,8 +364,7 @@ int handle_button_press(void *ignored, xcb_connection_t *conn, xcb_button_press_ /* Floating clients can be dragged by grabbing their titlebar */ if (client->floating >= FLOATING_AUTO_ON) { /* Firstly, we raise it. Maybe the user just wanted to raise it without grabbing */ - uint32_t values[] = { XCB_STACK_MODE_ABOVE }; - xcb_configure_window(conn, client->frame, XCB_CONFIG_WINDOW_STACK_MODE, values); + xcb_raise_window(conn, client->frame); xcb_flush(conn); floating_drag_window(conn, client, event); diff --git a/src/util.c b/src/util.c index c0268358..762b9481 100644 --- a/src/util.c +++ b/src/util.c @@ -399,7 +399,7 @@ void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode) /* When entering stacking mode, we need to open a window on which we can draw the title bars of the clients, it has height 1 because we don’t bother here with calculating the correct height - it will be adjusted when rendering anyways. */ - Rect rect = {container->x, container->y, container->width, 1 }; + Rect rect = {container->x, container->y, container->width, 1}; uint32_t mask = 0; uint32_t values[2]; @@ -438,8 +438,31 @@ void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode) render_layout(conn); - if (container->currently_focused != NULL) + if (container->currently_focused != NULL) { + /* We need to make sure that this client is above *each* of the + * other clients in this container */ + Client *last_focused = get_last_focused_client(conn, container, container->currently_focused); + + CIRCLEQ_FOREACH(client, &(container->clients), clients) { + if (client == container->currently_focused || client == last_focused) + continue; + + LOG("setting %08x below %08x / %08x\n", client->frame, container->currently_focused->frame); + uint32_t values[] = { container->currently_focused->frame, XCB_STACK_MODE_BELOW }; + xcb_configure_window(conn, client->frame, + XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, values); + } + + if (last_focused != NULL) { + LOG("Putting last_focused directly underneath the currently focused\n"); + uint32_t values[] = { container->currently_focused->frame, XCB_STACK_MODE_BELOW }; + xcb_configure_window(conn, last_focused->frame, + XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE, values); + } + + set_focus(conn, container->currently_focused, true); + } } /*