~ubuntu-branches/ubuntu/saucy/parole/saucy

« back to all changes in this revision

Viewing changes to src/parole-player.c

  • Committer: Package Import Robot
  • Author(s): Lionel Le Folgoc
  • Date: 2013-01-09 19:08:53 UTC
  • mfrom: (3.1.3 raring-proposed)
  • Revision ID: package-import@ubuntu.com-20130109190853-zeh9ksa0ijwzgmrs
Tags: 0.4.0-0ubuntu1
* New upstream release.
* debian/control:
  - add b-dep on libxfconf-0-dev since parole now uses Xfconf
  - suggests gnome-codec-install for the missing codec feature.

Show diffs side-by-side

added added

removed removed

Lines of Context:
70
70
 
71
71
#include "common/parole-common.h"
72
72
 
 
73
int GTK_ICON_SIZE_ARTWORK_FALLBACK;
73
74
 
74
75
static void
75
76
get_time_string (gchar *timestring, gint total_seconds)
103
104
                                            const gchar *uri, 
104
105
                                            const gchar *device, 
105
106
                                            ParolePlayer *player);
 
107
                                            
 
108
 
 
109
static void parole_player_select_custom_subtitle (GtkMenuItem *widget, gpointer data);
 
110
                                                                
 
111
static gboolean            parole_audiobox_expose_event (GtkWidget *w, GdkEventExpose *ev, ParolePlayer *player);
106
112
 
107
113
/*
108
114
 * GtkBuilder Callbacks
134
140
void            parole_player_back_cb                  (GtkButton *button, 
135
141
                                                         ParolePlayer *player);
136
142
                                                         
137
 
void                    parole_player_seekf_cb (GtkWidget *widget, ParolePlayer *player);
138
 
 
139
 
void                    parole_player_seekb_cb (GtkWidget *widget, ParolePlayer *player);
140
 
 
141
 
void                    parole_player_seekf_long_cb (GtkWidget *widget, ParolePlayer *player);
142
 
 
143
 
void                    parole_player_seekb_long_cb (GtkWidget *widget, ParolePlayer *player);
 
143
void                    parole_player_seekf_cb (GtkWidget *widget, ParolePlayer *player, gdouble seek);
 
144
 
 
145
void                    parole_player_seekb_cb (GtkWidget *widget, ParolePlayer *player, gdouble seek);
144
146
 
145
147
gboolean        parole_player_scroll_event_cb           (GtkWidget *widget,
146
148
                                                         GdkEventScroll *ev,
158
160
 
159
161
void            parole_player_show_hide_playlist        (GtkWidget *widget,
160
162
                                                         ParolePlayer *player);
 
163
                                                         
 
164
void        parole_player_reset_controls (ParolePlayer *player, gboolean fullscreen);
161
165
 
162
166
/*Menu items callbacks*/
163
167
void            parole_player_menu_open_location_cb     (GtkWidget *widget, 
254
258
 
255
259
static void parole_player_subtitles_radio_menu_item_changed_cb(GtkWidget *widget, ParolePlayer *player);
256
260
 
 
261
static void parole_player_dvd_chapter_count_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player);
 
262
 
 
263
static void parole_player_dvd_chapter_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player);
 
264
 
 
265
 
257
266
gboolean        parole_player_key_press                 (GtkWidget *widget, 
258
267
                                                         GdkEventKey *ev, 
259
268
                                                         ParolePlayer *player);
260
 
 
 
269
                                                         
261
270
static GtkTargetEntry target_entry[] =
262
271
{
263
272
    { "STRING",        0, 0 },
291
300
    ParoleMediaType current_media_type;
292
301
 
293
302
    GtkWidget           *window;
 
303
    GtkWidget       *recent_menu;
294
304
    GtkWidget           *playlist_nt;
295
305
    GtkWidget           *main_nt;       /*Main notebook*/
296
306
    GtkWidget           *show_hide_playlist;
324
334
    GList                       *audio_list;
325
335
    GList                       *subtitle_list;
326
336
    gboolean            update_languages;
 
337
    gboolean        updated_subs;
327
338
    GtkWidget           *subtitles_group;
 
339
    GtkWidget       *subtitles_menu_custom;
328
340
    GtkWidget           *audio_group;
329
341
    
330
342
    GtkWidget           *subtitles_menu;
331
343
    GtkWidget           *languages_menu;
332
344
    
333
345
    GtkWidget           *main_box;
 
346
    GtkWidget           *eventbox_output;
 
347
    
 
348
    GtkWidget           *audiobox;
 
349
    GtkWidget           *audiobox_cover;
 
350
    GtkWidget           *audiobox_title;
 
351
    GtkWidget           *audiobox_album;
 
352
    GtkWidget           *audiobox_artist;
334
353
    
335
354
    GtkWidget           *volume;
336
355
    GtkWidget           *menu_bar;
338
357
     
339
358
    gboolean             exit;
340
359
    
 
360
    gboolean             embedded;
341
361
    gboolean             full_screen;
342
362
    
343
363
    ParoleState     state;
345
365
    gboolean             internal_range_change;
346
366
    gboolean             buffering;
347
367
    
 
368
    gboolean        wait_for_gst_disc_info;
 
369
    
348
370
    GtkTreeRowReference *row;
349
371
        
350
372
};
418
440
        }
419
441
        else
420
442
        {
421
 
                gtk_widget_hide_all (player->priv->playlist_nt);
 
443
                gtk_widget_hide (player->priv->playlist_nt);
422
444
                gtk_image_set_from_stock( GTK_IMAGE( player->priv->show_hide_playlist_image ), "gtk-go-back", GTK_ICON_SIZE_LARGE_TOOLBAR );
423
445
                gtk_widget_set_tooltip_text( GTK_WIDGET( player->priv->show_hide_playlist_button ), "Show playlist");
424
446
                g_object_set (G_OBJECT (player->priv->conf),    
442
464
    PAROLE_ISO_IMAGE_CD
443
465
} ParoleIsoImage;
444
466
 
 
467
 
 
468
 
445
469
static void
446
 
iso_files_folder_changed_cb (GtkFileChooser *widget, gpointer data)
 
470
iso_files_folder_changed_cb (GtkFileChooser *widget, ParolePlayer *player)
447
471
{
448
472
    gchar *folder;
449
473
    folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (widget));
450
474
    
451
475
    if ( folder )
452
476
    {
453
 
        parole_rc_write_entry_string ("iso-image-folder", PAROLE_RC_GROUP_GENERAL, folder);
 
477
    g_object_set (G_OBJECT (player->priv->conf),
 
478
                  "iso-image-folder", folder,
 
479
                  NULL);
454
480
        g_free (folder);
455
481
    }
456
482
}
472
498
                                
473
499
    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), FALSE);
474
500
    
475
 
    folder = parole_rc_read_entry_string ("iso-image-folder", PAROLE_RC_GROUP_GENERAL, NULL);
 
501
    g_object_get (G_OBJECT (player->priv->conf),
 
502
                  "iso-image-folder", &folder,
 
503
                  NULL);
476
504
    
477
505
    if ( folder )
478
506
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), folder);
479
507
    
480
508
    g_signal_connect (chooser, "current-folder-changed",
481
 
                      G_CALLBACK (iso_files_folder_changed_cb), NULL);
 
509
                      G_CALLBACK (iso_files_folder_changed_cb), player);
482
510
    
483
511
    filter = gtk_file_filter_new ();
484
512
    gtk_file_filter_set_name (filter, image == PAROLE_ISO_IMAGE_CD ? _("CD image") : _("DVD image"));
520
548
static void
521
549
parole_player_change_range_value (ParolePlayer *player, gdouble value)
522
550
{
 
551
    gchar pos_text[128];
 
552
    
523
553
    if ( !player->priv->user_seeking )
524
554
    {
525
555
        player->priv->internal_range_change = TRUE;
528
558
 
529
559
        player->priv->internal_range_change = FALSE;
530
560
    }
 
561
    
 
562
    get_time_string (pos_text, value);
 
563
    gtk_label_set_text (GTK_LABEL (player->priv->label_elapsed), pos_text);
531
564
}
532
565
 
