3 static void _e_xkb_update_event(int);
5 EAPI int E_EVENT_XKB_CHANGED = 0;
7 /* externally accessible functions */
11 E_EVENT_XKB_CHANGED = ecore_event_type_new();
23 e_xkb_update(int cur_group)
25 E_Config_XKB_Layout *cl;
26 E_Config_XKB_Option *op;
30 if (!e_config->xkb.used_layouts) return;
33 ecore_x_xkb_select_group(cur_group);
36 /* We put an empty -option here in order to override all previously
40 buf = eina_strbuf_new();
41 eina_strbuf_append(buf, "setxkbmap -layout '");
43 EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
47 eina_strbuf_append(buf, cl->name);
48 eina_strbuf_append(buf, ",");
51 eina_strbuf_append(buf, "' -variant '");
53 EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
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, ",");
65 eina_strbuf_append(buf, ",");
67 eina_strbuf_append(buf, "'");
69 /* use first entry in used layouts */
70 cl = e_config->xkb.used_layouts->data;
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);
81 eina_strbuf_append(buf, "default");
82 eina_strbuf_append(buf, "'");
86 eina_strbuf_append(buf, " -option ");
88 /* add in selected options */
89 EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
93 eina_strbuf_append(buf, " -option '");
94 eina_strbuf_append(buf, op->name);
95 eina_strbuf_append(buf, "'");
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);
104 e_xkb_layout_next(void)
106 int nb_groups = eina_list_count(e_config->xkb.used_layouts);
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();
115 e_xkb_layout_prev(void)
117 int nb_groups = eina_list_count(e_config->xkb.used_layouts);
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();
127 e_xkb_layout_set(const char *name)
130 E_Config_XKB_Layout *cl;
134 EINA_LIST_FOREACH(eina_list_next(e_config->xkb.used_layouts), l, cl)
137 if (!cl->name) continue;
138 if (!strcmp(cl->name, name))
140 e_xkb_update(cur_group);
141 _e_xkb_update_event(cur_group);
145 e_config_save_queue();
149 e_xkb_layout_name_reduce(const char *name)
151 if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1;
156 e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name)
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);
168 e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name)
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());
179 _e_xkb_update_event(int cur_group)
181 ecore_event_add(E_EVENT_XKB_CHANGED, NULL, NULL, (intptr_t*)(long)cur_group);