mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-29 11:00:29 +00:00
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:
parent
7323a54e59
commit
c87c4f6d94
Notes:
sideshowbarker
2024-07-17 03:30:41 +09:00
Author: https://github.com/thankyouverycool Commit: https://github.com/SerenityOS/serenity/commit/c87c4f6d94 Pull-request: https://github.com/SerenityOS/serenity/pull/18797
2 changed files with 9 additions and 1 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue