2012-04-30 02:52:05 -07:00
|
|
|
#include "e.h"
|
|
|
|
|
2012-08-18 04:41:23 -07:00
|
|
|
static void _e_xkb_update_event(int);
|
2012-04-30 02:52:05 -07:00
|
|
|
|
2012-10-03 02:00:12 -07:00
|
|
|
static int _e_xkb_cur_group = -1;
|
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
EAPI int E_EVENT_XKB_CHANGED = 0;
|
|
|
|
|
|
|
|
/* externally accessible functions */
|
|
|
|
EAPI int
|
|
|
|
e_xkb_init(void)
|
|
|
|
{
|
|
|
|
E_EVENT_XKB_CHANGED = ecore_event_type_new();
|
2012-08-18 04:41:23 -07:00
|
|
|
e_xkb_update(-1);
|
2012-10-03 02:00:12 -07:00
|
|
|
if (e_config->xkb.cur_layout) e_xkb_layout_set(e_config->xkb.cur_layout);
|
|
|
|
else if (e_config->xkb.selected_layout) e_xkb_layout_set(e_config->xkb.selected_layout);
|
|
|
|
else if (e_config->xkb.used_layouts)
|
|
|
|
{
|
|
|
|
E_Config_XKB_Layout *cl;
|
|
|
|
|
|
|
|
cl = eina_list_data_get(e_config->xkb.used_layouts);
|
|
|
|
e_xkb_layout_set(cl->name);
|
|
|
|
}
|
2012-04-30 02:52:05 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI int
|
|
|
|
e_xkb_shutdown(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-08-18 04:41:23 -07:00
|
|
|
e_xkb_update(int cur_group)
|
2012-06-20 23:19:43 -07:00
|
|
|
{
|
2012-04-30 02:52:05 -07:00
|
|
|
E_Config_XKB_Layout *cl;
|
|
|
|
E_Config_XKB_Option *op;
|
|
|
|
Eina_List *l;
|
|
|
|
Eina_Strbuf *buf;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
if (!e_config->xkb.used_layouts) return;
|
2012-08-18 04:41:23 -07:00
|
|
|
if (cur_group != -1)
|
|
|
|
{
|
2012-10-03 02:00:12 -07:00
|
|
|
_e_xkb_cur_group = cur_group;
|
2012-10-02 05:14:53 -07:00
|
|
|
ecore_x_xkb_select_group(cur_group);
|
|
|
|
return;
|
2012-08-18 04:41:23 -07:00
|
|
|
}
|
2012-04-30 02:52:05 -07:00
|
|
|
/* We put an empty -option here in order to override all previously
|
|
|
|
* set options.
|
|
|
|
*/
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
buf = eina_strbuf_new();
|
2012-08-18 04:41:23 -07:00
|
|
|
eina_strbuf_append(buf, "setxkbmap -layout '");
|
2012-05-01 19:50:48 -07:00
|
|
|
|
2012-08-18 04:41:23 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
|
|
|
|
{
|
|
|
|
if (cl->name)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, cl->name);
|
|
|
|
eina_strbuf_append(buf, ",");
|
|
|
|
}
|
|
|
|
}
|
2012-08-22 04:56:12 -07:00
|
|
|
eina_strbuf_append(buf, "' -variant '");
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-08-22 04:56:12 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
|
2012-05-01 20:20:19 -07:00
|
|
|
{
|
2012-08-22 04:56:12 -07:00
|
|
|
if (cl->variant)
|
|
|
|
{
|
2012-10-02 05:12:03 -07:00
|
|
|
if (!strcmp(cl->variant, "basic")) continue;
|
|
|
|
eina_strbuf_append(buf, cl->variant);
|
2012-08-22 04:56:12 -07:00
|
|
|
eina_strbuf_append(buf, ",");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
eina_strbuf_append(buf, ",");
|
2012-05-01 20:20:19 -07:00
|
|
|
}
|
2012-08-22 04:56:12 -07:00
|
|
|
eina_strbuf_append(buf, "'");
|
|
|
|
|
|
|
|
/* use first entry in used layouts */
|
|
|
|
cl = e_config->xkb.used_layouts->data;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
if (cl->model)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, " -model '");
|
|
|
|
if (strcmp(cl->model, "default"))
|
|
|
|
eina_strbuf_append(buf, cl->model);
|
|
|
|
else if ((e_config->xkb.default_model) &&
|
|
|
|
(strcmp(e_config->xkb.default_model, "default")))
|
|
|
|
eina_strbuf_append(buf, e_config->xkb.default_model);
|
|
|
|
else
|
|
|
|
eina_strbuf_append(buf, "default");
|
|
|
|
eina_strbuf_append(buf, "'");
|
|
|
|
}
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-05-02 00:37:09 -07:00
|
|
|
/* clear options */
|
|
|
|
eina_strbuf_append(buf, " -option ");
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-05-02 00:37:09 -07:00
|
|
|
/* add in selected options */
|
2012-04-30 02:52:05 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
|
|
|
|
{
|
|
|
|
if (op->name)
|
|
|
|
{
|
|
|
|
eina_strbuf_append(buf, " -option '");
|
|
|
|
eina_strbuf_append(buf, op->name);
|
|
|
|
eina_strbuf_append(buf, "'");
|
|
|
|
}
|
|
|
|
}
|
2012-06-13 08:17:23 -07:00
|
|
|
INF("SET XKB RUN: %s", eina_strbuf_string_get(buf));
|
2012-04-30 02:52:05 -07:00
|
|
|
ecore_exe_run(eina_strbuf_string_get(buf), NULL);
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_xkb_layout_next(void)
|
2012-06-20 23:19:43 -07:00
|
|
|
{
|
2012-08-18 04:41:23 -07:00
|
|
|
int nb_groups = eina_list_count(e_config->xkb.used_layouts);
|
2012-10-02 05:14:53 -07:00
|
|
|
|
2012-08-18 04:41:23 -07:00
|
|
|
e_config->xkb.cur_group = (e_config->xkb.cur_group + 1) % nb_groups;
|
|
|
|
e_xkb_update(e_config->xkb.cur_group);
|
|
|
|
_e_xkb_update_event(e_config->xkb.cur_group);
|
2012-04-30 02:52:05 -07:00
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_xkb_layout_prev(void)
|
2012-06-20 23:19:43 -07:00
|
|
|
{
|
2012-08-18 04:41:23 -07:00
|
|
|
int nb_groups = eina_list_count(e_config->xkb.used_layouts);
|
2012-10-02 05:14:53 -07:00
|
|
|
|
|
|
|
e_config->xkb.cur_group = (e_config->xkb.cur_group == 0) ?
|
2012-08-18 04:41:23 -07:00
|
|
|
(nb_groups - 1) : (e_config->xkb.cur_group - 1);
|
|
|
|
e_xkb_update(e_config->xkb.cur_group);
|
|
|
|
_e_xkb_update_event(e_config->xkb.cur_group);
|
2012-04-30 02:52:05 -07:00
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
2012-10-03 02:00:12 -07:00
|
|
|
/* always use this function to get the current layout's name
|
|
|
|
* to ensure the most accurate results!!!
|
|
|
|
*/
|
|
|
|
EAPI const char *
|
|
|
|
e_xkb_layout_get(void)
|
|
|
|
{
|
|
|
|
E_Config_XKB_Layout *cl;
|
|
|
|
unsigned int n = 0;
|
|
|
|
|
|
|
|
if (e_config->xkb.cur_layout) return e_config->xkb.cur_layout;
|
|
|
|
if (_e_xkb_cur_group >= 0)
|
|
|
|
n = _e_xkb_cur_group;
|
|
|
|
cl = eina_list_nth(e_config->xkb.used_layouts, n);
|
|
|
|
return cl ? cl->name : NULL;
|
|
|
|
}
|
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
EAPI void
|
|
|
|
e_xkb_layout_set(const char *name)
|
2012-06-20 23:19:43 -07:00
|
|
|
{
|
2012-04-30 02:52:05 -07:00
|
|
|
Eina_List *l;
|
|
|
|
E_Config_XKB_Layout *cl;
|
2012-08-18 04:41:23 -07:00
|
|
|
int cur_group = -1;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
if (!name) return;
|
2012-10-03 02:00:12 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
|
2012-04-30 02:52:05 -07:00
|
|
|
{
|
2012-08-18 04:41:23 -07:00
|
|
|
cur_group++;
|
2012-04-30 02:52:05 -07:00
|
|
|
if (!cl->name) continue;
|
2012-10-03 02:00:12 -07:00
|
|
|
if ((cl->name == name) || (!strcmp(cl->name, name)))
|
2012-04-30 02:52:05 -07:00
|
|
|
{
|
2012-10-03 02:00:12 -07:00
|
|
|
eina_stringshare_replace(&e_config->xkb.cur_layout, cl->name);
|
|
|
|
INF("Setting keyboard layout: %s", name);
|
2012-08-18 04:41:23 -07:00
|
|
|
e_xkb_update(cur_group);
|
|
|
|
_e_xkb_update_event(cur_group);
|
2012-04-30 02:52:05 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI const char *
|
|
|
|
e_xkb_layout_name_reduce(const char *name)
|
|
|
|
{
|
|
|
|
if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1;
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name)
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
char buf[PATH_MAX];
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-04-30 02:52:05 -07:00
|
|
|
e_xkb_flag_file_get(buf, sizeof(buf), name);
|
|
|
|
e_icon_file_set(eicon, buf);
|
|
|
|
e_icon_size_get(eicon, &w, &h);
|
|
|
|
edje_extern_object_aspect_set(eicon, EDJE_ASPECT_CONTROL_BOTH, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name)
|
|
|
|
{
|
|
|
|
name = e_xkb_layout_name_reduce(name);
|
|
|
|
snprintf(buf, bufsize, "%s/data/flags/%s_flag.png",
|
|
|
|
e_prefix_data_get(), name ? name : "unknown");
|
|
|
|
if (!ecore_file_exists(buf))
|
|
|
|
snprintf(buf, bufsize, "%s/data/flags/unknown_flag.png",
|
2012-08-18 04:41:23 -07:00
|
|
|
e_prefix_data_get());
|
2012-04-30 02:52:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-18 04:41:23 -07:00
|
|
|
_e_xkb_update_event(int cur_group)
|
2012-04-30 02:52:05 -07:00
|
|
|
{
|
2012-10-02 05:14:53 -07:00
|
|
|
ecore_event_add(E_EVENT_XKB_CHANGED, NULL, NULL, (intptr_t *)(long)cur_group);
|
2012-04-30 02:52:05 -07:00
|
|
|
}
|
2012-10-02 05:14:53 -07:00
|
|
|
|