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