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