Serenity Operating System
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}