533
566
static void
538
571
        gtk_window_set_title (GTK_WINDOW (player->priv->window), "Parole Media Player");
539
572
        player->priv->audio_list = NULL;
540
573
        player->priv->subtitle_list = NULL;
 
574
        
 
575
        gtk_widget_hide(GTK_WIDGET(player->priv->infobar));
 
576
    parole_player_change_range_value (player, 0);
 
577
 
 
578
    if ( player->priv->row )
 
579
    {
 
580
        parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
 
581
        gtk_tree_row_reference_free (player->priv->row);
 
582
        player->priv->row = NULL;
 
583
    }
 
584
    
 
585
    if (player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD)
 
586
    {
 
587
        TRACE("CLEAR DVD LIST");
 
588
            parole_media_list_clear_disc_list (player->priv->list);
 
589
            TRACE("END CLEAR DVD LIST");
 
590
    }
541
591
        player->priv->current_media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
542
 
        gtk_widget_hide(GTK_WIDGET(player->priv->infobar));
543
 
    parole_player_change_range_value (player, 0);
 
592
    
 
593
    parole_media_list_set_playlist_view(player->priv->list, PAROLE_MEDIA_LIST_PLAYLIST_VIEW_STANDARD);
 
594
    
 
595
}
544
596
 
 
597
static void
 
598
parole_player_dvd_reset (ParolePlayer *player)
 
599
{
545
600
    if ( player->priv->row )
546
601
    {
547
602
        parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
550
605
    }
551
606
}
552
607
 
 
608
 
 
609
 
553
610
static gboolean
554
611
parole_sublang_equal_lists (GList *orig, GList *new)
555
612
{
761
818
        if (sub_enabled)
762
819
        sub_index = 1;
763
820
        
764
 
        if (parole_sublang_equal_lists (player->priv->subtitle_list, list) == TRUE)
765
 
        {
766
 
                if (g_list_length (list) == 0)
767
 
                {
768
 
                        parole_player_clear_subtitles(player);
769
 
                }
770
 
                return;
771
 
        }
772
 
        
773
 
        parole_player_set_subtitles_list (player, list);
 
821
    if (parole_sublang_equal_lists (player->priv->subtitle_list, list) == TRUE)
 
822
    {
 
823
            if (g_list_length (list) == 0)
 
824
            {
 
825
                    parole_player_clear_subtitles(player);
 
826
            }
 
827
            return;
 
828
    }
 
829
 
 
830
    parole_player_set_subtitles_list (player, list);
774
831
        
775
832
        gtk_combo_box_set_active( GTK_COMBO_BOX(player->priv->combobox_subtitles), sub_index );
776
833
        
791
848
                {
792
849
                        parole_player_update_audio_tracks(player, gst);
793
850
                        parole_player_update_subtitles(player, gst);
 
851
                        
 
852
                        /* Enable custom subtitles for video as long as its not a DVD. */
 
853
                        gtk_widget_set_sensitive(player->priv->subtitles_menu_custom, 
 
854
                            player->priv->current_media_type != PAROLE_MEDIA_TYPE_DVD);
794
855
                }
 
856
                else
 
857
                    gtk_widget_set_sensitive(player->priv->subtitles_menu_custom, FALSE);
795
858
                player->priv->update_languages = FALSE;
796
859
        }
797
860
}
798
861
 
799
862
static void
 
863
parole_player_show_audiobox (ParolePlayer *player)
 
864
{
 
865
    /* Only show the audiobox if we're sure there's no video playing and 
 
866
       visualizations are disabled. */
 
867
    if (!gst_get_has_video ( PAROLE_GST(player->priv->gst) ) &&
 
868
        !gst_get_has_vis   ( PAROLE_GST(player->priv->gst) ) )
 
869
    {
 
870
        gtk_widget_show(player->priv->audiobox);
 
871
        gtk_widget_hide_all(player->priv->eventbox_output);
 
872
    }
 
873
    else
 
874
    {
 
875
        gtk_widget_hide(player->priv->audiobox);
 
876
        gtk_widget_show_all(player->priv->eventbox_output);
 
877
    }
 
878
}
 
879
 
 
880
/**
 
881
 * parole_player_select_custom_subtitle:
 
882
 * @widget : The #GtkMenuItem for selecting a custom subtitle file.
 
883
 * @data   : The #ParolePlayer instance passed by the callback function.
 
884
 *
 
885
 * Display the #FileChooserDialog for selecting a custom subtitle file and load
 
886
 * the subtitles selected.
 
887
 **/
 
888
static void
 
889
parole_player_select_custom_subtitle (GtkMenuItem *widget, gpointer data)
 
890
{
 
891
    ParolePlayer  *player;
 
892
    ParoleFile    *file;
 
893
    
 
894
    GtkWidget     *chooser;
 
895
    GtkFileFilter *filter, *all_files;
 
896
    gint           response;
 
897
    
 
898
    const gchar   *folder;
 
899
    gchar         *sub = NULL;
 
900
    gchar         *uri = NULL;
 
901
    
 
902
    player = PAROLE_PLAYER(data);
 
903
 
 
904
    /* Build the FileChooser dialog for subtitle selection. */
 
905
    chooser = gtk_file_chooser_dialog_new (_("Select Subtitle File"), NULL,
 
906
                                           GTK_FILE_CHOOSER_ACTION_OPEN,
 
907
                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
908
                                           GTK_STOCK_OPEN, GTK_RESPONSE_OK,
 
909
                                           NULL);
 
910
                                
 
911
    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), FALSE);
 
912
    gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE);
 
913
    
 
914
    g_object_get (G_OBJECT (player->priv->conf),
 
915
        "media-chooser-folder", &folder,
 
916
        NULL);
 
917
    
 
918
    if ( folder )
 
919
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), folder);
 
920
    
 
921
    /* Subtitle format filter */
 
922
    filter = gtk_file_filter_new ();
 
923
    gtk_file_filter_set_name (filter, _("Subtitle Files"));
 
924
    gtk_file_filter_add_pattern (filter, "*.asc");
 
925
    gtk_file_filter_add_pattern (filter, "*.txt");
 
926
    gtk_file_filter_add_pattern (filter, "*.sub");
 
927
    gtk_file_filter_add_pattern (filter, "*.srt");
 
928
    gtk_file_filter_add_pattern (filter, "*.smi");
 
929
    gtk_file_filter_add_pattern (filter, "*.ssa");
 
930
    gtk_file_filter_add_pattern (filter, "*.ass");
 
931
    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
 
932
    
 
933
    /* All files filter */
 
934
    all_files = gtk_file_filter_new ();
 
935
    gtk_file_filter_set_name (all_files, _("All files"));
 
936
    gtk_file_filter_add_pattern (all_files, "*");
 
937
    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_files);
 
938
 
 
939
    gtk_window_set_default_size (GTK_WINDOW (chooser), 680, 480);
 
940
 
 
941
    /* Run the dialog, get the selected filename. */    
 
942
    response = gtk_dialog_run (GTK_DIALOG (chooser));
 
943
    if ( response == GTK_RESPONSE_OK )
 
944
    sub = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
 
945
    
 
946
    gtk_widget_destroy (chooser);
 
947
    
 
948
    if ( sub )
 
