diff options
Diffstat (limited to 'src/totem-menu.c')
-rw-r--r-- | src/totem-menu.c | 235 |
1 files changed, 98 insertions, 137 deletions
diff --git a/src/totem-menu.c b/src/totem-menu.c index 045e857f8..6d40541c9 100644 --- a/src/totem-menu.c +++ b/src/totem-menu.c @@ -83,6 +83,34 @@ fullscreen_change_state (GSimpleAction *action, } static void +set_subtitle_action_change_state (GSimpleAction *action, + GVariant *value, + gpointer user_data) +{ + int rank; + + rank = g_variant_get_int32 (value); + if (!TOTEM_OBJECT (user_data)->updating_menu) + bacon_video_widget_set_subtitle (TOTEM_OBJECT (user_data)->bvw, rank); + + g_simple_action_set_state (action, value); +} + +static void +set_language_action_change_state (GSimpleAction *action, + GVariant *value, + gpointer user_data) +{ + int rank; + + rank = g_variant_get_int32 (value); + if (!TOTEM_OBJECT (user_data)->updating_menu) + bacon_video_widget_set_language (TOTEM_OBJECT (user_data)->bvw, rank); + + g_simple_action_set_state (action, value); +} + +static void aspect_ratio_change_state (GSimpleAction *action, GVariant *value, gpointer user_data) @@ -96,14 +124,6 @@ aspect_ratio_change_state (GSimpleAction *action, } static void -aspect_ratio_action_cb (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) -{ - g_action_change_state (G_ACTION (action), parameter); -} - -static void zoom_action_change_state (GSimpleAction *action, GVariant *value, gpointer user_data) @@ -156,6 +176,14 @@ toggle_action_cb (GSimpleAction *action, } static void +list_action_cb (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_action_change_state (G_ACTION (action), parameter); +} + +static void help_action_cb (GSimpleAction *action, GVariant *parameter, gpointer user_data) @@ -264,7 +292,9 @@ static GActionEntry app_entries[] = { /* Cogwheel menu */ { "select-subtitle", select_subtitle_action_cb, NULL, NULL, NULL }, - { "aspect-ratio", aspect_ratio_action_cb, "i", "0", aspect_ratio_change_state }, + { "set-subtitle", list_action_cb, "i", "-1", set_subtitle_action_change_state }, + { "set-language", list_action_cb, "i", "-1", set_language_action_change_state }, + { "aspect-ratio", list_action_cb, "i", "0", aspect_ratio_change_state }, { "zoom", toggle_action_cb, NULL, "false", zoom_action_change_state }, { "next-angle", next_angle_action_cb, NULL, NULL, NULL }, { "properties", properties_action_cb, NULL, NULL, NULL }, @@ -306,37 +336,27 @@ escape_label_for_menu (const char *name) /* Subtitle and language menus */ static void -subtitles_changed_callback (GtkRadioAction *action, GtkRadioAction *current, - Totem *totem) +add_lang_item (GMenu *menu, + const char *label, + const char *action, + int target) { - int rank; - - rank = gtk_radio_action_get_current_value (current); + GMenuItem *item; - bacon_video_widget_set_subtitle (totem->bvw, rank); + item = g_menu_item_new (label, NULL); + g_menu_item_set_action_and_target_value (item, action, g_variant_new_int32 (target)); + g_menu_append_item (G_MENU (menu), item); } - static void -languages_changed_callback (GtkRadioAction *action, GtkRadioAction *current, - Totem *totem) -{ - int rank; - - rank = gtk_radio_action_get_current_value (current); - - bacon_video_widget_set_language (totem->bvw, rank); -} - -static GtkAction * -add_lang_action (Totem *totem, GtkActionGroup *action_group, guint ui_id, - const char *path, const char *prefix, const char *lang, - int lang_id, int lang_index, GSList **group) +add_lang_action (GMenu *menu, + const char *action, + const char *lang, + int lang_id, + int lang_index) { const char *full_lang; char *label; - char *name; - GtkAction *action; full_lang = gst_tag_get_language_name (lang); @@ -352,75 +372,50 @@ add_lang_action (Totem *totem, GtkActionGroup *action_group, guint ui_id, label = escape_label_for_menu (full_lang ? full_lang : lang); } - name = g_strdup_printf ("%s-%d", prefix, lang_id); - - action = g_object_new (GTK_TYPE_RADIO_ACTION, - "name", name, - "label", label, - "value", lang_id, - NULL); + add_lang_item (menu, label, action, lang_id); g_free (label); - - gtk_radio_action_set_group (GTK_RADIO_ACTION (action), *group); - *group = gtk_radio_action_get_group (GTK_RADIO_ACTION (action)); - gtk_action_group_add_action (action_group, action); - g_object_unref (action); - gtk_ui_manager_add_ui (totem->ui_manager, ui_id, - path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); - g_free (name); - - return action; } -static GtkAction * -create_lang_actions (Totem *totem, GtkActionGroup *action_group, guint ui_id, - const char *path, const char *prefix, GList *list, - gboolean is_lang) +static void +create_lang_actions (GMenu *menu, + const char *action, + GList *list, + gboolean is_lang) { - GtkAction *action = NULL; - unsigned int i, *hash_value; + unsigned int i; GList *l; - GSList *group = NULL; GHashTable *lookup; - char *action_data; if (is_lang == FALSE) { - add_lang_action (totem, action_group, ui_id, path, prefix, - /* Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD */ - _("None"), -2, 0, &group); + /* Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD */ + add_lang_action (menu, action, _("None"), -2, 0); } - action = add_lang_action (totem, action_group, ui_id, path, prefix, - /* Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD */ - C_("Language", "Auto"), -1, 0, &group); + /* Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD */ + add_lang_action (menu, action, C_("Language", "Auto"), -1, 0); i = 0; lookup = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); - for (l = list; l != NULL; l = l->next) - { + for (l = list; l != NULL; l = l->next) { guint num; + unsigned int *hash_value; hash_value = g_hash_table_lookup (lookup, l->data); - if (hash_value == NULL) { + if (hash_value == NULL) num = 0; - action_data = g_strdup (l->data); - g_hash_table_insert (lookup, l->data, GINT_TO_POINTER (1)); - } else { + else num = GPOINTER_TO_INT (hash_value); - action_data = g_strdup (l->data); - g_hash_table_replace (lookup, l->data, GINT_TO_POINTER (num + 1)); - } + num++; + + g_hash_table_insert (lookup, l->data, GINT_TO_POINTER (num)); + + add_lang_action (menu, action, l->data, i, num); - add_lang_action (totem, action_group, ui_id, path, prefix, - action_data, i, num + 1, &group); - g_free (action_data); i++; } g_hash_table_destroy (lookup); - - return action; } static gboolean @@ -454,78 +449,49 @@ totem_sublang_equal_lists (GList *orig, GList *new) static void totem_languages_update (Totem *totem, GList *list) { - GtkAction *action; - const char *path = "/tmw-menubar/sound/languages/placeholder"; + GAction *action; int current; /* Remove old UI */ - gtk_ui_manager_remove_ui (totem->ui_manager, totem->languages_ui_id); - gtk_ui_manager_ensure_update (totem->ui_manager); - - /* Create new ActionGroup */ - if (totem->languages_action_group) { - gtk_ui_manager_remove_action_group (totem->ui_manager, - totem->languages_action_group); - g_object_unref (totem->languages_action_group); - } - totem->languages_action_group = gtk_action_group_new ("languages-action-group"); - gtk_ui_manager_insert_action_group (totem->ui_manager, - totem->languages_action_group, -1); + totem_object_empty_menu_section (totem, "languages-placeholder"); if (list != NULL) { - action = create_lang_actions (totem, totem->languages_action_group, - totem->languages_ui_id, - path, - "languages", list, TRUE); - gtk_ui_manager_ensure_update (totem->ui_manager); - - current = bacon_video_widget_get_language (totem->bvw); - gtk_radio_action_set_current_value (GTK_RADIO_ACTION (action), - current); - g_signal_connect (G_OBJECT (action), "changed", - G_CALLBACK (languages_changed_callback), totem); + GMenu *menu; + menu = totem_object_get_menu_section (totem, "languages-placeholder"); + create_lang_actions (menu, "app.set-language", list, TRUE); } - g_list_free_full (totem->language_list, g_free); - totem->language_list = list; + action = g_action_map_lookup_action (G_ACTION_MAP (totem), "set-language"); + totem->updating_menu = TRUE; + current = bacon_video_widget_get_language (totem->bvw); + g_action_change_state (action, g_variant_new_int32 (current)); + totem->updating_menu = FALSE; + + g_list_free_full (totem->languages_list, g_free); + totem->languages_list = list; } static void totem_subtitles_update (Totem *totem, GList *list) { - GtkAction *action; + GAction *action; int current; - const char *path = "/tmw-menubar/view/subtitles/placeholder"; /* Remove old UI */ - gtk_ui_manager_remove_ui (totem->ui_manager, totem->subtitles_ui_id); - gtk_ui_manager_ensure_update (totem->ui_manager); - - /* Create new ActionGroup */ - if (totem->subtitles_action_group) { - gtk_ui_manager_remove_action_group (totem->ui_manager, - totem->subtitles_action_group); - g_object_unref (totem->subtitles_action_group); - } - totem->subtitles_action_group = gtk_action_group_new ("subtitles-action-group"); - gtk_ui_manager_insert_action_group (totem->ui_manager, - totem->subtitles_action_group, -1); - + totem_object_empty_menu_section (totem, "subtitles-placeholder"); if (list != NULL) { - action = create_lang_actions (totem, totem->subtitles_action_group, - totem->subtitles_ui_id, - path, - "subtitles", list, FALSE); - gtk_ui_manager_ensure_update (totem->ui_manager); - - current = bacon_video_widget_get_subtitle (totem->bvw); - gtk_radio_action_set_current_value (GTK_RADIO_ACTION (action), - current); - g_signal_connect (G_OBJECT (action), "changed", - G_CALLBACK (subtitles_changed_callback), totem); + GMenu *menu; + menu = totem_object_get_menu_section (totem, "subtitles-placeholder"); + create_lang_actions (menu, "app.set-subtitle", list, FALSE); } + action = g_action_map_lookup_action (G_ACTION_MAP (totem), "set-subtitle"); + totem->updating_menu = TRUE; + current = bacon_video_widget_get_subtitle (totem->bvw); + g_action_change_state (action, g_variant_new_int32 (current)); + totem->updating_menu = FALSE; + g_list_free_full (totem->subtitles_list, g_free); totem->subtitles_list = list; } @@ -536,7 +502,7 @@ totem_sublang_update (Totem *totem) GList *list; list = bacon_video_widget_get_languages (totem->bvw); - if (totem_sublang_equal_lists (totem->language_list, list) == TRUE) { + if (totem_sublang_equal_lists (totem->languages_list, list) == TRUE) { g_list_free_full (list, g_free); } else { totem_languages_update (totem, list); @@ -554,7 +520,7 @@ void totem_sublang_exit (Totem *totem) { g_list_free_full (totem->subtitles_list, g_free); - g_list_free_full (totem->language_list, g_free); + g_list_free_full (totem->languages_list, g_free); } void @@ -597,10 +563,5 @@ totem_ui_manager_setup (Totem *totem) totem->main_action_group = GTK_ACTION_GROUP (gtk_builder_get_object (totem->xml, "main-action-group")); totem->ui_manager = GTK_UI_MANAGER (gtk_builder_get_object (totem->xml, "totem-ui-manager")); - - totem->languages_action_group = NULL; - totem->languages_ui_id = gtk_ui_manager_new_merge_id (totem->ui_manager); - totem->subtitles_action_group = NULL; - totem->subtitles_ui_id = gtk_ui_manager_new_merge_id (totem->ui_manager); } |