summaryrefslogtreecommitdiff
path: root/Userland/Services/WindowServer/WindowManager.cpp
diff options
context:
space:
mode:
authorMax Wipfli <mail@maxwipfli.ch>2021-06-21 12:50:45 +0200
committerAndreas Kling <kling@serenityos.org>2021-06-21 16:46:01 +0200
commitac9003bb70e76f7108cc1bf7d03c7d13b66256e2 (patch)
treea10233da50b61a25fe31039d36a2cbcc7a121e99 /Userland/Services/WindowServer/WindowManager.cpp
parentf68932cac1d69e4cdb92367331d78c0c3aa09884 (diff)
downloadserenity-ac9003bb70e76f7108cc1bf7d03c7d13b66256e2.zip
WindowServer: Focus windows blocked by a modal window
If a window which has an active modal window is focused, the modal window starts blinking. In this case, the window (and modal) should still be focused. For this, the order of the checks in process_mouse_event_for_window has to be changed. This fixes #8183.
Diffstat (limited to 'Userland/Services/WindowServer/WindowManager.cpp')
-rw-r--r--Userland/Services/WindowServer/WindowManager.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp
index 274ed411c0..9e942ec4db 100644
--- a/Userland/Services/WindowServer/WindowManager.cpp
+++ b/Userland/Services/WindowServer/WindowManager.cpp
@@ -950,20 +950,11 @@ bool WindowManager::process_mouse_event_for_titlebar_buttons(MouseEvent const& e
void WindowManager::process_mouse_event_for_window(HitTestResult& result, MouseEvent const& event)
{
auto& window = *result.window;
-
- if (auto* blocking_modal_window = window.blocking_modal_window()) {
- if (event.type() == Event::Type::MouseDown) {
- // We're clicking on something that's blocked by a modal window.
- // Flash the modal window to let the user know about it.
- blocking_modal_window->frame().start_flash_animation();
- }
- // Don't send mouse events to windows blocked by a modal child.
- return;
- }
+ auto* blocking_modal_window = window.blocking_modal_window();
// First check if we should initiate a move or resize (Super+LMB or Super+RMB).
// In those cases, the event is swallowed by the window manager.
- if (window.is_movable()) {
+ if (!blocking_modal_window && window.is_movable()) {
if (!window.is_fullscreen() && m_keyboard_modifiers == Mod_Super && event.type() == Event::MouseDown && event.button() == MouseButton::Left) {
start_window_move(window, event);
return;
@@ -981,6 +972,16 @@ void WindowManager::process_mouse_event_for_window(HitTestResult& result, MouseE
set_active_window(&window);
}
+ if (blocking_modal_window) {
+ if (event.type() == Event::Type::MouseDown) {
+ // We're clicking on something that's blocked by a modal window.
+ // Flash the modal window to let the user know about it.
+ blocking_modal_window->frame().start_flash_animation();
+ }
+ // Don't send mouse events to windows blocked by a modal child.
+ return;
+ }
+
if (result.is_frame_hit) {
// We are hitting the frame, pass the event along to WindowFrame.
window.frame().handle_mouse_event(event.translated(-window.frame().rect().location()));