72
73
G_MODULE_EXPORT void plugins_action_callback (GtkAction *action, Totem *totem);
73
74
G_MODULE_EXPORT void repeat_mode_action_callback (GtkToggleAction *action, Totem *totem);
74
75
G_MODULE_EXPORT void shuffle_mode_action_callback (GtkToggleAction *action, Totem *totem);
75
G_MODULE_EXPORT void deinterlace_action_callback (GtkToggleAction *action, Totem *totem);
76
76
G_MODULE_EXPORT void show_controls_action_callback (GtkToggleAction *action, Totem *totem);
77
77
G_MODULE_EXPORT void show_sidebar_action_callback (GtkToggleAction *action, Totem *totem);
78
78
G_MODULE_EXPORT void aspect_ratio_changed_callback (GtkRadioAction *action, GtkRadioAction *current, Totem *totem);
97
static GHashTable *lang_table;
100
totem_lang_table_free (void)
102
g_hash_table_destroy (lang_table);
107
totem_lang_table_parse_start_tag (GMarkupParseContext *ctx,
108
const gchar *element_name,
109
const gchar **attr_names,
110
const gchar **attr_values,
114
const char *ccode_longB, *ccode_longT, *ccode, *lang_name;
116
if (!g_str_equal (element_name, "iso_639_entry")
117
|| attr_names == NULL
118
|| attr_values == NULL)
126
while (*attr_names && *attr_values)
128
if (g_str_equal (*attr_names, "iso_639_1_code"))
133
g_return_if_fail (strlen (*attr_values) == 2);
134
ccode = *attr_values;
136
} else if (g_str_equal (*attr_names, "iso_639_2B_code")) {
140
g_return_if_fail (strlen (*attr_values) == 3 || strcmp (*attr_values, "qaa-qtz") == 0);
141
ccode_longB = *attr_values;
143
} else if (g_str_equal (*attr_names, "iso_639_2T_code")) {
147
g_return_if_fail (strlen (*attr_values) == 3 || strcmp (*attr_values, "qaa-qtz") == 0);
148
ccode_longT = *attr_values;
150
} else if (g_str_equal (*attr_names, "name")) {
151
lang_name = *attr_values;
158
if (lang_name == NULL)
163
g_hash_table_insert (lang_table,
165
g_strdup (lang_name));
167
if (ccode_longB != NULL)
169
g_hash_table_insert (lang_table,
170
g_strdup (ccode_longB),
171
g_strdup (lang_name));
173
if (ccode_longT != NULL)
175
g_hash_table_insert (lang_table,
176
g_strdup (ccode_longT),
177
g_strdup (lang_name));
181
#define ISO_CODES_DATADIR ISO_CODES_PREFIX"/share/xml/iso-codes"
182
#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX"/share/locale"
185
totem_lang_table_init (void)
191
lang_table = g_hash_table_new_full
192
(g_str_hash, g_str_equal, g_free, g_free);
194
g_atexit (totem_lang_table_free);
196
bindtextdomain ("iso_639", ISO_CODES_LOCALESDIR);
197
bind_textdomain_codeset ("iso_639", "UTF-8");
199
if (g_file_get_contents (ISO_CODES_DATADIR "/iso_639.xml",
200
&buf, &buf_len, &err))
202
GMarkupParseContext *ctx;
203
GMarkupParser parser =
204
{ totem_lang_table_parse_start_tag, NULL, NULL, NULL, NULL };
206
ctx = g_markup_parse_context_new (&parser, 0, NULL, NULL);
208
if (!g_markup_parse_context_parse (ctx, buf, buf_len, &err))
210
g_warning ("Failed to parse '%s': %s\n",
211
ISO_CODES_DATADIR"/iso_639.xml",
216
g_markup_parse_context_free (ctx);
219
g_warning ("Failed to load '%s': %s\n",
220
ISO_CODES_DATADIR"/iso_639.xml", err->message);
226
totem_lang_get_full (const char *lang)
228
const char *lang_name;
231
g_return_val_if_fail (lang != NULL, NULL);
234
if (len != 2 && len != 3)
236
if (lang_table == NULL)
237
totem_lang_table_init ();
239
lang_name = (const gchar*) g_hash_table_lookup (lang_table, lang);
242
return dgettext ("iso_639", lang_name);
247
96
/* Subtitle and language menus */
249
98
totem_g_list_deep_free (GList *list)
340
189
if (is_lang == FALSE) {
341
190
add_lang_action (totem, action_group, ui_id, paths, prefix,
191
/* Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD */
342
192
_("None"), -2, 0, &group);
345
195
action = add_lang_action (totem, action_group, ui_id, paths, prefix,
346
_("Auto"), -1, 0, &group);
196
/* Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD */
197
C_("Language", "Auto"), -1, 0, &group);
349
200
lookup = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
529
376
gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_MIDDLE);
530
377
gtk_label_set_max_width_chars (label,TOTEM_MAX_RECENT_ITEM_LEN);
532
if (!GTK_IS_IMAGE_MENU_ITEM (proxy))
535
recent_info = g_object_get_data (G_OBJECT (action), "recent-info");
536
g_assert (recent_info != NULL);
538
gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
540
icon = gtk_recent_info_get_icon (recent_info, w);
542
image = gtk_image_new_from_pixbuf (icon);
543
g_object_unref (icon);
546
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy), image);
547
gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (proxy), TRUE);
554
384
GtkRecentInfo *recent_info;
385
const gchar *uri, *display_name;
557
387
recent_info = g_object_get_data (G_OBJECT (action), "recent-info");
558
388
uri = gtk_recent_info_get_uri (recent_info);
389
display_name = gtk_recent_info_get_display_name (recent_info);
560
totem_add_to_playlist_and_play (totem, uri, NULL, FALSE);
391
totem_add_to_playlist_and_play (totem, uri, display_name, FALSE);
737
totem_action_add_recent (Totem *totem, const char *uri, const char *display_name)
583
totem_action_add_recent (Totem *totem,
585
const char *display_name,
586
const char *content_type)
741
590
if (totem_is_special_mrl (uri) != FALSE)
593
/* If we already have a content-type, the display_name is
594
* probably decent as well */
595
if (content_type != NULL) {
597
char *groups[] = { NULL, NULL };
599
memset (&data, 0, sizeof (data));
601
data.mime_type = (char *) content_type;
602
data.display_name = (char *) display_name;
603
groups[0] = (char*) "Totem";
604
data.app_name = (char *) g_get_application_name ();
605
data.app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL);
606
data.groups = groups;
608
if (gtk_recent_manager_add_full (totem->recent_manager,
609
uri, &data) == FALSE) {
610
g_warning ("Couldn't add recent file for '%s'", uri);
612
g_free (data.app_exec);
744
617
file = g_file_new_for_uri (uri);
745
618
g_object_set_data_full (G_OBJECT (file), "uri", g_strdup (uri), g_free);
746
619
g_object_set_data_full (G_OBJECT (file), "display_name", g_strdup (display_name), g_free);
1277
1151
skip_forward_action_callback (GtkAction *action, Totem *totem)
1279
totem_action_seek_relative (totem, SEEK_FORWARD_OFFSET * 1000);
1153
totem_action_seek_relative (totem, SEEK_FORWARD_OFFSET * 1000, FALSE);
1283
1157
skip_backwards_action_callback (GtkAction *action, Totem *totem)
1285
totem_action_seek_relative (totem, SEEK_BACKWARD_OFFSET * 1000);
1159
totem_action_seek_relative (totem, SEEK_BACKWARD_OFFSET * 1000, FALSE);
1391
1263
G_CALLBACK (totem_plugins_response_cb),
1394
manager = totem_plugin_manager_new ();
1266
manager = peas_gtk_plugin_manager_new (NULL);
1395
1267
gtk_widget_show_all (GTK_WIDGET (manager));
1396
gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (totem->plugins))),
1268
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (totem->plugins))),
1269
manager, TRUE, TRUE, 0);
1270
gtk_window_set_default_size (GTK_WINDOW (totem->plugins), 600, 400);
1400
1273
gtk_window_present (GTK_WINDOW (totem->plugins));