2 * Copyright (c) 2008 Jiri Benc <jbenc@upir.cz>
3 * Copyright (c) 2009 Roman Moravcik <roman.moravcik@gmail.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 #include <hildon/hildon-caption.h>
24 #include <hildon/hildon.h>
26 #include <gconf/gconf.h>
27 #include <gconf/gconf-client.h>
31 #define GETTEXT_PACKAGE "osso-applet-textinput"
32 #include <glib/gi18n-lib.h>
42 HildonTouchSelector
*combo
;
50 static layouts layout_names
[] = {
52 {"cz_qwerty", "Čeština - QWERTY"},
53 {"dano", "Dansk, Norsk"},
55 {"us", "English, Nederlands"},
56 {"ptes", "Español, Français (Canada), Português"},
57 {"fr", "Français (France)"},
60 {"fise", "Suomi, Svenska"},
61 {"ch", "Suisse, Schweiz"},
64 {"sk_qwerty", "Slovenčina - QWERTY"},
65 {"aren", "Arabic, English"},
68 {"bg_phonetic", "Български - Phonetic"},
69 {"faen", "Persian, English"},
71 {"ru_phonetic", "Русский - Phonetic"},
72 {"he_phonetic", "עברית - Phonetic"},
73 {"ge", "Georgian - Latin"},
78 static gchar
*resolve_layout_name(const gchar
*layout
)
82 while (layout_names
[i
].layout
!= NULL
)
84 if (!strcmp(layout_names
[i
].layout
, layout
))
85 return layout_names
[i
].name
;
91 static char *strip(char *s
)
93 while (*s
== ' ' || *s
== '\t' || *s
== '\n' || *s
== '\r')
98 static GList
*get_layouts(gchar
*path
, gchar
*model
, GList
*list
)
102 gchar
*layout
= NULL
;
106 f
= fopen(path
, "r");
114 while (fgets(buf
, 512, f
)) {
116 if (!strncmp(s
, "xkb_symbols", 11)) {
129 layout
= g_strdup(s
);
131 /* ignore nordic layout */
132 if (!strcmp(layout
, "nordic")) {
137 /* WORKAROUND: ignore cz_qwerty nokiarx51 layout,
138 because it's broken in PR1.1 and PR1.1.1 */
139 if (!strcmp(model
, "nokiarx51")) {
140 if (!strcmp(layout
, "cz_qwerty")) {
146 name
= resolve_layout_name(layout
);
149 lay
= g_malloc(sizeof(struct layout
));
150 lay
->model
= g_strdup(model
);
151 lay
->layout
= layout
;
152 lay
->name
= g_strdup(name
);
154 list
= g_list_append(list
, lay
);
157 } else if (!strncmp(s
, "name", 4) && layout
) {
176 lay
= g_malloc(sizeof(struct layout
));
177 lay
->model
= g_strdup(model
);
178 lay
->layout
= layout
;
179 lay
->name
= g_strdup(s
);
181 list
= g_list_append(list
, lay
);
188 static void free_layouts(GList
*list
)
193 for (item
= list
; item
; item
= g_list_next(item
)) {
203 static gint
layouts_compare_func(gconstpointer a
, gconstpointer b
)
205 struct layout
*layout_a
= (struct layout
*) a
;
206 struct layout
*layout_b
= (struct layout
*) b
;
208 return g_utf8_collate (layout_a
->name
, layout_b
->name
);
211 static GtkWidget
*start(GConfClient
*client
, GtkWidget
*win
, void **data
)
215 gchar
*omodel
, *olayout
;
228 d
= g_malloc(sizeof(struct data
));
230 omodel
= get_str(client
, "int_kb_model");
231 olayout
= get_str(client
, "int_kb_layout");
232 d
->layouts
= get_layouts("/usr/share/X11/xkb/symbols/nokia_vndr/rx-51", "nokiarx51", NULL
);
233 d
->layouts
= get_layouts("/usr/share/X11/xkb/symbols/nokia_vndr/ukeyboard", "ukeyboard", d
->layouts
);
234 d
->layouts
= g_list_sort(d
->layouts
, layouts_compare_func
);
236 d
->combo
= HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
238 button
= hildon_picker_button_new(HILDON_SIZE_FINGER_HEIGHT
, HILDON_BUTTON_ARRANGEMENT_VERTICAL
);
239 hildon_button_set_title(HILDON_BUTTON(button
), _("tein_fi_keyboard_layout"));
240 hildon_picker_button_set_selector(HILDON_PICKER_BUTTON (button
), d
->combo
);
241 hildon_button_set_alignment (HILDON_BUTTON (button
), 0.0, 0.5, 1.0, 0.0);
242 hildon_button_set_title_alignment(HILDON_BUTTON(button
), 0.0, 0.5);
243 hildon_button_set_value_alignment (HILDON_BUTTON (button
), 0.0, 0.5);
245 /* WORKAROUND: if int_kb_model is set to nokiarx44 on rx-51 device,
246 then set omodel to nokiarx51. Without this workaround, no hardwere
247 keyboard was automatically selected after first run */
248 if (omodel
&& !strcmp(omodel
, "nokiarx44")) {
250 omodel
= g_strdup("nokiarx51");
253 for (item
= d
->layouts
, i
= 0; item
; item
= g_list_next(item
), i
++) {
255 hildon_touch_selector_append_text(d
->combo
, lay
->name
);
256 if (omodel
&& olayout
&& !strcmp(lay
->model
, omodel
) && !strcmp(lay
->layout
, olayout
))
257 hildon_touch_selector_set_active(d
->combo
, 0, i
);
265 gtk_widget_show(button
);
270 static void action(GConfClient
*client
, void *data
)
272 struct data
*d
= data
;
278 res
= hildon_touch_selector_get_active(d
->combo
, 0);
280 lay
= g_list_nth_data(d
->layouts
, res
);
282 set_str(client
, "int_kb_model", lay
->model
);
283 set_str(client
, "int_kb_layout", lay
->layout
);
288 static void stop(GConfClient
*client
, void *data
)
290 struct data
*d
= data
;
294 free_layouts(d
->layouts
);
299 void prefs_hw_init(struct prefs
*prefs
)
301 prefs
->start
= start
;
302 prefs
->action
= action
;
304 prefs
->name
= "Hardware";