Add a task to copy configuration files to user's HOME dir from data dir for multi...
[platform/core/uifw/e17.git] / src / bin / e_xkb.c
1 #include "e.h"
2
3 static void _e_xkb_update_event(int);
4
5 EAPI int E_EVENT_XKB_CHANGED = 0;
6
7 /* externally accessible functions */
8 EAPI int
9 e_xkb_init(void)
10 {
11    E_EVENT_XKB_CHANGED = ecore_event_type_new();
12    e_xkb_update(-1);
13    return 1;
14 }
15
16 EAPI int
17 e_xkb_shutdown(void)
18 {
19    return 1;
20 }
21
22 EAPI void
23 e_xkb_update(int cur_group)
24 {
25    E_Config_XKB_Layout *cl;
26    E_Config_XKB_Option *op;
27    Eina_List *l;
28    Eina_Strbuf *buf;
29
30    if (!e_config->xkb.used_layouts) return;
31    if (cur_group != -1)
32      {
33         ecore_x_xkb_select_group(cur_group);
34         return;
35      }
36    /* We put an empty -option here in order to override all previously
37     * set options.
38     */
39
40    buf = eina_strbuf_new();
41    eina_strbuf_append(buf, "setxkbmap -layout '");
42
43    EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
44      {
45         if (cl->name)
46           {
47              eina_strbuf_append(buf, cl->name);
48              eina_strbuf_append(buf, ",");
49           }
50      }
51    eina_strbuf_append(buf, "' -variant '");
52
53    EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
54      {
55         if (cl->variant)
56           {
57              if (strcmp(cl->variant, "basic"))
58                eina_strbuf_append(buf, cl->variant);
59              eina_strbuf_append(buf, ",");
60              /* workaround xkb bug where basic variants work with ',' at the
61              * end, but dvorak (and mayby others) don't */
62 //           if (!strcmp(cl->variant, "basic")) eina_strbuf_append(buf, ",");
63           }
64         else
65           eina_strbuf_append(buf, ",");
66      }
67    eina_strbuf_append(buf, "'");
68
69    /* use first entry in used layouts */
70    cl = e_config->xkb.used_layouts->data;
71
72    if (cl->model)
73      {
74         eina_strbuf_append(buf, " -model '");
75         if (strcmp(cl->model, "default"))
76           eina_strbuf_append(buf, cl->model);
77         else if ((e_config->xkb.default_model) &&
78                  (strcmp(e_config->xkb.default_model, "default")))
79           eina_strbuf_append(buf, e_config->xkb.default_model);
80         else
81           eina_strbuf_append(buf, "default");
82         eina_strbuf_append(buf, "'");
83      }
84
85    /* clear options */
86    eina_strbuf_append(buf, " -option ");
87
88    /* add in selected options */
89    EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
90      {
91         if (op->name)
92           {
93              eina_strbuf_append(buf, " -option '");
94              eina_strbuf_append(buf, op->name);
95              eina_strbuf_append(buf, "'");
96           }
97      }
98    INF("SET XKB RUN: %s", eina_strbuf_string_get(buf));
99    ecore_exe_run(eina_strbuf_string_get(buf), NULL);
100    eina_strbuf_free(buf);
101 }
102
103 EAPI void
104 e_xkb_layout_next(void)
105 {
106    int nb_groups = eina_list_count(e_config->xkb.used_layouts);
107    
108    e_config->xkb.cur_group = (e_config->xkb.cur_group + 1) % nb_groups;
109    e_xkb_update(e_config->xkb.cur_group);
110    _e_xkb_update_event(e_config->xkb.cur_group);
111    e_config_save_queue();
112 }
113
114 EAPI void
115 e_xkb_layout_prev(void)
116 {
117    int nb_groups = eina_list_count(e_config->xkb.used_layouts);
118    
119    e_config->xkb.cur_group = (e_config->xkb.cur_group == 0) ? 
120      (nb_groups - 1) : (e_config->xkb.cur_group - 1);
121    e_xkb_update(e_config->xkb.cur_group);
122    _e_xkb_update_event(e_config->xkb.cur_group);
123    e_config_save_queue();
124 }
125
126 EAPI void
127 e_xkb_layout_set(const char *name)
128 {
129    Eina_List *l;
130    E_Config_XKB_Layout *cl;
131    int cur_group = -1;
132
133    if (!name) return;
134    EINA_LIST_FOREACH(eina_list_next(e_config->xkb.used_layouts), l, cl)
135      {
136         cur_group++;
137         if (!cl->name) continue;
138         if (!strcmp(cl->name, name))
139           {
140              e_xkb_update(cur_group);
141              _e_xkb_update_event(cur_group);
142              break;
143           }
144      }
145    e_config_save_queue();
146 }
147
148 EAPI const char *
149 e_xkb_layout_name_reduce(const char *name)
150 {
151    if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1;
152    return name;
153 }
154
155 EAPI void
156 e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name)
157 {
158    int w, h;
159    char buf[PATH_MAX];
160
161    e_xkb_flag_file_get(buf, sizeof(buf), name);
162    e_icon_file_set(eicon, buf);
163    e_icon_size_get(eicon, &w, &h);
164    edje_extern_object_aspect_set(eicon, EDJE_ASPECT_CONTROL_BOTH, w, h);
165 }
166
167 EAPI void
168 e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name)
169 {
170    name = e_xkb_layout_name_reduce(name);
171    snprintf(buf, bufsize, "%s/data/flags/%s_flag.png",
172             e_prefix_data_get(), name ? name : "unknown");
173    if (!ecore_file_exists(buf))
174      snprintf(buf, bufsize, "%s/data/flags/unknown_flag.png",
175               e_prefix_data_get());
176 }
177
178 static void
179 _e_xkb_update_event(int cur_group)
180 {
181    ecore_event_add(E_EVENT_XKB_CHANGED, NULL, NULL, (intptr_t*)(long)cur_group);
182 }