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