1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3 /*
4 * Goo
5 *
6 * Copyright (C) 2013 Free Software Foundation, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include <config.h>
23 #include "dlg-extract.h"
24 #include "dlg-preferences.h"
25 #include "dlg-properties.h"
26 #include "gtk-utils.h"
27 #include "goo-window.h"
28 #include "goo-window-actions-callbacks.h"
29 #include "preferences.h"
30
31
32 void
goo_window_activate_play(GSimpleAction * action,GVariant * parameter,gpointer user_data)33 goo_window_activate_play (GSimpleAction *action,
34 GVariant *parameter,
35 gpointer user_data)
36 {
37 goo_window_play (GOO_WINDOW (user_data));
38 }
39
40
41 void
goo_window_activate_play_selected(GSimpleAction * action,GVariant * parameter,gpointer user_data)42 goo_window_activate_play_selected (GSimpleAction *action,
43 GVariant *parameter,
44 gpointer user_data)
45 {
46 goo_window_play_selected (GOO_WINDOW (user_data));
47 }
48
49
50
51 void
goo_window_activate_pause(GSimpleAction * action,GVariant * parameter,gpointer user_data)52 goo_window_activate_pause (GSimpleAction *action,
53 GVariant *parameter,
54 gpointer user_data)
55 {
56 goo_window_pause (GOO_WINDOW (user_data));
57 }
58
59
60 void
goo_window_activate_toggle_play(GSimpleAction * action,GVariant * parameter,gpointer user_data)61 goo_window_activate_toggle_play (GSimpleAction *action,
62 GVariant *parameter,
63 gpointer user_data)
64 {
65 goo_window_toggle_play (GOO_WINDOW (user_data));
66 }
67
68
69 void
goo_window_activate_stop(GSimpleAction * action,GVariant * parameter,gpointer user_data)70 goo_window_activate_stop (GSimpleAction *action,
71 GVariant *parameter,
72 gpointer user_data)
73 {
74 goo_window_stop (GOO_WINDOW (user_data));
75 }
76
77
78 void
goo_window_activate_next_track(GSimpleAction * action,GVariant * parameter,gpointer user_data)79 goo_window_activate_next_track (GSimpleAction *action,
80 GVariant *parameter,
81 gpointer user_data)
82 {
83 goo_window_next (GOO_WINDOW (user_data));
84 }
85
86
87 void
goo_window_activate_previous_track(GSimpleAction * action,GVariant * parameter,gpointer user_data)88 goo_window_activate_previous_track (GSimpleAction *action,
89 GVariant *parameter,
90 gpointer user_data)
91 {
92 goo_window_prev (GOO_WINDOW (user_data));
93 }
94
95
96 void
goo_window_activate_eject(GSimpleAction * action,GVariant * parameter,gpointer user_data)97 goo_window_activate_eject (GSimpleAction *action,
98 GVariant *parameter,
99 gpointer user_data)
100 {
101 goo_window_eject (GOO_WINDOW (user_data));
102 }
103
104
105 void
goo_window_activate_reload(GSimpleAction * action,GVariant * parameter,gpointer user_data)106 goo_window_activate_reload (GSimpleAction *action,
107 GVariant *parameter,
108 gpointer user_data)
109 {
110 goo_window_update (GOO_WINDOW (user_data));
111 }
112
113
114 void
goo_window_activate_close(GSimpleAction * action,GVariant * parameter,gpointer user_data)115 goo_window_activate_close (GSimpleAction *action,
116 GVariant *parameter,
117 gpointer user_data)
118 {
119 goo_window_close (GOO_WINDOW (user_data));
120 }
121
122
123 void
goo_window_activate_play_all(GSimpleAction * action,GVariant * parameter,gpointer user_data)124 goo_window_activate_play_all (GSimpleAction *action,
125 GVariant *parameter,
126 gpointer user_data)
127 {
128 GSettings *settings;
129
130 g_simple_action_set_state (action, parameter);
131 settings = g_settings_new (GOOBOX_SCHEMA_PLAYLIST);
132 g_settings_set_boolean (settings, PREF_PLAYLIST_PLAYALL, g_variant_get_boolean (parameter));
133
134 g_object_unref (settings);
135 }
136
137
138 void
goo_window_activate_repeat(GSimpleAction * action,GVariant * parameter,gpointer user_data)139 goo_window_activate_repeat (GSimpleAction *action,
140 GVariant *parameter,
141 gpointer user_data)
142 {
143 GSettings *settings;
144
145 g_simple_action_set_state (action, parameter);
146 settings = g_settings_new (GOOBOX_SCHEMA_PLAYLIST);
147 g_settings_set_boolean (settings, PREF_PLAYLIST_REPEAT, g_variant_get_boolean (parameter));
148
149 g_object_unref (settings);
150 }
151
152
153 void
goo_window_activate_shuffle(GSimpleAction * action,GVariant * parameter,gpointer user_data)154 goo_window_activate_shuffle (GSimpleAction *action,
155 GVariant *parameter,
156 gpointer user_data)
157 {
158 GSettings *settings;
159
160 g_simple_action_set_state (action, parameter);
161 settings = g_settings_new (GOOBOX_SCHEMA_PLAYLIST);
162 g_settings_set_boolean (settings, PREF_PLAYLIST_SHUFFLE, g_variant_get_boolean (parameter));
163
164 g_object_unref (settings);
165 }
166
167
168 /* -- goo_window_activate_copy_disc -- */
169
170
171 static void
external_app_watch_func(GPid pid,gint status,gpointer data)172 external_app_watch_func (GPid pid,
173 gint status,
174 gpointer data)
175 {
176 g_spawn_close_pid (pid);
177 goo_window_set_hibernate (GOO_WINDOW (data), FALSE);
178 }
179
180
181 static gboolean
exec_external_app(GdkScreen * screen,const char * command_line,GError ** error,gpointer data)182 exec_external_app (GdkScreen *screen,
183 const char *command_line,
184 GError **error,
185 gpointer data)
186 {
187 gboolean retval;
188 gchar **argv = NULL;
189 GPid child_pid;
190
191 g_return_val_if_fail (command_line != NULL, FALSE);
192
193 if (! g_shell_parse_argv (command_line, NULL, &argv, error))
194 return FALSE;
195
196 retval = g_spawn_async (NULL,
197 argv,
198 NULL,
199 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
200 NULL,
201 NULL,
202 &child_pid,
203 error);
204 g_child_watch_add (child_pid, external_app_watch_func, data);
205
206 g_strfreev (argv);
207
208 return retval;
209 }
210
211
212 void
goo_window_activate_copy_disc(GSimpleAction * action,GVariant * parameter,gpointer user_data)213 goo_window_activate_copy_disc (GSimpleAction *action,
214 GVariant *parameter,
215 gpointer user_data)
216 {
217 GooWindow *window = user_data;
218 char *command;
219 GError *error = NULL;
220
221 command = g_strconcat ("brasero --copy=",
222 goo_player_get_device (goo_window_get_player (window)),
223 NULL);
224
225 goo_window_set_hibernate (window, TRUE);
226 if (! exec_external_app (gtk_widget_get_screen (GTK_WIDGET (window)),
227 command,
228 &error,
229 window))
230 {
231 _gtk_error_dialog_from_gerror_run (GTK_WINDOW (window),
232 _("Could not execute command"),
233 &error);
234 goo_window_set_hibernate (window, FALSE);
235 }
236
237 g_free (command);
238 }
239
240
241 void
goo_window_activate_extract(GSimpleAction * action,GVariant * parameter,gpointer user_data)242 goo_window_activate_extract (GSimpleAction *action,
243 GVariant *parameter,
244 gpointer user_data)
245 {
246 GooWindow *window = user_data;
247 GSettings *settings;
248 gboolean use_sound_juicer;
249 GError *error = NULL;
250
251 settings = g_settings_new (GOOBOX_SCHEMA_GENERAL);
252 use_sound_juicer = g_settings_get_boolean (settings, PREF_GENERAL_USE_SJ);
253 g_object_unref (settings);
254
255 if (! use_sound_juicer) {
256 dlg_extract (window);
257 return;
258 }
259
260 goo_window_set_hibernate (window, TRUE);
261
262 if (! exec_external_app (gtk_widget_get_screen (GTK_WIDGET (window)),
263 "sound-juicer",
264 &error,
265 window))
266 {
267 _gtk_error_dialog_from_gerror_run (GTK_WINDOW (window),
268 _("Could not execute command"),
269 &error);
270 goo_window_set_hibernate (window, FALSE);
271 }
272 }
273
274
275 void
goo_window_activate_extract_selected(GSimpleAction * action,GVariant * parameter,gpointer user_data)276 goo_window_activate_extract_selected (GSimpleAction *action,
277 GVariant *parameter,
278 gpointer user_data)
279 {
280 GooWindow *window = user_data;
281 GSettings *settings;
282 gboolean use_sound_juicer;
283 GError *error = NULL;
284
285 settings = g_settings_new (GOOBOX_SCHEMA_GENERAL);
286 use_sound_juicer = g_settings_get_boolean (settings, PREF_GENERAL_USE_SJ);
287 g_object_unref (settings);
288
289 if (! use_sound_juicer) {
290 dlg_extract_selected (window);
291 return;
292 }
293
294 goo_window_set_hibernate (window, TRUE);
295
296 if (! exec_external_app (gtk_widget_get_screen (GTK_WIDGET (window)),
297 "sound-juicer",
298 &error,
299 window))
300 {
301 _gtk_error_dialog_from_gerror_run (GTK_WINDOW (window),
302 _("Could not execute command"),
303 &error);
304 goo_window_set_hibernate (window, FALSE);
305 }
306 }
307
308
309 void
goo_window_activate_preferences(GSimpleAction * action,GVariant * parameter,gpointer user_data)310 goo_window_activate_preferences (GSimpleAction *action,
311 GVariant *parameter,
312 gpointer user_data)
313 {
314 dlg_preferences (GOO_WINDOW (user_data));
315 }
316
317
318 void
goo_window_activate_pick_cover_from_disk(GSimpleAction * action,GVariant * parameter,gpointer user_data)319 goo_window_activate_pick_cover_from_disk (GSimpleAction *action,
320 GVariant *parameter,
321 gpointer user_data)
322 {
323 goo_window_pick_cover_from_disk (GOO_WINDOW (user_data));
324 }
325
326
327 void
goo_window_activate_search_cover(GSimpleAction * action,GVariant * parameter,gpointer user_data)328 goo_window_activate_search_cover (GSimpleAction *action,
329 GVariant *parameter,
330 gpointer user_data)
331 {
332 goo_window_search_cover_on_internet (GOO_WINDOW (user_data));
333 }
334
335
336 void
goo_window_activate_remove_cover(GSimpleAction * action,GVariant * parameter,gpointer user_data)337 goo_window_activate_remove_cover (GSimpleAction *action,
338 GVariant *parameter,
339 gpointer user_data)
340 {
341 goo_window_remove_cover (GOO_WINDOW (user_data));
342 }
343
344
345 void
goo_window_activate_toggle_visibility(GSimpleAction * action,GVariant * parameter,gpointer user_data)346 goo_window_activate_toggle_visibility (GSimpleAction *action,
347 GVariant *parameter,
348 gpointer user_data)
349 {
350 goo_window_toggle_visibility (GOO_WINDOW (user_data));
351 }
352
353
354 void
goo_window_activate_properties(GSimpleAction * action,GVariant * parameter,gpointer user_data)355 goo_window_activate_properties (GSimpleAction *action,
356 GVariant *parameter,
357 gpointer user_data)
358 {
359 dlg_properties (GOO_WINDOW (user_data));
360 }
361