949
    {
 
950
        /* Get the current playing file uri. */
 
951
        uri = parole_gst_get_file_uri(PAROLE_GST (player->priv->gst));
 
952
        
 
953
        /* Reset the player. */
 
954
        parole_player_reset(player);
 
955
        
 
956
        if ( g_str_has_prefix (uri, "file:/") )
 
957
        {
 
958
                TRACE ("Trying to play media file %s", uri);
 
959
                TRACE ("Trying to use subtitle file %s", sub);
 
960
                player->priv->updated_subs = TRUE;
 
961
                
 
962
                file = parole_media_list_get_selected_file( player->priv->list );
 
963
            
 
964
            /* Set the subtitles in gst as well as in the media list, for later
 
965
               retrieval. */
 
966
            if ( file )
 
967
            {
 
968
                parole_file_set_custom_subtitles(file, sub);
 
969
                parole_gst_set_custom_subtitles(PAROLE_GST (player->priv->gst), sub);
 
970
                parole_gst_play_uri (PAROLE_GST (player->priv->gst), uri, sub);
 
971
                }
 
972
        }
 
973
        
 
974
            g_free (sub);
 
975
            g_free (uri);
 
976
    }
 
977
}
 
978
 
 
979
static void
800
980
parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *row, ParolePlayer *player)
801
981
{
802
982
    ParoleFile *file;
803
983
    GtkTreeIter iter;
804
984
    GtkTreeModel *model;
805
985
 
806
 
    parole_player_reset (player);
807
 
    
808
 
    player->priv->row = gtk_tree_row_reference_copy (row);
809
 
    
810
986
    model = gtk_tree_row_reference_get_model (row);
811
987
    
812
988
    if ( gtk_tree_model_get_iter (model, &iter, gtk_tree_row_reference_get_path (row)) )
815
991
        
816
992
        if ( file )
817
993
        {
818
 
            gchar *sub = NULL;
 
994
            const gchar *sub = NULL;
819
995
            const gchar *uri;
 
996
            const gchar *directory = NULL;
 
997
            gint dvd_chapter;
820
998
            
821
999
            uri = parole_file_get_uri (file);
 
1000
            directory = parole_file_get_directory(file);
 
1001
            
 
1002
            if ( g_str_has_prefix (uri, "dvd") )
 
1003
            {
 
1004
                parole_player_dvd_reset (player);
 
1005
                player->priv->row = gtk_tree_row_reference_copy (row);
 
1006
                dvd_chapter = parole_file_get_dvd_chapter(file);
 
1007
                parole_gst_set_dvd_chapter(PAROLE_GST(player->priv->gst), dvd_chapter);
 
1008
                g_object_unref (file);
 
1009
                return;
 
1010
            }
 
1011
            parole_player_reset (player);
 
1012
            player->priv->row = gtk_tree_row_reference_copy (row);
822
1013
            
823
1014
            if ( g_str_has_prefix (uri, "file:/") )
824
1015
            {
825
1016
                if ( parole_file_filter (player->priv->video_filter, file) )
826
1017
                {
827
 
                    sub = parole_get_subtitle_path (uri);
 
1018
                    sub = parole_file_get_custom_subtitles (file);
 
1019
                    parole_gst_set_custom_subtitles(PAROLE_GST(player->priv->gst), sub);
 
1020
                    if (sub == NULL)
 
1021
                        sub = parole_get_subtitle_path (uri);
828
1022
                }
829
1023
            }
830
1024
            TRACE ("Trying to play media file %s", uri);
831
 
            TRACE ("File content type %s", parole_file_get_content_type (file));
 
1025
            TRACE ("File content type %s", parole_file_get_content_type(file));
 
1026
            
832
1027
            
833
1028
            parole_gst_play_uri (PAROLE_GST (player->priv->gst), 
834
1029
                                 parole_file_get_uri (file),
835
1030
                                 sub);
836
 
            g_free (sub);
837
1031
            
838
1032
            gtk_window_set_title (GTK_WINDOW (player->priv->window), parole_file_get_display_name(file));
839
 
                parole_rc_write_entry_string ("media-chooser-folder", PAROLE_RC_GROUP_GENERAL, parole_file_get_directory(file));
840
 
                
 
1033
            
 
1034
            if ( directory )
 
1035
            {
 
1036
            g_object_set (G_OBJECT (player->priv->conf),
 
1037
                "media-chooser-folder", directory,
 
1038
                NULL);
 
1039
                }
841
1040
 
842
1041
            g_object_unref (file);
843
1042
        }
850
1049
    parole_player_reset (player);
851
1050
    parole_gst_play_device_uri (PAROLE_GST (player->priv->gst), uri, device);
852
1051
    player->priv->current_media_type = parole_gst_get_current_stream_type (PAROLE_GST (player->priv->gst));
 
1052
    
 
1053
    if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
 
1054
    {
 
1055
        player->priv->wait_for_gst_disc_info = TRUE;
 
1056
        if ( player->priv->row )
 
1057
        {
 
1058
            parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
 
1059
            gtk_tree_row_reference_free (player->priv->row);
 
1060
            player->priv->row = NULL;
 
1061
        }
 
1062
        TRACE("CLEAR PLAYLIST");
 
1063
        parole_media_list_clear_list (player->priv->list);
 
1064
        TRACE("END CLEAR PLAYLIST");
 
1065
    }
 
1066
    else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
 
1067
        parole_media_list_set_playlist_view(player->priv->list, PAROLE_MEDIA_LIST_PLAYLIST_VIEW_DISC);
 
1068
}
 
1069
 
 
1070
static void
 
1071
parole_player_disc_label_changed_cb (ParoleDisc *disc, const gchar *label, ParolePlayer *player)
 
1072
{
 
1073
    parole_media_list_add_dvd(player->priv->list, g_strdup(label));
853
1074
}
854
1075
 
855
1076
static void
860
1081
}
861
1082
 
862
1083
static void
 
1084
parole_player_recent_menu_clear_activated_cb (GtkWidget *widget, ParolePlayer *player)
 
1085
{
 
1086
    GtkWidget *dlg;
 
1087
    GtkWidget *clear_button;
 
1088
    gint response;
 
1089
    
 
1090
    dlg = gtk_message_dialog_new (GTK_WINDOW(player->priv->window),
 
1091
                                  GTK_DIALOG_DESTROY_WITH_PARENT,
 
1092
                                  GTK_MESSAGE_QUESTION,
 
1093
                                  GTK_BUTTONS_NONE,
 
1094
                                  NULL);
 
1095
                                  
 
1096
    gtk_message_dialog_set_markup  (GTK_MESSAGE_DIALOG(dlg), 
 
1097
                                    g_strdup_printf("<big><b>%s</b></big>", 
 
1098
                                    _("Clear Recent Items")));
 
1099
    gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG(dlg), 
 
1100
    _("Are you sure you wish to clear your recent items history?  This cannot be undone."));
 
1101
    
 
1102
    gtk_dialog_add_button (GTK_DIALOG(dlg), GTK_STOCK_CANCEL, 0);
 
1103
    clear_button = gtk_dialog_add_button(GTK_DIALOG(dlg),
 
1104
                                         GTK_STOCK_CLEAR,
 
1105
                                         1);
 
1106
    gtk_button_set_label( GTK_BUTTON(clear_button), _("Clear Recent Items") );
 
1107
    
 
1108
    gtk_widget_show_all(dlg);
 
1109
    
 
1110
    response = gtk_dialog_run(GTK_DIALOG(dlg));
 
1111
    if (response == 1)
 
1112
    {
 
1113
        gtk_recent_manager_purge_items(player->priv->recent, NULL);
 
1114
    }
 
1115
    gtk_widget_destroy(dlg);
 
1116
}
 
1117
 
 
1118
static void
 
1119
parole_player_recent_menu_item_activated_cb (GtkWidget *widget, ParolePlayer *player)
 
1120
{
 
1121
    gchar *uri;
 
1122
    gchar *filename;
 
1123
    gchar *filenames[1];
 
1124
    ParoleMediaList *list;
 
1125
    
 
1126
    uri = gtk_recent_chooser_get_current_uri(GTK_RECENT_CHOOSER(widget));
 
1127
    
 
1128
    filename = g_filename_from_uri(uri, NULL, NULL);
 
1129
    
 
1130
    if (g_file_test (filename, G_FILE_TEST_EXISTS)) 
 
1131
    {
 
1132
        gtk_recent_manager_add_item (player->priv->recent, uri);
 
1133
    
 
1134
        filenames[0] = g_strdup(filename);
 
1135
        filenames[1] = NULL;
 
1136
        
 
1137
            list = parole_player_get_media_list (player);
 
1138
            parole_media_list_add_files (list, filenames, FALSE);
 
1139
            
 
1140
            g_free(filenames[0]);
 
1141
        }
 
1142
    
 
1143
    g_free(filename);
 
1144
    g_free(uri);
 
1145
}
 
