Serenity Operating System
at master 137 lines 4.8 kB view raw
1/* 2 * Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/DeprecatedString.h> 10#include <AK/HashMap.h> 11#include <AK/OwnPtr.h> 12#include <AK/String.h> 13#include <AK/WeakPtr.h> 14#include <LibCore/EventLoop.h> 15#include <LibCore/Object.h> 16#include <LibGUI/Forward.h> 17#include <LibGUI/Shortcut.h> 18#include <LibGUI/Widget.h> 19#include <LibGfx/Point.h> 20#include <LibMain/Main.h> 21 22namespace GUI { 23 24class Application : public Core::Object { 25 C_OBJECT(Application); 26 27public: 28 static Application* the(); 29 30 ~Application(); 31 32 static bool in_teardown(); 33 34 int exec(); 35 void quit(int = 0); 36 37 Action* action_for_shortcut(Shortcut const&) const; 38 39 void register_global_shortcut_action(Badge<Action>, Action&); 40 void unregister_global_shortcut_action(Badge<Action>, Action&); 41 42 void show_tooltip(DeprecatedString, Widget const* tooltip_source_widget); 43 void show_tooltip_immediately(DeprecatedString, Widget const* tooltip_source_widget); 44 void hide_tooltip(); 45 Widget const* tooltip_source_widget() { return m_tooltip_source_widget; }; 46 47 bool quit_when_last_window_deleted() const { return m_quit_when_last_window_deleted; } 48 void set_quit_when_last_window_deleted(bool b) { m_quit_when_last_window_deleted = b; } 49 50 void did_create_window(Badge<Window>); 51 void did_delete_last_window(Badge<Window>); 52 53 DeprecatedString const& invoked_as() const { return m_invoked_as; } 54 Vector<DeprecatedString> const& args() const { return m_args; } 55 56 Gfx::Palette palette() const; 57 void set_palette(Gfx::Palette&); 58 59 void set_system_palette(Core::AnonymousBuffer&); 60 61 bool focus_debugging_enabled() const { return m_focus_debugging_enabled; } 62 bool hover_debugging_enabled() const { return m_hover_debugging_enabled; } 63 bool dnd_debugging_enabled() const { return m_dnd_debugging_enabled; } 64 65 Core::EventLoop& event_loop() { return *m_event_loop; } 66 67 Window* active_window() { return m_active_window; } 68 Window const* active_window() const { return m_active_window; } 69 70 void window_did_become_active(Badge<Window>, Window&); 71 void window_did_become_inactive(Badge<Window>, Window&); 72 73 Widget* drag_hovered_widget() { return m_drag_hovered_widget.ptr(); } 74 Widget const* drag_hovered_widget() const { return m_drag_hovered_widget.ptr(); } 75 76 Widget* pending_drop_widget() { return m_pending_drop_widget.ptr(); } 77 Widget const* pending_drop_widget() const { return m_pending_drop_widget.ptr(); } 78 79 void set_drag_hovered_widget(Badge<Window>, Widget* widget, Gfx::IntPoint position = {}, Vector<DeprecatedString> mime_types = {}) 80 { 81 set_drag_hovered_widget_impl(widget, position, move(mime_types)); 82 } 83 void notify_drag_cancelled(Badge<ConnectionToWindowServer>); 84 85 Function<void(Action&)> on_action_enter; 86 Function<void(Action&)> on_action_leave; 87 Function<void()> on_theme_change; 88 89 auto const& global_shortcut_actions(Badge<GUI::CommandPalette>) const { return m_global_shortcut_actions; } 90 91 static constexpr size_t max_recently_open_files() { return 4; } 92 93 void set_config_domain(String); 94 void update_recent_file_actions(); 95 void set_most_recently_open_file(String path); 96 97 void register_recent_file_actions(Badge<GUI::Menu>, Vector<NonnullRefPtr<GUI::Action>>); 98 99private: 100 Application(int argc, char** argv, Core::EventLoop::MakeInspectable = Core::EventLoop::MakeInspectable::No); 101 Application(Main::Arguments const& arguments, Core::EventLoop::MakeInspectable inspectable = Core::EventLoop::MakeInspectable::No) 102 : Application(arguments.argc, arguments.argv, inspectable) 103 { 104 } 105 106 virtual void event(Core::Event&) override; 107 108 void request_tooltip_show(); 109 void tooltip_hide_timer_did_fire(); 110 111 void set_drag_hovered_widget_impl(Widget*, Gfx::IntPoint = {}, Vector<DeprecatedString> = {}); 112 void set_pending_drop_widget(Widget*); 113 114 OwnPtr<Core::EventLoop> m_event_loop; 115 RefPtr<Gfx::PaletteImpl> m_palette; 116 RefPtr<Gfx::PaletteImpl> m_system_palette; 117 HashMap<Shortcut, Action*> m_global_shortcut_actions; 118 class TooltipWindow; 119 RefPtr<Core::Timer> m_tooltip_show_timer; 120 RefPtr<Core::Timer> m_tooltip_hide_timer; 121 RefPtr<TooltipWindow> m_tooltip_window; 122 RefPtr<Widget const> m_tooltip_source_widget; 123 WeakPtr<Window> m_active_window; 124 bool m_quit_when_last_window_deleted { true }; 125 bool m_focus_debugging_enabled { false }; 126 bool m_hover_debugging_enabled { false }; 127 bool m_dnd_debugging_enabled { false }; 128 DeprecatedString m_invoked_as; 129 Vector<DeprecatedString> m_args; 130 WeakPtr<Widget> m_drag_hovered_widget; 131 WeakPtr<Widget> m_pending_drop_widget; 132 133 String m_config_domain; 134 Vector<NonnullRefPtr<GUI::Action>> m_recent_file_actions; 135}; 136 137}