1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3  * gui.c
4  * Copyright (C) Kevin DeKorte 2006 <kdekorte@gmail.com>
5  *
6  * gui.c is free software.
7  *
8  * You may redistribute it and/or modify it under the terms of the
9  * GNU General Public License, as published by the Free Software
10  * Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  *
13  * gui.c 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.
16  * See the GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with gui.c.  If not, write to:
20  * 	The Free Software Foundation, Inc.,
21  * 	51 Franklin Street, Fifth Floor
22  * 	Boston, MA  02110-1301, USA.
23  */
24 
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28 
29 #include "gui.h"
30 #include "support.h"
31 #include "common.h"
32 #include "../pixmaps/gnome_mplayer.xpm"
33 /*
34 #include "../pixmaps/media-playback-pause.xpm"
35 #include "../pixmaps/media-playback-start.xpm"
36 #include "../pixmaps/media-playback-stop.xpm"
37 #include "../pixmaps/media-seek-backward.xpm"
38 #include "../pixmaps/media-seek-forward.xpm"
39 #include "../pixmaps/media-skip-backward.xpm"
40 #include "../pixmaps/media-skip-forward.xpm"
41 #include "../pixmaps/view-fullscreen.xpm"
42 */
43 #include "langlist.h"
44 #ifdef NOTIFY_ENABLED
45 #include <libnotify/notify.h>
46 #include <libnotify/notification.h>
47 #endif
48 
49 #ifdef LIBGDA_ENABLED
50 #include "database.h"
51 #endif
52 
53 GtkWidget *window;
54 
55 GtkMenuItem *menuitem_edit_random;
56 GtkMenuItem *menuitem_edit_loop;
57 GtkMenuItem *menuitem_edit_play_single;
58 GtkWidget *repeat;
59 GtkWidget *shuffle;
60 GtkMenuItem *menuitem_edit_select_audio_lang;
61 GtkMenuItem *menuitem_edit_select_sub_lang;
62 GtkWidget *tracks;
63 GtkWidget *subtitles;
64 
65 GtkMenuItem *menuitem_view_info;
66 GtkMenuItem *menuitem_view_playlist;
67 
68 GtkMenuItem *menuitem_prev;
69 GtkMenuItem *menuitem_next;
70 
71 GtkWidget *pane;
72 GtkWidget *hbox;
73 
74 GtkWidget *media;
75 GtkWidget *cover_art;
76 GtkWidget *audio_meter;
77 
78 GtkWidget *details_table;
79 
80 GtkWidget *play_event_box;
81 
82 GtkWidget *prev_event_box;
83 GtkWidget *next_event_box;
84 GtkWidget *menu_event_box;
85 GtkWidget *fs_event_box;
86 
87 GmtkMediaTracker *tracker;
88 GtkWidget *vol_slider;
89 
90 GtkWidget *conf_volume_label;
91 
92 #ifdef GTK2_12_ENABLED
93 #else
94 GtkTooltips *tooltip;
95 #endif
96 
97 // Playlist container
98 GtkWidget *plvbox;
99 GSList *lang_group;
100 GSList *audio_group;
101 
102 GtkAccelGroup *accel_group;
103 
104 gint buckets[METER_BARS];
105 gint max_buckets[METER_BARS];
106 gchar **accel_keys;
107 gchar **accel_keys_description;
108 
109 gint cache_size;
110 gint plugin_audio_cache_size;
111 gint plugin_video_cache_size;
112 gboolean forcecache;
113 gint osdlevel;
114 gint pplevel;
115 gint streaming;
116 gboolean showcontrols;
117 gboolean showsubtitles;
118 gint fullscreen;
119 gint init_fullscreen;
120 gboolean videopresent;
121 gboolean playlist;
122 gint embed_window;
123 gint window_x;
124 gint window_y;
125 gint control_id;
126 gboolean softvol;
127 gboolean remember_softvol;
128 gdouble volume_softvol;
129 gint volume_gain;
130 gint pref_volume;
131 gint verbose;
132 gint autostart;
133 //gint actual_x, actual_y;
134 //gint play_x, play_y;
135 gint last_window_width, last_window_height;
136 //gchar vm[10];
137 gchar *vo;
138 gchar *option_vo;
139 gboolean use_hardware_codecs;
140 gboolean use_crystalhd_codecs;
141 AudioDevice audio_device;
142 gchar *audio_device_name;
143 gint audio_channels;
144 gboolean use_hw_audio;
145 gboolean disable_deinterlace;
146 gboolean disable_framedrop;
147 gboolean disable_context_menu;
148 gboolean disable_fullscreen;
149 gboolean disable_pause_on_click;
150 gboolean enable_global_menu;
151 gboolean enable_nautilus_plugin;
152 gint loop;
153 gint start_second;
154 gint play_length;
155 gint random_order;
156 gboolean dontplaynext;
157 gboolean autopause;
158 gchar *path;
159 gint js_state;
160 gchar *rpconsole;
161 gchar *rpcontrols;
162 gboolean control_instance;
163 gchar *playlistname;
164 gboolean ok_to_play;
165 gchar *subtitle;
166 gchar *alang;
167 gchar *slang;
168 gchar *metadata_codepage;
169 gboolean use_mplayer2;
170 gboolean vertical_layout;
171 gboolean playlist_visible;
172 gboolean details_visible;
173 gboolean restore_controls;
174 gboolean update_control_flag;
175 //gint restore_pane;
176 //gboolean updating_recent;
177 gboolean disable_ass;
178 gboolean disable_embeddedfonts;
179 gboolean disable_animation;
180 gint auto_hide_timeout;
181 gboolean always_hide_after_timeout;
182 gboolean mouse_over_controls;
183 gchar *subtitlefont;
184 gdouble subtitle_scale;
185 gchar *subtitle_codepage;
186 gchar *subtitle_color;
187 gboolean subtitle_outline;
188 gboolean subtitle_shadow;
189 gint subtitle_margin;
190 gint subtitle_fuzziness;
191 gboolean quit_on_complete;
192 gchar *mplayer_bin;
193 gchar *mplayer_dvd_device;
194 gchar *option_dvd_device;
195 gchar *extraopts;
196 gboolean resize_on_new_media;
197 gboolean single_instance;
198 gboolean replace_and_play;
199 gboolean bring_to_front;
200 gboolean show_notification;
201 gboolean show_status_icon;
202 gchar *gpod_mount_point;
203 gboolean disable_cover_art_fetch;
204 //gboolean updating_recent;
205 gboolean large_buttons;
206 GtkIconSize button_size;
207 gboolean skip_fixed_allocation_on_show;
208 gboolean skip_fixed_allocation_on_hide;
209 gboolean mouse_wheel_changes_volume;
210 ResumeMode resume_mode;
211 
212 gboolean remember_loc;
213 gboolean use_remember_loc;
214 gboolean save_loc;
215 gint loc_window_x;
216 gint loc_window_y;
217 gint loc_window_height;
218 gint loc_window_width;
219 gint loc_panel_position;
220 gboolean keep_on_top;
221 
222 gboolean cancel_folder_load;
223 
224 GThreadPool *retrieve_metadata_pool;
225 GMutex *retrieve_mutex;
226 GMutex *set_mutex;
227 
228 gboolean use_mediakeys;
229 gboolean use_defaultpl;
230 
231 gboolean qt_disabled;
232 gboolean real_disabled;
233 gboolean wmp_disabled;
234 gboolean dvx_disabled;
235 gboolean midi_disabled;
236 gboolean embedding_disabled;
237 gboolean disable_embedded_scaling;
238 
239 GArray *data;
240 GArray *max_data;
241 gboolean reading_af_export;
242 
243 //gboolean sub_source_file;
244 
245 // layout variables
246 gint non_fs_width;
247 gint non_fs_height;
248 
249 // playlist stuff
250 GtkListStore *playliststore;
251 GtkTreeIter iter;
252 GtkTreeIter *next_iter;
253 GtkTreeSelection *selection;
254 GtkWidget *list;
255 
256 // preference store
257 GmPrefStore *gm_store;
258 GmPrefStore *gmp_store;
259 
260 // cover
261 gchar *cover_art_uri;
262 
263 gchar *default_playlist;
264 gboolean safe_to_save_default_playlist;
265 
266 #ifdef GTK2_12_ENABLED
267 GtkRecentManager *recent_manager;
268 #endif
269 
270 #ifdef LIBGDA_ENABLED
271 GdaConnection *db_connection;
272 #endif
273 
274 gboolean screensaver_disabled;
275 
276 gint window_width, window_height;
277 
278 GtkWidget *plclose;
279 IdleData *idledata;
280 GMutex *fs_controls_lock;
281 PLAYSTATE guistate;
282 PLAYSTATE lastguistate;
283 
284 static GdkWindow *window_container;
285 static GtkWidget *fs_window;
286 static GtkWidget *fs_controls;
287 
288 static GtkWidget *menubar;
289 static GtkMenuItem *menuitem_file;
290 static GtkMenu *menu_file;
291 static GtkMenuItem *menuitem_file_open;
292 static GtkMenuItem *menuitem_file_open_folder;
293 static GtkMenuItem *menuitem_file_open_location;
294 static GtkMenuItem *menuitem_file_disc;
295 static GtkMenu *menu_file_disc;
296 static GtkMenuItem *menuitem_file_open_acd;
297 static GtkMenuItem *menuitem_file_open_sep1;
298 //static GtkMenuItem *menuitem_file_open_dvd;
299 static GtkMenuItem *menuitem_file_open_dvdnav;
300 //static GtkMenuItem *menuitem_file_open_dvd_folder;
301 static GtkMenuItem *menuitem_file_open_dvdnav_folder;
302 //static GtkMenuItem *menuitem_file_open_dvd_iso;
303 static GtkMenuItem *menuitem_file_open_dvdnav_iso;
304 static GtkMenuItem *menuitem_file_open_sep2;
305 static GtkMenuItem *menuitem_file_open_vcd;
306 
307 static GtkMenuItem *menuitem_file_tv;
308 static GtkMenu *menu_file_tv;
309 static GtkMenuItem *menuitem_file_open_atv;
310 static GtkMenuItem *menuitem_file_open_dtv;
311 #ifdef HAVE_GPOD
312 static GtkMenuItem *menuitem_file_open_ipod;
313 #endif
314 static GtkMenuItem *menuitem_file_recent;
315 static GtkWidget *menuitem_file_recent_items;
316 static GtkMenuItem *menuitem_file_sep2;
317 static GtkMenuItem *menuitem_file_quit;
318 
319 static GtkMenuItem *menuitem_edit;
320 static GtkMenu *menu_edit;
321 static GtkMenuItem *menuitem_edit_switch_audio;
322 static GtkMenuItem *menuitem_edit_set_audiofile;
323 static GtkMenuItem *menuitem_edit_set_subtitle;
324 //static GtkMenuItem *menuitem_lang;
325 
326 static GtkMenuItem *menuitem_edit_take_screenshot;
327 static GtkMenuItem *menuitem_edit_sep1;
328 static GtkMenuItem *menuitem_edit_config;
329 static GtkMenuItem *menuitem_help;
330 static GtkMenuItem *menuitem_view;
331 static GtkMenu *menu_view;
332 static GtkMenuItem *menuitem_view_details;
333 static GtkMenuItem *menuitem_view_meter;
334 static GtkMenuItem *menuitem_view_sep0;
335 static GtkMenuItem *menuitem_view_fullscreen;
336 static GtkMenuItem *menuitem_view_sep1;
337 static GtkMenuItem *menuitem_view_onetoone;
338 static GtkMenuItem *menuitem_view_twotoone;
339 static GtkMenuItem *menuitem_view_onetotwo;
340 static GtkMenuItem *menuitem_view_onetoonepointfive;
341 //static GtkMenuItem *menuitem_view_sep4;
342 static GtkMenuItem *menuitem_view_aspect;
343 static GtkMenu *menu_view_aspect;
344 static GtkMenuItem *menuitem_view_aspect_default;
345 static GtkMenuItem *menuitem_view_aspect_four_three;
346 static GtkMenuItem *menuitem_view_aspect_sixteen_nine;
347 static GtkMenuItem *menuitem_view_aspect_sixteen_ten;
348 static GtkMenuItem *menuitem_view_aspect_anamorphic;
349 static GtkMenuItem *menuitem_view_aspect_follow_window;
350 static GtkMenuItem *menuitem_view_sep2;
351 static GtkMenuItem *menuitem_view_subtitles;
352 static GtkMenuItem *menuitem_view_smaller_subtitle;
353 static GtkMenuItem *menuitem_view_larger_subtitle;
354 static GtkMenuItem *menuitem_view_decrease_subtitle_delay;
355 static GtkMenuItem *menuitem_view_increase_subtitle_delay;
356 static GtkMenuItem *menuitem_view_sep5;
357 static GtkMenuItem *menuitem_view_angle;
358 static GtkMenuItem *menuitem_view_controls;
359 static GtkMenuItem *menuitem_view_sep3;
360 static GtkMenuItem *menuitem_view_advanced;
361 static GtkMenu *menu_help;
362 static GtkMenuItem *menuitem_help_about;
363 
364 static GtkMenu *popup_menu;
365 static GtkMenuItem *menuitem_open;
366 static GtkMenuItem *menuitem_sep3;
367 static GtkMenuItem *menuitem_play;
368 static GtkMenuItem *menuitem_stop;
369 static GtkMenuItem *menuitem_sep1;
370 static GtkMenuItem *menuitem_copyurl;
371 static GtkMenuItem *menuitem_sep2;
372 static GtkMenuItem *menuitem_sep4;
373 static GtkMenuItem *menuitem_save;
374 static GtkMenuItem *menuitem_showcontrols;
375 static GtkMenuItem *menuitem_fullscreen;
376 static GtkMenuItem *menuitem_config;
377 static GtkMenuItem *menuitem_quit;
378 static gulong delete_signal_id;
379 
380 static GtkWidget *vbox_master;
381 static GtkWidget *vbox;
382 static GtkWidget *controls_box;
383 
384 static GtkWidget *media_hbox;
385 static GtkWidget *media_label;
386 static GtkWidget *details_vbox;
387 
388 static GtkWidget *details_video_size;
389 static GtkWidget *details_video_format;
390 static GtkWidget *details_video_codec;
391 static GtkWidget *details_video_fps;
392 static GtkWidget *details_video_bitrate;
393 static GtkWidget *details_video_chapters;
394 static GtkWidget *details_audio_format;
395 static GtkWidget *details_audio_codec;
396 static GtkWidget *details_audio_channels;
397 static GtkWidget *details_audio_bitrate;
398 static GtkWidget *details_audio_samplerate;
399 
400 static GdkPixbuf *pb_icon;
401 static GdkPixbuf *pb_button;
402 
403 static GList *icon_list;
404 
405 static GtkWidget *button_event_box;
406 static GtkWidget *image_button;
407 
408 //static GtkWidget *play_button;
409 //static GtkWidget *stop_button;
410 //static GtkWidget *pause_button;
411 //static GtkWidget *ff_button;
412 //static GtkWidget *rew_button;
413 
414 //static GtkWidget *pause_event_box;
415 static GtkWidget *stop_event_box;
416 static GtkWidget *ff_event_box;
417 static GtkWidget *rew_event_box;
418 
419 //static GtkProgressBar *progress;
420 
421 static gboolean in_button;
422 
423 static GtkWidget *image_play;
424 static GtkWidget *image_pause;
425 static GtkWidget *image_stop;
426 static GtkWidget *image_ff;
427 static GtkWidget *image_rew;
428 static GtkWidget *image_next;
429 static GtkWidget *image_prev;
430 static GtkWidget *image_menu;
431 static GtkWidget *image_fs;
432 //static GtkWidget *image_icon;
433 
434 #ifdef GTK2_12_ENABLED
435 static GtkStatusIcon *status_icon;
436 static GtkWidget *config_show_status_icon;
437 #else
438 static GtkTooltips *volume_tip;
439 #endif
440 
441 //static GtkWidget *config_window;
442 
443 static GtkWidget *config_vo;
444 static GtkWidget *config_hardware_codecs;
445 static GtkWidget *config_crystalhd_codecs;
446 static GtkWidget *config_ao;
447 static GtkWidget *config_mixer;
448 static GtkWidget *config_audio_channels;
449 static GtkWidget *config_use_hw_audio;
450 #ifndef HAVE_ASOUNDLIB
451 static GtkWidget *config_volume;
452 #endif
453 static GtkWidget *config_cachesize;
454 static GtkWidget *config_plugin_audio_cache_size;
455 static GtkWidget *config_plugin_video_cache_size;
456 static GtkWidget *config_osdlevel;
457 static GtkWidget *config_deinterlace;
458 static GtkWidget *config_framedrop;
459 static GtkWidget *config_pplevel;
460 
461 static GtkWidget *config_resume_mode;
462 static GtkWidget *config_playlist_visible;
463 static GtkWidget *config_details_visible;
464 static GtkWidget *config_vertical_layout;
465 static GtkWidget *config_single_instance;
466 static GtkWidget *config_replace_and_play;
467 static GtkWidget *config_bring_to_front;
468 static GtkWidget *config_resize_on_new_media;
469 static GtkWidget *config_pause_on_click;
470 static GtkWidget *config_softvol;
471 static GtkWidget *config_remember_softvol;
472 static GtkWidget *config_volume_gain;
473 static GtkWidget *config_forcecache;
474 static GtkWidget *config_verbose;
475 #ifdef NOTIFY_ENABLED
476 static GtkWidget *config_show_notification;
477 #endif
478 static GtkWidget *config_use_mediakeys;
479 static GtkWidget *config_use_defaultpl;
480 static GtkWidget *config_disable_animation;
481 static GtkWidget *config_disable_cover_art_fetch;
482 static GtkWidget *config_mouse_wheel;
483 static GtkWidget *config_enable_nautilus_plugin;
484 
485 static GtkWidget *config_alang;
486 static GtkWidget *config_slang;
487 static GtkWidget *config_metadata_codepage;
488 
489 static GtkWidget *config_ass;
490 static GtkWidget *config_embeddedfonts;
491 static GtkWidget *config_subtitle_font;
492 static GtkWidget *config_subtitle_scale;
493 static GtkWidget *config_subtitle_codepage;
494 static GtkWidget *config_subtitle_color;
495 static GtkWidget *config_subtitle_outline;
496 static GtkWidget *config_subtitle_shadow;
497 static GtkWidget *config_subtitle_margin;
498 static GtkWidget *config_subtitle_fuzziness;
499 static GtkWidget *config_show_subtitles;
500 
501 static GtkWidget *config_qt;
502 static GtkWidget *config_real;
503 static GtkWidget *config_wmp;
504 static GtkWidget *config_dvx;
505 static GtkWidget *config_midi;
506 static GtkWidget *config_noembed;
507 static GtkWidget *config_noscaling;
508 
509 static GtkWidget *config_mplayer_bin;
510 static GtkWidget *config_mplayer_dvd_device;
511 static GtkWidget *config_extraopts;
512 static GtkWidget *config_remember_loc;
513 static GtkWidget *config_keep_on_top;
514 
515 static GtkWidget *open_location;
516 
517 static GtkWidget *folder_progress_window;
518 static GtkWidget *folder_progress_label;
519 static GtkWidget *folder_progress_bar;
520 
521 // Video Settings
522 static GtkWidget *adv_brightness;
523 static GtkWidget *adv_contrast;
524 static GtkWidget *adv_gamma;
525 static GtkWidget *adv_hue;
526 static GtkWidget *adv_saturation;
527 
528 static glong last_movement_time;
529 
530 static gboolean adjusting;
531 static GtkWidget *config_accel_keys[KEY_COUNT];
532 
533 #define PAYLOADNCH 7
534 #define PAYLOADNI 512
535 typedef struct _Export {
536     int nch;
537     int size;
538     unsigned long long counter;
539     gint16 payload[PAYLOADNCH][PAYLOADNI];
540 } Export;
541 
media_state_to_playstate(GmtkMediaPlayerMediaState media_state)542 PLAYSTATE media_state_to_playstate(GmtkMediaPlayerMediaState media_state)
543 {
544     PLAYSTATE ret;
545 
546     switch (media_state) {
547     case MEDIA_STATE_PAUSE:
548         ret = PAUSED;
549         break;
550 
551     case MEDIA_STATE_PLAY:
552         ret = PLAYING;
553         break;
554 
555     case MEDIA_STATE_QUIT:
556     case MEDIA_STATE_UNKNOWN:
557         ret = QUIT;
558         break;
559 
560     case MEDIA_STATE_STOP:
561         ret = STOPPED;
562         break;
563 
564     default:
565         ret = QUIT;
566         break;
567     }
568 
569     return ret;
570 }
571 
set_media_player_attributes(GtkWidget * widget)572 void set_media_player_attributes(GtkWidget * widget)
573 {
574     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_DEBUG, verbose);
575     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_FORCE_CACHE, forcecache);
576     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_CACHE_SIZE, cache_size);
577     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_HARDWARE_CODECS,
578                                             use_hardware_codecs);
579     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_CRYSTALHD_CODECS,
580                                             use_crystalhd_codecs);
581     if (option_vo != NULL) {
582         gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VO, option_vo);
583         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_HARDWARE_CODECS, FALSE);
584     } else {
585         gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VO, vo);
586     }
587     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_EXTRA_OPTS, extraopts);
588     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_PREFERRED_AUDIO_LANGUAGE, alang);
589     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_PREFERRED_SUBTITLE_LANGUAGE, slang);
590     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MPLAYER_BINARY, mplayer_bin);
591     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_ADVANCED_SUBTITLES,
592                                             !disable_ass);
593     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_OUTLINE, subtitle_outline);
594     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_SHADOW, subtitle_shadow);
595     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_EMBEDDED_FONTS,
596                                             !disable_embeddedfonts);
597     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_SCALE, subtitle_scale);
598     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_MARGIN, subtitle_margin);
599     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_COLOR, subtitle_color);
600     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_CODEPAGE, subtitle_codepage);
601     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_FONT, subtitlefont);
602     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_FUZZINESS, subtitle_fuzziness);
603     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE, showsubtitles);
604 
605     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_DEINTERLACE, !disable_deinterlace);
606     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AO, audio_device.mplayer_ao);
607     if (softvol) {
608         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SOFTVOL, TRUE);
609         gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VOLUME_GAIN, volume_gain);
610     } else {
611         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SOFTVOL,
612                                                 audio_device.type == AUDIO_TYPE_SOFTVOL);
613     }
614     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_CHANNELS, audio_channels);
615     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HARDWARE_AC3, use_hw_audio);
616 
617     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_OSDLEVEL, osdlevel);
618     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_POST_PROCESSING_LEVEL, pplevel);
619     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_START_TIME, (gdouble) start_second);
620     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_RUN_TIME, (gdouble) play_length);
621 
622     if (embed_window != 0 && disable_embedded_scaling) {
623         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_DISABLE_UPSCALING,
624                                                 disable_embedded_scaling);
625     } else {
626         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_DISABLE_UPSCALING, FALSE);
627     }
628     if (option_dvd_device == NULL) {
629         gmtk_media_player_set_media_device(GMTK_MEDIA_PLAYER(media), idledata->device);
630     } else {
631         gmtk_media_player_set_media_device(GMTK_MEDIA_PLAYER(media), option_dvd_device);
632     }
633 
634 }
635 
636 
add_to_playlist_and_play(gpointer data)637 gboolean add_to_playlist_and_play(gpointer data)
638 {
639     gchar *s = (gchar *) data;
640     gboolean playlist;
641     gchar *buf = NULL;
642 
643     selection = NULL;
644 
645     gm_log(verbose, G_LOG_LEVEL_DEBUG, "adding '%s' to playlist", s);
646     if (!uri_exists(s) && !streaming_media(s)) {
647         buf = g_filename_to_uri(s, NULL, NULL);
648     } else {
649         buf = g_strdup(s);
650     }
651     if (buf != NULL) {
652         playlist = detect_playlist(buf);
653         if (!playlist) {
654             add_item_to_playlist(buf, playlist);
655         } else {
656             if (!parse_playlist(buf)) {
657                 add_item_to_playlist(buf, playlist);
658             }
659         }
660         g_free(buf);
661     }
662     gm_log(verbose, G_LOG_LEVEL_DEBUG, "children = %i",
663            gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL));
664 
665     if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) == 1
666         || !gtk_list_store_iter_is_valid(playliststore, &iter)) {
667         if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
668             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
669                 dontplaynext = TRUE;
670             gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
671             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
672             g_idle_add(async_play_iter, &iter);
673             if (embed_window == 0 && bring_to_front)
674                 present_main_window();
675         }
676     }
677     if (s != NULL)
678         g_free(s);
679     g_idle_add(set_update_gui, NULL);
680     return FALSE;
681 }
682 
clear_playlist_and_play(gpointer data)683 gboolean clear_playlist_and_play(gpointer data)
684 {
685     gm_log(verbose, G_LOG_LEVEL_DEBUG, "clearing playlist");
686     gtk_list_store_clear(playliststore);
687     gm_log(verbose, G_LOG_LEVEL_DEBUG, "adding '%s' to playlist", (gchar *) data);
688     add_to_playlist_and_play(data);
689     return FALSE;
690 }
691 
view_option_show_callback(GtkWidget * widget,gpointer data)692 void view_option_show_callback(GtkWidget * widget, gpointer data)
693 {
694     skip_fixed_allocation_on_show = TRUE;
695 }
696 
view_option_hide_callback(GtkWidget * widget,gpointer data)697 void view_option_hide_callback(GtkWidget * widget, gpointer data)
698 {
699     skip_fixed_allocation_on_hide = TRUE;
700     g_idle_add(set_adjust_layout, NULL);
701 }
702 
view_option_size_allocate_callback(GtkWidget * widget,GtkAllocation * allocation,gpointer data)703 void view_option_size_allocate_callback(GtkWidget * widget, GtkAllocation * allocation, gpointer data)
704 {
705 
706     //if (widget == plvbox)
707     gm_log(verbose, G_LOG_LEVEL_DEBUG, "plvbox size_allocate_callback");
708     //else
709     gm_log(verbose, G_LOG_LEVEL_DEBUG, "size_allocate_callback");
710 
711 
712     g_idle_add(set_adjust_layout, NULL);
713 }
714 
player_size_allocate_callback(GtkWidget * widget,GtkAllocation * allocation)715 void player_size_allocate_callback(GtkWidget * widget, GtkAllocation * allocation)
716 {
717     if (idledata->videopresent) {
718         non_fs_width = allocation->width;
719         non_fs_height = allocation->height;
720     }
721     gm_log(verbose, G_LOG_LEVEL_DEBUG, "video: %s media size = %i x %i", gm_bool_to_string(idledata->videopresent),
722            non_fs_width, non_fs_height);
723 }
724 
set_adjust_layout(gpointer data)725 gboolean set_adjust_layout(gpointer data)
726 {
727     adjusting = FALSE;
728     adjust_layout();
729     return FALSE;
730 }
731 
adjust_layout()732 void adjust_layout()
733 {
734     gint total_height;
735     gint total_width;
736     gint handle_size;
737     GtkAllocation alloc = { 0 };
738     GtkAllocation alloc2 = { 0 };
739 
740     gm_log(verbose, G_LOG_LEVEL_DEBUG, "media size = %i x %i", non_fs_width, non_fs_height);
741     total_height = non_fs_height;
742     total_width = non_fs_width;
743     gm_log(verbose, G_LOG_LEVEL_DEBUG, "total = %i x %i", total_width, total_height);
744 
745     if (idledata->videopresent) {
746         gtk_widget_show(media);
747     } else {
748         gtk_widget_hide(media);
749     }
750 
751     if (playlist_visible && remember_loc && !vertical_layout) {
752         total_width = gtk_paned_get_position(GTK_PANED(pane));
753     }
754 
755     if (playlist_visible && remember_loc && vertical_layout) {
756         total_height = gtk_paned_get_position(GTK_PANED(pane));
757     }
758 
759     if (total_width == 0) {
760         if (playlist_visible && !vertical_layout) {
761             total_width = gtk_paned_get_position(GTK_PANED(pane));
762         } else {
763             if (showcontrols) {
764                 gmtk_get_allocation(controls_box, &alloc);
765                 total_width = alloc.width;
766             }
767         }
768     }
769 
770     if (total_height == 0) {
771         if (playlist_visible && vertical_layout) {
772             total_height = gtk_paned_get_position(GTK_PANED(pane));
773         }
774     }
775 
776     if (GTK_IS_WIDGET(media_hbox) && control_id == 0
777         && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_info))) {
778         if (gmtk_get_visible(media_hbox) == 0) {
779             gtk_widget_show_all(media_hbox);
780             //gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
781             //while (gtk_events_pending())
782             //    gtk_main_iteration();
783         }
784         gmtk_get_allocation(media_hbox, &alloc);
785         gm_log(verbose, G_LOG_LEVEL_DEBUG, "media height = %i", alloc.height);
786         total_height += alloc.height;
787         gm_log(verbose, G_LOG_LEVEL_DEBUG, "total_height = %i", total_height);
788     } else {
789         gtk_widget_hide(media_hbox);
790     }
791 
792     if (GTK_IS_WIDGET(details_table)
793         && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_details))) {
794         if (gmtk_get_visible(details_vbox) == 0) {
795             gtk_widget_show_all(details_vbox);
796             //return;
797         }
798         gmtk_get_allocation(details_vbox, &alloc);
799         gm_log(verbose, G_LOG_LEVEL_DEBUG, "detail height = %i", alloc.height);
800         total_height += alloc.height;
801         gm_log(verbose, G_LOG_LEVEL_DEBUG, "total_height = %i", total_height);
802     } else {
803         gtk_widget_hide(details_vbox);
804     }
805 
806     if (GTK_IS_WIDGET(audio_meter)
807         && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_meter))) {
808         if (gmtk_get_visible(audio_meter) == 0) {
809             gtk_widget_show_all(audio_meter);
810             //return;
811         }
812         gmtk_get_allocation(audio_meter, &alloc);
813         total_height += alloc.height;
814     } else {
815         gtk_widget_hide(audio_meter);
816     }
817 
818     if (GTK_IS_WIDGET(plvbox)
819         && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
820         if (gmtk_get_visible(plvbox) == 0) {
821             gtk_widget_show_all(plvbox);
822             //return;
823         }
824         gtk_widget_grab_focus(play_event_box);
825         gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
826         gtk_widget_grab_default(plclose);
827         gtk_widget_style_get(pane, "handle-size", &handle_size, NULL);
828 
829         gmtk_get_allocation(plvbox, &alloc);
830         if (vertical_layout) {
831             gm_log(verbose, G_LOG_LEVEL_DEBUG, "totals = %i x %i", total_width, total_height);
832             total_height += alloc.height + handle_size;
833         } else {
834             if (gmtk_get_visible(media_hbox) && idledata->videopresent == FALSE
835                 && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)) == FALSE) {
836                 gmtk_get_allocation(media_hbox, &alloc2);
837                 total_width = alloc2.width + handle_size + alloc.width;
838             } else {
839                 total_width += handle_size + alloc.width;
840             }
841         }
842 
843         if (non_fs_height == 0) {
844             gm_log(verbose, G_LOG_LEVEL_DEBUG, "height = %i", total_height);
845             gm_log(verbose, G_LOG_LEVEL_DEBUG, "total_height = %i", total_height);
846             if (alloc.height < 16) {
847                 total_height = 200;
848             } else {
849                 total_height = MAX(total_height, alloc.height);
850             }
851             gm_log(verbose, G_LOG_LEVEL_DEBUG, "total_height = %i", total_height);
852         }
853 
854     } else {
855         if (!idledata->videopresent) {
856             gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
857         }
858         gtk_paned_set_position(GTK_PANED(pane), -1);
859         if (gmtk_get_visible(plvbox) == 1) {
860             gtk_widget_hide(plvbox);
861             //return;
862         }
863     }
864 
865     if (!fullscreen) {
866         if (!enable_global_menu) {
867             gmtk_get_allocation(menubar, &alloc);
868             gm_log(verbose, G_LOG_LEVEL_DEBUG, "menubar = %i", alloc.height);
869             if (!fullscreen)
870                 total_height += alloc.height;
871             gm_log(verbose, G_LOG_LEVEL_DEBUG, "total_height = %i", total_height);
872         }
873     }
874 
875     if (showcontrols) {
876         gmtk_get_allocation(controls_box, &alloc);
877         gm_log(verbose, G_LOG_LEVEL_DEBUG, "controls height = %i", alloc.height);
878         total_height += alloc.height;
879         gm_log(verbose, G_LOG_LEVEL_DEBUG, "total_height = %i", total_height);
880 
881     }
882     gm_log(verbose, G_LOG_LEVEL_DEBUG, "total = %i x %i video = %s", total_width, total_height,
883            gm_bool_to_string(idledata->videopresent));
884 
885     if (use_remember_loc) {
886         gm_log(verbose, G_LOG_LEVEL_DEBUG, "setting size to %i x %i", loc_window_width, loc_window_height);
887         gtk_window_resize(GTK_WINDOW(window), loc_window_width, loc_window_height);
888         use_remember_loc = FALSE;
889     } else {
890         if (total_height > 0 && total_width > 0 && idledata->videopresent) {
891             gtk_window_resize(GTK_WINDOW(window), total_width, total_height);
892         }
893         if (total_height > 0 && total_width > 0 && !idledata->window_resized && !remember_loc) {
894             gtk_window_resize(GTK_WINDOW(window), total_width, total_height);
895         }
896         if (total_height > 0 && total_width > 0 && !idledata->videopresent && !vertical_layout
897             && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
898             gtk_window_resize(GTK_WINDOW(window), total_width, total_height);
899         }
900     }
901 
902 
903     return;
904 }
905 
hide_buttons(void * data)906 gboolean hide_buttons(void *data)
907 {
908     IdleData *idle = (IdleData *) data;
909 
910     if (GTK_IS_WIDGET(ff_event_box)) {
911         if (idle->streaming) {
912             gtk_widget_hide(ff_event_box);
913             gtk_widget_hide(rew_event_box);
914             if (GTK_IS_WIDGET(menuitem_save))
915                 gtk_widget_set_sensitive(GTK_WIDGET(menuitem_save), FALSE);
916         } else {
917             if (embed_window == 0 || window_x > 250) {
918                 gtk_widget_show_all(ff_event_box);
919                 gtk_widget_show_all(rew_event_box);
920             }
921         }
922     }
923     if (GTK_IS_WIDGET(menuitem_view_details))
924         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_details), TRUE);
925 
926     if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) < 2
927         && !gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)) {
928         gtk_widget_hide(prev_event_box);
929         gtk_widget_hide(next_event_box);
930         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_random), FALSE);
931         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_play_single), FALSE);
932         gtk_widget_hide(GTK_WIDGET(menuitem_prev));
933         gtk_widget_hide(GTK_WIDGET(menuitem_next));
934     } else {
935         gtk_widget_show_all(prev_event_box);
936         gtk_widget_show_all(next_event_box);
937         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_random), TRUE);
938         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_play_single), TRUE);
939         gtk_widget_show(GTK_WIDGET(menuitem_prev));
940         gtk_widget_show(GTK_WIDGET(menuitem_next));
941     }
942 
943     if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) > 0) {
944         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_loop), TRUE);
945     } else {
946         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_loop), FALSE);
947     }
948 
949     return FALSE;
950 }
951 
show_copyurl(void * data)952 gboolean show_copyurl(void *data)
953 {
954     gchar *buf;
955 
956     gtk_widget_show(GTK_WIDGET(menuitem_copyurl));
957     if (control_id == 0) {
958         buf = g_strdup_printf(_("%s - GNOME MPlayer"), gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
959         gtk_window_set_title(GTK_WINDOW(window), buf);
960         g_free(buf);
961     }
962 
963     return FALSE;
964 
965 }
966 
967 
set_title_bar(void * data)968 gboolean set_title_bar(void *data)
969 {
970 
971     IdleData *idle = (IdleData *) data;
972     gchar *buf;
973     gchar *name = NULL;
974     GtkTreePath *path;
975     gint current = 0, total;
976     gchar *filename = NULL;
977 
978     if (data != NULL && idle != NULL && gmtk_get_visible(window)) {
979         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VIDEO_PRESENT)
980             && gmtk_media_player_get_media_type(GMTK_MEDIA_PLAYER(media)) == TYPE_FILE
981             && g_strrstr(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), "/") != NULL) {
982             filename = g_filename_from_uri(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), NULL, NULL);
983             if (filename != NULL) {
984                 name = g_strdup(g_strrstr(filename, "/") + 1);
985                 g_free(filename);
986             }
987             filename = NULL;
988         } else {
989             name = g_strdup(idle->display_name);
990         }
991 
992         total = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL);
993         if (total > 0 && gtk_list_store_iter_is_valid(playliststore, &iter)) {
994             path = gtk_tree_model_get_path(GTK_TREE_MODEL(playliststore), &iter);
995             if (path != NULL) {
996                 buf = gtk_tree_path_to_string(path);
997                 current = (gint) g_strtod(buf, NULL);
998                 g_free(buf);
999                 gtk_tree_path_free(path);
1000             }
1001         }
1002         if (total > 1) {
1003             if (name == NULL || strlen(name) < 1) {
1004                 buf = g_strdup_printf(_("(%i/%i) - GNOME MPlayer"), current + 1, total);
1005             } else {
1006                 buf = g_strdup_printf(_("%s - (%i/%i) - GNOME MPlayer"), name, current + 1, total);
1007             }
1008         } else {
1009             if (name == NULL || strlen(name) < 1) {
1010                 buf = g_strdup_printf(_("GNOME MPlayer"));
1011             } else {
1012                 buf = g_strdup_printf(_("%s - GNOME MPlayer"), name);
1013             }
1014         }
1015         gtk_window_set_title(GTK_WINDOW(window), buf);
1016         g_free(buf);
1017         g_free(name);
1018     }
1019     return FALSE;
1020 }
1021 
set_media_label(void * data)1022 gboolean set_media_label(void *data)
1023 {
1024 
1025     IdleData *idle = (IdleData *) data;
1026     gchar *cover_art_file = NULL;
1027     gpointer pixbuf;
1028     GdkPixbuf *scaled;
1029     gdouble aspect;
1030 #ifdef NOTIFY_ENABLED
1031     NotifyNotification *notification;
1032 #endif
1033 
1034     if (data != NULL && idle != NULL && GTK_IS_WIDGET(media_label)) {
1035         if (idle->media_info != NULL && strlen(idle->media_info) > 0) {
1036             gtk_label_set_markup(GTK_LABEL(media_label), idle->media_info);
1037             gtk_label_set_max_width_chars(GTK_LABEL(media_label), 10);
1038         }
1039 
1040         pixbuf = NULL;
1041         gtk_image_clear(GTK_IMAGE(cover_art));
1042         if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) > 0
1043             && gtk_list_store_iter_is_valid(playliststore, &iter)) {
1044             gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, COVERART_COLUMN, &cover_art_file, -1);
1045         }
1046         if (cover_art_file != NULL) {
1047             pixbuf = gdk_pixbuf_new_from_file(cover_art_file, NULL);
1048             if (pixbuf != NULL) {
1049                 aspect = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf)) / gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf));
1050                 scaled = gdk_pixbuf_scale_simple(GDK_PIXBUF(pixbuf), 128, 128 * aspect, GDK_INTERP_BILINEAR);
1051                 gtk_image_set_from_pixbuf(GTK_IMAGE(cover_art), scaled);
1052                 g_object_unref(scaled);
1053                 g_object_unref(pixbuf);
1054             }
1055         }
1056     } else {
1057         if (GTK_IS_IMAGE(cover_art))
1058             gtk_image_clear(GTK_IMAGE(cover_art));
1059         if (GTK_IS_WIDGET(media_label)) {
1060             gtk_label_set_markup(GTK_LABEL(media_label), "");
1061         }
1062         return FALSE;
1063     }
1064 
1065     if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_info)) && control_id == 0
1066         && strlen(idle->media_info) > 0) {
1067         gtk_widget_show_all(media_hbox);
1068     } else {
1069         gtk_widget_hide(media_hbox);
1070     }
1071 
1072     if (idle->fromdbus == FALSE) {
1073         dbus_send_rpsignal_with_string("RP_SetMediaLabel", idle->media_info);
1074 
1075 #ifdef NOTIFY_ENABLED
1076         if (show_notification && control_id == 0 && !gtk_window_is_active((GtkWindow *) window)) {
1077             notify_init("gnome-mplayer");
1078 #ifdef NOTIFY0_7_ENABLED
1079             notification = notify_notification_new(idle->display_name, idle->media_notification, "gnome-mplayer");
1080 #else
1081             notification = notify_notification_new(idle->display_name, idle->media_notification, "gnome-mplayer", NULL);
1082 #endif
1083 #ifdef GTK2_12_ENABLED
1084 #if !NOTIFY0_7_ENABLED
1085             if (show_status_icon)
1086                 notify_notification_attach_to_status_icon(notification, status_icon);
1087 #endif
1088 #endif
1089             notify_notification_show(notification, NULL);
1090             notify_uninit();
1091         }
1092 #endif
1093         if (embed_window == 0 && gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) != 1) {
1094             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist), playlist_visible);
1095         }
1096 
1097     }
1098 
1099     g_idle_add(set_adjust_layout, NULL);
1100 
1101     return FALSE;
1102 }
1103 
set_cover_art(gpointer pixbuf)1104 gboolean set_cover_art(gpointer pixbuf)
1105 {
1106     gint width, height;
1107     gfloat aspect;
1108     GdkPixbuf *scaled;
1109 
1110     if (pixbuf == NULL) {
1111         if (GTK_IS_IMAGE(cover_art))
1112             gtk_image_clear(GTK_IMAGE(cover_art));
1113         if (strlen(idledata->media_info) > 0) {
1114             //gtk_widget_show_all(media_hbox);
1115         } else {
1116             // gtk_widget_hide(media_hbox);
1117         }
1118     } else {
1119         width = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf));
1120         height = gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf));
1121         aspect = (gfloat) width / (gfloat) height;
1122         scaled = gdk_pixbuf_scale_simple(GDK_PIXBUF(pixbuf), 128, 128 / aspect, GDK_INTERP_BILINEAR);
1123         gtk_image_set_from_pixbuf(GTK_IMAGE(cover_art), GDK_PIXBUF(scaled));
1124         g_object_unref(pixbuf);
1125         g_object_unref(scaled);
1126     }
1127 
1128     g_idle_add(set_adjust_layout, NULL);
1129 
1130     //adjust_layout();
1131     return FALSE;
1132 }
1133 
set_progress_value(void * data)1134 gboolean set_progress_value(void *data)
1135 {
1136 
1137     IdleData *idle = (IdleData *) data;
1138     gchar *text;
1139     struct stat buf = { 0 };
1140     gchar *iterfilename;
1141     gchar *iteruri = NULL;
1142 
1143     if (idle == NULL)
1144         return FALSE;
1145 
1146     if (GTK_IS_WIDGET(tracker)) {
1147         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_UNKNOWN && rpcontrols == NULL) {
1148             js_state = STATE_BUFFERING;
1149             text = g_strdup_printf(_("Buffering: %2i%%"), (gint) (idle->cachepercent * 100));
1150             gmtk_media_tracker_set_text(tracker, text);
1151             g_free(text);
1152             gtk_widget_set_sensitive(play_event_box, FALSE);
1153         } else {
1154             if (gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_POSITION_PERCENT) > 0.0) {
1155                 if (autopause == FALSE)
1156                     gtk_widget_set_sensitive(play_event_box, TRUE);
1157             }
1158         }
1159         if (idle->cachepercent < 1.0
1160             && gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
1161             text = g_strdup_printf(_("Paused | %2i%% \342\226\274"), (gint) (idle->cachepercent * 100));
1162             gmtk_media_tracker_set_text(tracker, text);
1163             g_free(text);
1164         } else {
1165             //gmtk_media_tracker_set_text(tracker, idle->progress_text);
1166         }
1167         gmtk_media_tracker_set_cache_percentage(tracker, idle->cachepercent);
1168     }
1169 
1170     if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) > 0
1171         && gtk_list_store_iter_is_valid(playliststore, &iter)) {
1172         gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, ITEM_COLUMN, &iteruri, -1);
1173     }
1174 
1175     if (idle->cachepercent > 0.0 && idle->cachepercent < 0.9 && !forcecache && !streaming_media(iteruri)) {
1176         if (autopause == FALSE && gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY) {
1177             if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
1178                 g_free(iteruri);
1179                 gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, ITEM_COLUMN, &iteruri, -1);
1180                 if (iteruri != NULL) {
1181                     iterfilename = g_filename_from_uri(iteruri, NULL, NULL);
1182                     g_stat(iterfilename, &buf);
1183                     gm_log(verbose, G_LOG_LEVEL_DEBUG, "filename = %s", iterfilename);
1184                     gm_log(verbose, G_LOG_LEVEL_DEBUG, "disk size = %li, byte pos = %li",
1185                            (glong) buf.st_size, idle->byte_pos);
1186                     gm_log(verbose, G_LOG_LEVEL_DEBUG, "cachesize = %f, percent = %f", idle->cachepercent,
1187                            gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
1188                                                                   ATTRIBUTE_POSITION_PERCENT));
1189                     gm_log(verbose, G_LOG_LEVEL_DEBUG, "will pause = %s",
1190                            gm_bool_to_string(((idle->byte_pos + (cache_size * 512)) > buf.st_size)
1191                                              && !(playlist)));
1192                     // if ((idle->percent + 0.10) > idle->cachepercent && ((idle->byte_pos + (512 * 1024)) > buf.st_size)) {
1193                     // if ((buf.st_size > 0) && (idle->byte_pos + (cache_size * 512)) > buf.st_size) {
1194                     if (((idle->byte_pos + (cache_size * 1024)) > buf.st_size) && !(playlist)) {
1195                         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PAUSE);
1196                         gtk_widget_set_sensitive(play_event_box, FALSE);
1197                         autopause = TRUE;
1198                     }
1199                     g_free(iterfilename);
1200                     g_free(iteruri);
1201                 }
1202             }
1203         } else if (autopause == TRUE
1204                    && gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
1205             if (idle->cachepercent >
1206                 (gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_POSITION_PERCENT) + 0.20)
1207                 || (idle->cachepercent >= 0.99 || idle->cachepercent == 0.0)) {
1208                 gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PLAY);
1209                 gtk_widget_set_sensitive(play_event_box, TRUE);
1210                 autopause = FALSE;
1211             }
1212         }
1213     }
1214 
1215     if (idle->cachepercent > 0.95 || idle->cachepercent == 0.0) {
1216         if (autopause == TRUE && gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
1217             gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PLAY);
1218             gtk_widget_set_sensitive(play_event_box, TRUE);
1219             autopause = FALSE;
1220         }
1221     }
1222 
1223     if (idle->cachepercent >= 1.0 || idle->cachepercent == 0.0) {
1224         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_save), TRUE);
1225     } else {
1226         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_save), FALSE);
1227     }
1228 
1229     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_UNKNOWN) {
1230         gtk_widget_set_sensitive(play_event_box, TRUE);
1231     }
1232 
1233     update_status_icon();
1234 
1235     if (idle->fromdbus == FALSE) {
1236         dbus_send_rpsignal_with_double("RP_SetPercent",
1237                                        gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
1238                                                                               ATTRIBUTE_POSITION_PERCENT));
1239         dbus_send_rpsignal_with_int("RP_SetGUIState",
1240                                     media_state_to_playstate(gmtk_media_player_get_media_state
1241                                                              (GMTK_MEDIA_PLAYER(media))));
1242     }
1243 
1244     return FALSE;
1245 }
1246 
set_progress_text(void * data)1247 gboolean set_progress_text(void *data)
1248 {
1249 
1250     IdleData *idle = (IdleData *) data;
1251 
1252 
1253     if (GTK_IS_WIDGET(tracker)) {
1254         gmtk_media_tracker_set_text(tracker, idle->progress_text);
1255     }
1256     if (idle != NULL && idle->fromdbus == FALSE)
1257         dbus_send_rpsignal_with_string("RP_SetProgressText", idle->progress_text);
1258     update_status_icon();
1259     return FALSE;
1260 }
1261 
set_progress_time(void * data)1262 gboolean set_progress_time(void *data)
1263 {
1264     gchar *text;
1265 
1266     IdleData *idle = (IdleData *) data;
1267 
1268     if (idle == NULL)
1269         return FALSE;
1270 
1271     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY) {
1272         text = g_strdup_printf(_("Playing"));
1273     } else if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
1274         text = g_strdup_printf(_("Paused"));
1275     } else {
1276         text = g_strdup_printf(_("Idle"));
1277     }
1278 
1279     if (idle->cachepercent > 0 && idle->cachepercent < 1.0 && !(playlist) && !forcecache && !idle->streaming) {
1280         g_snprintf(idle->progress_text, sizeof(idle->progress_text), "%s | %2i%% \342\226\274", text,
1281                    (int) (idle->cachepercent * 100));
1282     } else {
1283         g_snprintf(idle->progress_text, sizeof(idle->progress_text), "%s", text);
1284     }
1285 
1286     gmtk_media_tracker_set_text(tracker, text);
1287     g_free(text);
1288 
1289     if (GTK_IS_WIDGET(tracker) && idle->position > 0
1290         && gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_PAUSE) {
1291         gmtk_media_tracker_set_length(tracker, idle->length);
1292         gmtk_media_tracker_set_position(tracker, idle->position);
1293     }
1294 
1295     if (idle->fromdbus == FALSE && gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_PAUSE)
1296         dbus_send_rpsignal_with_string("RP_SetProgressText", idle->progress_text);
1297     update_status_icon();
1298 
1299     dbus_send_event("TimeChanged", 0);
1300 
1301     return FALSE;
1302 }
1303 
set_volume_from_slider(gpointer data)1304 gboolean set_volume_from_slider(gpointer data)
1305 {
1306     gdouble vol;
1307 
1308 #ifdef GTK2_12_ENABLED
1309     vol = gtk_scale_button_get_value(GTK_SCALE_BUTTON(vol_slider));
1310 #else
1311     vol = gtk_range_get_value(GTK_RANGE(vol_slider));
1312 #endif
1313     if (!gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED)) {
1314         gmtk_media_player_set_volume(GMTK_MEDIA_PLAYER(media), vol);
1315         if (remember_softvol) {
1316             volume_softvol = vol;
1317             set_software_volume(&volume_softvol);
1318         }
1319     }
1320 
1321     return FALSE;
1322 }
1323 
set_volume_tip(void * data)1324 gboolean set_volume_tip(void *data)
1325 {
1326 #ifndef GTK2_12_ENABLED
1327     gchar *tip_text = NULL;
1328     IdleData *idle = (IdleData *) data;
1329 #endif
1330 
1331     if (GTK_IS_WIDGET(vol_slider)) {
1332 #ifdef GTK2_12_ENABLED
1333         // should be automatic
1334         /*
1335            tip_text = gtk_widget_get_tooltip_text(vol_slider);
1336            if (tip_text == NULL || g_ascii_strcasecmp(tip_text, idle->vol_tooltip) != 0)
1337            gtk_widget_set_tooltip_text(vol_slider, idle->vol_tooltip);
1338            g_free(tip_text);
1339          */
1340 #else
1341         gtk_tooltips_set_tip(volume_tip, vol_slider, idle->vol_tooltip, NULL);
1342 #endif
1343     }
1344     return FALSE;
1345 }
1346 
set_window_visible(void * data)1347 gboolean set_window_visible(void *data)
1348 {
1349     //gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist),FALSE);
1350     if (GTK_IS_WIDGET(media)) {
1351         if (vertical_layout) {
1352             gtk_widget_show(media);
1353         } else {
1354             gtk_widget_show(vbox);
1355         }
1356     }
1357     return FALSE;
1358 }
1359 
set_subtitle_visibility(void * data)1360 gboolean set_subtitle_visibility(void *data)
1361 {
1362     if (GTK_IS_WIDGET(menuitem_view_subtitles)) {
1363         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_subtitles))) {
1364             gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE, TRUE);
1365         } else {
1366             gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE, FALSE);
1367         }
1368     }
1369     return FALSE;
1370 }
1371 
set_update_gui(void * data)1372 gboolean set_update_gui(void *data)
1373 {
1374     GtkTreeViewColumn *column;
1375     gchar *coltitle;
1376     gint count;
1377     gchar **split;
1378     gchar *joined;
1379 
1380     if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) < 2
1381         && !gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)) {
1382         gtk_widget_hide(prev_event_box);
1383         gtk_widget_hide(next_event_box);
1384         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_random), FALSE);
1385         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_play_single), FALSE);
1386         gtk_widget_hide(GTK_WIDGET(menuitem_prev));
1387         gtk_widget_hide(GTK_WIDGET(menuitem_next));
1388     } else {
1389         gtk_widget_show(prev_event_box);
1390         gtk_widget_show(next_event_box);
1391         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_random), TRUE);
1392         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_play_single), TRUE);
1393         gtk_widget_show(GTK_WIDGET(menuitem_prev));
1394         gtk_widget_show(GTK_WIDGET(menuitem_next));
1395     }
1396 
1397     if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) > 0) {
1398         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_loop), TRUE);
1399     } else {
1400         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_loop), FALSE);
1401     }
1402 
1403     if (GTK_IS_WIDGET(list)) {
1404         column = gtk_tree_view_get_column(GTK_TREE_VIEW(list), 0);
1405         count = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL);
1406         if (playlistname != NULL && strlen(playlistname) > 0) {
1407             coltitle = g_strdup_printf(_("%s items"), playlistname);
1408         } else {
1409             coltitle = g_strdup_printf(ngettext("Item to Play", "Items to Play", count));
1410         }
1411 
1412         split = g_strsplit(coltitle, "_", 0);
1413         joined = g_strjoinv("__", split);
1414         gtk_tree_view_column_set_title(column, joined);
1415         g_free(coltitle);
1416         g_free(joined);
1417         g_strfreev(split);
1418     }
1419     return FALSE;
1420 }
1421 
PLAYSTATE_to_string(const PLAYSTATE pstate)1422 static const gchar *PLAYSTATE_to_string(const PLAYSTATE pstate)
1423 {
1424     switch (pstate) {
1425     case PLAYING:
1426         return "playing";
1427     case PAUSED:
1428         return "paused";
1429     case STOPPED:
1430         return "stopped";
1431     case QUIT:
1432         return "quit";
1433     default:
1434         return "???";
1435     }
1436 }
1437 
set_gui_state(void * data)1438 gboolean set_gui_state(void *data)
1439 {
1440     gchar *tip_text = NULL;
1441 #ifdef GTK3_ENABLED
1442     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
1443     const gchar *icon_start;
1444 
1445     if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL)
1446         icon_start = "media-playback-start-rtl-symbolic";
1447     else
1448         icon_start = "media-playback-start-symbolic";
1449 #endif
1450 
1451     gm_log(verbose, G_LOG_LEVEL_MESSAGE, "setting gui state to %s", PLAYSTATE_to_string(guistate));
1452 
1453     if (lastguistate != guistate) {
1454         if (guistate == PLAYING) {
1455 #ifdef GTK3_ENABLED
1456             if (gtk_icon_theme_has_icon(icon_theme, "media-playback-pause-symbolic")) {
1457                 gtk_image_set_from_icon_name(GTK_IMAGE(image_play), "media-playback-pause-symbolic", button_size);
1458             } else {
1459                 gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PAUSE, button_size);
1460             }
1461 #else
1462             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PAUSE, button_size);
1463 #endif
1464 
1465 #ifdef GTK2_12_ENABLED
1466             tip_text = gtk_widget_get_tooltip_text(play_event_box);
1467             if (tip_text == NULL || g_ascii_strcasecmp(tip_text, _("Pause")) != 0)
1468                 gtk_widget_set_tooltip_text(play_event_box, _("Pause"));
1469             g_free(tip_text);
1470 #else
1471             gtk_tooltips_set_tip(tooltip, play_event_box, _("Pause"), NULL);
1472 #endif
1473             gtk_widget_set_sensitive(ff_event_box, TRUE);
1474             gtk_widget_set_sensitive(rew_event_box, TRUE);
1475             gtk_container_remove(GTK_CONTAINER(popup_menu), GTK_WIDGET(menuitem_play));
1476             menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PAUSE, NULL));
1477             g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_pause_callback), NULL);
1478             gtk_menu_shell_insert(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play), 0);
1479             gtk_widget_show(GTK_WIDGET(menuitem_play));
1480             if (idledata->videopresent)
1481                 dbus_disable_screensaver();
1482         }
1483 
1484         if (guistate == PAUSED) {
1485 #ifdef GTK3_ENABLED
1486             if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
1487                 gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
1488             } else {
1489                 gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
1490             }
1491 #else
1492             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
1493 #endif
1494 #ifdef GTK2_12_ENABLED
1495             tip_text = gtk_widget_get_tooltip_text(play_event_box);
1496             if (tip_text == NULL || g_ascii_strcasecmp(tip_text, _("Play")) != 0)
1497                 gtk_widget_set_tooltip_text(play_event_box, _("Play"));
1498             g_free(tip_text);
1499 #else
1500             gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
1501 #endif
1502             gtk_widget_set_sensitive(ff_event_box, FALSE);
1503             gtk_widget_set_sensitive(rew_event_box, FALSE);
1504             gtk_container_remove(GTK_CONTAINER(popup_menu), GTK_WIDGET(menuitem_play));
1505             menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY, NULL));
1506             g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_play_callback), NULL);
1507             gtk_menu_shell_insert(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play), 0);
1508             gtk_widget_show(GTK_WIDGET(menuitem_play));
1509             dbus_enable_screensaver();
1510             //gmtk_media_player_set_state (GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PAUSE);
1511         }
1512 
1513         if (guistate == STOPPED) {
1514 #ifdef GTK3_ENABLED
1515             if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
1516                 gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
1517             } else {
1518                 gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
1519             }
1520 #else
1521             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
1522 #endif
1523 #ifdef GTK2_12_ENABLED
1524             tip_text = gtk_widget_get_tooltip_text(play_event_box);
1525             if (tip_text == NULL || g_ascii_strcasecmp(tip_text, _("Play")) != 0)
1526                 gtk_widget_set_tooltip_text(play_event_box, _("Play"));
1527             g_free(tip_text);
1528 #else
1529             gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
1530 #endif
1531             gtk_widget_set_sensitive(ff_event_box, FALSE);
1532             gtk_widget_set_sensitive(rew_event_box, FALSE);
1533             gtk_container_remove(GTK_CONTAINER(popup_menu), GTK_WIDGET(menuitem_play));
1534             menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY, NULL));
1535             g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_play_callback), NULL);
1536             gtk_menu_shell_insert(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play), 0);
1537             gtk_widget_show(GTK_WIDGET(menuitem_play));
1538             dbus_enable_screensaver();
1539             //gmtk_media_player_set_state (GMTK_MEDIA_PLAYER(media), MEDIA_STATE_STOP);
1540         }
1541         lastguistate = guistate;
1542     }
1543     return FALSE;
1544 }
1545 
set_metadata(gpointer data)1546 gboolean set_metadata(gpointer data)
1547 {
1548     MetaData *mdata = (MetaData *) data;
1549     GtkTreeIter *riter;
1550 
1551     if (mdata == NULL) {
1552         return FALSE;
1553     }
1554 
1555     g_mutex_lock(set_mutex);
1556     riter = find_iter_by_uri(mdata->uri);
1557 
1558     if (gtk_list_store_iter_is_valid(playliststore, riter)) {
1559         if (mdata != NULL) {
1560             gtk_list_store_set(playliststore, riter,
1561                                DESCRIPTION_COLUMN, mdata->title,
1562                                ARTIST_COLUMN, mdata->artist,
1563                                ALBUM_COLUMN, mdata->album,
1564                                SUBTITLE_COLUMN, mdata->subtitle,
1565                                AUDIO_CODEC_COLUMN, mdata->audio_codec,
1566                                VIDEO_CODEC_COLUMN, mdata->video_codec,
1567                                LENGTH_COLUMN, mdata->length,
1568                                DEMUXER_COLUMN, mdata->demuxer,
1569                                LENGTH_VALUE_COLUMN, mdata->length_value,
1570                                VIDEO_WIDTH_COLUMN, mdata->width, VIDEO_HEIGHT_COLUMN,
1571                                mdata->height, PLAYABLE_COLUMN, mdata->playable, -1);
1572 
1573             if (mdata->playable == FALSE) {
1574                 gtk_list_store_remove(playliststore, riter);
1575                 g_idle_add(set_title_bar, idledata);
1576             }
1577         }
1578     }
1579 
1580     g_free(riter);
1581     free_metadata(mdata);
1582 
1583     g_mutex_unlock(set_mutex);
1584     return FALSE;
1585 }
1586 
set_show_seek_buttons(gpointer data)1587 gboolean set_show_seek_buttons(gpointer data)
1588 {
1589     if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SEEKABLE)) {
1590         gtk_widget_show_all(ff_event_box);
1591         gtk_widget_show_all(rew_event_box);
1592     }
1593 
1594     return FALSE;
1595 }
1596 
cancel_clicked(GtkButton * button,gpointer user_data)1597 void cancel_clicked(GtkButton * button, gpointer user_data)
1598 {
1599     cancel_folder_load = TRUE;
1600 }
1601 
create_folder_progress_window()1602 void create_folder_progress_window()
1603 {
1604     GtkWidget *vbox;
1605     GtkWidget *cancel;
1606     GtkWidget *hbox;
1607 
1608     cancel_folder_load = FALSE;
1609 
1610     folder_progress_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1611     gtk_window_set_type_hint(GTK_WINDOW(folder_progress_window), GDK_WINDOW_TYPE_HINT_UTILITY);
1612     gtk_window_set_transient_for(GTK_WINDOW(folder_progress_window), GTK_WINDOW(window));
1613     gtk_window_set_position(GTK_WINDOW(folder_progress_window), GTK_WIN_POS_CENTER_ON_PARENT);
1614     gtk_window_set_icon(GTK_WINDOW(folder_progress_window), pb_icon);
1615     gtk_window_set_resizable(GTK_WINDOW(folder_progress_window), FALSE);
1616     gtk_widget_set_size_request(folder_progress_window, 400, -1);
1617 
1618 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
1619     vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
1620     gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
1621 #else
1622     vbox = gtk_vbox_new(FALSE, 10);
1623 #endif
1624     folder_progress_bar = gtk_progress_bar_new();
1625     gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(folder_progress_bar), 0.10);
1626     folder_progress_label = gtk_label_new("");
1627     gtk_label_set_ellipsize(GTK_LABEL(folder_progress_label), PANGO_ELLIPSIZE_MIDDLE);
1628 
1629     cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
1630     g_signal_connect(G_OBJECT(cancel), "clicked", G_CALLBACK(cancel_clicked), NULL);
1631 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
1632     hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
1633 #else
1634     hbox = gtk_hbutton_box_new();
1635 #endif
1636     gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
1637     gtk_container_add(GTK_CONTAINER(hbox), cancel);
1638 
1639     gtk_container_add(GTK_CONTAINER(vbox), folder_progress_bar);
1640     gtk_container_add(GTK_CONTAINER(vbox), folder_progress_label);
1641     gtk_container_add(GTK_CONTAINER(vbox), hbox);
1642     gtk_container_add(GTK_CONTAINER(folder_progress_window), vbox);
1643 
1644     gtk_widget_show_all(folder_progress_window);
1645     gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
1646     while (gtk_events_pending())
1647         gtk_main_iteration();
1648 }
1649 
destroy_folder_progress_window()1650 void destroy_folder_progress_window()
1651 {
1652     gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
1653     while (gtk_events_pending())
1654         gtk_main_iteration();
1655     if (GTK_IS_WIDGET(folder_progress_window))
1656         gtk_widget_destroy(folder_progress_window);
1657     folder_progress_window = NULL;
1658     if (cancel_folder_load)
1659         clear_playlist(NULL, NULL);
1660     cancel_folder_load = FALSE;
1661 }
1662 
1663 
set_item_add_info(void * data)1664 gboolean set_item_add_info(void *data)
1665 {
1666     gchar *message;
1667 
1668     if (data == NULL)
1669         return FALSE;
1670 
1671     if (GTK_IS_WIDGET(folder_progress_window)) {
1672         message = g_strdup_printf(_("Adding %s to playlist"), (gchar *) data);
1673         gtk_label_set_text(GTK_LABEL(folder_progress_label), message);
1674         gtk_progress_bar_pulse(GTK_PROGRESS_BAR(folder_progress_bar));
1675         g_free(message);
1676         //gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
1677         //while (gtk_events_pending())
1678         //    gtk_main_iteration();
1679     }
1680 
1681     return FALSE;
1682 }
1683 
remove_langs(GtkWidget * item,gpointer data)1684 void remove_langs(GtkWidget * item, gpointer data)
1685 {
1686     if (GTK_IS_WIDGET(item))
1687         gtk_widget_destroy(item);
1688 }
1689 
update_status_icon()1690 void update_status_icon()
1691 {
1692 #ifdef GTK2_12_ENABLED
1693     gchar *text;
1694 
1695     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY) {
1696         text = g_strdup_printf(_("Playing %s"), idledata->display_name);
1697     } else if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
1698         text = g_strdup_printf(_("Paused %s"), idledata->display_name);
1699     } else {
1700         text = g_strdup_printf(_("Idle"));
1701     }
1702 
1703     if (GTK_IS_WIDGET(status_icon)) {
1704 #ifdef GTK2_18_ENABLED
1705         gtk_status_icon_set_tooltip_text(status_icon, text);
1706 #else
1707         gtk_status_icon_set_tooltip(status_icon, text);
1708 #endif
1709     }
1710 
1711     g_free(text);
1712 #endif
1713 }
1714 
resize_window(void * data)1715 gboolean resize_window(void *data)
1716 {
1717     IdleData *idle = (IdleData *) data;
1718     GTimeVal currenttime;
1719     GValue resize_value = { 0 };
1720     GValue shrink_value = { 0 };
1721 
1722     g_value_init(&resize_value, G_TYPE_BOOLEAN);
1723     g_value_init(&shrink_value, G_TYPE_BOOLEAN);
1724 
1725     if (GTK_IS_WIDGET(window)) {
1726         if (idle->videopresent) {
1727             g_value_set_boolean(&resize_value, TRUE);
1728             g_value_set_boolean(&shrink_value, TRUE);
1729             gtk_container_child_set_property(GTK_CONTAINER(pane), vbox, "resize", &resize_value);
1730             gtk_container_child_set_property(GTK_CONTAINER(pane), vbox, "shrink", &shrink_value);
1731             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), FALSE);
1732             g_get_current_time(&currenttime);
1733             last_movement_time = currenttime.tv_sec;
1734             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_info), TRUE);
1735             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_subtitle), TRUE);
1736             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_audiofile), TRUE);
1737             dbus_disable_screensaver();
1738             if (embed_window == -1) {
1739                 gtk_widget_show_all(window);
1740                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), FALSE);
1741                 hide_buttons(idle);
1742                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols), showcontrols);
1743             }
1744             gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1745 #ifdef GTK3_ENABLED
1746             gtk_window_set_has_resize_grip(GTK_WINDOW(window), idledata->videopresent);
1747 #endif
1748             gtk_widget_show_all(GTK_WIDGET(media));
1749             gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
1750             while (gtk_events_pending())
1751                 gtk_main_iteration();
1752 
1753             if (window_x == 0 && window_y == 0) {
1754                 gm_log(verbose, G_LOG_LEVEL_INFO, "current size = %i x %i", non_fs_width, non_fs_height);
1755                 if (resize_on_new_media == TRUE || gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL)
1756                     || idle->streaming) {
1757                     if (idle->width > 1 && idle->height > 1) {
1758                         gm_log(verbose, G_LOG_LEVEL_INFO, "Changing window size to %i x %i visible = %s", idle->width,
1759                                idle->height, gm_bool_to_string(gmtk_get_visible(media)));
1760                         last_window_width = idle->width;
1761                         last_window_height = idle->height;
1762                         non_fs_width = idle->width;
1763                         non_fs_height = idle->height;
1764                         adjusting = TRUE;
1765                         g_idle_add(set_adjust_layout, &adjusting);
1766                     }
1767                 } else {
1768                     gm_log(verbose, G_LOG_LEVEL_INFO, "old aspect is %f new aspect is %f",
1769                            (gfloat) non_fs_width / (gfloat) non_fs_height,
1770                            (gfloat) (idle->width) / (gfloat) (idle->height));
1771                 }
1772                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_fullscreen), fullscreen);
1773                 if (init_fullscreen) {
1774                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_fullscreen), init_fullscreen);
1775                     init_fullscreen = 0;
1776                 }
1777 
1778             } else {
1779                 if (window_x > 0 && window_y > 0) {
1780                     gtk_window_resize(GTK_WINDOW(window), window_x, window_y);
1781                 }
1782             }
1783         } else {
1784             // audio only file
1785 
1786             g_value_set_boolean(&resize_value, FALSE);
1787             g_value_set_boolean(&shrink_value, FALSE);
1788             gtk_container_child_set_property(GTK_CONTAINER(pane), vbox, "resize", &resize_value);
1789             gtk_container_child_set_property(GTK_CONTAINER(pane), vbox, "shrink", &shrink_value);
1790             non_fs_height = 0;
1791             non_fs_width = 0;
1792             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_fullscreen), FALSE);
1793             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), TRUE);
1794             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_info), FALSE);
1795             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_subtitle), FALSE);
1796             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_audiofile), FALSE);
1797             last_window_height = 0;
1798             last_window_width = 0;
1799             g_idle_add(set_adjust_layout, NULL);
1800             if (window_x > 0) {
1801                 gtk_widget_set_size_request(media_label, window_x, -1);
1802             } else {
1803                 gtk_widget_set_size_request(media_label, 300, -1);
1804             }
1805             // adjust_layout();
1806         }
1807     }
1808     if (idle != NULL)
1809         idle->window_resized = TRUE;
1810 
1811     return FALSE;
1812 }
1813 
set_play(void * data)1814 gboolean set_play(void *data)
1815 {
1816     if (embed_window == 0 && bring_to_front)
1817         gtk_window_present(GTK_WINDOW(window));
1818 
1819     play_callback(NULL, NULL, data);
1820     return FALSE;
1821 }
1822 
set_pause(void * data)1823 gboolean set_pause(void *data)
1824 {
1825 
1826     pause_callback(NULL, NULL, data);
1827     return FALSE;
1828 }
1829 
set_stop(void * data)1830 gboolean set_stop(void *data)
1831 {
1832 
1833     stop_callback(NULL, NULL, data);
1834     return FALSE;
1835 }
1836 
set_ff(void * data)1837 gboolean set_ff(void *data)
1838 {
1839 
1840     ff_callback(NULL, NULL, NULL);      // ok is just not NULL which is what we want
1841     return FALSE;
1842 }
1843 
set_rew(void * data)1844 gboolean set_rew(void *data)
1845 {
1846 
1847     rew_callback(NULL, NULL, NULL);     // ok is just not NULL which is what we want
1848     return FALSE;
1849 }
1850 
set_prev(void * data)1851 gboolean set_prev(void *data)
1852 {
1853 
1854     prev_callback(NULL, NULL, NULL);
1855     return FALSE;
1856 }
1857 
set_next(void * data)1858 gboolean set_next(void *data)
1859 {
1860 
1861     next_callback(NULL, NULL, NULL);
1862     return FALSE;
1863 }
1864 
set_quit(void * data)1865 gboolean set_quit(void *data)
1866 {
1867 
1868     delete_callback(NULL, NULL, NULL);
1869     g_idle_add(set_destroy, NULL);
1870     return FALSE;
1871 }
1872 
set_kill_mplayer(void * data)1873 gboolean set_kill_mplayer(void *data)
1874 {
1875     gm_log(GMTK_MEDIA_PLAYER(media)->debug, G_LOG_LEVEL_DEBUG, "set_kill_mplayer()");
1876     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
1877 
1878     return FALSE;
1879 }
1880 
set_pane_position(void * data)1881 gboolean set_pane_position(void *data)
1882 {
1883     if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
1884         gtk_paned_set_position(GTK_PANED(pane), loc_panel_position);
1885     }
1886     return FALSE;
1887 }
1888 
set_position(void * data)1889 gboolean set_position(void *data)
1890 {
1891     IdleData *idle = (IdleData *) data;
1892 
1893     if (idle != NULL) {
1894         gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), idle->position, SEEK_ABSOLUTE);
1895     }
1896     return FALSE;
1897 }
1898 
set_raise_window(void * data)1899 gboolean set_raise_window(void *data)
1900 {
1901     gtk_window_present(GTK_WINDOW(window));
1902     gdk_window_raise(gmtk_get_window(window));
1903     return FALSE;
1904 }
1905 
set_software_volume(gdouble * data)1906 gboolean set_software_volume(gdouble * data)
1907 {
1908     gm_store = gm_pref_store_new("gnome-mplayer");
1909     gm_pref_store_set_float(gm_store, VOLUME_SOFTVOL, *data);
1910     gm_pref_store_free(gm_store);
1911     return FALSE;
1912 }
1913 
hookup_volume(void * data)1914 gboolean hookup_volume(void *data)
1915 {
1916     gm_log(verbose, G_LOG_LEVEL_DEBUG, "hookup_volume is %f", audio_device.volume);
1917     if (softvol == FALSE) {
1918         if (gm_audio_update_device(&audio_device)) {
1919             if (softvol || audio_device.type == AUDIO_TYPE_SOFTVOL) {
1920                 gm_audio_set_server_volume_update_callback(&audio_device, NULL);
1921             } else {
1922                 gm_audio_set_server_volume_update_callback(&audio_device, set_volume);
1923             }
1924         }
1925     }
1926     gm_log(verbose, G_LOG_LEVEL_DEBUG, "out hookup_volume is %f", audio_device.volume);
1927     return FALSE;
1928 }
1929 
1930 
set_volume(void * data)1931 gboolean set_volume(void *data)
1932 {
1933     IdleData *idle = (IdleData *) data;
1934     gchar *buf = NULL;
1935 
1936     gm_log(verbose, G_LOG_LEVEL_DEBUG, "set_volume new volume is %f", audio_device.volume);
1937     if (data == NULL) {
1938         gm_log(verbose, G_LOG_LEVEL_DEBUG, "in set_volume without data");
1939         if (!(softvol || audio_device.type == AUDIO_TYPE_SOFTVOL)) {
1940             gm_audio_get_volume(&audio_device);
1941         }
1942         if (pref_volume != -1) {
1943             audio_device.volume = (gdouble) pref_volume / 100.0;
1944             gmtk_media_player_set_volume(GMTK_MEDIA_PLAYER(media), audio_device.volume);
1945             pref_volume = -1;
1946         }
1947         gm_log(verbose, G_LOG_LEVEL_DEBUG, "data is null new volume is %f", audio_device.volume);
1948 #ifdef GTK2_12_ENABLED
1949         gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), audio_device.volume);
1950 #else
1951         gtk_range_set_value(GTK_RANGE(vol_slider), audio_device.volume);
1952 #endif
1953         return FALSE;
1954     }
1955 
1956     if (GTK_IS_WIDGET(vol_slider) && audio_device.volume >= 0.0 && audio_device.volume <= 1.0) {
1957         gm_log(verbose, G_LOG_LEVEL_DEBUG, "setting slider to %f", audio_device.volume);
1958         if (remember_softvol) {
1959             volume_softvol = audio_device.volume;
1960             set_software_volume(&volume_softvol);
1961         }
1962 #ifdef GTK2_12_ENABLED
1963         if (rpcontrols != NULL && g_ascii_strcasecmp(rpcontrols, "volumeslider") == 0) {
1964             gtk_range_set_value(GTK_RANGE(vol_slider), audio_device.volume);
1965             buf = g_strdup_printf(_("Volume %i%%"), (gint) (audio_device.volume * 100.0));
1966             g_strlcpy(idledata->vol_tooltip, buf, sizeof(idledata->vol_tooltip));
1967             g_free(buf);
1968         } else {
1969             gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), audio_device.volume);
1970         }
1971 
1972 #else
1973         gtk_range_set_value(GTK_RANGE(vol_slider), audio_device.volume);
1974         buf = g_strdup_printf(_("Volume %i%%"), (gint) (audio_device.volume * 100.0));
1975         g_strlcpy(idledata->vol_tooltip, buf, sizeof(idledata->vol_tooltip));
1976         g_free(buf);
1977 #endif
1978         g_idle_add(set_volume_tip, idle);
1979     }
1980 
1981     return FALSE;
1982 }
1983 
set_fullscreen(void * data)1984 gboolean set_fullscreen(void *data)
1985 {
1986 
1987     IdleData *idle = (IdleData *) data;
1988 
1989     // we need to flip the state since the callback reads the value of fullscreen
1990     // and if fullscreen is 0 it sets it to fullscreen.
1991     // fullscreen = ! (gint) idle->fullscreen;
1992     // printf("calling fs_callback with %s\n",gm_bool_to_string(fullscreen));
1993     // fs_callback(NULL, NULL, NULL); // ok is just not NULL which is what we want
1994     if (idle != NULL && idle->videopresent)
1995         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), idle->fullscreen);
1996     return FALSE;
1997 }
1998 
set_show_controls(void * data)1999 gboolean set_show_controls(void *data)
2000 {
2001 
2002     IdleData *idle = (IdleData *) data;
2003 
2004     if (idle == NULL)
2005         return FALSE;
2006 
2007     showcontrols = idle->showcontrols;
2008 
2009     if (gmtk_get_visible(GTK_WIDGET(menuitem_view_controls))) {
2010         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls), showcontrols);
2011     } else {
2012         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols), showcontrols);
2013     }
2014     return FALSE;
2015 }
2016 
get_show_controls()2017 gboolean get_show_controls()
2018 {
2019     return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls));
2020 }
2021 
popup_handler(GtkWidget * widget,GdkEvent * event,void * data)2022 gboolean popup_handler(GtkWidget * widget, GdkEvent * event, void *data)
2023 {
2024     GtkMenu *menu;
2025     GdkEventButton *event_button;
2026     GTimeVal currenttime;
2027     GtkAllocation alloc;
2028 
2029     g_get_current_time(&currenttime);
2030     last_movement_time = currenttime.tv_sec;
2031     g_idle_add(make_panel_and_mouse_visible, NULL);
2032 
2033     menu = GTK_MENU(widget);
2034     gtk_widget_grab_focus(media);
2035     if (event->type == GDK_BUTTON_PRESS) {
2036 
2037         event_button = (GdkEventButton *) event;
2038 
2039         dbus_send_event("MouseDown", event_button->button);
2040         dbus_send_event("MouseClicked", 0);
2041 
2042         if (event_button->button == 3 && disable_context_menu == 0) {
2043             gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time);
2044             return TRUE;
2045         }
2046 
2047         if (event_button->button == 2) {
2048 
2049             // mute on button 2
2050 #ifdef GTK2_12_ENABLED
2051             if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED)) {
2052                 gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), audio_device.volume);
2053             } else {
2054                 gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), 0.0);
2055             }
2056 #else
2057             if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED)) {
2058                 gtk_range_set_value(GTK_RANGE(vol_slider), audio_device.volume);
2059             } else {
2060                 gtk_range_set_value(GTK_RANGE(vol_slider), 0.0);
2061             }
2062 #endif
2063         }
2064 
2065         if (event_button->button == 1 && idledata->videopresent == TRUE && !disable_pause_on_click &&
2066             !gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE_IS_MENU)) {
2067 
2068             switch (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media))) {
2069             case MEDIA_STATE_PLAY:
2070                 gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PAUSE);
2071                 break;
2072             case MEDIA_STATE_PAUSE:
2073                 gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PLAY);
2074                 break;
2075             default:
2076                 break;
2077             }
2078         }
2079 
2080     }
2081     // fullscreen on double click of button 1
2082     if (event->type == GDK_2BUTTON_PRESS) {
2083         event_button = (GdkEventButton *) event;
2084         if (event_button->button == 1 && idledata->videopresent == TRUE) {
2085             gmtk_get_allocation(media, &alloc);
2086             if (event_button->x > alloc.x
2087                 && event_button->y > alloc.y
2088                 && event_button->x < alloc.x + alloc.width && event_button->y < alloc.y + alloc.height) {
2089                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
2090 
2091             }
2092         }
2093     }
2094 
2095     if (event->type == GDK_BUTTON_RELEASE) {
2096 
2097         event_button = (GdkEventButton *) event;
2098         dbus_send_event("MouseUp", event_button->button);
2099 
2100     }
2101 
2102     return FALSE;
2103 }
2104 
media_scroll_event_callback(GtkWidget * widget,GdkEventScroll * event,gpointer data)2105 gboolean media_scroll_event_callback(GtkWidget * widget, GdkEventScroll * event, gpointer data)
2106 {
2107 
2108     if (mouse_wheel_changes_volume == FALSE) {
2109         if (event->direction == GDK_SCROLL_UP) {
2110             set_ff(NULL);
2111         }
2112 
2113         if (event->direction == GDK_SCROLL_DOWN) {
2114             set_rew(NULL);
2115         }
2116     } else {
2117         if (event->direction == GDK_SCROLL_UP) {
2118             audio_device.volume += 0.01;
2119             g_idle_add(set_volume, idledata);
2120         }
2121 
2122         if (event->direction == GDK_SCROLL_DOWN) {
2123             audio_device.volume -= 0.01;
2124             g_idle_add(set_volume, idledata);
2125         }
2126     }
2127 
2128     return TRUE;
2129 }
2130 
notification_handler(GtkWidget * widget,GdkEventCrossing * event,void * data)2131 gboolean notification_handler(GtkWidget * widget, GdkEventCrossing * event, void *data)
2132 {
2133     if (event->type == GDK_ENTER_NOTIFY) {
2134         dbus_send_event("EnterWindow", 0);
2135     }
2136 
2137     if (event->type == GDK_LEAVE_NOTIFY) {
2138         dbus_send_event("LeaveWindow", 0);
2139     }
2140 
2141     return FALSE;
2142 }
2143 
set_destroy(gpointer data)2144 gboolean set_destroy(gpointer data)
2145 {
2146     gtk_widget_destroy(window);
2147     return FALSE;
2148 }
2149 
2150 
destroy_callback(GtkWidget * widget,gpointer data)2151 static void destroy_callback(GtkWidget * widget, gpointer data)
2152 {
2153     gtk_main_quit();
2154 }
2155 
delete_callback(GtkWidget * widget,GdkEvent * event,void * data)2156 gboolean delete_callback(GtkWidget * widget, GdkEvent * event, void *data)
2157 {
2158     loop = 0;
2159     ok_to_play = FALSE;
2160     dontplaynext = TRUE;
2161 
2162     gm_log(GMTK_MEDIA_PLAYER(media)->debug, G_LOG_LEVEL_DEBUG, "delete_callback()");
2163 
2164     g_idle_remove_by_data(idledata);
2165     gm_audio_set_server_volume_update_callback(&audio_device, NULL);
2166 
2167     if (remember_loc && !fullscreen && embed_window == 0) {
2168         gm_store = gm_pref_store_new("gnome-mplayer");
2169         gtk_window_get_position(GTK_WINDOW(window), &loc_window_x, &loc_window_y);
2170         gtk_window_get_size(GTK_WINDOW(window), &loc_window_width, &loc_window_height);
2171         loc_panel_position = gtk_paned_get_position(GTK_PANED(pane));
2172 
2173         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
2174 
2175         }
2176         //if (save_loc) {
2177         gm_pref_store_set_int(gm_store, WINDOW_X, loc_window_x);
2178         gm_pref_store_set_int(gm_store, WINDOW_Y, loc_window_y);
2179         gm_pref_store_set_int(gm_store, WINDOW_HEIGHT, loc_window_height);
2180         gm_pref_store_set_int(gm_store, WINDOW_WIDTH, loc_window_width);
2181         gm_pref_store_set_int(gm_store, PANEL_POSITION, loc_panel_position);
2182         //}
2183         gm_pref_store_free(gm_store);
2184     }
2185 #ifdef LIBGDA_ENABLED
2186     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY
2187         || gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2188 
2189         mark_uri_in_db_as_resumable(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), TRUE,
2190                                     gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
2191                                                                            ATTRIBUTE_POSITION));
2192     } else {
2193 
2194         if (gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)) != NULL) {
2195             mark_uri_in_db_as_resumable(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), FALSE, 0.0);
2196         }
2197     }
2198 #endif
2199 
2200     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
2201     gm_log(verbose, G_LOG_LEVEL_DEBUG,
2202            "waiting for all events to drain and state to become \"unknown\" and the mplayer thread to exit");
2203     while (gtk_events_pending() || gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN
2204            || GMTK_MEDIA_PLAYER(media)->mplayer_thread != NULL) {
2205         gtk_main_iteration();
2206     }
2207 
2208     if (control_id == 0) {
2209         g_thread_pool_stop_unused_threads();
2210         if (retrieve_metadata_pool != NULL) {
2211             gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain and retrieve_metadata_pool to empty");
2212             while (gtk_events_pending() || g_thread_pool_unprocessed(retrieve_metadata_pool)) {
2213                 gtk_main_iteration();
2214             }
2215             g_thread_pool_free(retrieve_metadata_pool, TRUE, TRUE);
2216         }
2217     } else {
2218         gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
2219         while (gtk_events_pending()) {
2220             gtk_main_iteration();
2221         }
2222         dbus_cancel();
2223     }
2224     dbus_enable_screensaver();
2225     dbus_unhook();
2226 
2227     if (use_defaultpl && embed_window == 0)
2228         save_playlist_pls(default_playlist);
2229 
2230 #ifdef LIBGDA_ENABLED
2231     close_db_connection(db_connection);
2232 #endif
2233 
2234     //gtk_main_quit();
2235     return FALSE;
2236 }
2237 
2238 #ifdef GTK2_12_ENABLED
status_icon_callback(GtkStatusIcon * icon,gpointer data)2239 gboolean status_icon_callback(GtkStatusIcon * icon, gpointer data)
2240 {
2241 
2242     if (gmtk_get_visible(window)) {
2243         gtk_window_get_position(GTK_WINDOW(window), &loc_window_x, &loc_window_y);
2244         gtk_window_iconify(GTK_WINDOW(window));
2245         gtk_widget_hide(GTK_WIDGET(window));
2246     } else {
2247         gtk_window_deiconify(GTK_WINDOW(window));
2248         gtk_window_present(GTK_WINDOW(window));
2249         gtk_window_move(GTK_WINDOW(window), loc_window_x, loc_window_y);
2250     }
2251     return FALSE;
2252 }
2253 
2254 
status_icon_context_callback(GtkStatusIcon * status_icon,guint button,guint activate_time,gpointer data)2255 void status_icon_context_callback(GtkStatusIcon * status_icon, guint button, guint activate_time, gpointer data)
2256 {
2257     gtk_menu_popup(GTK_MENU(popup_menu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time);
2258 }
2259 
2260 #endif
2261 
motion_notify_callback(GtkWidget * widget,GdkEventMotion * event,gpointer data)2262 gboolean motion_notify_callback(GtkWidget * widget, GdkEventMotion * event, gpointer data)
2263 {
2264     GTimeVal currenttime;
2265     GtkAllocation fs_allocation;
2266     GtkAllocation fs_controls_allocation;
2267 
2268     g_get_current_time(&currenttime);
2269     last_movement_time = currenttime.tv_sec;
2270 /*
2271 	if (verbose > 1) {
2272 		g_get_current_time(&currenttime);
2273 		printf("motion noticed at %li\n",currenttime.tv_sec);
2274 	}
2275 */
2276     if (fullscreen) {
2277         gmtk_get_allocation(window, &fs_allocation);
2278         gmtk_get_allocation(controls_box, &fs_controls_allocation);
2279         if (event->y > (fs_allocation.height - fs_controls_allocation.height)) {
2280             g_idle_add(make_panel_and_mouse_visible, NULL);
2281         } else {
2282             hide_fs_controls();
2283         }
2284     } else {
2285         g_idle_add(make_panel_and_mouse_visible, NULL);
2286     }
2287     return FALSE;
2288 }
2289 
window_state_callback(GtkWidget * widget,GdkEventWindowState * event,gpointer user_data)2290 gboolean window_state_callback(GtkWidget * widget, GdkEventWindowState * event, gpointer user_data)
2291 {
2292     gm_log(verbose, G_LOG_LEVEL_DEBUG, "fullscreen = %s",
2293            gm_bool_to_string((event->new_window_state == GDK_WINDOW_STATE_FULLSCREEN)));
2294     gm_log(verbose, G_LOG_LEVEL_DEBUG, "State = %i mask = %i flag = %i", event->new_window_state, event->changed_mask,
2295            GDK_WINDOW_STATE_FULLSCREEN);
2296     //if (embed_window == 0) {
2297     //update_control_flag = TRUE;
2298     gm_log(verbose, G_LOG_LEVEL_DEBUG, "restore controls = %s showcontrols = %s", gm_bool_to_string(restore_controls),
2299            gm_bool_to_string(showcontrols));
2300     if (fullscreen == 1 && (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)) {
2301         // fullscreen, but window hidden
2302         hide_fs_controls();
2303     }
2304 
2305     if (fullscreen == 1 && (event->new_window_state == GDK_WINDOW_STATE_FULLSCREEN)) {
2306         if (showcontrols) {
2307             show_fs_controls();
2308         }
2309     }
2310 
2311     return FALSE;
2312 
2313     fullscreen = (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN);
2314     if (fullscreen) {
2315         gtk_widget_hide(menubar);
2316     } else {
2317         gtk_widget_show(menubar);
2318     }
2319     if (event->changed_mask == GDK_WINDOW_STATE_FULLSCREEN) {
2320         idledata->showcontrols = restore_controls;
2321         set_show_controls(idledata);
2322     }
2323     //}
2324 
2325     return FALSE;
2326 }
2327 
configure_callback(GtkWidget * widget,GdkEventConfigure * event,gpointer user_data)2328 gboolean configure_callback(GtkWidget * widget, GdkEventConfigure * event, gpointer user_data)
2329 {
2330     if (use_remember_loc && event->width == loc_window_width && event->height == loc_window_height) {
2331         // this might be useful
2332     }
2333     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_subtitles),
2334                                    gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media),
2335                                                                            ATTRIBUTE_SUB_VISIBLE));
2336     return FALSE;
2337 }
2338 
window_key_callback(GtkWidget * widget,GdkEventKey * event,gpointer user_data)2339 gboolean window_key_callback(GtkWidget * widget, GdkEventKey * event, gpointer user_data)
2340 {
2341     GTimeVal currenttime;
2342     gboolean title_is_menu;
2343     gint index;
2344 
2345     gm_log(verbose, G_LOG_LEVEL_DEBUG, "key = %i", event->keyval);
2346     gm_log(verbose, G_LOG_LEVEL_DEBUG, "state = %i", event->state);
2347     gm_log(verbose, G_LOG_LEVEL_DEBUG, "other = %i", event->state & ~GDK_CONTROL_MASK);
2348 
2349     gm_log(verbose, G_LOG_LEVEL_DEBUG, "key name=%s", gdk_keyval_name(event->keyval));
2350     // We don't want to handle CTRL accelerators here
2351     // if we pass in items with CTRL then 2 and Ctrl-2 do the same thing
2352     if (gmtk_get_visible(plvbox) && gtk_tree_view_get_enable_search(GTK_TREE_VIEW(list)))
2353         return FALSE;
2354 
2355     index = get_index_from_key_and_modifier(event->keyval, event->state);
2356     gm_log(verbose, G_LOG_LEVEL_DEBUG, "index = %i", index);
2357     if (!event->is_modifier && index != -1) {
2358 
2359         switch (index) {
2360         case FILE_OPEN_LOCATION:
2361             break;
2362         case EDIT_SCREENSHOT:
2363             if (fullscreen)
2364                 gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_TAKE_SCREENSHOT);
2365             return FALSE;
2366         case EDIT_PREFERENCES:
2367             break;
2368         case VIEW_PLAYLIST:
2369             break;
2370         case VIEW_INFO:
2371             break;
2372         case VIEW_DETAILS:
2373             break;
2374         case VIEW_METER:
2375             break;
2376         case VIEW_FULLSCREEN:
2377             if (fullscreen) {
2378                 if (idledata->videopresent) {
2379                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), FALSE);
2380                 }
2381             } else {
2382                 if (idledata->videopresent) {
2383                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), TRUE);
2384                 }
2385             }
2386             return TRUE;
2387         case VIEW_ASPECT:
2388             if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window))) {
2389                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), TRUE);
2390                 return FALSE;
2391             }
2392             if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten))) {
2393                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic), TRUE);
2394                 return FALSE;
2395             }
2396             if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine))) {
2397                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), TRUE);
2398                 return FALSE;
2399             }
2400             if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three))) {
2401                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), TRUE);
2402                 return FALSE;
2403             }
2404             if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic))) {
2405                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), TRUE);
2406                 return FALSE;
2407             }
2408             if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default)))
2409                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), TRUE);
2410             return FALSE;
2411         case VIEW_SUBTITLES:
2412             if (fullscreen) {
2413                 if (idledata->videopresent)
2414                     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE,
2415                                                             !gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER
2416                                                                                                      (media),
2417                                                                                                      ATTRIBUTE_SUB_VISIBLE));
2418             }
2419             return FALSE;
2420         case VIEW_DECREASE_SIZE:
2421         case VIEW_INCREASE_SIZE:
2422         case VIEW_ANGLE:
2423         case VIEW_CONTROLS:
2424             break;
2425         default:
2426             gm_log(verbose, G_LOG_LEVEL_MESSAGE, "Keyboard shortcut index %i, not handled in fullscreen at this time",
2427                    index);
2428 
2429         }
2430     }
2431 
2432     if (!event->is_modifier && (event->state & GDK_SHIFT_MASK) == 0 && (event->state & GDK_CONTROL_MASK) == 0
2433         && (event->state & GDK_MOD1_MASK) == 0) {
2434 
2435         g_get_current_time(&currenttime);
2436         last_movement_time = currenttime.tv_sec;
2437 
2438         title_is_menu = gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE_IS_MENU);
2439 
2440         g_idle_add(make_panel_and_mouse_visible, NULL);
2441         switch (event->keyval) {
2442         case GDK_ISO_Next_Group:
2443             setup_accelerators();
2444             return FALSE;
2445         case GDK_Right:
2446             if (title_is_menu) {
2447                 return gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2448             } else {
2449                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP
2450                     && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)))
2451                     return ff_callback(NULL, NULL, NULL);
2452             }
2453             break;
2454         case GDK_Left:
2455             if (title_is_menu) {
2456                 return gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2457             } else {
2458                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP
2459                     && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)))
2460                     return rew_callback(NULL, NULL, NULL);
2461             }
2462             break;
2463         case GDK_Page_Up:
2464             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP
2465                 && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)))
2466                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 600.0, SEEK_RELATIVE);
2467 
2468             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2469                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 0.0, SEEK_RELATIVE);
2470                 idledata->position += 600;
2471                 if (idledata->position > idledata->length)
2472                     idledata->position = 0;
2473                 gmtk_media_tracker_set_percentage(tracker, idledata->position / idledata->length);
2474             }
2475             return FALSE;
2476         case GDK_Page_Down:
2477             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP
2478                 && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)))
2479                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), -600.0, SEEK_RELATIVE);
2480             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2481                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 0.0, SEEK_RELATIVE);
2482                 idledata->position -= 600;
2483                 if (idledata->position < 0)
2484                     idledata->position = 0;
2485                 gmtk_media_tracker_set_percentage(tracker, idledata->position / idledata->length);
2486             }
2487             return FALSE;
2488         case GDK_Up:
2489             if (title_is_menu) {
2490                 return gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2491             } else {
2492                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP
2493                     && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)))
2494                     gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 60.0, SEEK_RELATIVE);
2495                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2496                     gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 0.0, SEEK_RELATIVE);
2497                     idledata->position += 60;
2498                     if (idledata->position > idledata->length)
2499                         idledata->position = 0;
2500                     gmtk_media_tracker_set_percentage(tracker, idledata->position / idledata->length);
2501                 }
2502             }
2503 
2504             return FALSE;
2505         case GDK_Down:
2506             if (title_is_menu) {
2507                 return gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2508             } else {
2509                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP
2510                     && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist)))
2511                     gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), -60.0, SEEK_RELATIVE);
2512                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2513                     gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 0.0, SEEK_RELATIVE);
2514                     idledata->position -= 60;
2515                     if (idledata->position < 0)
2516                         idledata->position = 0;
2517                     gmtk_media_tracker_set_percentage(tracker, idledata->position / idledata->length);
2518                 }
2519             }
2520             return FALSE;
2521         case GDK_Return:
2522         case GDK_KP_Enter:
2523             if (title_is_menu) {
2524                 return gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2525             } else if (idledata->videopresent) {
2526                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
2527             }
2528             return FALSE;
2529         case GDK_less:
2530             prev_callback(NULL, NULL, NULL);
2531             return FALSE;
2532         case GDK_greater:
2533             next_callback(NULL, NULL, NULL);
2534             return FALSE;
2535         case GDK_space:
2536         case GDK_p:
2537             return play_callback(NULL, NULL, NULL);
2538             break;
2539         case GDK_m:
2540 #ifdef GTK2_12_ENABLED
2541             if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED)) {
2542                 gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, FALSE);
2543                 gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), audio_device.volume);
2544             } else {
2545                 gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, TRUE);
2546                 gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), 0.0);
2547             }
2548 #else
2549             if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED)) {
2550                 gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, FALSE);
2551                 gtk_range_set_value(GTK_RANGE(vol_slider), audio_device.volume);
2552             } else {
2553                 gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, TRUE);
2554                 gtk_range_set_value(GTK_RANGE(vol_slider), 0.0);
2555             }
2556 #endif
2557             return FALSE;
2558 
2559         case GDK_1:
2560             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_CONTRAST, -5);
2561             return FALSE;
2562         case GDK_2:
2563             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_CONTRAST, 5);
2564             return FALSE;
2565         case GDK_3:
2566             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_BRIGHTNESS, -5);
2567             return FALSE;
2568         case GDK_4:
2569             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_BRIGHTNESS, 5);
2570             return FALSE;
2571         case GDK_5:
2572             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HUE, -5);
2573             return FALSE;
2574         case GDK_6:
2575             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HUE, 5);
2576             return FALSE;
2577         case GDK_7:
2578             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SATURATION, -5);
2579             return FALSE;
2580         case GDK_8:
2581             gmtk_media_player_set_attribute_integer_delta(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SATURATION, 5);
2582             return FALSE;
2583         case GDK_bracketleft:
2584             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SPEED_MULTIPLIER, 0.9091);
2585             return FALSE;
2586         case GDK_bracketright:
2587             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SPEED_MULTIPLIER, 1.10);
2588             return FALSE;
2589         case GDK_BackSpace:
2590             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SPEED_SET, 1.0);
2591             return FALSE;
2592         case GDK_9:
2593 #ifdef GTK2_12_ENABLED
2594             gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider),
2595                                        gtk_scale_button_get_value(GTK_SCALE_BUTTON(vol_slider)) - 0.01);
2596 #else
2597             gtk_range_set_value(GTK_RANGE(vol_slider), gtk_range_get_value(GTK_RANGE(vol_slider)) - 0.01);
2598 #endif
2599             return FALSE;
2600         case GDK_0:
2601 #ifdef GTK2_12_ENABLED
2602             gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider),
2603                                        gtk_scale_button_get_value(GTK_SCALE_BUTTON(vol_slider)) + 0.01);
2604 #else
2605             gtk_range_set_value(GTK_RANGE(vol_slider), gtk_range_get_value(GTK_RANGE(vol_slider)) + 0.01);
2606 #endif
2607             return FALSE;
2608         case GDK_period:
2609             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE)
2610                 gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_FRAME_STEP);
2611             return FALSE;
2612         case GDK_j:
2613             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SUBTITLE_SELECT);
2614             return FALSE;
2615         case GDK_y:
2616             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SUBTITLE_STEP_FORWARD);
2617             return FALSE;
2618         case GDK_g:
2619             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SUBTITLE_STEP_BACKWARD);
2620             return FALSE;
2621         case GDK_q:
2622             delete_callback(NULL, NULL, NULL);
2623             g_idle_add(set_destroy, NULL);
2624             return FALSE;
2625         case GDK_v:
2626             /*
2627                if (fullscreen) {
2628                gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE,
2629                !gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER
2630                (media),
2631                ATTRIBUTE_SUB_VISIBLE));
2632                }
2633              */
2634             return FALSE;
2635         case GDK_KP_Add:
2636             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_DELAY,
2637                                                    gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
2638                                                                                           ATTRIBUTE_AUDIO_DELAY) + 0.1);
2639 
2640             return FALSE;
2641         case GDK_minus:
2642         case GDK_KP_Subtract:
2643             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_DELAY,
2644                                                    gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
2645                                                                                           ATTRIBUTE_AUDIO_DELAY) - 0.1);
2646             return FALSE;
2647             //case GDK_z:
2648             //    menuitem_view_decrease_subtitle_delay_callback(NULL, NULL);
2649             //    return FALSE;
2650             //case GDK_x:
2651             //    menuitem_view_increase_subtitle_delay_callback(NULL, NULL);
2652             //    return FALSE;
2653         case GDK_F11:
2654             if (idledata->videopresent)
2655                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
2656             return FALSE;
2657         case GDK_Escape:
2658             if (fullscreen) {
2659                 if (idledata->videopresent)
2660                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
2661             } else {
2662                 delete_callback(NULL, NULL, NULL);
2663                 g_idle_add(set_destroy, NULL);
2664             }
2665             return FALSE;
2666         case GDK_f:
2667             if (idledata->videopresent)
2668                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
2669             return FALSE;
2670         case GDK_a:
2671             /*
2672                if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window))) {
2673                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), TRUE);
2674                return FALSE;
2675                }
2676                if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten)))
2677                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), TRUE);
2678                if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine)))
2679                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), TRUE);
2680                if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three)))
2681                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), TRUE);
2682                if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default)))
2683                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), TRUE);
2684              */
2685             return FALSE;
2686         case GDK_d:
2687             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SWITCH_FRAME_DROP);
2688             return FALSE;
2689         case GDK_i:
2690             if (fullscreen) {
2691                 //cmd = g_strdup_printf("osd_show_text '%s' 1500 0\n", idledata->display_name);
2692                 //send_command(cmd, TRUE);
2693                 //g_free(cmd);
2694             }
2695             return FALSE;
2696         case GDK_b:
2697             gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_POSITION,
2698                                                     gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media),
2699                                                                                             ATTRIBUTE_SUBTITLE_POSITION)
2700                                                     - 1);
2701             return FALSE;
2702         case GDK_s:
2703             // gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_TAKE_SCREENSHOT);
2704             return FALSE;
2705         default:
2706             gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2707             return FALSE;
2708         }
2709     }
2710 
2711     if (!event->is_modifier && (event->state & GDK_SHIFT_MASK) == 1 && (event->state & GDK_CONTROL_MASK) == 0
2712         && (event->state & GDK_MOD1_MASK) == 0) {
2713         g_get_current_time(&currenttime);
2714         last_movement_time = currenttime.tv_sec;
2715 
2716         title_is_menu = gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE_IS_MENU);
2717 
2718         g_idle_add(make_panel_and_mouse_visible, NULL);
2719         switch (event->keyval) {
2720         case GDK_B:
2721             gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_POSITION,
2722                                                     gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media),
2723                                                                                             ATTRIBUTE_SUBTITLE_POSITION)
2724                                                     + 1);
2725             return FALSE;
2726         case GDK_S:
2727             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_TAKE_SCREENSHOT);
2728             return FALSE;
2729         case GDK_J:
2730             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SUBTITLE_SELECT);
2731             return FALSE;
2732         case GDK_numbersign:
2733             gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SWITCH_AUDIO);
2734             return FALSE;
2735         case GDK_plus:
2736             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_DELAY,
2737                                                    gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
2738                                                                                           ATTRIBUTE_AUDIO_DELAY) + 0.1);
2739 
2740             return FALSE;
2741         case GDK_braceleft:
2742             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SPEED_MULTIPLIER, 0.50);
2743             return FALSE;
2744         case GDK_braceright:
2745             gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SPEED_MULTIPLIER, 2.0);
2746             return FALSE;
2747         default:
2748             gmtk_media_player_send_key_press_event(GMTK_MEDIA_PLAYER(media), event, data);
2749             return FALSE;
2750         }
2751 
2752     }
2753 
2754     if ((fullscreen == 1)
2755         && (!event->is_modifier && (event->state & GDK_SHIFT_MASK) == 0 && (event->state & GDK_CONTROL_MASK) == 0
2756             && (event->state & GDK_MOD1_MASK) == 0)) {
2757         switch (event->keyval) {
2758         case GDK_f:
2759             idledata->fullscreen = FALSE;
2760             set_fullscreen(idledata);
2761             return TRUE;
2762         default:
2763             return FALSE;
2764         }
2765     }
2766 
2767     return FALSE;
2768 
2769 }
2770 
drop_callback(GtkWidget * widget,GdkDragContext * dc,gint x,gint y,GtkSelectionData * selection_data,guint info,guint t,gpointer data)2771 gboolean drop_callback(GtkWidget * widget, GdkDragContext * dc,
2772                        gint x, gint y, GtkSelectionData * selection_data, guint info, guint t, gpointer data)
2773 {
2774     gchar **list;
2775     gint i = 0;
2776     gboolean playlist;
2777     gint itemcount;
2778     gboolean added_single = FALSE;
2779     gchar *filename;
2780     /* Important, check if we actually got data.  Sometimes errors
2781      * occure and selection_data will be NULL.
2782      */
2783     if (selection_data == NULL)
2784         return FALSE;
2785 #ifdef GTK2_14_ENABLED
2786     if (gtk_selection_data_get_length(selection_data) < 0)
2787         return FALSE;
2788 #else
2789     if (selection_data->length < 0)
2790         return FALSE;
2791 #endif
2792 
2793     if ((info == DRAG_INFO_0) || (info == DRAG_INFO_1) || (info == DRAG_INFO_2)) {
2794 #ifdef GTK2_14_ENABLED
2795         list = g_uri_list_extract_uris((const gchar *) gtk_selection_data_get_data(selection_data));
2796 #else
2797         list = g_uri_list_extract_uris((const gchar *) selection_data->data);
2798 #endif
2799         itemcount = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL);
2800 
2801         while (list[i] != NULL) {
2802             if (strlen(list[i]) > 0) {
2803                 if (is_uri_dir(list[i])) {
2804                     create_folder_progress_window();
2805                     add_folder_to_playlist_callback(list[i], NULL);
2806                     destroy_folder_progress_window();
2807                 } else {
2808                     // subtitle?
2809                     if (g_strrstr(list[i], ".ass") != NULL || g_strrstr(list[i], ".ssa") != NULL
2810                         || g_strrstr(list[i], ".srt") != NULL) {
2811                         filename = g_filename_from_uri(list[i], NULL, NULL);
2812                         if (filename != NULL) {
2813                             gtk_list_store_set(playliststore, &iter, SUBTITLE_COLUMN, filename, -1);
2814                             gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_FILE,
2815                                                                    filename);
2816                             g_free(filename);
2817                         }
2818                     } else {
2819                         playlist = detect_playlist(list[i]);
2820 
2821                         if (!playlist) {
2822                             if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
2823                                 if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
2824                                     dontplaynext = TRUE;
2825                                 gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
2826                                 gtk_list_store_clear(playliststore);
2827                                 added_single = add_item_to_playlist(list[i], playlist);
2828                             } else {
2829                                 add_item_to_playlist(list[i], playlist);
2830                             }
2831                         } else {
2832                             if (!parse_playlist(list[i])) {
2833                                 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
2834                                     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) !=
2835                                         MEDIA_STATE_UNKNOWN)
2836                                         dontplaynext = TRUE;
2837                                     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
2838                                     gtk_list_store_clear(playliststore);
2839                                     added_single = add_item_to_playlist(list[i], playlist);
2840                                 } else {
2841                                     add_item_to_playlist(list[i], playlist);
2842                                 }
2843                             }
2844                         }
2845                     }
2846                 }
2847             }
2848             i++;
2849         }
2850 
2851         if (itemcount == 0 || added_single) {
2852             gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
2853             gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
2854             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
2855             g_idle_add(async_play_iter, &iter);
2856         }
2857 
2858         g_strfreev(list);
2859         update_gui();
2860     }
2861     return TRUE;
2862 
2863 }
2864 
pause_callback(GtkWidget * widget,GdkEventExpose * event,void * data)2865 gboolean pause_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
2866 {
2867     return play_callback(widget, event, data);
2868 }
2869 
play_callback(GtkWidget * widget,GdkEventExpose * event,void * data)2870 gboolean play_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
2871 {
2872     IdleData *idle = (IdleData *) data;
2873 
2874     autostart = 1;
2875     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_STOP ||
2876         gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2877         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PLAY);
2878 
2879     } else if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY) {
2880         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_PAUSE);
2881     }
2882 
2883     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_UNKNOWN) {
2884         if (next_item_in_playlist(&iter)) {
2885             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
2886             g_idle_add(async_play_iter, &iter);
2887         } else {
2888             if (is_first_item_in_playlist(&iter)) {
2889                 gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
2890                 g_idle_add(async_play_iter, &iter);
2891             }
2892         }
2893     }
2894 
2895     if (idle == NULL) {
2896         dbus_send_rpsignal("RP_Play");
2897     }
2898     dbus_send_rpsignal_with_int("RP_SetGUIState",
2899                                 media_state_to_playstate(gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media))));
2900 
2901     return FALSE;
2902 }
2903 
stop_callback(GtkWidget * widget,GdkEventExpose * event,void * data)2904 gboolean stop_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
2905 {
2906     IdleData *idle = (IdleData *) data;
2907 #ifdef GTK3_ENABLED
2908     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
2909     const gchar *icon_start;
2910 
2911     if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL)
2912         icon_start = "media-playback-start-rtl-symbolic";
2913     else
2914         icon_start = "media-playback-start-symbolic";
2915 #endif
2916 
2917     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY ||
2918         gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2919         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_STOP);
2920         autopause = FALSE;
2921         if (gmtk_media_player_get_media_type(GMTK_MEDIA_PLAYER(media)) == TYPE_NETWORK)
2922             dontplaynext = TRUE;
2923         gmtk_media_tracker_set_percentage(tracker, 0.0);
2924         gtk_widget_set_sensitive(play_event_box, TRUE);
2925 #ifdef GTK3_ENABLED
2926         if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
2927             gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
2928         } else {
2929             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
2930         }
2931 #else
2932         gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
2933 #endif
2934 #ifdef GTK2_12_ENABLED
2935         gtk_widget_set_tooltip_text(play_event_box, _("Play"));
2936 #else
2937         gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
2938 #endif
2939     }
2940 
2941     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_QUIT) {
2942         gmtk_media_tracker_set_percentage(tracker, 0.0);
2943 #ifdef GTK3_ENABLED
2944         if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
2945             gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
2946         } else {
2947             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
2948         }
2949 #else
2950         gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
2951 #endif
2952 #ifdef GTK2_12_ENABLED
2953         gtk_widget_set_tooltip_text(play_event_box, _("Play"));
2954 #else
2955         gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
2956 #endif
2957     }
2958 
2959     g_idle_add(set_progress_value, idledata);
2960     g_strlcpy(idledata->progress_text, _("Stopped"), sizeof(idledata->progress_text));
2961     g_idle_add(set_progress_text, idledata);
2962 
2963     if (idle == NULL) {
2964         dbus_send_rpsignal("RP_Stop");
2965     }
2966 
2967     dbus_send_rpsignal_with_int("RP_SetGUIState",
2968                                 media_state_to_playstate(gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media))));
2969     dbus_enable_screensaver();
2970 
2971     return FALSE;
2972 }
2973 
ff_callback(GtkWidget * widget,GdkEventExpose * event,void * data)2974 gboolean ff_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
2975 {
2976     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP) {
2977         gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 10.0, SEEK_RELATIVE);
2978 
2979         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
2980             gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 0.0, SEEK_RELATIVE);
2981             idledata->position += 10;
2982             if (idledata->position > idledata->length)
2983                 idledata->position = 0;
2984             gmtk_media_tracker_set_percentage(tracker, idledata->position / idledata->length);
2985         }
2986     }
2987 
2988     if (rpconsole != NULL && widget != NULL) {
2989         dbus_send_rpsignal("RP_FastForward");
2990     }
2991 
2992     return FALSE;
2993 }
2994 
rew_callback(GtkWidget * widget,GdkEventExpose * event,void * data)2995 gboolean rew_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
2996 {
2997     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP) {
2998         gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), -10.0, SEEK_RELATIVE);
2999         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
3000             gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), 0.0, SEEK_RELATIVE);
3001             idledata->position -= 10;
3002             if (idledata->position < 0)
3003                 idledata->position = 0;
3004             gmtk_media_tracker_set_percentage(tracker, idledata->position / idledata->length);
3005         }
3006     }
3007 
3008     if (rpconsole != NULL && widget != NULL) {
3009         dbus_send_rpsignal("RP_FastReverse");
3010     }
3011 
3012     return FALSE;
3013 }
3014 
prev_callback(GtkWidget * widget,GdkEventExpose * event,void * data)3015 gboolean prev_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
3016 {
3017     gboolean valid = FALSE;
3018     GtkTreePath *path;
3019     GtkTreeIter previter;
3020     GtkTreeIter localiter;
3021 #ifdef GTK3_ENABLED
3022     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
3023     const gchar *icon_start;
3024 
3025     if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL)
3026         icon_start = "media-playback-start-rtl-symbolic";
3027     else
3028         icon_start = "media-playback-start-symbolic";
3029 #endif
3030 
3031     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
3032         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)) {
3033             valid = FALSE;
3034             gmtk_media_player_seek_chapter(GMTK_MEDIA_PLAYER(media), -1, SEEK_RELATIVE);
3035         } else {
3036             valid = prev_item_in_playlist(&iter);
3037         }
3038     } else {
3039         // for the case where we have rolled off the end of the list, allow prev to work
3040         gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &localiter);
3041         do {
3042             previter = localiter;
3043             valid = TRUE;
3044             gtk_tree_model_iter_next(GTK_TREE_MODEL(playliststore), &localiter);
3045         } while (gtk_list_store_iter_is_valid(playliststore, &localiter));
3046         iter = previter;
3047 
3048         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)) {
3049             valid = FALSE;
3050             gmtk_media_player_seek_chapter(GMTK_MEDIA_PLAYER(media), -1, SEEK_RELATIVE);
3051         }
3052     }
3053 
3054     if (valid) {
3055         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3056             dontplaynext = TRUE;
3057         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3058         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
3059         g_idle_add(async_play_iter, &iter);
3060         if (autopause) {
3061             autopause = FALSE;
3062             gtk_widget_set_sensitive(play_event_box, TRUE);
3063 #ifdef GTK3_ENABLED
3064             if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
3065                 gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
3066             } else {
3067                 gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
3068             }
3069 #else
3070             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
3071 #endif
3072         }
3073         gtk_widget_set_sensitive(ff_event_box, TRUE);
3074         gtk_widget_set_sensitive(rew_event_box, TRUE);
3075 
3076     }
3077 
3078     if (GTK_IS_TREE_SELECTION(selection)) {
3079         if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
3080             path = gtk_tree_model_get_path(GTK_TREE_MODEL(playliststore), &iter);
3081             gtk_tree_selection_select_path(selection, path);
3082             if (GTK_IS_WIDGET(list))
3083                 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list), path, NULL, FALSE, 0, 0);
3084             gtk_tree_path_free(path);
3085         }
3086     }
3087 
3088     return FALSE;
3089 }
3090 
next_callback(GtkWidget * widget,GdkEventExpose * event,void * data)3091 gboolean next_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
3092 {
3093     gboolean valid = FALSE;
3094     GtkTreePath *path;
3095 #ifdef GTK3_ENABLED
3096     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
3097     const gchar *icon_start;
3098 
3099     if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL)
3100         icon_start = "media-playback-start-rtl-symbolic";
3101     else
3102         icon_start = "media-playback-start-symbolic";
3103 #endif
3104 
3105     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
3106         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)) {
3107             gmtk_media_player_seek_chapter(GMTK_MEDIA_PLAYER(media), 1, SEEK_RELATIVE);
3108         } else {
3109             valid = next_item_in_playlist(&iter);
3110         }
3111     } else {
3112         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)) {
3113             gmtk_media_player_seek_chapter(GMTK_MEDIA_PLAYER(media), 1, SEEK_RELATIVE);
3114         }
3115     }
3116 
3117     if (valid) {
3118         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3119             dontplaynext = TRUE;
3120         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3121         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
3122         g_idle_add(async_play_iter, &iter);
3123         if (autopause) {
3124             autopause = FALSE;
3125             gtk_widget_set_sensitive(play_event_box, TRUE);
3126 #ifdef GTK3_ENABLED
3127             if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
3128                 gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
3129             } else {
3130                 gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
3131             }
3132 #else
3133             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
3134 #endif
3135         }
3136         gtk_widget_set_sensitive(ff_event_box, TRUE);
3137         gtk_widget_set_sensitive(rew_event_box, TRUE);
3138 
3139     }
3140 
3141     if (GTK_IS_TREE_SELECTION(selection)) {
3142         if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
3143             path = gtk_tree_model_get_path(GTK_TREE_MODEL(playliststore), &iter);
3144             gtk_tree_selection_select_path(selection, path);
3145             if (GTK_IS_WIDGET(list))
3146                 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list), path, NULL, FALSE, 0, 0);
3147             gtk_tree_path_free(path);
3148         }
3149     }
3150 
3151     return FALSE;
3152 }
3153 
menu_callback(GtkWidget * widget,GdkEventExpose * event,void * data)3154 gboolean menu_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
3155 {
3156     gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SHOW_DVD_MENU);
3157     return FALSE;
3158 }
3159 
vol_slider_callback(GtkRange * range,gpointer user_data)3160 void vol_slider_callback(GtkRange * range, gpointer user_data)
3161 {
3162     gdouble vol = gtk_range_get_value(range);
3163     gm_log(verbose, G_LOG_LEVEL_DEBUG, "vol_slider_callback new volume is %f", audio_device.volume);
3164     if (softvol || audio_device.type == AUDIO_TYPE_SOFTVOL) {
3165         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED) && vol > 0) {
3166             gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, FALSE);
3167         }
3168         if ((vol * 100) == 0) {
3169             gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, TRUE);
3170         } else {
3171             gmtk_media_player_set_volume(GMTK_MEDIA_PLAYER(media), gtk_range_get_value(range));
3172         }
3173 
3174         if (remember_softvol) {
3175             volume_softvol = vol;
3176             set_software_volume(&volume_softvol);
3177         }
3178     } else {
3179         if (!gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED))
3180             gm_audio_set_volume(&audio_device, gtk_range_get_value(range));
3181     }
3182 
3183     dbus_send_rpsignal_with_double("RP_Volume", gtk_range_get_value(GTK_RANGE(vol_slider)));
3184     mpris_send_signal_VolumeChanged();
3185 }
3186 
3187 #ifdef GTK2_12_ENABLED
vol_button_value_changed_callback(GtkScaleButton * volume,gdouble value,gpointer data)3188 void vol_button_value_changed_callback(GtkScaleButton * volume, gdouble value, gpointer data)
3189 {
3190 
3191     if (softvol || audio_device.type == AUDIO_TYPE_SOFTVOL) {
3192         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED) && value > 0) {
3193             gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, FALSE);
3194         }
3195         if ((gint) (value * 100) == 0) {
3196             gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED, TRUE);
3197         } else {
3198             gmtk_media_player_set_volume(GMTK_MEDIA_PLAYER(media), value);
3199         }
3200 
3201         if (remember_softvol) {
3202             volume_softvol = value;
3203             set_software_volume(&volume_softvol);
3204         }
3205 
3206     } else {
3207         if (!gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MUTED))
3208             gm_audio_set_volume(&audio_device, value);
3209     }
3210 
3211     dbus_send_rpsignal_with_double("RP_Volume", value * 100.0);
3212     mpris_send_signal_VolumeChanged();
3213 }
3214 #endif
3215 
make_panel_and_mouse_invisible(gpointer data)3216 gboolean make_panel_and_mouse_invisible(gpointer data)
3217 {
3218     GTimeVal currenttime;
3219     GdkCursor *cursor;
3220 #ifdef GTK3_ENABLED
3221     cairo_surface_t *s;
3222     GdkPixbuf *cursor_pixbuf;
3223 #else
3224     GdkColor cursor_color = { 0, 0, 0, 0 };
3225     GdkPixmap *cursor_source;
3226 #endif
3227     if ((fullscreen || always_hide_after_timeout) && auto_hide_timeout > 0
3228         && (gmtk_get_visible(controls_box) || fs_controls != NULL)
3229         && mouse_over_controls == FALSE) {
3230         g_get_current_time(&currenttime);
3231         g_time_val_add(&currenttime, -auto_hide_timeout * G_USEC_PER_SEC);
3232         if (last_movement_time > 0 && currenttime.tv_sec > last_movement_time) {
3233             hide_fs_controls();
3234         }
3235 
3236     }
3237 
3238     g_get_current_time(&currenttime);
3239     g_time_val_add(&currenttime, -auto_hide_timeout * G_USEC_PER_SEC);
3240     /*
3241        printf("%i, %i, %i, %i, %i, %i\n",   currenttime.tv_sec,
3242        get_visible(menu_file),
3243        get_visible(menu_edit),
3244        get_visible(menu_view),
3245        get_visible(menu_help),
3246        gtk_tree_view_get_enable_search(GTK_TREE_VIEW(list)));
3247      */
3248     if (gmtk_get_visible(GTK_WIDGET(menu_file))
3249         || gmtk_get_visible(GTK_WIDGET(menu_edit))
3250         || gmtk_get_visible(GTK_WIDGET(menu_view))
3251         || gmtk_get_visible(GTK_WIDGET(menu_help))
3252         || gtk_tree_view_get_enable_search(GTK_TREE_VIEW(list))) {
3253 
3254         gdk_window_set_cursor(gmtk_get_window(window), NULL);
3255 
3256     } else {
3257 
3258         if (last_movement_time > 0 && currenttime.tv_sec > last_movement_time) {
3259 #ifdef GTK3_ENABLED
3260             s = cairo_image_surface_create(CAIRO_FORMAT_A1, 1, 1);
3261             cursor_pixbuf = gdk_pixbuf_get_from_surface(s, 0, 0, 1, 1);
3262             cairo_surface_destroy(s);
3263             cursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), cursor_pixbuf, 0, 0);
3264             g_object_unref(cursor_pixbuf);
3265             gdk_window_set_cursor(gmtk_get_window(window), cursor);
3266             g_object_unref(cursor);
3267 #else
3268             cursor_source = gdk_pixmap_new(NULL, 1, 1, 1);
3269             cursor = gdk_cursor_new_from_pixmap(cursor_source, cursor_source, &cursor_color, &cursor_color, 0, 0);
3270             gdk_pixmap_unref(cursor_source);
3271             gdk_window_set_cursor(gmtk_get_window(window), cursor);
3272             gdk_cursor_unref(cursor);
3273 #endif
3274         }
3275     }
3276 
3277     return FALSE;
3278 }
3279 
make_panel_and_mouse_visible(gpointer data)3280 gboolean make_panel_and_mouse_visible(gpointer data)
3281 {
3282 
3283     if (showcontrols && GTK_IS_WIDGET(controls_box)) {
3284         //gtk_widget_set_size_request(controls_box, -1, -1);
3285         //gtk_widget_show(controls_box);
3286         show_fs_controls();
3287 
3288     }
3289     gdk_window_set_cursor(gmtk_get_window(window), NULL);
3290 
3291     return FALSE;
3292 }
3293 
fs_callback(GtkWidget * widget,GdkEventExpose * event,void * data)3294 gboolean fs_callback(GtkWidget * widget, GdkEventExpose * event, void *data)
3295 {
3296     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
3297 
3298     return FALSE;
3299 }
3300 
enter_button_callback(GtkWidget * widget,GdkEventCrossing * event,gpointer data)3301 gboolean enter_button_callback(GtkWidget * widget, GdkEventCrossing * event, gpointer data)
3302 {
3303     GtkAllocation alloc;
3304 
3305     gmtk_get_allocation(widget, &alloc);
3306 
3307 #ifdef GTK3_ENABLED
3308 #else
3309     gdk_draw_rectangle(gmtk_get_window(widget), gtk_widget_get_style(widget)->fg_gc[GTK_STATE_NORMAL],
3310                        FALSE, 0, 0, alloc.width - 1, alloc.height - 1);
3311 #endif
3312     in_button = TRUE;
3313     return FALSE;
3314 }
3315 
leave_button_callback(GtkWidget * widget,GdkEventCrossing * event,gpointer data)3316 gboolean leave_button_callback(GtkWidget * widget, GdkEventCrossing * event, gpointer data)
3317 {
3318     GtkAllocation alloc;
3319 
3320     gmtk_get_allocation(widget, &alloc);
3321 #ifdef GTK3_ENABLED
3322 #else
3323     gdk_draw_rectangle(gmtk_get_window(widget), gtk_widget_get_style(widget)->bg_gc[GTK_STATE_NORMAL],
3324                        FALSE, 0, 0, alloc.width - 1, alloc.height - 1);
3325 #endif
3326     in_button = FALSE;
3327     return FALSE;
3328 }
3329 
fs_controls_entered(GtkWidget * widget,GdkEventCrossing * event,gpointer data)3330 gboolean fs_controls_entered(GtkWidget * widget, GdkEventCrossing * event, gpointer data)
3331 {
3332     mouse_over_controls = TRUE;
3333     return FALSE;
3334 }
3335 
fs_controls_left(GtkWidget * widget,GdkEventCrossing * event,gpointer data)3336 gboolean fs_controls_left(GtkWidget * widget, GdkEventCrossing * event, gpointer data)
3337 {
3338     mouse_over_controls = FALSE;
3339     return FALSE;
3340 }
3341 
3342 
menuitem_open_callback(GtkMenuItem * menuitem,void * data)3343 void menuitem_open_callback(GtkMenuItem * menuitem, void *data)
3344 {
3345 
3346     GtkWidget *dialog;
3347     GSList *filename;
3348     gchar *last_dir;
3349     gint count;
3350     GtkTreeViewColumn *column;
3351     gchar *coltitle;
3352 
3353     dialog = gtk_file_chooser_dialog_new(_("Open File"),
3354                                          GTK_WINDOW(window),
3355                                          GTK_FILE_CHOOSER_ACTION_OPEN,
3356                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3357                                          GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
3358 
3359     /*allow multiple files to be selected */
3360     gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
3361 #ifdef GIO_ENABLED
3362     gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), FALSE);
3363 #endif
3364 
3365     gtk_widget_show(dialog);
3366     gm_store = gm_pref_store_new("gnome-mplayer");
3367     last_dir = gm_pref_store_get_string(gm_store, LAST_DIR);
3368     if (last_dir != NULL && is_uri_dir(last_dir)) {
3369         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), last_dir);
3370         g_free(last_dir);
3371     }
3372     gm_pref_store_free(gm_store);
3373     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
3374 
3375         filename = gtk_file_chooser_get_uris(GTK_FILE_CHOOSER(dialog));
3376         last_dir = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER(dialog));
3377         if (last_dir != NULL && is_uri_dir(last_dir)) {
3378             gm_store = gm_pref_store_new("gnome-mplayer");
3379             gm_pref_store_set_string(gm_store, LAST_DIR, last_dir);
3380             gm_pref_store_free(gm_store);
3381             g_free(last_dir);
3382         }
3383 #ifdef LIBGDA_ENABLED
3384         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY
3385             || gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
3386 
3387             mark_uri_in_db_as_resumable(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), TRUE,
3388                                         gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
3389                                                                                ATTRIBUTE_POSITION));
3390         } else {
3391 
3392             if (gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)) != NULL) {
3393                 mark_uri_in_db_as_resumable(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), FALSE,
3394                                             0.0);
3395             }
3396         }
3397 #endif
3398 
3399         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3400             dontplaynext = TRUE;
3401         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3402         gtk_list_store_clear(playliststore);
3403 
3404         if (filename != NULL) {
3405             g_slist_foreach(filename, &add_item_to_playlist_callback, NULL);
3406             g_slist_free(filename);
3407 
3408             gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
3409             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
3410             g_idle_add(async_play_iter, &iter);
3411         }
3412     }
3413 
3414     if (GTK_IS_WIDGET(list)) {
3415         column = gtk_tree_view_get_column(GTK_TREE_VIEW(list), 0);
3416         count = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL);
3417         coltitle = g_strdup_printf(ngettext("Item to Play", "Items to Play", count));
3418         gtk_tree_view_column_set_title(column, coltitle);
3419         g_free(coltitle);
3420     }
3421     gtk_widget_destroy(dialog);
3422 
3423 }
3424 
open_location_callback(GtkWidget * widget,void * data)3425 void open_location_callback(GtkWidget * widget, void *data)
3426 {
3427     gchar *filename;
3428 
3429     filename = g_strdup(gtk_entry_get_text(GTK_ENTRY(open_location)));
3430 
3431     if (filename != NULL && strlen(filename) > 0) {
3432         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3433             dontplaynext = TRUE;
3434         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3435         gtk_list_store_clear(playliststore);
3436 
3437         if (filename != NULL) {
3438 
3439             playlist = detect_playlist(filename);
3440 
3441             if (!playlist) {
3442                 add_item_to_playlist(filename, playlist);
3443             } else {
3444                 if (!parse_playlist(filename)) {
3445                     add_item_to_playlist(filename, playlist);
3446                 }
3447 
3448             }
3449 
3450             g_free(filename);
3451             gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
3452             gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3453             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_NETWORK);
3454             g_idle_add(async_play_iter, &iter);
3455         }
3456     }
3457     if (GTK_IS_WIDGET(widget))
3458         gtk_widget_destroy(widget);
3459 }
3460 
menuitem_open_location_callback(GtkMenuItem * menuitem,void * data)3461 void menuitem_open_location_callback(GtkMenuItem * menuitem, void *data)
3462 {
3463     GtkWidget *open_window;
3464     GtkWidget *vbox;
3465     GtkWidget *item_box;
3466     GtkWidget *label;
3467     GtkWidget *button_box;
3468     GtkWidget *cancel_button;
3469     GtkWidget *open_button;
3470 
3471     open_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3472     gtk_window_set_type_hint(GTK_WINDOW(open_window), GDK_WINDOW_TYPE_HINT_UTILITY);
3473     gtk_window_set_resizable(GTK_WINDOW(open_window), FALSE);
3474     gtk_window_set_transient_for(GTK_WINDOW(open_window), GTK_WINDOW(window));
3475     gtk_window_set_position(GTK_WINDOW(open_window), GTK_WIN_POS_CENTER_ON_PARENT);
3476     gtk_window_set_icon(GTK_WINDOW(open_window), pb_icon);
3477 
3478     gtk_window_set_resizable(GTK_WINDOW(open_window), FALSE);
3479     gtk_window_set_title(GTK_WINDOW(open_window), _("Open Location"));
3480 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
3481     vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
3482     gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
3483 #else
3484     vbox = gtk_vbox_new(FALSE, 6);
3485 #endif
3486     label = gtk_label_new(_("Location:"));
3487     open_location = gtk_entry_new();
3488     gtk_entry_set_width_chars(GTK_ENTRY(open_location), 50);
3489     gtk_entry_set_activates_default(GTK_ENTRY(open_location), TRUE);
3490 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
3491     item_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
3492     gtk_box_set_homogeneous(GTK_BOX(item_box), FALSE);
3493 #else
3494     item_box = gtk_hbox_new(FALSE, 6);
3495 #endif
3496     gtk_box_pack_start(GTK_BOX(item_box), label, FALSE, FALSE, 12);
3497     gtk_box_pack_end(GTK_BOX(item_box), open_location, TRUE, TRUE, 0);
3498 
3499 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
3500     button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
3501     gtk_box_set_homogeneous(GTK_BOX(button_box), FALSE);
3502 #else
3503     button_box = gtk_hbox_new(FALSE, 6);
3504 #endif
3505     cancel_button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
3506     open_button = gtk_button_new_from_stock(GTK_STOCK_OPEN);
3507 #ifdef GTK2_22_ENABLED
3508     gtk_widget_set_can_default(open_button, TRUE);
3509 #else
3510     GTK_WIDGET_SET_FLAGS(open_button, GTK_CAN_DEFAULT);
3511 #endif
3512     gtk_box_pack_end(GTK_BOX(button_box), open_button, FALSE, FALSE, 0);
3513     gtk_box_pack_end(GTK_BOX(button_box), cancel_button, FALSE, FALSE, 0);
3514 
3515     g_signal_connect_swapped(G_OBJECT(cancel_button), "clicked", G_CALLBACK(config_close), open_window);
3516     g_signal_connect_swapped(G_OBJECT(open_button), "clicked", G_CALLBACK(open_location_callback), open_window);
3517 
3518     gtk_container_add(GTK_CONTAINER(vbox), item_box);
3519     gtk_container_add(GTK_CONTAINER(vbox), button_box);
3520     gtk_container_add(GTK_CONTAINER(open_window), vbox);
3521     gtk_widget_show_all(open_window);
3522     gtk_window_set_transient_for(GTK_WINDOW(open_window), GTK_WINDOW(window));
3523     gtk_window_set_keep_above(GTK_WINDOW(open_window), keep_on_top);
3524     gtk_window_present(GTK_WINDOW(open_window));
3525     gtk_widget_grab_default(open_button);
3526 
3527 }
3528 
3529 
menuitem_open_dvd_callback(GtkMenuItem * menuitem,void * data)3530 void menuitem_open_dvd_callback(GtkMenuItem * menuitem, void *data)
3531 {
3532     gtk_list_store_clear(playliststore);
3533     if (idledata->device != NULL) {
3534         g_free(idledata->device);
3535         idledata->device = NULL;
3536     }
3537     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3538     parse_dvd("dvd://");
3539 
3540     if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3541         play_iter(&iter, 0);
3542     }
3543 }
3544 
menuitem_open_dvd_folder_callback(GtkMenuItem * menuitem,void * data)3545 void menuitem_open_dvd_folder_callback(GtkMenuItem * menuitem, void *data)
3546 {
3547     GtkWidget *dialog;
3548     gchar *last_dir;
3549 
3550     dialog = gtk_file_chooser_dialog_new(_("Choose Disk Directory"),
3551                                          GTK_WINDOW(window),
3552                                          GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
3553                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3554                                          GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
3555     gtk_widget_show(dialog);
3556     gm_store = gm_pref_store_new("gnome-mplayer");
3557     last_dir = gm_pref_store_get_string(gm_store, LAST_DIR);
3558     if (last_dir != NULL && is_uri_dir(last_dir)) {
3559         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), last_dir);
3560         g_free(last_dir);
3561     }
3562     gm_pref_store_free(gm_store);
3563 
3564     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
3565 
3566         gtk_list_store_clear(playliststore);
3567         idledata->device = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
3568 
3569         parse_dvd("dvd://");
3570 
3571         if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3572             play_iter(&iter, 0);
3573         }
3574     }
3575     if (GTK_IS_WIDGET(dialog))
3576         gtk_widget_destroy(dialog);
3577 
3578 }
3579 
menuitem_open_dvd_iso_callback(GtkMenuItem * menuitem,void * data)3580 void menuitem_open_dvd_iso_callback(GtkMenuItem * menuitem, void *data)
3581 {
3582     GtkWidget *dialog;
3583     gchar *last_dir;
3584     GtkFileFilter *filter;
3585 
3586     dialog = gtk_file_chooser_dialog_new(_("Choose Disk Image"),
3587                                          GTK_WINDOW(window),
3588                                          GTK_FILE_CHOOSER_ACTION_OPEN,
3589                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3590                                          GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
3591     gtk_widget_show(dialog);
3592     gm_store = gm_pref_store_new("gnome-mplayer");
3593     last_dir = gm_pref_store_get_string(gm_store, LAST_DIR);
3594     if (last_dir != NULL && is_uri_dir(last_dir)) {
3595         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), last_dir);
3596         g_free(last_dir);
3597     }
3598     gm_pref_store_free(gm_store);
3599     filter = gtk_file_filter_new();
3600     gtk_file_filter_set_name(filter, _("Disk Image (*.iso)"));
3601     gtk_file_filter_add_pattern(filter, "*.iso");
3602     gtk_file_filter_add_pattern(filter, "*.ISO");
3603     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
3604 
3605     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
3606 
3607         gtk_list_store_clear(playliststore);
3608         idledata->device = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
3609 
3610         parse_dvd("dvd://");
3611 
3612         if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3613             play_iter(&iter, 0);
3614         }
3615     }
3616     if (GTK_IS_WIDGET(dialog))
3617         gtk_widget_destroy(dialog);
3618 
3619 }
3620 
menuitem_open_dvdnav_callback(GtkMenuItem * menuitem,void * data)3621 void menuitem_open_dvdnav_callback(GtkMenuItem * menuitem, void *data)
3622 {
3623     gtk_list_store_clear(playliststore);
3624     if (idledata->device != NULL) {
3625         g_free(idledata->device);
3626         idledata->device = NULL;
3627     }
3628     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3629     add_item_to_playlist("dvdnav://", FALSE);
3630     gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
3631     gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_DVD);
3632     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MEDIA_DEVICE, mplayer_dvd_device);
3633     g_idle_add(async_play_iter, &iter);
3634     gtk_widget_show(menu_event_box);
3635 }
3636 
menuitem_open_dvdnav_folder_callback(GtkMenuItem * menuitem,void * data)3637 void menuitem_open_dvdnav_folder_callback(GtkMenuItem * menuitem, void *data)
3638 {
3639     GtkWidget *dialog;
3640     gchar *last_dir;
3641 
3642     dialog = gtk_file_chooser_dialog_new(_("Choose Disk Directory"),
3643                                          GTK_WINDOW(window),
3644                                          GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
3645                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3646                                          GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
3647     gtk_widget_show(dialog);
3648     gm_store = gm_pref_store_new("gnome-mplayer");
3649     last_dir = gm_pref_store_get_string(gm_store, LAST_DIR);
3650     if (last_dir != NULL && is_uri_dir(last_dir)) {
3651         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), last_dir);
3652         g_free(last_dir);
3653     }
3654     gm_pref_store_free(gm_store);
3655 
3656     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
3657 
3658         gtk_list_store_clear(playliststore);
3659         idledata->device = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
3660 
3661         add_item_to_playlist("dvdnav://", FALSE);
3662         gtk_widget_show(menu_event_box);
3663 
3664         if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3665             gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3666             gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MEDIA_DEVICE, idledata->device);
3667             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_DVD);
3668             g_idle_add(async_play_iter, &iter);
3669         }
3670     }
3671     if (GTK_IS_WIDGET(dialog))
3672         gtk_widget_destroy(dialog);
3673 
3674 }
3675 
menuitem_open_dvdnav_iso_callback(GtkMenuItem * menuitem,void * data)3676 void menuitem_open_dvdnav_iso_callback(GtkMenuItem * menuitem, void *data)
3677 {
3678     GtkWidget *dialog;
3679     gchar *last_dir;
3680     GtkFileFilter *filter;
3681 
3682     dialog = gtk_file_chooser_dialog_new(_("Choose Disk Image"),
3683                                          GTK_WINDOW(window),
3684                                          GTK_FILE_CHOOSER_ACTION_OPEN,
3685                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3686                                          GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
3687     gtk_widget_show(dialog);
3688     gm_store = gm_pref_store_new("gnome-mplayer");
3689     last_dir = gm_pref_store_get_string(gm_store, LAST_DIR);
3690     if (last_dir != NULL && is_uri_dir(last_dir)) {
3691         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), last_dir);
3692         g_free(last_dir);
3693     }
3694     gm_pref_store_free(gm_store);
3695     filter = gtk_file_filter_new();
3696     gtk_file_filter_set_name(filter, _("Disk Image (*.iso)"));
3697     gtk_file_filter_add_pattern(filter, "*.iso");
3698     gtk_file_filter_add_pattern(filter, "*.ISO");
3699     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
3700 
3701     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
3702 
3703         gtk_list_store_clear(playliststore);
3704         idledata->device = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
3705 
3706         add_item_to_playlist("dvdnav://", FALSE);
3707         gtk_widget_show(menu_event_box);
3708 
3709         if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3710             gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3711             gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MEDIA_DEVICE, idledata->device);
3712             gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_DVD);
3713             g_idle_add(async_play_iter, &iter);
3714         }
3715     }
3716     if (GTK_IS_WIDGET(dialog))
3717         gtk_widget_destroy(dialog);
3718 
3719 }
3720 
menuitem_open_acd_callback(GtkMenuItem * menuitem,void * data)3721 void menuitem_open_acd_callback(GtkMenuItem * menuitem, void *data)
3722 {
3723     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3724         dontplaynext = TRUE;
3725     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3726     gtk_list_store_clear(playliststore);
3727     parse_playlist("cdda://");
3728 
3729     if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3730         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3731         gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MEDIA_DEVICE, mplayer_dvd_device);
3732         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_CD);
3733         g_idle_add(async_play_iter, &iter);
3734     }
3735 
3736 }
3737 
menuitem_open_vcd_callback(GtkMenuItem * menuitem,void * data)3738 void menuitem_open_vcd_callback(GtkMenuItem * menuitem, void *data)
3739 {
3740     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3741         dontplaynext = TRUE;
3742     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3743     gtk_list_store_clear(playliststore);
3744     parse_playlist("vcd://");
3745 
3746     if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3747         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3748         gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_MEDIA_DEVICE, mplayer_dvd_device);
3749         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_VCD);
3750         g_idle_add(async_play_iter, &iter);
3751     }
3752 
3753 }
3754 
menuitem_open_atv_callback(GtkMenuItem * menuitem,void * data)3755 void menuitem_open_atv_callback(GtkMenuItem * menuitem, void *data)
3756 {
3757     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3758         dontplaynext = TRUE;
3759     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3760     gtk_list_store_clear(playliststore);
3761     add_item_to_playlist("tv://", FALSE);
3762 
3763     if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter)) {
3764         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3765         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_TV);
3766         g_idle_add(async_play_iter, &iter);
3767     }
3768 }
3769 
menuitem_open_recent_callback(GtkRecentChooser * chooser,gpointer data)3770 void menuitem_open_recent_callback(GtkRecentChooser * chooser, gpointer data)
3771 {
3772     gboolean playlist = FALSE;
3773     gchar *uri;
3774     gint count;
3775     GtkTreeViewColumn *column;
3776     gchar *coltitle;
3777 
3778 #ifdef LIBGDA_ENABLED
3779     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY
3780         || gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
3781 
3782         mark_uri_in_db_as_resumable(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), TRUE,
3783                                     gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
3784                                                                            ATTRIBUTE_POSITION));
3785     } else {
3786 
3787         if (gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)) != NULL) {
3788             mark_uri_in_db_as_resumable(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), FALSE, 0.0);
3789         }
3790     }
3791 #endif
3792 
3793     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3794         dontplaynext = TRUE;
3795     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3796     gtk_list_store_clear(playliststore);
3797 
3798     uri = gtk_recent_chooser_get_current_uri(chooser);
3799     if (uri != NULL) {
3800         if (playlist == FALSE)
3801             playlist = detect_playlist(uri);
3802 
3803         if (!playlist) {
3804             add_item_to_playlist(uri, playlist);
3805         } else {
3806             if (!parse_playlist(uri)) {
3807                 add_item_to_playlist(uri, playlist);
3808             }
3809         }
3810     }
3811 
3812     gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
3813 
3814     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
3815         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3816             dontplaynext = TRUE;
3817         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3818         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_FILE);
3819         g_idle_add(async_play_iter, &iter);
3820     }
3821 
3822     if (GTK_IS_WIDGET(list)) {
3823         column = gtk_tree_view_get_column(GTK_TREE_VIEW(list), 0);
3824         count = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL);
3825         coltitle = g_strdup_printf(ngettext("Item to Play", "Items to Play", count));
3826         gtk_tree_view_column_set_title(column, coltitle);
3827         g_free(coltitle);
3828     }
3829 }
3830 
3831 #ifdef GTK2_12_ENABLED
recent_manager_changed_callback(GtkRecentManager * recent_manager,gpointer data)3832 void recent_manager_changed_callback(GtkRecentManager * recent_manager, gpointer data)
3833 {
3834     GtkRecentFilter *recent_filter;
3835 
3836     if (GTK_IS_WIDGET(menuitem_file_recent_items))
3837         gtk_widget_destroy(menuitem_file_recent_items);
3838     menuitem_file_recent_items = gtk_recent_chooser_menu_new();
3839     recent_filter = gtk_recent_filter_new();
3840     gtk_recent_filter_add_application(recent_filter, "gnome-mplayer");
3841     gtk_recent_chooser_add_filter(GTK_RECENT_CHOOSER(menuitem_file_recent_items), recent_filter);
3842     gtk_recent_chooser_set_show_tips(GTK_RECENT_CHOOSER(menuitem_file_recent_items), TRUE);
3843     gtk_recent_chooser_set_sort_type(GTK_RECENT_CHOOSER(menuitem_file_recent_items), GTK_RECENT_SORT_MRU);
3844     gtk_menu_item_set_submenu(menuitem_file_recent, menuitem_file_recent_items);
3845     g_signal_connect(G_OBJECT(menuitem_file_recent_items), "item-activated",
3846                      G_CALLBACK(menuitem_open_recent_callback), NULL);
3847 #ifdef GIO_ENABLED
3848     gtk_recent_chooser_set_local_only(GTK_RECENT_CHOOSER(menuitem_file_recent_items), FALSE);
3849 #endif
3850 }
3851 #endif
3852 
parseChannels(FILE * f)3853 void parseChannels(FILE * f)
3854 {
3855     gint parsing = 0, i = 0, firstW = 0, firstP = 0;
3856     gchar ch, s[256];
3857     gchar *strout;
3858 
3859     while (parsing == 0) {
3860         ch = (char) fgetc(f);   // Read in the next character
3861         if ((int) ch != EOF) {
3862             // If the line is empty or commented, we want to skip it.
3863             if (((ch == '\n') && (i == 0)) || ((ch == '#') && (i == 0))) {
3864                 firstW++;
3865                 firstP++;
3866             }
3867             if ((ch != ':') && (firstW == 0) && i < 255) {
3868                 s[i] = ch;
3869                 i++;
3870             } else {
3871                 if ((ch == ':') && (firstP == 0)) {
3872                     s[i] = '\0';
3873                     strout = g_strdup_printf("dvb://%s", s);
3874                     add_item_to_playlist(strout, FALSE);        //add to playlist
3875                     g_free(strout);
3876                     i = 0;
3877                     firstW++;
3878                     firstP++;
3879                 }
3880                 if (ch == '\n') {
3881                     firstW = 0;
3882                     firstP = 0;
3883                 }
3884             }
3885         } else
3886             parsing++;
3887     }                           //END while
3888 }                               //END parseChannels
3889 
menuitem_open_dtv_callback(GtkMenuItem * menuitem,void * data)3890 void menuitem_open_dtv_callback(GtkMenuItem * menuitem, void *data)
3891 {
3892     FILE *fi;                   // FILE pointer to use to open the conf file
3893     gchar *mpconf;
3894 
3895     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_UNKNOWN)
3896         dontplaynext = TRUE;
3897     gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3898     gtk_list_store_clear(playliststore);
3899 
3900     mpconf = g_strdup_printf("%s/.mplayer/channels.conf", g_getenv("HOME"));
3901     fi = fopen(mpconf, "r");    // Make sure this is pointing to
3902     // the appropriate file
3903     if (fi != NULL) {
3904         parseChannels(fi);
3905         fclose(fi);
3906     } else {
3907         gm_log(verbose, G_LOG_LEVEL_MESSAGE, "Unable to open the config file"); //can change this to whatever error message system is used
3908     }
3909     g_free(mpconf);
3910 
3911     gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
3912     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
3913         gmtk_media_player_set_state(GMTK_MEDIA_PLAYER(media), MEDIA_STATE_QUIT);
3914         gmtk_media_player_set_media_type(GMTK_MEDIA_PLAYER(media), TYPE_TV);
3915         g_idle_add(async_play_iter, &iter);
3916     }
3917 }
3918 
3919 #ifdef HAVE_GPOD
menuitem_open_ipod_callback(GtkMenuItem * menuitem,void * data)3920 void menuitem_open_ipod_callback(GtkMenuItem * menuitem, void *data)
3921 {
3922     gpod_mount_point = find_gpod_mount_point();
3923     gm_log(verbose, G_LOG_LEVEL_DEBUG, "mount point is %s", gpod_mount_point);
3924     if (gpod_mount_point != NULL) {
3925         gpod_load_tracks(gpod_mount_point);
3926     } else {
3927         gm_log(verbose, G_LOG_LEVEL_MESSAGE, "Unable to find gpod mount point");
3928     }
3929 }
3930 #endif
3931 
menuitem_save_callback(GtkMenuItem * menuitem,void * data)3932 void menuitem_save_callback(GtkMenuItem * menuitem, void *data)
3933 {
3934     // save dialog
3935     GtkWidget *file_chooser_save;
3936     GtkWidget *dialog;
3937     gchar *filename;
3938     gchar *srcfilename;
3939     FILE *fin;
3940     FILE *fout;
3941     char buffer[1000];
3942     gint count;
3943     gchar *default_name;
3944     gchar *uri;
3945     gchar *msg;
3946     gboolean save_file = TRUE;
3947 
3948     file_chooser_save = gtk_file_chooser_dialog_new(_("Save As..."),
3949                                                     GTK_WINDOW(window),
3950                                                     GTK_FILE_CHOOSER_ACTION_SAVE,
3951                                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3952                                                     GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
3953 
3954     uri = g_strdup(idledata->url);
3955     default_name = g_strrstr(uri, "/");
3956     if (default_name == NULL) {
3957         default_name = uri;
3958     } else {
3959         default_name += sizeof(gchar);
3960     }
3961     g_strlcpy(buffer, default_name, 1000);
3962     while (g_strrstr(buffer, "&") != NULL) {
3963         default_name = g_strrstr(buffer, "&");
3964         default_name[0] = '\0';
3965     }
3966     g_free(uri);
3967 
3968     gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(file_chooser_save), buffer);
3969 
3970     if (gtk_dialog_run(GTK_DIALOG(file_chooser_save)) == GTK_RESPONSE_ACCEPT) {
3971         filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser_save));
3972 
3973         srcfilename = g_filename_from_uri(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), NULL, NULL);
3974         gm_log(verbose, G_LOG_LEVEL_INFO, "Copy %s to %s", srcfilename, filename);
3975 
3976         if (g_file_test(filename, G_FILE_TEST_EXISTS) == TRUE) {
3977 
3978             dialog = gtk_message_dialog_new(GTK_WINDOW(window),
3979                                             GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
3980                                             GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Overwrite %s"), filename);
3981             if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_NO) {
3982                 save_file = FALSE;
3983             }
3984             gtk_widget_destroy(dialog);
3985         }
3986 
3987         if (save_file) {
3988 
3989             fin = g_fopen(srcfilename, "rb");
3990             fout = g_fopen(filename, "wb");
3991 
3992             if (fin != NULL && fout != NULL) {
3993                 while (!feof(fin)) {
3994                     count = fread(buffer, 1, 1000, fin);
3995                     fwrite(buffer, 1, count, fout);
3996                 }
3997                 fclose(fout);
3998                 fclose(fin);
3999             } else {
4000                 msg = g_strdup_printf(_("Unable to save ' %s '"), filename);
4001                 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
4002                                                 GTK_BUTTONS_CLOSE, "%s", msg);
4003                 gtk_window_set_title(GTK_WINDOW(dialog), _("GNOME MPlayer Error"));
4004                 gtk_dialog_run(GTK_DIALOG(dialog));
4005                 gtk_widget_destroy(dialog);
4006                 g_free(msg);
4007             }
4008         }
4009 
4010         g_free(filename);
4011         g_free(srcfilename);
4012     }
4013 
4014     gtk_widget_destroy(file_chooser_save);
4015 
4016 }
4017 
4018 
4019 
menuitem_quit_callback(GtkMenuItem * menuitem,void * data)4020 void menuitem_quit_callback(GtkMenuItem * menuitem, void *data)
4021 {
4022     delete_callback(NULL, NULL, NULL);
4023     gtk_widget_destroy(window);
4024 }
4025 
menuitem_prev_callback(GtkMenuItem * menuitem,void * data)4026 void menuitem_prev_callback(GtkMenuItem * menuitem, void *data)
4027 {
4028     prev_callback(NULL, NULL, NULL);
4029 }
4030 
menuitem_next_callback(GtkMenuItem * menuitem,void * data)4031 void menuitem_next_callback(GtkMenuItem * menuitem, void *data)
4032 {
4033     next_callback(NULL, NULL, NULL);
4034 }
4035 
about_url_hook(GtkAboutDialog * about,const char * link,gpointer data)4036 void about_url_hook(GtkAboutDialog * about, const char *link, gpointer data)
4037 {
4038 #ifdef GTK2_14_ENABLED
4039     GError *error = NULL;
4040 
4041     if (!gtk_show_uri(gtk_widget_get_screen(GTK_WIDGET(about)), link, gtk_get_current_event_time(), &error)) {
4042         g_error_free(error);
4043     }
4044 #endif
4045 }
4046 
menuitem_about_callback(GtkMenuItem * menuitem,void * data)4047 void menuitem_about_callback(GtkMenuItem * menuitem, void *data)
4048 {
4049     gchar *authors[] = { "Kevin DeKorte", "James Carthew", "Diogo Franco", "Icons provided by Victor Castillejo",
4050         NULL
4051     };
4052 #ifdef GTK2_14_ENABLED
4053 #ifndef GTK2_24_ENABLED
4054     gtk_about_dialog_set_url_hook(about_url_hook, NULL, NULL);
4055 #endif
4056 #endif
4057     gtk_show_about_dialog(GTK_WINDOW(window), "name", _("GNOME MPlayer"), "authors", authors,
4058                           "copyright", "Copyright © 2007-2011 Kevin DeKorte", "comments",
4059                           _("A media player for GNOME that uses MPlayer"), "version", VERSION,
4060                           "license",
4061                           _
4062                           ("Gnome MPlayer is free software; you can redistribute it and/or modify it under\nthe terms of the GNU General Public License as published by the Free\nSoftware Foundation; either version 2 of the License, or (at your option)\nany later version."
4063                            "\n\nGnome MPlayer is distributed in the hope that it will be useful, but WITHOUT\nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\nFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\nmore details."
4064                            "\n\nYou should have received a copy of the GNU General Public License along with\nGnome MPlayer if not, write to the\n\nFree Software Foundation, Inc.,\n51 Franklin St, Fifth Floor\nBoston, MA 02110-1301 USA")
4065 
4066 
4067                           ,
4068                           "website", "http://code.google.com/p/gnome-mplayer/",
4069                           "translator-credits",
4070                           "Bulgarian - Adrian Dimitrov\n"
4071                           "Czech - Petr Pisar\n"
4072                           "Chinese (simplified) - Wenzheng Hu\n"
4073                           "Chinese (Hong Kong) - Hialan Liu\n"
4074                           "Chinese (Taiwan) - Hailan Liu\n"
4075                           "Dutch - Mark Huijgen\n"
4076                           "Finnish - Kristian Polso &amp; Tuomas Lähteenmäki\n"
4077                           "French - Alexandre Bedot\n"
4078                           "German - Tim Buening\n"
4079                           "Greek - Γεώργιος Γεωργάς\n"
4080                           "Hungarian - Kulcsár Kázmér\n"
4081                           "Italian - Cesare Tirabassi\n"
4082                           "Japanese - Munehiro Yamamoto\n"
4083                           "Korean - ByeongSik Jeon\n"
4084                           "Lithuanian - Mindaugas B.\n"
4085                           "Polish - Julian Sikorski\n"
4086                           "Portugese - LL and Sérgio Marques\n"
4087                           "Russian - Dmitry Stropaloff and Denis Koryavov\n"
4088                           "Serbian - Милош Поповић\n"
4089                           "Spanish - Festor Wailon Dacoba\n"
4090                           "Swedish - Daniel Nylander\n" "Turkish - Onur Küçük", NULL);
4091 }
4092 
menuitem_play_callback(GtkMenuItem * menuitem,void * data)4093 void menuitem_play_callback(GtkMenuItem * menuitem, void *data)
4094 {
4095     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_PLAY)
4096         play_callback(GTK_WIDGET(menuitem), NULL, NULL);
4097 }
4098 
menuitem_pause_callback(GtkMenuItem * menuitem,void * data)4099 void menuitem_pause_callback(GtkMenuItem * menuitem, void *data)
4100 {
4101     pause_callback(GTK_WIDGET(menuitem), NULL, NULL);
4102 }
4103 
menuitem_stop_callback(GtkMenuItem * menuitem,void * data)4104 void menuitem_stop_callback(GtkMenuItem * menuitem, void *data)
4105 {
4106     stop_callback(GTK_WIDGET(menuitem), NULL, NULL);
4107 }
4108 
menuitem_edit_random_callback(GtkMenuItem * menuitem,void * data)4109 void menuitem_edit_random_callback(GtkMenuItem * menuitem, void *data)
4110 {
4111     GtkTreePath *path;
4112     gchar *iterfilename = NULL;
4113     gchar *localfilename = NULL;
4114 
4115     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
4116         gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, ITEM_COLUMN, &iterfilename, -1);
4117     }
4118 
4119     gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(playliststore), -2, GTK_SORT_ASCENDING);
4120 
4121     random_order = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_edit_random));
4122     if (random_order) {
4123         randomize_playlist(playliststore);
4124     } else {
4125         reset_playlist_order(playliststore);
4126     }
4127 
4128     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
4129         if (GTK_IS_TREE_SELECTION(selection)) {
4130             gtk_tree_model_get_iter_first(GTK_TREE_MODEL(playliststore), &iter);
4131             if (iterfilename != NULL) {
4132                 do {
4133                     gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, ITEM_COLUMN, &localfilename, -1);
4134                     gm_log(verbose, G_LOG_LEVEL_DEBUG, "iter = %s   local = %s", iterfilename, localfilename);
4135                     if (g_ascii_strcasecmp(iterfilename, localfilename) == 0) {
4136                         // we found the current iter
4137                         g_free(localfilename);
4138                         break;
4139                     }
4140                     g_free(localfilename);
4141                 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(playliststore), &iter));
4142                 g_free(iterfilename);
4143             }
4144             path = gtk_tree_model_get_path(GTK_TREE_MODEL(playliststore), &iter);
4145             gtk_tree_selection_select_path(selection, path);
4146             if (GTK_IS_WIDGET(list))
4147                 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list), path, NULL, FALSE, 0, 0);
4148             gtk_tree_path_free(path);
4149         }
4150     }
4151 }
4152 
menuitem_edit_loop_callback(GtkMenuItem * menuitem,void * data)4153 void menuitem_edit_loop_callback(GtkMenuItem * menuitem, void *data)
4154 {
4155     loop = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_edit_loop));
4156 }
4157 
menuitem_view_info_callback(GtkMenuItem * menuitem,void * data)4158 void menuitem_view_info_callback(GtkMenuItem * menuitem, void *data)
4159 {
4160 
4161     if (GTK_IS_WIDGET(media_hbox)) {
4162 #ifdef GTK2_20_ENABLED
4163         if (!gtk_widget_get_realized(media_hbox))
4164             gtk_widget_realize(media_hbox);
4165 #else
4166         if (!GTK_WIDGET_REALIZED(media_hbox))
4167             gtk_widget_realize(media_hbox);
4168 #endif
4169         g_idle_add(set_adjust_layout, NULL);
4170         // adjust_layout();
4171     }
4172 
4173 }
4174 
menuitem_view_fullscreen_callback(GtkMenuItem * menuitem,void * data)4175 void menuitem_view_fullscreen_callback(GtkMenuItem * menuitem, void *data)
4176 {
4177     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen), !fullscreen);
4178 }
4179 
menuitem_view_onetoone_callback(GtkMenuItem * menuitem,void * data)4180 void menuitem_view_onetoone_callback(GtkMenuItem * menuitem, void *data)
4181 {
4182     IdleData *idle = (IdleData *) data;
4183 
4184     idle->width = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_WIDTH);
4185     idle->height = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HEIGHT);
4186     non_fs_width = 0;
4187     non_fs_height = 0;
4188     resize_window(idle);
4189 
4190 }
4191 
menuitem_view_twotoone_callback(GtkMenuItem * menuitem,void * data)4192 void menuitem_view_twotoone_callback(GtkMenuItem * menuitem, void *data)
4193 {
4194     IdleData *idle = (IdleData *) data;
4195 
4196     idle->width = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_WIDTH) * 2;
4197     idle->height = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HEIGHT) * 2;
4198     non_fs_width = 0;
4199     non_fs_height = 0;
4200     resize_window(idle);
4201 }
4202 
menuitem_view_onetoonepointfive_callback(GtkMenuItem * menuitem,void * data)4203 void menuitem_view_onetoonepointfive_callback(GtkMenuItem * menuitem, void *data)
4204 {
4205     IdleData *idle = (IdleData *) data;
4206 
4207     idle->width = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_WIDTH) * 1.5;
4208     idle->height = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HEIGHT) * 1.5;
4209     non_fs_width = 0;
4210     non_fs_height = 0;
4211     resize_window(idle);
4212 }
4213 
menuitem_view_onetotwo_callback(GtkMenuItem * menuitem,void * data)4214 void menuitem_view_onetotwo_callback(GtkMenuItem * menuitem, void *data)
4215 {
4216     IdleData *idle = (IdleData *) data;
4217 
4218     idle->width = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_WIDTH) / 2;
4219     idle->height = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HEIGHT) / 2;
4220     non_fs_width = 0;
4221     non_fs_height = 0;
4222     resize_window(idle);
4223 }
4224 
menuitem_view_controls_callback(GtkMenuItem * menuitem,void * data)4225 void menuitem_view_controls_callback(GtkMenuItem * menuitem, void *data)
4226 {
4227     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols),
4228                                    !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols)));
4229 }
4230 
menuitem_view_subtitles_callback(GtkMenuItem * menuitem,void * data)4231 void menuitem_view_subtitles_callback(GtkMenuItem * menuitem, void *data)
4232 {
4233     gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE,
4234                                             gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM
4235                                                                            (menuitem_view_subtitles)));
4236 
4237     //    g_strdup_printf("set_property sub_forced_only %i\n",
4238     //                    !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_subtitles)));
4239 
4240 }
4241 
4242 //      Switch Audio Streams
menuitem_edit_switch_audio_callback(GtkMenuItem * menuitem,void * data)4243 void menuitem_edit_switch_audio_callback(GtkMenuItem * menuitem, void *data)
4244 {
4245     gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SWITCH_AUDIO);
4246 }
4247 
menuitem_edit_set_audiofile_callback(GtkMenuItem * menuitem,void * data)4248 void menuitem_edit_set_audiofile_callback(GtkMenuItem * menuitem, void *data)
4249 {
4250     gchar *audiofile = NULL;
4251     GtkWidget *dialog;
4252     gchar *path;
4253     gchar *item;
4254     gchar *p;
4255 
4256     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
4257         gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, ITEM_COLUMN, &item, -1);
4258 
4259         path = g_strdup(item);
4260         p = g_strrstr(path, "/");
4261         if (p != NULL)
4262             p[1] = '\0';
4263 
4264         dialog = gtk_file_chooser_dialog_new(_("Set AudioFile"),
4265                                              GTK_WINDOW(window),
4266                                              GTK_FILE_CHOOSER_ACTION_OPEN,
4267                                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4268                                              GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
4269         gtk_widget_show(dialog);
4270         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), path);
4271         if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
4272             audiofile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
4273             gtk_list_store_set(playliststore, &iter, AUDIOFILE_COLUMN, audiofile, -1);
4274             gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_TRACK_FILE, audiofile);
4275         }
4276         gtk_widget_destroy(dialog);
4277 
4278         if (audiofile != NULL) {
4279             gmtk_media_player_restart(GMTK_MEDIA_PLAYER(media));
4280         }
4281     }
4282 }
4283 
menuitem_edit_set_subtitle_callback(GtkMenuItem * menuitem,void * data)4284 void menuitem_edit_set_subtitle_callback(GtkMenuItem * menuitem, void *data)
4285 {
4286     gchar *subtitle = NULL;
4287     GtkWidget *dialog;
4288     gchar *path;
4289     gchar *item;
4290     gchar *p;
4291 
4292     if (gtk_list_store_iter_is_valid(playliststore, &iter)) {
4293         gtk_tree_model_get(GTK_TREE_MODEL(playliststore), &iter, ITEM_COLUMN, &item, -1);
4294 
4295         path = g_strdup(item);
4296         p = g_strrstr(path, "/");
4297         if (p != NULL)
4298             p[1] = '\0';
4299 
4300         dialog = gtk_file_chooser_dialog_new(_("Set Subtitle"),
4301                                              GTK_WINDOW(window),
4302                                              GTK_FILE_CHOOSER_ACTION_OPEN,
4303                                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
4304                                              GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
4305         gtk_widget_show(dialog);
4306         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), path);
4307         if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
4308             subtitle = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
4309             gtk_list_store_set(playliststore, &iter, SUBTITLE_COLUMN, subtitle, -1);
4310         }
4311         gtk_widget_destroy(dialog);
4312 
4313         if (subtitle != NULL) {
4314             gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_FILE, subtitle);
4315         }
4316     }
4317 }
4318 
4319 //      Take Screenshot
menuitem_edit_take_screenshot_callback(GtkMenuItem * menuitem,void * data)4320 void menuitem_edit_take_screenshot_callback(GtkMenuItem * menuitem, void *data)
4321 {
4322     gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_TAKE_SCREENSHOT);
4323 }
4324 
menuitem_fs_callback(GtkMenuItem * menuitem,void * data)4325 void menuitem_fs_callback(GtkMenuItem * menuitem, void *data)
4326 {
4327     GdkScreen *screen;
4328     GdkRectangle rect;
4329     gint wx, wy;
4330     static gboolean restore_playlist;
4331     static gboolean restore_details;
4332     static gboolean restore_meter;
4333     static gboolean restore_info;
4334 
4335     if (GTK_CHECK_MENU_ITEM(menuitem) == GTK_CHECK_MENU_ITEM(menuitem_view_fullscreen)) {
4336         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen),
4337                                        gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_fullscreen)));
4338         return;
4339     } else {
4340         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_fullscreen),
4341                                        gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_fullscreen)));
4342     }
4343 
4344     if (fullscreen) {
4345         hide_fs_controls();
4346 
4347         if (embed_window == 0) {
4348             skip_fixed_allocation_on_show = TRUE;
4349             gtk_window_unfullscreen(GTK_WINDOW(window));
4350         } else {
4351 #ifdef GTK2_20_ENABLED
4352             if (gtk_widget_get_mapped(window))
4353                 gtk_widget_unmap(window);
4354 #else
4355             if (GTK_WIDGET_MAPPED(window))
4356                 gtk_widget_unmap(window);
4357 #endif
4358 #ifdef GTK2_24_ENABLED
4359             gdk_window_reparent(gmtk_get_window(window),
4360                                 gdk_x11_window_lookup_for_display(gdk_display_get_default(), embed_window), 0, 0);
4361 #else
4362             gdk_window_reparent(gmtk_get_window(window), gdk_window_lookup(embed_window), 0, 0);
4363 #endif
4364             gtk_widget_map(window);
4365             gtk_window_move(GTK_WINDOW(window), 0, 0);
4366             gdk_window_resize(gmtk_get_window(window), window_x, window_y - 1);
4367             if (window_x > 0 && window_y > 0)
4368                 gtk_window_resize(GTK_WINDOW(window), window_x, window_y);
4369             if (window_x < 250) {
4370                 gtk_widget_hide(fs_event_box);
4371             }
4372             if (window_x < 170) {
4373                 gtk_widget_hide(GTK_WIDGET(tracker));
4374             }
4375             gtk_widget_hide(fs_window);
4376 
4377         }
4378         gtk_widget_show(menubar);
4379         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls))) {
4380             gtk_widget_show(controls_box);
4381         }
4382         if (restore_details) {
4383             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_details), TRUE);
4384         }
4385         if (restore_meter) {
4386             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_meter), TRUE);
4387         }
4388         if (restore_info) {
4389             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), TRUE);
4390         }
4391         if (restore_playlist) {
4392             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist), TRUE);
4393         }
4394         skip_fixed_allocation_on_show = FALSE;
4395         gtk_window_resize(GTK_WINDOW(window), last_window_width, last_window_height);
4396 
4397     } else {
4398         gtk_window_get_size(GTK_WINDOW(window), &last_window_width, &last_window_height);
4399         gtk_widget_hide(menubar);
4400         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls))) {
4401             gtk_widget_hide(controls_box);
4402         }
4403         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_details))) {
4404             restore_details = TRUE;
4405             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_details), FALSE);
4406         } else {
4407             restore_details = FALSE;
4408         }
4409         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_meter))) {
4410             restore_meter = TRUE;
4411             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_meter), FALSE);
4412         } else {
4413             restore_meter = FALSE;
4414         }
4415         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_info))) {
4416             restore_info = TRUE;
4417             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), FALSE);
4418         } else {
4419             restore_info = FALSE;
4420         }
4421         if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist))) {
4422             restore_playlist = TRUE;
4423             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist), FALSE);
4424         } else {
4425             restore_playlist = FALSE;
4426         }
4427         if (embed_window == 0) {
4428             // --fullscreen option doesn' t work without this event flush gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
4429             while (gtk_events_pending())
4430                 gtk_main_iteration();
4431 
4432             gtk_window_fullscreen(GTK_WINDOW(window));
4433         } else {
4434             if (fs_window == NULL) {
4435                 fs_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
4436                 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
4437                 gtk_widget_add_events(fs_window, GDK_BUTTON_PRESS_MASK);
4438                 gtk_widget_add_events(fs_window, GDK_BUTTON_RELEASE_MASK);
4439                 gtk_widget_add_events(fs_window, GDK_KEY_PRESS_MASK);
4440                 gtk_widget_add_events(fs_window, GDK_KEY_RELEASE_MASK);
4441                 gtk_widget_add_events(fs_window, GDK_ENTER_NOTIFY_MASK);
4442                 gtk_widget_add_events(fs_window, GDK_LEAVE_NOTIFY_MASK);
4443                 gtk_widget_add_events(fs_window, GDK_KEY_PRESS_MASK);
4444                 gtk_widget_add_events(fs_window, GDK_VISIBILITY_NOTIFY_MASK);
4445                 gtk_widget_add_events(fs_window, GDK_STRUCTURE_MASK);
4446                 gtk_widget_add_events(fs_window, GDK_POINTER_MOTION_MASK);
4447                 g_signal_connect(G_OBJECT(fs_window), "key_press_event", G_CALLBACK(window_key_callback), NULL);
4448                 g_signal_connect(G_OBJECT(fs_window), "motion_notify_event", G_CALLBACK(motion_notify_callback), NULL);
4449                 gtk_widget_realize(fs_window);
4450 #ifdef GTK2_18_ENABLED
4451                 gdk_window_ensure_native(gtk_widget_get_window(fs_window));
4452 #else
4453 #ifdef GTK2_14_ENABLED
4454 #ifdef X11_ENABLED
4455                 GDK_WINDOW_XID(gmtk_get_window(GTK_WIDGET(fs_window)));
4456 #endif
4457 #endif
4458 #endif
4459             }
4460 
4461             screen = gtk_window_get_screen(GTK_WINDOW(window));
4462             gtk_window_set_screen(GTK_WINDOW(fs_window), screen);
4463             gtk_window_set_title(GTK_WINDOW(fs_window), _("Gnome MPlayer Fullscreen"));
4464             gdk_screen_get_monitor_geometry(screen,
4465                                             gdk_screen_get_monitor_at_window(screen, gmtk_get_window(window)), &rect);
4466 
4467             gdk_window_get_root_origin(gmtk_get_window(window), &wx, &wy);
4468             gtk_window_move(GTK_WINDOW(fs_window), wx, wy);
4469 #ifdef GTK3_ENABLED
4470             gtk_window_set_has_resize_grip(GTK_WINDOW(fs_window), FALSE);
4471 #endif
4472             gtk_widget_show(fs_window);
4473 #if X11_ENABLED
4474             XReparentWindow(GDK_WINDOW_XDISPLAY(gmtk_get_window(window)),
4475                             GDK_WINDOW_XID(gmtk_get_window(window)), GDK_WINDOW_XID(gmtk_get_window(fs_window)), 0, 0);
4476 #else
4477             gdk_window_reparent(gmtk_get_window(window), gmtk_get_window(fs_window), 0, 0);
4478 #endif
4479             gtk_widget_map(window);
4480             gtk_window_fullscreen(GTK_WINDOW(fs_window));
4481             gtk_window_resize(GTK_WINDOW(window), rect.width, rect.height);
4482             if (window_x < 250) {
4483                 gtk_widget_show(fs_event_box);
4484             }
4485             if (window_x < 170) {
4486                 gtk_widget_show(GTK_WIDGET(tracker));
4487             }
4488         }
4489     }
4490 
4491     fullscreen = !fullscreen;
4492     if (!fullscreen) {
4493         hide_fs_controls();
4494         gtk_window_present(GTK_WINDOW(window));
4495     }
4496 
4497 }
4498 
menuitem_copyurl_callback(GtkMenuItem * menuitem,void * data)4499 void menuitem_copyurl_callback(GtkMenuItem * menuitem, void *data)
4500 {
4501     GtkClipboard *clipboard;
4502     gchar *url;
4503 
4504     if (idledata->url) {
4505         url = g_strdup(idledata->url);
4506     } else {
4507         url = g_strdup(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
4508     }
4509     clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
4510     gtk_clipboard_set_text(clipboard, url, -1);
4511     clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
4512     gtk_clipboard_set_text(clipboard, url, -1);
4513 
4514     g_free(url);
4515 }
4516 
menuitem_showcontrols_callback(GtkCheckMenuItem * menuitem,void * data)4517 void menuitem_showcontrols_callback(GtkCheckMenuItem * menuitem, void *data)
4518 {
4519     int width, height;
4520     GtkAllocation alloc;
4521 
4522     if (GTK_CHECK_MENU_ITEM(menuitem) == GTK_CHECK_MENU_ITEM(menuitem_view_controls)) {
4523         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols),
4524                                        gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls)));
4525         return;
4526     } else {
4527         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls),
4528                                        gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols)));
4529     }
4530 
4531     if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols))) {
4532         if (GTK_IS_WIDGET(button_event_box)) {
4533             gtk_widget_hide(button_event_box);
4534         }
4535 
4536         if (fullscreen) {
4537             show_fs_controls();
4538         } else {
4539             gtk_widget_set_size_request(controls_box, -1, -1);
4540             gtk_widget_show(controls_box);
4541             if (!fullscreen && embed_window == 0) {
4542                 gtk_window_get_size(GTK_WINDOW(window), &width, &height);
4543                 gmtk_get_allocation(controls_box, &alloc);
4544                 gtk_window_resize(GTK_WINDOW(window), width, height + alloc.height);
4545             }
4546         }
4547 
4548         showcontrols = TRUE;
4549     } else {
4550         if (fullscreen) {
4551             hide_fs_controls();
4552         } else {
4553             gtk_widget_hide(controls_box);
4554             if (!fullscreen && embed_window == 0) {
4555                 gtk_window_get_size(GTK_WINDOW(window), &width, &height);
4556                 gmtk_get_allocation(controls_box, &alloc);
4557                 gtk_window_resize(GTK_WINDOW(window), width, height - alloc.height);
4558             }
4559         }
4560         showcontrols = FALSE;
4561     }
4562 }
4563 
config_apply(GtkWidget * widget,void * data)4564 void config_apply(GtkWidget * widget, void *data)
4565 {
4566     gint oldosd;
4567     gboolean old_disable_framedrop;
4568     gchar *filename;
4569     GdkColor sub_color;
4570 
4571     if (vo != NULL) {
4572         g_free(vo);
4573         vo = NULL;
4574     }
4575     vo = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_vo)))));
4576 
4577     audio_device_name = g_strdup(gmtk_output_combo_box_get_active_description(GMTK_OUTPUT_COMBO_BOX(config_ao)));
4578 
4579     if (audio_device.description != NULL) {
4580         g_free(audio_device.description);
4581         audio_device.description = NULL;
4582     }
4583     audio_device.description = g_strdup(audio_device_name);
4584     gm_audio_update_device(&audio_device);
4585     if (softvol || audio_device.type == AUDIO_TYPE_SOFTVOL) {
4586         gm_audio_set_server_volume_update_callback(&audio_device, NULL);
4587         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SOFTVOL, TRUE);
4588     } else {
4589         gm_audio_get_volume(&audio_device);
4590         gm_audio_set_server_volume_update_callback(&audio_device, set_volume);
4591         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SOFTVOL, FALSE);
4592     }
4593 
4594     gmtk_media_player_set_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AO, audio_device.mplayer_ao);
4595 
4596 #ifdef HAVE_ASOUNDLIB
4597     if (audio_device.alsa_mixer != NULL) {
4598         g_free(audio_device.alsa_mixer);
4599         audio_device.alsa_mixer = NULL;
4600     }
4601     audio_device.alsa_mixer = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_mixer)))));
4602 #endif
4603 
4604     if (alang != NULL) {
4605         g_free(alang);
4606         alang = NULL;
4607     }
4608     alang = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_alang)))));
4609 
4610     if (slang != NULL) {
4611         g_free(slang);
4612         slang = NULL;
4613     }
4614     slang = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_slang)))));
4615 
4616     if (metadata_codepage != NULL) {
4617         g_free(metadata_codepage);
4618         metadata_codepage = NULL;
4619     }
4620     metadata_codepage = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_metadata_codepage)))));
4621 
4622     if (subtitle_codepage != NULL) {
4623         g_free(subtitle_codepage);
4624         subtitle_codepage = NULL;
4625     }
4626     subtitle_codepage = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_subtitle_codepage)))));
4627 
4628     if (mplayer_dvd_device != NULL) {
4629         g_free(mplayer_dvd_device);
4630         mplayer_dvd_device = NULL;
4631     }
4632     mplayer_dvd_device = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(config_mplayer_dvd_device)))));
4633 
4634     audio_channels = gtk_combo_box_get_active(GTK_COMBO_BOX(config_audio_channels));
4635     use_hw_audio = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_use_hw_audio));
4636     use_hardware_codecs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_hardware_codecs));
4637     use_crystalhd_codecs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_crystalhd_codecs));
4638     cache_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(config_cachesize));
4639     plugin_audio_cache_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(config_plugin_audio_cache_size));
4640     plugin_video_cache_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(config_plugin_video_cache_size));
4641     old_disable_framedrop = disable_framedrop;
4642     disable_deinterlace = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_deinterlace));
4643     disable_framedrop = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_framedrop));
4644     disable_ass = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_ass));
4645     disable_embeddedfonts = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_embeddedfonts));
4646     disable_pause_on_click = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_pause_on_click));
4647     disable_animation = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_disable_animation));
4648     disable_cover_art_fetch =
4649         (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_disable_cover_art_fetch));
4650     oldosd = osdlevel;
4651     osdlevel = (gint) gtk_range_get_value(GTK_RANGE(config_osdlevel));
4652     pplevel = (gint) gtk_range_get_value(GTK_RANGE(config_pplevel));
4653     softvol = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_softvol));
4654     remember_softvol = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_remember_softvol));
4655     volume_gain = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(config_volume_gain));
4656     verbose = (gint) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_verbose));
4657     mouse_wheel_changes_volume = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_mouse_wheel));
4658     resume_mode = gtk_combo_box_get_active(GTK_COMBO_BOX(config_resume_mode));
4659     playlist_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_playlist_visible));
4660     details_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_details_visible));
4661     use_mediakeys = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_use_mediakeys));
4662     use_defaultpl = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_use_defaultpl));
4663     vertical_layout = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_vertical_layout));
4664     single_instance = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_single_instance));
4665     replace_and_play = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_replace_and_play));
4666     bring_to_front = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_bring_to_front));
4667     enable_nautilus_plugin = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_enable_nautilus_plugin));
4668 #ifdef NOTIFY_ENABLED
4669     show_notification = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_show_notification));
4670 #endif
4671 #ifdef GTK2_12_ENABLED
4672     show_status_icon = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_show_status_icon));
4673     if (GTK_IS_STATUS_ICON(status_icon)) {
4674         gtk_status_icon_set_visible(status_icon, show_status_icon);
4675     } else {
4676         if (show_status_icon) {
4677             GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
4678             if (gtk_icon_theme_has_icon(icon_theme, "gnome-mplayer")) {
4679                 status_icon = gtk_status_icon_new_from_icon_name("gnome-mplayer");
4680             } else {
4681                 status_icon = gtk_status_icon_new_from_pixbuf(pb_icon);
4682             }
4683             gtk_status_icon_set_visible(status_icon, show_status_icon);
4684             g_signal_connect(status_icon, "activate", G_CALLBACK(status_icon_callback), NULL);
4685             g_signal_connect(status_icon, "popup_menu", G_CALLBACK(status_icon_context_callback), NULL);
4686 
4687         } else {
4688             if (GTK_IS_STATUS_ICON(status_icon)) {
4689                 gtk_status_icon_set_visible(status_icon, show_status_icon);
4690             }
4691         }
4692     }
4693 
4694 #endif
4695     forcecache = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_forcecache));
4696     remember_loc = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_remember_loc));
4697     disable_cover_art_fetch =
4698         (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_disable_cover_art_fetch));
4699     resize_on_new_media = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_resize_on_new_media));
4700     keep_on_top = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_keep_on_top));
4701     gtk_window_set_keep_above(GTK_WINDOW(window), keep_on_top);
4702 
4703     if (subtitlefont != NULL) {
4704         g_free(subtitlefont);
4705         subtitlefont = NULL;
4706     }
4707     subtitlefont = g_strdup(gtk_font_button_get_font_name(GTK_FONT_BUTTON(config_subtitle_font)));
4708     subtitle_scale = gtk_spin_button_get_value(GTK_SPIN_BUTTON(config_subtitle_scale));
4709     gtk_color_button_get_color(GTK_COLOR_BUTTON(config_subtitle_color), &sub_color);
4710     if (subtitle_color != NULL) {
4711         g_free(subtitle_color);
4712         subtitle_color = NULL;
4713     }
4714     subtitle_color = g_strdup_printf("%02x%02x%02x00", sub_color.red >> 8, sub_color.green >> 8, sub_color.blue >> 8);
4715     subtitle_outline = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_subtitle_outline));
4716     subtitle_shadow = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_subtitle_shadow));
4717     subtitle_margin = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(config_subtitle_margin));
4718     subtitle_fuzziness = (gint) gtk_range_get_value(GTK_RANGE(config_subtitle_fuzziness));
4719     showsubtitles = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_show_subtitles));
4720 
4721     if (old_disable_framedrop != disable_framedrop) {
4722         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ENABLE_FRAME_DROP,
4723                                                 !disable_framedrop);
4724     }
4725 
4726     if (oldosd != osdlevel) {
4727         gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_OSDLEVEL, osdlevel);
4728     }
4729 
4730     qt_disabled = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_qt));
4731     real_disabled = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_real));
4732     wmp_disabled = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_wmp));
4733     dvx_disabled = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_dvx));
4734     midi_disabled = !(gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_midi));
4735     embedding_disabled = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_noembed));
4736     disable_embedded_scaling = (gboolean) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_noscaling));
4737     mplayer_bin = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(config_mplayer_bin)));
4738     if (!g_file_test(mplayer_bin, G_FILE_TEST_EXISTS)) {
4739         g_free(mplayer_bin);
4740         mplayer_bin = NULL;
4741     }
4742     extraopts = g_strdup(gtk_entry_get_text(GTK_ENTRY(config_extraopts)));
4743 
4744     set_media_player_attributes(media);
4745 
4746     gm_store = gm_pref_store_new("gnome-mplayer");
4747 
4748     gm_pref_store_set_string(gm_store, AUDIO_DEVICE_NAME, audio_device_name);
4749 
4750 #ifndef HAVE_ASOUNDLIB
4751     gm_pref_store_set_int(gm_store, VOLUME, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(config_volume)));
4752 #endif
4753     gm_pref_store_set_string(gm_store, VO, vo);
4754     gm_pref_store_set_int(gm_store, AUDIO_CHANNELS, audio_channels);
4755     gm_pref_store_set_boolean(gm_store, USE_HW_AUDIO, use_hw_audio);
4756     gm_pref_store_set_boolean(gm_store, USE_HARDWARE_CODECS, use_hardware_codecs);
4757     gm_pref_store_set_boolean(gm_store, USE_CRYSTALHD_CODECS, use_crystalhd_codecs);
4758     gm_pref_store_set_int(gm_store, CACHE_SIZE, cache_size);
4759     gm_pref_store_set_int(gm_store, PLUGIN_AUDIO_CACHE_SIZE, plugin_audio_cache_size);
4760     gm_pref_store_set_int(gm_store, PLUGIN_VIDEO_CACHE_SIZE, plugin_video_cache_size);
4761     gm_pref_store_set_string(gm_store, ALSA_MIXER, audio_device.alsa_mixer);
4762     gm_pref_store_set_int(gm_store, OSDLEVEL, osdlevel);
4763     gm_pref_store_set_int(gm_store, PPLEVEL, pplevel);
4764     gm_pref_store_set_boolean(gm_store, SOFTVOL, softvol);
4765     gm_pref_store_set_boolean(gm_store, REMEMBER_SOFTVOL, remember_softvol);
4766     gm_pref_store_set_int(gm_store, VOLUME_GAIN, volume_gain);
4767     gm_pref_store_set_boolean(gm_store, FORCECACHE, forcecache);
4768     gm_pref_store_set_boolean(gm_store, DISABLEASS, disable_ass);
4769     gm_pref_store_set_boolean(gm_store, DISABLEEMBEDDEDFONTS, disable_embeddedfonts);
4770     gm_pref_store_set_boolean(gm_store, DISABLEDEINTERLACE, disable_deinterlace);
4771     gm_pref_store_set_boolean(gm_store, DISABLEFRAMEDROP, disable_framedrop);
4772     gm_pref_store_set_boolean(gm_store, DISABLEPAUSEONCLICK, disable_pause_on_click);
4773     gm_pref_store_set_boolean(gm_store, DISABLEANIMATION, disable_animation);
4774     gm_pref_store_set_boolean(gm_store, SHOWPLAYLIST, playlist_visible);
4775     gm_pref_store_set_boolean(gm_store, SHOWDETAILS, details_visible);
4776     gm_pref_store_set_boolean(gm_store, USE_MEDIAKEYS, use_mediakeys);
4777     gm_pref_store_set_boolean(gm_store, USE_DEFAULTPL, use_defaultpl);
4778     gm_pref_store_set_boolean(gm_store, MOUSE_WHEEL_CHANGES_VOLUME, mouse_wheel_changes_volume);
4779     gm_pref_store_set_boolean(gm_store, SHOW_NOTIFICATION, show_notification);
4780     gm_pref_store_set_boolean(gm_store, SHOW_STATUS_ICON, show_status_icon);
4781     gm_pref_store_set_boolean(gm_store, VERTICAL, vertical_layout);
4782     gm_pref_store_set_boolean(gm_store, SINGLE_INSTANCE, single_instance);
4783     gm_pref_store_set_boolean(gm_store, REPLACE_AND_PLAY, replace_and_play);
4784     gm_pref_store_set_boolean(gm_store, BRING_TO_FRONT, bring_to_front);
4785     gm_pref_store_set_boolean(gm_store, REMEMBER_LOC, remember_loc);
4786     gm_pref_store_set_boolean(gm_store, DISABLE_COVER_ART_FETCH, disable_cover_art_fetch);
4787     gm_pref_store_set_boolean(gm_store, KEEP_ON_TOP, keep_on_top);
4788     gm_pref_store_set_boolean(gm_store, ENABLE_NAUTILUS_PLUGIN, enable_nautilus_plugin);
4789     gm_pref_store_set_boolean(gm_store, RESIZE_ON_NEW_MEDIA, resize_on_new_media);
4790     gm_pref_store_set_int(gm_store, RESUME_MODE, resume_mode);
4791     gm_pref_store_set_int(gm_store, VERBOSE, verbose);
4792     gm_pref_store_set_string(gm_store, METADATACODEPAGE, metadata_codepage);
4793     gm_pref_store_set_string(gm_store, SUBTITLEFONT, subtitlefont);
4794     gm_pref_store_set_float(gm_store, SUBTITLESCALE, subtitle_scale);
4795     gm_pref_store_set_string(gm_store, SUBTITLECODEPAGE, subtitle_codepage);
4796     gm_pref_store_set_string(gm_store, SUBTITLECOLOR, subtitle_color);
4797     gm_pref_store_set_boolean(gm_store, SUBTITLEOUTLINE, subtitle_outline);
4798     gm_pref_store_set_boolean(gm_store, SUBTITLESHADOW, subtitle_shadow);
4799     gm_pref_store_set_int(gm_store, SUBTITLE_MARGIN, subtitle_margin);
4800     gm_pref_store_set_boolean(gm_store, SHOW_SUBTITLES, showsubtitles);
4801 
4802     gm_pref_store_set_string(gm_store, AUDIO_LANG, alang);
4803     gm_pref_store_set_string(gm_store, SUBTITLE_LANG, slang);
4804 
4805     gm_pref_store_set_string(gm_store, MPLAYER_BIN, mplayer_bin);
4806     gm_pref_store_set_string(gm_store, MPLAYER_DVD_DEVICE, mplayer_dvd_device);
4807     gm_pref_store_set_string(gm_store, EXTRAOPTS, extraopts);
4808     gm_pref_store_set_string(gm_store, ACCELERATOR_KEYS, g_strjoinv(" ", accel_keys));
4809     gm_pref_store_free(gm_store);
4810 
4811     gmp_store = gm_pref_store_new("gecko-mediaplayer");
4812     gm_pref_store_set_boolean(gmp_store, DISABLE_QT, qt_disabled);
4813     gm_pref_store_set_boolean(gmp_store, DISABLE_REAL, real_disabled);
4814     gm_pref_store_set_boolean(gmp_store, DISABLE_WMP, wmp_disabled);
4815     gm_pref_store_set_boolean(gmp_store, DISABLE_DVX, dvx_disabled);
4816     gm_pref_store_set_boolean(gmp_store, DISABLE_MIDI, midi_disabled);
4817     gm_pref_store_set_boolean(gmp_store, DISABLE_EMBEDDING, embedding_disabled);
4818     gm_pref_store_set_boolean(gmp_store, DISABLE_EMBEDDED_SCALING, disable_embedded_scaling);
4819     gm_pref_store_set_int(gmp_store, DEBUG_LEVEL, verbose);
4820 
4821     gm_pref_store_free(gmp_store);
4822 
4823     filename = g_strdup_printf("%s/.mozilla/pluginreg.dat", g_getenv("HOME"));
4824     g_remove(filename);
4825     g_free(filename);
4826     filename = g_strdup_printf("%s/.firefox/pluginreg.dat", g_getenv("HOME"));
4827     g_remove(filename);
4828     g_free(filename);
4829     filename = g_strdup_printf("%s/.mozilla/firefox/pluginreg.dat", g_getenv("HOME"));
4830     g_remove(filename);
4831     g_free(filename);
4832 
4833     // don't reload plugins when running in plugin mode
4834     if (embed_window == 0 && control_id == 0)
4835         dbus_reload_plugins();
4836 
4837     gmtk_media_player_restart(GMTK_MEDIA_PLAYER(media));
4838     gtk_widget_destroy(widget);
4839 }
4840 
adv_reset_values(GtkWidget * widget,void * data)4841 void adv_reset_values(GtkWidget * widget, void *data)
4842 {
4843     gtk_range_set_value(GTK_RANGE(adv_brightness), 0);
4844     gtk_range_set_value(GTK_RANGE(adv_contrast), 0);
4845     gtk_range_set_value(GTK_RANGE(adv_hue), 0);
4846     gtk_range_set_value(GTK_RANGE(adv_gamma), 0);
4847     gtk_range_set_value(GTK_RANGE(adv_saturation), 0);
4848 }
4849 
4850 
config_close(GtkWidget * widget,void * data)4851 void config_close(GtkWidget * widget, void *data)
4852 {
4853     selection = NULL;
4854     if (GTK_IS_WIDGET(widget))
4855         gtk_widget_destroy(widget);
4856 }
4857 
brightness_callback(GtkRange * range,gpointer data)4858 void brightness_callback(GtkRange * range, gpointer data)
4859 {
4860     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_BRIGHTNESS,
4861                                             (gint) gtk_range_get_value(range));
4862 }
4863 
contrast_callback(GtkRange * range,gpointer data)4864 void contrast_callback(GtkRange * range, gpointer data)
4865 {
4866     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_CONTRAST,
4867                                             (gint) gtk_range_get_value(range));
4868 }
4869 
gamma_callback(GtkRange * range,gpointer data)4870 void gamma_callback(GtkRange * range, gpointer data)
4871 {
4872     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_GAMMA,
4873                                             (gint) gtk_range_get_value(range));
4874 }
4875 
hue_callback(GtkRange * range,gpointer data)4876 void hue_callback(GtkRange * range, gpointer data)
4877 {
4878     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HUE, (gint) gtk_range_get_value(range));
4879 }
4880 
saturation_callback(GtkRange * range,gpointer data)4881 void saturation_callback(GtkRange * range, gpointer data)
4882 {
4883     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SATURATION,
4884                                             (gint) gtk_range_get_value(range));
4885 }
4886 
menuitem_meter_callback(GtkMenuItem * menuitem,void * data)4887 void menuitem_meter_callback(GtkMenuItem * menuitem, void *data)
4888 {
4889     g_idle_add(set_adjust_layout, NULL);
4890     //adjust_layout();
4891 }
4892 
menuitem_details_callback(GtkMenuItem * menuitem,void * data)4893 void menuitem_details_callback(GtkMenuItem * menuitem, void *data)
4894 {
4895     g_idle_add(set_adjust_layout, NULL);
4896 
4897 }
4898 
create_details_table()4899 void create_details_table()
4900 {
4901     GtkWidget *label;
4902     gchar *buf;
4903     gint i = 0;
4904     IdleData *idle = idledata;
4905 
4906     label = gtk_label_new(_("<span weight=\"bold\">Video Details</span>"));
4907     gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
4908     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4909     gtk_misc_set_padding(GTK_MISC(label), 0, 6);
4910     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4911     i++;
4912 
4913     if (idle != NULL) {
4914         label = gtk_label_new(_("Video Size:"));
4915         gtk_widget_set_size_request(label, 150, -1);
4916         gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4917         gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4918         gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4919         buf = g_strdup_printf("%i x %i", idle->width, idle->height);
4920         details_video_size = gtk_label_new(buf);
4921         gtk_widget_set_size_request(details_video_size, 100, -1);
4922         gtk_misc_set_alignment(GTK_MISC(details_video_size), 0.0, 0.0);
4923         gtk_table_attach_defaults(GTK_TABLE(details_table), details_video_size, 1, 2, i, i + 1);
4924         g_free(buf);
4925         i++;
4926     }
4927 
4928     label = gtk_label_new(_("Video Format:"));
4929     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4930     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4931     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4932     buf = g_strdup_printf(_("Unknown"));
4933     details_video_format = gtk_label_new(buf);
4934     g_free(buf);
4935     gtk_misc_set_alignment(GTK_MISC(details_video_format), 0.0, 0.0);
4936     gtk_table_attach_defaults(GTK_TABLE(details_table), details_video_format, 1, 2, i, i + 1);
4937     i++;
4938 
4939     label = gtk_label_new(_("Video Codec:"));
4940     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4941     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4942     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4943     buf = g_strdup_printf(_("Unknown"));
4944     details_video_codec = gtk_label_new(buf);
4945     g_free(buf);
4946     gtk_misc_set_alignment(GTK_MISC(details_video_codec), 0.0, 0.0);
4947     gtk_table_attach_defaults(GTK_TABLE(details_table), details_video_codec, 1, 2, i, i + 1);
4948     i++;
4949 
4950     label = gtk_label_new(_("Video FPS:"));
4951     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4952     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4953     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4954     details_video_fps = gtk_label_new("");
4955     gtk_misc_set_alignment(GTK_MISC(details_video_fps), 0.0, 0.0);
4956     gtk_table_attach_defaults(GTK_TABLE(details_table), details_video_fps, 1, 2, i, i + 1);
4957     i++;
4958 
4959     label = gtk_label_new(_("Video Bitrate:"));
4960     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4961     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4962     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4963     buf = g_strdup_printf("0 Kb/s");
4964     details_video_bitrate = gtk_label_new(buf);
4965     g_free(buf);
4966     gtk_misc_set_alignment(GTK_MISC(details_video_bitrate), 0.0, 0.0);
4967     gtk_table_attach_defaults(GTK_TABLE(details_table), details_video_bitrate, 1, 2, i, i + 1);
4968     i++;
4969 
4970     label = gtk_label_new(_("Video Chapters:"));
4971     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4972     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4973     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4974     buf = g_strdup_printf(_("Unknown"));
4975     details_video_chapters = gtk_label_new(buf);
4976     g_free(buf);
4977     gtk_misc_set_alignment(GTK_MISC(details_video_chapters), 0.0, 0.0);
4978     gtk_table_attach_defaults(GTK_TABLE(details_table), details_video_chapters, 1, 2, i, i + 1);
4979     i++;
4980 
4981     label = gtk_label_new("");
4982     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4983     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4984     i++;
4985 
4986     label = gtk_label_new(_("<span weight=\"bold\">Audio Details</span>"));
4987     gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
4988     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4989     gtk_misc_set_padding(GTK_MISC(label), 0, 6);
4990     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4991     i++;
4992 
4993     label = gtk_label_new(_("Audio Format:"));
4994     gtk_widget_set_size_request(label, 150, -1);
4995     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
4996     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
4997     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
4998     buf = g_strdup_printf(_("Unknown"));
4999     details_audio_format = gtk_label_new(buf);
5000     g_free(buf);
5001     gtk_widget_set_size_request(details_audio_format, 100, -1);
5002     gtk_misc_set_alignment(GTK_MISC(details_audio_format), 0.0, 0.0);
5003     gtk_table_attach_defaults(GTK_TABLE(details_table), details_audio_format, 1, 2, i, i + 1);
5004     i++;
5005 
5006     label = gtk_label_new(_("Audio Codec:"));
5007     gtk_widget_set_size_request(label, 150, -1);
5008     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
5009     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5010     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
5011     buf = g_strdup_printf(_("Unknown"));
5012     details_audio_codec = gtk_label_new(buf);
5013     g_free(buf);
5014     gtk_widget_set_size_request(details_audio_codec, 100, -1);
5015     gtk_misc_set_alignment(GTK_MISC(details_audio_codec), 0.0, 0.0);
5016     gtk_table_attach_defaults(GTK_TABLE(details_table), details_audio_codec, 1, 2, i, i + 1);
5017     i++;
5018 
5019     label = gtk_label_new(_("Audio Channels:"));
5020     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
5021     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5022     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
5023     if (idle != NULL) {
5024         buf = g_strdup_printf(_("Unknown"));
5025         details_audio_channels = gtk_label_new(buf);
5026         g_free(buf);
5027         gtk_misc_set_alignment(GTK_MISC(details_audio_channels), 0.0, 0.0);
5028         gtk_table_attach_defaults(GTK_TABLE(details_table), details_audio_channels, 1, 2, i, i + 1);
5029     }
5030     i++;
5031 
5032     label = gtk_label_new(_("Audio Bitrate:"));
5033     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
5034     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5035     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
5036     if (idle != NULL) {
5037         buf = g_strdup_printf("0 Kb/s");
5038         details_audio_bitrate = gtk_label_new(buf);
5039         g_free(buf);
5040         gtk_misc_set_alignment(GTK_MISC(details_audio_bitrate), 0.0, 0.0);
5041         gtk_table_attach_defaults(GTK_TABLE(details_table), details_audio_bitrate, 1, 2, i, i + 1);
5042     }
5043     i++;
5044 
5045     label = gtk_label_new(_("Audio Sample Rate:"));
5046     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
5047     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5048     gtk_table_attach_defaults(GTK_TABLE(details_table), label, 0, 1, i, i + 1);
5049     if (idle != NULL) {
5050         buf = g_strdup_printf("0 KHz");
5051         details_audio_samplerate = gtk_label_new(buf);
5052         g_free(buf);
5053         gtk_misc_set_alignment(GTK_MISC(details_audio_samplerate), 0.0, 0.0);
5054         gtk_table_attach_defaults(GTK_TABLE(details_table), details_audio_samplerate, 1, 2, i, i + 1);
5055     }
5056     i++;
5057 
5058 }
5059 
5060 
menuitem_advanced_callback(GtkMenuItem * menuitem,void * data)5061 void menuitem_advanced_callback(GtkMenuItem * menuitem, void *data)
5062 {
5063     GtkWidget *adv_window;
5064     GtkWidget *adv_vbox;
5065     GtkWidget *adv_hbutton_box;
5066     GtkWidget *adv_table;
5067     GtkWidget *adv_reset;
5068     GtkWidget *adv_close;
5069     GtkWidget *label;
5070     gint i = 0;
5071 
5072     adv_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
5073     gtk_window_set_type_hint(GTK_WINDOW(adv_window), GDK_WINDOW_TYPE_HINT_UTILITY);
5074     gtk_window_set_resizable(GTK_WINDOW(adv_window), FALSE);
5075     gtk_window_set_icon(GTK_WINDOW(adv_window), pb_icon);
5076     gtk_window_set_transient_for(GTK_WINDOW(adv_window), GTK_WINDOW(window));
5077     gtk_window_set_position(GTK_WINDOW(adv_window), GTK_WIN_POS_CENTER_ON_PARENT);
5078 
5079     gtk_window_set_title(GTK_WINDOW(adv_window), _("Video Picture Adjustments"));
5080 
5081 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5082     adv_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5083     gtk_box_set_homogeneous(GTK_BOX(adv_vbox), FALSE);
5084 #else
5085     adv_vbox = gtk_vbox_new(FALSE, 10);
5086 #endif
5087     adv_hbutton_box = gtk_hbutton_box_new();
5088     gtk_button_box_set_layout(GTK_BUTTON_BOX(adv_hbutton_box), GTK_BUTTONBOX_END);
5089     adv_table = gtk_table_new(20, 2, FALSE);
5090 
5091     gtk_container_add(GTK_CONTAINER(adv_vbox), adv_table);
5092     gtk_container_add(GTK_CONTAINER(adv_vbox), adv_hbutton_box);
5093     gtk_container_add(GTK_CONTAINER(adv_window), adv_vbox);
5094 
5095     gtk_container_set_border_width(GTK_CONTAINER(adv_window), 5);
5096 
5097     label = gtk_label_new(_("<span weight=\"bold\">Video Picture Adjustments</span>"));
5098     gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
5099     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
5100     gtk_misc_set_padding(GTK_MISC(label), 0, 6);
5101     gtk_table_attach_defaults(GTK_TABLE(adv_table), label, 0, 1, i, i + 1);
5102     i++;
5103 
5104     label = gtk_label_new(_("Brightness"));
5105     adv_brightness = gtk_hscale_new_with_range(-100.0, 100.0, 1.0);
5106     gtk_widget_set_size_request(adv_brightness, 200, -1);
5107     gtk_range_set_value(GTK_RANGE(adv_brightness),
5108                         gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_BRIGHTNESS));
5109     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0);
5110     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5111     gtk_table_attach_defaults(GTK_TABLE(adv_table), label, 0, 1, i, i + 1);
5112     gtk_table_attach_defaults(GTK_TABLE(adv_table), adv_brightness, 1, 2, i, i + 1);
5113     i++;
5114 
5115     label = gtk_label_new(_("Contrast"));
5116     adv_contrast = gtk_hscale_new_with_range(-100.0, 100.0, 1.0);
5117     gtk_widget_set_size_request(adv_contrast, 200, -1);
5118     gtk_range_set_value(GTK_RANGE(adv_contrast),
5119                         gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_CONTRAST));
5120     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0);
5121     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5122     gtk_table_attach_defaults(GTK_TABLE(adv_table), label, 0, 1, i, i + 1);
5123     gtk_table_attach_defaults(GTK_TABLE(adv_table), adv_contrast, 1, 2, i, i + 1);
5124     i++;
5125 
5126     label = gtk_label_new(_("Gamma"));
5127     adv_gamma = gtk_hscale_new_with_range(-100.0, 100.0, 1.0);
5128     gtk_widget_set_size_request(adv_gamma, 200, -1);
5129     gtk_range_set_value(GTK_RANGE(adv_gamma),
5130                         gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_GAMMA));
5131     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0);
5132     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5133     gtk_table_attach_defaults(GTK_TABLE(adv_table), label, 0, 1, i, i + 1);
5134     gtk_table_attach_defaults(GTK_TABLE(adv_table), adv_gamma, 1, 2, i, i + 1);
5135     i++;
5136 
5137     label = gtk_label_new(_("Hue"));
5138     adv_hue = gtk_hscale_new_with_range(-100.0, 100.0, 1.0);
5139     gtk_widget_set_size_request(adv_hue, 200, -1);
5140     gtk_range_set_value(GTK_RANGE(adv_hue),
5141                         gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HUE));
5142     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0);
5143     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5144     gtk_table_attach_defaults(GTK_TABLE(adv_table), label, 0, 1, i, i + 1);
5145     gtk_table_attach_defaults(GTK_TABLE(adv_table), adv_hue, 1, 2, i, i + 1);
5146     i++;
5147 
5148     label = gtk_label_new(_("Saturation"));
5149     adv_saturation = gtk_hscale_new_with_range(-100.0, 100.0, 1.0);
5150     gtk_widget_set_size_request(adv_saturation, 200, -1);
5151     gtk_range_set_value(GTK_RANGE(adv_saturation),
5152                         gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SATURATION));
5153     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0);
5154     gtk_misc_set_padding(GTK_MISC(label), 12, 0);
5155     gtk_table_attach_defaults(GTK_TABLE(adv_table), label, 0, 1, i, i + 1);
5156     gtk_table_attach_defaults(GTK_TABLE(adv_table), adv_saturation, 1, 2, i, i + 1);
5157     i++;
5158 
5159     g_signal_connect(G_OBJECT(adv_brightness), "value_changed", G_CALLBACK(brightness_callback), idledata);
5160     g_signal_connect(G_OBJECT(adv_contrast), "value_changed", G_CALLBACK(contrast_callback), idledata);
5161     g_signal_connect(G_OBJECT(adv_gamma), "value_changed", G_CALLBACK(gamma_callback), idledata);
5162     g_signal_connect(G_OBJECT(adv_hue), "value_changed", G_CALLBACK(hue_callback), idledata);
5163     g_signal_connect(G_OBJECT(adv_saturation), "value_changed", G_CALLBACK(saturation_callback), idledata);
5164 
5165     adv_reset = gtk_button_new_with_mnemonic(_("_Reset"));
5166     g_signal_connect(G_OBJECT(adv_reset), "clicked", G_CALLBACK(adv_reset_values), NULL);
5167     gtk_container_add(GTK_CONTAINER(adv_hbutton_box), adv_reset);
5168 
5169     adv_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
5170     g_signal_connect_swapped(G_OBJECT(adv_close), "clicked", G_CALLBACK(config_close), adv_window);
5171 
5172     gtk_container_add(GTK_CONTAINER(adv_hbutton_box), adv_close);
5173     gtk_widget_show_all(adv_window);
5174     gtk_window_set_transient_for(GTK_WINDOW(adv_window), GTK_WINDOW(window));
5175     gtk_window_set_keep_above(GTK_WINDOW(adv_window), keep_on_top);
5176     gtk_window_present(GTK_WINDOW(adv_window));
5177 }
5178 
menuitem_view_angle_callback(GtkMenuItem * menuitem,gpointer data)5179 void menuitem_view_angle_callback(GtkMenuItem * menuitem, gpointer data)
5180 {
5181     gmtk_media_player_send_command(GMTK_MEDIA_PLAYER(media), COMMAND_SWITCH_ANGLE);
5182     return;
5183 }
5184 
menuitem_view_smaller_subtitle_callback(GtkMenuItem * menuitem,void * data)5185 void menuitem_view_smaller_subtitle_callback(GtkMenuItem * menuitem, void *data)
5186 {
5187 
5188     subtitle_scale -= 0.2;
5189     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_SCALE, subtitle_scale);
5190 
5191     return;
5192 }
5193 
menuitem_view_larger_subtitle_callback(GtkMenuItem * menuitem,void * data)5194 void menuitem_view_larger_subtitle_callback(GtkMenuItem * menuitem, void *data)
5195 {
5196     subtitle_scale += 0.2;
5197     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_SCALE, subtitle_scale);
5198 
5199     return;
5200 }
5201 
menuitem_view_decrease_subtitle_delay_callback(GtkMenuItem * menuitem,void * data)5202 void menuitem_view_decrease_subtitle_delay_callback(GtkMenuItem * menuitem, void *data)
5203 {
5204     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_DELAY,
5205                                            gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
5206                                                                                   ATTRIBUTE_SUBTITLE_DELAY) - 0.1);
5207     return;
5208 
5209 }
5210 
menuitem_view_increase_subtitle_delay_callback(GtkMenuItem * menuitem,void * data)5211 void menuitem_view_increase_subtitle_delay_callback(GtkMenuItem * menuitem, void *data)
5212 {
5213     gmtk_media_player_set_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE_DELAY,
5214                                            gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media),
5215                                                                                   ATTRIBUTE_SUBTITLE_DELAY) + 0.1);
5216     return;
5217 
5218 }
5219 
menuitem_view_aspect_callback(GtkMenuItem * menuitem,void * data)5220 void menuitem_view_aspect_callback(GtkMenuItem * menuitem, void *data)
5221 {
5222     static gint i = 0;
5223     GmtkMediaPlayerAspectRatio aspect;
5224 
5225     if ((gpointer) menuitem == (gpointer) menuitem_view_aspect_default) {
5226         i++;
5227         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), FALSE);
5228         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), FALSE);
5229         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), FALSE);
5230         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic), FALSE);
5231         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), FALSE);
5232         aspect = ASPECT_DEFAULT;
5233         i--;
5234     }
5235 
5236     if ((gpointer) menuitem == (gpointer) menuitem_view_aspect_four_three) {
5237         i++;
5238         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), FALSE);
5239         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), FALSE);
5240         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), FALSE);
5241         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic), FALSE);
5242         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), FALSE);
5243         aspect = ASPECT_4X3;
5244         i--;
5245     }
5246 
5247     if ((gpointer) menuitem == (gpointer) menuitem_view_aspect_sixteen_nine) {
5248         i++;
5249         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), FALSE);
5250         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), FALSE);
5251         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), FALSE);
5252         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic), FALSE);
5253         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), FALSE);
5254         aspect = ASPECT_16X9;
5255         i--;
5256     }
5257 
5258     if ((gpointer) menuitem == (gpointer) menuitem_view_aspect_sixteen_ten) {
5259         i++;
5260         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), FALSE);
5261         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), FALSE);
5262         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), FALSE);
5263         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic), FALSE);
5264         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), FALSE);
5265         aspect = ASPECT_16X10;
5266         i--;
5267     }
5268 
5269     if ((gpointer) menuitem == (gpointer) menuitem_view_aspect_anamorphic) {
5270         i++;
5271         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), FALSE);
5272         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), FALSE);
5273         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), FALSE);
5274         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), FALSE);
5275         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_follow_window), FALSE);
5276         aspect = ASPECT_ANAMORPHIC;
5277         i--;
5278     }
5279 
5280     if ((gpointer) menuitem == (gpointer) menuitem_view_aspect_follow_window) {
5281         i++;
5282         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), FALSE);
5283         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_four_three), FALSE);
5284         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_nine), FALSE);
5285         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_sixteen_ten), FALSE);
5286         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_anamorphic), FALSE);
5287         aspect = ASPECT_WINDOW;
5288         i--;
5289     }
5290 
5291     if (i == 0) {
5292         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
5293         gmtk_media_player_set_aspect(GMTK_MEDIA_PLAYER(media), aspect);
5294     }
5295 }
5296 
osdlevel_format_callback(GtkScale * scale,gdouble value)5297 gchar *osdlevel_format_callback(GtkScale * scale, gdouble value)
5298 {
5299     gchar *text;
5300 
5301     switch ((gint) value) {
5302 
5303     case 0:
5304         text = g_strdup(_("No Display"));
5305         break;
5306     case 1:
5307         text = g_strdup(_("Minimal"));
5308         break;
5309     case 2:
5310         text = g_strdup(_("Timer"));
5311         break;
5312     case 3:
5313         text = g_strdup(_("Timer/Total"));
5314         break;
5315     default:
5316         text = g_strdup("How did we get here?");
5317     }
5318 
5319     return text;
5320 }
5321 
pplevel_format_callback(GtkScale * scale,gdouble value)5322 gchar *pplevel_format_callback(GtkScale * scale, gdouble value)
5323 {
5324     gchar *text;
5325 
5326     switch ((gint) value) {
5327 
5328     case 0:
5329         text = g_strdup(_("No Postprocessing"));
5330         break;
5331     case 1:
5332     case 2:
5333         text = g_strdup(_("Minimal Postprocessing"));
5334         break;
5335     case 3:
5336     case 4:
5337         text = g_strdup(_("More Postprocessing"));
5338         break;
5339     case 5:
5340     case 6:
5341         text = g_strdup(_("Maximum Postprocessing"));
5342         break;
5343     default:
5344         text = g_strdup("How did we get here?");
5345     }
5346 
5347     return text;
5348 }
5349 
subtitle_fuzziness_format_callback(GtkScale * scale,gdouble value)5350 gchar *subtitle_fuzziness_format_callback(GtkScale * scale, gdouble value)
5351 {
5352     gchar *text;
5353 
5354     switch ((gint) value) {
5355 
5356     case 0:
5357         text = g_strdup(_("Exact Match"));
5358         break;
5359     case 1:
5360         text = g_strdup(_("Load all subtitles containing movie name"));
5361         break;
5362     case 2:
5363         text = g_strdup(_("Load all subtitles in the same folder"));
5364         break;
5365     default:
5366         text = g_strdup("How did we get here?");
5367     }
5368 
5369     return text;
5370 }
5371 
osdlevel_change_callback(GtkRange * range,gpointer data)5372 void osdlevel_change_callback(GtkRange * range, gpointer data)
5373 {
5374     gmtk_media_player_set_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_OSDLEVEL,
5375                                             (gint) gtk_range_get_value(range));
5376 
5377     return;
5378 }
5379 
config_single_instance_callback(GtkWidget * button,gpointer data)5380 void config_single_instance_callback(GtkWidget * button, gpointer data)
5381 {
5382     gtk_widget_set_sensitive(config_replace_and_play,
5383                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_single_instance)));
5384     gtk_widget_set_sensitive(config_bring_to_front,
5385                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_single_instance)));
5386 }
5387 
config_softvol_callback(GtkWidget * button,gpointer data)5388 void config_softvol_callback(GtkWidget * button, gpointer data)
5389 {
5390     gtk_widget_set_sensitive(config_remember_softvol, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_softvol)));
5391     gtk_widget_set_sensitive(config_volume_gain, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_softvol)));
5392 
5393 }
5394 
config_forcecache_callback(GtkWidget * button,gpointer data)5395 void config_forcecache_callback(GtkWidget * button, gpointer data)
5396 {
5397     gtk_widget_set_sensitive(config_cachesize, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_forcecache)));
5398 }
5399 
ass_toggle_callback(GtkToggleButton * source,gpointer user_data)5400 void ass_toggle_callback(GtkToggleButton * source, gpointer user_data)
5401 {
5402     gtk_widget_set_sensitive(config_subtitle_color, gtk_toggle_button_get_active(source));
5403     gtk_widget_set_sensitive(config_embeddedfonts, gtk_toggle_button_get_active(source));
5404 }
5405 
embedded_fonts_toggle_callback(GtkToggleButton * source,gpointer user_data)5406 void embedded_fonts_toggle_callback(GtkToggleButton * source, gpointer user_data)
5407 {
5408     gtk_widget_set_sensitive(config_subtitle_font, !gtk_toggle_button_get_active(source));
5409     gtk_widget_set_sensitive(config_subtitle_shadow, !gtk_toggle_button_get_active(source));
5410     gtk_widget_set_sensitive(config_subtitle_outline, !gtk_toggle_button_get_active(source));
5411 }
5412 
hw_audio_toggle_callback(GtkToggleButton * source,gpointer user_data)5413 void hw_audio_toggle_callback(GtkToggleButton * source, gpointer user_data)
5414 {
5415     if (gtk_toggle_button_get_active(source)) {
5416         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_meter), FALSE);
5417         gtk_widget_hide(GTK_WIDGET(menuitem_view_meter));
5418         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_softvol), FALSE);
5419         gtk_widget_set_sensitive(GTK_WIDGET(config_softvol), FALSE);
5420     } else {
5421         gtk_widget_show(GTK_WIDGET(menuitem_view_meter));
5422         gtk_widget_set_sensitive(GTK_WIDGET(config_softvol), TRUE);
5423     }
5424 }
5425 
output_combobox_changed_callback(GtkComboBox * config_ao,gpointer data)5426 void output_combobox_changed_callback(GtkComboBox * config_ao, gpointer data)
5427 {
5428     GtkComboBox *config_mixer = GTK_COMBO_BOX(data);
5429     gchar *device;
5430     gint card;
5431 
5432 #ifdef HAVE_ASOUNDLIB
5433     snd_mixer_t *mhandle;
5434     snd_mixer_elem_t *elem;
5435     snd_mixer_selem_id_t *sid;
5436     gint err;
5437     gchar *mix;
5438     gint i, j, master, pcm;
5439 #endif
5440 
5441     if (gmtk_output_combo_box_get_active_type(GMTK_OUTPUT_COMBO_BOX(config_ao)) == OUTPUT_TYPE_ALSA) {
5442         gtk_widget_set_sensitive(GTK_WIDGET(config_mixer), TRUE);
5443         card = gmtk_output_combo_box_get_active_card(GMTK_OUTPUT_COMBO_BOX(config_ao));
5444         if (card == -1) {
5445             device = g_strdup_printf("default");
5446         } else {
5447             device = g_strdup_printf("hw:%i", card);
5448         }
5449 
5450         // this might be wrong, so commenting out
5451         //softvol = FALSE;
5452         //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_softvol), softvol);
5453 
5454         gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(config_mixer)));
5455         gtk_combo_box_set_active(config_mixer, -1);
5456 
5457 #ifdef HAVE_ASOUNDLIB
5458         if (config_mixer != NULL) {
5459             if ((err = snd_mixer_open(&mhandle, 0)) < 0) {
5460                 gm_log(verbose, G_LOG_LEVEL_INFO, "Mixer open error %s", snd_strerror(err));
5461             }
5462 
5463             if ((err = snd_mixer_attach(mhandle, device)) < 0) {
5464                 gm_log(verbose, G_LOG_LEVEL_INFO, "Mixer attach error %s", snd_strerror(err));
5465             }
5466 
5467             if ((err = snd_mixer_selem_register(mhandle, NULL, NULL)) < 0) {
5468                 gm_log(verbose, G_LOG_LEVEL_INFO, "Mixer register error %s", snd_strerror(err));
5469             }
5470 
5471             if ((err = snd_mixer_load(mhandle)) < 0) {
5472                 gm_log(verbose, G_LOG_LEVEL_INFO, "Mixer load error %s", snd_strerror(err));
5473             }
5474             i = 0;
5475             j = -1;
5476             master = -1;
5477             pcm = -1;
5478             snd_mixer_selem_id_alloca(&sid);
5479             //gtk_combo_box_append_text(GTK_COMBO_BOX(config_mixer), "");
5480             for (elem = snd_mixer_first_elem(mhandle); elem; elem = snd_mixer_elem_next(elem)) {
5481                 snd_mixer_selem_get_id(elem, sid);
5482                 if (!snd_mixer_selem_is_active(elem))
5483                     continue;
5484                 if (snd_mixer_selem_has_capture_volume(elem)
5485                     || snd_mixer_selem_has_capture_switch(elem))
5486                     continue;
5487                 if (!snd_mixer_selem_has_playback_volume(elem))
5488                     continue;
5489                 mix = g_strdup_printf("%s,%i", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
5490                 //mix = g_strdup_printf("%s", snd_mixer_selem_id_get_name(sid));
5491 #ifdef GTK2_24_ENABLED
5492                 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_mixer), mix);
5493 #else
5494                 gtk_combo_box_append_text(GTK_COMBO_BOX(config_mixer), mix);
5495 #endif
5496                 if (audio_device.alsa_mixer != NULL && g_ascii_strcasecmp(mix, audio_device.alsa_mixer) == 0)
5497                     j = i;
5498                 if (g_ascii_strcasecmp(snd_mixer_selem_id_get_name(sid), "Master") == 0)
5499                     master = i;
5500                 if (g_ascii_strcasecmp(snd_mixer_selem_id_get_name(sid), "PCM") == 0)
5501                     pcm = i;
5502 
5503                 i++;
5504             }
5505             if (j != -1)
5506                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_mixer), j);
5507             //if (mixer != NULL && strlen(mixer) > 0 && j == -1) {
5508             //    gtk_combo_box_append_text(GTK_COMBO_BOX(config_mixer), mixer);
5509             //    gtk_combo_box_set_active(GTK_COMBO_BOX(config_mixer), i);
5510             //}
5511             if (j == -1 && pcm != -1)
5512                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_mixer), pcm);
5513             if (j == -1 && master != -1)
5514                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_mixer), master);
5515 
5516             snd_mixer_close(mhandle);
5517 
5518         }
5519 #endif
5520         g_free(device);
5521     } else {
5522         gtk_widget_set_sensitive(GTK_WIDGET(config_mixer), FALSE);
5523     }
5524 
5525     if (gmtk_output_combo_box_get_active_type(GMTK_OUTPUT_COMBO_BOX(config_ao)) == OUTPUT_TYPE_ALSA && softvol == FALSE) {
5526         gtk_label_set_text(GTK_LABEL(conf_volume_label), _("Direct ALSA Control"));
5527     } else if (gmtk_output_combo_box_get_active_type(GMTK_OUTPUT_COMBO_BOX(config_ao)) == OUTPUT_TYPE_PULSE
5528                && softvol == FALSE) {
5529         gtk_label_set_text(GTK_LABEL(conf_volume_label), _("Direct PulseAudio Control"));
5530     } else {
5531         gtk_label_set_text(GTK_LABEL(conf_volume_label), _("Software Volume Control"));
5532     }
5533 
5534 }
5535 
menuitem_config_callback(GtkMenuItem * menuitem,void * data)5536 void menuitem_config_callback(GtkMenuItem * menuitem, void *data)
5537 {
5538     GtkWidget *config_window;
5539     GtkWidget *conf_vbox;
5540     GtkWidget *conf_hbutton_box;
5541     GtkWidget *conf_ok;
5542     GtkWidget *conf_cancel;
5543     GtkWidget *conf_table;
5544     GtkWidget *conf_label;
5545     GtkWidget *conf_page1;
5546     GtkWidget *conf_page2;
5547     GtkWidget *conf_page3;
5548     GtkWidget *conf_page4;
5549     GtkWidget *conf_page5;
5550     GtkWidget *conf_page6;
5551     GtkWidget *conf_page7;
5552     GtkWidget *notebook;
5553     GdkColor sub_color;
5554     gint i = 0;
5555     gint j = -1;
5556     gint k = -1;
5557     GtkTreeIter ao_iter;
5558     gchar *desc;
5559     guint key;
5560     GdkModifierType modifier;
5561 
5562     config_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
5563     gtk_window_set_type_hint(GTK_WINDOW(config_window), GDK_WINDOW_TYPE_HINT_UTILITY);
5564     gtk_window_set_resizable(GTK_WINDOW(config_window), FALSE);
5565     gtk_window_set_transient_for(GTK_WINDOW(config_window), GTK_WINDOW(window));
5566     gtk_window_set_position(GTK_WINDOW(config_window), GTK_WIN_POS_CENTER_ON_PARENT);
5567     gtk_window_set_icon(GTK_WINDOW(config_window), pb_icon);
5568 
5569     gtk_window_set_resizable(GTK_WINDOW(config_window), FALSE);
5570 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5571     conf_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5572     gtk_box_set_homogeneous(GTK_BOX(conf_vbox), FALSE);
5573 #else
5574     conf_vbox = gtk_vbox_new(FALSE, 10);
5575 #endif
5576 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5577     conf_page1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5578     gtk_box_set_homogeneous(GTK_BOX(conf_page1), FALSE);
5579 #else
5580     conf_page1 = gtk_vbox_new(FALSE, 10);
5581 #endif
5582 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5583     conf_page2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5584     gtk_box_set_homogeneous(GTK_BOX(conf_page2), FALSE);
5585 #else
5586     conf_page2 = gtk_vbox_new(FALSE, 10);
5587 #endif
5588 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5589     conf_page3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5590     gtk_box_set_homogeneous(GTK_BOX(conf_page3), FALSE);
5591 #else
5592     conf_page3 = gtk_vbox_new(FALSE, 10);
5593 #endif
5594 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5595     conf_page4 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5596     gtk_box_set_homogeneous(GTK_BOX(conf_page4), FALSE);
5597 #else
5598     conf_page4 = gtk_vbox_new(FALSE, 10);
5599 #endif
5600 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5601     conf_page5 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5602     gtk_box_set_homogeneous(GTK_BOX(conf_page5), FALSE);
5603 #else
5604     conf_page5 = gtk_vbox_new(FALSE, 10);
5605 #endif
5606 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5607     conf_page6 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5608     gtk_box_set_homogeneous(GTK_BOX(conf_page6), FALSE);
5609 #else
5610     conf_page6 = gtk_vbox_new(FALSE, 10);
5611 #endif
5612 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
5613     conf_page7 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
5614     gtk_box_set_homogeneous(GTK_BOX(conf_page7), FALSE);
5615 #else
5616     conf_page7 = gtk_vbox_new(FALSE, 10);
5617 #endif
5618     conf_hbutton_box = gtk_hbutton_box_new();
5619     gtk_button_box_set_layout(GTK_BUTTON_BOX(conf_hbutton_box), GTK_BUTTONBOX_END);
5620     conf_table = gtk_table_new(20, 2, FALSE);
5621 
5622     notebook = gtk_notebook_new();
5623     conf_label = gtk_label_new(_("Player"));
5624     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page1, conf_label);
5625     conf_label = gtk_label_new(_("Language Settings"));
5626     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page3, conf_label);
5627     conf_label = gtk_label_new(_("Subtitles"));
5628     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page4, conf_label);
5629     conf_label = gtk_label_new(_("Interface"));
5630     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page5, conf_label);
5631     conf_label = gtk_label_new(_("Keyboard Shortcuts"));
5632     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page7, conf_label);
5633     conf_label = gtk_label_new(_("MPlayer"));
5634     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page6, conf_label);
5635     conf_label = gtk_label_new(_("Plugin"));
5636     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), conf_page2, conf_label);
5637 
5638     gtk_container_add(GTK_CONTAINER(conf_vbox), notebook);
5639     gtk_container_add(GTK_CONTAINER(config_window), conf_vbox);
5640 
5641     gtk_window_set_title(GTK_WINDOW(config_window), _("GNOME MPlayer Configuration"));
5642     gtk_container_set_border_width(GTK_CONTAINER(config_window), 5);
5643     gtk_window_set_default_size(GTK_WINDOW(config_window), 300, 300);
5644     conf_ok = gtk_button_new_from_stock(GTK_STOCK_OK);
5645     g_signal_connect_swapped(G_OBJECT(conf_ok), "clicked", G_CALLBACK(config_apply), config_window);
5646 
5647     conf_cancel = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
5648     g_signal_connect_swapped(G_OBJECT(conf_cancel), "clicked", G_CALLBACK(config_apply), config_window);
5649 
5650 #ifdef GTK2_24_ENABLED
5651     config_vo = gtk_combo_box_text_new_with_entry();
5652 #else
5653     config_vo = gtk_combo_box_entry_new_text();
5654 #endif
5655 
5656 #ifdef GTK2_12_ENABLED
5657     gtk_widget_set_tooltip_text(config_vo,
5658                                 _
5659                                 ("mplayer video output device\nx11 should always work, try xv, gl or vdpau for better performance and enhanced features"));
5660 
5661 #else
5662     tooltip = gtk_tooltips_new();
5663     gtk_tooltips_set_tip(tooltip, config_vo,
5664                          _
5665                          ("mplayer video output device\nx11 should always work, try xv, gl or vdpau for better performance and enhanced features"),
5666                          NULL);
5667 #endif
5668     if (config_vo != NULL) {
5669 #ifdef GTK2_24_ENABLED
5670         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "gl");
5671         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "gl2");
5672         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "gl3");
5673         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "x11");
5674         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "xv");
5675         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "xvmc");
5676 #ifndef __OpenBSD__
5677         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "vaapi");
5678         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), "vdpau");
5679 #endif
5680 #else
5681         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "gl");
5682         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "gl2");
5683         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "gl3");
5684         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "x11");
5685         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "xv");
5686         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "xvmc");
5687 #ifndef __OpenBSD__
5688         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "vaapi");
5689         gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), "vdpau");
5690 #endif
5691 #endif
5692 
5693         if (vo != NULL) {
5694             if (strcmp(vo, "gl") == 0)
5695                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 0);
5696             if (strcmp(vo, "gl2") == 0)
5697                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 1);
5698             if (strcmp(vo, "gl3") == 0)
5699                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 2);
5700             if (strcmp(vo, "x11") == 0)
5701                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 3);
5702             if (strcmp(vo, "xv") == 0)
5703                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 4);
5704             if (strcmp(vo, "xvmc") == 0)
5705                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 5);
5706             if (strcmp(vo, "vaapi") == 0)
5707                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 6);
5708             if (strcmp(vo, "vdpau") == 0)
5709                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 7);
5710             if (gtk_combo_box_get_active(GTK_COMBO_BOX(config_vo))
5711                 == -1) {
5712 #ifdef GTK2_24_ENABLED
5713                 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_vo), vo);
5714 #else
5715                 gtk_combo_box_append_text(GTK_COMBO_BOX(config_vo), vo);
5716 #endif
5717 #ifndef __OpenBSD__
5718                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 8);
5719 #else
5720                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_vo), 6);
5721 #endif
5722             }
5723         }
5724     }
5725 
5726     config_use_hw_audio = gtk_check_button_new_with_mnemonic(_("Enable AC3/DTS pass-through to S/PDIF"));
5727     g_signal_connect(GTK_WIDGET(config_use_hw_audio), "toggled", G_CALLBACK(hw_audio_toggle_callback), NULL);
5728 
5729 #ifdef GTK2_24_ENABLED
5730     config_mixer = gtk_combo_box_text_new_with_entry();
5731 #else
5732     config_mixer = gtk_combo_box_entry_new_text();
5733 #endif
5734 
5735     config_softvol = gtk_check_button_new_with_label(_("Mplayer Software Volume Control Enabled"));
5736     conf_volume_label = gtk_label_new("");
5737 
5738     config_ao = gmtk_output_combo_box_new();
5739     g_signal_connect(GTK_WIDGET(config_ao), "changed", G_CALLBACK(output_combobox_changed_callback), config_mixer);
5740 
5741     if (gtk_tree_model_get_iter_first(gmtk_output_combo_box_get_tree_model(GMTK_OUTPUT_COMBO_BOX(config_ao)), &ao_iter)) {
5742         do {
5743             if (gtk_list_store_iter_is_valid
5744                 (GTK_LIST_STORE(gmtk_output_combo_box_get_tree_model(GMTK_OUTPUT_COMBO_BOX(config_ao))), &ao_iter)) {
5745                 gtk_tree_model_get(gmtk_output_combo_box_get_tree_model
5746                                    (GMTK_OUTPUT_COMBO_BOX(config_ao)), &ao_iter, OUTPUT_DESCRIPTION_COLUMN, &desc, -1);
5747 
5748                 gm_log(verbose, G_LOG_LEVEL_DEBUG, "audio_device_name = %s, desc = %s", audio_device_name, desc);
5749                 if (audio_device_name != NULL && strcmp(audio_device_name, desc) == 0) {
5750                     gtk_combo_box_set_active_iter(GTK_COMBO_BOX(config_ao), &ao_iter);
5751                     g_free(desc);
5752                     break;
5753                 }
5754 
5755                 if ((audio_device_name == NULL || strcmp(audio_device_name, "") == 0)
5756                     && strcmp(desc, _("Default")) == 0) {
5757                     gtk_combo_box_set_active_iter(GTK_COMBO_BOX(config_ao), &ao_iter);
5758                     g_free(desc);
5759                     break;
5760                 }
5761                 g_free(desc);
5762 
5763             }
5764         } while (gtk_tree_model_iter_next
5765                  (gmtk_output_combo_box_get_tree_model(GMTK_OUTPUT_COMBO_BOX(config_ao)), &ao_iter));
5766     }
5767 #ifdef GTK2_24_ENABLED
5768     config_alang = gtk_combo_box_text_new_with_entry();
5769 #else
5770     config_alang = gtk_combo_box_entry_new_text();
5771 #endif
5772     if (config_alang != NULL) {
5773         i = 0;
5774         j = -1;
5775         k = -1;
5776         while (langlist[i] != NULL) {
5777             if (alang != NULL && strlen(alang) > 0 && g_ascii_strncasecmp(alang, langlist[i], strlen(alang)) == 0)
5778                 j = i;
5779             if (alang != NULL && strlen(alang) == 0
5780                 && g_ascii_strncasecmp("English,eng,en", langlist[i], strlen("English,eng,en")) == 0)
5781                 k = i;
5782 #ifdef GTK2_24_ENABLED
5783             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_alang), langlist[i++]);
5784 #else
5785             gtk_combo_box_append_text(GTK_COMBO_BOX(config_alang), langlist[i++]);
5786 #endif
5787             if (j != -1) {
5788                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_alang), j);
5789             }
5790             if (k != -1) {
5791                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_alang), k);
5792             }
5793         }
5794         if (alang != NULL && strlen(alang) > 0 && j == -1) {
5795 #ifdef GTK2_24_ENABLED
5796             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_alang), alang);
5797 #else
5798             gtk_combo_box_append_text(GTK_COMBO_BOX(config_alang), alang);
5799 #endif
5800             gtk_combo_box_set_active(GTK_COMBO_BOX(config_alang), i);
5801         }
5802         gtk_widget_set_tooltip_text(config_alang,
5803                                     _("Choose one of the languages or type in your own comma-separated selection"));
5804     }
5805 #ifdef GTK2_24_ENABLED
5806     config_slang = gtk_combo_box_text_new_with_entry();
5807 #else
5808     config_slang = gtk_combo_box_entry_new_text();
5809 #endif
5810     if (config_slang != NULL) {
5811         i = 0;
5812         j = -1;
5813         k = -1;
5814         while (langlist[i] != NULL) {
5815             if (slang != NULL && strlen(slang) > 0 && g_ascii_strncasecmp(slang, langlist[i], strlen(slang)) == 0)
5816                 j = i;
5817             if (slang != NULL && strlen(slang) == 0
5818                 && g_ascii_strncasecmp("English,eng,en", langlist[i], strlen("English,eng,en")) == 0)
5819                 k = i;
5820 #ifdef GTK2_24_ENABLED
5821             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_slang), langlist[i++]);
5822 #else
5823             gtk_combo_box_append_text(GTK_COMBO_BOX(config_slang), langlist[i++]);
5824 #endif
5825             if (j != -1) {
5826                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_slang), j);
5827             }
5828             if (k != -1) {
5829                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_slang), k);
5830             }
5831         }
5832         if (slang != NULL && strlen(slang) > 0 && j == -1) {
5833 #ifdef GTK2_24_ENABLED
5834             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_slang), slang);
5835 #else
5836             gtk_combo_box_append_text(GTK_COMBO_BOX(config_slang), slang);
5837 #endif
5838             gtk_combo_box_set_active(GTK_COMBO_BOX(config_slang), i);
5839         }
5840         gtk_widget_set_tooltip_text(config_slang,
5841                                     _("Choose one of the languages or type in your own comma-separated selection"));
5842     }
5843 #ifdef GTK2_24_ENABLED
5844     config_metadata_codepage = gtk_combo_box_text_new_with_entry();
5845 #else
5846     config_metadata_codepage = gtk_combo_box_entry_new_text();
5847 #endif
5848     if (config_metadata_codepage != NULL) {
5849         i = 0;
5850         j = -1;
5851         while (codepagelist[i] != NULL) {
5852             if (metadata_codepage != NULL && strlen(metadata_codepage) > 1
5853                 && g_ascii_strncasecmp(metadata_codepage, codepagelist[i], strlen(metadata_codepage)) == 0)
5854                 j = i;
5855 #ifdef GTK2_24_ENABLED
5856             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_metadata_codepage), codepagelist[i++]);
5857 #else
5858             gtk_combo_box_append_text(GTK_COMBO_BOX(config_metadata_codepage), codepagelist[i++]);
5859 #endif
5860             if (j != -1)
5861                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_metadata_codepage), j);
5862         }
5863         if (metadata_codepage != NULL && j == -1) {
5864 #ifdef GTK2_24_ENABLED
5865             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_metadata_codepage), metadata_codepage);
5866 #else
5867             gtk_combo_box_append_text(GTK_COMBO_BOX(config_metadata_codepage), metadata_codepage);
5868 #endif
5869             gtk_combo_box_set_active(GTK_COMBO_BOX(config_metadata_codepage), i);
5870         }
5871     }
5872 #ifdef GTK2_24_ENABLED
5873     config_subtitle_codepage = gtk_combo_box_text_new_with_entry();
5874 #else
5875     config_subtitle_codepage = gtk_combo_box_entry_new_text();
5876 #endif
5877     if (config_subtitle_codepage != NULL) {
5878         i = 0;
5879         j = -1;
5880         while (codepagelist[i] != NULL) {
5881             if (subtitle_codepage != NULL && strlen(subtitle_codepage) > 1
5882                 && g_ascii_strncasecmp(subtitle_codepage, codepagelist[i], strlen(subtitle_codepage)) == 0)
5883                 j = i;
5884 #ifdef GTK2_24_ENABLED
5885             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_subtitle_codepage), codepagelist[i++]);
5886 #else
5887             gtk_combo_box_append_text(GTK_COMBO_BOX(config_subtitle_codepage), codepagelist[i++]);
5888 #endif
5889 
5890             if (j != -1)
5891                 gtk_combo_box_set_active(GTK_COMBO_BOX(config_subtitle_codepage), j);
5892         }
5893         if (subtitle_codepage != NULL && j == -1) {
5894 #ifdef GTK2_24_ENABLED
5895             gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_subtitle_codepage), subtitle_codepage);
5896 #else
5897             gtk_combo_box_append_text(GTK_COMBO_BOX(config_subtitle_codepage), subtitle_codepage);
5898 #endif
5899             gtk_combo_box_set_active(GTK_COMBO_BOX(config_subtitle_codepage), i);
5900         }
5901     }
5902 #ifdef GTK2_24_ENABLED
5903     config_audio_channels = gtk_combo_box_text_new_with_entry();
5904 #else
5905     config_audio_channels = gtk_combo_box_entry_new_text();
5906 #endif
5907     if (config_audio_channels != NULL) {
5908 #ifdef GTK2_24_ENABLED
5909 
5910         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_audio_channels), "Stereo");
5911         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_audio_channels), "Surround");
5912         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_audio_channels), "5.1 Surround");
5913         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_audio_channels), "7.1 Surround");
5914 #else
5915 
5916         gtk_combo_box_append_text(GTK_COMBO_BOX(config_audio_channels), "Stereo");
5917         gtk_combo_box_append_text(GTK_COMBO_BOX(config_audio_channels), "Surround");
5918         gtk_combo_box_append_text(GTK_COMBO_BOX(config_audio_channels), "5.1 Surround");
5919         gtk_combo_box_append_text(GTK_COMBO_BOX(config_audio_channels), "7.1 Surround");
5920 #endif
5921         gtk_combo_box_set_active(GTK_COMBO_BOX(config_audio_channels), audio_channels);
5922     }
5923 #ifdef GTK2_24_ENABLED
5924     config_resume_mode = gtk_combo_box_text_new_with_entry();
5925 #else
5926     config_resume_mode = gtk_combo_box_new_text();
5927 #endif
5928     if (config_resume_mode != NULL) {
5929 #ifdef GTK2_24_ENABLED
5930 
5931         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_resume_mode), _("Always ask"));
5932         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_resume_mode), _("Always resume without asking"));
5933         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_resume_mode), _("Never resume"));
5934 #else
5935 
5936         gtk_combo_box_append_text(GTK_COMBO_BOX(config_resume_mode), _("Always ask"));
5937         gtk_combo_box_append_text(GTK_COMBO_BOX(config_resume_mode), _("Always resume without asking"));
5938         gtk_combo_box_append_text(GTK_COMBO_BOX(config_resume_mode), _("Never resume"));
5939 #endif
5940         gtk_combo_box_set_active(GTK_COMBO_BOX(config_resume_mode), resume_mode);
5941     }
5942 
5943     i = 0;
5944     j = -1;
5945 
5946 #ifdef GTK2_24_ENABLED
5947     config_mplayer_dvd_device = gtk_combo_box_text_new_with_entry();
5948 #else
5949     config_mplayer_dvd_device = gtk_combo_box_entry_new_text();
5950 #endif
5951 
5952 #ifdef __OpenBSD__
5953 #ifdef GTK2_24_ENABLED
5954     gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_mplayer_dvd_device), "/dev/rcd0c");
5955 #else
5956     gtk_combo_box_append_text(GTK_COMBO_BOX(config_mplayer_dvd_device), "/dev/rcd0c");
5957 #endif
5958 
5959     if (mplayer_dvd_device == NULL || g_ascii_strcasecmp("/dev/rcd0c", mplayer_dvd_device) == 0) {
5960         j = i;
5961     }
5962 #else
5963 #ifdef GTK2_24_ENABLED
5964     gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_mplayer_dvd_device), "/dev/dvd");
5965 #else
5966     gtk_combo_box_append_text(GTK_COMBO_BOX(config_mplayer_dvd_device), "/dev/dvd");
5967 #endif
5968     if (mplayer_dvd_device == NULL || g_ascii_strcasecmp("/dev/dvd", mplayer_dvd_device) == 0) {
5969         j = i;
5970     }
5971 #endif
5972     i++;
5973 
5974 #ifdef GIO_ENABLED
5975     GVolumeMonitor *volumemonitor;
5976     GList *d, *drives;
5977     GDrive *drive;
5978     gchar *unix_device;
5979 
5980 
5981     volumemonitor = g_volume_monitor_get();
5982     if (volumemonitor != NULL) {
5983         drives = g_volume_monitor_get_connected_drives(volumemonitor);
5984 
5985         for (d = drives; d != NULL; d = d->next) {
5986             drive = G_DRIVE(d->data);
5987             if (g_drive_can_poll_for_media(drive)) {
5988                 unix_device = g_drive_get_identifier(drive, "unix-device");
5989                 if (unix_device != NULL) {
5990 #ifdef GTK2_24_ENABLED
5991                     gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_mplayer_dvd_device), unix_device);
5992 #else
5993                     gtk_combo_box_append_text(GTK_COMBO_BOX(config_mplayer_dvd_device), unix_device);
5994 #endif
5995 
5996                     if (mplayer_dvd_device != NULL && g_ascii_strcasecmp(unix_device, mplayer_dvd_device) == 0) {
5997                         j = i;
5998                     }
5999                     g_free(unix_device);
6000                     i++;
6001                 }
6002             }
6003         }
6004 
6005     }
6006 #endif
6007     if (j != -1) {
6008         gtk_combo_box_set_active(GTK_COMBO_BOX(config_mplayer_dvd_device), j);
6009     } else {
6010 #ifdef GTK2_24_ENABLED
6011         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(config_mplayer_dvd_device), mplayer_dvd_device);
6012 #else
6013         gtk_combo_box_append_text(GTK_COMBO_BOX(config_mplayer_dvd_device), mplayer_dvd_device);
6014 #endif
6015         gtk_combo_box_set_active(GTK_COMBO_BOX(config_mplayer_dvd_device), i);
6016     }
6017 
6018 
6019     conf_label = gtk_label_new(_("<span weight=\"bold\">Adjust Output Settings</span>"));
6020     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6021     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6022     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6023     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6024     i++;
6025 
6026     conf_label = gtk_label_new(_("Video Output:"));
6027     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6028     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6029     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6030     gtk_widget_show(conf_label);
6031     gtk_widget_set_size_request(GTK_WIDGET(config_vo), 200, -1);
6032     gtk_table_attach(GTK_TABLE(conf_table), config_vo, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6033     i++;
6034 
6035     config_hardware_codecs = gtk_check_button_new_with_label(_("Enable Video Hardware Support"));
6036     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_hardware_codecs), use_hardware_codecs);
6037 #ifdef GTK2_12_ENABLED
6038     gtk_widget_set_tooltip_text(config_hardware_codecs,
6039                                 _
6040                                 ("When this option is enabled, codecs or options will be enabled to accelerate video processing. These options may cause playback to fail in some cases."));
6041 #else
6042     tooltip = gtk_tooltips_new();
6043     gtk_tooltips_set_tip(tooltip, config_hardware_codecs,
6044                          _
6045                          ("When this option is enabled, codecs or options will be enabled to accelerate video processing. These options may cause playback to fail in some cases."),
6046                          NULL);
6047 #endif
6048     gtk_widget_set_size_request(GTK_WIDGET(config_hardware_codecs), 200, -1);
6049     gtk_table_attach(GTK_TABLE(conf_table), config_hardware_codecs, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK,
6050                      0, 0);
6051     i++;
6052 
6053     config_crystalhd_codecs = gtk_check_button_new_with_label(_("Enable CrystalHD Hardware Support"));
6054     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_crystalhd_codecs), use_crystalhd_codecs);
6055     gtk_widget_set_size_request(GTK_WIDGET(config_crystalhd_codecs), 200, -1);
6056     gtk_table_attach(GTK_TABLE(conf_table), config_crystalhd_codecs, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK,
6057                      0, 0);
6058     i++;
6059 
6060     conf_label = gtk_label_new(_("Audio Output:"));
6061     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6062     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6063     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6064     gtk_widget_show(conf_label);
6065     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6066     gtk_widget_set_size_request(GTK_WIDGET(config_ao), 200, -1);
6067     gtk_table_attach(GTK_TABLE(conf_table), config_ao, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6068     i++;
6069 
6070     conf_label = gtk_label_new(_("Audio Volume Type:"));
6071     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6072     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6073     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6074     gtk_widget_show(conf_label);
6075     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6076     gtk_misc_set_padding(GTK_MISC(conf_volume_label), 6, 6);
6077     gtk_misc_set_alignment(GTK_MISC(conf_volume_label), 0.0, 0.5);
6078     gtk_table_attach(GTK_TABLE(conf_table), conf_volume_label, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6079     i++;
6080 
6081 #ifdef HAVE_ASOUNDLIB
6082     conf_label = gtk_label_new(_("Default Mixer:"));
6083     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6084     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6085     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6086     gtk_widget_show(conf_label);
6087     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6088     gtk_widget_set_size_request(GTK_WIDGET(config_mixer), 200, -1);
6089     gtk_table_attach(GTK_TABLE(conf_table), config_mixer, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6090     i++;
6091 #endif
6092     conf_label = gtk_label_new(_("Audio Channels to Output:"));
6093     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6094     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6095     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6096     gtk_widget_show(conf_label);
6097     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6098     gtk_widget_set_size_request(GTK_WIDGET(config_audio_channels), 200, -1);
6099     gtk_table_attach(GTK_TABLE(conf_table), config_audio_channels, 1, 2, i, i + 1,
6100                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6101     i++;
6102 
6103     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_use_hw_audio), use_hw_audio);
6104     gtk_table_attach(GTK_TABLE(conf_table), config_use_hw_audio, 1, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6105     gtk_widget_show(config_use_hw_audio);
6106     i++;
6107 
6108     conf_label = gtk_label_new("");
6109     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6110     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6111     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_EXPAND, GTK_SHRINK, 0, 0);
6112     gtk_widget_show(conf_label);
6113     i++;
6114 
6115     gtk_container_add(GTK_CONTAINER(conf_page1), conf_table);
6116 
6117     //conf_table = gtk_table_new(20, 2, FALSE);
6118     //gtk_container_add(GTK_CONTAINER(conf_page1), conf_table);
6119     //i = 0;
6120     conf_label = gtk_label_new(_("<span weight=\"bold\">Adjust Configuration Settings</span>"));
6121     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6122     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6123     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6124     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6125     i++;
6126 
6127 #ifndef HAVE_ASOUNDLIB
6128     conf_label = gtk_label_new(_("Default Volume Level:"));
6129     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6130     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6131     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6132     gtk_widget_show(conf_label);
6133     config_volume = gtk_spin_button_new_with_range(0, 100, 1);
6134 #ifdef GTK2_12_ENABLED
6135     gtk_widget_set_tooltip_text(config_volume, _("Default volume for playback"));
6136 #else
6137     tooltip = gtk_tooltips_new();
6138     gtk_tooltips_set_tip(tooltip, config_volume, _("Default volume for playback"), NULL);
6139 #endif
6140     gtk_widget_set_size_request(config_volume, 100, -1);
6141     gtk_table_attach(GTK_TABLE(conf_table), config_volume, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6142     gm_store = gm_pref_store_new("gnome-mplayer");
6143     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_volume), gm_pref_store_get_int(gm_store, VOLUME));
6144     gm_pref_store_free(gm_store);
6145     gtk_entry_set_width_chars(GTK_ENTRY(config_volume), 6);
6146     gtk_editable_set_editable(GTK_EDITABLE(config_volume), TRUE);
6147     gtk_entry_set_alignment(GTK_ENTRY(config_volume), 1);
6148     gtk_widget_show(config_volume);
6149     i++;
6150 #endif
6151 
6152     conf_label = gtk_label_new(_("On Screen Display Level:"));
6153     config_osdlevel = gtk_hscale_new_with_range(0.0, 3.0, 1.0);
6154     gtk_range_set_value(GTK_RANGE(config_osdlevel), osdlevel);
6155     g_signal_connect(G_OBJECT(config_osdlevel), "format-value", G_CALLBACK(osdlevel_format_callback), NULL);
6156     g_signal_connect(G_OBJECT(config_osdlevel), "value-changed", G_CALLBACK(osdlevel_change_callback), NULL);
6157     gtk_widget_set_size_request(config_osdlevel, 150, -1);
6158     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 1.0);
6159     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6160     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6161     gtk_table_attach(GTK_TABLE(conf_table), config_osdlevel, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6162     i++;
6163 
6164     conf_label = gtk_label_new(_("Post-processing level:"));
6165     config_pplevel = gtk_hscale_new_with_range(0.0, 6.0, 1.0);
6166     g_signal_connect(G_OBJECT(config_pplevel), "format-value", G_CALLBACK(pplevel_format_callback), NULL);
6167     gtk_widget_set_size_request(config_pplevel, 150, -1);
6168     gtk_range_set_value(GTK_RANGE(config_pplevel), pplevel);
6169     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 1.0);
6170     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6171     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6172     gtk_table_attach(GTK_TABLE(conf_table), config_pplevel, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6173     i++;
6174 
6175     conf_table = gtk_table_new(20, 2, FALSE);
6176     gtk_container_add(GTK_CONTAINER(conf_page2), conf_table);
6177     i = 0;
6178     conf_label = gtk_label_new(_("<span weight=\"bold\">Adjust Plugin Emulation Settings</span>\n\n"
6179                                  "These options affect the gecko-mediaplayer plugin when it is installed.\n"
6180                                  "Gecko-mediaplayer is a Firefox plugin that will emulate various\n"
6181                                  "media players and allow playback of various web content within\n"
6182                                  "NPRuntime compatible browsers (Firefox, Konqueror, etc)."));
6183     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6184     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6185     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6186     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6187     i++;
6188 
6189     config_qt = gtk_check_button_new_with_label(_("QuickTime Emulation"));
6190     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_qt), !qt_disabled);
6191     gtk_table_attach(GTK_TABLE(conf_table), config_qt, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6192     i++;
6193 
6194     config_real = gtk_check_button_new_with_label(_("RealPlayer Emulation"));
6195     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_real), !real_disabled);
6196     gtk_table_attach(GTK_TABLE(conf_table), config_real, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6197     i++;
6198 
6199     config_wmp = gtk_check_button_new_with_label(_("Windows Media Player Emulation"));
6200     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_wmp), !wmp_disabled);
6201     gtk_table_attach(GTK_TABLE(conf_table), config_wmp, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6202     i++;
6203 
6204     config_dvx = gtk_check_button_new_with_label(_("DiVX Player Emulation"));
6205     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_dvx), !dvx_disabled);
6206     gtk_table_attach(GTK_TABLE(conf_table), config_dvx, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6207     i++;
6208 
6209     config_midi = gtk_check_button_new_with_label(_("MIDI Support (requires MPlayer support)"));
6210     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_midi), !midi_disabled);
6211     gtk_table_attach(GTK_TABLE(conf_table), config_midi, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6212     i++;
6213 
6214     config_noembed = gtk_check_button_new_with_label(_("Disable Player Embedding"));
6215     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_noembed), embedding_disabled);
6216     gtk_table_attach(GTK_TABLE(conf_table), config_noembed, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6217     i++;
6218 
6219     config_noscaling = gtk_check_button_new_with_label(_("Disable Embedded Player Scaling"));
6220     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_noscaling), disable_embedded_scaling);
6221     gtk_table_attach(GTK_TABLE(conf_table), config_noscaling, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6222     i++;
6223 
6224     conf_label = gtk_label_new(_("Audio Cache Size (KB):"));
6225     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6226     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6227     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6228     gtk_widget_show(conf_label);
6229     config_plugin_audio_cache_size = gtk_spin_button_new_with_range(64, 256 * 1024, 64);
6230     config_plugin_video_cache_size = gtk_spin_button_new_with_range(256, 256 * 1024, 256);
6231 #ifdef GTK2_12_ENABLED
6232     gtk_widget_set_tooltip_text(config_plugin_audio_cache_size,
6233                                 _
6234                                 ("Amount of data to cache when playing media from network, use higher values for slow networks."));
6235     gtk_widget_set_tooltip_text(config_plugin_video_cache_size,
6236                                 _
6237                                 ("Amount of data to cache when playing media from network, use higher values for slow networks."));
6238 
6239 #else
6240     tooltip = gtk_tooltips_new();
6241     gtk_tooltips_set_tip(tooltip, config_plugin_audio_cache_size,
6242                          _
6243                          ("Amount of data to cache when playing media from network, use higher values for slow networks."),
6244                          NULL);
6245     tooltip = gtk_tooltips_new();
6246     gtk_tooltips_set_tip(tooltip, config_plugin_video_cache_size,
6247                          _
6248                          ("Amount of data to cache when playing media from network, use higher values for slow networks."),
6249                          NULL);
6250 #endif
6251     //gtk_widget_set_size_request(config_plugin_cache_size, 200, -1);
6252     gtk_table_attach(GTK_TABLE(conf_table), config_plugin_audio_cache_size, 1, 2, i, i + 1,
6253                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6254     //gtk_range_set_value(GTK_RANGE(config_cachesize), cache_size);
6255     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_plugin_audio_cache_size), plugin_audio_cache_size);
6256     gtk_entry_set_width_chars(GTK_ENTRY(config_plugin_audio_cache_size), 6);
6257 #ifndef GTK2_24_ENABLED
6258     gtk_entry_set_editable(GTK_ENTRY(config_plugin_audio_cache_size), FALSE);
6259 #endif
6260     gtk_entry_set_alignment(GTK_ENTRY(config_plugin_audio_cache_size), 1);
6261     gtk_widget_show(config_plugin_audio_cache_size);
6262     i++;
6263 
6264     conf_label = gtk_label_new(_("Video Cache Size (KB):"));
6265     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6266     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6267     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6268     gtk_widget_show(conf_label);
6269 
6270     gtk_table_attach(GTK_TABLE(conf_table), config_plugin_video_cache_size, 1, 2, i, i + 1,
6271                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6272     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_plugin_video_cache_size), plugin_video_cache_size);
6273     gtk_entry_set_width_chars(GTK_ENTRY(config_plugin_video_cache_size), 6);
6274 #ifndef GTK2_24_ENABLED
6275     gtk_entry_set_editable(GTK_ENTRY(config_plugin_video_cache_size), FALSE);
6276 #endif
6277     gtk_entry_set_alignment(GTK_ENTRY(config_plugin_video_cache_size), 1);
6278     gtk_widget_show(config_plugin_video_cache_size);
6279     i++;
6280 
6281 
6282     // Language
6283     conf_table = gtk_table_new(20, 2, FALSE);
6284     gtk_container_add(GTK_CONTAINER(conf_page3), conf_table);
6285     i = 0;
6286     conf_label = gtk_label_new(_("<span weight=\"bold\">Adjust Language Settings</span>"));
6287     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6288     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6289     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6290     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6291     i++;
6292 
6293     conf_label = gtk_label_new(_("Default Audio Language"));
6294     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6295     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6296     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6297     gtk_widget_show(conf_label);
6298     gtk_widget_set_size_request(GTK_WIDGET(config_alang), 200, -1);
6299     gtk_table_attach(GTK_TABLE(conf_table), config_alang, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6300     gtk_widget_set_tooltip_text(conf_label,
6301                                 _("Choose one of the languages or type in your own comma-separated selection"));
6302     i++;
6303 
6304     conf_label = gtk_label_new(_("Default Subtitle Language:"));
6305     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6306     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6307     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);;
6308     gtk_widget_show(conf_label);
6309     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6310     gtk_widget_set_size_request(GTK_WIDGET(config_slang), 200, -1);
6311     gtk_table_attach(GTK_TABLE(conf_table), config_slang, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6312     gtk_widget_set_tooltip_text(conf_label,
6313                                 _("Choose one of the languages or type in your own comma-separated selection"));
6314     i++;
6315 
6316     conf_label = gtk_label_new(_("File Metadata Encoding:"));
6317     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6318     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6319     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6320     gtk_widget_show(conf_label);
6321     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6322     gtk_widget_set_size_request(GTK_WIDGET(config_metadata_codepage), 200, -1);
6323 
6324     gtk_table_attach(GTK_TABLE(conf_table), config_metadata_codepage, 1, 2, i, i + 1,
6325                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6326     i++;
6327 
6328     // Page 4
6329     conf_table = gtk_table_new(20, 2, FALSE);
6330     gtk_container_add(GTK_CONTAINER(conf_page4), conf_table);
6331     i = 0;
6332     conf_label = gtk_label_new(_("<span weight=\"bold\">Subtitle Settings</span>"));
6333     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6334     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6335     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6336     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6337     i++;
6338 
6339     config_ass = gtk_check_button_new_with_mnemonic(_("Enable _Advanced Substation Alpha (ASS) Subtitle Support"));
6340     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_ass), !disable_ass);
6341     g_signal_connect(G_OBJECT(config_ass), "toggled", G_CALLBACK(ass_toggle_callback), NULL);
6342     gtk_table_attach(GTK_TABLE(conf_table), config_ass, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6343     gtk_widget_show(config_ass);
6344     i++;
6345 
6346     config_embeddedfonts = gtk_check_button_new_with_mnemonic(_("Use _Embedded Fonts (MKV only)"));
6347     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_embeddedfonts), !disable_embeddedfonts);
6348     gtk_widget_set_sensitive(config_embeddedfonts, !disable_ass);
6349 //    g_signal_connect(G_OBJECT(config_embeddedfonts), "toggled",
6350 //                     G_CALLBACK(embedded_fonts_toggle_callback), NULL);
6351     gtk_table_attach(GTK_TABLE(conf_table), config_embeddedfonts, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6352     gtk_widget_show(config_embeddedfonts);
6353     i++;
6354 
6355     conf_label = gtk_label_new(_("Subtitle Font:"));
6356     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6357     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6358     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6359     gtk_widget_show(conf_label);
6360     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6361 
6362     config_subtitle_font = gtk_font_button_new();
6363     if (subtitlefont != NULL) {
6364         gtk_font_button_set_font_name(GTK_FONT_BUTTON(config_subtitle_font), subtitlefont);
6365     }
6366 //    gtk_widget_set_sensitive(config_subtitle_font, disable_embeddedfonts);
6367     gtk_font_button_set_show_size(GTK_FONT_BUTTON(config_subtitle_font), TRUE);
6368     gtk_font_button_set_show_style(GTK_FONT_BUTTON(config_subtitle_font), TRUE);
6369 
6370     gtk_font_button_set_use_size(GTK_FONT_BUTTON(config_subtitle_font), FALSE);
6371     gtk_font_button_set_use_font(GTK_FONT_BUTTON(config_subtitle_font), TRUE);
6372 
6373     gtk_font_button_set_title(GTK_FONT_BUTTON(config_subtitle_font), _("Subtitle Font Selection"));
6374     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_font, 1, 2, i, i + 1,
6375                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6376     i++;
6377 
6378     conf_label = gtk_label_new(_("Subtitle Color:"));
6379     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6380     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6381     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6382     gtk_widget_show(conf_label);
6383     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6384     config_subtitle_color = gtk_color_button_new();
6385     if (subtitle_color != NULL && strlen(subtitle_color) > 5) {
6386         sub_color.red = g_ascii_xdigit_value(subtitle_color[0]) << 4;
6387         sub_color.red += g_ascii_xdigit_value(subtitle_color[1]);
6388         sub_color.red = sub_color.red << 8;
6389         sub_color.green = g_ascii_xdigit_value(subtitle_color[2]) << 4;
6390         sub_color.green += g_ascii_xdigit_value(subtitle_color[3]);
6391         sub_color.green = sub_color.green << 8;
6392         sub_color.blue = g_ascii_xdigit_value(subtitle_color[4]) << 4;
6393         sub_color.blue += g_ascii_xdigit_value(subtitle_color[5]);
6394         sub_color.blue = sub_color.blue << 8;
6395         gtk_color_button_set_color(GTK_COLOR_BUTTON(config_subtitle_color), &sub_color);
6396     } else {
6397         sub_color.red = 0xFF << 8;
6398         sub_color.green = 0xFF << 8;
6399         sub_color.blue = 0xFF << 8;
6400         gtk_color_button_set_color(GTK_COLOR_BUTTON(config_subtitle_color), &sub_color);
6401     }
6402     gtk_color_button_set_title(GTK_COLOR_BUTTON(config_subtitle_color), _("Subtitle Color Selection"));
6403     gtk_widget_set_sensitive(config_subtitle_color, !disable_ass);
6404     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_color, 1, 2, i, i + 1,
6405                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6406     i++;
6407 
6408     config_subtitle_outline = gtk_check_button_new_with_label(_("Outline Subtitle Font"));
6409 //    gtk_widget_set_sensitive(config_subtitle_outline, disable_embeddedfonts);
6410     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_subtitle_outline), subtitle_outline);
6411     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_outline, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6412     i++;
6413 
6414     config_subtitle_shadow = gtk_check_button_new_with_label(_("Shadow Subtitle Font"));
6415 //    gtk_widget_set_sensitive(config_subtitle_shadow, disable_embeddedfonts);
6416     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_subtitle_shadow), subtitle_shadow);
6417     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_shadow, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6418     i++;
6419 
6420     conf_label = gtk_label_new(_("Subtitle Font Scaling:"));
6421     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6422     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6423     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6424     gtk_widget_show(conf_label);
6425     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6426     config_subtitle_scale = gtk_spin_button_new_with_range(0.25, 10, 0.05);
6427     gtk_widget_set_size_request(config_subtitle_scale, -1, -1);
6428     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_subtitle_scale), subtitle_scale);
6429     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_scale, 1, 2, i, i + 1,
6430                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6431     i++;
6432 
6433     conf_label = gtk_label_new(_("Subtitle File Encoding:"));
6434     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6435     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6436     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6437     gtk_widget_show(conf_label);
6438     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6439     gtk_widget_set_size_request(GTK_WIDGET(config_subtitle_codepage), 200, -1);
6440 
6441     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_codepage, 1, 2, i, i + 1,
6442                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6443     i++;
6444 
6445     conf_label = gtk_label_new(_("Subtitle Lower Margin (X11/XV Only):"));
6446     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6447     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6448     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6449     gtk_widget_show(conf_label);
6450     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6451     config_subtitle_margin = gtk_spin_button_new_with_range(0, 200, 1);
6452     gtk_widget_set_size_request(config_subtitle_scale, -1, -1);
6453     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_subtitle_margin), subtitle_margin);
6454     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_margin, 1, 2, i, i + 1,
6455                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6456     i++;
6457 
6458     config_show_subtitles = gtk_check_button_new_with_label(_("Show Subtitles by Default"));
6459     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_show_subtitles), showsubtitles);
6460     gtk_table_attach(GTK_TABLE(conf_table), config_show_subtitles, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6461     i++;
6462 
6463     conf_label = gtk_label_new(_("Subtitle Load Fuzziness:"));
6464     config_subtitle_fuzziness = gtk_hscale_new_with_range(0.0, 2.0, 1.0);
6465     g_signal_connect(G_OBJECT(config_subtitle_fuzziness), "format-value",
6466                      G_CALLBACK(subtitle_fuzziness_format_callback), NULL);
6467     gtk_widget_set_size_request(config_subtitle_fuzziness, 150, -1);
6468     gtk_range_set_value(GTK_RANGE(config_subtitle_fuzziness), subtitle_fuzziness);
6469     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 1.0);
6470     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6471     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6472     gtk_table_attach(GTK_TABLE(conf_table), config_subtitle_fuzziness, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND,
6473                      GTK_SHRINK, 0, 0);
6474     i++;
6475 
6476 
6477     // Page 5
6478     conf_table = gtk_table_new(20, 2, FALSE);
6479     gtk_container_add(GTK_CONTAINER(conf_page5), conf_table);
6480     i = 0;
6481     conf_label = gtk_label_new(_("<span weight=\"bold\">Application Preferences</span>"));
6482     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6483     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6484     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6485     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6486     i++;
6487 
6488     conf_label = gtk_label_new(_("Media Resume:"));
6489     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6490     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6491     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6492     gtk_widget_show(conf_label);
6493     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6494     gtk_widget_set_size_request(GTK_WIDGET(config_resume_mode), 200, -1);
6495     gtk_table_attach(GTK_TABLE(conf_table), config_resume_mode, 1, 2, i, i + 1,
6496                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6497     i++;
6498 
6499     config_playlist_visible = gtk_check_button_new_with_label(_("Start with playlist visible"));
6500     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_playlist_visible), playlist_visible);
6501     gtk_table_attach(GTK_TABLE(conf_table), config_playlist_visible, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6502     i++;
6503 
6504     config_details_visible = gtk_check_button_new_with_label(_("Start with details visible"));
6505     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_details_visible), details_visible);
6506     gtk_table_attach(GTK_TABLE(conf_table), config_details_visible, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6507     i++;
6508 
6509     config_use_mediakeys = gtk_check_button_new_with_label(_("Respond to Keyboard Media Keys"));
6510     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_use_mediakeys), use_mediakeys);
6511     gtk_table_attach(GTK_TABLE(conf_table), config_use_mediakeys, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6512     i++;
6513 
6514     config_use_defaultpl = gtk_check_button_new_with_label(_("Use default playlist"));
6515     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_use_defaultpl), use_defaultpl);
6516     gtk_table_attach(GTK_TABLE(conf_table), config_use_defaultpl, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6517     i++;
6518 
6519 #ifdef NOTIFY_ENABLED
6520     config_show_notification = gtk_check_button_new_with_label(_("Show notification popup"));
6521     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_show_notification), show_notification);
6522     gtk_table_attach(GTK_TABLE(conf_table), config_show_notification, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6523     i++;
6524 #endif
6525 
6526 #ifdef GTK2_12_ENABLED
6527     config_show_status_icon = gtk_check_button_new_with_label(_("Show status icon"));
6528     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_show_status_icon), show_status_icon);
6529     gtk_table_attach(GTK_TABLE(conf_table), config_show_status_icon, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6530     i++;
6531 #endif
6532 
6533     config_vertical_layout =
6534         gtk_check_button_new_with_label(_("Place playlist below media (requires application restart)"));
6535     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_vertical_layout), vertical_layout);
6536     gtk_table_attach(GTK_TABLE(conf_table), config_vertical_layout, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6537     i++;
6538 
6539     config_single_instance = gtk_check_button_new_with_label(_("Only allow one instance of Gnome MPlayer"));
6540     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_single_instance), single_instance);
6541     gtk_table_attach(GTK_TABLE(conf_table), config_single_instance, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6542     g_signal_connect(G_OBJECT(config_single_instance), "toggled", G_CALLBACK(config_single_instance_callback), NULL);
6543     i++;
6544 
6545     conf_label = gtk_label_new("");
6546     gtk_label_set_width_chars(GTK_LABEL(conf_label), 3);
6547     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
6548     config_replace_and_play =
6549         gtk_check_button_new_with_label(_("When opening in single instance mode, replace existing file"));
6550     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_replace_and_play), replace_and_play);
6551     gtk_table_attach(GTK_TABLE(conf_table), config_replace_and_play, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6552     gtk_widget_set_sensitive(config_replace_and_play,
6553                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_single_instance)));
6554     i++;
6555     conf_label = gtk_label_new("");
6556     gtk_label_set_width_chars(GTK_LABEL(conf_label), 3);
6557     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
6558     config_bring_to_front = gtk_check_button_new_with_label(_("When opening file, bring main window to front"));
6559     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_bring_to_front), bring_to_front);
6560     gtk_table_attach(GTK_TABLE(conf_table), config_bring_to_front, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6561     gtk_widget_set_sensitive(config_bring_to_front,
6562                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_single_instance)));
6563 
6564     i++;
6565     config_remember_loc = gtk_check_button_new_with_label(_("Remember Window Location and Size"));
6566     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_remember_loc), remember_loc);
6567     gtk_table_attach(GTK_TABLE(conf_table), config_remember_loc, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6568     i++;
6569 
6570     config_resize_on_new_media = gtk_check_button_new_with_label(_("Resize window when new video is loaded"));
6571     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_resize_on_new_media), resize_on_new_media);
6572     gtk_table_attach(GTK_TABLE(conf_table), config_resize_on_new_media, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6573     i++;
6574 
6575     config_keep_on_top = gtk_check_button_new_with_label(_("Keep window above other windows"));
6576     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_keep_on_top), keep_on_top);
6577     gtk_table_attach(GTK_TABLE(conf_table), config_keep_on_top, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6578     i++;
6579 
6580     config_pause_on_click = gtk_check_button_new_with_label(_("Pause playback on mouse click"));
6581     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_pause_on_click), !disable_pause_on_click);
6582     gtk_table_attach(GTK_TABLE(conf_table), config_pause_on_click, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6583     i++;
6584 
6585     config_disable_animation = gtk_check_button_new_with_label(_("Disable Fullscreen Control Bar Animation"));
6586     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_disable_animation), disable_animation);
6587     gtk_table_attach(GTK_TABLE(conf_table), config_disable_animation, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6588     i++;
6589 
6590     config_disable_cover_art_fetch = gtk_check_button_new_with_label(_("Disable Cover Art Fetch"));
6591     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_disable_cover_art_fetch), disable_cover_art_fetch);
6592     gtk_table_attach(GTK_TABLE(conf_table), config_disable_cover_art_fetch, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6593     i++;
6594 
6595     config_mouse_wheel = gtk_check_button_new_with_label(_("Use Mouse Wheel to change volume, instead of seeking"));
6596     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_mouse_wheel), mouse_wheel_changes_volume);
6597     gtk_table_attach(GTK_TABLE(conf_table), config_mouse_wheel, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6598     i++;
6599 
6600     config_enable_nautilus_plugin = gtk_check_button_new_with_label(_("Enable Nautilus Plugin"));
6601     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_enable_nautilus_plugin), enable_nautilus_plugin);
6602     gtk_table_attach(GTK_TABLE(conf_table), config_enable_nautilus_plugin, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6603     i++;
6604 
6605     config_verbose = gtk_check_button_new_with_label(_("Verbose Debug Enabled"));
6606 #ifdef GTK2_12_ENABLED
6607     gtk_widget_set_tooltip_text(config_verbose,
6608                                 _
6609                                 ("When this option is set, extra debug information is sent to the terminal or into ~/.xsession-errors"));
6610 #else
6611     tooltip = gtk_tooltips_new();
6612     gtk_tooltips_set_tip(tooltip, config_verbose,
6613                          _
6614                          ("When this option is set, extra debug information is sent to the terminal or into ~/.xsession-errors"),
6615                          NULL);
6616 #endif
6617     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_verbose), verbose);
6618     gtk_table_attach(GTK_TABLE(conf_table), config_verbose, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6619     i++;
6620 
6621     // Page 6
6622     conf_table = gtk_table_new(20, 3, FALSE);
6623     gtk_container_add(GTK_CONTAINER(conf_page6), conf_table);
6624     i = 0;
6625     conf_label = gtk_label_new(_("<span weight=\"bold\">Advanced Settings for MPlayer</span>"));
6626     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6627     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6628     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6629     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 3, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6630     i++;
6631 
6632 #ifdef GTK2_12_ENABLED
6633     gtk_widget_set_tooltip_text(config_softvol,
6634                                 _("Set this option if changing the volume in Gnome MPlayer changes the master volume"));
6635 #else
6636     tooltip = gtk_tooltips_new();
6637     gtk_tooltips_set_tip(tooltip, config_softvol,
6638                          _("Set this option if changing the volume in Gnome MPlayer changes the master volume"), NULL);
6639 #endif
6640     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_softvol), softvol);
6641     gtk_table_attach(GTK_TABLE(conf_table), config_softvol, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6642     g_signal_connect(G_OBJECT(config_softvol), "toggled", G_CALLBACK(config_softvol_callback), NULL);
6643     i++;
6644 
6645     conf_label = gtk_label_new("");
6646     gtk_label_set_width_chars(GTK_LABEL(conf_label), 3);
6647     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 1, 2, i, i + 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
6648     config_remember_softvol = gtk_check_button_new_with_label(_("Remember last software volume level"));
6649 #ifdef GTK2_12_ENABLED
6650     gtk_widget_set_tooltip_text(config_remember_softvol,
6651                                 _("Set this option if you want the software volume level to be remembered"));
6652 #else
6653     tooltip = gtk_tooltips_new();
6654     gtk_tooltips_set_tip(tooltip, config_remember_softvol,
6655                          _("Set this option if you want the software volume level to be remembered"), NULL);
6656 #endif
6657     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_remember_softvol), remember_softvol);
6658     gtk_table_attach(GTK_TABLE(conf_table), config_remember_softvol, 1, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6659     gtk_widget_set_sensitive(config_remember_softvol, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_softvol)));
6660     i++;
6661 
6662     conf_label = gtk_label_new(_("Volume Gain (-200dB to +60dB)"));
6663     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6664     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 1, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6665     gtk_widget_show(conf_label);
6666     config_volume_gain = gtk_spin_button_new_with_range(-200, 60, 1);
6667     gtk_widget_set_size_request(config_volume_gain, -1, -1);
6668     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_volume_gain), volume_gain);
6669     gtk_table_attach(GTK_TABLE(conf_table), config_volume_gain, 2, 3, i, i + 1,
6670                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6671     gtk_widget_set_sensitive(config_volume_gain, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_softvol)));
6672     i++;
6673 
6674     config_deinterlace = gtk_check_button_new_with_mnemonic(_("De_interlace Video"));
6675 #ifdef GTK2_12_ENABLED
6676     gtk_widget_set_tooltip_text(config_deinterlace, _("Set this option if video looks striped"));
6677 #else
6678     tooltip = gtk_tooltips_new();
6679     gtk_tooltips_set_tip(tooltip, config_deinterlace, _("Set this option if video looks striped"), NULL);
6680 #endif
6681     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_deinterlace), !disable_deinterlace);
6682     gtk_table_attach(GTK_TABLE(conf_table), config_deinterlace, 0, 3, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6683     i++;
6684 
6685     config_framedrop = gtk_check_button_new_with_mnemonic(_("_Drop frames"));
6686 #ifdef GTK2_12_ENABLED
6687     gtk_widget_set_tooltip_text(config_framedrop, _("Set this option if video is well behind the audio"));
6688 #else
6689     tooltip = gtk_tooltips_new();
6690     gtk_tooltips_set_tip(tooltip, config_framedrop, _("Set this option if video is well behind the audio"), NULL);
6691 #endif
6692     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_framedrop), !disable_framedrop);
6693     gtk_table_attach(GTK_TABLE(conf_table), config_framedrop, 0, 3, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6694     i++;
6695 
6696     config_forcecache = gtk_check_button_new_with_label(_("Enable mplayer cache"));
6697     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(config_forcecache), forcecache);
6698     gtk_table_attach(GTK_TABLE(conf_table), config_forcecache, 0, 3, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6699     g_signal_connect(G_OBJECT(config_forcecache), "toggled", G_CALLBACK(config_forcecache_callback), NULL);
6700     i++;
6701 
6702     conf_label = gtk_label_new(_("Cache Size (KB):"));
6703     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6704     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6705     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6706     gtk_widget_show(conf_label);
6707     config_cachesize = gtk_spin_button_new_with_range(32, 256 * 1024, 512);
6708 #ifdef GTK2_12_ENABLED
6709     gtk_widget_set_tooltip_text(config_cachesize, _
6710                                 ("Amount of data to cache when playing media, use higher values for slow devices and sites."));
6711 #else
6712     tooltip = gtk_tooltips_new();
6713     gtk_tooltips_set_tip(tooltip, config_cachesize, _
6714                          ("Amount of data to cache when playing media, use higher values for slow devices and sites."),
6715                          NULL);
6716 #endif
6717     gtk_widget_set_size_request(config_cachesize, 100, -1);
6718     gtk_table_attach(GTK_TABLE(conf_table), config_cachesize, 2, 3, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6719     //gtk_range_set_value(GTK_RANGE(config_cachesize), cache_size);
6720     gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_cachesize), cache_size);
6721     gtk_entry_set_width_chars(GTK_ENTRY(config_cachesize), 6);
6722 #ifndef GTK2_24_ENABLED
6723     gtk_entry_set_editable(GTK_ENTRY(config_cachesize), FALSE);
6724 #endif
6725     gtk_entry_set_alignment(GTK_ENTRY(config_cachesize), 1);
6726     gtk_widget_show(config_cachesize);
6727     gtk_widget_set_sensitive(config_cachesize, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(config_forcecache)));
6728     i++;
6729 
6730     conf_label = gtk_label_new("");
6731     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6732     i++;
6733 
6734     conf_label = gtk_label_new(_("MPlayer Executable:"));
6735     config_mplayer_bin = gtk_file_chooser_button_new("Select", GTK_FILE_CHOOSER_ACTION_OPEN);
6736 #ifdef GTK2_12_ENABLED
6737     gtk_widget_set_tooltip_text(config_mplayer_bin, _
6738                                 ("Use this option to specify a mplayer application that is not in the path"));
6739 #else
6740     tooltip = gtk_tooltips_new();
6741     gtk_tooltips_set_tip(tooltip, config_mplayer_bin, _
6742                          ("Use this option to specify a mplayer application that is not in the path"), NULL);
6743 #endif
6744     if (mplayer_bin != NULL)
6745         gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(config_mplayer_bin), mplayer_bin);
6746     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6747     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6748     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6749     i++;
6750     gtk_table_attach(GTK_TABLE(conf_table), config_mplayer_bin, 0, 3, i, i + 1,
6751                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6752     i++;
6753 
6754     conf_label = gtk_label_new("");
6755     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6756     i++;
6757 
6758     conf_label = gtk_label_new(_("Extra Options to MPlayer:"));
6759     config_extraopts = gtk_entry_new();
6760 #ifdef GTK2_12_ENABLED
6761     gtk_widget_set_tooltip_text(config_extraopts, _("Add any extra mplayer options here (filters etc)"));
6762 #else
6763     tooltip = gtk_tooltips_new();
6764     gtk_tooltips_set_tip(tooltip, config_extraopts, _("Add any extra mplayer options here (filters etc)"), NULL);
6765 #endif
6766     gtk_entry_set_text(GTK_ENTRY(config_extraopts), ((extraopts) ? extraopts : ""));
6767     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6768     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6769     gtk_entry_set_width_chars(GTK_ENTRY(config_extraopts), 40);
6770     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6771     i++;
6772     gtk_table_attach(GTK_TABLE(conf_table), config_extraopts, 0, 3, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6773     i++;
6774 
6775     conf_label = gtk_label_new(_("MPlayer Default Optical Device"));
6776     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6777     gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6778     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 2, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6779     gtk_widget_show(conf_label);
6780     gtk_widget_set_size_request(GTK_WIDGET(config_mplayer_dvd_device), 200, -1);
6781     gtk_table_attach(GTK_TABLE(conf_table), config_mplayer_dvd_device, 2, 3, i, i + 1,
6782                      GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6783     i++;
6784 
6785 
6786     // Page 7 - Keyboard Shortcuts
6787     conf_table = gtk_table_new(KEY_COUNT + 5, 3, FALSE);
6788     gtk_container_add(GTK_CONTAINER(conf_page7), conf_table);
6789     i = 0;
6790     conf_label = gtk_label_new(_("<span weight=\"bold\">Keyboard Shortcuts</span>\n\n"
6791                                  "Place the cursor in the box next to the shortcut you want to modify\n"
6792                                  "Then press the keys you would like for the shortcut"));
6793     gtk_label_set_use_markup(GTK_LABEL(conf_label), TRUE);
6794     gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.0);
6795     gtk_misc_set_padding(GTK_MISC(conf_label), 0, 6);
6796     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 3, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
6797     i++;
6798 
6799     for (j = 0; j < KEY_COUNT; j++) {
6800         conf_label = gtk_label_new(accel_keys_description[j]);
6801         gtk_misc_set_alignment(GTK_MISC(conf_label), 0.0, 0.5);
6802         gtk_misc_set_padding(GTK_MISC(conf_label), 12, 0);
6803         gtk_table_attach(GTK_TABLE(conf_table), conf_label, 0, 1, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6804         gtk_widget_show(conf_label);
6805 
6806         config_accel_keys[j] = gtk_entry_new();
6807 
6808         if (get_key_and_modifier(accel_keys[j], &key, &modifier)) {
6809             gtk_entry_set_text(GTK_ENTRY(config_accel_keys[j]),
6810                                g_strdup_printf("%s%s%s%s", (modifier & GDK_CONTROL_MASK) ? "Control-" : "",
6811                                                (modifier & GDK_MOD1_MASK) ? "Alt-" : "",
6812                                                (modifier & GDK_SHIFT_MASK) ? "Shift-" : "", gdk_keyval_name(key)));
6813         }
6814         g_signal_connect(G_OBJECT(config_accel_keys[j]), "key_press_event", G_CALLBACK(accel_key_key_press_event),
6815                          GINT_TO_POINTER(j));
6816         gtk_widget_set_size_request(GTK_WIDGET(config_accel_keys[j]), 200, -1);
6817         gtk_table_attach(GTK_TABLE(conf_table), config_accel_keys[j], 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK,
6818                          0, 0);
6819 
6820         i++;
6821     }
6822     conf_label = gtk_button_new_with_label(_("Reset Keys"));
6823     g_signal_connect(G_OBJECT(conf_label), "clicked", G_CALLBACK(reset_keys_callback), NULL);
6824     gtk_table_attach(GTK_TABLE(conf_table), conf_label, 3, 4, i, i + 1, GTK_FILL, GTK_SHRINK, 0, 0);
6825     i++;
6826 
6827     gtk_container_add(GTK_CONTAINER(conf_hbutton_box), conf_cancel);
6828     gtk_container_add(GTK_CONTAINER(conf_vbox), conf_hbutton_box);
6829 
6830     gtk_widget_show_all(config_window);
6831     gtk_window_set_transient_for(GTK_WINDOW(config_window), GTK_WINDOW(window));
6832     gtk_window_set_keep_above(GTK_WINDOW(config_window), keep_on_top);
6833     gtk_window_present(GTK_WINDOW(config_window));
6834 
6835 }
6836 
reset_keys_callback(GtkButton * button,gpointer data)6837 void reset_keys_callback(GtkButton * button, gpointer data)
6838 {
6839     gint j;
6840     guint key;
6841     GdkModifierType modifier;
6842 
6843     for (j = 0; j < KEY_COUNT; j++) {
6844         g_free(accel_keys[j]);
6845         accel_keys[j] = NULL;
6846     }
6847 
6848     assign_default_keys();
6849 
6850     for (j = 0; j < KEY_COUNT; j++) {
6851         if (get_key_and_modifier(accel_keys[j], &key, &modifier)) {
6852             gtk_entry_set_text(GTK_ENTRY(config_accel_keys[j]),
6853                                g_strdup_printf("%s%s%s%s", (modifier & GDK_CONTROL_MASK) ? "Control-" : "",
6854                                                (modifier & GDK_MOD1_MASK) ? "Alt-" : "",
6855                                                (modifier & GDK_SHIFT_MASK) ? "Shift-" : "", gdk_keyval_name(key)));
6856         }
6857     }
6858 }
6859 
accel_key_key_press_event(GtkWidget * widget,GdkEventKey * event,gpointer data)6860 gboolean accel_key_key_press_event(GtkWidget * widget, GdkEventKey * event, gpointer data)
6861 {
6862 
6863     gint index = GPOINTER_TO_INT(data);
6864 
6865     gm_log(verbose, G_LOG_LEVEL_DEBUG, "key press %s shift: %s, ctrl: %s, alt: %s modifier: %s",
6866            gdk_keyval_name(event->keyval), gm_bool_to_string(event->state & GDK_SHIFT_MASK),
6867            gm_bool_to_string(event->state & GDK_CONTROL_MASK), gm_bool_to_string(event->state & GDK_MOD1_MASK),
6868            gm_bool_to_string(event->is_modifier));
6869 
6870 
6871     if (event->is_modifier)
6872         return TRUE;
6873 
6874     event->state = event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_SHIFT_MASK);
6875     gtk_entry_set_text(GTK_ENTRY(widget),
6876                        g_strdup_printf("%s%s%s%s", (event->state & GDK_CONTROL_MASK) ? "Control-" : "",
6877                                        (event->state & GDK_MOD1_MASK) ? "Alt-" : "",
6878                                        (event->state & GDK_SHIFT_MASK) ? "Shift-" : "",
6879                                        gdk_keyval_name(event->keyval)));
6880 
6881     g_free(accel_keys[index]);
6882     accel_keys[index] = g_strdup_printf("%i+%s", event->state, gdk_keyval_name(event->keyval));
6883     setup_accelerators();
6884 
6885 
6886     return TRUE;
6887 }
6888 
6889 
tracker_callback(GtkWidget * widget,gint percent,void * data)6890 gboolean tracker_callback(GtkWidget * widget, gint percent, void *data)
6891 {
6892 
6893     if (!idledata->streaming) {
6894         if (!autopause) {
6895             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP) {
6896                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), (gdouble) percent / 100.0, SEEK_PERCENT);
6897             }
6898         }
6899     }
6900 
6901     return FALSE;
6902 }
6903 
subtitle_select_callback(GtkMenuItem * menu,gpointer data)6904 void subtitle_select_callback(GtkMenuItem * menu, gpointer data)
6905 {
6906     if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu)))
6907         gmtk_media_player_select_subtitle_by_id(GMTK_MEDIA_PLAYER(media), GPOINTER_TO_INT(data));
6908     // use the id instead of the name
6909     //gmtk_media_player_select_subtitle(GMTK_MEDIA_PLAYER(media), gtk_menu_item_get_label(menu));
6910 }
6911 
player_subtitle_callback(GmtkMediaPlayer * player,int count,gpointer data)6912 void player_subtitle_callback(GmtkMediaPlayer * player, int count, gpointer data)
6913 {
6914     GtkWidget *menuitem_select_subtitles = GTK_WIDGET(data);
6915     GtkWidget *sub;
6916     GList *iter;
6917     GmtkMediaPlayerSubtitle *subtitle;
6918     GSList *group = NULL;
6919 
6920     subtitles = gtk_menu_new();
6921     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem_select_subtitles), NULL);
6922 
6923     if (g_list_length(player->subtitles)) {
6924         gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem_select_subtitles), subtitles);
6925 
6926         iter = player->subtitles;
6927         while (iter) {
6928             subtitle = (GmtkMediaPlayerSubtitle *) iter->data;
6929             sub = gtk_radio_menu_item_new_with_label(group, subtitle->label);
6930             group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(sub));
6931             g_signal_connect(sub, "activate", G_CALLBACK(subtitle_select_callback), GINT_TO_POINTER(subtitle->id));
6932             gtk_menu_shell_append(GTK_MENU_SHELL(subtitles), sub);
6933             iter = iter->next;
6934         }
6935 
6936         gtk_widget_show_all(subtitles);
6937         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_select_sub_lang), TRUE);
6938     }
6939 
6940 }
6941 
audio_track_select_callback(GtkMenuItem * menu,gpointer data)6942 void audio_track_select_callback(GtkMenuItem * menu, gpointer data)
6943 {
6944     if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu))) {
6945 #ifdef GTK2_18_ENABLED
6946         gmtk_media_player_select_audio_track(GMTK_MEDIA_PLAYER(media), gtk_menu_item_get_label(menu));
6947 #else
6948         gmtk_media_player_select_audio_track(GMTK_MEDIA_PLAYER(media),
6949                                              gtk_label_get_text(GTK_LABEL(GTK_BIN(menu)->child)));
6950 #endif
6951     }
6952 }
6953 
player_audio_track_callback(GmtkMediaPlayer * player,int count,gpointer data)6954 void player_audio_track_callback(GmtkMediaPlayer * player, int count, gpointer data)
6955 {
6956     GtkWidget *menuitem_select_audio_track = GTK_WIDGET(data);
6957     GtkWidget *menuitem;
6958     GList *iter;
6959     GmtkMediaPlayerAudioTrack *audio_track;
6960     GSList *group = NULL;
6961     tracks = gtk_menu_new();
6962     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem_select_audio_track), NULL);
6963     if (g_list_length(player->audio_tracks)) {
6964 
6965         gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem_select_audio_track), tracks);
6966         iter = player->audio_tracks;
6967         while (iter) {
6968             audio_track = (GmtkMediaPlayerAudioTrack *) iter->data;
6969             menuitem = gtk_radio_menu_item_new_with_label(group, audio_track->label);
6970             group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
6971             g_signal_connect(menuitem, "activate",
6972                              G_CALLBACK(audio_track_select_callback), GINT_TO_POINTER(audio_track->id));
6973             gtk_menu_shell_append(GTK_MENU_SHELL(tracks), menuitem);
6974             iter = iter->next;
6975         }
6976 
6977         gtk_widget_show_all(tracks);
6978         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_select_audio_lang), TRUE);
6979     }
6980 
6981 }
6982 
player_attribute_changed_callback(GmtkMediaTracker * tracker,GmtkMediaPlayerMediaAttributes attribute)6983 void player_attribute_changed_callback(GmtkMediaTracker * tracker, GmtkMediaPlayerMediaAttributes attribute)
6984 {
6985     const gchar *name;
6986     GList *list;
6987     GtkMenuItem *item;
6988     gchar *text;
6989     gchar *title;
6990     gchar *buffer;
6991     MetaData *metadata;
6992     GtkTreeIter *citer = NULL;
6993 
6994 
6995     switch (attribute) {
6996     case ATTRIBUTE_LENGTH:
6997         if (GTK_IS_WIDGET(tracker)) {
6998             gmtk_media_tracker_set_length(GMTK_MEDIA_TRACKER(tracker),
6999                                           gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), attribute));
7000         }
7001 #ifdef LIBGDA_ENABLED
7002         metadata = get_db_metadata(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
7003 #else
7004         metadata = g_new0(MetaData, 1);
7005         metadata->uri = g_strdup(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
7006 #endif
7007         metadata->length_value = gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), attribute);
7008         if (metadata->length)
7009             g_free(metadata->length);
7010         metadata->length =
7011             seconds_to_string(gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), attribute));
7012 #ifdef LIBGDA_ENABLED
7013         if (metadata->valid)
7014             insert_update_db_metadata(db_connection, metadata->uri, metadata);
7015 #endif
7016 
7017         free_metadata(metadata);
7018 
7019         break;
7020     case ATTRIBUTE_SIZE:
7021         if (remember_loc) {
7022             idledata->width = loc_window_width;
7023             idledata->height = loc_window_height;
7024         } else {
7025             idledata->width = (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_WIDTH);
7026             idledata->height =
7027                 (gint) gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HEIGHT);
7028         }
7029         gm_log(verbose, G_LOG_LEVEL_DEBUG, "video present = %s new size %i x %i",
7030                gm_bool_to_string(idledata->videopresent), idledata->width, idledata->height);
7031         text = g_strdup_printf("%i x %i", idledata->width, idledata->height);
7032         gtk_label_set_text(GTK_LABEL(details_video_size), text);
7033         g_free(text);
7034         if (resize_on_new_media || idledata->videopresent == FALSE) {
7035             if (idledata->width > 0 && idledata->height > 0)
7036                 idledata->videopresent = TRUE;
7037             g_idle_add(resize_window, idledata);
7038         }
7039         break;
7040     case ATTRIBUTE_VIDEO_PRESENT:
7041         idledata->videopresent =
7042             gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VIDEO_PRESENT);
7043         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_fullscreen), idledata->videopresent);
7044         gtk_widget_set_sensitive(GTK_WIDGET(fs_event_box), idledata->videopresent);
7045         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_subtitle), idledata->videopresent);
7046         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_audiofile), idledata->videopresent);
7047 #ifdef GTK3_ENABLED
7048         gtk_window_set_has_resize_grip(GTK_WINDOW(window), idledata->videopresent);
7049 #endif
7050         if (vo == NULL
7051             || (use_hardware_codecs == TRUE && (g_ascii_strncasecmp(vo, "xvmc", strlen("xvmc")) == 0
7052                                                 || g_ascii_strncasecmp(vo, "vdpau", strlen("vdpau")) == 0))) {
7053             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_take_screenshot), FALSE);
7054         } else {
7055             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_take_screenshot), idledata->videopresent);
7056         }
7057         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_fullscreen), idledata->videopresent);
7058         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_onetoone), idledata->videopresent);
7059         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_onetotwo), idledata->videopresent);
7060         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_twotoone), idledata->videopresent);
7061         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_onetoonepointfive), idledata->videopresent);
7062         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_advanced), idledata->videopresent);
7063         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect), idledata->videopresent);
7064         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_default), idledata->videopresent);
7065         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_four_three), idledata->videopresent);
7066         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_sixteen_nine), idledata->videopresent);
7067         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_sixteen_ten), idledata->videopresent);
7068         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_anamorphic), idledata->videopresent);
7069         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_follow_window), idledata->videopresent);
7070         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBS_EXIST)) {
7071             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_subtitles), idledata->videopresent);
7072             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_smaller_subtitle), idledata->videopresent);
7073             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_larger_subtitle), idledata->videopresent);
7074             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_decrease_subtitle_delay), idledata->videopresent);
7075             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_increase_subtitle_delay), idledata->videopresent);
7076         } else {
7077             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_subtitles), FALSE);
7078             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_smaller_subtitle), FALSE);
7079             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_larger_subtitle), FALSE);
7080             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_decrease_subtitle_delay), FALSE);
7081             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_increase_subtitle_delay), FALSE);
7082         }
7083         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_angle), idledata->videopresent);
7084         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_advanced), idledata->videopresent);
7085         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_details), TRUE);
7086         if (resize_on_new_media || idledata->videopresent == FALSE) {
7087             if (idledata->width > 0 && idledata->height > 0)
7088                 idledata->videopresent = TRUE;
7089             g_idle_add(resize_window, idledata);
7090         }
7091         break;
7092     case ATTRIBUTE_AUDIO_TRACK:
7093         name = gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_TRACK);
7094         gm_log(verbose, G_LOG_LEVEL_DEBUG, "track name = %s", name);
7095         if (name != NULL && GTK_IS_WIDGET(tracks)) {
7096             list = gtk_container_get_children(GTK_CONTAINER(tracks));
7097             while (list) {
7098                 item = GTK_MENU_ITEM(list->data);
7099 #ifdef GTK2_18_ENABLED
7100                 if (g_ascii_strcasecmp(name, gtk_menu_item_get_label(item)) == 0) {
7101                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
7102                 }
7103 #else
7104                 if (g_ascii_strcasecmp(name, gtk_label_get_text(GTK_LABEL(GTK_BIN(item)->child))) == 0) {
7105                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
7106                 }
7107 #endif
7108                 list = list->next;
7109             }
7110         }
7111         break;
7112     case ATTRIBUTE_AF_EXPORT_FILENAME:
7113         unmap_af_export_file(idledata);
7114         map_af_export_file(idledata);
7115         break;
7116     case ATTRIBUTE_SUBTITLE:
7117         name = gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUBTITLE);
7118         if (name != NULL && GTK_IS_WIDGET(subtitles)) {
7119             list = gtk_container_get_children(GTK_CONTAINER(subtitles));
7120             while (list) {
7121                 item = GTK_MENU_ITEM(list->data);
7122 #ifdef GTK2_18_ENABLED
7123                 if (g_ascii_strcasecmp(name, gtk_menu_item_get_label(item)) == 0) {
7124                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
7125                 }
7126 #else
7127                 if (g_ascii_strcasecmp(name, gtk_label_get_text(GTK_LABEL(GTK_BIN(item)->child))) == 0) {
7128                     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
7129                 }
7130 #endif
7131                 list = list->next;
7132             }
7133         }
7134         gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_subtitles),
7135                                  gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media),
7136                                                                          ATTRIBUTE_SUBS_EXIST));
7137 
7138         break;
7139     case ATTRIBUTE_SUB_VISIBLE:
7140         if (showsubtitles) {
7141             gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_subtitles),
7142                                            gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media),
7143                                                                                    ATTRIBUTE_SUB_VISIBLE));
7144         }
7145         break;
7146     case ATTRIBUTE_HAS_CHAPTERS:
7147         if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_HAS_CHAPTERS)
7148             || gtk_tree_model_iter_n_children(GTK_TREE_MODEL(playliststore), NULL) > 1) {
7149             gtk_widget_show_all(prev_event_box);
7150             gtk_widget_show_all(next_event_box);
7151         } else {
7152             gtk_widget_hide(prev_event_box);
7153             gtk_widget_hide(next_event_box);
7154         }
7155         break;
7156     case ATTRIBUTE_MESSAGE:
7157         gmtk_media_tracker_set_text(GMTK_MEDIA_TRACKER(tracker),
7158                                     gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media),
7159                                                                            ATTRIBUTE_MESSAGE));
7160         break;
7161     case ATTRIBUTE_VIDEO_FORMAT:
7162         text =
7163             g_ascii_strup(gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VIDEO_FORMAT), -1);
7164         gtk_label_set_text(GTK_LABEL(details_video_format), text);
7165         g_free(text);
7166         break;
7167     case ATTRIBUTE_VIDEO_CODEC:
7168         text =
7169             g_ascii_strup(gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VIDEO_CODEC), -1);
7170         gtk_label_set_text(GTK_LABEL(details_video_codec), text);
7171         g_free(text);
7172         break;
7173     case ATTRIBUTE_VIDEO_FPS:
7174         text =
7175             g_strdup_printf("%2.1lf",
7176                             gmtk_media_player_get_attribute_double(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_VIDEO_FPS));
7177         gtk_label_set_text(GTK_LABEL(details_video_fps), text);
7178         g_free(text);
7179         break;
7180     case ATTRIBUTE_AUDIO_FORMAT:
7181         text =
7182             g_ascii_strup(gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_FORMAT), -1);
7183         gtk_label_set_text(GTK_LABEL(details_audio_format), text);
7184         g_free(text);
7185         break;
7186     case ATTRIBUTE_AUDIO_CODEC:
7187         text =
7188             g_ascii_strup(gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_CODEC), -1);
7189         gtk_label_set_text(GTK_LABEL(details_audio_codec), text);
7190         g_free(text);
7191         break;
7192     case ATTRIBUTE_VIDEO_BITRATE:
7193         text =
7194             g_strdup_printf("%i Kb/s",
7195                             gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media),
7196                                                                     ATTRIBUTE_VIDEO_BITRATE) / 1000);
7197         gtk_label_set_text(GTK_LABEL(details_video_bitrate), text);
7198         g_free(text);
7199         break;
7200     case ATTRIBUTE_AUDIO_BITRATE:
7201         text =
7202             g_strdup_printf("%i Kb/s",
7203                             gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media),
7204                                                                     ATTRIBUTE_AUDIO_BITRATE) / 1000);
7205         gtk_label_set_text(GTK_LABEL(details_audio_bitrate), text);
7206         g_free(text);
7207         break;
7208     case ATTRIBUTE_AUDIO_RATE:
7209         text =
7210             g_strdup_printf("%i KHz",
7211                             gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media),
7212                                                                     ATTRIBUTE_AUDIO_RATE) / 1000);
7213         gtk_label_set_text(GTK_LABEL(details_audio_samplerate), text);
7214         g_free(text);
7215         break;
7216     case ATTRIBUTE_AUDIO_NCH:
7217         text =
7218             g_strdup_printf("%i",
7219                             gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_AUDIO_NCH));
7220         gtk_label_set_text(GTK_LABEL(details_audio_channels), text);
7221         g_free(text);
7222         break;
7223     case ATTRIBUTE_CHAPTERS:
7224         text =
7225             g_strdup_printf("%i",
7226                             gmtk_media_player_get_attribute_integer(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_CHAPTERS));
7227         gtk_label_set_text(GTK_LABEL(details_video_chapters), text);
7228         g_free(text);
7229         break;
7230     case ATTRIBUTE_SEEKABLE:
7231         gtk_widget_set_sensitive(GTK_WIDGET(tracker),
7232                                  gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SEEKABLE));
7233         break;
7234     case ATTRIBUTE_START_TIME:
7235         break;
7236     case ATTRIBUTE_TITLE:
7237     case ATTRIBUTE_ARTIST:
7238     case ATTRIBUTE_ALBUM:
7239 #ifdef LIBGDA_ENABLED
7240         metadata = get_db_metadata(db_connection, gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
7241 #else
7242         metadata = g_new0(MetaData, 1);
7243         metadata->uri = g_strdup(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
7244 #endif
7245 
7246         text = g_strdup_printf("<small>\n");
7247         if (gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE)) {
7248             buffer =
7249                 g_markup_printf_escaped("\t<big><b>%s</b></big>\n",
7250                                         gmtk_media_player_get_attribute_string
7251                                         (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE));
7252             text = g_strconcat(text, buffer, NULL);
7253             g_free(buffer);
7254             if (metadata->title)
7255                 g_free(metadata->title);
7256             metadata->title =
7257                 g_strstrip(g_strdup(gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE)));
7258             if (metadata->title != NULL && strlen(metadata->title) > 0) {
7259                 title = g_strdup_printf(_("%s - GNOME MPlayer"), metadata->title);
7260                 gtk_window_set_title(GTK_WINDOW(window), title);
7261                 g_free(title);
7262             }
7263         }
7264 
7265         if (gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ARTIST)) {
7266             buffer =
7267                 g_markup_printf_escaped("\t<i>%s</i>\n",
7268                                         gmtk_media_player_get_attribute_string
7269                                         (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ARTIST));
7270             text = g_strconcat(text, buffer, NULL);
7271             g_free(buffer);
7272             if (metadata->artist)
7273                 g_free(metadata->artist);
7274             metadata->artist =
7275                 g_strstrip(g_strdup
7276                            (gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ARTIST)));
7277         }
7278 
7279         if (gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ALBUM)) {
7280             buffer =
7281                 g_markup_printf_escaped("\t%s\n",
7282                                         gmtk_media_player_get_attribute_string
7283                                         (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ALBUM));
7284             text = g_strconcat(text, buffer, NULL);
7285             g_free(buffer);
7286             if (metadata->album)
7287                 g_free(metadata->album);
7288             metadata->album =
7289                 g_strstrip(g_strdup(gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ALBUM)));
7290         }
7291 #ifdef LIBGDA_ENABLED
7292         if (metadata->valid)
7293             insert_update_db_metadata(db_connection, metadata->uri, metadata);
7294 #endif
7295 
7296         free_metadata(metadata);
7297 
7298         text = g_strconcat(text, "</small>", NULL);
7299         gtk_label_set_markup(GTK_LABEL(media_label), text);
7300         g_strlcpy(idledata->media_info, text, sizeof(idledata->media_info));
7301 
7302         citer = find_iter_by_uri(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)));
7303         if (gtk_list_store_iter_is_valid(playliststore, citer) && !g_thread_pool_unprocessed(retrieve_metadata_pool)) {
7304             switch (attribute) {
7305             case ATTRIBUTE_TITLE:
7306                 gtk_list_store_set(playliststore, citer, DESCRIPTION_COLUMN, gmtk_media_player_get_attribute_string
7307                                    (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE), -1);
7308                 break;
7309             case ATTRIBUTE_ARTIST:
7310                 gtk_list_store_set(playliststore, citer, ARTIST_COLUMN, gmtk_media_player_get_attribute_string
7311                                    (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ARTIST), -1);
7312                 break;
7313 
7314             case ATTRIBUTE_ALBUM:
7315                 gtk_list_store_set(playliststore, citer, ALBUM_COLUMN, gmtk_media_player_get_attribute_string
7316                                    (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_ALBUM), -1);
7317                 break;
7318             default:
7319                 break;
7320             }
7321         }
7322         g_free(citer);
7323         break;
7324 
7325     case ATTRIBUTE_RETRY_ON_FULL_CACHE:
7326         idledata->retry_on_full_cache =
7327             gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_RETRY_ON_FULL_CACHE);
7328         break;
7329 
7330     case ATTRIBUTE_SPEED_SET:
7331         mpris_send_signal_RateChanged();
7332         break;
7333 
7334     default:
7335         gm_log(verbose, G_LOG_LEVEL_INFO, "Unhandled attribute change %i", attribute);
7336     }
7337 
7338     mpris_send_signal_Updated_Metadata();
7339 }
7340 
player_media_state_changed_callback(GtkButton * button,GmtkMediaPlayerMediaState media_state,gpointer data)7341 void player_media_state_changed_callback(GtkButton * button, GmtkMediaPlayerMediaState media_state, gpointer data)
7342 {
7343 #ifdef GTK2_12_ENABLED
7344     gchar *tip_text = NULL;
7345 #endif
7346     gchar *short_filename = NULL;
7347 #ifdef GTK3_ENABLED
7348     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
7349     const gchar *icon_start;
7350 
7351     if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL)
7352         icon_start = "media-playback-start-rtl-symbolic";
7353     else
7354         icon_start = "media-playback-start-symbolic";
7355 #endif
7356 
7357     gm_log(verbose, G_LOG_LEVEL_DEBUG, "in media state change with state = %s dontplaynext = %i",
7358            gmtk_media_state_to_string(media_state), dontplaynext);
7359     switch (media_state) {
7360         // mplayer is dead, need the next item off the playlist
7361     case MEDIA_STATE_QUIT:
7362     case MEDIA_STATE_UNKNOWN:
7363         if (idledata->mapped_af_export != NULL)
7364             unmap_af_export_file(idledata);
7365         if (dontplaynext == FALSE
7366             && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_edit_play_single)) == FALSE) {
7367             if (next_item_in_playlist(&iter)) {
7368                 g_idle_add(async_play_iter, &iter);
7369                 //play_iter(&iter, 0);
7370             } else {
7371                 gm_log(verbose, G_LOG_LEVEL_DEBUG, "end of thread playlist is empty");
7372                 if (loop) {
7373                     if (is_first_item_in_playlist(&iter)) {
7374                         g_idle_add(async_play_iter, &iter);
7375                     }
7376                 } else {
7377                     idledata->fullscreen = 0;
7378                     g_idle_add(set_fullscreen, idledata);
7379                     g_idle_add(set_stop, idledata);
7380                     // nothing is on the playlist and we are not looping so ask plugin for next item
7381                     if (embed_window != 0 || control_id != 0) {
7382                         js_state = STATE_MEDIAENDED;
7383                         dbus_send_event("MediaComplete", 0);
7384                         dbus_open_next();
7385                     }
7386                 }
7387 
7388                 if (quit_on_complete) {
7389                     g_idle_add(set_quit, idledata);
7390                 }
7391             }
7392         } else {
7393             if (embed_window != 0 || control_id != 0) {
7394                 dbus_send_event("MediaComplete", 0);
7395                 dbus_open_next();
7396             }
7397             if (next_iter != NULL) {
7398                 g_idle_add(async_play_iter, next_iter);
7399                 next_iter = NULL;
7400             }
7401         }
7402         dontplaynext = FALSE;
7403         // break purposely not put here, so gui is properly updated
7404     case MEDIA_STATE_STOP:
7405 #ifdef GTK3_ENABLED
7406         if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
7407             gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
7408         } else {
7409             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
7410         }
7411 #else
7412         gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
7413 #endif
7414         gmtk_media_tracker_set_position(GMTK_MEDIA_TRACKER(tracker), 0.0);
7415 #ifdef GTK2_12_ENABLED
7416         tip_text = gtk_widget_get_tooltip_text(play_event_box);
7417         if (tip_text == NULL || g_ascii_strcasecmp(tip_text, _("Play")) != 0)
7418             gtk_widget_set_tooltip_text(play_event_box, _("Play"));
7419         g_free(tip_text);
7420 #else
7421         gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
7422 #endif
7423         gtk_widget_set_sensitive(ff_event_box, FALSE);
7424         gtk_widget_set_sensitive(rew_event_box, FALSE);
7425         gtk_widget_set_sensitive(prev_event_box, FALSE);
7426         gtk_widget_set_sensitive(next_event_box, FALSE);
7427         gtk_widget_set_sensitive(stop_event_box, FALSE);
7428 
7429         if (GTK_WIDGET(gtk_widget_get_parent(GTK_WIDGET(menuitem_play))) == GTK_WIDGET(popup_menu))
7430             gtk_container_remove(GTK_CONTAINER(popup_menu), GTK_WIDGET(menuitem_play));
7431         menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY, NULL));
7432         g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_play_callback), NULL);
7433         gtk_menu_shell_insert(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play), 0);
7434         gtk_widget_show(GTK_WIDGET(menuitem_play));
7435         dbus_enable_screensaver();
7436         dbus_send_event("MediaStopped", 0);
7437         g_strlcpy(idledata->media_info, "", sizeof(idledata->media_info));
7438         gtk_widget_hide(media_hbox);
7439         g_strlcpy(idledata->display_name, "", sizeof(idledata->display_name));
7440         g_idle_add(set_title_bar, idledata);
7441         break;
7442     case MEDIA_STATE_PLAY:
7443         if (idledata->mapped_af_export == NULL)
7444             map_af_export_file(idledata);
7445 #ifdef GTK3_ENABLED
7446         if (gtk_icon_theme_has_icon(icon_theme, "media-playback-pause-symbolic")) {
7447             gtk_image_set_from_icon_name(GTK_IMAGE(image_play), "media-playback-pause-symbolic", button_size);
7448         } else {
7449             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PAUSE, button_size);
7450         }
7451 #else
7452         gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PAUSE, button_size);
7453 #endif
7454 #ifdef GTK2_12_ENABLED
7455         tip_text = gtk_widget_get_tooltip_text(play_event_box);
7456         if (tip_text == NULL || g_ascii_strcasecmp(tip_text, _("Pause")) != 0)
7457             gtk_widget_set_tooltip_text(play_event_box, _("Pause"));
7458         g_free(tip_text);
7459 #else
7460         gtk_tooltips_set_tip(tooltip, play_event_box, _("Pause"), NULL);
7461 #endif
7462         gtk_widget_set_sensitive(ff_event_box, TRUE);
7463         gtk_widget_set_sensitive(rew_event_box, TRUE);
7464         gtk_widget_set_sensitive(prev_event_box, TRUE);
7465         gtk_widget_set_sensitive(next_event_box, TRUE);
7466         gtk_widget_set_sensitive(stop_event_box, TRUE);
7467 
7468         if (GTK_WIDGET(gtk_widget_get_parent(GTK_WIDGET(menuitem_play))) == GTK_WIDGET(popup_menu))
7469             gtk_container_remove(GTK_CONTAINER(popup_menu), GTK_WIDGET(menuitem_play));
7470         menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PAUSE, NULL));
7471         g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_pause_callback), NULL);
7472         gtk_menu_shell_insert(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play), 0);
7473         gtk_widget_show(GTK_WIDGET(menuitem_play));
7474         if (idledata->videopresent)
7475             dbus_disable_screensaver();
7476         gmtk_media_tracker_set_text(GMTK_MEDIA_TRACKER(tracker), _("Playing"));
7477         gmtk_media_player_set_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SUB_VISIBLE,
7478                                                 gtk_check_menu_item_get_active(menuitem_view_subtitles));
7479         dbus_send_event("MediaPlaying", 0);
7480         g_idle_add(set_media_label, idledata);
7481         if (gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE) != NULL) {
7482             g_strlcpy(idledata->display_name,
7483                       gmtk_media_player_get_attribute_string(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_TITLE),
7484                       sizeof(idledata->display_name));
7485         } else {
7486             short_filename = g_strrstr(gmtk_media_player_get_uri(GMTK_MEDIA_PLAYER(media)), "/");
7487             if (short_filename != NULL) {
7488                 g_strlcpy(idledata->display_name, short_filename + sizeof(gchar), sizeof(idledata->display_name));
7489             } else {
7490                 g_strlcpy(idledata->display_name, "", sizeof(idledata->display_name));
7491             }
7492         }
7493         g_idle_add(set_title_bar, idledata);
7494         break;
7495     case MEDIA_STATE_PAUSE:
7496 #ifdef GTK3_ENABLED
7497         if (gtk_icon_theme_has_icon(icon_theme, icon_start)) {
7498             gtk_image_set_from_icon_name(GTK_IMAGE(image_play), icon_start, button_size);
7499         } else {
7500             gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
7501         }
7502 #else
7503         gtk_image_set_from_stock(GTK_IMAGE(image_play), GTK_STOCK_MEDIA_PLAY, button_size);
7504 #endif
7505 #ifdef GTK2_12_ENABLED
7506         tip_text = gtk_widget_get_tooltip_text(play_event_box);
7507         if (tip_text == NULL || g_ascii_strcasecmp(tip_text, _("Play")) != 0)
7508             gtk_widget_set_tooltip_text(play_event_box, _("Play"));
7509         g_free(tip_text);
7510 #else
7511         gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
7512 #endif
7513         gtk_widget_set_sensitive(ff_event_box, FALSE);
7514         gtk_widget_set_sensitive(rew_event_box, FALSE);
7515         gtk_widget_set_sensitive(prev_event_box, FALSE);
7516         gtk_widget_set_sensitive(next_event_box, FALSE);
7517         gtk_widget_set_sensitive(stop_event_box, FALSE);
7518 
7519         if (GTK_WIDGET(gtk_widget_get_parent(GTK_WIDGET(menuitem_play))) == GTK_WIDGET(popup_menu))
7520             gtk_container_remove(GTK_CONTAINER(popup_menu), GTK_WIDGET(menuitem_play));
7521         menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY, NULL));
7522         g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_play_callback), NULL);
7523         gtk_menu_shell_insert(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play), 0);
7524         gtk_widget_show(GTK_WIDGET(menuitem_play));
7525         dbus_enable_screensaver();
7526         gmtk_media_tracker_set_text(GMTK_MEDIA_TRACKER(tracker), _("Paused"));
7527         dbus_send_event("MediaPaused", 0);
7528         break;
7529     default:
7530         break;
7531     }
7532 
7533     mpris_send_signal_PlaybackStatus();
7534 }
7535 
player_error_message_callback(GmtkMediaPlayer * media,gchar * message)7536 void player_error_message_callback(GmtkMediaPlayer * media, gchar * message)
7537 {
7538     GtkWidget *dialog;
7539 
7540     // log messages to the screen when in normal playback mode, and to the log when in plugin mode
7541     if (control_id == 0) {
7542         dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
7543                                         GTK_BUTTONS_CLOSE, "%s", message);
7544         gtk_window_set_title(GTK_WINDOW(dialog), g_dgettext(GETTEXT_PACKAGE, "GNOME MPlayer Error"));
7545         gtk_dialog_run(GTK_DIALOG(dialog));
7546         gtk_widget_destroy(dialog);
7547     } else {
7548         gm_log(TRUE, G_LOG_LEVEL_MESSAGE, "GNOME MPlayer Error: %s", message);
7549     }
7550 }
7551 
player_cache_percent_changed_callback(GmtkMediaTracker * tracker,gdouble percentage)7552 void player_cache_percent_changed_callback(GmtkMediaTracker * tracker, gdouble percentage)
7553 {
7554     gchar *text;
7555     if (GTK_IS_WIDGET(tracker)) {
7556         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_PLAY) {
7557             gmtk_media_tracker_set_cache_percentage(tracker, percentage);
7558             text = g_strdup_printf("Caching %2i%% \342\226\274", (int) (percentage * 100));
7559             gmtk_media_tracker_set_text(GMTK_MEDIA_TRACKER(tracker), text);
7560             g_free(text);
7561         } else {
7562             gmtk_media_tracker_set_cache_percentage(tracker, 0.0);
7563         }
7564     }
7565 }
7566 
player_position_changed_callback(GmtkMediaTracker * tracker,gdouble position)7567 void player_position_changed_callback(GmtkMediaTracker * tracker, gdouble position)
7568 {
7569     gchar *text;
7570     if (GTK_IS_WIDGET(tracker)) {
7571         gmtk_media_tracker_set_percentage(tracker,
7572                                           (position -
7573                                            gmtk_media_player_get_attribute_double
7574                                            (GMTK_MEDIA_PLAYER(media),
7575                                             ATTRIBUTE_START_TIME)) /
7576                                           gmtk_media_player_get_attribute_double
7577                                           (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_LENGTH));
7578         gmtk_media_tracker_set_position(tracker,
7579                                         position -
7580                                         gmtk_media_player_get_attribute_double
7581                                         (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_START_TIME));
7582         if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PLAY) {
7583             text = g_strdup_printf(_("Playing"));
7584         } else if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) == MEDIA_STATE_PAUSE) {
7585             text = g_strdup_printf(_("Paused"));
7586         } else {
7587             text = g_strdup_printf(_("Idle"));
7588         }
7589         gmtk_media_tracker_set_text(GMTK_MEDIA_TRACKER(tracker), text);
7590         g_free(text);
7591         update_status_icon();
7592         g_idle_add(make_panel_and_mouse_invisible, NULL);
7593         dbus_send_event("TimeChanged", 0);
7594     }
7595 }
7596 
tracker_value_changed_callback(GtkWidget * widget,gint value,gpointer data)7597 gboolean tracker_value_changed_callback(GtkWidget * widget, gint value, gpointer data)
7598 {
7599     if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SEEKABLE)) {
7600         if (!autopause) {
7601             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP) {
7602                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), value * 1.0, SEEK_PERCENT);
7603                 mpris_send_signal_Seeked();
7604             }
7605         }
7606     }
7607     return FALSE;
7608 }
7609 
tracker_difference_callback(GtkWidget * widget,gdouble difference,void * data)7610 gboolean tracker_difference_callback(GtkWidget * widget, gdouble difference, void *data)
7611 {
7612 
7613     if (gmtk_media_player_get_attribute_boolean(GMTK_MEDIA_PLAYER(media), ATTRIBUTE_SEEKABLE)) {
7614         if (!autopause) {
7615             if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_STOP) {
7616                 gmtk_media_player_seek(GMTK_MEDIA_PLAYER(media), difference, SEEK_RELATIVE);
7617                 mpris_send_signal_Seeked();
7618             }
7619         }
7620     }
7621 
7622     return FALSE;
7623 }
7624 
progress_callback(GtkWidget * widget,GdkEventButton * event,void * data)7625 gboolean progress_callback(GtkWidget * widget, GdkEventButton * event, void *data)
7626 {
7627     GdkEventButton *event_button;
7628     if (event->type == GDK_BUTTON_PRESS) {
7629         event_button = (GdkEventButton *) event;
7630         if (event_button->button == 3) {
7631             gtk_menu_popup(popup_menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time);
7632             return TRUE;
7633         }
7634     }
7635 
7636     return TRUE;
7637 }
7638 
load_href_callback(GtkWidget * widget,GdkEventExpose * event,gchar * hrefid)7639 gboolean load_href_callback(GtkWidget * widget, GdkEventExpose * event, gchar * hrefid)
7640 {
7641     GdkEventButton *event_button;
7642     if (event->type == GDK_BUTTON_PRESS) {
7643         event_button = (GdkEventButton *) event;
7644         if (event_button->button == 3) {
7645             gtk_menu_popup(popup_menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time);
7646             return TRUE;
7647         }
7648 
7649         if (event_button->button != 3) {
7650             dbus_open_by_hrefid(hrefid);
7651             // do this in the plugin when we should
7652             // gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols), TRUE);
7653             return TRUE;
7654         }
7655     }
7656 
7657     return FALSE;
7658 }
7659 
idle_make_button(gpointer data)7660 gboolean idle_make_button(gpointer data)
7661 {
7662     ButtonDef *b = (ButtonDef *) data;
7663     if (b != NULL) {
7664         make_button(b->uri, b->hrefid);
7665         g_free(b->uri);
7666         g_free(b->hrefid);
7667         g_free(b);
7668     }
7669 
7670     return FALSE;
7671 }
7672 
make_button(gchar * src,gchar * hrefid)7673 void make_button(gchar * src, gchar * hrefid)
7674 {
7675     GError *error;
7676     gchar *dirname = NULL;
7677     gchar *filename = NULL;
7678     gchar *basepath = NULL;
7679     gint exit_status;
7680     gchar *out = NULL;
7681     gchar *err = NULL;
7682     gchar *av[255];
7683     gint ac = 0;
7684     idledata->showcontrols = FALSE;
7685     showcontrols = FALSE;
7686     set_show_controls(idledata);
7687     error = NULL;
7688     // only try if src ne NULL
7689     if (src != NULL) {
7690         pb_button = gdk_pixbuf_new_from_file(src, &error);
7691     } else {
7692         return;
7693     }
7694 
7695     // if we can't directly load the file into a pixbuf it might be a media file
7696     if (error != NULL) {
7697         g_error_free(error);
7698         error = NULL;
7699         basepath = g_strdup_printf("%s/gnome-mplayer/plugin", g_get_user_cache_dir());
7700         dirname = gm_tempname(basepath, "gnome-mplayerXXXXXX");
7701         filename = g_strdup_printf("%s/00000001.jpg", dirname);
7702         g_free(basepath);
7703         // run mplayer and try to get the first frame and convert it to a jpeg
7704         av[ac++] = g_strdup_printf("mplayer");
7705         av[ac++] = g_strdup_printf("-vo");
7706         av[ac++] = g_strdup_printf("jpeg:outdir=%s", dirname);
7707         av[ac++] = g_strdup_printf("-ao");
7708         av[ac++] = g_strdup_printf("null");
7709         av[ac++] = g_strdup_printf("-x");
7710         av[ac++] = g_strdup_printf("%i", window_x);
7711         av[ac++] = g_strdup_printf("-y");
7712         av[ac++] = g_strdup_printf("%i", window_y);
7713         av[ac++] = g_strdup_printf("-frames");
7714         av[ac++] = g_strdup_printf("1");
7715         av[ac++] = g_strdup_printf("%s", src);
7716         av[ac] = NULL;
7717         g_spawn_sync(NULL, av, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &out, &err, &exit_status, &error);
7718         if (error != NULL) {
7719             gm_log(verbose, G_LOG_LEVEL_MESSAGE, "Error when running: %s", error->message);
7720             g_error_free(error);
7721             error = NULL;
7722         }
7723 
7724         if (g_file_test(filename, G_FILE_TEST_EXISTS)) {
7725             pb_button = gdk_pixbuf_new_from_file(filename, &error);
7726             if (error != NULL) {
7727                 gm_log(verbose, G_LOG_LEVEL_MESSAGE, "make_button error: %s", error->message);
7728                 g_error_free(error);
7729                 error = NULL;
7730             }
7731         }
7732 
7733         if (err != NULL)
7734             g_free(err);
7735         if (out != NULL)
7736             g_free(out);
7737     }
7738 
7739     if (pb_button != NULL && GDK_IS_PIXBUF(pb_button)) {
7740         button_event_box = gtk_event_box_new();
7741         image_button = gtk_image_new_from_pixbuf(pb_button);
7742         gtk_container_add(GTK_CONTAINER(button_event_box), image_button);
7743         gtk_box_pack_start(GTK_BOX(vbox), button_event_box, FALSE, FALSE, 0);
7744         g_signal_connect(G_OBJECT(button_event_box), "button_press_event",
7745                          G_CALLBACK(load_href_callback), g_strdup(hrefid));
7746         gtk_widget_set_size_request(GTK_WIDGET(button_event_box), window_x, window_y);
7747         gtk_widget_show_all(button_event_box);
7748         gtk_widget_set_size_request(controls_box, 0, 0);
7749         gtk_widget_hide(controls_box);
7750         gtk_widget_show(vbox);
7751     } else {
7752         gm_log(verbose, G_LOG_LEVEL_INFO, "unable to make button from media, using default");
7753         button_event_box = gtk_event_box_new();
7754         image_button = gtk_image_new_from_pixbuf(pb_icon);
7755         gtk_container_add(GTK_CONTAINER(button_event_box), image_button);
7756         gtk_box_pack_start(GTK_BOX(vbox), button_event_box, FALSE, FALSE, 0);
7757         g_signal_connect(G_OBJECT(button_event_box), "button_press_event",
7758                          G_CALLBACK(load_href_callback), g_strdup(hrefid));
7759         gtk_widget_show_all(button_event_box);
7760         gtk_widget_set_size_request(controls_box, 0, 0);
7761         gtk_widget_hide(controls_box);
7762         gtk_widget_show(vbox);
7763     }
7764 
7765     if (filename != NULL) {
7766         if (g_file_test(filename, G_FILE_TEST_EXISTS))
7767             g_remove(filename);
7768         g_free(filename);
7769     }
7770 
7771     if (dirname != NULL) {
7772         g_remove(dirname);
7773         g_free(dirname);
7774     }
7775 
7776 }
7777 
get_key_and_modifier(gchar * keyval,guint * key,GdkModifierType * modifier)7778 gboolean get_key_and_modifier(gchar * keyval, guint * key, GdkModifierType * modifier)
7779 {
7780     gchar **parse;
7781 
7782     if (keyval == NULL) {
7783         *key = 0;
7784         *modifier = 0;
7785         return FALSE;
7786     }
7787     gm_log(verbose, G_LOG_LEVEL_DEBUG, "keyval = %s", keyval);
7788     parse = g_strsplit(keyval, "+", -1);
7789     if (g_strv_length(parse) == 1) {
7790         *modifier = 0;
7791         *key = gdk_keyval_from_name(parse[0]);
7792     } else {
7793         *modifier = (guint) g_strtod(parse[0], NULL);
7794         *key = gdk_keyval_from_name(parse[1]);
7795     }
7796     g_strfreev(parse);
7797     gm_log(verbose, G_LOG_LEVEL_DEBUG, "key = %i, modifier = %i", *key, *modifier);
7798     return TRUE;
7799 }
7800 
get_index_from_key_and_modifier(guint key,GdkModifierType modifier)7801 gint get_index_from_key_and_modifier(guint key, GdkModifierType modifier)
7802 {
7803     gint i;
7804     gint index = -1;
7805     gchar *keyval = NULL;
7806 
7807     modifier = modifier & (GDK_SHIFT_MASK | GDK_MOD1_MASK | GDK_CONTROL_MASK);
7808     if (modifier == 0) {
7809         keyval = g_strdup_printf("%s", gdk_keyval_name(key));
7810     } else {
7811         keyval = g_strdup_printf("%i+%s", modifier, gdk_keyval_name(key));
7812     }
7813 
7814     for (i = 0; i < KEY_COUNT; i++) {
7815         gm_log(verbose, G_LOG_LEVEL_DEBUG, "%s ?= %s", accel_keys[i], keyval);
7816         if (g_ascii_strcasecmp(accel_keys[i], keyval) == 0) {
7817             index = i;
7818             break;
7819         }
7820     }
7821 
7822     g_free(keyval);
7823 
7824     return index;
7825 }
7826 
setup_accelerators()7827 void setup_accelerators()
7828 {
7829     guint key;
7830     GdkModifierType modifier;
7831 
7832     if (get_key_and_modifier(accel_keys[FILE_OPEN_LOCATION], &key, &modifier))
7833         gtk_accel_map_change_entry(ACCEL_PATH_OPEN_LOCATION, key, modifier, TRUE);
7834 
7835     if (get_key_and_modifier(accel_keys[EDIT_SCREENSHOT], &key, &modifier))
7836         gtk_accel_map_change_entry(ACCEL_PATH_EDIT_SCREENSHOT, key, modifier, TRUE);
7837 
7838     if (get_key_and_modifier(accel_keys[EDIT_PREFERENCES], &key, &modifier))
7839         gtk_accel_map_change_entry(ACCEL_PATH_EDIT_PREFERENCES, key, modifier, TRUE);
7840 
7841     if (get_key_and_modifier(accel_keys[VIEW_PLAYLIST], &key, &modifier))
7842         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_PLAYLIST, key, modifier, TRUE);
7843     if (get_key_and_modifier(accel_keys[VIEW_INFO], &key, &modifier))
7844         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_INFO, key, modifier, TRUE);
7845     if (get_key_and_modifier(accel_keys[VIEW_DETAILS], &key, &modifier))
7846         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_DETAILS, key, modifier, TRUE);
7847     if (get_key_and_modifier(accel_keys[VIEW_METER], &key, &modifier))
7848         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_METER, key, modifier, TRUE);
7849     if (!disable_fullscreen) {
7850         if (get_key_and_modifier(accel_keys[VIEW_FULLSCREEN], &key, &modifier))
7851             gtk_accel_map_change_entry(ACCEL_PATH_VIEW_FULLSCREEN, key, modifier, TRUE);
7852     }
7853     if (get_key_and_modifier(accel_keys[VIEW_ASPECT], &key, &modifier))
7854         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_ASPECT, key, modifier, TRUE);
7855     if (get_key_and_modifier(accel_keys[VIEW_SUBTITLES], &key, &modifier))
7856         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_SUBTITLES, key, modifier, TRUE);
7857     if (get_key_and_modifier(accel_keys[VIEW_DECREASE_SIZE], &key, &modifier))
7858         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_DECREASE_SIZE, key, modifier, TRUE);
7859     if (get_key_and_modifier(accel_keys[VIEW_INCREASE_SIZE], &key, &modifier))
7860         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_INCREASE_SIZE, key, modifier, TRUE);
7861     if (get_key_and_modifier(accel_keys[VIEW_ANGLE], &key, &modifier))
7862         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_ANGLE, key, modifier, TRUE);
7863     if (get_key_and_modifier(accel_keys[VIEW_CONTROLS], &key, &modifier))
7864         gtk_accel_map_change_entry(ACCEL_PATH_VIEW_CONTROLS, key, modifier, TRUE);
7865 
7866     gtk_accel_map_change_entry(ACCEL_PATH_VIEW_NORMAL, GDK_1, GDK_CONTROL_MASK, TRUE);
7867     gtk_accel_map_change_entry(ACCEL_PATH_VIEW_DOUBLE, GDK_2, GDK_CONTROL_MASK, TRUE);
7868 }
7869 
create_window(gint windowid)7870 GtkWidget *create_window(gint windowid)
7871 {
7872     GtkIconTheme *icon_theme;
7873     GtkTargetEntry target_entry[3];
7874     gint i = 0;
7875 #ifdef GTK2_12_ENABLED
7876     GtkRecentFilter *recent_filter;
7877     GtkAdjustment *adj;
7878 #endif
7879 #ifdef GTK3_ENABLED
7880     const char *icon_start, *icon_seek_forward, *icon_seek_backward, *icon_skip_forward, *icon_skip_backward;
7881 
7882     if (gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL) {
7883         icon_start = "media-playback-start-rtl-symbolic";
7884         icon_seek_forward = "media-seek-forward-rtl-symbolic";
7885         icon_seek_backward = "media-seek-backward-rtl-symbolic";
7886         icon_skip_forward = "media-skip-forward-rtl-symbolic";
7887         icon_skip_backward = "media-skip-backward-rtl-symbolic";
7888     } else {
7889         icon_start = "media-playback-start-symbolic";
7890         icon_seek_forward = "media-seek-forward-symbolic";
7891         icon_seek_backward = "media-seek-backward-symbolic";
7892         icon_skip_forward = "media-skip-forward-symbolic";
7893         icon_skip_backward = "media-skip-backward-symbolic";
7894     }
7895 #endif
7896     in_button = FALSE;
7897     last_movement_time = -1;
7898     fs_window = NULL;
7899     fs_controls_lock = g_mutex_new();
7900     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
7901     gtk_window_set_title(GTK_WINDOW(window), _("GNOME MPlayer"));
7902     if (windowid > 0 && embedding_disabled == FALSE) {
7903         gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
7904 #ifdef GTK3_ENABLED
7905         gtk_window_set_has_resize_grip(GTK_WINDOW(window), FALSE);
7906 #endif
7907 #ifdef GTK2_20_ENABLED
7908         gtk_widget_set_can_focus(window, TRUE);
7909 #else
7910         GTK_WIDGET_SET_FLAGS(window, GTK_CAN_FOCUS);
7911 #endif
7912     }
7913     gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
7914     gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
7915     gtk_widget_add_events(window, GDK_BUTTON_RELEASE_MASK);
7916     gtk_widget_add_events(window, GDK_KEY_PRESS_MASK);
7917     gtk_widget_add_events(window, GDK_KEY_RELEASE_MASK);
7918     gtk_widget_add_events(window, GDK_ENTER_NOTIFY_MASK);
7919     gtk_widget_add_events(window, GDK_LEAVE_NOTIFY_MASK);
7920     gtk_widget_add_events(window, GDK_KEY_PRESS_MASK);
7921     gtk_widget_add_events(window, GDK_VISIBILITY_NOTIFY_MASK);
7922     gtk_widget_add_events(window, GDK_STRUCTURE_MASK);
7923     gtk_widget_add_events(window, GDK_POINTER_MOTION_MASK);
7924     delete_signal_id = g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_callback), NULL);
7925     g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy_callback), NULL);
7926     g_signal_connect(G_OBJECT(window), "motion_notify_event", G_CALLBACK(motion_notify_callback), NULL);
7927     g_signal_connect(G_OBJECT(window), "window_state_event", G_CALLBACK(window_state_callback), NULL);
7928     g_signal_connect(G_OBJECT(window), "configure_event", G_CALLBACK(configure_callback), NULL);
7929     accel_group = gtk_accel_group_new();
7930     // right click menu
7931     popup_menu = GTK_MENU(gtk_menu_new());
7932     menubar = gtk_menu_bar_new();
7933     menuitem_play = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY, NULL));
7934     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_play));
7935     gtk_widget_show(GTK_WIDGET(menuitem_play));
7936     menuitem_stop = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_STOP, NULL));
7937     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_stop));
7938     gtk_widget_show(GTK_WIDGET(menuitem_stop));
7939     menuitem_prev = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, NULL));
7940     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_prev));
7941     menuitem_next = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_NEXT, NULL));
7942     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_next));
7943     menuitem_sep1 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
7944     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_sep1));
7945     gtk_widget_show(GTK_WIDGET(menuitem_sep1));
7946     menuitem_open = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, accel_group));
7947     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_open));
7948     gtk_widget_show(GTK_WIDGET(menuitem_open));
7949     menuitem_sep3 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
7950     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_sep3));
7951     gtk_widget_show(GTK_WIDGET(menuitem_sep3));
7952     menuitem_showcontrols = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("S_how Controls")));
7953     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_showcontrols));
7954     gtk_widget_show(GTK_WIDGET(menuitem_showcontrols));
7955     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols), TRUE);
7956     menuitem_fullscreen = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Full Screen")));
7957     if (!disable_fullscreen) {
7958         gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_fullscreen));
7959         gtk_widget_show(GTK_WIDGET(menuitem_fullscreen));
7960     }
7961     menuitem_copyurl = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_Copy Location")));
7962     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_copyurl));
7963     gtk_widget_show(GTK_WIDGET(menuitem_copyurl));
7964     menuitem_sep2 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
7965     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_sep2));
7966     if (control_id != 0)
7967         gtk_widget_show(GTK_WIDGET(menuitem_sep2));
7968     menuitem_config = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL));
7969     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_config));
7970     if (control_id != 0)
7971         gtk_widget_show(GTK_WIDGET(menuitem_config));
7972     menuitem_sep4 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
7973     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_sep4));
7974     menuitem_save = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE_AS, accel_group));
7975     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_save));
7976     // we only want to show the save option when under control of gecko-mediaplayer
7977     if (control_id != 0) {
7978         gtk_widget_show(GTK_WIDGET(menuitem_sep4));
7979         gtk_widget_show(GTK_WIDGET(menuitem_save));
7980         if (embed_window != 0)
7981             gtk_widget_set_sensitive(GTK_WIDGET(menuitem_save), FALSE);
7982     }
7983 
7984     menuitem_sep3 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
7985     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_sep3));
7986     if (control_id != 0)
7987         gtk_widget_show(GTK_WIDGET(menuitem_sep3));
7988     menuitem_quit = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group));
7989     gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), GTK_WIDGET(menuitem_quit));
7990     if (control_id != 0)
7991         gtk_widget_show(GTK_WIDGET(menuitem_quit));
7992 
7993     g_signal_connect(G_OBJECT(menuitem_open), "activate", G_CALLBACK(menuitem_open_callback), NULL);
7994     g_signal_connect(G_OBJECT(menuitem_play), "activate", G_CALLBACK(menuitem_pause_callback), NULL);
7995     g_signal_connect(G_OBJECT(menuitem_stop), "activate", G_CALLBACK(menuitem_stop_callback), NULL);
7996     g_signal_connect(G_OBJECT(menuitem_prev), "activate", G_CALLBACK(menuitem_prev_callback), NULL);
7997     g_signal_connect(G_OBJECT(menuitem_next), "activate", G_CALLBACK(menuitem_next_callback), NULL);
7998     g_signal_connect(G_OBJECT(menuitem_showcontrols), "toggled", G_CALLBACK(menuitem_showcontrols_callback), NULL);
7999     g_signal_connect(G_OBJECT(menuitem_fullscreen), "toggled", G_CALLBACK(menuitem_fs_callback), NULL);
8000     g_signal_connect(G_OBJECT(menuitem_copyurl), "activate", G_CALLBACK(menuitem_copyurl_callback), NULL);
8001     g_signal_connect(G_OBJECT(menuitem_config), "activate", G_CALLBACK(menuitem_config_callback), NULL);
8002     g_signal_connect(G_OBJECT(menuitem_save), "activate", G_CALLBACK(menuitem_save_callback), NULL);
8003     g_signal_connect(G_OBJECT(menuitem_quit), "activate", G_CALLBACK(menuitem_quit_callback), NULL);
8004     g_signal_connect_swapped(G_OBJECT(window), "button_release_event", G_CALLBACK(popup_handler), G_OBJECT(popup_menu));
8005     //g_signal_connect_swapped(G_OBJECT(window),
8006     //                         "scroll_event", G_CALLBACK(drawing_area_scroll_event_callback), G_OBJECT(drawing_area));
8007     g_signal_connect_swapped(G_OBJECT(window), "enter_notify_event", G_CALLBACK(notification_handler), NULL);
8008     g_signal_connect_swapped(G_OBJECT(window), "leave_notify_event", G_CALLBACK(notification_handler), NULL);
8009     // File Menu
8010     menuitem_file = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_File")));
8011     menu_file = GTK_MENU(gtk_menu_new());
8012     gtk_menu_set_accel_group(GTK_MENU(menu_file), accel_group);
8013     gtk_widget_show(GTK_WIDGET(menuitem_file));
8014     gtk_menu_shell_append(GTK_MENU_SHELL(menubar), GTK_WIDGET(menuitem_file));
8015     gtk_menu_item_set_submenu(menuitem_file, GTK_WIDGET(menu_file));
8016     menuitem_file_open = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, accel_group));
8017     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_open));
8018     menuitem_file_open_folder = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _Folder")));
8019     gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM
8020                                   (menuitem_file_open_folder),
8021                                   gtk_image_new_from_icon_name("folder", GTK_ICON_SIZE_MENU));
8022     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_open_folder));
8023     menuitem_file_open_location = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _Location")));
8024     gtk_menu_item_set_accel_path(menuitem_file_open_location, ACCEL_PATH_OPEN_LOCATION);
8025     gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM
8026                                   (menuitem_file_open_location),
8027                                   gtk_image_new_from_icon_name("network-server", GTK_ICON_SIZE_MENU));
8028     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_open_location));
8029     menuitem_file_disc = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("_Disc")));
8030     gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM
8031                                   (menuitem_file_disc),
8032                                   gtk_image_new_from_icon_name("media-optical", GTK_ICON_SIZE_MENU));
8033     menu_file_disc = GTK_MENU(gtk_menu_new());
8034     gtk_widget_show(GTK_WIDGET(menuitem_file_disc));
8035     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_disc));
8036     gtk_menu_item_set_submenu(menuitem_file_disc, GTK_WIDGET(menu_file_disc));
8037     menuitem_file_open_acd = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _Audio CD")));
8038     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_acd));
8039     menuitem_file_open_sep1 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8040     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_sep1));
8041     //menuitem_file_open_dvd = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _DVD")));
8042     //gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_dvd));
8043     menuitem_file_open_dvdnav = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open DVD with _Menus")));
8044     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_dvdnav));
8045     //menuitem_file_open_dvd_folder = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open DVD from _Folder")));
8046     //gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_dvd_folder));
8047     menuitem_file_open_dvdnav_folder =
8048         GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open DVD from Folder with M_enus")));
8049     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_dvdnav_folder));
8050     //menuitem_file_open_dvd_iso = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open DVD from _ISO")));
8051     //gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_dvd_iso));
8052     menuitem_file_open_dvdnav_iso =
8053         GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open DVD from ISO with Me_nus")));
8054     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_dvdnav_iso));
8055     menuitem_file_open_sep2 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8056     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_sep2));
8057     menuitem_file_open_vcd = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _VCD")));
8058     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_disc), GTK_WIDGET(menuitem_file_open_vcd));
8059     menuitem_file_tv = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_TV")));
8060     menu_file_tv = GTK_MENU(gtk_menu_new());
8061     gtk_widget_show(GTK_WIDGET(menuitem_file_tv));
8062     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_tv));
8063     gtk_menu_item_set_submenu(menuitem_file_tv, GTK_WIDGET(menu_file_tv));
8064     menuitem_file_open_atv = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _Analog TV")));
8065     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_tv), GTK_WIDGET(menuitem_file_open_atv));
8066     menuitem_file_open_dtv = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _Digital TV")));
8067     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file_tv), GTK_WIDGET(menuitem_file_open_dtv));
8068 #ifdef HAVE_GPOD
8069     menuitem_file_open_ipod = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Open _iPod™")));
8070     gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM
8071                                   (menuitem_file_open_ipod),
8072                                   gtk_image_new_from_icon_name("multimedia-player", GTK_ICON_SIZE_MENU));
8073     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_open_ipod));
8074 #endif
8075 #ifdef GTK2_12_ENABLED
8076 #ifdef GIO_ENABLED
8077     recent_manager = gtk_recent_manager_get_default();
8078     menuitem_file_recent = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("Open _Recent")));
8079     // g_signal_connect(recent_manager, "changed", G_CALLBACK(recent_manager_changed_callback), NULL);
8080     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_recent));
8081     menuitem_file_recent_items = gtk_recent_chooser_menu_new();
8082     recent_filter = gtk_recent_filter_new();
8083     gtk_recent_filter_add_application(recent_filter, "gnome-mplayer");
8084     gtk_recent_chooser_add_filter(GTK_RECENT_CHOOSER(menuitem_file_recent_items), recent_filter);
8085     gtk_recent_chooser_set_show_tips(GTK_RECENT_CHOOSER(menuitem_file_recent_items), TRUE);
8086     gtk_recent_chooser_set_sort_type(GTK_RECENT_CHOOSER(menuitem_file_recent_items), GTK_RECENT_SORT_MRU);
8087     gtk_menu_item_set_submenu(menuitem_file_recent, menuitem_file_recent_items);
8088     gtk_recent_chooser_set_local_only(GTK_RECENT_CHOOSER(menuitem_file_recent_items), FALSE);
8089 #endif
8090 #endif
8091     menuitem_file_sep2 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8092     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_sep2));
8093     menuitem_file_quit = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group));
8094     gtk_menu_shell_append(GTK_MENU_SHELL(menu_file), GTK_WIDGET(menuitem_file_quit));
8095     g_signal_connect(G_OBJECT(menuitem_file_open), "activate", G_CALLBACK(menuitem_open_callback), NULL);
8096     g_signal_connect(G_OBJECT(menuitem_file_open_folder), "activate",
8097                      G_CALLBACK(add_folder_to_playlist), menuitem_file_open_folder);
8098     g_signal_connect(G_OBJECT(menuitem_file_open_location), "activate",
8099                      G_CALLBACK(menuitem_open_location_callback), NULL);
8100     //g_signal_connect(G_OBJECT(menuitem_file_open_dvd), "activate", G_CALLBACK(menuitem_open_dvd_callback), NULL);
8101     g_signal_connect(G_OBJECT(menuitem_file_open_dvdnav), "activate", G_CALLBACK(menuitem_open_dvdnav_callback), NULL);
8102     //g_signal_connect(G_OBJECT(menuitem_file_open_dvd_folder), "activate",
8103     //                 G_CALLBACK(menuitem_open_dvd_folder_callback), NULL);
8104     g_signal_connect(G_OBJECT(menuitem_file_open_dvdnav_folder),
8105                      "activate", G_CALLBACK(menuitem_open_dvdnav_folder_callback), NULL);
8106     //g_signal_connect(G_OBJECT(menuitem_file_open_dvd_iso), "activate",
8107     //                 G_CALLBACK(menuitem_open_dvd_iso_callback), NULL);
8108     g_signal_connect(G_OBJECT(menuitem_file_open_dvdnav_iso),
8109                      "activate", G_CALLBACK(menuitem_open_dvdnav_iso_callback), NULL);
8110     g_signal_connect(G_OBJECT(menuitem_file_open_acd), "activate", G_CALLBACK(menuitem_open_acd_callback), NULL);
8111     g_signal_connect(G_OBJECT(menuitem_file_open_vcd), "activate", G_CALLBACK(menuitem_open_vcd_callback), NULL);
8112     g_signal_connect(G_OBJECT(menuitem_file_open_atv), "activate", G_CALLBACK(menuitem_open_atv_callback), NULL);
8113     g_signal_connect(G_OBJECT(menuitem_file_open_dtv), "activate", G_CALLBACK(menuitem_open_dtv_callback), NULL);
8114 #ifdef HAVE_GPOD
8115     g_signal_connect(G_OBJECT(menuitem_file_open_ipod), "activate", G_CALLBACK(menuitem_open_ipod_callback), NULL);
8116 #endif
8117 #ifdef GTK2_12_ENABLED
8118 #ifdef GIO_ENABLED
8119     g_signal_connect(G_OBJECT(menuitem_file_recent_items),
8120                      "item-activated", G_CALLBACK(menuitem_open_recent_callback), NULL);
8121 #endif
8122 #endif
8123     g_signal_connect(G_OBJECT(menuitem_file_quit), "activate", G_CALLBACK(menuitem_quit_callback), NULL);
8124     // Edit Menu
8125     menuitem_edit = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_Edit")));
8126     menu_edit = GTK_MENU(gtk_menu_new());
8127     gtk_menu_set_accel_group(GTK_MENU(menu_edit), accel_group);
8128     gtk_widget_show(GTK_WIDGET(menuitem_edit));
8129     gtk_menu_shell_append(GTK_MENU_SHELL(menubar), GTK_WIDGET(menuitem_edit));
8130     gtk_menu_item_set_submenu(menuitem_edit, GTK_WIDGET(menu_edit));
8131     menuitem_edit_random = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Shuffle Playlist")));
8132     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_edit_random), random_order);
8133     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_random));
8134     menuitem_edit_loop = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Loop Playlist")));
8135     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_edit_loop), loop);
8136     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_loop));
8137     menuitem_edit_play_single =
8138         GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("P_lay Single Track from Playlist")));
8139     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_play_single));
8140     menuitem_view_sep0 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8141     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_view_sep0));
8142     menuitem_edit_switch_audio = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("S_witch Audio Track")));
8143     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_switch_audio));
8144     menuitem_edit_set_audiofile = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("Set Audi_o")));
8145     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_set_audiofile));
8146     menuitem_edit_select_audio_lang = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("Select _Audio Language")));
8147     gtk_widget_show(GTK_WIDGET(menuitem_edit_select_audio_lang));
8148     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_select_audio_lang));
8149     menuitem_edit_set_subtitle = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("Set S_ubtitle")));
8150     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_set_subtitle));
8151     menuitem_edit_select_sub_lang = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("S_elect Subtitle Language")));
8152     gtk_widget_show(GTK_WIDGET(menuitem_edit_select_sub_lang));
8153     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_select_sub_lang));
8154     menuitem_view_sep0 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8155     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_view_sep0));
8156     menuitem_edit_take_screenshot = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_Take Screenshot")));
8157     gtk_menu_item_set_accel_path(menuitem_edit_take_screenshot, ACCEL_PATH_EDIT_SCREENSHOT);
8158     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_take_screenshot));
8159 #ifdef GTK2_12_ENABLED
8160     gtk_widget_set_tooltip_text(GTK_WIDGET
8161                                 (menuitem_edit_take_screenshot),
8162                                 _("Files named ’shotNNNN.png’ will be saved in the working directory"));
8163 #else
8164     tooltip = gtk_tooltips_new();
8165     gtk_tooltips_set_tip(tooltip,
8166                          GTK_WIDGET(menuitem_edit_take_screenshot),
8167                          _("Files named ’shotNNNN.png’ will be saved in the working directory"), NULL);
8168 #endif
8169     menuitem_edit_sep1 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8170     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_sep1));
8171     menuitem_edit_config = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL));
8172     gtk_menu_item_set_accel_path(menuitem_edit_config, ACCEL_PATH_EDIT_PREFERENCES);
8173     gtk_menu_shell_append(GTK_MENU_SHELL(menu_edit), GTK_WIDGET(menuitem_edit_config));
8174     g_signal_connect(G_OBJECT(menuitem_edit_random), "activate", G_CALLBACK(menuitem_edit_random_callback), NULL);
8175     g_signal_connect(G_OBJECT(menuitem_edit_loop), "activate", G_CALLBACK(menuitem_edit_loop_callback), NULL);
8176     g_signal_connect(G_OBJECT(menuitem_edit_set_audiofile), "activate",
8177                      G_CALLBACK(menuitem_edit_set_audiofile_callback), NULL);
8178     g_signal_connect(G_OBJECT(menuitem_edit_switch_audio), "activate",
8179                      G_CALLBACK(menuitem_edit_switch_audio_callback), NULL);
8180     g_signal_connect(G_OBJECT(menuitem_edit_set_subtitle), "activate",
8181                      G_CALLBACK(menuitem_edit_set_subtitle_callback), NULL);
8182     g_signal_connect(G_OBJECT(menuitem_edit_take_screenshot),
8183                      "activate", G_CALLBACK(menuitem_edit_take_screenshot_callback), NULL);
8184     g_signal_connect(G_OBJECT(menuitem_edit_config), "activate", G_CALLBACK(menuitem_config_callback), NULL);
8185 
8186     // View Menu
8187     menuitem_view = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_View")));
8188     menu_view = GTK_MENU(gtk_menu_new());
8189     gtk_menu_set_accel_group(GTK_MENU(menu_view), accel_group);
8190     gtk_widget_show(GTK_WIDGET(menuitem_view));
8191     gtk_menu_shell_append(GTK_MENU_SHELL(menubar), GTK_WIDGET(menuitem_view));
8192     gtk_menu_item_set_submenu(menuitem_view, GTK_WIDGET(menu_view));
8193     menuitem_view_playlist = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Playlist")));
8194     gtk_menu_item_set_accel_path(menuitem_view_playlist, ACCEL_PATH_VIEW_PLAYLIST);
8195     // gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_playlist), playlist_visible);
8196     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_playlist));
8197     menuitem_view_info = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("Media _Info")));
8198     gtk_menu_item_set_accel_path(menuitem_view_info, ACCEL_PATH_VIEW_INFO);
8199     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_info));
8200     menuitem_view_details = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("D_etails")));
8201     gtk_menu_item_set_accel_path(menuitem_view_details, ACCEL_PATH_VIEW_DETAILS);
8202     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_details));
8203     menuitem_view_meter = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("Audio _Meter")));
8204     gtk_menu_item_set_accel_path(menuitem_view_meter, ACCEL_PATH_VIEW_METER);
8205     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_meter));
8206     menuitem_view_sep0 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8207     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_sep0));
8208     menuitem_view_fullscreen = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Full Screen")));
8209     gtk_menu_item_set_accel_path(menuitem_view_fullscreen, ACCEL_PATH_VIEW_FULLSCREEN);
8210     menuitem_view_sep1 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8211     if (!disable_fullscreen) {
8212         gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_fullscreen));
8213         gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_sep1));
8214     }
8215     menuitem_view_onetoone = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("_Normal (1:1)")));
8216     gtk_menu_item_set_accel_path(menuitem_view_onetoone, ACCEL_PATH_VIEW_NORMAL);
8217     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_onetoone));
8218     menuitem_view_twotoone = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("_Double Size (2:1)")));
8219     gtk_menu_item_set_accel_path(menuitem_view_twotoone, ACCEL_PATH_VIEW_DOUBLE);
8220     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_twotoone));
8221     menuitem_view_onetotwo = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("_Half Size (1:2)")));
8222     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_onetotwo));
8223     menuitem_view_onetoonepointfive = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Half _Larger (1.5:1)")));
8224     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_onetoonepointfive));
8225     menuitem_view_aspect = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_Aspect")));
8226     gtk_menu_item_set_accel_path(menuitem_view_aspect, ACCEL_PATH_VIEW_ASPECT);
8227     menu_view_aspect = GTK_MENU(gtk_menu_new());
8228     gtk_widget_show(GTK_WIDGET(menuitem_view_aspect));
8229     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_aspect));
8230     gtk_menu_item_set_submenu(menuitem_view_aspect, GTK_WIDGET(menu_view_aspect));
8231     menuitem_view_aspect_default = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("D_efault Aspect")));
8232     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view_aspect), GTK_WIDGET(menuitem_view_aspect_default));
8233     menuitem_view_aspect_four_three = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_4:3 Aspect")));
8234     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view_aspect), GTK_WIDGET(menuitem_view_aspect_four_three));
8235     menuitem_view_aspect_sixteen_nine = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_16:9 Aspect")));
8236     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view_aspect), GTK_WIDGET(menuitem_view_aspect_sixteen_nine));
8237     menuitem_view_aspect_sixteen_ten = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("1_6:10 Aspect")));
8238     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view_aspect), GTK_WIDGET(menuitem_view_aspect_sixteen_ten));
8239     menuitem_view_aspect_anamorphic =
8240         GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_2.39:1 Aspect (Anamorphic)")));
8241     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view_aspect), GTK_WIDGET(menuitem_view_aspect_anamorphic));
8242     menuitem_view_aspect_follow_window = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Follow Window")));
8243     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view_aspect), GTK_WIDGET(menuitem_view_aspect_follow_window));
8244     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_aspect_default), TRUE);
8245     menuitem_view_sep2 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8246     menuitem_view_sep5 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8247     menuitem_view_subtitles = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("Show _Subtitles")));
8248     gtk_menu_item_set_accel_path(menuitem_view_subtitles, ACCEL_PATH_VIEW_SUBTITLES);
8249     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_subtitles), showsubtitles);
8250     menuitem_view_smaller_subtitle = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Decrease Subtitle Size")));
8251     gtk_menu_item_set_accel_path(menuitem_view_smaller_subtitle, ACCEL_PATH_VIEW_DECREASE_SIZE);
8252     menuitem_view_larger_subtitle = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Increase Subtitle Size")));
8253     gtk_menu_item_set_accel_path(menuitem_view_larger_subtitle, ACCEL_PATH_VIEW_INCREASE_SIZE);
8254     menuitem_view_decrease_subtitle_delay =
8255         GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Decrease Subtitle Delay")));
8256     menuitem_view_increase_subtitle_delay =
8257         GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Increase Subtitle Delay")));
8258     menuitem_view_angle = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("Switch An_gle")));
8259     gtk_menu_item_set_accel_path(menuitem_view_angle, ACCEL_PATH_VIEW_ANGLE);
8260     menuitem_view_controls = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(_("_Controls")));
8261     gtk_menu_item_set_accel_path(menuitem_view_controls, ACCEL_PATH_VIEW_CONTROLS);
8262     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_controls), TRUE);
8263     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_sep2));
8264     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_subtitles));
8265     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_smaller_subtitle));
8266     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_larger_subtitle));
8267     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_decrease_subtitle_delay));
8268     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_increase_subtitle_delay));
8269     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_sep5));
8270     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_angle));
8271     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_controls));
8272     menuitem_view_sep3 = GTK_MENU_ITEM(gtk_separator_menu_item_new());
8273     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_sep3));
8274     menuitem_view_advanced = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(_("_Video Picture Adjustments")));
8275     gtk_menu_shell_append(GTK_MENU_SHELL(menu_view), GTK_WIDGET(menuitem_view_advanced));
8276     g_signal_connect(G_OBJECT(menuitem_view_playlist), "toggled", G_CALLBACK(menuitem_view_playlist_callback), NULL);
8277     g_signal_connect(G_OBJECT(menuitem_view_info), "activate", G_CALLBACK(menuitem_view_info_callback), NULL);
8278     g_signal_connect(G_OBJECT(menuitem_view_details), "activate", G_CALLBACK(menuitem_details_callback), NULL);
8279     g_signal_connect(G_OBJECT(menuitem_view_meter), "activate", G_CALLBACK(menuitem_meter_callback), NULL);
8280     g_signal_connect(G_OBJECT(menuitem_view_fullscreen), "toggled", G_CALLBACK(menuitem_fs_callback), NULL);
8281     g_signal_connect(G_OBJECT(menuitem_view_onetoone), "activate",
8282                      G_CALLBACK(menuitem_view_onetoone_callback), idledata);
8283     g_signal_connect(G_OBJECT(menuitem_view_twotoone), "activate",
8284                      G_CALLBACK(menuitem_view_twotoone_callback), idledata);
8285     g_signal_connect(G_OBJECT(menuitem_view_onetotwo), "activate",
8286                      G_CALLBACK(menuitem_view_onetotwo_callback), idledata);
8287     g_signal_connect(G_OBJECT(menuitem_view_onetoonepointfive), "activate",
8288                      G_CALLBACK(menuitem_view_onetoonepointfive_callback), idledata);
8289     g_signal_connect(G_OBJECT(menuitem_view_aspect_default),
8290                      "activate", G_CALLBACK(menuitem_view_aspect_callback), NULL);
8291     g_signal_connect(G_OBJECT(menuitem_view_aspect_four_three),
8292                      "activate", G_CALLBACK(menuitem_view_aspect_callback), NULL);
8293     g_signal_connect(G_OBJECT(menuitem_view_aspect_sixteen_nine),
8294                      "activate", G_CALLBACK(menuitem_view_aspect_callback), NULL);
8295     g_signal_connect(G_OBJECT(menuitem_view_aspect_sixteen_ten),
8296                      "activate", G_CALLBACK(menuitem_view_aspect_callback), NULL);
8297     g_signal_connect(G_OBJECT(menuitem_view_aspect_anamorphic),
8298                      "activate", G_CALLBACK(menuitem_view_aspect_callback), NULL);
8299     g_signal_connect(G_OBJECT(menuitem_view_aspect_follow_window),
8300                      "activate", G_CALLBACK(menuitem_view_aspect_callback), NULL);
8301     g_signal_connect(G_OBJECT(menuitem_view_subtitles), "toggled", G_CALLBACK(menuitem_view_subtitles_callback), NULL);
8302     g_signal_connect(G_OBJECT(menuitem_view_smaller_subtitle),
8303                      "activate", G_CALLBACK(menuitem_view_smaller_subtitle_callback), NULL);
8304     g_signal_connect(G_OBJECT(menuitem_view_larger_subtitle),
8305                      "activate", G_CALLBACK(menuitem_view_larger_subtitle_callback), NULL);
8306     g_signal_connect(G_OBJECT(menuitem_view_decrease_subtitle_delay),
8307                      "activate", G_CALLBACK(menuitem_view_decrease_subtitle_delay_callback), NULL);
8308     g_signal_connect(G_OBJECT(menuitem_view_increase_subtitle_delay),
8309                      "activate", G_CALLBACK(menuitem_view_increase_subtitle_delay_callback), NULL);
8310     g_signal_connect(G_OBJECT(menuitem_view_angle), "activate", G_CALLBACK(menuitem_view_angle_callback), NULL);
8311     g_signal_connect(G_OBJECT(menuitem_view_controls), "toggled", G_CALLBACK(menuitem_showcontrols_callback), NULL);
8312     g_signal_connect(G_OBJECT(menuitem_view_advanced), "activate", G_CALLBACK(menuitem_advanced_callback), idledata);
8313     // Help Menu
8314     menuitem_help = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(_("_Help")));
8315     menu_help = GTK_MENU(gtk_menu_new());
8316     gtk_widget_show(GTK_WIDGET(menuitem_help));
8317     gtk_menu_shell_append(GTK_MENU_SHELL(menubar), GTK_WIDGET(menuitem_help));
8318     gtk_menu_item_set_submenu(menuitem_help, GTK_WIDGET(menu_help));
8319     menuitem_help_about = GTK_MENU_ITEM(gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL));
8320     gtk_menu_shell_append(GTK_MENU_SHELL(menu_help), GTK_WIDGET(menuitem_help_about));
8321     g_signal_connect(G_OBJECT(menuitem_help_about), "activate", G_CALLBACK(menuitem_about_callback), NULL);
8322     gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
8323     setup_accelerators();
8324     g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(window_key_callback), NULL);
8325     // Give the window the property to accept DnD
8326     target_entry[i].target = DRAG_NAME_0;
8327     target_entry[i].flags = 0;
8328     target_entry[i++].info = DRAG_INFO_0;
8329     target_entry[i].target = DRAG_NAME_1;
8330     target_entry[i].flags = 0;
8331     target_entry[i++].info = DRAG_INFO_1;
8332     target_entry[i].target = DRAG_NAME_2;
8333     target_entry[i].flags = 0;
8334     target_entry[i++].info = DRAG_INFO_2;
8335     gtk_drag_dest_set(window,
8336                       GTK_DEST_DEFAULT_MOTION |
8337                       GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, target_entry, i, GDK_ACTION_LINK);
8338     gtk_drag_dest_add_uri_targets(window);
8339     //Connect the signal for DnD
8340     g_signal_connect(G_OBJECT(window), "drag_data_received", G_CALLBACK(drop_callback), NULL);
8341 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
8342     vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
8343     gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
8344 #else
8345     vbox = gtk_vbox_new(FALSE, 0);
8346 #endif
8347 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
8348     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
8349     gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
8350 #else
8351     hbox = gtk_hbox_new(FALSE, 0);
8352 #endif
8353 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
8354     controls_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
8355     gtk_box_set_homogeneous(GTK_BOX(controls_box), FALSE);
8356 #else
8357     controls_box = gtk_vbox_new(FALSE, 0);
8358 #endif
8359     media = gmtk_media_player_new();
8360     g_signal_connect_swapped(G_OBJECT(media), "media_state_changed",
8361                              G_CALLBACK(player_media_state_changed_callback), NULL);
8362     g_signal_connect_swapped(G_OBJECT(media), "button_press_event", G_CALLBACK(popup_handler), G_OBJECT(popup_menu));
8363     g_signal_connect(G_OBJECT(media), "audio-tracks-changed",
8364                      G_CALLBACK(player_audio_track_callback), menuitem_edit_select_audio_lang);
8365     g_signal_connect(G_OBJECT(media), "subtitles-changed",
8366                      G_CALLBACK(player_subtitle_callback), menuitem_edit_select_sub_lang);
8367     g_signal_connect(G_OBJECT(media), "size_allocate", G_CALLBACK(player_size_allocate_callback), NULL);
8368     g_signal_connect(G_OBJECT(media), "scroll_event", G_CALLBACK(media_scroll_event_callback), NULL);
8369     g_signal_connect(G_OBJECT(media), "error-message", G_CALLBACK(player_error_message_callback), NULL);
8370     cover_art = gtk_image_new();
8371     media_label = gtk_label_new("");
8372     gtk_widget_set_size_request(media_label, 300, 100);
8373     gtk_label_set_ellipsize(GTK_LABEL(media_label), PANGO_ELLIPSIZE_END);
8374 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
8375     media_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
8376     gtk_box_set_homogeneous(GTK_BOX(media_hbox), FALSE);
8377 #else
8378     media_hbox = gtk_hbox_new(FALSE, 10);
8379 #endif
8380     g_signal_connect(media_hbox, "show", G_CALLBACK(view_option_show_callback), NULL);
8381     g_signal_connect(media_hbox, "size_allocate", G_CALLBACK(view_option_size_allocate_callback), NULL);
8382 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
8383     details_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
8384     gtk_box_set_homogeneous(GTK_BOX(details_vbox), FALSE);
8385 #else
8386     details_vbox = gtk_vbox_new(FALSE, 10);
8387 #endif
8388     details_table = gtk_table_new(20, 2, FALSE);
8389     g_signal_connect(details_vbox, "show", G_CALLBACK(view_option_show_callback), NULL);
8390     g_signal_connect(details_vbox, "size_allocate", G_CALLBACK(view_option_size_allocate_callback), NULL);
8391     create_details_table();
8392     gtk_container_add(GTK_CONTAINER(details_vbox), details_table);
8393     gtk_misc_set_alignment(GTK_MISC(media_label), 0, 0);
8394     audio_meter = gmtk_audio_meter_new(METER_BARS);
8395     g_signal_connect(audio_meter, "show", G_CALLBACK(view_option_show_callback), NULL);
8396     g_signal_connect(audio_meter, "size_allocate", G_CALLBACK(view_option_size_allocate_callback), NULL);
8397     gmtk_audio_meter_set_max_division_width(GMTK_AUDIO_METER(audio_meter), 10);
8398     gtk_widget_set_size_request(audio_meter, -1, 100);
8399     g_timeout_add_full(G_PRIORITY_HIGH, 40, update_audio_meter, NULL, NULL);
8400     gtk_box_pack_start(GTK_BOX(vbox), media, TRUE, TRUE, 0);
8401     gtk_box_pack_start(GTK_BOX(media_hbox), cover_art, FALSE, FALSE, 0);
8402     gtk_box_pack_start(GTK_BOX(media_hbox), media_label, FALSE, FALSE, 0);
8403     gtk_box_pack_start(GTK_BOX(vbox), media_hbox, FALSE, FALSE, 0);
8404     gtk_box_pack_start(GTK_BOX(vbox), details_vbox, FALSE, FALSE, 0);
8405     gtk_box_pack_start(GTK_BOX(vbox), audio_meter, FALSE, FALSE, 0);
8406     gtk_box_pack_start(GTK_BOX(controls_box), hbox, FALSE, FALSE, 1);
8407     if (vertical_layout) {
8408         pane = gtk_vpaned_new();
8409     } else {
8410         pane = gtk_hpaned_new();
8411     }
8412     gtk_paned_pack1(GTK_PANED(pane), vbox, FALSE, TRUE);
8413     create_playlist_widget();
8414     g_signal_connect(plvbox, "show", G_CALLBACK(view_option_show_callback), NULL);
8415     g_signal_connect(plvbox, "hide", G_CALLBACK(view_option_hide_callback), NULL);
8416     g_signal_connect(plvbox, "size_allocate", G_CALLBACK(view_option_size_allocate_callback), NULL);
8417     //if (remember_loc)
8418     //      gtk_paned_set_position(GTK_PANED(pane),loc_panel_position);
8419 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 2
8420     vbox_master = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
8421     gtk_box_set_homogeneous(GTK_BOX(vbox_master), FALSE);
8422 #else
8423     vbox_master = gtk_vbox_new(FALSE, 0);
8424 #endif
8425     if (windowid == 0)
8426         gtk_box_pack_start(GTK_BOX(vbox_master), menubar, FALSE, FALSE, 0);
8427     gtk_widget_show(menubar);
8428     gtk_box_pack_start(GTK_BOX(vbox_master), pane, TRUE, TRUE, 0);
8429     gtk_box_pack_start(GTK_BOX(vbox_master), controls_box, FALSE, FALSE, 0);
8430     gtk_container_add(GTK_CONTAINER(window), vbox_master);
8431     icon_theme = gtk_icon_theme_get_default();
8432 #ifdef GTK3_ENABLED
8433     if (gtk_icon_theme_has_icon(icon_theme, icon_start) &&
8434         gtk_icon_theme_has_icon(icon_theme, "media-playback-stop-symbolic") &&
8435         gtk_icon_theme_has_icon(icon_theme, "media-playback-pause-symbolic") &&
8436         gtk_icon_theme_has_icon(icon_theme, icon_seek_forward) &&
8437         gtk_icon_theme_has_icon(icon_theme, icon_seek_backward) &&
8438         gtk_icon_theme_has_icon(icon_theme, "view-sidebar-symbolic") &&
8439         gtk_icon_theme_has_icon(icon_theme, "view-fullscreen-symbolic")) {
8440         image_play = gtk_image_new_from_icon_name(icon_start, button_size);
8441         image_stop = gtk_image_new_from_icon_name("media-playback-stop-symbolic", button_size);
8442         image_pause = gtk_image_new_from_icon_name("media-playback-pause-symbolic", button_size);
8443         image_ff = gtk_image_new_from_icon_name(icon_seek_forward, button_size);
8444         image_rew = gtk_image_new_from_icon_name(icon_seek_backward, button_size);
8445         image_prev = gtk_image_new_from_icon_name(icon_skip_backward, button_size);
8446         image_next = gtk_image_new_from_icon_name(icon_skip_forward, button_size);
8447         image_menu = gtk_image_new_from_icon_name("view-sidebar-symbolic", button_size);
8448         image_fs = gtk_image_new_from_icon_name("view-fullscreen-symbolic", button_size);
8449     } else {
8450         image_play = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, button_size);
8451         image_stop = gtk_image_new_from_stock(GTK_STOCK_MEDIA_STOP, button_size);
8452         image_pause = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE, button_size);
8453         image_ff = gtk_image_new_from_stock(GTK_STOCK_MEDIA_FORWARD, button_size);
8454         image_rew = gtk_image_new_from_stock(GTK_STOCK_MEDIA_REWIND, button_size);
8455         image_prev = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, button_size);
8456         image_next = gtk_image_new_from_stock(GTK_STOCK_MEDIA_NEXT, button_size);
8457         image_menu = gtk_image_new_from_stock(GTK_STOCK_INDEX, button_size);
8458         image_fs = gtk_image_new_from_stock(GTK_STOCK_FULLSCREEN, button_size);
8459     }
8460 #else
8461     image_play = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, button_size);
8462     image_stop = gtk_image_new_from_stock(GTK_STOCK_MEDIA_STOP, button_size);
8463     image_pause = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE, button_size);
8464     image_ff = gtk_image_new_from_stock(GTK_STOCK_MEDIA_FORWARD, button_size);
8465     image_rew = gtk_image_new_from_stock(GTK_STOCK_MEDIA_REWIND, button_size);
8466     image_prev = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, button_size);
8467     image_next = gtk_image_new_from_stock(GTK_STOCK_MEDIA_NEXT, button_size);
8468     image_menu = gtk_image_new_from_stock(GTK_STOCK_INDEX, button_size);
8469     image_fs = gtk_image_new_from_stock(GTK_STOCK_FULLSCREEN, button_size);
8470 #endif
8471 
8472     icon_list = NULL;
8473     if (gtk_icon_theme_has_icon(icon_theme, "gnome-mplayer")) {
8474         pb_icon = gtk_icon_theme_load_icon(icon_theme, "gnome-mplayer", 128, 0, NULL);
8475         if (pb_icon)
8476             icon_list = g_list_prepend(icon_list, pb_icon);
8477         pb_icon = gtk_icon_theme_load_icon(icon_theme, "gnome-mplayer", 64, 0, NULL);
8478         if (pb_icon)
8479             icon_list = g_list_prepend(icon_list, pb_icon);
8480         pb_icon = gtk_icon_theme_load_icon(icon_theme, "gnome-mplayer", 48, 0, NULL);
8481         if (pb_icon)
8482             icon_list = g_list_prepend(icon_list, pb_icon);
8483         pb_icon = gtk_icon_theme_load_icon(icon_theme, "gnome-mplayer", 24, 0, NULL);
8484         if (pb_icon)
8485             icon_list = g_list_prepend(icon_list, pb_icon);
8486         pb_icon = gtk_icon_theme_load_icon(icon_theme, "gnome-mplayer", 22, 0, NULL);
8487         if (pb_icon)
8488             icon_list = g_list_prepend(icon_list, pb_icon);
8489         pb_icon = gtk_icon_theme_load_icon(icon_theme, "gnome-mplayer", 16, 0, NULL);
8490         if (pb_icon)
8491             icon_list = g_list_prepend(icon_list, pb_icon);
8492     } else {
8493         pb_icon = gdk_pixbuf_new_from_xpm_data((const char **) gnome_mplayer_xpm);
8494         if (pb_icon)
8495             icon_list = g_list_prepend(icon_list, pb_icon);
8496     }
8497     gtk_window_set_default_icon_list(icon_list);
8498     gtk_window_set_icon_list(GTK_WINDOW(window), icon_list);
8499 #ifdef GTK2_12_ENABLED
8500     if (control_id == 0 && show_status_icon) {
8501         if (gtk_icon_theme_has_icon(icon_theme, "gnome-mplayer-panel")) {
8502             status_icon = gtk_status_icon_new_from_icon_name("gnome-mplayer-panel");
8503         } else if (gtk_icon_theme_has_icon(icon_theme, "gnome-mplayer")) {
8504             status_icon = gtk_status_icon_new_from_icon_name("gnome-mplayer");
8505         } else {
8506             status_icon = gtk_status_icon_new_from_pixbuf(pb_icon);
8507         }
8508         if (control_id != 0) {
8509             gtk_status_icon_set_visible(status_icon, FALSE);
8510         } else {
8511             gtk_status_icon_set_visible(status_icon, show_status_icon);
8512         }
8513         g_signal_connect(status_icon, "activate", G_CALLBACK(status_icon_callback), NULL);
8514         g_signal_connect(status_icon, "popup_menu", G_CALLBACK(status_icon_context_callback), NULL);
8515     }
8516 #endif
8517 
8518     menu_event_box = gtk_button_new();
8519     gtk_button_set_image(GTK_BUTTON(menu_event_box), image_menu);
8520     gtk_button_set_relief(GTK_BUTTON(menu_event_box), GTK_RELIEF_NONE);
8521 #ifdef GTK2_12_ENABLED
8522     gtk_widget_set_tooltip_text(menu_event_box, _("Menu"));
8523 #else
8524     tooltip = gtk_tooltips_new();
8525     gtk_tooltips_set_tip(tooltip, menu_event_box, _("Menu"), NULL);
8526 #endif
8527 #ifdef GTK2_20_ENABLED
8528     gtk_widget_set_can_focus(menu_event_box, FALSE);
8529 #else
8530     GTK_WIDGET_UNSET_FLAGS(menu_event_box, GTK_CAN_FOCUS);
8531 #endif
8532     gtk_widget_set_events(menu_event_box, GDK_BUTTON_PRESS_MASK);
8533     g_signal_connect(G_OBJECT(menu_event_box), "button_press_event", G_CALLBACK(menu_callback), NULL);
8534     gtk_box_pack_start(GTK_BOX(hbox), menu_event_box, FALSE, FALSE, 0);
8535     gtk_widget_show(image_menu);
8536     gtk_widget_show(menu_event_box);
8537 
8538     prev_event_box = gtk_button_new();
8539     gtk_button_set_image(GTK_BUTTON(prev_event_box), image_prev);
8540     gtk_button_set_relief(GTK_BUTTON(prev_event_box), GTK_RELIEF_NONE);
8541 #ifdef GTK2_12_ENABLED
8542     gtk_widget_set_tooltip_text(prev_event_box, _("Previous"));
8543 #else
8544     tooltip = gtk_tooltips_new();
8545     gtk_tooltips_set_tip(tooltip, prev_event_box, _("Previous"), NULL);
8546 #endif
8547 #ifdef GTK2_20_ENABLED
8548     gtk_widget_set_can_focus(prev_event_box, FALSE);
8549 #else
8550     GTK_WIDGET_UNSET_FLAGS(prev_event_box, GTK_CAN_FOCUS);
8551 #endif
8552     gtk_widget_set_events(prev_event_box, GDK_BUTTON_PRESS_MASK);
8553     g_signal_connect(G_OBJECT(prev_event_box), "button_press_event", G_CALLBACK(prev_callback), NULL);
8554     gtk_box_pack_start(GTK_BOX(hbox), prev_event_box, FALSE, FALSE, 0);
8555     gtk_widget_show(image_prev);
8556     gtk_widget_show(prev_event_box);
8557     gtk_widget_set_sensitive(prev_event_box, FALSE);
8558 
8559     rew_event_box = gtk_button_new();
8560     gtk_button_set_image(GTK_BUTTON(rew_event_box), image_rew);
8561     gtk_button_set_relief(GTK_BUTTON(rew_event_box), GTK_RELIEF_NONE);
8562 #ifdef GTK2_12_ENABLED
8563     gtk_widget_set_tooltip_text(rew_event_box, _("Rewind"));
8564 #else
8565     tooltip = gtk_tooltips_new();
8566     gtk_tooltips_set_tip(tooltip, rew_event_box, _("Rewind"), NULL);
8567 #endif
8568 #ifdef GTK2_20_ENABLED
8569     gtk_widget_set_can_focus(rew_event_box, FALSE);
8570 #else
8571     GTK_WIDGET_UNSET_FLAGS(rew_event_box, GTK_CAN_FOCUS);
8572 #endif
8573     gtk_widget_set_events(rew_event_box, GDK_BUTTON_PRESS_MASK);
8574     g_signal_connect(G_OBJECT(rew_event_box), "button_press_event", G_CALLBACK(rew_callback), NULL);
8575     gtk_box_pack_start(GTK_BOX(hbox), rew_event_box, FALSE, FALSE, 0);
8576     gtk_widget_show(image_rew);
8577     gtk_widget_show(rew_event_box);
8578     gtk_widget_set_sensitive(rew_event_box, FALSE);
8579 
8580     play_event_box = gtk_button_new();
8581     gtk_button_set_image(GTK_BUTTON(play_event_box), image_play);
8582     gtk_button_set_relief(GTK_BUTTON(play_event_box), GTK_RELIEF_NONE);
8583 #ifdef GTK2_12_ENABLED
8584     gtk_widget_set_tooltip_text(play_event_box, _("Play"));
8585 #else
8586     tooltip = gtk_tooltips_new();
8587     gtk_tooltips_set_tip(tooltip, play_event_box, _("Play"), NULL);
8588 #endif
8589 #ifdef GTK2_20_ENABLED
8590     gtk_widget_set_can_focus(play_event_box, FALSE);
8591 #else
8592     GTK_WIDGET_UNSET_FLAGS(play_event_box, GTK_CAN_FOCUS);
8593 #endif
8594     gtk_widget_set_events(play_event_box, GDK_BUTTON_PRESS_MASK);
8595     g_signal_connect(G_OBJECT(play_event_box), "button_press_event", G_CALLBACK(play_callback), NULL);
8596     gtk_box_pack_start(GTK_BOX(hbox), play_event_box, FALSE, FALSE, 0);
8597     gtk_widget_show(image_play);
8598     gtk_widget_show(play_event_box);
8599 
8600     stop_event_box = gtk_button_new();
8601     gtk_button_set_image(GTK_BUTTON(stop_event_box), image_stop);
8602     gtk_button_set_relief(GTK_BUTTON(stop_event_box), GTK_RELIEF_NONE);
8603 #ifdef GTK2_12_ENABLED
8604     gtk_widget_set_tooltip_text(stop_event_box, _("Stop"));
8605 #else
8606     tooltip = gtk_tooltips_new();
8607     gtk_tooltips_set_tip(tooltip, stop_event_box, _("Stop"), NULL);
8608 #endif
8609 #ifdef GTK2_20_ENABLED
8610     gtk_widget_set_can_focus(stop_event_box, FALSE);
8611 #else
8612     GTK_WIDGET_UNSET_FLAGS(stop_event_box, GTK_CAN_FOCUS);
8613 #endif
8614     gtk_widget_set_events(stop_event_box, GDK_BUTTON_PRESS_MASK);
8615     g_signal_connect(G_OBJECT(stop_event_box), "button_press_event", G_CALLBACK(stop_callback), NULL);
8616     gtk_box_pack_start(GTK_BOX(hbox), stop_event_box, FALSE, FALSE, 0);
8617     gtk_widget_show(image_stop);
8618     gtk_widget_show(stop_event_box);
8619     gtk_widget_set_sensitive(stop_event_box, FALSE);
8620 
8621     ff_event_box = gtk_button_new();
8622     gtk_button_set_image(GTK_BUTTON(ff_event_box), image_ff);
8623     gtk_button_set_relief(GTK_BUTTON(ff_event_box), GTK_RELIEF_NONE);
8624 #ifdef GTK2_12_ENABLED
8625     gtk_widget_set_tooltip_text(ff_event_box, _("Fast Forward"));
8626 #else
8627     tooltip = gtk_tooltips_new();
8628     gtk_tooltips_set_tip(tooltip, ff_event_box, _("Fast Forward"), NULL);
8629 #endif
8630 #ifdef GTK2_20_ENABLED
8631     gtk_widget_set_can_focus(ff_event_box, FALSE);
8632 #else
8633     GTK_WIDGET_UNSET_FLAGS(ff_event_box, GTK_CAN_FOCUS);
8634 #endif
8635     gtk_widget_set_events(ff_event_box, GDK_BUTTON_PRESS_MASK);
8636     g_signal_connect(G_OBJECT(ff_event_box), "button_press_event", G_CALLBACK(ff_callback), NULL);
8637     gtk_box_pack_start(GTK_BOX(hbox), ff_event_box, FALSE, FALSE, 0);
8638     gtk_widget_show(image_ff);
8639     gtk_widget_show(ff_event_box);
8640     gtk_widget_set_sensitive(ff_event_box, FALSE);
8641 
8642     next_event_box = gtk_button_new();
8643     gtk_button_set_image(GTK_BUTTON(next_event_box), image_next);
8644     gtk_button_set_relief(GTK_BUTTON(next_event_box), GTK_RELIEF_NONE);
8645 #ifdef GTK2_12_ENABLED
8646     gtk_widget_set_tooltip_text(next_event_box, _("Next"));
8647 #else
8648     tooltip = gtk_tooltips_new();
8649     gtk_tooltips_set_tip(tooltip, next_event_box, _("Next"), NULL);
8650 #endif
8651 #ifdef GTK2_20_ENABLED
8652     gtk_widget_set_can_focus(next_event_box, FALSE);
8653 #else
8654     GTK_WIDGET_UNSET_FLAGS(next_event_box, GTK_CAN_FOCUS);
8655 #endif
8656     gtk_widget_set_events(next_event_box, GDK_BUTTON_PRESS_MASK);
8657     g_signal_connect(G_OBJECT(next_event_box), "button_press_event", G_CALLBACK(next_callback), NULL);
8658     gtk_box_pack_start(GTK_BOX(hbox), next_event_box, FALSE, FALSE, 0);
8659     gtk_widget_show(image_next);
8660     gtk_widget_show(next_event_box);
8661     gtk_widget_set_sensitive(next_event_box, FALSE);
8662 
8663     // progress bar
8664     tracker = GMTK_MEDIA_TRACKER(gmtk_media_tracker_new());
8665     gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(tracker), TRUE, TRUE, 2);
8666     g_signal_connect(G_OBJECT(tracker), "difference-changed", G_CALLBACK(tracker_difference_callback), NULL);
8667     g_signal_connect(G_OBJECT(tracker), "value-changed", G_CALLBACK(tracker_value_changed_callback), NULL);
8668     g_signal_connect(G_OBJECT(tracker), "button_press_event", G_CALLBACK(progress_callback), NULL);
8669     g_signal_connect_swapped(G_OBJECT(media), "position_changed",
8670                              G_CALLBACK(player_position_changed_callback), tracker);
8671     g_signal_connect_swapped(G_OBJECT(media), "cache_percent_changed",
8672                              G_CALLBACK(player_cache_percent_changed_callback), tracker);
8673     g_signal_connect_swapped(G_OBJECT(media), "attribute_changed",
8674                              G_CALLBACK(player_attribute_changed_callback), tracker);
8675     gtk_widget_show(GTK_WIDGET(tracker));
8676 
8677     // fullscreen button, pack from end for this button and the vol slider
8678     fs_event_box = gtk_button_new();
8679     gtk_button_set_image(GTK_BUTTON(fs_event_box), image_fs);
8680     gtk_button_set_relief(GTK_BUTTON(fs_event_box), GTK_RELIEF_NONE);
8681 #ifdef GTK2_12_ENABLED
8682     gtk_widget_set_tooltip_text(fs_event_box, _("Full Screen"));
8683 #else
8684     tooltip = gtk_tooltips_new();
8685     gtk_tooltips_set_tip(tooltip, fs_event_box, _("Full Screen"), NULL);
8686 #endif
8687 #ifdef GTK2_20_ENABLED
8688     gtk_widget_set_can_focus(fs_event_box, FALSE);
8689 #else
8690     GTK_WIDGET_UNSET_FLAGS(fs_event_box, GTK_CAN_FOCUS);
8691 #endif
8692     gtk_widget_set_events(fs_event_box, GDK_BUTTON_PRESS_MASK);
8693     g_signal_connect(G_OBJECT(fs_event_box), "button_press_event", G_CALLBACK(fs_callback), NULL);
8694     gtk_box_pack_end(GTK_BOX(hbox), fs_event_box, FALSE, FALSE, 0);
8695     gtk_widget_show(image_fs);
8696     if (!disable_fullscreen)
8697         gtk_widget_show(fs_event_box);
8698     // volume control
8699     if ((window_y > window_x)
8700         && (rpcontrols != NULL && g_ascii_strcasecmp(rpcontrols, "volumeslider") == 0)) {
8701         vol_slider = gtk_vscale_new_with_range(0.0, 1.0, 0.20);
8702         gtk_widget_set_size_request(vol_slider, -1, window_y);
8703         gtk_range_set_inverted(GTK_RANGE(vol_slider), TRUE);
8704     } else {
8705 #ifdef GTK2_12_ENABLED
8706         vol_slider = gtk_volume_button_new();
8707 #ifdef GTK3_ENABLED
8708         g_object_set(G_OBJECT(vol_slider), "use-symbolic", TRUE, NULL);
8709 #endif
8710         adj = gtk_scale_button_get_adjustment(GTK_SCALE_BUTTON(vol_slider));
8711         gtk_scale_button_set_adjustment(GTK_SCALE_BUTTON(vol_slider), adj);
8712         gtk_scale_button_set_value(GTK_SCALE_BUTTON(vol_slider), audio_device.volume);
8713         if (large_buttons)
8714             g_object_set(G_OBJECT(vol_slider), "size", GTK_ICON_SIZE_BUTTON, NULL);
8715         else
8716             g_object_set(G_OBJECT(vol_slider), "size", GTK_ICON_SIZE_MENU, NULL);
8717         g_signal_connect(G_OBJECT(vol_slider), "value_changed",
8718                          G_CALLBACK(vol_button_value_changed_callback), idledata);
8719         gtk_button_set_relief(GTK_BUTTON(vol_slider), GTK_RELIEF_NONE);
8720 #else
8721         vol_slider = gtk_hscale_new_with_range(0.0, 1.0, 0.2);
8722         gtk_widget_set_size_request(vol_slider, 44, button_size);
8723         gtk_scale_set_draw_value(GTK_SCALE(vol_slider), FALSE);
8724         gtk_range_set_value(GTK_RANGE(vol_slider), audio_device.volume);
8725         g_signal_connect(G_OBJECT(vol_slider), "value_changed", G_CALLBACK(vol_slider_callback), idledata);
8726 #endif
8727     }
8728 #ifdef GTK2_12_ENABLED
8729     // no tooltip on the volume_button is needed
8730     // gtk_widget_set_tooltip_text(vol_slider, idledata->vol_tooltip);
8731 #else
8732     volume_tip = gtk_tooltips_new();
8733     gtk_tooltips_set_tip(volume_tip, vol_slider, _("Volume 100%"), NULL);
8734 #endif
8735     gtk_box_pack_end(GTK_BOX(hbox), vol_slider, FALSE, FALSE, 0);
8736 #ifdef GTK2_20_ENABLED
8737     gtk_widget_set_can_focus(vol_slider, FALSE);
8738 #else
8739     GTK_WIDGET_UNSET_FLAGS(vol_slider, GTK_CAN_FOCUS);
8740 #endif
8741     gtk_widget_show(vol_slider);
8742     gtk_widget_realize(window);
8743     return window;
8744 }
8745 
show_window(gint windowid)8746 void show_window(gint windowid)
8747 {
8748     gint i;
8749     gchar **visuals;
8750     if (windowid != 0 && embedding_disabled == FALSE) {
8751         gm_log(verbose, G_LOG_LEVEL_DEBUG, "waiting for all events to drain");
8752         while (gtk_events_pending())
8753             gtk_main_iteration();
8754 #ifdef GTK2_24_ENABLED
8755         window_container = gdk_x11_window_foreign_new_for_display(gdk_display_get_default(), windowid);
8756 #else
8757         window_container = gdk_window_foreign_new(windowid);
8758 #endif
8759 #ifdef GTK2_20_ENABLED
8760         if (gtk_widget_get_mapped(window))
8761             gtk_widget_unmap(window);
8762 #else
8763         if (GTK_WIDGET_MAPPED(window))
8764             gtk_widget_unmap(window);
8765 #endif
8766         gdk_window_reparent(gmtk_get_window(window), window_container, 0, 0);
8767     }
8768 
8769     if (rpcontrols == NULL || (rpcontrols != NULL && g_ascii_strcasecmp(rpcontrols, "all") == 0)) {
8770         if (windowid != -1)
8771             gtk_widget_show_all(window);
8772         gtk_widget_hide(media_hbox);
8773         if (gmtk_media_player_get_media_type(GMTK_MEDIA_PLAYER(media)) == TYPE_DVD) {
8774             gtk_widget_show(menu_event_box);
8775         } else {
8776             gtk_widget_hide(menu_event_box);
8777         }
8778         gtk_widget_hide(audio_meter);
8779         if (disable_fullscreen)
8780             gtk_widget_hide(fs_event_box);
8781         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_showcontrols), showcontrols);
8782         if (windowid > 0) {
8783             if (window_x < 250) {
8784                 gtk_widget_hide(rew_event_box);
8785                 gtk_widget_hide(ff_event_box);
8786                 gtk_widget_hide(fs_event_box);
8787             }
8788 
8789             if (window_x < 170) {
8790                 gtk_widget_hide(GTK_WIDGET(tracker));
8791             }
8792             if (window_x > 0 && window_y > 0) {
8793                 gtk_window_resize(GTK_WINDOW(window), window_x, window_y);
8794                 gtk_widget_set_size_request(window, window_x, window_y);
8795             }
8796         } else {
8797             gtk_widget_set_size_request(window, -1, -1);
8798             gtk_widget_set_size_request(GTK_WIDGET(tracker), 200, -1);
8799         }
8800 
8801     } else {
8802 
8803         if (windowid != -1)
8804             gtk_widget_show_all(window);
8805         gtk_widget_hide(media);
8806         gtk_widget_hide(menubar);
8807         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), FALSE);
8808         gtk_widget_hide(menu_event_box);
8809         gtk_widget_hide(audio_meter);
8810         gtk_widget_hide(controls_box);
8811         gm_log(verbose, G_LOG_LEVEL_MESSAGE, "showing the following controls = %s", rpcontrols);
8812         visuals = g_strsplit(rpcontrols, ",", 0);
8813         i = 0;
8814         while (visuals[i] != NULL) {
8815             if (g_ascii_strcasecmp(visuals[i], "statusbar") == 0
8816                 || g_ascii_strcasecmp(visuals[i], "statusfield") == 0
8817                 || g_ascii_strcasecmp(visuals[i], "positionfield") == 0
8818                 || g_ascii_strcasecmp(visuals[i], "positionslider") == 0) {
8819                 gtk_widget_show(GTK_WIDGET(tracker));
8820                 gtk_widget_show(controls_box);
8821                 gtk_widget_show(hbox);
8822                 gtk_widget_hide(menu_event_box);
8823                 gtk_widget_hide(media);
8824                 control_instance = FALSE;
8825             }
8826             if (g_ascii_strcasecmp(visuals[i], "infovolumepanel") == 0) {
8827                 gtk_widget_show(GTK_WIDGET(vol_slider));
8828                 gtk_widget_show(controls_box);
8829                 gtk_widget_show(hbox);
8830                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), TRUE);
8831                 control_instance = FALSE;
8832             }
8833             if (g_ascii_strcasecmp(visuals[i], "infopanel") == 0) {
8834                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_info), TRUE);
8835                 control_instance = FALSE;
8836             }
8837 
8838             if (g_ascii_strcasecmp(visuals[i], "volumeslider") == 0) {
8839                 gtk_widget_show(GTK_WIDGET(vol_slider));
8840                 gtk_widget_show(controls_box);
8841                 gtk_widget_show(hbox);
8842             }
8843             if (g_ascii_strcasecmp(visuals[i], "playbutton") == 0) {
8844                 gtk_widget_show_all(GTK_WIDGET(play_event_box));
8845                 gtk_widget_show(controls_box);
8846                 gtk_widget_show(hbox);
8847             }
8848             if (g_ascii_strcasecmp(visuals[i], "stopbutton") == 0) {
8849                 gtk_widget_show_all(GTK_WIDGET(stop_event_box));
8850                 gtk_widget_show(controls_box);
8851                 gtk_widget_show(hbox);
8852             }
8853             if (g_ascii_strcasecmp(visuals[i], "pausebutton") == 0) {
8854                 gtk_widget_show_all(GTK_WIDGET(play_event_box));
8855                 gtk_widget_show(controls_box);
8856                 gtk_widget_show(hbox);
8857             }
8858             if (g_ascii_strcasecmp(visuals[i], "ffctrl") == 0) {
8859                 gtk_widget_show_all(GTK_WIDGET(ff_event_box));
8860                 gtk_widget_show(controls_box);
8861                 gtk_widget_show(hbox);
8862             }
8863             if (g_ascii_strcasecmp(visuals[i], "rwctrl") == 0) {
8864                 gtk_widget_show_all(GTK_WIDGET(rew_event_box));
8865                 gtk_widget_show(controls_box);
8866                 gtk_widget_show(hbox);
8867             }
8868 
8869             if (g_ascii_strcasecmp(visuals[i], "imagewindow") == 0) {
8870                 gtk_widget_show_all(GTK_WIDGET(media));
8871                 control_instance = FALSE;
8872             }
8873 
8874             if (g_ascii_strcasecmp(visuals[i], "controlpanel") == 0) {
8875                 gtk_widget_show(controls_box);
8876                 gtk_widget_show_all(hbox);
8877                 gtk_widget_hide(GTK_WIDGET(tracker));
8878                 gtk_widget_hide(menu_event_box);
8879                 gtk_widget_hide(media);
8880             }
8881 
8882             i++;
8883         }
8884 
8885 
8886     }
8887 
8888     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_fullscreen), FALSE);
8889     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_details), FALSE);
8890     gtk_widget_set_sensitive(GTK_WIDGET(fs_event_box), FALSE);
8891     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_loop), FALSE);
8892     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_play_single), FALSE);
8893     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_subtitle), FALSE);
8894     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_set_audiofile), FALSE);
8895     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_take_screenshot), FALSE);
8896     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_select_audio_lang), FALSE);
8897     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_select_sub_lang), FALSE);
8898     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_info), FALSE);
8899     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_fullscreen), FALSE);
8900     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_onetoone), FALSE);
8901     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_onetotwo), FALSE);
8902     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_twotoone), FALSE);
8903     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_onetoonepointfive), FALSE);
8904     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect), FALSE);
8905     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_default), FALSE);
8906     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_four_three), FALSE);
8907     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_sixteen_nine), FALSE);
8908     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_sixteen_ten), FALSE);
8909     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_anamorphic), FALSE);
8910     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_aspect_follow_window), FALSE);
8911     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_subtitles), FALSE);
8912     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_smaller_subtitle), FALSE);
8913     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_larger_subtitle), FALSE);
8914     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_decrease_subtitle_delay), FALSE);
8915     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_increase_subtitle_delay), FALSE);
8916     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_angle), FALSE);
8917     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_view_advanced), FALSE);
8918     gtk_widget_set_sensitive(GTK_WIDGET(menuitem_edit_random), FALSE);
8919     gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
8920     gtk_widget_hide(prev_event_box);
8921     gtk_widget_hide(next_event_box);
8922     gtk_widget_hide(GTK_WIDGET(menuitem_prev));
8923     gtk_widget_hide(GTK_WIDGET(menuitem_next));
8924     gtk_widget_hide(media_hbox);
8925     gtk_widget_hide(audio_meter);
8926     gtk_widget_hide(plvbox);
8927     gtk_widget_hide(details_vbox);
8928     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_view_details), details_visible);
8929     gtk_widget_hide(GTK_WIDGET(menuitem_edit_switch_audio));
8930     if (keep_on_top)
8931         gtk_window_set_keep_above(GTK_WINDOW(window), keep_on_top);
8932     update_status_icon();
8933 }
8934 
present_main_window()8935 void present_main_window()
8936 {
8937     gtk_window_present(GTK_WINDOW(window));
8938 }
8939 
logdb(double v)8940 static inline double logdb(double v)
8941 {
8942     if (v > 1)
8943         return 0;
8944     if (v <= 1E-8)
8945         return METER_BARS - 1;
8946     return log(v) / -0.23025850929940456840179914546843642076;
8947 }
8948 
update_audio_meter(gpointer data)8949 gboolean update_audio_meter(gpointer data)
8950 {
8951     gint i, channel;
8952     gfloat f;
8953     gint max;
8954     //gfloat freq;
8955     gfloat v;
8956     //gfloat lsb16, rsb16;
8957     Export *export;
8958     //gint bucketid;
8959     static gint update_counter = 0;
8960     static gint export_counter = 0;
8961     gboolean refresh;
8962 #define UAM_HISTOGRAM_SIZE 65536
8963     long long histogram[UAM_HISTOGRAM_SIZE];
8964     gint histogramloc;
8965     gint thispayloadni;
8966     gint thispayloadnch;
8967     gint bucketi;
8968 
8969     if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem_view_meter)))
8970         return TRUE;
8971     if (gmtk_media_player_get_media_state(GMTK_MEDIA_PLAYER(media)) != MEDIA_STATE_PLAY)
8972         return TRUE;
8973     if (audio_meter != NULL && gmtk_get_visible(audio_meter)) {
8974 
8975         if (data)
8976             g_array_free(data, TRUE);
8977         if (max_data)
8978             g_array_free(max_data, TRUE);
8979         data = g_array_new(FALSE, TRUE, sizeof(gfloat));
8980         max_data = g_array_new(FALSE, TRUE, sizeof(gfloat));
8981         for (i = 0; i < METER_BARS; i++) {
8982             buckets[i] = 0;
8983         }
8984 
8985         refresh = FALSE;
8986         reading_af_export = TRUE;
8987         export = NULL;
8988         if (idledata->mapped_af_export != NULL)
8989             export = (Export *) g_mapped_file_get_contents(idledata->mapped_af_export);
8990         if (export != NULL) {
8991             if (export->counter != export_counter) {
8992                 /*
8993                    for (i = 0; export != NULL && i < (export->size / (export->nch * sizeof(gint16))); i++) {
8994                    freq = 0;
8995 
8996                    // this is an testing meter for two channel
8997                    for (j = 0; j < export->nch; j++) {
8998                    // scale SB16 data to 0 - 22000 range, believe this is Hz now
8999                    freq += (export->payload[j][i]) * 22000 / (32768 * export->nch);
9000                    }
9001                    // ignore values below 20, as this is unaudible and may skew data
9002                    if (freq > (22000.0 / METER_BARS)) {
9003                    bucketid = (gint) (freq / (gfloat) (22000.0 / (gfloat) METER_BARS)) - 1;
9004                    if (bucketid >= METER_BARS) {
9005                    printf("bucketid = %i freq = %f\n", bucketid, freq);
9006                    bucketid = METER_BARS - 1;
9007                    }
9008                    buckets[bucketid]++;
9009                    }
9010 
9011                    }
9012                    export_counter = export->counter;
9013                    refresh = TRUE;
9014                  */
9015                 for (histogramloc = 0; histogramloc < UAM_HISTOGRAM_SIZE; histogramloc++) {
9016                     histogram[histogramloc] = 0;
9017                 }
9018                 thispayloadni = (export->size / (export->nch * sizeof(gint16)));
9019                 if (thispayloadni > PAYLOADNI) {
9020                     thispayloadni = PAYLOADNI;
9021                 }
9022                 if (thispayloadni < 0) {
9023                     thispayloadni = 0;
9024                 }
9025                 thispayloadnch = export->nch;
9026                 if (thispayloadnch > PAYLOADNCH) {
9027                     thispayloadnch = PAYLOADNCH;
9028                 }
9029                 if (thispayloadnch < 0) {
9030                     thispayloadnch = 0;
9031                 }
9032                 for (i = 0; export != NULL && i < thispayloadni; i++) {
9033                     for (channel = 0; channel < thispayloadnch; channel++) {
9034                         // scale SB16 data to 0 - 22000 range, believe this is Hz now
9035                         histogramloc = export->payload[channel][i] + 32768;
9036                         if (histogramloc >= 0 && histogramloc < UAM_HISTOGRAM_SIZE) {
9037                             histogram[histogramloc]++;
9038                         }
9039                     }
9040                 }
9041                 for (histogramloc = 0; histogramloc < UAM_HISTOGRAM_SIZE; histogramloc++) {
9042                     v = (histogramloc - 32768) / 32768.0;
9043                     bucketi = (gint) (logdb(v * v) / 2.0);
9044                     if (bucketi < METER_BARS) {
9045                         buckets[bucketi] += histogram[histogramloc];
9046                     }
9047                 }
9048                 buckets[0] = buckets[1] - (buckets[2] - buckets[1]);
9049                 if (buckets[0] < 0)
9050                     buckets[0] = 0;
9051                 export_counter = export->counter;
9052                 refresh = TRUE;
9053             }
9054             // g_free(export);
9055             /*
9056                if (export->counter > export_counter) {
9057                for (j =0; j < export->nch ; j++) {
9058                lsb16 = 0;
9059                for(i=0; i < (export->size / ( export->nch * sizeof(gint16))); i++) {
9060                lsb16 += export->payload[j][i];
9061                bucketid = abs(lsb16) * METER_BARS / 1000000;
9062                buckets[bucketid - 1]++;
9063                }
9064                }
9065                export_counter = export->counter;
9066                refresh = TRUE;
9067                }
9068              */
9069         }
9070         reading_af_export = FALSE;
9071         if (refresh) {
9072             max = 0;
9073             update_counter++;
9074             for (i = 0; i < METER_BARS; i++) {
9075                 if (buckets[i] > max_buckets[i]) {
9076                     max_buckets[i] = buckets[i];
9077                 } else {
9078                     // raise this value for slower melting of max
9079                     if (update_counter % 1 == 0) {
9080                         update_counter = 0;
9081                         max_buckets[i]--;
9082                         if (max_buckets[i] < 0)
9083                             max_buckets[i] = 0;
9084                     }
9085                 }
9086 
9087                 if (max_buckets[i] > max)
9088                     max = max_buckets[i];
9089             }
9090 
9091             for (i = 0; i < METER_BARS; i++) {
9092                 if (max == 0) {
9093                     f = 0.0;
9094                     g_array_append_val(data, f);
9095                     g_array_append_val(max_data, f);
9096                 } else {
9097                     f = logf((gfloat) buckets[i]) / logf((gfloat) max);
9098                     // f = ((gfloat) buckets[i]) / ((gfloat) max);
9099                     g_array_append_val(data, f);
9100                     f = logf((gfloat) max_buckets[i]) / logf((gfloat) max);
9101                     // f = ((gfloat) max_buckets[i]) / ((gfloat) max);
9102                     g_array_append_val(max_data, f);
9103                 }
9104             }
9105 
9106             gmtk_audio_meter_set_data_full(GMTK_AUDIO_METER(audio_meter), data, max_data);
9107         }
9108     }
9109     return TRUE;
9110 }
9111 
9112 
show_fs_controls()9113 void show_fs_controls()
9114 {
9115     gint x, y;
9116     GdkScreen *screen;
9117     GdkRectangle rect;
9118     GtkAllocation alloc;
9119 #ifdef GTK3_ENABLED
9120     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
9121 #endif
9122 
9123 
9124     g_mutex_lock(fs_controls_lock);
9125     if (fs_controls == NULL && fullscreen) {
9126         fs_controls = gtk_window_new(GTK_WINDOW_POPUP);
9127         gtk_widget_add_events(fs_controls, GDK_ENTER_NOTIFY_MASK);
9128         gtk_widget_add_events(fs_controls, GDK_LEAVE_NOTIFY_MASK);
9129         g_signal_connect(G_OBJECT(fs_controls), "enter_notify_event", G_CALLBACK(fs_controls_entered), NULL);
9130         g_signal_connect(G_OBJECT(fs_controls), "leave_notify_event", G_CALLBACK(fs_controls_left), NULL);
9131         gtk_window_set_transient_for(GTK_WINDOW(fs_controls), GTK_WINDOW(fs_window));
9132     }
9133     if (fs_controls != NULL && fullscreen) {
9134 #ifdef GTK3_ENABLED
9135         if (gtk_icon_theme_has_icon(icon_theme, "view-restore-symbolic")) {
9136             gtk_image_set_from_icon_name(GTK_IMAGE(image_fs), "view-restore-symbolic", button_size);
9137         } else {
9138             gtk_image_set_from_stock(GTK_IMAGE(image_fs), GTK_STOCK_LEAVE_FULLSCREEN, button_size);
9139         }
9140 #else
9141         gtk_image_set_from_stock(GTK_IMAGE(image_fs), GTK_STOCK_LEAVE_FULLSCREEN, button_size);
9142 #endif
9143         if (gtk_widget_get_parent(GTK_WIDGET(hbox)) == controls_box) {
9144             g_object_ref(hbox);
9145             gtk_container_remove(GTK_CONTAINER(controls_box), hbox);
9146             gtk_container_add(GTK_CONTAINER(fs_controls), hbox);
9147             g_object_unref(hbox);
9148         }
9149         gtk_widget_show(fs_controls);
9150 #ifdef GTK3_ENABLED
9151         gtk_widget_set_opacity(GTK_WIDGET(fs_controls), 0.75);
9152 #else
9153 #ifdef GTK2_12_ENABLED
9154         gtk_window_set_opacity(GTK_WINDOW(fs_controls), 0.75);
9155 #endif
9156 #endif
9157 
9158         screen = gtk_window_get_screen(GTK_WINDOW(window));
9159         gtk_window_set_screen(GTK_WINDOW(fs_controls), screen);
9160         gdk_screen_get_monitor_geometry(screen, gdk_screen_get_monitor_at_window(screen, gmtk_get_window(window)),
9161                                         &rect);
9162         gmtk_get_allocation(fs_controls, &alloc);
9163         gtk_widget_set_size_request(fs_controls, rect.width / 2, alloc.height);
9164         x = rect.x + (rect.width / 4);
9165         y = rect.y + rect.height - alloc.height;
9166         gtk_window_move(GTK_WINDOW(fs_controls), x, y);
9167     }
9168     g_mutex_unlock(fs_controls_lock);
9169 
9170 }
9171 
hide_fs_controls()9172 void hide_fs_controls()
9173 {
9174 #ifdef GTK3_ENABLED
9175     GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
9176 #endif
9177 
9178     g_mutex_lock(fs_controls_lock);
9179     if (fs_controls != NULL) {
9180 #ifdef GTK3_ENABLED
9181         if (gtk_icon_theme_has_icon(icon_theme, "view-fullscreen-symbolic")) {
9182             gtk_image_set_from_icon_name(GTK_IMAGE(image_fs), "view-fullscreen-symbolic", button_size);
9183         } else {
9184             gtk_image_set_from_stock(GTK_IMAGE(image_fs), GTK_STOCK_FULLSCREEN, button_size);
9185         }
9186 #else
9187         gtk_image_set_from_stock(GTK_IMAGE(image_fs), GTK_STOCK_FULLSCREEN, button_size);
9188 #endif
9189         if (gtk_widget_get_parent(GTK_WIDGET(hbox)) == fs_controls) {
9190             g_object_ref(hbox);
9191             gtk_container_remove(GTK_CONTAINER(fs_controls), hbox);
9192             gtk_container_add(GTK_CONTAINER(controls_box), hbox);
9193             g_object_unref(hbox);
9194         }
9195         if (fullscreen) {
9196             gtk_widget_hide(GTK_WIDGET(fs_controls));
9197         } else {
9198             gtk_widget_destroy(GTK_WIDGET(fs_controls));
9199             fs_controls = NULL;
9200         }
9201     }
9202     g_mutex_unlock(fs_controls_lock);
9203 
9204 }
9205