1146
 
 
1147
static void
863
1148
parole_player_media_cursor_changed_cb (ParoleMediaList *list, gboolean media_selected, ParolePlayer *player)
864
1149
{
865
1150
    if (player->priv->state < PAROLE_STATE_PAUSED)
896
1181
}
897
1182
 
898
1183
static void
 
1184
parole_player_media_list_show_playlist_cb (ParoleMediaList *list, gboolean show_playlist, ParolePlayer *player)
 
1185
{
 
1186
    parole_media_list_set_playlist_view(player->priv->list, 
 
1187
                    player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD);
 
1188
    parole_player_set_playlist_visible (player, show_playlist);
 
1189
}
 
1190
 
 
1191
static void
 
1192
parole_player_media_list_gst_nav_message_cb (ParoleMediaList *list, gint msg_id, ParolePlayer *player)
 
1193
{
 
1194
    parole_gst_send_navigation_command (PAROLE_GST(player->priv->gst), msg_id);
 
1195
}
 
1196
 
 
1197
static void
899
1198
parole_player_media_progressed_cb (ParoleGst *gst, const ParoleStream *stream, gint64 value, ParolePlayer *player)
900
1199
{
901
 
        gchar pos_text[128];
902
1200
#ifdef DEBUG
903
1201
    g_return_if_fail (value > 0);
904
1202
#endif
906
1204
    if ( !player->priv->user_seeking && player->priv->state == PAROLE_STATE_PLAYING )
907
1205
    {
908
1206
        parole_player_change_range_value (player, value);
909
 
    get_time_string (pos_text, value);
910
 
    gtk_label_set_text (GTK_LABEL (player->priv->label_elapsed), pos_text);
911
1207
    }
912
1208
}
913
1209
 
979
1275
        }
980
1276
    }
981
1277
    
982
 
    if ( save )
 
1278
    if ( media_type != PAROLE_MEDIA_TYPE_CDDA && media_type != PAROLE_MEDIA_TYPE_DVD )
983
1279
    {
984
 
        parole_insert_line_history (uri);
 
1280
        if ( save )
 
1281
        {
 
1282
                parole_insert_line_history (uri);
 
1283
        }
985
1284
    }
986
1285
    
987
1286
    g_strfreev (lines);
1011
1310
                  "live", &live,
1012
1311
                  NULL);
1013
1312
                  
 
1313
    if (player->priv->wait_for_gst_disc_info == TRUE)
 
1314
    {
 
1315
        parole_media_list_add_cdda_tracks(player->priv->list, parole_gst_get_num_tracks(PAROLE_GST (player->priv->gst)));
 
1316
        player->priv->wait_for_gst_disc_info = FALSE;
 
1317
    }
 
1318
                  
1014
1319
    gtk_widget_set_sensitive (player->priv->play_pause, TRUE);
1015
1320
    
1016
1321
    parole_player_set_playpause_button_image (player->priv->play_pause, GTK_STOCK_MEDIA_PAUSE);
1128
1433
{
1129
1434
        gboolean repeat, shuffle;
1130
1435
    GtkTreeRowReference *row;
1131
 
 
1132
 
        if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
1133
 
         player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
 
1436
    
 
1437
        if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
1134
1438
    {
1135
 
                if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
1136
1439
                parole_gst_next_dvd_chapter (PAROLE_GST(player->priv->gst));
1137
 
                else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
1138
 
                parole_gst_next_cdda_track (PAROLE_GST(player->priv->gst));
1139
1440
                return;
1140
1441
    }
1141
1442
    
1174
1475
{
1175
1476
        GtkTreeRowReference *row;
1176
1477
 
1177
 
        if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD ||
1178
 
         player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA )
 
1478
        if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
1179
1479
    {
1180
 
                if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
1181
1480
                parole_gst_prev_dvd_chapter (PAROLE_GST(player->priv->gst));
1182
 
                else if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
1183
 
                parole_gst_prev_cdda_track (PAROLE_GST(player->priv->gst));
1184
1481
                return;
1185
1482
    }
1186
1483
    
1218
1515
                  NULL);
1219
1516
                  
1220
1517
    if ( !reset_saver )
1221
 
        parole_screen_saver_uninhibit (player->priv->screen_saver);
 
1518
        parole_screen_saver_uninhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window));
1222
1519
    else if ( player->priv->state ==  PAROLE_STATE_PLAYING )
1223
1520
    {
1224
1521
        gboolean has_video;
1229
1526
                      
1230
1527
        if ( has_video )
1231
1528
        {
1232
 
            parole_screen_saver_inhibit (player->priv->screen_saver);
 
1529
            parole_screen_saver_inhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window));
1233
1530
        }
1234
1531
    }
1235
1532
    else
1236
 
        parole_screen_saver_uninhibit (player->priv->screen_saver);
 
1533
        parole_screen_saver_uninhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window));
1237
1534
}
1238
1535
 
1239
1536
static void
1247
1544
    if ( state == PAROLE_STATE_PLAYING )
1248
1545
    {
1249
1546
        parole_player_playing (player, stream);
 
1547
        parole_player_show_audiobox(player);
1250
1548
    }
1251
1549
    else if ( state == PAROLE_STATE_PAUSED )
