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 : : #define G_LOG_DOMAIN "valent-presenter-remote"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <adwaita.h>
9 : : #include <glib/gi18n.h>
10 : : #include <gtk/gtk.h>
11 : : #include <valent.h>
12 : :
13 : : #include "valent-presenter-remote.h"
14 : :
15 : :
16 : : struct _ValentPresenterRemote
17 : : {
18 : : AdwWindow parent_instance;
19 : :
20 : : ValentDevice *device;
21 : : };
22 : :
23 [ + + + - ]: 4 : G_DEFINE_FINAL_TYPE (ValentPresenterRemote, valent_presenter_remote, ADW_TYPE_WINDOW)
24 : :
25 : : typedef enum {
26 : : PROP_DEVICE = 1,
27 : : } ValentPresenterRemoteProperty;
28 : :
29 : : static GParamSpec *properties[PROP_DEVICE + 1] = { NULL, };
30 : :
31 : : /*
32 : : * File Filter
33 : : */
34 : : static const char *mimetypes[] = {
35 : : "application/vnd.ms-powerpoint",
36 : : "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
37 : : "application/vnd.ms-powerpoint.slide.macroEnabled.12",
38 : : "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
39 : : "application/vnd.oasis.opendocument.presentation",
40 : : "application/vnd.oasis.opendocument.presentation-flat-xml",
41 : : "application/vnd.openxmlformats-officedocument.presentationml.presentation",
42 : : "application/vnd.openxmlformats-officedocument.presentationml.slide",
43 : : "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
44 : : NULL
45 : : };
46 : :
47 : : /*
48 : : * GtkWidget
49 : : */
50 : : static void
51 : 0 : gtk_file_dialog_open_cb (GtkFileDialog *dialog,
52 : : GAsyncResult *result,
53 : : ValentPresenterRemote *self)
54 : : {
55 : 0 : g_autoptr (GFile) file = NULL;
56 : 0 : g_autoptr (GError) error = NULL;
57 : 0 : char *uri = NULL;
58 : :
59 [ # # ]: 0 : if ((file = gtk_file_dialog_open_finish (dialog, result, &error)) == NULL)
60 : : {
61 [ # # # # ]: 0 : if (!g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED) &&
62 : 0 : !g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_DISMISSED))
63 : 0 : g_warning ("%s(): %s", G_STRFUNC, error->message);
64 : :
65 [ # # ]: 0 : return;
66 : : }
67 : :
68 : 0 : uri = g_file_get_uri (file);
69 [ # # ]: 0 : g_action_group_activate_action (G_ACTION_GROUP (self->device),
70 : : "share.open",
71 : : g_variant_new_take_string (uri));
72 : : }
73 : :
74 : : static void
75 : 0 : presenter_open_action (GtkWidget *widget,
76 : : const char *action_name,
77 : : GVariant *parameter)
78 : : {
79 : 0 : ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (widget);
80 : 0 : g_autoptr (GtkFileDialog) dialog = NULL;
81 [ # # ]: 0 : g_autoptr (GListStore) filters = NULL;
82 [ # # ]: 0 : g_autoptr (GtkFileFilter) presentations_filter = NULL;
83 [ # # ]: 0 : g_autoptr (GtkFileFilter) all_filter = NULL;
84 : :
85 [ # # ]: 0 : g_assert (VALENT_IS_PRESENTER_REMOTE (self));
86 : :
87 : : /* Select single files */
88 : 0 : dialog = g_object_new (GTK_TYPE_FILE_DIALOG,
89 : : "title", _("Select Presentation"),
90 : : "accept-label", _("Open"),
91 : : "modal", TRUE,
92 : : NULL);
93 : :
94 : : /* Filter presentation files */
95 : 0 : filters = g_list_store_new (GTK_TYPE_FILE_FILTER);
96 : :
97 : 0 : presentations_filter = gtk_file_filter_new ();
98 : 0 : gtk_file_filter_set_name (presentations_filter, _("Presentations"));
99 : :
100 [ # # ]: 0 : for (unsigned int i = 0; mimetypes[i] != NULL; i++)
101 : 0 : gtk_file_filter_add_mime_type (presentations_filter, mimetypes[i]);
102 : :
103 : : /* Allow any files */
104 : 0 : all_filter = gtk_file_filter_new ();
105 : 0 : gtk_file_filter_set_name (all_filter, _("All Files"));
106 : 0 : gtk_file_filter_add_pattern (all_filter, "*");
107 : :
108 : 0 : filters = g_list_store_new (GTK_TYPE_FILE_FILTER);
109 : 0 : g_list_store_append (filters, all_filter);
110 : 0 : g_list_store_append (filters, presentations_filter);
111 : 0 : gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters));
112 : :
113 [ # # ]: 0 : gtk_file_dialog_open (dialog,
114 : : GTK_WINDOW (self),
115 : : NULL,
116 : : (GAsyncReadyCallback)gtk_file_dialog_open_cb,
117 : : self);
118 : 0 : }
119 : :
120 : : /*
121 : : * GObject
122 : : */
123 : : static void
124 : 1 : valent_presenter_remote_constructed (GObject *object)
125 : : {
126 : 1 : ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (object);
127 : :
128 : 1 : G_OBJECT_CLASS (valent_presenter_remote_parent_class)->constructed (object);
129 : :
130 : 1 : gtk_widget_insert_action_group (GTK_WIDGET (self),
131 : : "device",
132 : 1 : G_ACTION_GROUP (self->device));
133 : 1 : }
134 : :
135 : : static void
136 : 1 : valent_presenter_remote_dispose (GObject *object)
137 : : {
138 : 1 : GtkWidget *widget = GTK_WIDGET (object);
139 : :
140 : 1 : gtk_widget_dispose_template (widget, VALENT_TYPE_PRESENTER_REMOTE);
141 : :
142 : 1 : G_OBJECT_CLASS (valent_presenter_remote_parent_class)->dispose (object);
143 : 1 : }
144 : :
145 : : static void
146 : 1 : valent_presenter_remote_get_property (GObject *object,
147 : : guint prop_id,
148 : : GValue *value,
149 : : GParamSpec *pspec)
150 : : {
151 : 1 : ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (object);
152 : :
153 [ + - ]: 1 : switch ((ValentPresenterRemoteProperty)prop_id)
154 : : {
155 : 1 : case PROP_DEVICE:
156 : 1 : g_value_set_object (value, self->device);
157 : 1 : break;
158 : :
159 : 0 : default:
160 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
161 : : }
162 : 1 : }
163 : :
164 : : static void
165 : 1 : valent_presenter_remote_set_property (GObject *object,
166 : : guint prop_id,
167 : : const GValue *value,
168 : : GParamSpec *pspec)
169 : : {
170 : 1 : ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (object);
171 : :
172 [ + - ]: 1 : switch ((ValentPresenterRemoteProperty)prop_id)
173 : : {
174 : 1 : case PROP_DEVICE:
175 : 1 : self->device = g_value_get_object (value);
176 : 1 : break;
177 : :
178 : 0 : default:
179 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
180 : : }
181 : 1 : }
182 : :
183 : : static void
184 : 1 : valent_presenter_remote_class_init (ValentPresenterRemoteClass *klass)
185 : : {
186 : 1 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
187 : 1 : GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
188 : :
189 : 1 : object_class->constructed = valent_presenter_remote_constructed;
190 : 1 : object_class->dispose = valent_presenter_remote_dispose;
191 : 1 : object_class->get_property = valent_presenter_remote_get_property;
192 : 1 : object_class->set_property = valent_presenter_remote_set_property;
193 : :
194 : 1 : gtk_widget_class_set_template_from_resource (widget_class, "/plugins/gnome/valent-presenter-remote.ui");
195 : :
196 : 1 : gtk_widget_class_install_action (widget_class, "remote.open", NULL, presenter_open_action);
197 : :
198 : 2 : properties [PROP_DEVICE] =
199 : 1 : g_param_spec_object ("device", NULL, NULL,
200 : : VALENT_TYPE_DEVICE,
201 : : (G_PARAM_READWRITE |
202 : : G_PARAM_CONSTRUCT_ONLY |
203 : : G_PARAM_EXPLICIT_NOTIFY |
204 : : G_PARAM_STATIC_STRINGS));
205 : :
206 : 1 : g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties);
207 : 1 : }
208 : :
209 : : static void
210 : 1 : valent_presenter_remote_init (ValentPresenterRemote *self)
211 : : {
212 : 1 : gtk_widget_init_template (GTK_WIDGET (self));
213 : 1 : }
214 : :
|