LibGUI: Put a governor on Action activation

Many actions affect Window modality, so let's put a temporary change
governor on activation to stop race conditions.

Fixes being able to spam open/close shortcuts and spawn multiple
FilePickers, among other things.
This commit is contained in:
thankyouverycool 2023-05-13 05:10:39 -04:00 committed by Andreas Kling
parent 7323a54e59
commit c87c4f6d94
Notes: sideshowbarker 2024-07-17 03:30:41 +09:00
2 changed files with 9 additions and 1 deletions

View file

@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/TemporaryChange.h>
#include <LibGUI/Action.h>
#include <LibGUI/ActionGroup.h>
#include <LibGUI/Application.h>
@ -132,7 +133,7 @@ Action::~Action()
void Action::process_event(Window& window, Event& event)
{
if (is_enabled() && is_visible()) {
if (is_enabled() && is_visible() && !is_activating()) {
flash_menubar_menu(window);
activate();
event.accept();
@ -148,6 +149,10 @@ void Action::process_event(Window& window, Event& event)
void Action::activate(Core::Object* activator)
{
if (is_activating())
return;
TemporaryChange change { m_activating, true };
if (!on_activation)
return;

View file

@ -121,6 +121,8 @@ public:
}
void set_checked(bool);
bool is_activating() const { return m_activating; }
bool swallow_key_event_when_disabled() const { return m_swallow_key_event_when_disabled; }
void set_swallow_key_event_when_disabled(bool swallow) { m_swallow_key_event_when_disabled = swallow; }
@ -157,6 +159,7 @@ private:
bool m_checkable { false };
bool m_checked { false };
bool m_swallow_key_event_when_disabled { false };
bool m_activating { false };
ShortcutScope m_scope { ShortcutScope::None };
HashTable<Button*> m_buttons;