1252
1550
    {
1256
1554
    {
1257
1555
        parole_player_stopped (player);
1258
1556
    }
1259
 
    else if ( state == PAROLE_STATE_PLAYBACK_FINISHED || state == PAROLE_STATE_ABOUT_TO_FINISH)
1260
 
    {
1261
 
#ifdef DEBUG
1262
 
        if (state == PAROLE_STATE_PLAYBACK_FINISHED )
1263
 
            TRACE ("***Playback finished***");
1264
 
        else
1265
 
            TRACE ("***Playback about to finish***");
 
1557
    /* PAROLE_STATE_ABOUT_TO_FINISH is used for continuous playback of audio CDs */
 
1558
    else if ( state == PAROLE_STATE_ABOUT_TO_FINISH )
 
1559
    {
 
1560
#ifdef DEBUG
 
1561
    TRACE ("***Playback about to finish***");
 
1562
#endif
 
1563
    if ( player->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
 
1564
        parole_player_play_next (player, TRUE);
 
1565
    }
 
1566
    else if ( state == PAROLE_STATE_PLAYBACK_FINISHED )
 
1567
    {
 
1568
#ifdef DEBUG
 
1569
    TRACE ("***Playback finished***");
1266
1570
#endif
1267
1571
        parole_player_play_next (player, TRUE);
1268
1572
    }
1285
1589
    parole_gst_stop (PAROLE_GST (player->priv->gst));
1286
1590
}
1287
1591
 
1288
 
/*
1289
 
 * Seek 5%
1290
 
 */
1291
 
static gint64
1292
 
parole_player_get_seek_value (ParolePlayer *player)
1293
 
{
1294
 
    gint64 val;
1295
 
    gint64 dur;
1296
 
    
1297
 
    dur = parole_gst_get_stream_duration (PAROLE_GST (player->priv->gst));
1298
 
    
1299
 
    val = dur * 5 /100;
1300
 
    
1301
 
    return val;
1302
 
}
1303
 
 
1304
1592
void parole_player_forward_cb (GtkButton *button, ParolePlayer *player)
1305
1593
{
1306
1594
        parole_player_play_next (player, FALSE);
1311
1599
        parole_player_play_prev (player);
1312
1600
}
1313
1601
 
1314
 
void parole_player_seekf_cb (GtkWidget *widget, ParolePlayer *player)
1315
 
{
1316
 
        gdouble seek;
1317
 
        
1318
 
        seek =  parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
1319
 
                        +
1320
 
                        parole_player_get_seek_value (player);
1321
 
                        
1322
 
        parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
1323
 
}
1324
 
 
1325
 
void parole_player_seekb_cb (GtkWidget *widget, ParolePlayer *player)
1326
 
{
1327
 
        gdouble seek;
1328
 
        
1329
 
        seek =  parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
1330
 
                        -
1331
 
                        parole_player_get_seek_value (player);
1332
 
                        
1333
 
        parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
1334
 
}
1335
 
 
1336
 
void parole_player_seekf_long_cb (GtkWidget *widget, ParolePlayer *player)
1337
 
{
1338
 
        gdouble seek;
1339
 
        
1340
 
        seek =  parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
1341
 
                        +
1342
 
                        600;
1343
 
                        
1344
 
        parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
1345
 
}
1346
 
 
1347
 
void parole_player_seekb_long_cb (GtkWidget *widget, ParolePlayer *player)
1348
 
{
1349
 
        gdouble seek;
1350
 
        
1351
 
        seek =  parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
1352
 
                        -
1353
 
                        600;
1354
 
                        
 
1602
void parole_player_seekf_cb (GtkWidget *widget, ParolePlayer *player, gdouble seek)
 
1603
{
 
1604
        seek =  parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
 
1605
                        +
 
1606
                        seek;
 
1607
        parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
 
1608
}
 
1609
 
 
1610
void parole_player_seekb_cb (GtkWidget *widget, ParolePlayer *player, gdouble seek)
 
1611
{
 
1612
        seek =  parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
 
1613
                        -
 
1614
                        seek;
1355
1615
        parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
1356
1616
}
1357
1617
 
1412
1672
parole_player_error_cb (ParoleGst *gst, const gchar *error, ParolePlayer *player)
1413
1673
{
1414
1674
    parole_dialog_error (GTK_WINDOW (player->priv->window), _("GStreamer backend error"), error);
1415
 
    parole_screen_saver_uninhibit (player->priv->screen_saver);
 
1675
    parole_screen_saver_uninhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window));
1416
1676
    parole_player_stopped (player);
1417
1677
}
1418
1678
 
1420
1680
parole_player_media_tag_cb (ParoleGst *gst, const ParoleStream *stream, ParolePlayer *player)
1421
1681
{
1422
1682
    gchar *title;
 
1683
    gchar *album;
 
1684
    gchar *artist;
 
1685
    gchar *year;
 
1686
    GdkPixbuf *image = NULL, *cover = NULL;
1423
1687
    
1424
1688
    if ( player->priv->row )
1425
1689
    {
1426
1690
        g_object_get (G_OBJECT (stream),
1427
1691
                      "title", &title,
 
1692
                      "album", &album,
 
1693
                      "artist", &artist,
 
1694
                      "year", &year,
1428
1695
                      NULL);
 
1696
 
1429
1697
        if ( title )
1430
1698
        {
1431
1699
            parole_media_list_set_row_name (player->priv->list, player->priv->row, title);
 
1700
            gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_title), g_markup_printf_escaped("<span color='#F4F4F4'><b><big>%s</big></b></span>", title));
1432
1701
            g_free (title);
1433
1702
        }
 
1703
        else
 
1704
            gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_title), g_strdup_printf("<span color='#F4F4F4'><b><big>%s</big></b></span>", _("Unknown Song")));
 
1705
 
 
1706
        if ( album )
 
1707
        {
 
1708
            if (year)
 
1709
                gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_album), g_markup_printf_escaped("<big><span color='#BBBBBB'><i>%s</i></span> <span color='#F4F4F4'>%s (%s)</span></big>", _("on"), album, year));
 
1710
            else
 
1711
                gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_album), g_markup_printf_escaped("<big><span color='#BBBBBB'><i>%s</i></span> <span color='#F4F4F4'>%s</span></big>", _("on"), album));
 
1712
                
 
1713
            g_free (album);
 
1714
        }
 
1715
        
 
1716
        else
 
1717
            gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_album), g_strdup_printf("<big><span color='#BBBBBB'><i>%s</i></span> <span color='#F4F4F4'>%s</span></big>", _("on"), _("Unknown Album")));
 
1718
        
 
1719
        if (year)
 
1720
            g_free (year);
 
1721
 
 
1722
        if ( artist )
 
1723
        {
 
1724
            gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_artist), g_markup_printf_escaped("<big><span color='#BBBBBB'><i>%s</i></span> <span color='#F4F4F4'>%s</span></big>", _("by"), artist));
 
1725
            g_free (artist);
 
1726
        }
 
1727
        else
 
1728
            gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_artist), g_strdup_printf("<big><span color='#BBBBBB'><i>%s</i></span> <span color='#F4F4F4'>%s</span></big>", _("by"), _("Unknown Artist")));
 
1729
        
 
1730
        image = parole_stream_get_image(G_OBJECT(stream));
 
1731
        if (image)
 
1732
        {
 
1733
            cover = gdk_pixbuf_scale_simple(image, 256, 256, GDK_INTERP_BILINEAR);
 
1734
            gtk_image_set_from_pixbuf(GTK_IMAGE(player->priv->audiobox_cover), cover);
 
1735
            g_object_unref(cover);
 
1736
            g_object_unref(image);
 
1737
    }
 
1738
        else
 
1739
        gtk_image_set_from_icon_name(GTK_IMAGE(player->priv->audiobox_cover), "audio-x-generic", GTK_ICON_SIZE_ARTWORK_FALLBACK);
1434
1740
    }
1435
1741
}
1436
1742
 
1464
1770
    }
1465
1771
}
1466
1772
 
 
1773
static void
 
1774
parole_player_dvd_chapter_count_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player)
 
1775
{
 
1776
    gtk_tree_row_reference_free (player->priv->row);
 
1777
        player->priv->row = NULL;
 
1778
        
 
1779
        /* FIXME Cannot clear list prior to adding new chapters. */
 
1780
        //parole_media_list_clear_list (player->priv->list);
 
1781
        
 
1782
    parole_media_list_add_dvd_chapters (player->priv->list, chapter_count);
 
1783
}
 
1784
 
 
1785
static void
 
1786
parole_player_dvd_chapter_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player)
 
1787
{
 
1788
    GdkPixbuf *pix = NULL;
 
1789
    
 
1790
        parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
 
1791
        
 
1792
    player->priv->row = parole_media_list_get_row_n (player->priv->list, chapter_count-1);
 
1793
 
 
1794
    pix = parole_icon_load ("player_play", 16);
 
1795
    
 
1796
    if ( !pix )
 
1797
        pix = parole_icon_load ("gtk-media-play-ltr", 16);
 
1798
    
 
1799
    parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, pix);
 
1800
    parole_media_list_select_row (player->priv->list, player->priv->row);
 
1801
    
 
1802
    if ( pix )
 
1803
        g_object_unref (pix);
 
1804
}
 
1805
 
1467
1806
gboolean parole_player_delete_event_cb (GtkWidget *widget, GdkEvent *ev, ParolePlayer *player)
1468
1807
{
1469
1808
    parole_window_busy_cursor (GTK_WIDGET (player->priv->window)->window);
1499
1838
    
1500
1839
    gtk_window_resize (GTK_WINDOW (player->priv->fs_window), 
1501
1840
                       rect.width, 
1502
 
                       player->priv->play_box->allocation.width);
 
1841
                       player->priv->play_box->allocation.height);
1503
1842
    
1504
1843
    gtk_window_move (GTK_WINDOW (player->priv->fs_window),
1505
1844
                     rect.x, 
1506
1845
                     rect.height + rect.y - player->priv->play_box->allocation.height);
1507
1846
}
1508
1847
 
 
1848
/**
 
1849
 * parole_player_reset_controls:
 
1850
 * @player     : the #ParolePlayer instance.
 
1851
 * @fullscreen : %TRUE if player should be fullscreen, else %FALSE.
 
1852
 * 
 
1853
 * Reset the player controls based on existing conditions.
 
1854
 **/
