diff --git a/config/illume/e.src b/config/illume/e.src
index 28b7a823b..f075f855b 100644
--- a/config/illume/e.src
+++ b/config/illume/e.src
@@ -1,5 +1,5 @@
group "E_Config" struct {
- value "config_version" int: 65864;
+ value "config_version" int: 65865;
value "show_splash" int: 1;
value "init_default_theme" string: "default.edj";
value "desktop_default_name" string: "Desktop %i, %i";
@@ -1763,4 +1763,13 @@ group "E_Config" struct {
value "icon" string: "DESKTOP";
}
}
+ group "xkb.used_layouts" list {
+ group "E_Config_XKB_Layout" struct {
+ value "name" string: "us";
+ value "model" string: "default";
+ value "variant" string: "basic";
+ }
+ }
+ value "xkb.only_label" int: 0;
+ value "xkb.default_model" string: "default";
}
diff --git a/config/standard/e.src b/config/standard/e.src
index 5528523b2..9de8ab34c 100644
--- a/config/standard/e.src
+++ b/config/standard/e.src
@@ -1,5 +1,5 @@
group "E_Config" struct {
- value "config_version" int: 65864;
+ value "config_version" int: 65865;
value "show_splash" int: 1;
value "init_default_theme" string: "default.edj";
value "desktop_default_name" string: "Desktop %i, %i";
@@ -1978,4 +1978,13 @@ group "E_Config" struct {
value "priority" int: 0;
}
}
+ group "xkb.used_layouts" list {
+ group "E_Config_XKB_Layout" struct {
+ value "name" string: "us";
+ value "model" string: "default";
+ value "variant" string: "basic";
+ }
+ }
+ value "xkb.only_label" int: 0;
+ value "xkb.default_model" string: "default";
}
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 186b52eea..292569d7f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -125,6 +125,7 @@ src/bin/e_widget_table.c
src/bin/e_widget_textblock.c
src/bin/e_win.c
src/bin/e_xinerama.c
+src/bin/e_xkb.c
src/bin/e_zone.c
src/modules/battery/e_mod_config.c
src/modules/battery/e_mod_main.c
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index 316ad0daa..55188b4c0 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -183,6 +183,7 @@ e_widget_toolbar.h \
e_widget_toolbook.h \
e_win.h \
e_xinerama.h \
+e_xkb.h \
e_xsettings.h \
e_zone.h
@@ -337,6 +338,7 @@ e_widget_toolbar.c \
e_widget_toolbook.c \
e_win.c \
e_xinerama.c \
+e_xkb.c \
e_xsettings.c \
e_zone.c \
$(ENLIGHTENMENTHEADERS)
diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c
index 2356688f4..d28330c93 100644
--- a/src/bin/e_actions.c
+++ b/src/bin/e_actions.c
@@ -2672,6 +2672,22 @@ ACT_FN_GO(backlight_adjust, )
e_backlight_level_set(zone, e_backlight_level_get(zone) + ((double)v / 100.0), -1.0);
}
+ACT_FN_GO(kbd_layout, )
+{
+ if (!params) return;
+// e_xkb_layout_set(params);
+}
+
+ACT_FN_GO(kbd_layout_next, __UNUSED__)
+{
+// e_xkb_layout_next();
+}
+
+ACT_FN_GO(kbd_layout_prev, __UNUSED__)
+{
+// e_xkb_layout_prev();
+}
+
/* local subsystem globals */
static Eina_Hash *actions = NULL;
static Eina_List *action_list = NULL;
@@ -3133,6 +3149,19 @@ e_actions_init(void)
ACT_END_KEY(delayed_action);
ACT_END_MOUSE(delayed_action);
+ /* xkb */
+ ACT_GO(kbd_layout);
+ e_action_predef_name_set(N_("Keyboard Layouts"),
+ N_("Use keyboard layout"), "kbd_layout",
+ NULL, "syntax: Keyboard-layout-name, example: us", 1);
+ ACT_GO(kbd_layout_next);
+ e_action_predef_name_set(N_("Keyboard Layouts"),
+ N_("Next keyboard layout"), "kbd_layout_next",
+ NULL, NULL, 0);
+ ACT_GO(kbd_layout_prev);
+ e_action_predef_name_set(N_("Keyboard Layouts"),
+ N_("Previous keyboard layout"), "kbd_layout_prev",
+ NULL, NULL, 0);
return 1;
}
diff --git a/src/bin/e_config.c b/src/bin/e_config.c
index db7f1bfd5..ebf2884b1 100644
--- a/src/bin/e_config.c
+++ b/src/bin/e_config.c
@@ -58,6 +58,8 @@ static E_Config_DD *_e_config_randr_serialized_output_policy_edd = NULL;
static E_Config_DD *_e_config_randr_serialized_output_edd = NULL;
static E_Config_DD *_e_config_randr_mode_info_edd = NULL;
static E_Config_DD *_e_config_randr_serialized_crtc_edd = NULL;
+static E_Config_DD *_e_config_xkb_layout_edd = NULL;
+static E_Config_DD *_e_config_xkb_option_edd = NULL;
EAPI int E_EVENT_CONFIG_ICON_THEME = 0;
@@ -605,6 +607,24 @@ e_config_init(void)
E_CONFIG_LIST(D, T, serialized_setups_12, _e_config_randr_serialized_setup_12_edd);
E_CONFIG_LIST(D, T, outputs_policies, _e_config_randr_serialized_output_policy_edd);
+ _e_config_xkb_layout_edd = E_CONFIG_DD_NEW("E_Config_XKB_Layout",
+ E_Config_XKB_Layout);
+#undef T
+#undef D
+#define T E_Config_XKB_Layout
+#define D _e_config_xkb_layout_edd
+ E_CONFIG_VAL(D, T, name, STR);
+ E_CONFIG_VAL(D, T, model, STR);
+ E_CONFIG_VAL(D, T, variant, STR);
+
+ _e_config_xkb_option_edd = E_CONFIG_DD_NEW("E_Config_XKB_Option",
+ E_Config_XKB_Option);
+#undef T
+#undef D
+#define T E_Config_XKB_Option
+#define D _e_config_xkb_option_edd
+ E_CONFIG_VAL(D, T, name, STR);
+
_e_config_edd = E_CONFIG_DD_NEW("E_Config", E_Config);
#undef T
#undef D
@@ -891,7 +911,12 @@ e_config_init(void)
E_CONFIG_VAL(D, T, update.check, UCHAR);
E_CONFIG_VAL(D, T, update.later, UCHAR);
-
+
+ E_CONFIG_LIST(D, T, xkb.used_layouts, _e_config_xkb_layout_edd);
+ E_CONFIG_LIST(D, T, xkb.used_options, _e_config_xkb_option_edd);
+ E_CONFIG_VAL(D, T, xkb.only_label, INT);
+ E_CONFIG_VAL(D, T, xkb.default_model, STR);
+
e_config_load();
e_config_save_queue();
@@ -924,6 +949,8 @@ e_config_shutdown(void)
E_CONFIG_DD_FREE(_e_config_mime_icon_edd);
E_CONFIG_DD_FREE(_e_config_syscon_action_edd);
E_CONFIG_DD_FREE(_e_config_env_var_edd);
+ E_CONFIG_DD_FREE(_e_config_xkb_layout_edd);
+ E_CONFIG_DD_FREE(_e_config_xkb_option_edd);
//E_CONFIG_DD_FREE(_e_config_randr_serialized_setup_edd);
return 1;
}
@@ -1870,9 +1897,28 @@ _e_config_free(E_Config *ecf)
E_Path_Dir *epd;
E_Remember *rem;
E_Config_Env_Var *evr;
+ E_Config_XKB_Layout *cl;
+ E_Config_XKB_Option *op;
if (!ecf) return;
+ if (e_config->xkb.default_model)
+ eina_stringshare_del(e_config->xkb.default_model);
+
+ EINA_LIST_FREE(e_config->xkb.used_layouts, cl)
+ {
+ eina_stringshare_del(cl->name);
+ eina_stringshare_del(cl->model);
+ eina_stringshare_del(cl->variant);
+ E_FREE(cl);
+ }
+
+ EINA_LIST_FREE(e_config->xkb.used_options, op)
+ {
+ eina_stringshare_del(op->name);
+ E_FREE(op);
+ }
+
EINA_LIST_FREE(ecf->modules, em)
{
if (em->name) eina_stringshare_del(em->name);
diff --git a/src/bin/e_config.h b/src/bin/e_config.h
index 86e278fa4..13a0091a5 100644
--- a/src/bin/e_config.h
+++ b/src/bin/e_config.h
@@ -20,6 +20,9 @@ typedef struct _E_Config_Shelf_Desk E_Config_Shelf_Desk;
typedef struct _E_Config_Mime_Icon E_Config_Mime_Icon;
typedef struct _E_Config_Syscon_Action E_Config_Syscon_Action;
typedef struct _E_Config_Env_Var E_Config_Env_Var;
+typedef struct _E_Config_XKB_Layout E_Config_XKB_Layout;
+typedef struct _E_Config_XKB_Option E_Config_XKB_Option;
+
typedef struct _E_Event_Config_Icon_Theme E_Event_Config_Icon_Theme;
#else
@@ -33,7 +36,7 @@ typedef struct _E_Event_Config_Icon_Theme E_Event_Config_Icon_Theme;
/* increment this whenever a new set of config values are added but the users
* config doesn't need to be wiped - simply new values need to be put in
*/
-#define E_CONFIG_FILE_GENERATION 0x0148
+#define E_CONFIG_FILE_GENERATION 0x0149
#define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH << 16) | E_CONFIG_FILE_GENERATION)
struct _E_Config
@@ -340,6 +343,13 @@ struct _E_Config
unsigned char check; // INTERNAL
unsigned char later; // INTERNAL
} update;
+
+ struct {
+ Eina_List *used_layouts;
+ Eina_List *used_options;
+ int only_label;
+ const char *default_model;
+ } xkb;
};
struct _E_Config_Env_Var
@@ -512,6 +522,18 @@ struct _E_Event_Config_Icon_Theme
const char *icon_theme;
};
+struct _E_Config_XKB_Layout
+{
+ const char *name;
+ const char *model;
+ const char *variant;
+};
+
+struct _E_Config_XKB_Option
+{
+ const char *name;
+};
+
EINTERN int e_config_init(void);
EINTERN int e_config_shutdown(void);
diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h
index 4bcbf3a16..57d84bcb7 100644
--- a/src/bin/e_includes.h
+++ b/src/bin/e_includes.h
@@ -142,3 +142,4 @@
#include "e_deskenv.h"
#include "e_xsettings.h"
#include "e_update.h"
+#include "e_xkb.h"
diff --git a/src/bin/e_main.c b/src/bin/e_main.c
index f2b4e66d7..a50686791 100644
--- a/src/bin/e_main.c
+++ b/src/bin/e_main.c
@@ -819,6 +819,13 @@ main(int argc, char **argv)
_e_main_shutdown(-1);
}
TS("E_Mouse Init Done");
+ TS("E_Xkb Init");
+ if (!e_xkb_init())
+ {
+ e_error_message_show(_("Enlightenment cannot setup XKB Keyboard layouts."));
+ _e_main_shutdown(-1);
+ }
+ TS("E_Xkb Init Done");
if (e_config->show_splash)
e_init_status_set(_("Setup Bindings"));
diff --git a/src/bin/e_xkb.c b/src/bin/e_xkb.c
new file mode 100644
index 000000000..f1815c7b7
--- /dev/null
+++ b/src/bin/e_xkb.c
@@ -0,0 +1,181 @@
+#include "e.h"
+
+static void _e_xkb_update_event(void);
+
+EAPI int E_EVENT_XKB_CHANGED = 0;
+
+/* externally accessible functions */
+EAPI int
+e_xkb_init(void)
+{
+ E_EVENT_XKB_CHANGED = ecore_event_type_new();
+ e_xkb_update();
+ return 1;
+}
+
+EAPI int
+e_xkb_shutdown(void)
+{
+ return 1;
+}
+
+EAPI void
+e_xkb_update(void)
+{
+ E_Config_XKB_Layout *cl;
+ E_Config_XKB_Option *op;
+ Eina_List *l;
+ Eina_Strbuf *buf;
+
+ if (!e_config->xkb.used_layouts) return;
+
+ /* We put an empty -option here in order to override all previously
+ * set options.
+ */
+
+ buf = eina_strbuf_new();
+ eina_strbuf_append(buf, "setxkbmap '");
+ EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
+ {
+ eina_strbuf_append(buf, cl->name);
+ break;
+ //if (l->next) eina_strbuf_append(buf, ",");
+ }
+ eina_strbuf_append(buf, "'");
+
+ eina_strbuf_append(buf, " -variant '");
+ EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
+ {
+ eina_strbuf_append(buf, cl->variant);
+ eina_strbuf_append(buf, ",");
+ break;
+ }
+ eina_strbuf_append(buf, "'");
+
+ cl = eina_list_data_get(e_config->xkb.used_layouts);
+ 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, "'");
+ }
+
+ 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, "'");
+ }
+ break;
+ }
+ ecore_exe_run(eina_strbuf_string_get(buf), NULL);
+ eina_strbuf_free(buf);
+}
+
+EAPI void
+e_xkb_layout_next(void)
+{
+ void *odata, *ndata;
+ Eina_List *l;
+
+ odata = eina_list_data_get(e_config->xkb.used_layouts);
+
+ EINA_LIST_FOREACH(eina_list_next(e_config->xkb.used_layouts), l, ndata)
+ {
+ eina_list_data_set(eina_list_prev(l), ndata);
+ }
+
+ eina_list_data_set(eina_list_last(e_config->xkb.used_layouts), odata);
+ e_xkb_update();
+ _e_xkb_update_event();
+ e_config_save_queue();
+}
+
+EAPI void
+e_xkb_layout_prev(void)
+{
+ void *odata, *ndata;
+ Eina_List *l;
+
+ odata = eina_list_data_get(eina_list_last(e_config->xkb.used_layouts));
+
+ for (l = e_config->xkb.used_layouts, ndata = eina_list_data_get(l);
+ l; l = eina_list_next(l))
+ {
+ if (eina_list_next(l))
+ ndata = eina_list_data_set(eina_list_next(l), ndata);
+ }
+
+ eina_list_data_set(e_config->xkb.used_layouts, odata);
+ e_xkb_update();
+ _e_xkb_update_event();
+ e_config_save_queue();
+}
+
+EAPI void
+e_xkb_layout_set(const char *name)
+{
+ Eina_List *l;
+ E_Config_XKB_Layout *cl;
+
+ if (!name) return;
+ EINA_LIST_FOREACH(eina_list_next(e_config->xkb.used_layouts), l, cl)
+ {
+ if (!cl->name) continue;
+ if (!strcmp(cl->name, name))
+ {
+ e_config->xkb.used_layouts =
+ eina_list_remove_list(e_config->xkb.used_layouts, l);
+ e_config->xkb.used_layouts =
+ eina_list_prepend(e_config->xkb.used_layouts, cl);
+ e_xkb_update();
+ _e_xkb_update_event();
+ 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];
+
+ 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",
+ e_prefix_data_get());
+}
+
+static void
+_e_xkb_update_event(void)
+{
+ ecore_event_add(E_EVENT_XKB_CHANGED, NULL, NULL, NULL);
+}
diff --git a/src/bin/e_xkb.h b/src/bin/e_xkb.h
new file mode 100644
index 000000000..5b25ebf66
--- /dev/null
+++ b/src/bin/e_xkb.h
@@ -0,0 +1,19 @@
+#ifdef E_TYPEDEFS
+#else
+#ifndef E_XKB_H
+#define E_XKB_H
+
+EAPI int e_xkb_init(void);
+EAPI int e_xkb_shutdown(void);
+EAPI void e_xkb_update(void);
+EAPI void e_xkb_layout_next(void);
+EAPI void e_xkb_layout_prev(void);
+EAPI void e_xkb_layout_set(const char *name);
+EAPI const char *e_xkb_layout_name_reduce(const char *name);
+EAPI void e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name);
+EAPI void e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name);
+
+extern EAPI int E_EVENT_XKB_CHANGED;
+
+#endif
+#endif
diff --git a/src/modules/xkbswitch/Makefile.am b/src/modules/xkbswitch/Makefile.am
index a502a1af1..8de7de3f4 100644
--- a/src/modules/xkbswitch/Makefile.am
+++ b/src/modules/xkbswitch/Makefile.am
@@ -22,9 +22,7 @@ module_la_SOURCES = e_mod_main.c \
e_mod_main.h \
e_mod_config.c \
e_mod_parse.c \
- e_mod_parse.h \
- e_mod_keybindings.c \
- e_mod_keybindings.h
+ e_mod_parse.h
module_la_LIBADD = @e_libs@ @dlopen_libs@
module_la_LDFLAGS = -module -avoid-version
diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c
index d6531bf23..d13fdd483 100644
--- a/src/modules/xkbswitch/e_mod_config.c
+++ b/src/modules/xkbswitch/e_mod_config.c
@@ -2,6 +2,30 @@
#include "e_mod_main.h"
#include "e_mod_parse.h"
+struct _E_Config_Dialog_Data
+{
+ Evas *evas, *dlg_evas;
+ Evas_Object *layout_list, *used_list;
+ Evas_Object *dmodel_list, *model_list, *variant_list;
+ Evas_Object *btn_add, *btn_del, *btn_up, *btn_down;
+ Ecore_Timer *fill_delay;
+ Ecore_Timer *dlg_fill_delay;
+
+ Eina_List *cfg_layouts;
+ Eina_List *cfg_options;
+ const char *default_model;
+
+ int only_label;
+
+ E_Dialog *dlg_add_new;
+};
+
+typedef struct _E_XKB_Dialog_Option
+{
+ int enabled;
+ const char *name;
+} E_XKB_Dialog_Option;
+
/* Local prototypes */
static void *_create_data(E_Config_Dialog *cfd);
@@ -32,7 +56,7 @@ static Eina_Bool _cb_fill_delay(void *data);
/* Externals */
E_Config_Dialog *
-e_xkb_cfg_dialog(E_Container *con, const char *params __UNUSED__)
+_xkb_cfg_dialog(E_Container *con, const char *params __UNUSED__)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
@@ -47,11 +71,11 @@ e_xkb_cfg_dialog(E_Container *con, const char *params __UNUSED__)
v->basic.apply_cfdata = _basic_apply;
cfd = e_config_dialog_new(con, _("XKB Switcher Module"), "XKB Switcher",
- "keyboard_and_mouse/xkbswitch", "preferences-desktop-locale",
+ "keyboard_and_mouse/xkbswitch",
+ "preferences-desktop-locale",
0, v, NULL);
-
e_dialog_resizable_set(cfd->dia, 1);
- e_xkb_cfg->cfd = cfd;
+ _xkb.cfd = cfd;
return cfd;
}
@@ -62,19 +86,20 @@ _create_data(E_Config_Dialog *cfd __UNUSED__)
{
E_Config_Dialog_Data *cfdata;
Eina_List *l, *ll, *lll;
- E_XKB_Config_Layout *cl, *nl;
+ E_Config_XKB_Layout *cl, *nl;
E_XKB_Dialog_Option *od;
E_XKB_Option *op;
E_XKB_Option_Group *gr;
-
+
+ find_rules();
parse_rules(); /* XXX: handle in case nothing was found? */
cfdata = E_NEW(E_Config_Dialog_Data, 1);
cfdata->cfg_layouts = NULL;
- EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl)
+ EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
{
- nl = E_NEW(E_XKB_Config_Layout, 1);
+ nl = E_NEW(E_Config_XKB_Layout, 1);
nl->name = eina_stringshare_add(cl->name);
nl->model = eina_stringshare_add(cl->model);
nl->variant = eina_stringshare_add(cl->variant);
@@ -84,10 +109,10 @@ _create_data(E_Config_Dialog *cfd __UNUSED__)
/* Initialize options */
- cfdata->only_label = e_xkb_cfg->only_label;
+ cfdata->only_label = e_config->xkb.only_label;
cfdata->cfg_options = NULL;
- lll = e_xkb_cfg->used_options;
+ lll = e_config->xkb.used_options;
EINA_LIST_FOREACH(optgroups, l, gr)
{
EINA_LIST_FOREACH(gr->options, ll, op)
@@ -95,7 +120,8 @@ _create_data(E_Config_Dialog *cfd __UNUSED__)
od = E_NEW(E_XKB_Dialog_Option, 1);
od->name = eina_stringshare_add(op->name);
if (lll &&
- (od->name == ((E_XKB_Config_Option*)eina_list_data_get(lll))->name))
+ (od->name == ((E_Config_XKB_Option *)
+ eina_list_data_get(lll))->name))
{
od->enabled = 1;
lll = eina_list_next(lll);
@@ -111,10 +137,10 @@ _create_data(E_Config_Dialog *cfd __UNUSED__)
static void
_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
- E_XKB_Config_Layout *cl;
+ E_Config_XKB_Layout *cl;
E_XKB_Dialog_Option *od;
- e_xkb_cfg->cfd = NULL;
+ _xkb.cfd = NULL;
EINA_LIST_FREE(cfdata->cfg_layouts, cl)
{
@@ -139,11 +165,11 @@ static int
_basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
Eina_List *l;
- E_XKB_Config_Layout *cl, *nl;
- E_XKB_Config_Option *oc;
+ E_Config_XKB_Layout *cl, *nl;
+ E_Config_XKB_Option *oc;
E_XKB_Dialog_Option *od;
- EINA_LIST_FREE(e_xkb_cfg->used_layouts, cl)
+ EINA_LIST_FREE(e_config->xkb.used_layouts, cl)
{
eina_stringshare_del(cl->name);
eina_stringshare_del(cl->model);
@@ -153,24 +179,24 @@ _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
{
- nl = E_NEW(E_XKB_Config_Layout, 1);
+ nl = E_NEW(E_Config_XKB_Layout, 1);
nl->name = eina_stringshare_add(cl->name);
nl->model = eina_stringshare_add(cl->model);
nl->variant = eina_stringshare_add(cl->variant);
- e_xkb_cfg->used_layouts =
- eina_list_append(e_xkb_cfg->used_layouts, nl);
+ e_config->xkb.used_layouts =
+ eina_list_append(e_config->xkb.used_layouts, nl);
}
- if (e_xkb_cfg->default_model)
- eina_stringshare_del(e_xkb_cfg->default_model);
+ if (e_config->xkb.default_model)
+ eina_stringshare_del(e_config->xkb.default_model);
- e_xkb_cfg->default_model = eina_stringshare_add(cfdata->default_model);
+ e_config->xkb.default_model = eina_stringshare_add(cfdata->default_model);
/* Save options */
- e_xkb_cfg->only_label = cfdata->only_label;
+ e_config->xkb.only_label = cfdata->only_label;
- EINA_LIST_FREE(e_xkb_cfg->used_options, oc)
+ EINA_LIST_FREE(e_config->xkb.used_options, oc)
{
eina_stringshare_del(oc->name);
E_FREE(oc);
@@ -180,13 +206,12 @@ _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
if (!od->enabled) continue;
- oc = E_NEW(E_XKB_Config_Option, 1);
+ oc = E_NEW(E_Config_XKB_Option, 1);
oc->name = eina_stringshare_add(od->name);
- e_xkb_cfg->used_options = eina_list_append(e_xkb_cfg->used_options, oc);
+ e_config->xkb.used_options = eina_list_append(e_config->xkb.used_options, oc);
}
- e_xkb_update_icon();
- e_xkb_update_layout();
+ e_xkb_update();
e_config_save_queue();
return 1;
@@ -278,7 +303,7 @@ _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data
EINA_LIST_FOREACH(group->options, ll, option)
{
Evas_Object *chk = e_widget_check_add(evas, option->description,
- &(((E_XKB_Dialog_Option*)
+ &(((E_XKB_Dialog_Option *)
eina_list_data_get(lll))->enabled));
e_widget_framelist_object_append(grp, chk);
lll = eina_list_next(lll);
@@ -433,7 +458,7 @@ _dlg_add_new(E_Config_Dialog_Data *cfdata)
Evas *evas;
Evas_Coord mw, mh;
- if (!(dlg = e_dialog_new(e_xkb_cfg->cfd->con, "E", "xkbswitch_config_add_dialog"))) return NULL;
+ if (!(dlg = e_dialog_new(_xkb.cfd->con, "E", "xkbswitch_config_add_dialog"))) return NULL;
dlg->data = cfdata;
@@ -499,7 +524,7 @@ static void
_dlg_add_cb_ok(void *data __UNUSED__, E_Dialog *dlg)
{
E_Config_Dialog_Data *cfdata = dlg->data;
- E_XKB_Config_Layout *cl;
+ E_Config_XKB_Layout *cl;
char buf[PATH_MAX];
/* Configuration information */
const char *layout = e_widget_ilist_selected_value_get(cfdata->layout_list);
@@ -507,7 +532,7 @@ _dlg_add_cb_ok(void *data __UNUSED__, E_Dialog *dlg)
const char *variant = e_widget_ilist_selected_value_get(cfdata->variant_list);
/* The new configuration */
- cl = E_NEW(E_XKB_Config_Layout, 1);
+ cl = E_NEW(E_Config_XKB_Layout, 1);
cl->name = eina_stringshare_add(layout);
cl->model = eina_stringshare_add(model);
cl->variant = eina_stringshare_add(variant);
@@ -665,7 +690,7 @@ _cb_fill_delay(void *data)
{
E_Config_Dialog_Data *cfdata;
Eina_List *l;
- E_XKB_Config_Layout *cl;
+ E_Config_XKB_Layout *cl;
E_XKB_Model *model;
int n = 0;
char buf[PATH_MAX];
@@ -703,7 +728,7 @@ _cb_fill_delay(void *data)
snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name);
e_widget_ilist_append(cfdata->dmodel_list, NULL, buf, NULL,
cfdata, model->name);
- if (model->name == e_xkb_cfg->default_model)
+ if (model->name == e_config->xkb.default_model)
e_widget_ilist_selected_set(cfdata->dmodel_list, n);
n++;
}
diff --git a/src/modules/xkbswitch/e_mod_keybindings.c b/src/modules/xkbswitch/e_mod_keybindings.c
deleted file mode 100644
index 10206a246..000000000
--- a/src/modules/xkbswitch/e_mod_keybindings.c
+++ /dev/null
@@ -1,194 +0,0 @@
-#include "e.h"
-#include "e_mod_main.h"
-#include "e_mod_keybindings.h"
-
-#define E_XKB_ACTION_GROUP _("Keyboard Layouts")
-#define E_XKB_ACTION_NEXT _("Switch to the next layout")
-#define E_XKB_ACTION_PREV _("Switch to the previous layout")
-
-#define ACT_FN_GO(act) \
- static void _e_actions_act_##act##_go(E_Object *obj, const char *params)
-
-#define ACT_GO(name) \
-{ \
- act = e_action_add(#name); \
- if (act) act->func.go = _e_actions_act_##name##_go; \
-}
-
-ACT_FN_GO(e_xkb_layout_next);
-ACT_FN_GO(e_xkb_layout_prev);
-
-static void _e_xkb_register_module_keybinding(E_Config_Binding_Key *key, const char *action);
-static void _e_xkb_unregister_module_keybinding(E_Config_Binding_Key *key, int save);
-
-int
-e_xkb_register_module_actions(void)
-{
- E_Action *act;
-
- e_action_predef_name_set(E_XKB_ACTION_GROUP, E_XKB_ACTION_NEXT, E_XKB_NEXT_ACTION,
- NULL, NULL, 0);
- e_action_predef_name_set(E_XKB_ACTION_GROUP, E_XKB_ACTION_PREV, E_XKB_PREV_ACTION,
- NULL, NULL, 0);
-
- ACT_GO(e_xkb_layout_next);
- ACT_GO(e_xkb_layout_prev);
-
- return 1;
-}
-
-int
-e_xkb_unregister_module_actions(void)
-{
- e_action_del(E_XKB_NEXT_ACTION);
- e_action_del(E_XKB_PREV_ACTION);
-
- e_action_predef_name_del(E_XKB_ACTION_GROUP, E_XKB_ACTION_NEXT);
- e_action_predef_name_del(E_XKB_ACTION_GROUP, E_XKB_ACTION_PREV);
-
- return 1;
-}
-
-// XXX: i dont think module should register bindings imho. leave that up to
-// standard profiles?
-int
-e_xkb_register_module_keybindings(void)
-{
- e_managers_keys_ungrab();
-
- _e_xkb_register_module_keybinding(&(e_xkb_cfg->layout_next_key), E_XKB_NEXT_ACTION);
- _e_xkb_register_module_keybinding(&(e_xkb_cfg->layout_prev_key), E_XKB_PREV_ACTION);
-
- e_managers_keys_grab();
-
- return 1;
-}
-
-int
-e_xkb_unregister_module_keybindings(void)
-{
- e_managers_keys_ungrab();
-
- _e_xkb_unregister_module_keybinding(&(e_xkb_cfg->layout_next_key), 1);
- _e_xkb_unregister_module_keybinding(&(e_xkb_cfg->layout_prev_key), 1);
-
- e_managers_keys_grab();
-
- return 1;
-}
-
-static void
-_e_xkb_unregister_module_keybinding(E_Config_Binding_Key *key, int save)
-{
- E_Config_Binding_Key *eb;
- Eina_List *l;
- Eina_Bool done = EINA_FALSE;
- Eina_Bool found = EINA_FALSE;
-
- if (!key) return;
-
- while (!done)
- {
- done = EINA_TRUE;
-
- EINA_LIST_FOREACH(e_config->key_bindings, l, eb)
- {
- if (eb && eb->action && eb->action[0] &&
- (!strcmp(!eb->action ? "" : eb->action,
- !key->action ? "" : key->action)))
- {
- if (save)
- {
- eina_stringshare_del(key->key);
- eina_stringshare_del(key->params);
-
- key->context = eb->context;
- key->key = eina_stringshare_add(eb->key);
- key->modifiers = eb->modifiers;
- key->any_mod = eb->any_mod;
- key->params = (!eb->params ? NULL : eina_stringshare_add(eb->params));
- }
-
- e_bindings_key_del(eb->context, eb->key, eb->modifiers, eb->any_mod, eb->action, eb->params);
-
- eina_stringshare_del(eb->key);
- eina_stringshare_del(eb->action);
- eina_stringshare_del(eb->params);
-
- E_FREE(eb);
-
- e_config->key_bindings = eina_list_remove_list(e_config->key_bindings, l);
-
- found = EINA_TRUE;
- done = EINA_FALSE;
-
- break;
- }
- }
- }
-
- if (!found)
- {
- eina_stringshare_del(key->key);
- eina_stringshare_del(key->params);
-
- key->key = NULL;
- key->context = E_BINDING_CONTEXT_ANY;
- key->modifiers = E_BINDING_MODIFIER_NONE;
- key->any_mod = 0;
- }
-}
-
-static void
-_e_xkb_register_module_keybinding(E_Config_Binding_Key *key, const char *action)
-{
- E_Config_Binding_Key *eb;
- E_Config_Binding_Key *t;
- Eina_List *l;
- Eina_Bool found = EINA_FALSE;
-
- if (!key || !key->key || !key->key[0] || !action) return;
-
- eb = E_NEW(E_Config_Binding_Key, 1);
-
- eb->context = key->context;
- eb->key = eina_stringshare_add(key->key);
- eb->modifiers = key->modifiers;
- eb->any_mod = key->any_mod;
- eb->action = (!action ? NULL : eina_stringshare_add(action));
- eb->params = (!key->params ? NULL : eina_stringshare_add(key->params));
-
- EINA_LIST_FOREACH(e_config->key_bindings, l, t)
- {
- if (found) break;
- if (!strcmp(!t->action ? "" : t->action, eb->action) && !strcmp(!t->params ? "" : t->params, !eb->params ? "" : eb->params)) found = EINA_TRUE;
- }
-
- if (!found)
- {
- e_config->key_bindings = eina_list_append(e_config->key_bindings, eb);
- e_bindings_key_add(key->context, key->key, key->modifiers,
- key->any_mod, action, key->params);
- }
- else
- {
- eina_stringshare_del(eb->key);
- eina_stringshare_del(eb->action);
- eina_stringshare_del(eb->params);
- E_FREE(eb);
- }
-}
-
-ACT_FN_GO(e_xkb_layout_next)
-{
- e_xkb_layout_next();
- return;
- obj = 0; params = 0;
-}
-
-ACT_FN_GO(e_xkb_layout_prev)
-{
- e_xkb_layout_prev();
- return;
- obj = 0; params = 0;
-}
diff --git a/src/modules/xkbswitch/e_mod_keybindings.h b/src/modules/xkbswitch/e_mod_keybindings.h
deleted file mode 100644
index de86164ce..000000000
--- a/src/modules/xkbswitch/e_mod_keybindings.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifdef E_TYPEDEFS
-#else
-#ifndef E_MOD_KEYBIND_H
-#define E_MOD_KEYBIND_H
-
-#define E_XKB_NEXT_ACTION "e_xkb_layout_next"
-#define E_XKB_PREV_ACTION "e_xkb_layout_prev"
-
-int e_xkb_register_module_actions(void);
-int e_xkb_unregister_module_actions(void);
-
-int e_xkb_register_module_keybindings(void);
-int e_xkb_unregister_module_keybindings(void);
-
-#endif
-#endif
diff --git a/src/modules/xkbswitch/e_mod_main.c b/src/modules/xkbswitch/e_mod_main.c
index 70bf2fab0..517a60b17 100644
--- a/src/modules/xkbswitch/e_mod_main.c
+++ b/src/modules/xkbswitch/e_mod_main.c
@@ -1,38 +1,20 @@
#include "e.h"
#include "e_mod_main.h"
#include "e_mod_parse.h"
-#include "e_mod_keybindings.h"
-
-/* Static functions
- * The static functions specific to the current code unit.
- */
/* GADCON */
-
static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style);
-
static void _gc_shutdown(E_Gadcon_Client *gcc);
-static void _gc_orient (E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
-
-static const char *_gc_label (E_Gadcon_Client_Class *client_class);
+static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
+static const char *_gc_label(E_Gadcon_Client_Class *client_class);
static const char *_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__);
-
static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas);
-/* CONFIG */
-
-static void _e_xkb_cfg_new (void);
-static void _e_xkb_cfg_free(void);
-
-static Eina_Bool _e_xkb_cfg_timer(void *data);
-
/* EVENTS */
-
+static Eina_Bool _xkb_changed(void *data, int type, void *event_info);
static void _e_xkb_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event);
-
static void _e_xkb_cb_menu_post(void *data, E_Menu *menu __UNUSED__);
static void _e_xkb_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi __UNUSED__);
-
static void _e_xkb_cb_lmenu_post(void *data, E_Menu *menu __UNUSED__);
static void _e_xkb_cb_lmenu_set(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__);
@@ -56,18 +38,12 @@ typedef struct _Instance
/* LIST OF INSTANCES */
static Eina_List *instances = NULL;
-/* EET STRUCTURES */
-
-static E_Config_DD *e_xkb_cfg_edd = NULL;
-static E_Config_DD *e_xkb_cfg_layout_edd = NULL;
-static E_Config_DD *e_xkb_cfg_option_edd = NULL;
-
/* Global variables
* Global variables shared across the module.
*/
/* CONFIG STRUCTURE */
-E_XKB_Config *e_xkb_cfg = NULL;
+Xkb _xkb = { NULL, NULL };
static const E_Gadcon_Client_Class _gc_class =
{
@@ -98,100 +74,11 @@ e_modapi_init(E_Module *m)
e_configure_registry_item_add("keyboard_and_mouse/xkbswitch", 110,
_("XKB Switcher"), NULL,
"preferences-desktop-locale",
- e_xkb_cfg_dialog);
- e_xkb_cfg_layout_edd = E_CONFIG_DD_NEW("E_XKB_Config_Layout", E_XKB_Config_Layout);
-#undef T
-#undef D
-#define T E_XKB_Config_Layout
-#define D e_xkb_cfg_layout_edd
- E_CONFIG_VAL(D, T, name, STR);
- E_CONFIG_VAL(D, T, model, STR);
- E_CONFIG_VAL(D, T, variant, STR);
-
- e_xkb_cfg_option_edd = E_CONFIG_DD_NEW("E_XKB_Config_Option", E_XKB_Config_Option);
-#undef T
-#undef D
-#define T E_XKB_Config_Option
-#define D e_xkb_cfg_option_edd
- E_CONFIG_VAL(D, T, name, STR);
-
- e_xkb_cfg_edd = E_CONFIG_DD_NEW("e_xkb_cfg", E_XKB_Config);
-#undef T
-#undef D
-#define T E_XKB_Config
-#define D e_xkb_cfg_edd
- E_CONFIG_LIST(D, T, used_layouts, e_xkb_cfg_layout_edd);
- E_CONFIG_LIST(D, T, used_options, e_xkb_cfg_option_edd);
- E_CONFIG_VAL(D, T, layout_next_key.context, INT);
- E_CONFIG_VAL(D, T, layout_next_key.modifiers, INT);
- E_CONFIG_VAL(D, T, layout_next_key.key, STR);
- E_CONFIG_VAL(D, T, layout_next_key.action, STR);
- E_CONFIG_VAL(D, T, layout_next_key.params, STR);
- E_CONFIG_VAL(D, T, layout_next_key.any_mod, UCHAR);
- E_CONFIG_VAL(D, T, layout_prev_key.context, INT);
- E_CONFIG_VAL(D, T, layout_prev_key.modifiers, INT);
- E_CONFIG_VAL(D, T, layout_prev_key.key, STR);
- E_CONFIG_VAL(D, T, layout_prev_key.action, STR);
- E_CONFIG_VAL(D, T, layout_prev_key.params, STR);
- E_CONFIG_VAL(D, T, layout_prev_key.any_mod, UCHAR);
- E_CONFIG_VAL(D, T, default_model, STR);
- E_CONFIG_VAL(D, T, only_label, INT);
- E_CONFIG_VAL(D, T, version, INT);
-
- /* Version check */
- e_xkb_cfg = e_config_domain_load("module.xkbswitch", e_xkb_cfg_edd);
- if (e_xkb_cfg)
- {
- /* Check config version */
- if ((e_xkb_cfg->version >> 16) < MOD_CONFIG_FILE_EPOCH)
- {
- /* config too old */
- _e_xkb_cfg_free();
- ecore_timer_add(1.0, _e_xkb_cfg_timer,
- _("XKB Switcher Module Configuration data needed "
- "upgrading. Your old configuration
has been"
- " wiped and a new set of defaults initialized. "
- "This
will happen regularly during "
- "development, so don't report a
bug. "
- "This simply means the module needs "
- "new configuration
data by default for "
- "usable functionality that your old
"
- "configuration simply lacks. This new set of "
- "defaults will fix
that by adding it in. "
- "You can re-configure things now to your
"
- "liking. Sorry for the inconvenience.
"));
- }
- /* Ardvarks */
- else if (e_xkb_cfg->version > MOD_CONFIG_FILE_VERSION)
- {
- /* config too new...wtf ? */
- _e_xkb_cfg_free();
- ecore_timer_add(1.0, _e_xkb_cfg_timer,
- _("Your XKB Switcher Module configuration is NEWER "
- "than the module version. This is "
- "very
strange. This should not happen unless"
- " you downgraded
the module or "
- "copied the configuration from a place where"
- "
a newer version of the module "
- "was running. This is bad and
as a "
- "precaution your configuration has been now "
- "restored to
defaults. Sorry for the "
- "inconvenience.
"));
- }
- }
-
- if (!e_xkb_cfg) _e_xkb_cfg_new();
- e_xkb_cfg->module = m;
- /* Rules */
- find_rules();
- /* Update the layout - can't update icon, gadgets are not there yet */
- e_xkb_update_layout();
+ _xkb_cfg_dialog);
+ _xkb.module = m;
+ _xkb.evh = ecore_event_handler_add(E_EVENT_XKB_CHANGED, _xkb_changed, NULL);
/* Gadcon */
e_gadcon_provider_register(&_gc_class);
- /* Bindings */
- e_xkb_register_module_actions();
- e_xkb_register_module_keybindings();
-
return m;
}
@@ -202,48 +89,15 @@ e_modapi_init(E_Module *m)
EAPI int
e_modapi_shutdown(E_Module *m __UNUSED__)
{
- E_XKB_Config_Layout *cl;
- E_XKB_Config_Option *op;
-
e_configure_registry_item_del("keyboard_and_mouse/xkbswitch");
e_configure_registry_category_del("keyboard_and_mouse");
-
- if (e_xkb_cfg->cfd) e_object_del(E_OBJECT(e_xkb_cfg->cfd));
-
- e_xkb_cfg->cfd = NULL;
- e_xkb_cfg->module = NULL;
-
+
+ if (_xkb.evh) ecore_event_handler_del(_xkb.evh);
+ if (_xkb.cfd) e_object_del(E_OBJECT(_xkb.cfd));
+ _xkb.cfd = NULL;
+ _xkb.module = NULL;
e_gadcon_provider_unregister(&_gc_class);
- e_xkb_unregister_module_actions();
- e_xkb_unregister_module_keybindings();
-
- EINA_LIST_FREE(e_xkb_cfg->used_layouts, cl)
- {
- eina_stringshare_del(cl->name);
- eina_stringshare_del(cl->model);
- eina_stringshare_del(cl->variant);
-
- E_FREE(cl);
- }
-
- EINA_LIST_FREE(e_xkb_cfg->used_options, op)
- {
- eina_stringshare_del(op->name);
- E_FREE(op);
- }
-
- if (e_xkb_cfg->default_model)
- eina_stringshare_del(e_xkb_cfg->default_model);
-
- E_FREE(e_xkb_cfg);
-
- E_CONFIG_DD_FREE(e_xkb_cfg_layout_edd);
- E_CONFIG_DD_FREE(e_xkb_cfg_option_edd);
- E_CONFIG_DD_FREE(e_xkb_cfg_edd);
-
- clear_rules();
-
return 1;
}
@@ -253,7 +107,6 @@ e_modapi_shutdown(E_Module *m __UNUSED__)
EAPI int
e_modapi_save(E_Module *m __UNUSED__)
{
- e_config_domain_save("module.xkbswitch", e_xkb_cfg_edd, e_xkb_cfg);
return 1;
}
@@ -261,17 +114,19 @@ e_modapi_save(E_Module *m __UNUSED__)
* current layout state.
*/
void
-e_xkb_update_icon(void)
+_xkb_update_icon(void)
{
- Instance *inst;
+ Instance *inst;
Eina_List *l;
+ const char *name;
- if (!e_xkb_cfg->used_layouts) return;
- const char *name = ((E_XKB_Config_Layout*)eina_list_data_get(e_xkb_cfg->used_layouts))->name;
+ if (!e_config->xkb.used_layouts) return;
+ name = ((E_Config_XKB_Layout*)
+ eina_list_data_get(e_config->xkb.used_layouts))->name;
if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1;
- if (e_xkb_cfg->only_label)
+ if (e_config->xkb.only_label)
{
EINA_LIST_FOREACH(instances, l, inst)
{
@@ -302,129 +157,6 @@ e_xkb_update_icon(void)
}
}
-void
-e_xkb_update_layout(void)
-{
- E_XKB_Config_Layout *cl;
- E_XKB_Config_Option *op;
- Eina_List *l;
- Eina_Strbuf *buf;
-
- if (!e_xkb_cfg->used_layouts) return;
-
- /* We put an empty -option here in order to override all previously
- * set options.
- */
-
- buf = eina_strbuf_new();
- eina_strbuf_append(buf, "setxkbmap '");
- EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl)
- {
- eina_strbuf_append(buf, cl->name);
- break;
- //if (l->next) eina_strbuf_append(buf, ",");
- }
- eina_strbuf_append(buf, "'");
-
- eina_strbuf_append(buf, " -variant '");
- EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl)
- {
- eina_strbuf_append(buf, cl->variant);
- eina_strbuf_append(buf, ",");
- break;
- }
- eina_strbuf_append(buf, "'");
-
- eina_strbuf_append(buf, " -model '");
- cl = eina_list_data_get(e_xkb_cfg->used_layouts);
- if (strcmp(cl->model, "default"))
- eina_strbuf_append(buf, cl->model);
- else if (strcmp(e_xkb_cfg->default_model, "default"))
- eina_strbuf_append(buf, e_xkb_cfg->default_model);
- else
- eina_strbuf_append(buf, "default");
- eina_strbuf_append(buf, "'");
-
- EINA_LIST_FOREACH(e_xkb_cfg->used_options, l, op)
- {
- eina_strbuf_append(buf, " -option '");
- eina_strbuf_append(buf, op->name);
- eina_strbuf_append(buf, "'");
- break;
- }
- printf("RUN: '%s'\n", eina_strbuf_string_get(buf));
- ecore_exe_run(eina_strbuf_string_get(buf), NULL);
- eina_strbuf_free(buf);
-}
-
-void
-e_xkb_layout_next(void)
-{
- void *odata, *ndata;
- Eina_List *l;
-
- odata = eina_list_data_get(e_xkb_cfg->used_layouts);
-
- EINA_LIST_FOREACH(eina_list_next(e_xkb_cfg->used_layouts), l, ndata)
- {
- eina_list_data_set(eina_list_prev(l), ndata);
- }
-
- eina_list_data_set(eina_list_last(e_xkb_cfg->used_layouts), odata);
- e_xkb_update_icon();
- e_xkb_update_layout();
-}
-
-void
-e_xkb_layout_prev(void)
-{
- void *odata, *ndata;
- Eina_List *l;
-
- odata = eina_list_data_get(eina_list_last(e_xkb_cfg->used_layouts));
-
- for (l = e_xkb_cfg->used_layouts, ndata = eina_list_data_get(l);
- l; l = eina_list_next(l))
- {
- if (eina_list_next(l))
- ndata = eina_list_data_set(eina_list_next(l), ndata);
- }
-
- eina_list_data_set(e_xkb_cfg->used_layouts, odata);
- e_xkb_update_icon();
- e_xkb_update_layout();
-}
-
-const char *
-e_xkb_layout_name_reduce(const char *name)
-{
- if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1;
- return name;
-}
-
-void
-e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name)
-{
- int w, h;
- char buf[PATH_MAX];
-
- 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);
-}
-
-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",
- e_prefix_data_get());
-}
-
/* LOCAL STATIC FUNCTIONS */
static E_Gadcon_Client *
@@ -433,8 +165,9 @@ _gc_init(E_Gadcon *gc, const char *gcname, const char *id, const char *style)
Instance *inst;
const char *name;
- if (e_xkb_cfg->used_layouts)
- name = ((E_XKB_Config_Layout*)eina_list_data_get(e_xkb_cfg->used_layouts))->name;
+ if (e_config->xkb.used_layouts)
+ name = ((E_Config_XKB_Layout*)
+ eina_list_data_get(e_config->xkb.used_layouts))->name;
else name = NULL;
/* The instance */
@@ -450,7 +183,7 @@ _gc_init(E_Gadcon *gc, const char *gcname, const char *id, const char *style)
inst->gcc = e_gadcon_client_new(gc, gcname, id, style, inst->o_xkbswitch);
inst->gcc->data = inst;
/* The flag icon */
- if (!e_xkb_cfg->only_label)
+ if (!e_config->xkb.only_label)
{
inst->o_xkbflag = e_icon_add(gc->evas);
e_xkb_e_icon_flag_setup(inst->o_xkbflag, name);
@@ -525,68 +258,17 @@ _gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas)
Evas_Object *o;
char buf[PATH_MAX];
- snprintf(buf, sizeof(buf), "%s/e-module-xkbswitch.edj",
- e_xkb_cfg->module->dir);
+ snprintf(buf, sizeof(buf), "%s/e-module-xkbswitch.edj", _xkb.module->dir);
o = edje_object_add(evas);
edje_object_file_set(o, buf, "icon");
return o;
}
-static void
-_e_xkb_cfg_new(void)
-{
- e_xkb_cfg = E_NEW(E_XKB_Config, 1);
-
- e_xkb_cfg->used_layouts = NULL;
- e_xkb_cfg->used_options = NULL;
- e_xkb_cfg->version = MOD_CONFIG_FILE_VERSION;
- e_xkb_cfg->default_model = eina_stringshare_add("default");
-
-#define BIND(act, actname) \
- e_xkb_cfg->layout_##act##_key.context = E_BINDING_CONTEXT_ANY; \
- e_xkb_cfg->layout_##act##_key.key = eina_stringshare_add("comma"); \
- e_xkb_cfg->layout_##act##_key.modifiers = E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT; \
- e_xkb_cfg->layout_##act##_key.any_mod = 0; \
- e_xkb_cfg->layout_##act##_key.action = eina_stringshare_add(actname); \
- e_xkb_cfg->layout_##act##_key.params = NULL
-
- BIND(next, E_XKB_NEXT_ACTION);
- BIND(prev, E_XKB_PREV_ACTION);
-#undef BIND
-
- e_config_save_queue();
-}
-
-static void
-_e_xkb_cfg_free(void)
-{
- E_XKB_Config_Layout *cl;
- E_XKB_Config_Option *op;
-
- EINA_LIST_FREE(e_xkb_cfg->used_layouts, cl)
- {
- eina_stringshare_del(cl->name);
- eina_stringshare_del(cl->model);
- eina_stringshare_del(cl->variant);
- E_FREE(cl);
- }
-
- EINA_LIST_FREE(e_xkb_cfg->used_options, op)
- {
- eina_stringshare_del(op->name);
- E_FREE(op);
- }
-
- if (e_xkb_cfg->default_model)
- eina_stringshare_del(e_xkb_cfg->default_model);
- E_FREE(e_xkb_cfg);
-}
-
static Eina_Bool
-_e_xkb_cfg_timer(void *data)
+_xkb_changed(void *data, int type, void *event_info)
{
- e_util_dialog_internal( _("XKB Switcher Configuration Updated"), data);
- return EINA_FALSE;
+ _xkb_update_icon();
+ return ECORE_CALLBACK_PASS_ON;
}
static void
@@ -643,7 +325,7 @@ _e_xkb_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSE
if (inst->lmenu)
{
- E_XKB_Config_Layout *cl;
+ E_Config_XKB_Layout *cl;
E_Menu_Item *mi;
Eina_List *l;
int dir;
@@ -659,7 +341,7 @@ _e_xkb_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSE
e_menu_item_separator_set(mi, 1);
/* Append all the layouts */
- EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl)
+ EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
{
const char *name = cl->name;
@@ -668,7 +350,7 @@ _e_xkb_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSE
e_menu_item_radio_set(mi, 1);
e_menu_item_radio_group_set(mi, 1);
e_menu_item_toggle_set(mi,
- (l == e_xkb_cfg->used_layouts) ? 1 : 0);
+ (l == e_config->xkb.used_layouts) ? 1 : 0);
e_xkb_flag_file_get(buf, sizeof(buf), name);
e_menu_item_icon_file_set(mi, buf);
snprintf(buf, sizeof(buf), "%s (%s, %s)", cl->name,
@@ -763,8 +445,8 @@ _e_xkb_cb_lmenu_post(void *data, E_Menu *menu __UNUSED__)
static void
_e_xkb_cb_menu_configure(void *data __UNUSED__, E_Menu *mn, E_Menu_Item *mi __UNUSED__)
{
- if (!e_xkb_cfg || e_xkb_cfg->cfd) return;
- e_xkb_cfg_dialog(mn->zone->container, NULL);
+ if (_xkb.cfd) return;
+ _xkb_cfg_dialog(mn->zone->container, NULL);
}
static void
@@ -772,15 +454,13 @@ _e_xkb_cb_lmenu_set(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED_
{
Eina_List *l;
void *ndata;
- void *odata = eina_list_data_get(e_xkb_cfg->used_layouts);
+ void *odata = eina_list_data_get(e_config->xkb.used_layouts);
- EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, ndata)
+ EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, ndata)
{
if (ndata == data) eina_list_data_set(l, odata);
}
-
- eina_list_data_set(e_xkb_cfg->used_layouts, data);
-
- e_xkb_update_icon();
- e_xkb_update_layout();
+ eina_list_data_set(e_config->xkb.used_layouts, data);
+ e_xkb_update();
+ _xkb_update_icon();
}
diff --git a/src/modules/xkbswitch/e_mod_main.h b/src/modules/xkbswitch/e_mod_main.h
index 2daedeb00..9191ce3e3 100644
--- a/src/modules/xkbswitch/e_mod_main.h
+++ b/src/modules/xkbswitch/e_mod_main.h
@@ -7,74 +7,12 @@
#ifndef E_MOD_MAIN_H
#define E_MOD_MAIN_H
-/* Macros used for config file versioning */
-/* You can increment the EPOCH value if the old configuration is not
- * compatible anymore, it creates an entire new one.
- * You need to increment GENERATION when you add new values to the
- * configuration file but is not needed to delete the existing conf */
-#define MOD_CONFIG_FILE_EPOCH 0x0001
-#define MOD_CONFIG_FILE_GENERATION 0x008d
-#define MOD_CONFIG_FILE_VERSION \
- ((MOD_CONFIG_FILE_EPOCH << 16) | MOD_CONFIG_FILE_GENERATION)
-
-typedef struct _E_XKB_Config
-{
- /* Not written to disk */
- E_Module *module;
- E_Config_Dialog *cfd;
-
- /* Written to disk */
- E_Config_Binding_Key layout_next_key;
- E_Config_Binding_Key layout_prev_key;
-
- Eina_List *used_layouts;
- Eina_List *used_options;
- const char *default_model;
-
- int only_label;
-
- int version;
-} E_XKB_Config;
-
-/* This represents the node data in used_layouts */
-typedef struct _E_XKB_Config_Layout
+typedef struct _Xkb
{
- const char *name;
- const char *model;
- const char *variant;
-} E_XKB_Config_Layout;
-
-/* This represents a keyboard option in the config dialog */
-typedef struct _E_XKB_Dialog_Option
-{
- int enabled;
- const char *name;
-} E_XKB_Dialog_Option;
-
-/* This represents a keyboard option saved into eet */
-typedef struct _E_XKB_Config_Option
-{
- const char *name;
-} E_XKB_Config_Option;
-
-/* automatically typedef'd by E */
-struct _E_Config_Dialog_Data
-{
- Evas *evas, *dlg_evas;
- Evas_Object *layout_list, *used_list;
- Evas_Object *dmodel_list, *model_list, *variant_list;
- Evas_Object *btn_add, *btn_del, *btn_up, *btn_down;
- Ecore_Timer *fill_delay;
- Ecore_Timer *dlg_fill_delay;
-
- Eina_List *cfg_layouts;
- Eina_List *cfg_options;
- const char *default_model;
-
- int only_label;
-
- E_Dialog *dlg_add_new;
-};
+ E_Module *module;
+ E_Config_Dialog *cfd;
+ Ecore_Event_Handler *evh;
+} Xkb;
/* Prototypes */
@@ -84,18 +22,9 @@ EAPI void *e_modapi_init (E_Module *m);
EAPI int e_modapi_shutdown(E_Module *m);
EAPI int e_modapi_save (E_Module *m);
-void e_xkb_update_icon (void);
-void e_xkb_update_layout(void);
-
-void e_xkb_layout_next(void);
-void e_xkb_layout_prev(void);
-
-const char *e_xkb_layout_name_reduce(const char *name);
-void e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name);
-void e_xkb_flag_file_get(char *buf, size_t bufsize, const char *name);
-
-E_Config_Dialog *e_xkb_cfg_dialog(E_Container *con, const char *params);
+void _xkb_update_icon(void);
+E_Config_Dialog *_xkb_cfg_dialog(E_Container *con, const char *params);
-extern E_XKB_Config *e_xkb_cfg;
+extern Xkb _xkb;
#endif