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 "ukeyboard"
32 #include <glib/gi18n-lib.h>
42 HildonTouchSelector
*combo
;
43 HildonCheckButton
*key_rep
;
51 static layouts layout_names
[] = {
53 {"cz_qwerty", "Čeština - QWERTY"},
54 {"dano", "Dansk, Norsk"},
56 {"us", "English, Nederlands"},
57 {"ptes", "Español, Français (Canada), Português"},
58 {"fr", "Français (France)"},
61 {"fise", "Suomi, Svenska"},
62 {"ch", "Suisse, Schweiz"},
65 {"sk_qwerty", "Slovenčina - QWERTY"},
69 {"bg_phonetic", "Български - Phonetic"},
72 {"ru_phonetic", "Русский - Phonetic"},
73 {"he_phonetic", "עברית - Phonetic"},
77 {"sr_cyrillic", "Srpski - Cyrillic"},
78 {"ua", "Український"},
79 {"ua_phonetic", "Український - Phonetic"},
81 {"th", "ภาษาไทย - Kedmanee"},
85 static gchar
*resolve_layout_name(const gchar
*layout
)
89 while (layout_names
[i
].layout
!= NULL
)
91 if (!strcmp(layout_names
[i
].layout
, layout
))
92 return layout_names
[i
].name
;
98 static char *strip(char *s
)
100 while (*s
== ' ' || *s
== '\t' || *s
== '\n' || *s
== '\r')
105 static GList
*get_layouts(gchar
*path
, gchar
*model
, GList
*list
)
109 gchar
*layout
= NULL
;
113 f
= fopen(path
, "r");
121 while (fgets(buf
, 512, f
)) {
123 if (!strncmp(s
, "xkb_symbols", 11)) {
136 layout
= g_strdup(s
);
138 /* ignore nordic layout */
139 if (!strcmp(layout
, "nordic")) {
144 /* WORKAROUND: ignore cz_qwerty nokiarx51 layout,
145 because it's broken in PR1.1 and PR1.1.1 */
146 if (!strcmp(model
, "nokiarx51")) {
147 if (!strcmp(layout
, "cz_qwerty")) {
153 name
= resolve_layout_name(layout
);
156 lay
= g_malloc(sizeof(struct layout
));
157 lay
->model
= g_strdup(model
);
158 lay
->layout
= layout
;
159 lay
->name
= g_strdup(name
);
161 list
= g_list_append(list
, lay
);
164 } else if (!strncmp(s
, "name", 4) && layout
) {
183 lay
= g_malloc(sizeof(struct layout
));
184 lay
->model
= g_strdup(model
);
185 lay
->layout
= layout
;
186 lay
->name
= g_strdup(s
);
188 list
= g_list_append(list
, lay
);
195 static void free_layouts(GList
*list
)
200 for (item
= list
; item
; item
= g_list_next(item
)) {
210 static gint
layouts_compare_func(gconstpointer a
, gconstpointer b
)
212 struct layout
*layout_a
= (struct layout
*) a
;
213 struct layout
*layout_b
= (struct layout
*) b
;
215 return g_utf8_collate (layout_a
->name
, layout_b
->name
);
218 static GtkWidget
*start(GConfClient
*client
, GtkWidget
*win
, void **data
)
222 gchar
*omodel
, *olayout
;
226 GtkWidget
*vbox
, *button
;
235 d
= g_malloc(sizeof(struct data
));
237 omodel
= get_str(client
, "int_kb_model");
238 olayout
= get_str(client
, "int_kb_layout");
239 d
->layouts
= get_layouts("/usr/share/X11/xkb/symbols/nokia_vndr/rx-51", "nokiarx51", NULL
);
240 d
->layouts
= get_layouts("/usr/share/X11/xkb/symbols/nokia_vndr/ukeyboard", "ukeyboard", d
->layouts
);
241 d
->layouts
= g_list_sort(d
->layouts
, layouts_compare_func
);
243 vbox
= gtk_vbox_new(FALSE
, 0);
245 d
->combo
= HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
247 button
= hildon_picker_button_new(HILDON_SIZE_FINGER_HEIGHT
, HILDON_BUTTON_ARRANGEMENT_VERTICAL
);
248 hildon_button_set_title(HILDON_BUTTON(button
), _TI("tein_fi_keyboard_layout"));
249 hildon_picker_button_set_selector(HILDON_PICKER_BUTTON (button
), d
->combo
);
250 hildon_button_set_alignment (HILDON_BUTTON (button
), 0.0, 0.5, 1.0, 0.0);
251 hildon_button_set_title_alignment(HILDON_BUTTON(button
), 0.0, 0.5);
252 hildon_button_set_value_alignment (HILDON_BUTTON (button
), 0.0, 0.5);
253 gtk_box_pack_start(GTK_BOX(vbox
), GTK_WIDGET(button
), TRUE
, TRUE
, 0);
255 d
->key_rep
= HILDON_CHECK_BUTTON(hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT
));
256 gtk_button_set_label (GTK_BUTTON (d
->key_rep
), _("Longpress key repetition"));
257 gtk_box_pack_start(GTK_BOX(vbox
), GTK_WIDGET(d
->key_rep
), TRUE
, TRUE
, 0);
258 hildon_check_button_set_active(d
->key_rep
, get_bool(client
, "ext_kb_repeat_enabled"));
260 /* WORKAROUND: if int_kb_model is set to nokiarx44 on rx-51 device,
261 then set omodel to nokiarx51. Without this workaround, no hardwere
262 keyboard was automatically selected after first run */
263 if (omodel
&& !strcmp(omodel
, "nokiarx44")) {
265 omodel
= g_strdup("nokiarx51");
268 for (item
= d
->layouts
, i
= 0; item
; item
= g_list_next(item
), i
++) {
270 hildon_touch_selector_append_text(d
->combo
, lay
->name
);
271 if (omodel
&& olayout
&& !strcmp(lay
->model
, omodel
) && !strcmp(lay
->layout
, olayout
))
272 hildon_touch_selector_set_active(d
->combo
, 0, i
);
280 gtk_widget_show_all(vbox
);
285 static void action(GConfClient
*client
, void *data
)
287 struct data
*d
= data
;
293 res
= hildon_touch_selector_get_active(d
->combo
, 0);
295 lay
= g_list_nth_data(d
->layouts
, res
);
297 set_str(client
, "int_kb_model", lay
->model
);
298 set_str(client
, "int_kb_layout", lay
->layout
);
299 set_bool(client
, "ext_kb_repeat_enabled", hildon_check_button_get_active(d
->key_rep
));
304 static void stop(GConfClient
*client
, void *data
)
306 struct data
*d
= data
;
310 free_layouts(d
->layouts
);
315 void prefs_hw_init(struct prefs
*prefs
)
317 prefs
->start
= start
;
318 prefs
->action
= action
;
320 prefs
->name
= "Hardware";