1509
1855
void
1510
 
parole_player_full_screen (ParolePlayer *player, gboolean fullscreen)
 
1856
parole_player_reset_controls (ParolePlayer *player, gboolean fullscreen)
1511
1857
{
1512
1858
    gint npages;
1513
1859
    static gint current_page = 0;
1515
1861
    
1516
1862
    gboolean show_playlist;
1517
1863
    
 
1864
    if ( player->priv->full_screen != fullscreen )
 
1865
    {
 
1866
        /* If the player is in fullscreen mode, change to windowed mode. */
 
1867
        if ( player->priv->full_screen )
 
1868
        {
 
1869
            npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (player->priv->main_nt));
 
1870
            gtk_widget_reparent (player->priv->play_box, player->priv->control);
 
1871
            gtk_box_set_child_packing( GTK_BOX(player->priv->control), GTK_WIDGET(player->priv->play_box), TRUE, TRUE, 2, GTK_PACK_START );
 
1872
            gtk_widget_hide (player->priv->fs_window);
 
1873
            gtk_widget_show (player->priv->play_box);
 
1874
            gtk_widget_show (player->priv->menu_bar);
 
1875
            show_playlist = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(player->priv->show_hide_playlist) );
 
1876
            gtk_widget_show (player->priv->playlist_nt);
 
1877
            parole_player_set_playlist_visible(player, show_playlist);
 
1878
            gtk_widget_show (player->priv->go_fs);
 
1879
            gtk_widget_hide (player->priv->leave_fs);
 
1880
            gtk_widget_show (player->priv->show_hide_playlist_button);
 
1881
 
 
1882
            gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), npages > 1);
 
1883
 
 
1884
            gtk_window_unfullscreen (GTK_WINDOW (player->priv->window));
 
1885
            gtk_notebook_set_current_page (GTK_NOTEBOOK (player->priv->playlist_nt), current_page);
 
1886
            gdkwindow = gtk_widget_get_window (player->priv->window);
 
1887
            gdk_window_set_cursor (gdkwindow, NULL);
 
1888
            player->priv->full_screen = FALSE;
 
1889
        }
 
1890
        else
 
1891
        {
 
1892
            parole_player_move_fs_window (player);
 
1893
            gtk_widget_reparent (player->priv->play_box, player->priv->fs_window);
 
1894
 
 
1895
            gtk_widget_hide (player->priv->play_box);
 
1896
            gtk_widget_hide (player->priv->menu_bar);
 
1897
            gtk_widget_hide (player->priv->playlist_nt);
 
1898
            parole_player_set_playlist_visible(player, FALSE);
 
1899
            gtk_widget_hide (player->priv->go_fs);
 
1900
            gtk_widget_show (player->priv->leave_fs);
 
1901
            gtk_widget_hide (player->priv->show_hide_playlist_button);
 
1902
 
 
1903
            current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (player->priv->playlist_nt));
 
1904
            gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), FALSE);
 
1905
 
 
1906
            gtk_window_fullscreen (GTK_WINDOW (player->priv->window));
 
1907
            player->priv->full_screen = TRUE;
 
1908
        }
 
1909
    }
 
1910
    
 
1911
    if ( player->priv->embedded )
 
1912
    {
 
1913
        gtk_widget_hide (player->priv->menu_bar);
 
1914
        gtk_widget_hide (player->priv->playlist_nt);
 
1915
        gtk_widget_hide (player->priv->go_fs);
 
1916
        gtk_widget_hide (player->priv->show_hide_playlist);
 
1917
        gtk_widget_hide (player->priv->show_hide_playlist_button);
 
1918
    }
 
1919
}
 
1920
 
 
1921
void
 
1922
parole_player_embedded (ParolePlayer *player)
 
1923
{
 
1924
    if ( player->priv->embedded == TRUE )
 
1925
    return;
 
1926
    
 
1927
    player->priv->embedded = TRUE;
 
1928
    
 
1929
    parole_player_reset_controls(player, player->priv->full_screen);
 
1930
}
 
1931
 
 
1932
void
 
1933
parole_player_full_screen (ParolePlayer *player, gboolean fullscreen)
 
1934
{
1518
1935
    if ( player->priv->full_screen == fullscreen )
1519
1936
        return;
1520
1937
    
1521
 
    if ( player->priv->full_screen )
1522
 
    {
1523
 
        npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (player->priv->main_nt));
1524
 
        gtk_widget_reparent (player->priv->play_box, player->priv->control);
1525
 
        gtk_box_set_child_packing( GTK_BOX(player->priv->control), GTK_WIDGET(player->priv->play_box), TRUE, TRUE, 2, GTK_PACK_START );
1526
 
        gtk_widget_hide (player->priv->fs_window);
1527
 
        gtk_widget_show (player->priv->play_box);
1528
 
        gtk_widget_show (player->priv->menu_bar);
1529
 
        show_playlist = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(player->priv->show_hide_playlist) );
1530
 
    gtk_widget_show (player->priv->playlist_nt);
1531
 
        parole_player_set_playlist_visible(player, show_playlist);
1532
 
        gtk_widget_show (player->priv->go_fs);
1533
 
        gtk_widget_hide (player->priv->leave_fs);
1534
 
        gtk_widget_show (player->priv->show_hide_playlist_button);
1535
 
        
1536
 
        gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), npages > 1);
1537
 
        
1538
 
        gtk_window_unfullscreen (GTK_WINDOW (player->priv->window));
1539
 
        gtk_notebook_set_current_page (GTK_NOTEBOOK (player->priv->playlist_nt), current_page);
1540
 
        gdkwindow = gtk_widget_get_window (player->priv->window);
1541
 
        gdk_window_set_cursor (gdkwindow, NULL);
1542
 
        player->priv->full_screen = FALSE;
1543
 
    }
1544
 
    else
1545
 
    {
1546
 
        parole_player_move_fs_window (player);
1547
 
        gtk_widget_reparent (player->priv->play_box, player->priv->fs_window);
1548
 
        
1549
 
        gtk_widget_hide (player->priv->play_box);
1550
 
        gtk_widget_hide (player->priv->menu_bar);
1551
 
        gtk_widget_hide (player->priv->playlist_nt);
1552
 
        parole_player_set_playlist_visible(player, FALSE);
1553
 
        gtk_widget_hide (player->priv->go_fs);
1554
 
        gtk_widget_show (player->priv->leave_fs);
1555
 
        gtk_widget_hide (player->priv->show_hide_playlist_button);
1556
 
        
1557
 
        current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (player->priv->playlist_nt));
1558
 
        gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), FALSE);
1559
 
        
1560
 
        gtk_window_fullscreen (GTK_WINDOW (player->priv->window));
1561
 
        player->priv->full_screen = TRUE;
1562
 
    }
 
1938
    parole_player_reset_controls(player, fullscreen);
1563
1939
}
1564
1940
 
1565
1941
static void
1818
2194
parole_player_volume_value_changed_cb (GtkScaleButton *widget, gdouble value, ParolePlayer *player)
1819
2195
{
1820
2196
    parole_player_change_volume (player, value);
1821
 
    parole_rc_write_entry_int ("volume", PAROLE_RC_GROUP_GENERAL, (gint)(value * 100));
 
2197
    g_object_set (G_OBJECT (player->priv->conf),
 
2198
        "volume", (gint)(value * 100),
 
2199
        NULL);
1822
2200
}
1823
2201
 
1824
2202
void
1878
2256
    g_object_unref (player->priv->sm_client);
1879
2257
 
1880
2258
#ifdef HAVE_XF86_KEYSYM
 
2259
    if (player->priv->button)
1881
2260
    g_object_unref (player->priv->button);
1882
2261
#endif
1883
2262
 
1884
2263
    gtk_widget_destroy (player->priv->fs_window);
 
2264
    
1885
2265
 
1886
2266
    G_OBJECT_CLASS (parole_player_parent_class)->finalize (object);
