Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #include "config.h"
5 : :
6 : : #include <gio/gio.h>
7 : : #include <gtk/gtk.h>
8 : : #include <valent.h>
9 : :
10 : : #include "valent-input-remote.h"
11 : : #include "valent-media-window.h"
12 : : #include "valent-messages-window.h"
13 : : #include "valent-share-dialog.h"
14 : : #include "valent-ui-utils-private.h"
15 : : #include "valent-window.h"
16 : :
17 : : #include "valent-gnome-application.h"
18 : :
19 : :
20 : : struct _ValentGNOMEApplication
21 : : {
22 : : ValentApplicationPlugin parent_instance;
23 : :
24 : : GtkWindow *main_window;
25 : : GtkWindow *input_remote;
26 : : GtkWindow *media_window;
27 : : GtkWindow *messages_window;
28 : : GPtrArray *windows;
29 : : };
30 : :
31 [ + + + - ]: 68 : G_DEFINE_FINAL_TYPE (ValentGNOMEApplication, valent_gnome_application, VALENT_TYPE_APPLICATION_PLUGIN)
32 : :
33 : :
34 : : /*
35 : : * GActions
36 : : */
37 : : static void
38 : 0 : main_window_action (GSimpleAction *action,
39 : : GVariant *parameter,
40 : : gpointer user_data)
41 : : {
42 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
43 : :
44 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
45 : :
46 [ # # ]: 0 : if (self->main_window == NULL)
47 : : {
48 : 0 : ValentDeviceManager *devices = valent_device_manager_get_default ();
49 : 0 : GApplication *application = valent_extension_get_object (VALENT_EXTENSION (self));
50 : :
51 : 0 : self->main_window = g_object_new (VALENT_TYPE_WINDOW,
52 : : "default-width", 600,
53 : : "default-height", 480,
54 : : "device-manager", devices,
55 : : NULL);
56 : 0 : g_object_add_weak_pointer (G_OBJECT (self->main_window),
57 : 0 : (gpointer)&self->main_window);
58 : :
59 : 0 : gtk_widget_insert_action_group (GTK_WIDGET (self->main_window),
60 : : "app",
61 : : G_ACTION_GROUP (application));
62 : : }
63 : :
64 : 0 : gtk_window_present (self->main_window);
65 : 0 : gtk_widget_activate_action_variant (GTK_WIDGET (self->main_window),
66 : : "win.page",
67 : : parameter);
68 : 0 : }
69 : :
70 : : static void
71 : 0 : input_remote_action (GSimpleAction *action,
72 : : GVariant *parameter,
73 : : gpointer user_data)
74 : : {
75 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
76 : :
77 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
78 : :
79 [ # # ]: 0 : if (self->input_remote == NULL)
80 : : {
81 : 0 : self->input_remote = g_object_new (VALENT_TYPE_INPUT_REMOTE,
82 : : "adapters", valent_input_get_default (),
83 : : NULL);
84 : 0 : g_object_add_weak_pointer (G_OBJECT (self->input_remote),
85 : 0 : (gpointer)&self->input_remote);
86 : : }
87 : :
88 : 0 : gtk_window_present (self->input_remote);
89 : 0 : }
90 : :
91 : : static void
92 : 0 : media_window_action (GSimpleAction *action,
93 : : GVariant *parameter,
94 : : gpointer user_data)
95 : : {
96 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
97 : :
98 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
99 : :
100 [ # # ]: 0 : if (self->media_window == NULL)
101 : : {
102 : 0 : self->media_window = g_object_new (VALENT_TYPE_MEDIA_WINDOW,
103 : : "mixers", valent_mixer_get_default (),
104 : : "players", valent_media_get_default (),
105 : : NULL);
106 : 0 : g_object_add_weak_pointer (G_OBJECT (self->media_window),
107 : 0 : (gpointer)&self->media_window);
108 : : }
109 : :
110 : 0 : gtk_window_present (self->media_window);
111 : 0 : }
112 : :
113 : : static void
114 : 0 : messages_window_action (GSimpleAction *action,
115 : : GVariant *parameter,
116 : : gpointer user_data)
117 : : {
118 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
119 : :
120 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
121 : :
122 [ # # ]: 0 : if (self->messages_window == NULL)
123 : : {
124 : 0 : self->messages_window = g_object_new (VALENT_TYPE_MESSAGES_WINDOW, NULL);
125 : 0 : g_object_add_weak_pointer (G_OBJECT (self->messages_window),
126 : 0 : (gpointer)&self->messages_window);
127 : : }
128 : :
129 : 0 : gtk_window_present (self->messages_window);
130 : 0 : }
131 : :
132 : : static void
133 : 0 : on_destroy (GtkWindow *window,
134 : : ValentGNOMEApplication *self)
135 : : {
136 : 0 : unsigned int index;
137 : :
138 [ # # # # : 0 : g_assert (GTK_IS_WINDOW (window));
# # # # ]
139 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
140 : :
141 : : /* The signal was emitted because we're disposing or being disabled */
142 [ # # ]: 0 : if (self->windows == NULL)
143 : 0 : return;
144 : :
145 [ # # ]: 0 : if (g_ptr_array_find (self->windows, window, &index))
146 : 0 : g_ptr_array_steal_index (self->windows, index);
147 : : }
148 : :
149 : : static void
150 : 0 : valent_share_target_present (ValentGNOMEApplication *self,
151 : : GListModel *files)
152 : : {
153 : 0 : GtkWindow *window = NULL;
154 : :
155 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
156 [ # # # # ]: 0 : g_assert (files == NULL || G_IS_LIST_MODEL (files));
157 : :
158 : 0 : window = g_object_new (VALENT_TYPE_SHARE_DIALOG,
159 : : "files", files,
160 : : NULL);
161 : 0 : g_signal_connect_object (G_OBJECT (window),
162 : : "destroy",
163 : : G_CALLBACK (on_destroy),
164 : : self,
165 : : G_CONNECT_DEFAULT);
166 : 0 : g_ptr_array_add (self->windows, window);
167 : :
168 : 0 : gtk_window_present (window);
169 : 0 : }
170 : :
171 : : static inline void
172 : 0 : share_dialog_action (GSimpleAction *action,
173 : : GVariant *parameters,
174 : : gpointer user_data)
175 : : {
176 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (user_data);
177 : :
178 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (self));
179 : :
180 : 0 : valent_share_target_present (self, NULL);
181 : 0 : }
182 : :
183 : : static const GActionEntry app_actions[] = {
184 : : { "input-remote", input_remote_action, NULL, NULL, NULL },
185 : : { "media-window", media_window_action, NULL, NULL, NULL },
186 : : { "messages-window", messages_window_action, NULL, NULL, NULL },
187 : : { "share-dialog", share_dialog_action, NULL, NULL, NULL },
188 : : { "window", main_window_action, "s", NULL, NULL },
189 : : };
190 : :
191 : :
192 : : /*
193 : : * ValentApplicationPlugin
194 : : */
195 : : static gboolean
196 : 0 : valent_gnome_application_activate (ValentApplicationPlugin *plugin)
197 : : {
198 : 0 : GApplication *application = NULL;
199 : :
200 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
201 : :
202 : 0 : application = valent_extension_get_object (VALENT_EXTENSION (plugin));
203 : 0 : g_action_group_activate_action (G_ACTION_GROUP (application),
204 : : "window",
205 : : g_variant_new_string ("main"));
206 : :
207 : 0 : return TRUE;
208 : : }
209 : :
210 : : static gboolean
211 : 0 : valent_gnome_application_open (ValentApplicationPlugin *plugin,
212 : : GFile **files,
213 : : int n_files,
214 : : const char *hint)
215 : : {
216 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (plugin);
217 : 0 : g_autoptr (GListStore) files_list = NULL;
218 : :
219 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
220 [ # # ]: 0 : g_assert (files != NULL);
221 [ # # ]: 0 : g_assert (n_files > 0);
222 [ # # ]: 0 : g_assert (hint != NULL);
223 : :
224 : 0 : files_list = g_list_store_new (G_TYPE_FILE);
225 : 0 : g_list_store_splice (files_list, 0, 0, (gpointer *)files, n_files);
226 : 0 : valent_share_target_present (self, G_LIST_MODEL (files_list));
227 : :
228 [ # # ]: 0 : return TRUE;
229 : : }
230 : :
231 : : static void
232 : 0 : valent_gnome_application_shutdown (ValentApplicationPlugin *plugin)
233 : : {
234 : 0 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (plugin);
235 : 0 : GApplication *application = NULL;
236 : :
237 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
238 : :
239 : 0 : application = valent_extension_get_object (VALENT_EXTENSION (plugin));
240 : :
241 [ # # ]: 0 : for (size_t i = 0; i < G_N_ELEMENTS (app_actions); i++)
242 : 0 : g_action_map_remove_action (G_ACTION_MAP (application), app_actions[i].name);
243 : :
244 [ # # ]: 0 : g_clear_pointer (&self->media_window, gtk_window_destroy);
245 [ # # ]: 0 : g_clear_pointer (&self->main_window, gtk_window_destroy);
246 : 0 : }
247 : :
248 : : static void
249 : 0 : valent_gnome_application_startup (ValentApplicationPlugin *plugin)
250 : : {
251 : 0 : GApplication *application = NULL;
252 : :
253 [ # # ]: 0 : g_assert (VALENT_IS_GNOME_APPLICATION (plugin));
254 : :
255 : 0 : application = valent_extension_get_object (VALENT_EXTENSION (plugin));
256 : 0 : g_action_map_add_action_entries (G_ACTION_MAP (application),
257 : : app_actions,
258 : : G_N_ELEMENTS (app_actions),
259 : : plugin);
260 : 0 : }
261 : :
262 : : /*
263 : : * ValentObject
264 : : */
265 : : static void
266 : 1 : valent_gnome_application_destroy (ValentObject *object)
267 : : {
268 : 1 : ValentGNOMEApplication *self = VALENT_GNOME_APPLICATION (object);
269 : 1 : GApplication *application = NULL;
270 : :
271 : 1 : application = valent_extension_get_object (VALENT_EXTENSION (self));
272 : :
273 [ + + ]: 6 : for (size_t i = 0; i < G_N_ELEMENTS (app_actions); i++)
274 : 5 : g_action_map_remove_action (G_ACTION_MAP (application), app_actions[i].name);
275 : :
276 [ + - ]: 1 : g_clear_pointer (&self->windows, g_ptr_array_unref);
277 : :
278 : 1 : VALENT_OBJECT_CLASS (valent_gnome_application_parent_class)->destroy (object);
279 : 1 : }
280 : :
281 : : /*
282 : : * GObject
283 : : */
284 : : static void
285 : 17 : valent_gnome_application_class_init (ValentGNOMEApplicationClass *klass)
286 : : {
287 : 17 : ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
288 : 17 : ValentApplicationPluginClass *plugin_class = VALENT_APPLICATION_PLUGIN_CLASS (klass);
289 : :
290 : 17 : vobject_class->destroy = valent_gnome_application_destroy;
291 : :
292 : 17 : plugin_class->activate = valent_gnome_application_activate;
293 : 17 : plugin_class->open = valent_gnome_application_open;
294 : 17 : plugin_class->shutdown = valent_gnome_application_shutdown;
295 : 17 : plugin_class->startup = valent_gnome_application_startup;
296 : :
297 : 17 : valent_ui_init ();
298 : : }
299 : :
300 : : static void
301 : 1 : valent_gnome_application_init (ValentGNOMEApplication *self)
302 : : {
303 : 1 : self->windows = g_ptr_array_new_with_free_func ((GDestroyNotify)gtk_window_destroy);
304 : 1 : }
305 : :
|