Sort alphabetically list of encodings
[mafwsubrenderer] / applet / cpmpsubtitles.c
1 /*
2  *  Subtitles control panel applet.
3  *  Copyright (C) 2010 Roman Moravcik
4  *
5  *  encodings structure imported from totem-subtitle-encoding.c
6  *  Copyright (C) 2001-2006 Bastien Nocera <hadess@hadess.net>
7  *
8  *  font family detection imported from hildon-font-selection-dialog.c
9  *  Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30 #include <stdlib.h>
31
32 #include <glib.h>
33 #include <glib/gi18n-lib.h>
34
35 #include <gtk/gtk.h>
36 #include <hildon/hildon.h>
37 #include <hildon-cp-plugin/hildon-cp-plugin-interface.h>
38
39 #include <gconf/gconf-client.h>
40
41 #define GCONF_MAFW_GST_SUBTITLE_RENDERER "/system/mafw/mafw-gst-subtitles-renderer"
42 #define _HL(str) dgettext("hildon-libs",str)
43
44 typedef enum
45 {
46         FONT_STYLE_REGULAR,
47         FONT_STYLE_ITALIC,
48         FONT_STYLE_BOLD,
49         FONT_STYLE_ITALIC_BOLD,
50         FONT_STYLE_LAST,
51 } FontStyleIndex;
52
53 typedef struct {
54         int index;
55         const char *name;
56 } FontStyle;
57
58 static FontStyle font_styles[] = {
59         {FONT_STYLE_REGULAR,            N_("Regular")},
60         {FONT_STYLE_ITALIC,             N_("Italic")},
61         {FONT_STYLE_BOLD,               N_("Bold")},
62         {FONT_STYLE_ITALIC_BOLD,        N_("Italic Bold")}
63 };
64
65 static const gint font_sizes[] =
66 {
67   10, 12, 14, 16, 18, 20, 22, 24, 26, 28, -1
68 };
69
70 typedef enum
71 {
72         SUBTITLE_ENCODING_ISO_8859_6,
73         SUBTITLE_ENCODING_IBM_864,
74         SUBTITLE_ENCODING_MAC_ARABIC,
75         SUBTITLE_ENCODING_WINDOWS_1256,
76
77         SUBTITLE_ENCODING_ARMSCII_8,
78
79         SUBTITLE_ENCODING_ISO_8859_4,
80         SUBTITLE_ENCODING_ISO_8859_13,
81         SUBTITLE_ENCODING_WINDOWS_1257,
82
83         SUBTITLE_ENCODING_ISO_8859_14,
84
85         SUBTITLE_ENCODING_ISO_8859_2,
86         SUBTITLE_ENCODING_IBM_852,
87         SUBTITLE_ENCODING_MAC_CE,
88         SUBTITLE_ENCODING_WINDOWS_1250,
89
90         SUBTITLE_ENCODING_GB18030,
91         SUBTITLE_ENCODING_GB2312,
92         SUBTITLE_ENCODING_GBK,
93         SUBTITLE_ENCODING_HZ,
94
95         SUBTITLE_ENCODING_BIG5,
96         SUBTITLE_ENCODING_BIG5_HKSCS,
97         SUBTITLE_ENCODING_EUC_TW,
98
99         SUBTITLE_ENCODING_MAC_CROATIAN,
100
101         SUBTITLE_ENCODING_ISO_8859_5,
102         SUBTITLE_ENCODING_IBM_855,
103         SUBTITLE_ENCODING_ISO_IR_111,
104         SUBTITLE_ENCODING_KOI8_R,
105         SUBTITLE_ENCODING_MAC_CYRILLIC,
106         SUBTITLE_ENCODING_WINDOWS_1251,
107
108         SUBTITLE_ENCODING_CP_866,
109
110         SUBTITLE_ENCODING_MAC_UKRAINIAN,
111         SUBTITLE_ENCODING_KOI8_U,
112
113         SUBTITLE_ENCODING_GEOSTD8,
114
115         SUBTITLE_ENCODING_ISO_8859_7,
116         SUBTITLE_ENCODING_MAC_GREEK,
117         SUBTITLE_ENCODING_WINDOWS_1253,
118
119         SUBTITLE_ENCODING_MAC_GUJARATI,
120
121         SUBTITLE_ENCODING_MAC_GURMUKHI,
122
123         SUBTITLE_ENCODING_ISO_8859_8_I,
124         SUBTITLE_ENCODING_IBM_862,
125         SUBTITLE_ENCODING_MAC_HEBREW,
126         SUBTITLE_ENCODING_WINDOWS_1255,
127
128         SUBTITLE_ENCODING_ISO_8859_8,
129
130         SUBTITLE_ENCODING_MAC_DEVANAGARI,
131
132         SUBTITLE_ENCODING_MAC_ICELANDIC,
133
134         SUBTITLE_ENCODING_EUC_JP,
135         SUBTITLE_ENCODING_ISO_2022_JP,
136         SUBTITLE_ENCODING_SHIFT_JIS,
137
138         SUBTITLE_ENCODING_EUC_KR,
139         SUBTITLE_ENCODING_ISO_2022_KR,
140         SUBTITLE_ENCODING_JOHAB,
141         SUBTITLE_ENCODING_UHC,
142
143         SUBTITLE_ENCODING_ISO_8859_10,
144
145         SUBTITLE_ENCODING_MAC_FARSI,
146
147         SUBTITLE_ENCODING_ISO_8859_16,
148         SUBTITLE_ENCODING_MAC_ROMANIAN,
149
150         SUBTITLE_ENCODING_ISO_8859_3,
151
152         SUBTITLE_ENCODING_TIS_620,
153
154         SUBTITLE_ENCODING_ISO_8859_9,
155         SUBTITLE_ENCODING_IBM_857,
156         SUBTITLE_ENCODING_MAC_TURKISH,
157         SUBTITLE_ENCODING_WINDOWS_1254,
158
159         SUBTITLE_ENCODING_UTF_7,
160         SUBTITLE_ENCODING_UTF_8,
161         SUBTITLE_ENCODING_UTF_16,
162         SUBTITLE_ENCODING_UCS_2,
163         SUBTITLE_ENCODING_UCS_4,
164
165         SUBTITLE_ENCODING_ISO_8859_1,
166         SUBTITLE_ENCODING_ISO_8859_15,
167         SUBTITLE_ENCODING_IBM_850,
168         SUBTITLE_ENCODING_MAC_ROMAN,
169         SUBTITLE_ENCODING_WINDOWS_1252,
170
171         SUBTITLE_ENCODING_TCVN,
172         SUBTITLE_ENCODING_VISCII,
173         SUBTITLE_ENCODING_WINDOWS_1258,
174
175         SUBTITLE_ENCODING_CURRENT_LOCALE,
176
177         SUBTITLE_ENCODING_LAST
178 } SubtitleEncodingIndex;
179
180 typedef struct {
181         int index;
182         const char *charset;
183         const char *name;
184 } SubtitleEncoding;
185
186 static SubtitleEncoding encodings[] = {
187         {SUBTITLE_ENCODING_ISO_8859_6,          "ISO-8859-6",           N_("Arabic")},
188         {SUBTITLE_ENCODING_IBM_864,             "IBM864",               N_("Arabic")},
189         {SUBTITLE_ENCODING_MAC_ARABIC,          "MAC_ARABIC",           N_("Arabic")},
190         {SUBTITLE_ENCODING_WINDOWS_1256,        "WINDOWS-1256",         N_("Arabic")},
191
192         {SUBTITLE_ENCODING_ARMSCII_8,           "ARMSCII-8",            N_("Armenian")},
193
194         {SUBTITLE_ENCODING_ISO_8859_4,          "ISO-8859-4",           N_("Baltic")},
195         {SUBTITLE_ENCODING_ISO_8859_13,         "ISO-8859-13",          N_("Baltic")},
196         {SUBTITLE_ENCODING_WINDOWS_1257,        "WINDOWS-1257",         N_("Baltic")},
197
198         {SUBTITLE_ENCODING_ISO_8859_14,         "ISO-8859-14",          N_("Celtic")},
199
200         {SUBTITLE_ENCODING_ISO_8859_2,          "ISO-8859-2",           N_("Central European")},
201         {SUBTITLE_ENCODING_IBM_852,             "IBM852",               N_("Central European")},
202         {SUBTITLE_ENCODING_MAC_CE,              "MAC_CE",               N_("Central European")},
203         {SUBTITLE_ENCODING_WINDOWS_1250,        "WINDOWS-1250",         N_("Central European")},
204
205         {SUBTITLE_ENCODING_GB18030,             "GB18030",              N_("Chinese Simplified")},
206         {SUBTITLE_ENCODING_GB2312,              "GB2312",               N_("Chinese Simplified")},
207         {SUBTITLE_ENCODING_GBK,                 "GBK",                  N_("Chinese Simplified")},
208         {SUBTITLE_ENCODING_HZ,                  "HZ",                   N_("Chinese Simplified")},
209
210         {SUBTITLE_ENCODING_BIG5,                "BIG5",                 N_("Chinese Traditional")},
211         {SUBTITLE_ENCODING_BIG5_HKSCS,          "BIG5-HKSCS",           N_("Chinese Traditional")},
212         {SUBTITLE_ENCODING_EUC_TW,              "EUC-TW",               N_("Chinese Traditional")},
213
214         {SUBTITLE_ENCODING_MAC_CROATIAN,        "MAC_CROATIAN",         N_("Croatian")},
215
216         {SUBTITLE_ENCODING_ISO_8859_5,          "ISO-8859-5",           N_("Cyrillic")},
217         {SUBTITLE_ENCODING_IBM_855,             "IBM855",               N_("Cyrillic")},
218         {SUBTITLE_ENCODING_ISO_IR_111,          "ISO-IR-111",           N_("Cyrillic")},
219         {SUBTITLE_ENCODING_KOI8_R,              "KOI8-R",               N_("Cyrillic")},
220         {SUBTITLE_ENCODING_MAC_CYRILLIC,        "MAC-CYRILLIC",         N_("Cyrillic")},
221         {SUBTITLE_ENCODING_WINDOWS_1251,        "WINDOWS-1251",         N_("Cyrillic")},
222
223         {SUBTITLE_ENCODING_CP_866,              "CP866",                N_("Cyrillic/Russian")},
224
225         {SUBTITLE_ENCODING_MAC_UKRAINIAN,       "MAC_UKRAINIAN",        N_("Cyrillic/Ukrainian")},
226         {SUBTITLE_ENCODING_KOI8_U,              "KOI8-U",               N_("Cyrillic/Ukrainian")},
227
228         {SUBTITLE_ENCODING_GEOSTD8,             "GEORGIAN-PS",          N_("Georgian")},
229
230         {SUBTITLE_ENCODING_ISO_8859_7,          "ISO-8859-7",           N_("Greek")},
231         {SUBTITLE_ENCODING_MAC_GREEK,           "MAC_GREEK",            N_("Greek")},
232         {SUBTITLE_ENCODING_WINDOWS_1253,        "WINDOWS-1253",         N_("Greek")},
233
234         {SUBTITLE_ENCODING_MAC_GUJARATI,        "MAC_GUJARATI",         N_("Gujarati")},
235
236         {SUBTITLE_ENCODING_MAC_GURMUKHI,        "MAC_GURMUKHI",         N_("Gurmukhi")},
237
238         {SUBTITLE_ENCODING_ISO_8859_8_I,        "ISO-8859-8-I",         N_("Hebrew")},
239         {SUBTITLE_ENCODING_IBM_862,             "IBM862",               N_("Hebrew")},
240         {SUBTITLE_ENCODING_MAC_HEBREW,          "MAC_HEBREW",           N_("Hebrew")},
241         {SUBTITLE_ENCODING_WINDOWS_1255,        "WINDOWS-1255",         N_("Hebrew")},
242
243         {SUBTITLE_ENCODING_ISO_8859_8,          "ISO-8859-8",           N_("Hebrew Visual")},
244
245         {SUBTITLE_ENCODING_MAC_DEVANAGARI,      "MAC_DEVANAGARI",       N_("Hindi")},
246
247         {SUBTITLE_ENCODING_MAC_ICELANDIC,       "MAC_ICELANDIC",        N_("Icelandic")},
248
249         {SUBTITLE_ENCODING_EUC_JP,              "EUC-JP",               N_("Japanese")},
250         {SUBTITLE_ENCODING_ISO_2022_JP,         "ISO2022JP",            N_("Japanese")},
251         {SUBTITLE_ENCODING_SHIFT_JIS,           "SHIFT-JIS",            N_("Japanese")},
252
253         {SUBTITLE_ENCODING_EUC_KR,              "EUC-KR",               N_("Korean")},
254         {SUBTITLE_ENCODING_ISO_2022_KR,         "ISO2022KR",            N_("Korean")},
255         {SUBTITLE_ENCODING_JOHAB,               "JOHAB",                N_("Korean")},
256         {SUBTITLE_ENCODING_UHC,                 "UHC",                  N_("Korean")},
257
258         {SUBTITLE_ENCODING_ISO_8859_10,         "ISO-8859-10",          N_("Nordic")},
259
260         {SUBTITLE_ENCODING_MAC_FARSI,           "MAC_FARSI",            N_("Persian")},
261
262         {SUBTITLE_ENCODING_ISO_8859_16,         "ISO-8859-16",          N_("Romanian")},
263         {SUBTITLE_ENCODING_MAC_ROMANIAN,        "MAC_ROMANIAN",         N_("Romanian")},
264
265         {SUBTITLE_ENCODING_ISO_8859_3,          "ISO-8859-3",           N_("South European")},
266
267         {SUBTITLE_ENCODING_TIS_620,             "TIS-620",              N_("Thai")},
268
269         {SUBTITLE_ENCODING_ISO_8859_9,          "ISO-8859-9",           N_("Turkish")},
270         {SUBTITLE_ENCODING_IBM_857,             "IBM857",               N_("Turkish")},
271         {SUBTITLE_ENCODING_MAC_TURKISH,         "MAC_TURKISH",          N_("Turkish")},
272         {SUBTITLE_ENCODING_WINDOWS_1254,        "WINDOWS-1254",         N_("Turkish")},
273
274         {SUBTITLE_ENCODING_UTF_7,               "UTF-7",                N_("Unicode")},
275         {SUBTITLE_ENCODING_UTF_8,               "UTF-8",                N_("Unicode")},
276         {SUBTITLE_ENCODING_UTF_16,              "UTF-16",               N_("Unicode")},
277         {SUBTITLE_ENCODING_UCS_2,               "UCS-2",                N_("Unicode")},
278         {SUBTITLE_ENCODING_UCS_4,               "UCS-4",                N_("Unicode")},
279
280         {SUBTITLE_ENCODING_ISO_8859_1,          "ISO-8859-1",           N_("Western")},
281         {SUBTITLE_ENCODING_ISO_8859_15,         "ISO-8859-15",          N_("Western")},
282         {SUBTITLE_ENCODING_IBM_850,             "IBM850",               N_("Western")},
283         {SUBTITLE_ENCODING_MAC_ROMAN,           "MAC_ROMAN",            N_("Western")},
284         {SUBTITLE_ENCODING_WINDOWS_1252,        "WINDOWS-1252",         N_("Western")},
285
286         {SUBTITLE_ENCODING_TCVN,                "TCVN",                 N_("Vietnamese")},
287         {SUBTITLE_ENCODING_VISCII,              "VISCII",               N_("Vietnamese")},
288         {SUBTITLE_ENCODING_WINDOWS_1258,        "WINDOWS-1258",         N_("Vietnamese")},
289
290         {SUBTITLE_ENCODING_CURRENT_LOCALE,      NULL,                   N_("Current Locale")}
291 };
292
293 static gboolean
294 gconf_get_bool (GConfClient *client,
295                 const gchar *key)
296 {
297         gboolean value = FALSE;
298         gchar *tmp = NULL;
299
300         tmp = g_strdup_printf ("%s/%s", GCONF_MAFW_GST_SUBTITLE_RENDERER, key);
301
302         value = gconf_client_get_bool (client, tmp, NULL);
303
304         if (tmp)
305                 g_free (tmp);
306
307         return value;
308 }
309
310 static void
311 gconf_set_bool (GConfClient *client,
312                 const gchar *key,
313                 gboolean value)
314 {
315         gchar *tmp = NULL;
316
317         tmp = g_strdup_printf ("%s/%s", GCONF_MAFW_GST_SUBTITLE_RENDERER, key);
318
319         gconf_client_set_bool (client, tmp, value, NULL);
320
321         if (tmp)
322                 g_free (tmp);
323 }
324
325 static gchar *
326 gconf_get_string (GConfClient *client,
327                   gchar *key)
328 {
329         gchar *value = FALSE;
330         gchar *tmp = NULL;
331
332         tmp = g_strdup_printf ("%s/%s", GCONF_MAFW_GST_SUBTITLE_RENDERER, key);
333
334         value = gconf_client_get_string (client, tmp, NULL);
335
336         if (tmp)
337                 g_free (tmp);
338
339         return value;
340 }
341
342 static void
343 gconf_set_string (GConfClient *client,
344                 gchar *key,
345                 const gchar *value)
346 {
347         gchar *tmp = NULL;
348
349         tmp = g_strdup_printf ("%s/%s", GCONF_MAFW_GST_SUBTITLE_RENDERER, key);
350
351         if (value)
352                 gconf_client_set_string (client, tmp, value, NULL);
353         else
354                 gconf_client_unset (client, tmp, NULL);
355
356         if (tmp)
357                 g_free (tmp);
358 }
359
360 static gboolean
361 is_internal_font (const gchar * name)
362 {
363         /* FIXME Extremally BAD BAD BAD way of doing things */
364
365         return strcmp (name, "DeviceSymbols") == 0
366                        || strcmp(name, "Nokia Smiley") == 0
367                        || strcmp(name, "NewCourier") == 0
368                        || strcmp(name, "NewTimes") == 0
369                        || strcmp(name, "SwissA") == 0
370                        || strcmp(name, "Nokia Sans") == 0
371                        || strcmp(name, "Nokia Sans Cn") == 0;
372 }
373
374 static void
375 filter_out_internal_fonts (PangoFontFamily **families,
376                            int *n_families)
377 {
378         int i;
379         int n; /* counts valid fonts */
380         const gchar * name = NULL;
381
382         for (i = 0, n = 0; i < * n_families; i++) {
383                 name = pango_font_family_get_name (families[i]);
384
385                 if(!is_internal_font(name)) {
386                         if (i != n) { /* there are filtered out families */
387                                 families[n] = families[i]; /* shift the current family */
388                         }
389                         n++; /* count one more valid */
390                 }
391         } /* foreach font family */
392
393         *n_families = n;
394 }
395
396 static int
397 cmp_families (const void *a,
398               const void *b)
399 {
400         const char *a_name = pango_font_family_get_name (* (PangoFontFamily **) a);
401         const char *b_name = pango_font_family_get_name (* (PangoFontFamily **) b);
402
403         return g_utf8_collate (a_name, b_name);
404 }
405
406 static int
407 cmp_encodings (const void *a,
408                const void *b)
409 {
410         const SubtitleEncoding *a_encoding = (SubtitleEncoding *) a;
411         const SubtitleEncoding *b_encoding = (SubtitleEncoding *) b;
412
413         return g_utf8_collate (_(a_encoding->name), _(b_encoding->name));
414 }
415
416 static void
417 font_selector_dialog (HildonButton *button,
418                       gpointer user_data)
419 {
420         GtkWidget *dialog, *hbox, *family_selector, *style_selector, *size_selector;
421         gint index = 0;
422         const gchar *font = NULL;
423         PangoFontDescription *font_desc = NULL;
424         PangoFontFamily **families;
425         gint n_families = 0;
426         PangoWeight pango_weight;
427         PangoStyle pango_style;
428
429         font = hildon_button_get_value (HILDON_BUTTON (button));
430         if (font == NULL)
431                 return;
432
433         font_desc = pango_font_description_from_string (font);
434
435         dialog = gtk_dialog_new ();
436         gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
437         gtk_window_set_title (GTK_WINDOW (dialog), _("Font"));
438         gtk_dialog_add_button(GTK_DIALOG (dialog), "OK", GTK_RESPONSE_ACCEPT);
439         gtk_window_set_default_size (GTK_WINDOW (dialog), -1, 400);
440
441         hbox = gtk_hbox_new (FALSE, 0);
442         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
443
444         /* font family selector */
445         family_selector = hildon_touch_selector_new_text ();
446         gtk_box_pack_start (GTK_BOX (hbox), family_selector, TRUE, TRUE, 0);
447
448         pango_context_list_families (gtk_widget_get_pango_context (GTK_WIDGET (dialog)),
449                                      &families, &n_families);
450
451         filter_out_internal_fonts (families, &n_families);
452
453         qsort (families, n_families, sizeof(PangoFontFamily *), cmp_families);
454
455         for (index = 0; index < n_families; index++) {
456                 const gchar *family = pango_font_family_get_name (families[index]);
457                 hildon_touch_selector_insert_text (HILDON_TOUCH_SELECTOR (family_selector),
458                                                    index, family);
459
460                 if (strcmp (family, pango_font_description_get_family (font_desc)) == 0) {
461                         hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (family_selector), 0,
462                                                           index);
463                         hildon_touch_selector_center_on_selected (HILDON_TOUCH_SELECTOR (family_selector));
464                 }
465         }
466         g_free (families);
467
468         /* font style selector */
469         style_selector = hildon_touch_selector_new_text ();
470         gtk_widget_set_size_request (style_selector, 200, -1);
471         gtk_box_pack_start (GTK_BOX (hbox), style_selector, FALSE, TRUE, 0);
472
473         index = 0;
474         while (index < FONT_STYLE_LAST) {
475                 const gchar *style = g_strdup_printf ("%s", _(font_styles[index].name));
476                 hildon_touch_selector_insert_text (HILDON_TOUCH_SELECTOR (style_selector),
477                                                    font_styles[index].index, style);
478                 index++;
479         }
480         pango_weight = pango_font_description_get_weight (font_desc);
481         pango_style = pango_font_description_get_style (font_desc);
482
483         if (pango_weight == PANGO_WEIGHT_NORMAL) {
484                 if (pango_style == PANGO_STYLE_NORMAL) {
485                         hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (style_selector), 0,
486                                                           FONT_STYLE_REGULAR);
487                 } else {
488                         hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (style_selector), 0,
489                                                           FONT_STYLE_ITALIC);
490                 }
491         } else {
492                 if (pango_style == PANGO_STYLE_NORMAL) {
493                         hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (style_selector), 0,
494                                                           FONT_STYLE_BOLD);
495                 } else {
496                         hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (style_selector), 0,
497                                                           FONT_STYLE_ITALIC_BOLD);
498                 }
499         }
500         hildon_touch_selector_center_on_selected (HILDON_TOUCH_SELECTOR (style_selector));
501
502         /* font size selector */
503         size_selector = hildon_touch_selector_new_text ();
504         gtk_widget_set_size_request (size_selector, 100, -1);
505         gtk_box_pack_start (GTK_BOX (hbox), size_selector, FALSE, TRUE, 0);
506
507         index = 0;
508         while (font_sizes[index] != -1) {
509                 const gchar *size = g_strdup_printf ("%d", font_sizes[index]);
510                 hildon_touch_selector_insert_text (HILDON_TOUCH_SELECTOR (size_selector),
511                                                    index, size);
512
513                 if (font_sizes[index] == (pango_font_description_get_size (font_desc) / PANGO_SCALE)) {
514                         hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (size_selector), 0,
515                                                           index);
516                         hildon_touch_selector_center_on_selected (HILDON_TOUCH_SELECTOR (size_selector));
517                 }
518
519                 index++;
520         }
521
522         /* Run the dialog */
523         gtk_widget_show_all (GTK_WIDGET (dialog));
524         if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
525                 if (font_desc)
526                         pango_font_description_free (font_desc);
527
528                 font_desc = pango_font_description_new ();
529
530                 /* set font family */
531                 pango_font_description_set_family (font_desc,
532                                                    hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (family_selector)));
533
534                 /* set font style */
535                 switch (hildon_touch_selector_get_active (HILDON_TOUCH_SELECTOR (style_selector), 0)) {
536                         case FONT_STYLE_REGULAR:
537                                 pango_font_description_set_style (font_desc, PANGO_STYLE_NORMAL);
538                                 pango_font_description_set_weight (font_desc, PANGO_WEIGHT_NORMAL);
539                                 break;
540
541                         case FONT_STYLE_ITALIC:
542                                 pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
543                                 pango_font_description_set_weight (font_desc, PANGO_WEIGHT_NORMAL);
544                                 break;
545
546                         case FONT_STYLE_BOLD:
547                                 pango_font_description_set_style (font_desc, PANGO_STYLE_NORMAL);
548                                 pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
549                                 break;
550
551                         case FONT_STYLE_ITALIC_BOLD:
552                                 pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
553                                 pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
554                                 break;
555                 }
556
557                 /* set font size */
558                 pango_font_description_set_size (font_desc,
559                                                  font_sizes[hildon_touch_selector_get_active (HILDON_TOUCH_SELECTOR (size_selector), 0)] * PANGO_SCALE);
560
561                 hildon_button_set_value (HILDON_BUTTON (button), pango_font_description_to_string (font_desc));
562         }
563
564         if (font_desc)
565                 pango_font_description_free (font_desc);
566
567         gtk_widget_destroy(GTK_WIDGET(dialog));
568 }
569
570
571 static GtkWidget *
572 create_encoding_selector (void)
573 {
574         GtkWidget *selector;
575         gint index = 0;
576
577         selector = hildon_touch_selector_new_text ();
578
579         qsort (encodings, SUBTITLE_ENCODING_LAST - 1, sizeof (SubtitleEncoding), cmp_encodings);
580
581         while (index < SUBTITLE_ENCODING_LAST) {
582                 const gchar *encoding = NULL;
583
584                 if (encodings[index].charset) {
585                         encoding = g_strdup_printf ("%s (%s)", _(encodings[index].name),
586                                                     encodings[index].charset);
587                 } else {
588                         encoding = g_strdup_printf ("%s", _(encodings[index].name));
589                 }
590
591                 hildon_touch_selector_insert_text (HILDON_TOUCH_SELECTOR (selector),
592                                                    index,
593                                                    encoding);
594                 index++;
595         }
596
597         return selector;
598 }
599
600 static GtkWidget *
601 create_autoload_subtitles_button (GConfClient *gconf_client)
602 {
603         GtkWidget *button;
604         gboolean autoload_subtitles = FALSE;
605
606         button = hildon_check_button_new (HILDON_SIZE_FINGER_HEIGHT);
607         gtk_button_set_label (GTK_BUTTON (button), _("Automatically load subtitle files"));
608
609         autoload_subtitles = gconf_get_bool (gconf_client, "autoload_subtitles");
610         if (autoload_subtitles)
611                 hildon_check_button_set_active (HILDON_CHECK_BUTTON (button), TRUE);
612         else
613                 hildon_check_button_set_active (HILDON_CHECK_BUTTON (button), FALSE);
614
615         return button;
616 }
617
618 static void
619 save_autoload_subtitles (GConfClient *gconf_client,
620                          GtkWidget *widget)
621 {
622         if (hildon_check_button_get_active (HILDON_CHECK_BUTTON (widget)))
623                 gconf_set_bool (gconf_client, "autoload_subtitles", TRUE);
624         else
625                 gconf_set_bool (gconf_client, "autoload_subtitles", FALSE);
626 }
627
628 static GtkWidget *
629 create_subtitles_font_button (GConfClient *gconf_client)
630 {
631         GtkWidget *button;
632         const gchar *font = NULL;
633
634         button = hildon_button_new (HILDON_SIZE_FINGER_HEIGHT,
635                                     HILDON_BUTTON_ARRANGEMENT_VERTICAL);
636         hildon_button_set_title (HILDON_BUTTON (button), _("Font"));
637         hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 0.0);
638         hildon_button_set_title_alignment (HILDON_BUTTON(button), 0.0, 0.5);
639         hildon_button_set_value_alignment (HILDON_BUTTON (button), 0.0, 0.5);
640         hildon_button_set_style (HILDON_BUTTON (button), HILDON_BUTTON_STYLE_PICKER);
641
642         font = gconf_get_string (gconf_client, "subtitle_font");
643         if (font) {
644                 hildon_button_set_value (HILDON_BUTTON (button), font);
645         } else {
646                 hildon_button_set_value (HILDON_BUTTON (button), "Sans Bold 18");
647         }
648
649         g_signal_connect (button, "clicked", G_CALLBACK (font_selector_dialog),
650                           NULL);
651
652         return button;
653 }
654
655 static void
656 save_subtitles_font (GConfClient *gconf_client,
657                      GtkWidget *widget)
658 {
659         const gchar *font = NULL;
660
661         font = hildon_button_get_value (HILDON_BUTTON (widget));
662         gconf_set_string (gconf_client, "subtitle_font", font);
663 }
664
665 static GtkWidget *
666 create_subtitles_encoding_button (GConfClient *gconf_client)
667 {
668         GtkWidget *button, *selector;
669         const gchar *encoding = NULL;
670
671         button = hildon_picker_button_new (HILDON_SIZE_FINGER_HEIGHT,
672                                            HILDON_BUTTON_ARRANGEMENT_VERTICAL);
673         hildon_button_set_title (HILDON_BUTTON (button), _("Encoding"));
674         hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 0.0);
675         hildon_button_set_title_alignment (HILDON_BUTTON(button), 0.0, 0.5);
676         hildon_button_set_value_alignment (HILDON_BUTTON (button), 0.0, 0.5);
677
678         selector = create_encoding_selector ();
679         hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
680                                            HILDON_TOUCH_SELECTOR (selector));
681
682         encoding = gconf_get_string (gconf_client, "subtitle_encoding");
683         if (encoding) {
684                 /* skip current locale */
685                 gint index = 1;
686
687                 while (index < SUBTITLE_ENCODING_LAST) {
688                         if (strcmp (encodings[index].charset, encoding) == 0) {
689                                 hildon_picker_button_set_active (HILDON_PICKER_BUTTON (button),
690                                                                  index);
691                                 break;
692                         }
693                         index++;
694                 }
695         } else {
696                 hildon_picker_button_set_active (HILDON_PICKER_BUTTON (button),
697                                                  SUBTITLE_ENCODING_CURRENT_LOCALE);
698         }
699
700         return button;
701 }
702
703 static void
704 save_subtitles_encoding (GConfClient *gconf_client,
705                          GtkWidget *widget)
706 {
707         gint encoding = 0, index = 0;
708
709         encoding = hildon_picker_button_get_active (HILDON_PICKER_BUTTON (widget));
710
711         while (index < SUBTITLE_ENCODING_LAST) {
712                 if (encoding == index) {
713                         gconf_set_string (gconf_client, "subtitle_encoding",
714                                           encodings[index].charset);
715                         break;
716                 }
717                 index++;
718         }
719 }
720
721 osso_return_t
722 execute (osso_context_t *osso,
723          gpointer data,
724          gboolean user_activated)
725 {
726         GConfClient *gconf_client = NULL;
727         GtkWidget *dialog, *vbox, *autoload_subtitles_button;
728         GtkWidget *subtitles_font_button, *subtitles_encoding_button;
729
730         gconf_client = gconf_client_get_default ();
731         if (gconf_client == NULL) {
732                 return OSSO_ERROR;
733         }
734
735         dialog = gtk_dialog_new ();
736         gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
737         gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (data));
738         gtk_window_set_title (GTK_WINDOW (dialog), _("Subtitles"));
739         gtk_dialog_add_button(GTK_DIALOG (dialog), _HL("wdgt_bd_save"), GTK_RESPONSE_ACCEPT);
740
741         vbox = gtk_vbox_new (FALSE, 0);
742         gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
743
744         /* autoload subtitles button */
745         autoload_subtitles_button = create_autoload_subtitles_button (gconf_client);
746         gtk_box_pack_start (GTK_BOX (vbox), autoload_subtitles_button, TRUE, TRUE, 0);
747
748         /* font selector */
749         subtitles_font_button = create_subtitles_font_button (gconf_client);
750         gtk_box_pack_start (GTK_BOX (vbox), subtitles_font_button, TRUE, TRUE, 0);
751
752         /* font encoding */
753         subtitles_encoding_button = create_subtitles_encoding_button (gconf_client);
754         gtk_box_pack_start (GTK_BOX (vbox), subtitles_encoding_button, TRUE, TRUE, 0);
755
756         /* Run the dialog */
757         gtk_widget_show_all (GTK_WIDGET (dialog));
758         if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
759                 /* save autoload subtitles option */
760                 save_autoload_subtitles (gconf_client, autoload_subtitles_button);
761
762                 /* save subtitle font option */
763                 save_subtitles_font (gconf_client, subtitles_font_button);
764
765                 /* save subtitle encoding option */
766                 save_subtitles_encoding (gconf_client, subtitles_encoding_button);
767         }
768
769         gtk_widget_destroy(GTK_WIDGET(dialog));
770         return OSSO_OK;
771 }
772
773 osso_return_t
774 save_state (osso_context_t *osso,
775             gpointer data)
776 {
777         return OSSO_OK;
778 }
779