update for beta release
[framework/uifw/e17.git] / src / modules / illume-keyboard / e_mod_config.c
1 #include "e.h"
2 #include "e_mod_main.h"
3 #include "e_mod_config.h"
4 #include "e_kbd_int.h"
5
6 /* local function prototypes */
7 static void *_il_kbd_config_create(E_Config_Dialog *cfd);
8 static void _il_kbd_config_free(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_il_kbd_config_ui(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
10 static void _il_kbd_config_changed(void *data, Evas_Object *obj, void *event);
11 static Eina_Bool _il_kbd_config_change_timeout(void *data);
12
13 EAPI Il_Kbd_Config *il_kbd_cfg = NULL;
14 static E_Config_DD *conf_edd = NULL;
15 Ecore_Timer *_il_kbd_config_change_timer = NULL;
16 int kbd_external = 0;
17
18 /* public functions */
19 EAPI int 
20 il_kbd_config_init(E_Module *m) 
21 {
22    char buff[PATH_MAX];
23
24    conf_edd = E_CONFIG_DD_NEW("Illume_Kbd_Cfg", Il_Kbd_Config);
25    #undef T
26    #undef D
27    #define T Il_Kbd_Config
28    #define D conf_edd
29    E_CONFIG_VAL(D, T, version, INT);
30    E_CONFIG_VAL(D, T, use_internal, INT);
31    E_CONFIG_VAL(D, T, run_keyboard, STR);
32    E_CONFIG_VAL(D, T, dict, STR);
33    E_CONFIG_VAL(D, T, zoom_level, INT);
34    E_CONFIG_VAL(D, T, hold_timer, DOUBLE);
35    E_CONFIG_VAL(D, T, slide_dim, INT);
36    E_CONFIG_VAL(D, T, scale_height, DOUBLE);
37    E_CONFIG_VAL(D, T, layout, INT);
38    il_kbd_cfg = e_config_domain_load("module.illume-keyboard", conf_edd);
39    if ((il_kbd_cfg) && 
40        ((il_kbd_cfg->version >> 16) < IL_CONFIG_MAJ)) 
41      {
42         E_FREE(il_kbd_cfg);
43         il_kbd_cfg = NULL;
44      }
45    if (!il_kbd_cfg) 
46      {
47         il_kbd_cfg = E_NEW(Il_Kbd_Config, 1);
48         il_kbd_cfg->version = 0;
49         il_kbd_cfg->use_internal = 1;
50         il_kbd_cfg->run_keyboard = NULL;
51         il_kbd_cfg->dict = eina_stringshare_add("English_(US).dic");
52         il_kbd_cfg->zoom_level = 4;
53         il_kbd_cfg->slide_dim = 4;
54         il_kbd_cfg->hold_timer = 0.25;
55      }
56    if (il_kbd_cfg) 
57      {
58         /* Add new config variables here */
59         /* if ((il_kbd_cfg->version & 0xffff) < 1) */
60         if ((il_kbd_cfg->version & 0xffff) < 2)
61           {
62              il_kbd_cfg->zoom_level = 4;
63              il_kbd_cfg->slide_dim = 4;
64              il_kbd_cfg->hold_timer = 0.25;
65              il_kbd_cfg->scale_height = 1.0;
66           }
67         if ((il_kbd_cfg->version & 0xffff) < IL_CONFIG_MIN)
68           {
69              il_kbd_cfg->layout = E_KBD_INT_TYPE_ALPHA;
70           }
71
72         il_kbd_cfg->version = (IL_CONFIG_MAJ << 16) | IL_CONFIG_MIN;
73      }
74
75    il_kbd_cfg->mod_dir = eina_stringshare_add(m->dir);
76
77    snprintf(buff, sizeof(buff), "%s/e-module-illume-keyboard.edj",
78             il_kbd_cfg->mod_dir);
79    e_configure_registry_category_add("illume", 0, _("Illume"), NULL, 
80                                      "enlightenment/display");
81    e_configure_registry_generic_item_add("illume/keyboard", 0, _("Keyboard"), 
82                                          buff, "icon", il_kbd_config_show);
83    return 1;
84 }
85
86 EAPI int 
87 il_kbd_config_shutdown(void) 
88 {
89    il_kbd_cfg->cfd = NULL;
90
91    e_configure_registry_item_del("illume/keyboard");
92    e_configure_registry_category_del("illume");
93
94    if (il_kbd_cfg->mod_dir) eina_stringshare_del(il_kbd_cfg->mod_dir);
95    if (il_kbd_cfg->run_keyboard) eina_stringshare_del(il_kbd_cfg->run_keyboard);
96    if (il_kbd_cfg->dict) eina_stringshare_del(il_kbd_cfg->dict);
97
98    E_FREE(il_kbd_cfg);
99    il_kbd_cfg = NULL;
100
101    E_CONFIG_DD_FREE(conf_edd);
102    return 1;
103 }
104
105 EAPI int 
106 il_kbd_config_save(void) 
107 {
108    e_config_domain_save("module.illume-keyboard", conf_edd, il_kbd_cfg);
109    return 1;
110 }
111
112 EAPI void 
113 il_kbd_config_show(E_Container *con, const char *params __UNUSED__) 
114 {
115    E_Config_Dialog *cfd;
116    E_Config_Dialog_View *v;
117
118    if (e_config_dialog_find("E", "_config_illume_keyboard_settings")) return;
119
120    v = E_NEW(E_Config_Dialog_View, 1);
121    v->create_cfdata = _il_kbd_config_create;
122    v->free_cfdata = _il_kbd_config_free;
123    v->basic.create_widgets = _il_kbd_config_ui;
124    v->basic_only = 1;
125    v->normal_win = 1;
126    v->scroll = 1;
127
128    cfd = e_config_dialog_new(con, _("Keyboard Settings"), "E", 
129                              "_config_illume_keyboard_settings", 
130                              "enlightenment/keyboard_settings", 0, v, NULL);
131    e_dialog_resizable_set(cfd->dia, 1);
132    il_kbd_cfg->cfd = cfd;
133 }
134
135 /* local function prototypes */
136 static void *
137 _il_kbd_config_create(E_Config_Dialog *cfd __UNUSED__) 
138 {
139    return NULL;
140 }
141
142 static void 
143 _il_kbd_config_free(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__) 
144 {
145    il_kbd_cfg->cfd = NULL;
146 }
147
148 static Evas_Object *
149 _il_kbd_config_ui(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata __UNUSED__) 
150 {
151    Evas_Object *list, *of, *ow, *sl, *ol;
152    E_Radio_Group *rg;
153    Eina_List *l;
154
155    list = e_widget_list_add(evas, 0, 0);
156    if (!il_kbd_cfg->run_keyboard) 
157      {
158         if (il_kbd_cfg->use_internal) kbd_external = 1;
159         else kbd_external = 0;
160      }
161    else 
162      {
163         Eina_List *kbds;
164         Efreet_Desktop *desktop;
165         int nn = 0;
166
167         kbd_external = 0;
168         kbds = efreet_util_desktop_category_list("Keyboard");
169         if (kbds) 
170           {
171              nn = 2;
172              EINA_LIST_FOREACH(kbds, l, desktop) 
173                {
174                   const char *dname;
175
176                   dname = ecore_file_file_get(desktop->orig_path);
177                   if (dname) 
178                     {
179                        if (!strcmp(il_kbd_cfg->run_keyboard, dname)) 
180                          {
181                             kbd_external = nn;
182                             break;
183                          }
184                     }
185                   nn++;
186                }
187              EINA_LIST_FREE(kbds, desktop)
188                efreet_desktop_free(desktop);
189           }
190      }
191
192    of = e_widget_framelist_add(evas, _("Keyboards"), 0);
193    rg = e_widget_radio_group_new(&(kbd_external));
194    ow = e_widget_radio_add(evas, _("None"), 0, rg);
195    e_widget_framelist_object_append(of, ow);
196    evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL);
197    ow = e_widget_radio_add(evas, _("Default"), 1, rg);
198    e_widget_framelist_object_append(of, ow);
199    evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL);
200      {
201         Eina_List *kbds;
202         Efreet_Desktop *desktop;
203         int nn = 2;
204
205         kbds = efreet_util_desktop_category_list("Keyboard");
206         EINA_LIST_FREE(kbds, desktop) 
207           {
208              ow = e_widget_radio_add(evas, desktop->name, nn, rg);
209              e_widget_framelist_object_append(of, ow);
210              evas_object_smart_callback_add(ow, "changed", 
211                                             _il_kbd_config_changed, NULL);
212              efreet_desktop_free(desktop);
213              nn++;
214           }
215      }
216    
217    ol = e_widget_label_add(evas, _("Displacement ratio"));
218    e_widget_framelist_object_append(of, ol);
219    sl = e_widget_slider_add(evas, EINA_TRUE, 0, "1/%.0f", 1.0, 10.0, 1.0, 0,
220                             NULL, &(il_kbd_cfg->slide_dim), 150);
221    e_widget_framelist_object_append(of, sl);
222
223    ol = e_widget_label_add(evas, _("Delay for zoom popup"));
224    e_widget_framelist_object_append(of, ol);
225    sl = e_widget_slider_add(evas, EINA_TRUE, 0, "%.2f second(s)", 0.0, 3.0, 0.01, 0,
226                             &(il_kbd_cfg->hold_timer), NULL, 150);
227    e_widget_framelist_object_append(of, sl);
228
229    ol = e_widget_label_add(evas, _("Zoom level"));
230    e_widget_framelist_object_append(of, ol);
231    sl = e_widget_slider_add(evas, EINA_TRUE, 0, "%.0f", 1.0, 10.0, 1.0, 0,
232                             NULL, &(il_kbd_cfg->zoom_level), 150);
233    e_widget_framelist_object_append(of, sl);
234
235    ol = e_widget_label_add(evas, _("Height"));
236    e_widget_framelist_object_append(of, ol);
237    sl = e_widget_slider_add(evas, EINA_TRUE, 0, "%.2f", 0.2, 2.0, 0.1, 0,
238                             &(il_kbd_cfg->scale_height), NULL, 150);
239    evas_object_smart_callback_add(sl, "changed", 
240                                   _il_kbd_config_changed, NULL);
241         
242    e_widget_framelist_object_append(of, sl);
243
244    e_widget_list_object_append(list, of, 1, 0, 0.0);
245
246    of = e_widget_framelist_add(evas, _("Layout"), 0);
247    rg = e_widget_radio_group_new(&(il_kbd_cfg->layout));
248    ow = e_widget_radio_add(evas, _("Default"), E_KBD_INT_TYPE_ALPHA, rg);
249    e_widget_framelist_object_append(of, ow);
250    evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL);
251    ow = e_widget_radio_add(evas, _("Terminal"), E_KBD_INT_TYPE_TERMINAL, rg);
252    e_widget_framelist_object_append(of, ow);
253    evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL);
254    e_widget_list_object_append(list, of, 1, 0, 0.0);
255    
256    return list;
257 }
258
259 static void 
260 _il_kbd_config_changed(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) 
261 {
262    if (_il_kbd_config_change_timer) 
263      ecore_timer_del(_il_kbd_config_change_timer);
264    _il_kbd_config_change_timer = 
265      ecore_timer_add(0.5, _il_kbd_config_change_timeout, data);
266 }
267
268 static Eina_Bool
269 _il_kbd_config_change_timeout(void *data __UNUSED__)
270 {
271    Eina_List *l;
272
273    il_kbd_cfg->use_internal = 0;
274    if (il_kbd_cfg->run_keyboard) 
275      eina_stringshare_del(il_kbd_cfg->run_keyboard);
276    il_kbd_cfg->run_keyboard = NULL;
277    if (kbd_external == 0)
278      il_kbd_cfg->use_internal = 0;
279    else if (kbd_external == 1)
280      il_kbd_cfg->use_internal = 1;
281    else 
282      {
283         Eina_List *kbds;
284         Efreet_Desktop *desktop;
285         int nn;
286
287         kbds = efreet_util_desktop_category_list("Keyboard");
288         if (kbds) 
289           {
290              nn = 2;
291              EINA_LIST_FOREACH(kbds, l, desktop) 
292                {
293                   const char *dname;
294
295                   dname = ecore_file_file_get(desktop->orig_path);
296                   if (nn == kbd_external) 
297                     {
298                        if (dname)
299                          il_kbd_cfg->run_keyboard = eina_stringshare_add(dname);
300                        break;
301                     }
302                   nn++;
303                }
304              EINA_LIST_FREE(kbds, desktop)
305                efreet_desktop_free(desktop);
306           }
307      }
308
309    il_kbd_cfg_update();
310    e_config_save_queue();
311    _il_kbd_config_change_timer = NULL;
312    return ECORE_CALLBACK_CANCEL;
313 }