1887
2267
}
2010
2390
parole_player_handle_key_press (GdkEventKey *ev, ParolePlayer *player)
2011
2391
{
2012
2392
    GtkWidget *focused;
 
2393
    /* Seek duration in seconds */
 
2394
    gdouble seek_short = 10, seek_medium = 60, seek_long = 600;
2013
2395
    
2014
2396
    gboolean ret_val = FALSE;
2015
2397
    
2029
2411
    {
2030
2412
        case GDK_f:
2031
2413
        case GDK_F:
2032
 
            parole_player_full_screen_menu_item_activate (player);
 
2414
            if ( player->priv->embedded != TRUE ) parole_player_full_screen_menu_item_activate (player);
2033
2415
            ret_val = TRUE;
2034
2416
            break;
2035
2417
        case GDK_space:
2041
2423
    case GDK_Right:
2042
2424
            /* Media seekable ?*/
2043
2425
            if ( GTK_WIDGET_SENSITIVE (player->priv->range) )
2044
 
                parole_player_seekf_cb (NULL, player);
 
2426
            {
 
2427
                if (ev->state & GDK_CONTROL_MASK) parole_player_seekf_cb (NULL, player, seek_medium);
 
2428
                else parole_player_seekf_cb (NULL, player, seek_short);
 
2429
            }
2045
2430
            ret_val = TRUE;
2046
2431
            break;
2047
2432
        case GDK_Left:
2048
2433
            if ( GTK_WIDGET_SENSITIVE (player->priv->range) )
2049
 
                parole_player_seekb_cb (NULL, player);
 
2434
            {
 
2435
                if (ev->state & GDK_CONTROL_MASK) parole_player_seekb_cb (NULL, player, seek_medium);
 
2436
                else parole_player_seekb_cb (NULL, player, seek_short);
 
2437
            }
2050
2438
            ret_val = TRUE;
2051
2439
            break;
2052
2440
        case GDK_Page_Down:
2053
2441
            if ( GTK_WIDGET_SENSITIVE (player->priv->range) )
2054
 
                parole_player_seekb_long_cb (NULL, player);
 
2442
                parole_player_seekb_cb (NULL, player, seek_long);
2055
2443
            ret_val = TRUE;
2056
2444
            break;
2057
2445
        case GDK_Page_Up:
2058
2446
            if ( GTK_WIDGET_SENSITIVE (player->priv->range) )
2059
 
                parole_player_seekf_long_cb (NULL, player);
 
2447
                parole_player_seekf_cb (NULL, player, seek_long);
2060
2448
            ret_val = TRUE;
2061
2449
            break;
2062
2450
        case GDK_s:
2080
2468
         */
2081
2469
        case GDK_Up:
2082
2470
        case GDK_Down:
 
2471
            parole_player_media_list_show_playlist_cb (player->priv->list, TRUE, player);
2083
2472
            parole_media_list_grab_focus (player->priv->list);
2084
2473
            break;
2085
2474
        default:
2101
2490
    switch (ev->keyval)
2102
2491
    {
2103
2492
        case GDK_F11:
2104
 
            parole_player_full_screen_menu_item_activate (player);
 
2493
            if ( player->priv->embedded != TRUE ) parole_player_full_screen_menu_item_activate (player);
2105
2494
            return TRUE;
2106
2495
#ifdef HAVE_XF86_KEYSYM
2107
2496
        case XF86XK_AudioPlay:
2198
2587
                                    TRUE);
2199
2588
}
2200
2589
 
 
2590
static gboolean
 
2591
parole_audiobox_expose_event (GtkWidget *w, GdkEventExpose *ev, ParolePlayer *player)
 
2592
{
 
2593
    gboolean homogeneous = w->allocation.width > 536;
 
2594
    
 
2595
    if ( gtk_box_get_homogeneous( GTK_BOX(w) ) == homogeneous )
 
2596
        return FALSE;
 
2597
    
 
2598
    gtk_box_set_homogeneous( GTK_BOX(w), homogeneous );
 
2599
    if (homogeneous)
 
2600
    {
 
2601
        g_object_set( player->priv->audiobox_cover, "xalign", 1.0, NULL);
 
2602
        gtk_box_set_child_packing (GTK_BOX(w),
 
2603
                                   player->priv->audiobox_cover,
 
2604
                                   TRUE,
 
2605
                                   TRUE,
 
2606
                                   0,
 
2607
                                   GTK_PACK_START);
 
2608
    }
 
2609
    else
 
2610
    {
 
2611
        g_object_set( player->priv->audiobox_cover, "xalign", 0.0, NULL);
 
2612
        gtk_box_set_child_packing (GTK_BOX(w),
 
2613
                                   player->priv->audiobox_cover,
 
2614
                                   FALSE,
 
2615
                                   TRUE,
 
2616
                                   0,
 
2617
                                   GTK_PACK_START);
 
2618
    }
 
2619
 
 
2620
    return FALSE;
 
2621
}
 
2622
 
2201
2623
gboolean
2202
2624
parole_player_configure_event_cb (GtkWidget *widget, GdkEventConfigure *ev, ParolePlayer *player)
2203
2625
{
2329
2751
    GdkScreen *screen;
2330
2752
    gint w, h;
2331
2753
    gboolean showhide;
 
2754
    GdkColor background;
 
2755
    
 
2756
    gint volume;
 
2757
    
 
2758
    GtkWidget *hbox_audiobox;
 
2759
    
 
2760
    GtkWidget *recent_menu;
 
2761
    GtkRecentFilter *recent_filter;
 
2762
    GtkWidget *clear_recent;
 
2763
    GtkWidget *recent_separator;
2332
2764
    
2333
2765
    gboolean repeat, shuffle;
2334
2766
    
2361
2793
    player->priv->disc = parole_disc_new ();
2362
2794
    g_signal_connect (player->priv->disc, "disc-selected",
2363
2795
                      G_CALLBACK (parole_player_disc_selected_cb), player);
 
2796
                      
 
2797
    g_signal_connect (player->priv->disc, "label-changed",
 
2798
                      G_CALLBACK (parole_player_disc_label_changed_cb), player);
2364
2799
            
2365
2800
    player->priv->screen_saver = parole_screen_saver_new ();
2366
2801
    player->priv->list = PAROLE_MEDIA_LIST (parole_media_list_get ());
2372
2807
    player->priv->full_screen = FALSE;
2373
2808
    player->priv->buffering = FALSE;
2374
2809
    player->priv->row = NULL;
 
2810
    player->priv->wait_for_gst_disc_info = FALSE;
2375
2811
    
2376
2812
    player->priv->recent = gtk_recent_manager_get_default ();
2377
2813
    
2392
2828
   
2393
2829
    g_signal_connect (G_OBJECT (player->priv->gst), "buffering",
2394
2830
                      G_CALLBACK (parole_player_buffering_cb), player);
 
2831
                      
 
2832
    g_signal_connect (G_OBJECT (player->priv->gst), "dvd-chapter-count-change",
 
2833
              G_CALLBACK (parole_player_dvd_chapter_count_change_cb), player);
 
2834
              
 
2835
    g_signal_connect (G_OBJECT (player->priv->gst), "dvd-chapter-change",
 
2836
              G_CALLBACK (parole_player_dvd_chapter_change_cb), player);
2395
2837
    
2396
2838
    g_signal_connect_after (G_OBJECT (player->priv->gst), "button-release-event",
2397
2839
                            G_CALLBACK (parole_player_gst_widget_button_release), player);
2413
2855
    
2414
2856
    player->priv->window = GTK_WIDGET (gtk_builder_get_object (builder, "main-window"));
2415
2857
    
 
2858
    recent_menu = GTK_WIDGET (gtk_builder_get_object (builder, "recent_menu"));
 
2859
    
 
2860
    player->priv->recent_menu = gtk_recent_chooser_menu_new_for_manager (player->priv->recent);
 
2861
    gtk_recent_chooser_menu_set_show_numbers (GTK_RECENT_CHOOSER_MENU(player->priv->recent_menu), TRUE);
 
2862
    gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER(player->priv->recent_menu), GTK_RECENT_SORT_MRU);
 
2863
    gtk_recent_chooser_set_show_private (GTK_RECENT_CHOOSER(player->priv->recent_menu), FALSE);
 
2864
    gtk_recent_chooser_set_show_not_found (GTK_RECENT_CHOOSER(player->priv->recent_menu), FALSE);
 
2865
    gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER(player->priv->recent_menu), TRUE);
 
