From 4dca8e6e0b7d061f6beedbac622019f2efaa960c Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 28 Aug 2017 12:07:56 +0200 Subject: [PATCH] Respect focus_on_window_activation for ConfigureRequests (#2889) fixes #2873 --- src/handlers.c | 44 ++++++++++++++++++++++------- testcases/t/269-focus-stack-above.t | 16 +++++++++++ 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/handlers.c b/src/handlers.c index 7d83f541..c273e116 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -406,21 +406,45 @@ static void handle_configure_request(xcb_configure_request_event_t *event) { if (event->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) { DLOG("window 0x%08x wants to be stacked %d\n", event->window, event->stack_mode); - if (event->stack_mode == XCB_STACK_MODE_ABOVE) { - /* Emacs and IntelliJ Idea “request focus” by stacking their window + + /* Emacs and IntelliJ Idea “request focus” by stacking their window * above all others. */ - if (!fullscreen && con_is_leaf(con)) { - if (strcmp(con_get_workspace(con)->name, "__i3_scratch") == 0) { - DLOG("This is a scratchpad container, ignoring ConfigureRequest\n"); - return; - } + if (event->stack_mode != XCB_STACK_MODE_ABOVE) { + DLOG("stack_mode != XCB_STACK_MODE_ABOVE, ignoring ConfigureRequest\n"); + goto out; + } - con_focus(con); - tree_render(); - } + if (fullscreen || !con_is_leaf(con)) { + DLOG("fullscreen or not a leaf, ignoring ConfigureRequest\n"); + goto out; + } + + Con *ws = con_get_workspace(con); + if (ws == NULL) { + DLOG("Window is not being managed, ignoring ConfigureRequest\n"); + goto out; + } + + if (strcmp(ws->name, "__i3_scratch") == 0) { + DLOG("This is a scratchpad container, ignoring ConfigureRequest\n"); + goto out; + } + + if (config.focus_on_window_activation == FOWA_FOCUS || (config.focus_on_window_activation == FOWA_SMART && workspace_is_visible(ws))) { + DLOG("Focusing con = %p\n", con); + workspace_show(ws); + con_focus(con); + tree_render(); + } else if (config.focus_on_window_activation == FOWA_URGENT || (config.focus_on_window_activation == FOWA_SMART && !workspace_is_visible(ws))) { + DLOG("Marking con = %p urgent\n", con); + con_set_urgency(con, true); + tree_render(); + } else { + DLOG("Ignoring request for con = %p.\n", con); } } +out: fake_absolute_configure_notify(con); } diff --git a/testcases/t/269-focus-stack-above.t b/testcases/t/269-focus-stack-above.t index e1785260..a902d968 100644 --- a/testcases/t/269-focus-stack-above.t +++ b/testcases/t/269-focus-stack-above.t @@ -36,4 +36,20 @@ sync_with_i3; is($x->input_focus, $left_window->id, 'left window has focus'); isnt(get_focused($ws), $old_focus, 'right window is no longer focused'); +################################################################################ +# Verify the ConfigureWindow request is only applied when on the active +# workspace. +################################################################################ + +$ws = fresh_workspace; +my $new_window = open_window; + +is($x->input_focus, $new_window->id, 'new window has focus'); +$x->configure_window($left_window->id, CONFIG_WINDOW_STACK_MODE, (STACK_MODE_ABOVE)); +$x->flush; + +sync_with_i3; + +is($x->input_focus, $new_window->id, 'new window still has focus'); + done_testing; -- 2.39.5