1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 08:47:34 +00:00

WindowServer: Ignore modal blocking if capturing input

This exception is necessary for ComboBoxes used in some blocking
Dialogs. CaptureInput is now the only mode which can spawn from
a blocking modal and it won't accept any children of its own.
This commit is contained in:
thankyouverycool 2022-08-25 11:28:01 -04:00 committed by Andreas Kling
parent bab8bd143f
commit 18b111b802
3 changed files with 11 additions and 9 deletions

View file

@ -576,7 +576,7 @@ void ConnectionFromClient::create_window(i32 window_id, Gfx::IntRect const& rect
did_misbehave("CreateWindow with bad parent_window_id"); did_misbehave("CreateWindow with bad parent_window_id");
return; return;
} }
if (parent_window->is_blocking() || (parent_window->is_capturing_input() && mode == (i32)WindowMode::CaptureInput)) { if ((parent_window->is_blocking() && mode != (i32)WindowMode::CaptureInput) || parent_window->is_capturing_input()) {
did_misbehave("CreateWindow with forbidden parent mode"); did_misbehave("CreateWindow with forbidden parent mode");
return; return;
} }

View file

@ -442,7 +442,7 @@ void Window::event(Core::Event& event)
return; return;
} }
if (blocking_modal_window()) { if (blocking_modal_window() && !is_capturing_input()) {
// We still want to handle the WindowDeactivated event below when a new modal is // We still want to handle the WindowDeactivated event below when a new modal is
// created to notify its parent window, despite it being "blocked by modal window". // created to notify its parent window, despite it being "blocked by modal window".
if (event.type() != Event::WindowDeactivated) if (event.type() != Event::WindowDeactivated)

View file

@ -342,7 +342,8 @@ void WindowManager::add_window(Window& window)
void WindowManager::move_to_front_and_make_active(Window& window) void WindowManager::move_to_front_and_make_active(Window& window)
{ {
if (auto* blocker = window.blocking_modal_window()) { auto* blocker = window.blocking_modal_window();
if (blocker && !window.is_capturing_input()) {
blocker->window_stack().move_to_front(*blocker); blocker->window_stack().move_to_front(*blocker);
set_active_window(blocker, true); set_active_window(blocker, true);
} else { } else {
@ -1221,7 +1222,7 @@ void WindowManager::process_mouse_event_for_window(HitTestResult& result, MouseE
// First check if we should initiate a move or resize (Super+LMB or Super+RMB). // 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. // In those cases, the event is swallowed by the window manager.
if (!blocking_modal_window && window.is_movable()) { if ((!blocking_modal_window || window.is_capturing_input()) && window.is_movable()) {
if (!window.is_fullscreen() && m_keyboard_modifiers == Mod_Super && event.type() == Event::MouseDown && event.button() == MouseButton::Primary) { if (!window.is_fullscreen() && m_keyboard_modifiers == Mod_Super && event.type() == Event::MouseDown && event.button() == MouseButton::Primary) {
start_window_move(window, event); start_window_move(window, event);
return; return;
@ -1239,7 +1240,7 @@ void WindowManager::process_mouse_event_for_window(HitTestResult& result, MouseE
set_active_window(&window); set_active_window(&window);
} }
if (blocking_modal_window) { if (blocking_modal_window && !window.is_capturing_input()) {
if (event.type() == Event::Type::MouseDown) { if (event.type() == Event::Type::MouseDown) {
// We're clicking on something that's blocked by a modal window. // We're clicking on something that's blocked by a modal window.
// Flash the modal window to let the user know about it. // Flash the modal window to let the user know about it.
@ -1826,10 +1827,11 @@ void WindowManager::notify_previous_active_input_window(Window& previous_input_w
void WindowManager::set_active_window(Window* new_active_window, bool make_input) void WindowManager::set_active_window(Window* new_active_window, bool make_input)
{ {
if (new_active_window) { if (new_active_window) {
if (auto* modal_window = new_active_window->blocking_modal_window()) { auto* blocker = new_active_window->blocking_modal_window();
VERIFY(modal_window->is_modal()); if (blocker && !new_active_window->is_capturing_input()) {
VERIFY(modal_window != new_active_window); VERIFY(blocker->is_modal());
new_active_window = modal_window; VERIFY(blocker != new_active_window);
new_active_window = blocker;
make_input = true; make_input = true;
} }