e3e69ee455eacd5bb094b86a6d5bfac4e1646f73
[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
5 /* local function prototypes */
6 static void *_il_kbd_config_create(E_Config_Dialog *cfd);
7 static void _il_kbd_config_free(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static Evas_Object *_il_kbd_config_ui(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
9 static void _il_kbd_config_changed(void *data, Evas_Object *obj, void *event);
10 static Eina_Bool _il_kbd_config_change_timeout(void *data);
11
12 EAPI Il_Kbd_Config *il_kbd_cfg = NULL;
13 static E_Config_DD *conf_edd = NULL;
14 Ecore_Timer *_il_kbd_config_change_timer = NULL;
15 int kbd_external = 0;
16
17 /* public functions */
18 EAPI int 
19 il_kbd_config_init(E_Module *m) 
20 {
21    char buff[PATH_MAX];
22
23    conf_edd = E_CONFIG_DD_NEW("Illume_Kbd_Cfg", Il_Kbd_Config);
24    #undef T
25    #undef D
26    #define T Il_Kbd_Config
27    #define D conf_edd
28    E_CONFIG_VAL(D, T, version, INT);
29    E_CONFIG_VAL(D, T, use_internal, INT);
30    E_CONFIG_VAL(D, T, run_keyboard, STR);
31    E_CONFIG_VAL(D, T, dict, STR);
32
33    il_kbd_cfg = e_config_domain_load("module.illume-keyboard", conf_edd);
34    if ((il_kbd_cfg) && 
35        ((il_kbd_cfg->version >> 16) < IL_CONFIG_MAJ)) 
36      {
37         E_FREE(il_kbd_cfg);
38         il_kbd_cfg = NULL;
39      }
40    if (!il_kbd_cfg) 
41      {
42         il_kbd_cfg = E_NEW(Il_Kbd_Config, 1);
43         il_kbd_cfg->version = 0;
44         il_kbd_cfg->use_internal = 1;
45         il_kbd_cfg->run_keyboard = NULL;
46         il_kbd_cfg->dict = eina_stringshare_add("English_(US).dic");
47      }
48    if (il_kbd_cfg) 
49      {
50         /* Add new config variables here */
51         /* if ((il_kbd_cfg->version & 0xffff) < 1) */
52         il_kbd_cfg->version = (IL_CONFIG_MAJ << 16) | IL_CONFIG_MIN;
53      }
54
55    il_kbd_cfg->mod_dir = eina_stringshare_add(m->dir);
56
57    snprintf(buff, sizeof(buff), "%s/e-module-illume-keyboard.edj",
58             il_kbd_cfg->mod_dir);
59    e_configure_registry_category_add("illume", 0, _("Illume"), NULL, 
60                                      "enlightenment/display");
61    e_configure_registry_generic_item_add("illume/keyboard", 0, _("Keyboard"), 
62                                          buff, "icon", il_kbd_config_show);
63    return 1;
64 }
65
66 EAPI int 
67 il_kbd_config_shutdown(void) 
68 {
69    il_kbd_cfg->cfd = NULL;
70
71    e_configure_registry_item_del("illume/keyboard");
72    e_configure_registry_category_del("illume");
73
74    if (il_kbd_cfg->mod_dir) eina_stringshare_del(il_kbd_cfg->mod_dir);
75    if (il_kbd_cfg->run_keyboard) eina_stringshare_del(il_kbd_cfg->run_keyboard);
76    if (il_kbd_cfg->dict) eina_stringshare_del(il_kbd_cfg->dict);
77
78    E_FREE(il_kbd_cfg);
79    il_kbd_cfg = NULL;
80
81    E_CONFIG_DD_FREE(conf_edd);
82    return 1;
83 }
84
85 EAPI int 
86 il_kbd_config_save(void) 
87 {
88    e_config_domain_save("module.illume-keyboard", conf_edd, il_kbd_cfg);
89    return 1;
90 }
91
92 EAPI void 
93 il_kbd_config_show(E_Container *con, const char *params __UNUSED__) 
94 {
95    E_Config_Dialog *cfd;
96    E_Config_Dialog_View *v;
97
98    if (e_config_dialog_find("E", "_config_illume_keyboard_settings")) return;
99
100    v = E_NEW(E_Config_Dialog_View, 1);
101    v->create_cfdata = _il_kbd_config_create;
102    v->free_cfdata = _il_kbd_config_free;
103    v->basic.create_widgets = _il_kbd_config_ui;
104    v->basic_only = 1;
105    v->normal_win = 1;
106    v->scroll = 1;
107
108    cfd = e_config_dialog_new(con, _("Keyboard Settings"), "E", 
109                              "_config_illume_keyboard_settings", 
110                              "enlightenment/keyboard_settings", 0, v, NULL);
111    e_dialog_resizable_set(cfd->dia, 1);
112    il_kbd_cfg->cfd = cfd;
113 }
114
115 /* local function prototypes */
116 static void *
117 _il_kbd_config_create(E_Config_Dialog *cfd __UNUSED__) 
118 {
119    return NULL;
120 }
121
122 static void 
123 _il_kbd_config_free(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata __UNUSED__) 
124 {
125    il_kbd_cfg->cfd = NULL;
126 }
127
128 static Evas_Object *
129 _il_kbd_config_ui(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata __UNUSED__) 
130 {
131    Evas_Object *list, *of, *ow;
132    E_Radio_Group *rg;
133    Eina_List *l;
134
135    list = e_widget_list_add(evas, 0, 0);
136    if (!il_kbd_cfg->run_keyboard) 
137      {
138         if (il_kbd_cfg->use_internal) kbd_external = 1;
139         else kbd_external = 0;
140      }
141    else 
142      {
143         Eina_List *kbds;
144         Efreet_Desktop *desktop;
145         int nn = 0;
146
147         kbd_external = 0;
148         kbds = efreet_util_desktop_category_list("Keyboard");
149         if (kbds) 
150           {
151              nn = 2;
152              EINA_LIST_FOREACH(kbds, l, desktop) 
153                {
154                   const char *dname;
155
156                   dname = ecore_file_file_get(desktop->orig_path);
157                   if (dname) 
158                     {
159                        if (!strcmp(il_kbd_cfg->run_keyboard, dname)) 
160                          {
161                             kbd_external = nn;
162                             break;
163                          }
164                     }
165                   nn++;
166                }
167              EINA_LIST_FREE(kbds, desktop)
168                efreet_desktop_free(desktop);
169           }
170      }
171
172    of = e_widget_framelist_add(evas, _("Keyboards"), 0);
173    rg = e_widget_radio_group_new(&(kbd_external));
174    ow = e_widget_radio_add(evas, _("None"), 0, rg);
175    e_widget_framelist_object_append(of, ow);
176    evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL);
177    ow = e_widget_radio_add(evas, _("Default"), 1, rg);
178    e_widget_framelist_object_append(of, ow);
179    evas_object_smart_callback_add(ow, "changed", _il_kbd_config_changed, NULL);
180      {
181         Eina_List *kbds;
182         Efreet_Desktop *desktop;
183         int nn = 2;
184
185         kbds = efreet_util_desktop_category_list("Keyboard");
186         EINA_LIST_FREE(kbds, desktop) 
187           {
188              ow = e_widget_radio_add(evas, desktop->name, nn, rg);
189              e_widget_framelist_object_append(of, ow);
190              evas_object_smart_callback_add(ow, "changed", 
191                                             _il_kbd_config_changed, NULL);
192              efreet_desktop_free(desktop);
193              nn++;
194           }
195      }
196    e_widget_list_object_append(list, of, 1, 0, 0.0);
197    return list;
198 }
199
200 static void 
201 _il_kbd_config_changed(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) 
202 {
203    if (_il_kbd_config_change_timer) 
204      ecore_timer_del(_il_kbd_config_change_timer);
205    _il_kbd_config_change_timer = 
206      ecore_timer_add(0.5, _il_kbd_config_change_timeout, data);
207 }
208
209 static Eina_Bool
210 _il_kbd_config_change_timeout(void *data __UNUSED__)
211 {
212    Eina_List *l;
213
214    il_kbd_cfg->use_internal = 0;
215    if (il_kbd_cfg->run_keyboard) 
216      eina_stringshare_del(il_kbd_cfg->run_keyboard);
217    il_kbd_cfg->run_keyboard = NULL;
218    if (kbd_external == 0)
219      il_kbd_cfg->use_internal = 0;
220    else if (kbd_external == 1)
221      il_kbd_cfg->use_internal = 1;
222    else 
223      {
224         Eina_List *kbds;
225         Efreet_Desktop *desktop;
226         int nn;
227
228         kbds = efreet_util_desktop_category_list("Keyboard");
229         if (kbds) 
230           {
231              nn = 2;
232              EINA_LIST_FOREACH(kbds, l, desktop) 
233                {
234                   const char *dname;
235
236                   dname = ecore_file_file_get(desktop->orig_path);
237                   if (nn == kbd_external) 
238                     {
239                        if (dname)
240                          il_kbd_cfg->run_keyboard = eina_stringshare_add(dname);
241                        break;
242                     }
243                   nn++;
244                }
245              EINA_LIST_FREE(kbds, desktop)
246                efreet_desktop_free(desktop);
247           }
248      }
249
250    il_kbd_cfg_update();
251    e_config_save_queue();
252    _il_kbd_config_change_timer = NULL;
253    return ECORE_CALLBACK_CANCEL;
254 }