2866
    recent_filter = parole_get_supported_recent_media_filter ();
 
2867
    gtk_recent_filter_add_application( recent_filter, "parole" );
 
2868
    gtk_recent_chooser_set_filter( GTK_RECENT_CHOOSER(player->priv->recent_menu), recent_filter);
 
2869
    
 
2870
    recent_separator = gtk_separator_menu_item_new();
 
2871
    clear_recent = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, NULL);
 
2872
    gtk_menu_item_set_label (GTK_MENU_ITEM(clear_recent), _("Clear recent items..."));
 
2873
    
 
2874
    gtk_menu_shell_append(GTK_MENU_SHELL(player->priv->recent_menu), recent_separator);
 
2875
    gtk_menu_shell_append(GTK_MENU_SHELL(player->priv->recent_menu), clear_recent);
 
2876
    
 
2877
    g_signal_connect (clear_recent, "activate",
 
2878
                      G_CALLBACK (parole_player_recent_menu_clear_activated_cb), player);
 
2879
    
 
2880
    gtk_menu_item_set_submenu( GTK_MENU_ITEM(recent_menu), player->priv->recent_menu );
 
2881
    
 
2882
    g_signal_connect (player->priv->recent_menu, "item-activated",
 
2883
                      G_CALLBACK (parole_player_recent_menu_item_activated_cb), player);
 
2884
    
2416
2885
    player->priv->subtitles_menu = GTK_WIDGET (gtk_builder_get_object (builder, "subtitles-menu"));
2417
2886
    player->priv->languages_menu = GTK_WIDGET (gtk_builder_get_object (builder, "languages-menu"));
2418
2887
    
2419
2888
    player->priv->subtitles_group = GTK_WIDGET (gtk_builder_get_object (builder, "subtitles-menu-none"));
 
2889
    player->priv->subtitles_menu_custom = GTK_WIDGET (gtk_builder_get_object (builder, "subtitles-menu-custom"));
 
2890
    
 
2891
    g_signal_connect (player->priv->subtitles_menu_custom, "activate",
 
2892
                      G_CALLBACK (parole_player_select_custom_subtitle), player);
 
2893
    
2420
2894
    player->priv->audio_group = NULL;
2421
2895
   
2422
2896
    player->priv->main_nt = GTK_WIDGET (gtk_builder_get_object (builder, "main-notebook"));
2448
2922
    player->priv->go_fs = GTK_WIDGET (gtk_builder_get_object (builder, "go_fs"));
2449
2923
    player->priv->leave_fs = GTK_WIDGET (gtk_builder_get_object (builder, "leave_fs"));
2450
2924
    player->priv->main_box = GTK_WIDGET (gtk_builder_get_object (builder, "main-box"));
 
2925
    player->priv->eventbox_output = GTK_WIDGET (gtk_builder_get_object (builder, "eventbox_output"));
 
2926
    
 
2927
    /* Audio box */
 
2928
    hbox_audiobox = GTK_WIDGET (gtk_builder_get_object (builder, "hbox_audiobox"));
 
2929
    g_signal_connect(hbox_audiobox, "expose-event",
 
2930
        G_CALLBACK(parole_audiobox_expose_event), player);
 
2931
    
 
2932
    gdk_color_parse("black", &background);
 
2933
    player->priv->audiobox = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox"));
 
2934
    gtk_widget_modify_bg(GTK_WIDGET(player->priv->audiobox), GTK_STATE_NORMAL, &background);
 
2935
    
 
2936
    player->priv->audiobox_cover = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_cover"));
 
2937
    player->priv->audiobox_title = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_title"));
 
2938
    player->priv->audiobox_album = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_album"));
 
2939
    player->priv->audiobox_artist = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_artist"));
 
2940
    
 
2941
    gtk_widget_add_events (GTK_WIDGET (player->priv->audiobox), GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);
 
2942
    g_signal_connect (G_OBJECT (player->priv->audiobox), "motion-notify-event",
 
2943
                      G_CALLBACK (parole_player_gst_widget_motion_notify_event), player);
2451
2944
    
2452
2945
    gtk_box_set_child_packing( GTK_BOX(player->priv->control), GTK_WIDGET(player->priv->play_box), TRUE, TRUE, 2, GTK_PACK_START );
2453
2946
    
2484
2977
                               
2485
2978
        gtk_box_pack_start( GTK_BOX( player->priv->hbox_infobar ), player->priv->infobar, TRUE, TRUE, 0);
2486
2979
        player->priv->update_languages = FALSE;
 
2980
        player->priv->updated_subs = FALSE;
2487
2981
        
 
2982
        g_object_get (G_OBJECT (player->priv->conf),
 
2983
        "volume", &volume,
 
2984
        NULL);
2488
2985
    gtk_scale_button_set_value (GTK_SCALE_BUTTON (player->priv->volume), 
2489
 
                         (gdouble) (parole_rc_read_entry_int ("volume", PAROLE_RC_GROUP_GENERAL, 100)/100.));
 
2986
                         (gdouble) (volume/100.));
2490
2987
    /*
2491
2988
     * Pack the playlist.
2492
2989
     */
2521
3018
                      G_CALLBACK (parole_player_seekable_notify), player);
2522
3019
 
2523
3020
    parole_player_change_volume (player, 
2524
 
                                 (gdouble) (parole_rc_read_entry_int ("volume", PAROLE_RC_GROUP_GENERAL, 100)/100.));
 
3021
                                 (gdouble) (volume/100.));
2525
3022
 
2526
3023
    g_signal_connect (player->priv->list, "media_activated",
2527
3024
                      G_CALLBACK (parole_player_media_activated_cb), player);
2537
3034
                      
2538
3035
        g_signal_connect (player->priv->list, "shuffle-toggled",
2539
3036
                      G_CALLBACK (parole_player_media_list_shuffle_toggled_cb), player);
 
3037
                      
 
3038
    g_signal_connect (player->priv->list, "show-playlist",
 
3039
                      G_CALLBACK (parole_player_media_list_show_playlist_cb), player);
 
3040
                      
 
3041
    g_signal_connect (player->priv->list, "gst-dvd-nav-message",
 
3042
                      G_CALLBACK (parole_player_media_list_gst_nav_message_cb), player);
2540
3043
    
2541
3044
    /*
2542
3045
     * Load auto saved media list.
2714
3217
void parole_player_combo_box_audiotrack_changed_cb(GtkWidget *widget, ParolePlayer *player)
2715
3218
{
2716
3219
        gint audio_index = gtk_combo_box_get_active(GTK_COMBO_BOX(player->priv->combobox_audiotrack));
 
3220
        if (player->priv->update_languages == FALSE)
2717
3221
        gst_set_current_audio_track(PAROLE_GST(player->priv->gst), audio_index);
2718
3222
        parole_player_set_audiotrack_radio_menu_item_selected(player, audio_index);
2719
3223
}
2721
3225
void parole_player_combo_box_subtitles_changed_cb(GtkWidget *widget, ParolePlayer *player)
2722
3226
{
2723
3227
        gint sub_index = gtk_combo_box_get_active(GTK_COMBO_BOX(player->priv->combobox_subtitles));
 
3228
        if (player->priv->update_languages == FALSE)
2724
3229
        gst_set_current_subtitle_track(PAROLE_GST(player->priv->gst), sub_index);
2725
3230
        parole_player_set_subtitle_radio_menu_item_selected(player, sub_index);
2726
3231
}