Bugfix: Correctly set focus when switching to a workspace with floating clients

This fixes ticket #45
This commit is contained in:
Michael Stapelberg 2009-05-30 11:41:49 +02:00
parent b1eb93326f
commit fccbdea925
1 changed files with 9 additions and 6 deletions

View File

@ -585,13 +585,15 @@ void show_workspace(xcb_connection_t *conn, int workspace) {
/* Check if we need to change something or if were already there */ /* Check if we need to change something or if were already there */
if (c_ws->screen->current_workspace == (workspace-1)) { if (c_ws->screen->current_workspace == (workspace-1)) {
if (CUR_CELL->currently_focused != NULL) { Client *last_focused = SLIST_FIRST(&(c_ws->focus_stack));
set_focus(conn, CUR_CELL->currently_focused, true); if (last_focused != SLIST_END(&(c_ws->focus_stack))) {
set_focus(conn, last_focused, true);
if (need_warp) { if (need_warp) {
client_warp_pointer_into(conn, CUR_CELL->currently_focused); client_warp_pointer_into(conn, last_focused);
xcb_flush(conn); xcb_flush(conn);
} }
} }
return; return;
} }
@ -630,10 +632,11 @@ void show_workspace(xcb_connection_t *conn, int workspace) {
ignore_enter_notify_forall(conn, c_ws, false); ignore_enter_notify_forall(conn, c_ws, false);
/* Restore focus on the new workspace */ /* Restore focus on the new workspace */
if (CUR_CELL->currently_focused != NULL) { Client *last_focused = SLIST_FIRST(&(c_ws->focus_stack));
set_focus(conn, CUR_CELL->currently_focused, true); if (last_focused != SLIST_END(&(c_ws->focus_stack))) {
set_focus(conn, last_focused, true);
if (need_warp) { if (need_warp) {
client_warp_pointer_into(conn, CUR_CELL->currently_focused); client_warp_pointer_into(conn, last_focused);
xcb_flush(conn); xcb_flush(conn);
} }
} else xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, root, XCB_CURRENT_TIME); } else xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, root, XCB_CURRENT_TIME);