1 #include "e.h"
2 #include "e_mod_main.h"
3
4 typedef struct _E_Imc_Update_Data E_Imc_Update_Data;
5
6 static void *_create_data(E_Config_Dialog *cfd);
7 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
10 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
11 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
12
13 /* Basic Callbacks */
14 static int _basic_list_sort_cb(const void *d1, const void *d2);
15 static void _e_imc_list_change_cb(void *data, Evas_Object *obj);
16 static void _e_imc_setup_cb(void *data, void *data2);
17
18 /* Advanced Callbacks */
19 static void _cb_dir(void *data, Evas_Object *obj);
20 static void _cb_button_up(void *data1, void *data2);
21 static void _cb_new(void *data, void *data2);
22
23 static void _cb_files_changed(void *data, Evas_Object *obj, void *event_info);
24 static void _cb_files_selection_change(void *data, Evas_Object *obj, void *event_info);
25 static void _cb_files_files_changed(void *data, Evas_Object *obj, void *event_info);
26 static void _cb_files_files_deleted(void *data, Evas_Object *obj, void *event_info);
27 static void _e_imc_adv_setup_cb(void *data, void *data2);
28
29 static void _e_imc_change_enqueue(E_Config_Dialog_Data *cfdata);
30 static void _e_imc_entry_change_cb(void *data, Evas_Object *obj);
31 static void _e_imc_form_fill(E_Config_Dialog_Data *cfdata);
32 static const char *_e_imc_file_name_new_get(void);
33 static Eina_Bool _change_hash_free_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata EINA_UNUSED);
34 static Eina_Bool _change_hash_apply_cb(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, void *fdata EINA_UNUSED);
35
36 struct _E_Config_Dialog_Data
37 {
38 E_Config_Dialog *cfd;
39
40 /* Maluable Widgets */
41 Evas_Object *o_personal;
42 Evas_Object *o_system;
43 Evas_Object *o_up_button;
44 Evas_Object *o_fm; /* File manager */
45 Evas_Object *o_frame; /* scrollpane for file manager*/
46
47 const char *imc_current;
48 Eina_Hash *imc_basic_map;
49
50 int imc_disable; /* 0=enable, 1=disable */
51 int fmdir; /* 0=Local, 1=System*/
52 struct
53 {
54 int dirty;
55 char *e_im_name;
56 char *e_im_exec;
57 char *e_im_setup_exec;
58
59 char *gtk_im_module;
60 char *qt_im_module;
61 char *xmodifiers;
62 char *ecore_imf_module;
63 } imc;
64
65 Eina_Hash *imc_change_map;
66
67 struct
68 {
69 Evas_Object *imc_basic_list;
70 Evas_Object *imc_basic_disable;
71 Evas_Object *imc_basic_setup;
72
73 Evas_Object *imc_advanced_disable;
74 Evas_Object *imc_advanced_setup;
75
76 Evas_Object *e_im_name;
77 Evas_Object *e_im_exec;
78 Evas_Object *e_im_setup_exec;
79 Evas_Object *gtk_im_module;
80 Evas_Object *qt_im_module;
81 Evas_Object *xmodifiers;
82 Evas_Object *ecore_imf_module;
83 } gui;
84
85 Evas_Object *win_import;
86 };
87
88 E_Config_Dialog *
e_int_config_imc(Evas_Object * parent,const char * params EINA_UNUSED)89 e_int_config_imc(Evas_Object *parent, const char *params EINA_UNUSED)
90 {
91 E_Config_Dialog *cfd;
92 E_Config_Dialog_View *v;
93
94 if (e_config_dialog_find("E", "language/input_method_settings")) return NULL;
95 v = E_NEW(E_Config_Dialog_View, 1);
96
97 v->create_cfdata = _create_data;
98 v->free_cfdata = _free_data;
99 v->advanced.create_widgets = _advanced_create_widgets;
100 v->advanced.apply_cfdata = _advanced_apply_data;
101 v->basic.create_widgets = _basic_create_widgets;
102 v->basic.apply_cfdata = _basic_apply_data;
103
104 cfd = e_config_dialog_new(parent,
105 _("Input Method Settings"),
106 "E", "language/input_method_settings",
107 "preferences-imc", 0, v, NULL);
108 return cfd;
109 }
110
111 static void
_fill_data(E_Config_Dialog_Data * cfdata)112 _fill_data(E_Config_Dialog_Data *cfdata)
113 {
114 cfdata->imc_current = eina_stringshare_ref(e_config->input_method);
115
116 if (cfdata->imc_current)
117 {
118 const char *path;
119
120 path = e_intl_imc_system_path_get();
121 if (!strncmp(cfdata->imc_current, path, strlen(path)))
122 cfdata->fmdir = 1;
123 }
124 cfdata->imc_disable = !cfdata->imc_current;
125 }
126
127 static void *
_create_data(E_Config_Dialog * cfd)128 _create_data(E_Config_Dialog *cfd)
129 {
130 E_Config_Dialog_Data *cfdata;
131
132 cfdata = E_NEW(E_Config_Dialog_Data, 1);
133 cfdata->cfd = cfd;
134 cfd->cfdata = cfdata;
135 _fill_data(cfdata);
136 return cfdata;
137 }
138
139 static Eina_Bool
_change_hash_free_cb(const Eina_Hash * hash EINA_UNUSED,const void * key EINA_UNUSED,void * data,void * fdata EINA_UNUSED)140 _change_hash_free_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata EINA_UNUSED)
141 {
142 E_Input_Method_Config *imc;
143
144 imc = data;
145 e_intl_input_method_config_free(imc);
146 return 1;
147 }
148
149 static void
_free_data(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)150 _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
151 {
152 E_FREE_FUNC(cfdata->win_import, evas_object_del);
153 eina_stringshare_del(cfdata->imc_current);
154
155 if (cfdata->imc_basic_map)
156 {
157 eina_hash_foreach(cfdata->imc_basic_map, _change_hash_free_cb, NULL);
158 eina_hash_free(cfdata->imc_basic_map);
159 }
160
161 if (cfdata->imc_change_map)
162 {
163 eina_hash_foreach(cfdata->imc_change_map, _change_hash_free_cb, NULL);
164 eina_hash_free(cfdata->imc_change_map);
165 }
166 cfdata->imc_change_map = NULL;
167
168 E_FREE(cfdata->imc.e_im_name);
169 E_FREE(cfdata->imc.e_im_exec);
170 E_FREE(cfdata->imc.e_im_setup_exec);
171 E_FREE(cfdata->imc.gtk_im_module);
172 E_FREE(cfdata->imc.qt_im_module);
173 E_FREE(cfdata->imc.xmodifiers);
174 E_FREE(cfdata->imc.ecore_imf_module);
175 E_FREE(cfdata);
176 }
177
178 /*** Start Basic Dialog Logic ***/
179 static int
_basic_apply_data(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)180 _basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
181 {
182 eina_stringshare_replace(&e_config->input_method, NULL);
183 if (!cfdata->imc_disable)
184 e_config->input_method = eina_stringshare_ref(cfdata->imc_current);
185
186 e_intl_input_method_set(e_config->input_method);
187
188 e_config_save_queue();
189 return 1;
190 }
191
192 static int
_basic_list_sort_cb(const void * d1,const void * d2)193 _basic_list_sort_cb(const void *d1, const void *d2)
194 {
195 if (!d1) return 1;
196 if (!d2) return -1;
197
198 return strcmp((const char *)d1, (const char *)d2);
199 }
200
201 void
_e_imc_setup_button_toggle(Evas_Object * button,E_Input_Method_Config * imc)202 _e_imc_setup_button_toggle(Evas_Object *button, E_Input_Method_Config *imc)
203 {
204 if (imc)
205 {
206 int flag;
207
208 flag = (!imc->e_im_setup_exec) || (!imc->e_im_setup_exec[0]);
209 e_widget_disabled_set(button, flag);
210 }
211 else
212 e_widget_disabled_set(button, 1);
213 }
214
215 static void
_e_imc_list_change_cb(void * data,Evas_Object * obj EINA_UNUSED)216 _e_imc_list_change_cb(void *data, Evas_Object *obj EINA_UNUSED)
217 {
218 E_Config_Dialog_Data *cfdata;
219 E_Input_Method_Config *imc;
220
221 cfdata = data;
222 e_widget_check_checked_set(cfdata->gui.imc_basic_disable, 0);
223
224 if (cfdata->imc_current)
225 {
226 imc = eina_hash_find(cfdata->imc_basic_map, cfdata->imc_current);
227 _e_imc_setup_button_toggle(cfdata->gui.imc_basic_setup, imc);
228 }
229 }
230
231 static void
_e_imc_imc_toggle(void * data,Evas_Object * obj EINA_UNUSED)232 _e_imc_imc_toggle(void *data, Evas_Object *obj EINA_UNUSED)
233 {
234 E_Config_Dialog_Data *cfdata;
235
236 cfdata = data;
237
238 if (cfdata->imc_disable)
239 {
240 e_widget_ilist_unselect(cfdata->gui.imc_basic_list);
241 e_widget_disabled_set(cfdata->gui.imc_basic_list, 1);
242 e_widget_disabled_set(cfdata->gui.imc_basic_setup, 1);
243 }
244 else
245 {
246 e_widget_disabled_set(cfdata->gui.imc_basic_list, 0);
247 e_widget_disabled_set(cfdata->gui.imc_basic_setup, 0);
248 }
249 }
250
251 static void
_e_imc_setup_cb(void * data,void * data2 EINA_UNUSED)252 _e_imc_setup_cb(void *data, void *data2 EINA_UNUSED)
253 {
254 E_Config_Dialog_Data *cfdata;
255
256 cfdata = data;
257 if (cfdata->imc_current && cfdata->imc_basic_map)
258 {
259 E_Input_Method_Config *imc;
260
261 imc = eina_hash_find(cfdata->imc_basic_map, cfdata->imc_current);
262
263 if ((imc) && (imc->e_im_setup_exec))
264 {
265 Ecore_Exe *exe;
266 const char *cmd;
267
268 cmd = imc->e_im_setup_exec;
269
270 exe = e_util_exe_safe_run(cmd, NULL);
271
272 if (!exe)
273 {
274 e_util_dialog_show(_("Run Error"),
275 _("Enlightenment was unable to fork a child process:<ps/>"
276 "<ps/>%s<ps/>"),
277 cmd);
278 }
279 }
280 }
281 }
282
283 static Evas_Object *
_basic_create_widgets(E_Config_Dialog * cfd EINA_UNUSED,Evas * evas,E_Config_Dialog_Data * cfdata)284 _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
285 {
286 Evas_Object *o, *of, *ob;
287 Eina_List *imc_basic_list;
288 int i;
289
290 o = e_widget_list_add(evas, 0, 0);
291
292 of = e_widget_frametable_add(evas, _("Input Method Selector"), 0);
293
294 /* Disable imc checkbox */
295 ob = e_widget_check_add(evas, _("Use No Input Method"),
296 &(cfdata->imc_disable));
297 e_widget_on_change_hook_set(ob, _e_imc_imc_toggle, cfdata);
298 cfdata->gui.imc_basic_disable = ob;
299 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
300
301 /* Configure imc button */
302 ob = e_widget_button_add(evas, _("Setup Selected Input Method"),
303 "configure", _e_imc_setup_cb, cfdata, NULL);
304 cfdata->gui.imc_basic_setup = ob;
305 e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 0);
306
307 /* Input method List */
308 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->imc_current));
309 e_widget_on_change_hook_set(ob, _e_imc_list_change_cb, cfdata);
310 e_widget_size_min_set(ob, 175, 175);
311 cfdata->gui.imc_basic_list = ob;
312 _e_imc_imc_toggle(cfdata, NULL);
313
314 evas_event_freeze(evas_object_evas_get(ob));
315 edje_freeze();
316 e_widget_ilist_freeze(ob);
317
318 imc_basic_list = e_intl_input_method_list();
319 /* Sort basic input method list */
320 imc_basic_list = eina_list_sort(imc_basic_list,
321 eina_list_count(imc_basic_list),
322 _basic_list_sort_cb);
323
324 if (cfdata->imc_basic_map)
325 {
326 eina_hash_foreach(cfdata->imc_basic_map, _change_hash_free_cb, NULL);
327 eina_hash_free(cfdata->imc_basic_map);
328 cfdata->imc_basic_map = NULL;
329 }
330
331 i = 0;
332 while (imc_basic_list)
333 {
334 E_Input_Method_Config *imc;
335 Eet_File *imc_ef;
336 char *imc_path;
337
338 imc_path = imc_basic_list->data;
339 imc_ef = eet_open(imc_path, EET_FILE_MODE_READ);
340 if (imc_ef)
341 {
342 imc = e_intl_input_method_config_read(imc_ef);
343 eet_close(imc_ef);
344
345 if ((imc) && (imc->e_im_name))
346 {
347 Evas_Object *icon = NULL;
348
349 if (imc->e_im_setup_exec)
350 {
351 Efreet_Desktop *desktop;
352
353 if (imc->e_im_setup_exec[0] == '/')
354 {
355 if (!ecore_file_exists(imc->e_im_setup_exec))
356 {
357 e_intl_input_method_config_free(imc);
358 goto out;
359 }
360 }
361 else
362 {
363 const char *env = getenv("PATH");
364 char **split, buf[PATH_MAX];
365 Eina_Bool exec_found = EINA_FALSE;
366
367 if (!env)
368 {
369 e_intl_input_method_config_free(imc);
370 goto out;
371 }
372 split = eina_str_split(env, ":", 0);
373 for (i = 0; split[i] != NULL; i++)
374 {
375 snprintf(buf, sizeof(buf), "%s/%s", split[i], imc->e_im_setup_exec);
376
377 if (ecore_file_exists(buf) && ecore_file_can_exec(buf))
378 {
379 exec_found = EINA_TRUE;
380 break;
381 }
382 }
383 free(split[0]);
384 free(split);
385 if (!exec_found)
386 {
387 e_intl_input_method_config_free(imc);
388 goto out;
389 }
390 }
391 desktop = efreet_util_desktop_exec_find(imc->e_im_setup_exec);
392 if (desktop)
393 {
394 icon = e_util_desktop_icon_add(desktop, 48, evas);
395 efreet_desktop_free(desktop);
396 }
397 }
398
399 e_widget_ilist_append(cfdata->gui.imc_basic_list, icon, imc->e_im_name, NULL, NULL, imc_path);
400 if ((cfdata->imc_current) &&
401 (!strncmp(imc_path, cfdata->imc_current,
402 eina_stringshare_strlen(cfdata->imc_current))))
403 e_widget_ilist_selected_set(cfdata->gui.imc_basic_list, i);
404 i++;
405
406 if (!cfdata->imc_basic_map)
407 cfdata->imc_basic_map = eina_hash_string_superfast_new(NULL);
408 eina_hash_add(cfdata->imc_basic_map, imc_path, imc);
409 }
410 }
411 out:
412 free(imc_path);
413 imc_basic_list = eina_list_remove_list(imc_basic_list, imc_basic_list);
414 }
415
416 if (cfdata->imc_current)
417 _e_imc_setup_button_toggle(cfdata->gui.imc_basic_setup,
418 eina_hash_find(cfdata->imc_basic_map,
419 cfdata->imc_current));
420
421 e_widget_ilist_go(ob);
422 e_widget_ilist_thaw(ob);
423 edje_thaw();
424 evas_event_thaw(evas_object_evas_get(ob));
425
426 e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
427 e_widget_list_object_append(o, of, 1, 1, 0.5);
428 return o;
429 }
430
431 /*** End Basic Dialog Logic ***/
432
433 /*** Start Advanced Dialog Logic ***/
434 static Eina_Bool
_change_hash_apply_cb(const Eina_Hash * hash EINA_UNUSED,const void * key,void * data,void * fdata EINA_UNUSED)435 _change_hash_apply_cb(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, void *fdata EINA_UNUSED)
436 {
437 E_Input_Method_Config *imc;
438 Eet_File *ef;
439
440 imc = data;
441
442 if (ecore_file_exists(key))
443 {
444 ef = eet_open(key, EET_FILE_MODE_WRITE);
445 if (ef)
446 {
447 e_intl_input_method_config_write(ef, imc);
448 eet_close(ef);
449 }
450 }
451
452 e_intl_input_method_config_free(imc);
453
454 return 1;
455 }
456
457 static int
_advanced_apply_data(E_Config_Dialog * cfd,E_Config_Dialog_Data * cfdata)458 _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
459 {
460 /* inherit basic apply functionality */
461 _basic_apply_data(cfd, cfdata);
462
463 /* Save all file changes */
464 if (cfdata->imc_current)
465 _e_imc_change_enqueue(cfdata);
466
467 if (cfdata->imc_change_map)
468 {
469 eina_hash_foreach(cfdata->imc_change_map, _change_hash_apply_cb, NULL);
470 eina_hash_free(cfdata->imc_change_map);
471 }
472 cfdata->imc_change_map = NULL;
473 return 1;
474 }
475
476 /** Start Button Callbacks **/
477
478 /* Radio Toggled */
479 static void
_cb_dir(void * data,Evas_Object * obj EINA_UNUSED)480 _cb_dir(void *data, Evas_Object *obj EINA_UNUSED)
481 {
482 E_Config_Dialog_Data *cfdata;
483 const char *path;
484
485 cfdata = data;
486 if (cfdata->fmdir == 1)
487 path = e_intl_imc_system_path_get();
488 else
489 path = e_intl_imc_personal_path_get();
490 e_fm2_path_set(cfdata->o_fm, path, "/");
491 }
492
493 /* Directory Navigator */
494 static void
_cb_button_up(void * data,void * data2 EINA_UNUSED)495 _cb_button_up(void *data, void *data2 EINA_UNUSED)
496 {
497 E_Config_Dialog_Data *cfdata;
498
499 cfdata = data;
500 if (cfdata->o_fm)
501 e_fm2_parent_go(cfdata->o_fm);
502 if (cfdata->o_frame)
503 e_widget_scrollframe_child_pos_set(cfdata->o_frame, 0, 0);
504 }
505
506 /* Entry chagned */
507 static void
_e_imc_entry_change_cb(void * data,Evas_Object * obj EINA_UNUSED)508 _e_imc_entry_change_cb(void *data, Evas_Object *obj EINA_UNUSED)
509 {
510 E_Config_Dialog_Data *cfdata;
511
512 cfdata = data;
513 cfdata->imc.dirty = 1;
514 }
515
516 /* Creating a new IMC */
517 static void
_cb_new(void * data,void * data2 EINA_UNUSED)518 _cb_new(void *data, void *data2 EINA_UNUSED)
519 {
520 E_Input_Method_Config *imc_new;
521 Eet_File *ef;
522 const char *file;
523 E_Config_Dialog_Data *cfdata;
524
525 cfdata = data;
526 imc_new = E_NEW(E_Input_Method_Config, 1);
527 imc_new->version = E_INTL_INPUT_METHOD_CONFIG_VERSION;
528
529 file = _e_imc_file_name_new_get();
530
531 if (file)
532 {
533 ef = eet_open(file, EET_FILE_MODE_WRITE);
534 if (ef)
535 {
536 e_intl_input_method_config_write(ef, imc_new);
537 eet_close(ef);
538 e_int_config_imc_update(cfdata->cfd, file);
539 }
540 }
541 free(imc_new);
542 }
543
544 static void
_e_imc_adv_setup_cb(void * data,void * data2 EINA_UNUSED)545 _e_imc_adv_setup_cb(void *data, void *data2 EINA_UNUSED)
546 {
547 E_Config_Dialog_Data *cfdata;
548
549 cfdata = data;
550 if (cfdata->imc.e_im_setup_exec)
551 {
552 Ecore_Exe *exe;
553 char *cmd;
554
555 cmd = cfdata->imc.e_im_setup_exec;
556
557 exe = e_util_exe_safe_run(cmd, NULL);
558
559 if (!exe)
560 {
561 e_util_dialog_show(_("Run Error"),
562 _("Enlightenment was unable to fork a child process:<ps/>"
563 "<ps/>%s<ps/>"), cmd);
564 }
565 }
566 }
567
568 /** End Button Callbacks **/
569
570 /** Start IMC FM2 Callbacks **/
571 static void
_cb_files_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)572 _cb_files_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
573 {
574 E_Config_Dialog_Data *cfdata;
575
576 cfdata = data;
577 if (!cfdata->o_fm) return;
578 if (!e_fm2_has_parent_get(cfdata->o_fm))
579 {
580 if (cfdata->o_up_button)
581 e_widget_disabled_set(cfdata->o_up_button, 1);
582 }
583 else
584 {
585 if (cfdata->o_up_button)
586 e_widget_disabled_set(cfdata->o_up_button, 0);
587 }
588 if (cfdata->o_frame)
589 e_widget_scrollframe_child_pos_set(cfdata->o_frame, 0, 0);
590 }
591
592 static void
_cb_files_selection_change(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)593 _cb_files_selection_change(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
594 {
595 E_Config_Dialog_Data *cfdata;
596 Eina_List *selected;
597 E_Fm2_Icon_Info *ici;
598 const char *real_path;
599 char buf[PATH_MAX];
600
601 cfdata = data;
602 if (!cfdata->o_fm) return;
603 if (!(selected = e_fm2_selected_list_get(cfdata->o_fm))) return;
604
605 if (cfdata->imc_current)
606 {
607 _e_imc_change_enqueue(cfdata);
608 eina_stringshare_del(cfdata->imc_current);
609 cfdata->imc_current = NULL;
610 }
611
612 ici = selected->data;
613 real_path = e_fm2_real_path_get(cfdata->o_fm);
614 if (!strcmp(real_path, "/"))
615 snprintf(buf, sizeof(buf), "/%s", ici->file);
616 else
617 snprintf(buf, sizeof(buf), "%s/%s", real_path, ici->file);
618 eina_list_free(selected);
619 if (ecore_file_is_dir(buf)) return;
620 cfdata->imc_current = eina_stringshare_add(buf);
621 _e_imc_form_fill(cfdata);
622 if (cfdata->o_frame)
623 e_widget_change(cfdata->o_frame);
624 }
625
626 static void
_cb_files_files_changed(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)627 _cb_files_files_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
628 {
629 const char *buf;
630 const char *p;
631 E_Config_Dialog_Data *cfdata;
632
633 cfdata = data;
634 if (!cfdata->imc_current) return;
635 if (!cfdata->o_fm) return;
636 p = e_fm2_real_path_get(cfdata->o_fm);
637 if (p)
638 {
639 if (strncmp(p, cfdata->imc_current, strlen(p))) return;
640 }
641
642 buf = e_intl_imc_personal_path_get();
643 if (!strncmp(cfdata->imc_current, buf, strlen(buf)))
644 p = cfdata->imc_current + strlen(buf) + 1;
645 else
646 {
647 buf = e_intl_imc_system_path_get();
648 if (!strncmp(cfdata->imc_current, buf, strlen(buf)))
649 p = cfdata->imc_current + strlen(buf) + 1;
650 }
651 if (!p) return;
652 e_fm2_select_set(cfdata->o_fm, p, 1);
653 e_fm2_file_show(cfdata->o_fm, p);
654 }
655
656 static void
_cb_files_files_deleted(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)657 _cb_files_files_deleted(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
658 {
659 E_Config_Dialog_Data *cfdata;
660 Eina_List *sel, *all, *n;
661 E_Fm2_Icon_Info *ici, *ic;
662
663 cfdata = data;
664 if (!cfdata->imc_current) return;
665 if (!cfdata->o_fm) return;
666
667 if (!(all = e_fm2_all_list_get(cfdata->o_fm))) return;
668 if (!(sel = e_fm2_selected_list_get(cfdata->o_fm))) return;
669
670 ici = sel->data;
671
672 all = eina_list_data_find_list(all, ici);
673 n = eina_list_next(all);
674 if (!n)
675 {
676 n = eina_list_prev(all);
677 if (!n) return;
678 }
679
680 ic = n->data;
681 if (!ic) return;
682
683 e_fm2_select_set(cfdata->o_fm, ic->file, 1);
684 e_fm2_file_show(cfdata->o_fm, ic->file);
685
686 eina_list_free(n);
687
688 evas_object_smart_callback_call(cfdata->o_fm, "selection_change", cfdata);
689 }
690
691 /** End IMC FM2 Callbacks **/
692
693 /** Start IMC Utility Functions **/
694 /* When updating the selection call this to fill in the form */
695 static void
_e_imc_form_fill(E_Config_Dialog_Data * cfdata)696 _e_imc_form_fill(E_Config_Dialog_Data *cfdata)
697 {
698 Eet_File *imc_file;
699 E_Input_Method_Config *imc;
700 int imc_free;
701
702 if (!cfdata->imc_current)
703 {
704 e_widget_disabled_set(cfdata->gui.imc_advanced_setup, 1);
705 return;
706 }
707
708 imc_free = 0;
709 imc = eina_hash_find(cfdata->imc_change_map, cfdata->imc_current);
710
711 if (!imc)
712 {
713 imc_free = 1;
714 imc_file = eet_open(cfdata->imc_current, EET_FILE_MODE_READ);
715 if (imc_file)
716 {
717 imc = e_intl_input_method_config_read(imc_file);
718 eet_close(imc_file);
719 }
720 }
721
722 _e_imc_setup_button_toggle(cfdata->gui.imc_advanced_setup, imc);
723
724 if (imc)
725 {
726 e_widget_entry_text_set(cfdata->gui.e_im_name, imc->e_im_name);
727 e_widget_entry_text_set(cfdata->gui.e_im_exec, imc->e_im_exec);
728 e_widget_entry_text_set(cfdata->gui.e_im_setup_exec, imc->e_im_setup_exec);
729 e_widget_entry_text_set(cfdata->gui.gtk_im_module, imc->gtk_im_module);
730 e_widget_entry_text_set(cfdata->gui.qt_im_module, imc->qt_im_module);
731 e_widget_entry_text_set(cfdata->gui.xmodifiers, imc->xmodifiers);
732 e_widget_entry_text_set(cfdata->gui.ecore_imf_module, imc->ecore_imf_module);
733
734 e_widget_entry_readonly_set(cfdata->gui.e_im_name, cfdata->fmdir);
735 e_widget_entry_readonly_set(cfdata->gui.e_im_exec, cfdata->fmdir);
736 e_widget_entry_readonly_set(cfdata->gui.e_im_setup_exec, cfdata->fmdir);
737 e_widget_entry_readonly_set(cfdata->gui.gtk_im_module, cfdata->fmdir);
738 e_widget_entry_readonly_set(cfdata->gui.qt_im_module, cfdata->fmdir);
739 e_widget_entry_readonly_set(cfdata->gui.xmodifiers, cfdata->fmdir);
740 e_widget_entry_readonly_set(cfdata->gui.ecore_imf_module, cfdata->fmdir);
741 if (imc_free) e_intl_input_method_config_free(imc);
742 }
743 e_widget_check_checked_set(cfdata->gui.imc_advanced_disable, 0);
744 cfdata->imc.dirty = 0;
745 }
746
747 /* Remember changes in memory until we click apply */
748 static void
_e_imc_change_enqueue(E_Config_Dialog_Data * cfdata)749 _e_imc_change_enqueue(E_Config_Dialog_Data *cfdata)
750 {
751 if (cfdata->imc.dirty)
752 {
753 E_Input_Method_Config *imc_update;
754 E_Input_Method_Config *imc_update_old;
755
756 imc_update = E_NEW(E_Input_Method_Config, 1);
757
758 imc_update->version = E_INTL_INPUT_METHOD_CONFIG_VERSION;
759
760 /* TODO: need to only add if the string is not empty */
761 imc_update->e_im_name = eina_stringshare_add(cfdata->imc.e_im_name);
762 imc_update->e_im_exec = eina_stringshare_add(cfdata->imc.e_im_exec);
763 imc_update->e_im_setup_exec = eina_stringshare_add(cfdata->imc.e_im_setup_exec);
764 imc_update->gtk_im_module = eina_stringshare_add(cfdata->imc.gtk_im_module);
765 imc_update->qt_im_module = eina_stringshare_add(cfdata->imc.qt_im_module);
766 imc_update->xmodifiers = eina_stringshare_add(cfdata->imc.xmodifiers);
767 imc_update->ecore_imf_module = eina_stringshare_add(cfdata->imc.ecore_imf_module);
768
769 /* look for changes to this file and remove them */
770 imc_update_old = eina_hash_find(cfdata->imc_change_map, cfdata->imc_current);
771 if (imc_update_old)
772 {
773 eina_hash_del(cfdata->imc_change_map, cfdata->imc_current, NULL);
774 e_intl_input_method_config_free(imc_update_old);
775 }
776 if (!cfdata->imc_change_map)
777 cfdata->imc_change_map = eina_hash_string_superfast_new(NULL);
778 eina_hash_add(cfdata->imc_change_map, cfdata->imc_current, imc_update);
779 }
780 }
781
782 /* Get a new filename, and create the new file */
783 static const char *
_e_imc_file_name_new_get(void)784 _e_imc_file_name_new_get(void)
785 {
786 char path[PATH_MAX];
787 int i;
788
789 for (i = 0; i < 32; i++)
790 {
791 snprintf(path, sizeof(path), "%s/new_input_method-%02d.imc",
792 e_intl_imc_personal_path_get(), i);
793 if (!ecore_file_exists(path))
794 return eina_stringshare_add(path);
795 }
796
797 return NULL;
798 }
799
800 /** End IMC Utility Functions **/
801
802 /** Import Dialog **/
803 void
e_int_config_imc_import_done(E_Config_Dialog * dia)804 e_int_config_imc_import_done(E_Config_Dialog *dia)
805 {
806 E_Config_Dialog_Data *cfdata;
807
808 cfdata = dia->cfdata;
809 cfdata->win_import = NULL;
810 }
811
812 static void
_cb_import(void * data1,void * data2 EINA_UNUSED)813 _cb_import(void *data1, void *data2 EINA_UNUSED)
814 {
815 E_Config_Dialog_Data *cfdata;
816
817 cfdata = data1;
818 if (cfdata->win_import)
819 elm_win_raise(cfdata->win_import);
820 else
821 cfdata->win_import = e_int_config_imc_import(cfdata->cfd);
822 }
823
824 void
e_int_config_imc_update(E_Config_Dialog * dia,const char * file)825 e_int_config_imc_update(E_Config_Dialog *dia, const char *file)
826 {
827 E_Config_Dialog_Data *cfdata;
828
829 cfdata = dia->cfdata;
830 cfdata->fmdir = 1;
831 eina_stringshare_del(cfdata->imc_current);
832 cfdata->imc_current = eina_stringshare_add(file);
833 e_widget_radio_toggle_set(cfdata->o_personal, 1);
834
835 if (cfdata->o_fm)
836 e_fm2_path_set(cfdata->o_fm, e_intl_imc_personal_path_get(), "/");
837 _e_imc_form_fill(cfdata);
838 if (cfdata->o_frame)
839 e_widget_change(cfdata->o_frame);
840 }
841
842 static Evas_Object *
_advanced_create_widgets(E_Config_Dialog * cfd,Evas * evas,E_Config_Dialog_Data * cfdata)843 _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
844 {
845 Evas_Object *o, *rt, *ot;
846 Evas_Object *ow, *of;
847 const char *path;
848 E_Fm2_Config fmc;
849 E_Radio_Group *rg;
850
851 o = e_widget_list_add(evas, 0, 1);
852
853 rg = e_widget_radio_group_new(&(cfdata->fmdir));
854 ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
855 rt = e_widget_table_add(e_win_evas_win_get(evas), 1);
856
857 ow = e_widget_radio_add(evas, _("Personal"), 0, rg);
858 cfdata->o_personal = ow;
859 e_widget_on_change_hook_set(ow, _cb_dir, cfdata);
860 e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0);
861
862 ow = e_widget_radio_add(evas, _("System"), 1, rg);
863 cfdata->o_system = ow;
864 e_widget_on_change_hook_set(ow, _cb_dir, cfdata);
865 e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0);
866
867 e_widget_table_object_append(ot, rt, 0, 0, 1, 1, 0, 0, 0, 0);
868
869 ow = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
870 _cb_button_up, cfdata, NULL);
871 cfdata->o_up_button = ow;
872 e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 0, 0, 0, 0);
873
874 if (cfdata->fmdir == 1)
875 path = e_intl_imc_system_path_get();
876 else
877 path = e_intl_imc_personal_path_get();
878
879 ow = e_fm2_add(evas);
880 cfdata->o_fm = ow;
881 memset(&fmc, 0, sizeof(E_Fm2_Config));
882 fmc.view.mode = E_FM2_VIEW_MODE_LIST;
883 fmc.view.open_dirs_in_place = 1;
884 fmc.view.selector = 1;
885 fmc.view.single_click = 0;
886 fmc.view.no_subdir_jump = 0;
887 fmc.icon.list.w = 16;
888 fmc.icon.list.h = 16;
889 fmc.icon.fixed.w = 1;
890 fmc.icon.fixed.h = 1;
891 fmc.icon.extension.show = 0;
892 fmc.icon.key_hint = NULL;
893 fmc.list.sort.no_case = 1;
894 fmc.list.sort.dirs.first = 0;
895 fmc.list.sort.dirs.last = 1;
896 fmc.selection.single = 1;
897 fmc.selection.windows_modifiers = 0;
898 e_fm2_config_set(ow, &fmc);
899 e_fm2_icon_menu_flags_set(ow, E_FM2_MENU_NO_SHOW_HIDDEN);
900
901 evas_object_smart_callback_add(ow, "dir_changed",
902 _cb_files_changed, cfdata);
903 evas_object_smart_callback_add(ow, "selection_change",
904 _cb_files_selection_change, cfdata);
905 evas_object_smart_callback_add(ow, "changed",
906 _cb_files_files_changed, cfdata);
907 evas_object_smart_callback_add(ow, "files_deleted",
908 _cb_files_files_deleted, cfdata);
909 cfdata->o_frame = NULL;
910 e_fm2_path_set(ow, path, "/");
911
912 of = e_widget_scrollframe_pan_add(evas, ow,
913 e_fm2_pan_set,
914 e_fm2_pan_get,
915 e_fm2_pan_max_get,
916 e_fm2_pan_child_size_get);
917 cfdata->o_frame = of;
918 e_widget_size_min_set(of, 160, 160);
919 e_widget_table_object_append(ot, of, 0, 2, 1, 1, 1, 1, 1, 1);
920 e_widget_list_object_append(o, ot, 1, 1, 0.0);
921
922 ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
923
924 ow = e_widget_check_add(evas, _("Use No Input Method"),
925 &(cfdata->imc_disable));
926 cfdata->gui.imc_advanced_disable = ow;
927 e_widget_table_object_append(ot, ow, 0, 0, 1, 1, 1, 0, 0, 0);
928
929 ow = e_widget_button_add(evas, _("New"), "document-new",
930 _cb_new, cfdata, NULL);
931 e_widget_table_object_append(ot, ow, 1, 0, 1, 1, 1, 0, 0, 0);
932
933 ow = e_widget_button_add(evas, _("Import..."), "preferences-imc",
934 _cb_import, cfdata, NULL);
935 e_widget_table_object_append(ot, ow, 2, 0, 1, 1, 1, 0, 0, 0);
936
937 of = e_widget_frametable_add(evas, _("Input Method Parameters"), 0);
938 e_widget_frametable_content_align_set(of, 0.0, 0.0);
939
940 ow = e_widget_label_add(evas, _("Name"));
941 e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 1, 0, 0);
942 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.e_im_name), NULL, NULL, NULL);
943 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
944 cfdata->gui.e_im_name = ow;
945 e_widget_frametable_object_append(of, ow, 1, 0, 1, 1, 1, 1, 1, 0);
946
947 ow = e_widget_label_add(evas, _("Execute Command"));
948 e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 1, 0, 0);
949 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.e_im_exec), NULL, NULL, NULL);
950 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
951 cfdata->gui.e_im_exec = ow;
952 e_widget_frametable_object_append(of, ow, 1, 1, 1, 1, 1, 1, 1, 0);
953
954 ow = e_widget_label_add(evas, _("Setup Command"));
955 e_widget_frametable_object_append(of, ow, 0, 2, 1, 1, 1, 1, 0, 0);
956 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.e_im_setup_exec), NULL, NULL, NULL);
957 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
958 cfdata->gui.e_im_setup_exec = ow;
959 e_widget_frametable_object_append(of, ow, 1, 2, 1, 1, 1, 1, 1, 0);
960
961 e_widget_table_object_append(ot, of, 0, 1, 3, 1, 1, 1, 1, 1);
962
963 of = e_widget_frametable_add(evas, _("Exported Environment Variables"), 0);
964 e_widget_frametable_content_align_set(of, 0.0, 0.0);
965
966 ow = e_widget_label_add(evas, "GTK_IM_MODULE");
967 e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 1, 0, 0);
968 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.gtk_im_module), NULL, NULL, NULL);
969 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
970 cfdata->gui.gtk_im_module = ow;
971 e_widget_frametable_object_append(of, ow, 1, 0, 1, 1, 1, 1, 1, 0);
972
973 ow = e_widget_label_add(evas, "QT_IM_MODULE");
974 e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 1, 0, 0);
975 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.qt_im_module), NULL, NULL, NULL);
976 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
977 cfdata->gui.qt_im_module = ow;
978 e_widget_frametable_object_append(of, ow, 1, 1, 1, 1, 1, 1, 1, 0);
979
980 ow = e_widget_label_add(evas, "XMODIFIERS");
981 e_widget_frametable_object_append(of, ow, 0, 2, 1, 1, 1, 1, 0, 0);
982 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.xmodifiers), NULL, NULL, NULL);
983 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
984 cfdata->gui.xmodifiers = ow;
985 e_widget_frametable_object_append(of, ow, 1, 2, 1, 1, 1, 1, 1, 0);
986
987 ow = e_widget_label_add(evas, "ECORE_IMF_MODULE");
988 e_widget_frametable_object_append(of, ow, 0, 3, 1, 1, 1, 1, 0, 0);
989 ow = e_widget_entry_add(cfd->dia->win, &(cfdata->imc.ecore_imf_module), NULL, NULL, NULL);
990 e_widget_on_change_hook_set(ow, _e_imc_entry_change_cb, cfdata);
991 cfdata->gui.ecore_imf_module = ow;
992 e_widget_frametable_object_append(of, ow, 1, 3, 1, 1, 1, 1, 1, 0);
993
994
995 e_widget_table_object_append(ot, of, 0, 2, 3, 1, 1, 1, 1, 1);
996
997 ow = e_widget_button_add(evas, _("Setup Selected Input Method"), "configure", _e_imc_adv_setup_cb, cfdata, NULL);
998 e_widget_table_object_append(ot, ow, 0, 3, 3, 1, 1, 1, 1, 0);
999 cfdata->gui.imc_advanced_setup = ow;
1000
1001 e_widget_list_object_append(o, ot, 1, 1, 0.0);
1002
1003
1004 _e_imc_form_fill(cfdata);
1005
1006 return o;
1007 }
1008
1009