summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichaël Bouchaud (yoz) <yoz@efl.so>2016-10-31 11:35:24 +0100
committerMichaël Bouchaud (yoz) <yoz@efl.so>2016-11-15 15:40:15 +0100
commit645b9c48bc2ed535057bc83a432a3de537bed875 (patch)
treebbe83234b644c61a0a0d9acd21c654f0beb26c54
parent573035e262d3d69b7e8116969deaf85a7718ef89 (diff)
downloadenlightenment-devs/yoz/xkbswitch.tar.gz
xkbswitch: rewrite the config panel to improve the gui designdevs/yoz/xkbswitch
-rw-r--r--src/modules/xkbswitch/e_mod_config.c1365
-rw-r--r--src/modules/xkbswitch/e_mod_main.c15
-rw-r--r--src/modules/xkbswitch/e_mod_parse.c148
-rw-r--r--src/modules/xkbswitch/e_mod_parse.h27
4 files changed, 1170 insertions, 385 deletions
diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c
index d615aad806..a304f0e6c8 100644
--- a/src/modules/xkbswitch/e_mod_config.c
+++ b/src/modules/xkbswitch/e_mod_config.c
@@ -10,9 +10,51 @@ struct _E_Config_Dialog_Data
Evas_Object *btn_add, *btn_del, *btn_up, *btn_down;
Ecore_Timer *fill_delay;
Ecore_Timer *dlg_fill_delay;
+ Evas_Object *popup;
+
+ Evas_Object *btn_layout;
+ Evas_Object *led_list;
+ Evas_Object *switch_list;
+ Evas_Object *ctrl_list;
+ Evas_Object *lv3_list;
+ Evas_Object *keypad_list;
+ Evas_Object *delkeypad_list;
+ Evas_Object *capslock_list;
+ Evas_Object *altwin_list;
+ Evas_Object *compose_list;
+ Evas_Object *currency_list;
+ Evas_Object *lv5_list;
+ Evas_Object *spacebar_list;
+ Evas_Object *japan_list;
+ Evas_Object *korean_list;
+ Evas_Object *esperanto_list;
+ Evas_Object *solaris_list;
+ Evas_Object *terminate_list;
+ Evas_Object *misc_list;
+
+ Evas_Object *chk_label;
Eina_List *cfg_layouts;
- Eina_List *cfg_options;
+
+ Eina_List *cfg_led_options;
+ Eina_List *cfg_switch_options;
+ Eina_List *cfg_lv3_options;
+ Eina_List *cfg_ctrl_options;
+ Eina_List *cfg_keypad_options;
+ Eina_List *cfg_delkeypad_options;
+ Eina_List *cfg_capslock_options;
+ Eina_List *cfg_altwin_options;
+ Eina_List *cfg_compose_options;
+ Eina_List *cfg_currency_options;
+ Eina_List *cfg_lv5_options;
+ Eina_List *cfg_spacebar_options;
+ Eina_List *cfg_japan_options;
+ Eina_List *cfg_korean_options;
+ Eina_List *cfg_esperanto_options;
+ Eina_List *cfg_solaris_options;
+ Eina_List *cfg_terminate_options;
+ Eina_List *cfg_misc_options;
+
const char *default_model;
int only_label;
@@ -22,25 +64,46 @@ struct _E_Config_Dialog_Data
E_Config_Dialog *cfd;
};
-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);
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
+static Evas_Object *_advanced_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
-static int _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
-
-static void _cb_add(void *data, void *data2 EINA_UNUSED);
-static void _cb_del(void *data, void *data2 EINA_UNUSED);
-
-static void _cb_up(void *data, void *data2 EINA_UNUSED);
-static void _cb_dn(void *data, void *data2 EINA_UNUSED);
+static int _check_changed(E_Config_Dialog_Data *cfdata);
+
+
+static void _dont_touch_my_damn_keyboard_changed(void *data, Evas_Object *obj, void *event);
+static void _only_label_changed(void *data, Evas_Object *obj, void *event);
+
+static void _layout_clicked(void *data, Evas_Object *obj, void *event);
+static void _cb_add(void *data, Evas_Object *obj, void *event);
+static void _cb_del(void *data, Evas_Object *obj, void *event);
+
+static void _cb_up(void *data, Evas_Object *obj, void *event);
+static void _cb_dn(void *data, Evas_Object *obj, void *event);
+
+static void _cb_led_up(void *data, Evas_Object *obj, void *event);
+static void _cb_ctrl_up(void *data, Evas_Object *obj, void *event);
+static void _cb_compose_up(void *data, Evas_Object *obj, void *event);
+static void _cb_lv3_up(void *data, Evas_Object *obj, void *event);
+static void _cb_switch_up(void *data, Evas_Object *obj, void *event);
+static void _cb_keypad_up(void *data, Evas_Object *obj, void *event);
+static void _cb_delkeypad_up(void *data, Evas_Object *obj, void *event);
+static void _cb_capslock_up(void *data, Evas_Object *obj, void *event);
+static void _cb_altwin_up(void *data, Evas_Object *obj, void *event);
+static void _cb_currency_up(void *data, Evas_Object *obj, void *event);
+static void _cb_lv5_up(void *data, Evas_Object *obj, void *event);
+static void _cb_spacebar_up(void *data, Evas_Object *obj, void *event);
+static void _cb_japan_up(void *data, Evas_Object *obj, void *event);
+static void _cb_korean_up(void *data, Evas_Object *obj, void *event);
+static void _cb_esperanto_up(void *data, Evas_Object *obj, void *event);
+static void _cb_solaris_up(void *data, Evas_Object *obj, void *event);
+static void _cb_terminate_up(void *data, Evas_Object *obj, void *event);
+static void _cb_misc_up(void *data, Evas_Object *obj, void *event);
+
+static void _popup_cancel_clicked(void *data, Evas_Object *obj, void *event_info);
static void _dlg_add_cb_ok(void *data, E_Dialog *dlg);
static void _dlg_add_cb_cancel(void *data, E_Dialog *dlg);
@@ -52,7 +115,7 @@ static void _dlg_add_cb_del(void *obj);
static Eina_Bool _cb_dlg_fill_delay(void *data);
static void _cb_layout_select(void *data);
-static void _cb_used_select(void *data);
+static void _cb_used_select(void *data, Evas_Object *obj, void *event);
static Eina_Bool _cb_fill_delay(void *data);
@@ -72,7 +135,8 @@ _xkb_cfg_dialog(Evas_Object *parent EINA_UNUSED, const char *params EINA_UNUSED)
v->free_cfdata = _free_data;
v->basic.create_widgets = _basic_create;
v->basic.apply_cfdata = _basic_apply;
- v->basic.check_changed = _basic_check_changed;
+ v->advanced.create_widgets = _advanced_create;
+ v->advanced.apply_cfdata = _basic_apply;
cfd = e_config_dialog_new(NULL, _("Keyboard Settings"), "E",
"keyboard_and_mouse/xkbswitch",
@@ -84,15 +148,33 @@ _xkb_cfg_dialog(Evas_Object *parent EINA_UNUSED, const char *params EINA_UNUSED)
/* Locals */
+static Eina_Bool
+_fill_data(E_XKB_Option *op, const char *name, int size, Eina_List *check, Eina_List **add)
+{
+ E_XKB_Option *op2;
+ Eina_List *l;
+
+ if (!strncmp(op->name, name, size))
+ {
+ EINA_LIST_FOREACH(check, l, op2)
+ {
+ if (op->name == op2->name)
+ {
+ *add = eina_list_append(*add, op2);
+ return EINA_TRUE;
+ }
+ }
+ }
+ return EINA_FALSE;
+}
+
static void *
_create_data(E_Config_Dialog *cfd)
{
E_Config_Dialog_Data *cfdata;
- Eina_List *l, *ll, *lll;
+ Eina_List *l;
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? */
@@ -108,32 +190,41 @@ _create_data(E_Config_Dialog *cfd)
nl->model = eina_stringshare_add(cl->model);
nl->variant = eina_stringshare_add(cl->variant);
- cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, nl);
+ cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, nl);
}
/* Initialize options */
+ cfdata->default_model = eina_stringshare_add(e_config->xkb.default_model);
cfdata->only_label = e_config->xkb.only_label;
cfdata->dont_touch_my_damn_keyboard = e_config->xkb.dont_touch_my_damn_keyboard;
- cfdata->cfg_options = NULL;
- lll = e_config->xkb.used_options;
- EINA_LIST_FOREACH(optgroups, l, gr)
+#undef FILL_DATA
+#define FILL_DATA(name, list_name) \
+ if (_fill_data(op, name, (sizeof(name) - 1),\
+ opt ## list_name, \
+ &cfdata->cfg_ ## list_name ## _options)) continue
+
+ EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
{
- EINA_LIST_FOREACH(gr->options, ll, op)
- {
- od = E_NEW(E_XKB_Dialog_Option, 1);
- od->name = eina_stringshare_add(op->name);
- if (lll &&
- (od->name == ((E_Config_XKB_Option *)
- eina_list_data_get(lll))->name))
- {
- od->enabled = 1;
- lll = eina_list_next(lll);
- }
- else od->enabled = 0;
- cfdata->cfg_options = eina_list_append(cfdata->cfg_options, od);
- }
+ FILL_DATA("grp_led", led);
+ FILL_DATA("grp", switch);
+ FILL_DATA("lv3", lv3);
+ FILL_DATA("ctrl", ctrl);
+ FILL_DATA("keypad", keypad);
+ FILL_DATA("kpdl", delkeypad);
+ FILL_DATA("caps", capslock);
+ FILL_DATA("altwin", altwin);
+ FILL_DATA("compose", compose);
+ FILL_DATA("eurosign", currency);
+ FILL_DATA("rupeesign", currency);
+ FILL_DATA("lv5", lv5);
+ FILL_DATA("nbsp", spacebar);
+ FILL_DATA("japan", japan);
+ FILL_DATA("korean", korean);
+ FILL_DATA("esperanto", esperanto);
+ FILL_DATA("solaris", solaris);
+ FILL_DATA("terminate", terminate);
}
return cfdata;
@@ -143,7 +234,6 @@ static void
_free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
{
E_Config_XKB_Layout *cl;
- E_XKB_Dialog_Option *od;
_xkb.cfd = NULL;
@@ -155,25 +245,18 @@ _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
E_FREE(cl);
}
- EINA_LIST_FREE(cfdata->cfg_options, od)
- {
- eina_stringshare_del(od->name);
- E_FREE(od);
- }
-
eina_stringshare_del(cfdata->default_model);
E_FREE(cfdata);
clear_rules();
}
static int
-_basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
+_check_changed(E_Config_Dialog_Data *cfdata)
{
- Eina_List *l, *l2, *l3;
+ Eina_List *l, *l2;
+ Eina_List *list_option_found = NULL;
E_Config_XKB_Layout *cl, *nl;
- E_Config_XKB_Option *co;
- E_XKB_Dialog_Option *od;
- Eina_Bool found;
+ E_Config_XKB_Option *od, *op;
if ((eina_list_count(e_config->xkb.used_layouts) !=
eina_list_count(cfdata->cfg_layouts)) ||
@@ -193,27 +276,70 @@ _basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfd
l2 = eina_list_next(l2);
}
- l2 = e_config->xkb.used_options;
- EINA_LIST_FOREACH(cfdata->cfg_options, l, od)
+#undef CHECK_OPTION_AND_ADD
+#define CHECK_OPTION_AND_ADD(list) \
+ do { \
+ EINA_LIST_FOREACH(list, l, od) \
+ { \
+ if (op->name == od->name) \
+ { \
+ list_option_found = eina_list_append(list_option_found, op); \
+ break; \
+ } \
+ } \
+ } \
+ while(0); \
+ if (l) continue \
+
+ EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
{
- found = EINA_FALSE;
- EINA_LIST_FOREACH(l2, l3, co)
- {
- if (od->name == co->name)
- {
- found = EINA_TRUE;
- break;
- }
- }
- if ((!found) && (!od->enabled))
- continue;
- if (found && od->enabled)
- {
- l2 = eina_list_next(l3);
- continue;
- }
+ CHECK_OPTION_AND_ADD(cfdata->cfg_compose_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_lv3_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_switch_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_led_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_ctrl_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_keypad_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_delkeypad_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_capslock_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_altwin_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_currency_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_lv5_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_spacebar_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_japan_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_korean_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_esperanto_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_solaris_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_terminate_options);
+ CHECK_OPTION_AND_ADD(cfdata->cfg_misc_options);
+ }
+ /* If user have deleted an option */
+ if (eina_list_count(e_config->xkb.used_options) > eina_list_count(list_option_found))
+ {
+ eina_list_free(list_option_found);
return 1;
}
+ /* If user have added an option */
+ eina_list_free(list_option_found);
+ if ((eina_list_count(e_config->xkb.used_options))
+ < (eina_list_count(cfdata->cfg_compose_options)
+ + eina_list_count(cfdata->cfg_lv3_options)
+ + eina_list_count(cfdata->cfg_switch_options)
+ + eina_list_count(cfdata->cfg_led_options)
+ + eina_list_count(cfdata->cfg_ctrl_options)
+ + eina_list_count(cfdata->cfg_keypad_options)
+ + eina_list_count(cfdata->cfg_delkeypad_options)
+ + eina_list_count(cfdata->cfg_capslock_options)
+ + eina_list_count(cfdata->cfg_altwin_options)
+ + eina_list_count(cfdata->cfg_currency_options)
+ + eina_list_count(cfdata->cfg_lv5_options)
+ + eina_list_count(cfdata->cfg_spacebar_options)
+ + eina_list_count(cfdata->cfg_japan_options)
+ + eina_list_count(cfdata->cfg_korean_options)
+ + eina_list_count(cfdata->cfg_esperanto_options)
+ + eina_list_count(cfdata->cfg_solaris_options)
+ + eina_list_count(cfdata->cfg_terminate_options)
+ + eina_list_count(cfdata->cfg_misc_options)))
+ return 1;
return 0;
}
@@ -223,8 +349,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
{
Eina_List *l;
E_Config_XKB_Layout *cl, *nl;
- E_Config_XKB_Option *oc;
- E_XKB_Dialog_Option *od;
+ E_Config_XKB_Option *oc, *op;
Eina_Bool cur_ok = EINA_FALSE, sel_ok = EINA_FALSE;
EINA_LIST_FREE(e_config->xkb.used_layouts, cl)
@@ -285,253 +410,905 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
eina_stringshare_del(oc->name);
E_FREE(oc);
}
-
- EINA_LIST_FOREACH(cfdata->cfg_options, l, od)
- {
- if (!od->enabled) continue;
-
- oc = E_NEW(E_Config_XKB_Option, 1);
- oc->name = eina_stringshare_ref(od->name);
- e_config->xkb.used_options = eina_list_append(e_config->xkb.used_options, oc);
- }
+#undef FILL_CONFIG
+#define FILL_CONFIG(list) \
+ do { \
+ EINA_LIST_FOREACH(list, l, op) \
+ { \
+ oc = E_NEW(E_Config_XKB_Option, 1); \
+ oc->name = eina_stringshare_ref(op->name); \
+ e_config->xkb.used_options = eina_list_append(e_config->xkb.used_options, oc); \
+ } \
+ } while(0)
+
+ FILL_CONFIG(cfdata->cfg_compose_options);
+ FILL_CONFIG(cfdata->cfg_lv3_options);
+ FILL_CONFIG(cfdata->cfg_switch_options);
+ FILL_CONFIG(cfdata->cfg_led_options);
+ FILL_CONFIG(cfdata->cfg_ctrl_options);
+ FILL_CONFIG(cfdata->cfg_keypad_options);
+ FILL_CONFIG(cfdata->cfg_delkeypad_options);
+ FILL_CONFIG(cfdata->cfg_capslock_options);
+ FILL_CONFIG(cfdata->cfg_altwin_options);
+ FILL_CONFIG(cfdata->cfg_currency_options);
+ FILL_CONFIG(cfdata->cfg_lv5_options);
+ FILL_CONFIG(cfdata->cfg_spacebar_options);
+ FILL_CONFIG(cfdata->cfg_japan_options);
+ FILL_CONFIG(cfdata->cfg_korean_options);
+ FILL_CONFIG(cfdata->cfg_esperanto_options);
+ FILL_CONFIG(cfdata->cfg_solaris_options);
+ FILL_CONFIG(cfdata->cfg_terminate_options);
+ FILL_CONFIG(cfdata->cfg_misc_options);
e_xkb_reconfig();
e_config_save_queue();
return 1;
}
-static Evas_Object *
-_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
+static void
+_list_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Evas_Object **o;
+
+ o = data;
+
+ *o = NULL;
+}
+
+static void
+_option_del(void *data, Evas_Object *obj, void *event)
+{
+ Eina_List **list;
+ Eina_List *l;
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ l = evas_object_data_get(obj, "list_option");
+ list = evas_object_data_get(obj, "list");
+ (*list) = eina_list_remove_list((*list), l);
+ evas_object_del(obj);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_basic_create_fill(E_Config_Dialog_Data *cfdata)
{
- Evas_Object *mainn, *layoutss, *modelss, *options, *configs, *buttons,
- *general, *scroller, *only_label, *dont_touch_my_damn_keyboard;
E_XKB_Option *option;
- E_XKB_Option_Group *group;
- Eina_List *l, *ll, *lll;
- Evas_Coord mw, mh;
+ Eina_List *l;
+ Evas_Object *o;
+ E_Config_XKB_Layout *cl;
+ Elm_Object_Item *it, *sel = NULL;
+
+ elm_object_disabled_set(cfdata->chk_label,
+ cfdata->dont_touch_my_damn_keyboard);
+ elm_object_disabled_set(cfdata->used_list,
+ cfdata->dont_touch_my_damn_keyboard);
+ if (cfdata->dont_touch_my_damn_keyboard)
+ elm_list_select_mode_set(cfdata->used_list, ELM_OBJECT_SELECT_MODE_NONE);
+ else
+ elm_list_select_mode_set(cfdata->used_list, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ elm_object_disabled_set(cfdata->btn_add,
+ cfdata->dont_touch_my_damn_keyboard);
+ elm_object_disabled_set(cfdata->btn_del,
+ cfdata->dont_touch_my_damn_keyboard);
+ elm_object_disabled_set(cfdata->btn_up,
+ cfdata->dont_touch_my_damn_keyboard);
+ elm_object_disabled_set(cfdata->btn_down,
+ cfdata->dont_touch_my_damn_keyboard);
+ elm_object_disabled_set(cfdata->btn_layout,
+ cfdata->dont_touch_my_damn_keyboard);
+ if (cfdata->default_model)
+ elm_object_text_set(cfdata->btn_layout, cfdata->default_model);
+ else
+ elm_object_text_set(cfdata->btn_layout, "default");
+
+ /* Update the list of used layouts */
+ elm_list_clear(cfdata->used_list);
+ if (!cfdata->dont_touch_my_damn_keyboard)
+ {
+ EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
+ {
+ Evas_Object *ic = elm_icon_add(cfdata->used_list);
+ const char *name = cl->name;
+ char buf[PATH_MAX];
+
+ e_xkb_flag_file_get(buf, sizeof(buf), name);
+ elm_image_file_set(ic, buf, NULL);
+ snprintf(buf, sizeof(buf), "%s (%s, %s)",
+ cl->name, cl->model, cl->variant);
+ evas_object_show(ic);
+ it = elm_list_item_append(cfdata->used_list, buf, ic,
+ NULL, NULL, cl);
+ if (!l->prev)
+ sel = it;
+ }
+ if (sel)
+ elm_list_item_selected_set(sel, EINA_TRUE);
+ elm_list_go(cfdata->used_list);
+ }
+
+
+#undef FILL_GUI
+#define FILL_GUI(list, box, cb) \
+ do { \
+ if (!box) break; \
+ elm_box_clear(box); \
+ if (cfdata->dont_touch_my_damn_keyboard) break; \
+ EINA_LIST_FOREACH(list, l, option) \
+ { \
+ o = elm_button_add(box); \
+ elm_object_text_set(o, option->description); \
+ evas_object_data_set(o, "list_option", l); \
+ evas_object_data_set(o, "list", &list); \
+ evas_object_smart_callback_add(o, "clicked", _option_del, cfdata); \
+ elm_box_pack_end(box, o); \
+ evas_object_show(o); \
+ } \
+ o = elm_button_add(box); \
+ elm_object_text_set(o, "+"); \
+ evas_object_smart_callback_add(o, "clicked", cb, cfdata); \
+ elm_box_pack_end(box, o); \
+ evas_object_show(o); \
+ } while (0)
+
+ FILL_GUI(cfdata->cfg_compose_options, cfdata->compose_list, _cb_compose_up);
+ FILL_GUI(cfdata->cfg_lv3_options, cfdata->lv3_list, _cb_lv3_up);
+ FILL_GUI(cfdata->cfg_switch_options, cfdata->switch_list, _cb_switch_up);
+ FILL_GUI(cfdata->cfg_led_options, cfdata->led_list, _cb_led_up);
+ FILL_GUI(cfdata->cfg_ctrl_options, cfdata->ctrl_list, _cb_ctrl_up);
+ FILL_GUI(cfdata->cfg_keypad_options, cfdata->keypad_list, _cb_keypad_up);
+ FILL_GUI(cfdata->cfg_delkeypad_options, cfdata->delkeypad_list,
+ _cb_delkeypad_up);
+ FILL_GUI(cfdata->cfg_capslock_options, cfdata->capslock_list,
+ _cb_capslock_up);
+ FILL_GUI(cfdata->cfg_altwin_options, cfdata->altwin_list, _cb_altwin_up);
+ FILL_GUI(cfdata->cfg_currency_options, cfdata->currency_list,
+ _cb_currency_up);
+ FILL_GUI(cfdata->cfg_lv5_options, cfdata->lv5_list, _cb_lv5_up);
+ FILL_GUI(cfdata->cfg_spacebar_options, cfdata->spacebar_list,
+ _cb_spacebar_up);
+ FILL_GUI(cfdata->cfg_japan_options, cfdata->japan_list, _cb_japan_up);
+ FILL_GUI(cfdata->cfg_korean_options, cfdata->korean_list, _cb_korean_up);
+ FILL_GUI(cfdata->cfg_esperanto_options, cfdata->esperanto_list,
+ _cb_esperanto_up);
+ FILL_GUI(cfdata->cfg_solaris_options, cfdata->solaris_list, _cb_solaris_up);
+ FILL_GUI(cfdata->cfg_terminate_options,
+ cfdata->terminate_list, _cb_terminate_up);
+ FILL_GUI(cfdata->cfg_misc_options, cfdata->misc_list, _cb_misc_up);
+}
+
+static Evas_Object *
+_config_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
+{
+ Evas_Object *mainn, *configs, *buttons, *only_label,
+ *dont_touch_my_damn_keyboard;
+ Evas_Object *listh, *frame;
+ Evas_Object *o;
+
/* Holds the dialog contents, displays a toolbar on the top */
e_dialog_resizable_set(cfd->dia, 1);
- mainn = e_widget_toolbook_add(evas, 24, 24);
-
- /* Holds the used layouts ilist and the button table */
- layoutss = e_widget_list_add(evas, 0, 0);
- /* Holds the used layouts */
- configs = e_widget_ilist_add(evas, 32, 32, NULL);
+ /* The main evas */
+ cfdata->evas = evas;
- e_widget_size_min_set(configs, 220, 160);
- e_widget_ilist_go(configs);
+ mainn = elm_box_add(cfd->dia->win);
+ elm_box_horizontal_set(mainn, EINA_FALSE);
+ evas_object_size_hint_weight_set(mainn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ dont_touch_my_damn_keyboard = elm_check_add(mainn);
+ evas_object_smart_callback_add(dont_touch_my_damn_keyboard, "changed",
+ _dont_touch_my_damn_keyboard_changed, cfdata);
+ elm_object_text_set(dont_touch_my_damn_keyboard,
+ _("Do not apply any keyboard settings ever"));
+ evas_object_show(dont_touch_my_damn_keyboard);
+ evas_object_size_hint_align_set(dont_touch_my_damn_keyboard, 0.0, 0.5);
+ elm_box_pack_end(mainn, dont_touch_my_damn_keyboard);
+
+ only_label = elm_check_add(mainn);
+ evas_object_smart_callback_add(only_label, "changed",
+ _only_label_changed, cfdata);
+ cfdata->chk_label = only_label;
+ elm_object_text_set(only_label, _("Label only in gadgets"));
+ evas_object_show(only_label);
+ evas_object_size_hint_align_set(only_label, 0.0, 0.5);
+ elm_box_pack_end(mainn, only_label);
+
+ o = elm_separator_add(mainn);
+ elm_separator_horizontal_set(o, EINA_TRUE);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, 0.5);
+ evas_object_show(o);
+ elm_box_pack_end(mainn, o);
+
+ /* Holds the default layouts */
+ listh = elm_box_add(mainn);
+ elm_box_horizontal_set(listh, EINA_TRUE);
+ elm_box_homogeneous_set(listh, EINA_TRUE);
+ evas_object_size_hint_align_set(listh, EVAS_HINT_FILL, 0.5);
+ o = elm_label_add(listh);
+ elm_object_text_set(o, _("Default keyboard layout"));
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(listh, o);
+ evas_object_show(o);
+ o = elm_button_add(listh);
+ cfdata->btn_layout = o;
+ evas_object_smart_callback_add(o, "clicked", _layout_clicked, cfdata);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(o);
+ elm_box_pack_end(listh, o);
+ evas_object_show(listh);
+ elm_box_pack_end(mainn, listh);
- e_widget_list_object_append(layoutss, configs, 1, 1, 0.5);
+ /* Holds the used layouts */
+ listh = elm_box_add(mainn);
+ elm_box_horizontal_set(listh, EINA_TRUE);
+ o = evas_object_rectangle_add(listh);
+ evas_object_size_hint_min_set(o, 0, 160);
+ elm_box_pack_end(listh, o);
+ configs = elm_list_add(listh);
+ evas_object_size_hint_align_set(configs, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(configs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(listh, configs);
+ elm_box_pack_end(mainn, listh);
+ evas_object_show(configs);
+ evas_object_size_hint_align_set(listh, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(listh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(listh);
+ evas_object_smart_callback_add(configs, "selected", _cb_used_select, cfdata);
cfdata->used_list = configs;
/* Holds the buttons */
- buttons = e_widget_table_add(e_win_evas_win_get(evas), 1);
- cfdata->btn_up = e_widget_button_add(evas, _("Up"), "go-up", _cb_up, cfdata, NULL);
- e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
- e_widget_table_object_append(buttons, cfdata->btn_up, 0, 0, 1, 1, 1, 1, 1, 0);
+ buttons = elm_table_add(mainn);
+ elm_table_homogeneous_set(buttons, EINA_TRUE);
+
+ o = elm_button_add(buttons);
+ cfdata->btn_add = o;
+ elm_object_text_set(o, _("Add"));
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(o, "clicked", _cb_add, cfdata);
+ evas_object_show(o);
+ elm_table_pack(buttons, o, 0, 0, 1, 1);
+
+ o = elm_button_add(buttons);
+ cfdata->btn_del = o;
+ elm_object_text_set(o, _("Del"));
+ elm_object_disabled_set(o, EINA_TRUE);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(o, "clicked", _cb_del, cfdata);
+ evas_object_show(o);
+ elm_table_pack(buttons, o, 0, 1, 1, 1);
+
+ o = elm_button_add(buttons);
+ cfdata->btn_up = o;
+ elm_object_text_set(o, _("Up"));
+ elm_object_disabled_set(o, EINA_TRUE);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(o, "clicked", _cb_up, cfdata);
+ evas_object_show(o);
+ elm_table_pack(buttons, o, 1, 0, 1, 1);
+
+ o = elm_button_add(buttons);
+ cfdata->btn_down = o;
+ elm_object_text_set(o, _("Down"));
+ elm_object_disabled_set(o, EINA_TRUE);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(o, "clicked", _cb_dn, cfdata);
+ evas_object_show(o);
+ elm_table_pack(buttons, o, 1, 1, 1, 1);
+
+ evas_object_size_hint_fill_set(buttons, EVAS_HINT_FILL, 0.5);
+ evas_object_show(buttons);
+ elm_box_pack_end(mainn, buttons);
+
+ elm_box_pack_end(mainn, buttons);
+ evas_object_show(buttons);
+
+ o = elm_separator_add(mainn);
+ elm_separator_horizontal_set(o, EINA_TRUE);
+ evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, 0.5);
+ evas_object_show(o);
+ elm_box_pack_end(mainn, o);
+
+#define FRAME_ADD(name, list) \
+ do { \
+ frame = elm_frame_add(mainn); \
+ elm_object_text_set(frame, name); \
+ listh = elm_box_add(frame); \
+ elm_object_content_set(frame, listh); \
+ elm_box_layout_set(listh, evas_object_box_layout_flow_horizontal, \
+ NULL, NULL); \
+ evas_object_size_hint_weight_set(listh, EVAS_HINT_EXPAND, 0.0); \
+ elm_box_pack_end(mainn, frame); \
+ evas_object_size_hint_fill_set(frame, EVAS_HINT_FILL, 0.5); \
+ evas_object_show(frame); \
+ evas_object_size_hint_weight_set(listh, EVAS_HINT_EXPAND, 0.0); \
+ evas_object_size_hint_align_set(listh, EVAS_HINT_FILL, 0.5); \
+ elm_box_align_set(listh, 0.0, 0.5); \
+ evas_object_event_callback_add(listh, EVAS_CALLBACK_DEL, \
+ _list_del, &list); \
+ list = listh; \
+ } while (0)
+
+
+ FRAME_ADD(_("Compose"), cfdata->compose_list);
+ FRAME_ADD(_("Third level"), cfdata->lv3_list);
+ FRAME_ADD(_("Switch layout"), cfdata->switch_list);
- cfdata->btn_down = e_widget_button_add(evas, _("Down"), "go-down", _cb_dn, cfdata, NULL);
- e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
- e_widget_table_object_append(buttons, cfdata->btn_down, 1, 0, 1, 1, 1, 1, 1, 0);
+ return mainn;
+}
- cfdata->btn_add = e_widget_button_add(evas, _("Add"), "list-add", _cb_add, cfdata, NULL);
- e_widget_table_object_append(buttons, cfdata->btn_add, 0, 1, 1, 1, 1, 1, 1, 0);
+static Evas_Object *
+_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
+{
+ Evas_Object *mainn;
- cfdata->btn_del = e_widget_button_add(evas, _("Remove"), "list-remove", _cb_del, cfdata, NULL);
- e_widget_disabled_set(cfdata->btn_del, EINA_TRUE);
- e_widget_table_object_append(buttons, cfdata->btn_del, 1, 1, 1, 1, 1, 1, 1, 0);
+ mainn = _config_basic_create(cfd, evas, cfdata);
- e_widget_list_object_append(layoutss, buttons, 1, 0, 1);
+ /* Clear up any previous timer */
+ if (cfdata->fill_delay)
+ ecore_timer_del(cfdata->fill_delay);
- e_widget_toolbook_page_append(mainn, NULL, _("Configurations"), layoutss, 1, 1, 1, 1, 0.5, 0.0);
+ /* Trigger the fill */
+ cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
+
+ return mainn;
+}
- /* Holds the default models */
- modelss = e_widget_ilist_add(evas, 32, 32, &cfdata->default_model);
- e_widget_size_min_set(modelss, 220, 160);
- cfdata->dmodel_list = modelss;
- e_widget_toolbook_page_append(mainn, NULL, _("Models"), modelss, 1, 1, 1, 1, 0.5, 0.0);
+static Evas_Object *
+_advanced_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
+{
+ Evas_Object *mainn;
+ Evas_Object *frame, *listh;
+ Evas_Object *sc;
+
+ sc = elm_scroller_add(cfd->dia->win);
+
+ mainn = _config_basic_create(cfd, evas, cfdata);
+
+ FRAME_ADD(_("Led"), cfdata->led_list);
+ FRAME_ADD(_("Control"), cfdata->ctrl_list);
+ FRAME_ADD(_("Keypad"), cfdata->keypad_list);
+ FRAME_ADD(_("Keypad delete key"), cfdata->delkeypad_list);
+ FRAME_ADD(_("Capslock"), cfdata->capslock_list);
+ FRAME_ADD(_("Alt win"), cfdata->altwin_list);
+ FRAME_ADD(_("Currency"), cfdata->currency_list);
+ FRAME_ADD(_("Fifth level"), cfdata->lv5_list);
+ FRAME_ADD(_("Spacebar"), cfdata->spacebar_list);
+ FRAME_ADD(_("Japan"), cfdata->japan_list);
+ FRAME_ADD(_("Korean"), cfdata->korean_list);
+ FRAME_ADD(_("Esperanto"), cfdata->esperanto_list);
+ FRAME_ADD(_("Solaris"), cfdata->solaris_list);
+ FRAME_ADD(_("Terminate X"), cfdata->terminate_list);
+ FRAME_ADD(_("Miscelaneous"), cfdata->misc_list);
+
+ elm_object_content_set(sc, mainn);
- /* Holds the options */
- options = e_widget_list_add(evas, 0, 0);
+ /* Clear up any previous timer */
+ if (cfdata->fill_delay)
+ ecore_timer_del(cfdata->fill_delay);
- general = e_widget_framelist_add(evas, _("General"), 0);
- dont_touch_my_damn_keyboard = e_widget_check_add(evas, _("Do not apply any keyboard settings ever"), &(cfdata->dont_touch_my_damn_keyboard));
- e_widget_framelist_object_append(general, dont_touch_my_damn_keyboard);
- only_label = e_widget_check_add(evas, _("Label only in gadgets"), &(cfdata->only_label));
- e_widget_check_widget_disable_on_checked_add(dont_touch_my_damn_keyboard, only_label);
- e_widget_framelist_object_append(general, only_label);
- e_widget_list_object_append(options, general, 1, 1, 0.0);
+ /* Trigger the fill */
+ cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
- lll = cfdata->cfg_options;
+ return sc;
+}
- EINA_LIST_FOREACH(optgroups, l, group)
+static void
+_model_item_clicked(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ E_XKB_Model *model;
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(model = data)) return;
+
+ cfdata = evas_object_data_get(obj, "cfdata");
+
+ elm_object_text_set(cfdata->btn_layout, model->name);
+ eina_stringshare_replace(&cfdata->default_model, model->name);
+ evas_object_del(cfdata->popup);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_layout_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ Evas_Object *popup, *fr, *vbx, *bx, *list, *o;
+ E_XKB_Model *model;
+ E_Config_Dialog_Data *cfdata;
+ Elm_Object_Item *it, *sel;
+ Eina_List *l;
+
+ if (!(cfdata = data)) return;
+
+ popup = elm_popup_add(cfdata->cfd->dia->win);
+ elm_popup_allow_events_set(popup, EINA_FALSE);
+
+ fr = elm_frame_add(popup);
+ elm_object_text_set(fr, _("Default keyboard layout"));
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(popup, fr);
+ vbx = elm_box_add(fr);
+ elm_box_horizontal_set(vbx, EINA_FALSE);
+ elm_object_content_set(fr, vbx);
+
+ bx = elm_box_add(vbx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(vbx, bx);
+
+ o = evas_object_rectangle_add(evas_object_evas_get(fr));
+ evas_object_size_hint_min_set(o, 0, 240);
+ elm_box_pack_end(bx, o);
+
+ list = elm_list_add(fr);
+ elm_list_mode_set(list, ELM_LIST_COMPRESS);
+ elm_box_pack_end(bx, list);
+ evas_object_data_set(list, "cfdata", cfdata);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ EINA_LIST_FOREACH(models, l, model)
{
- Evas_Object *grp;
+ it = elm_list_item_append(list, model->name, NULL, NULL,
+ _model_item_clicked, model);
+ if ((model->name == cfdata->default_model)
+ || ((!cfdata->default_model) && (!strcmp(model->name, "default"))))
+ it = sel;
+ }
+ elm_list_item_selected_set(it, EINA_TRUE);
+ elm_list_go(list);
+
+ o = elm_button_add(vbx);
+ elm_object_text_set(o, _("Cancel"));
+ evas_object_smart_callback_add(o, "clicked", _popup_cancel_clicked, popup);
+ evas_object_show(o);
+ elm_box_pack_end(vbx, o);
+
+ evas_object_show(fr);
+ evas_object_show(vbx);
+ evas_object_show(bx);
+ evas_object_show(list);
+ evas_object_show(popup);
+ cfdata->popup = popup;
+}
+
+static void
+_cb_add(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+ if (!(cfdata = data)) return;
+
+ if (cfdata->dlg_add_new) elm_win_raise(cfdata->dlg_add_new->win);
+ else cfdata->dlg_add_new = _dlg_add_new(cfdata);
+}
+
+static void
+_cb_del(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+ Elm_Object_Item *it;
+ E_Config_XKB_Layout *cl;
- grp = e_widget_framelist_add(evas, group->description, 0);
+ if (!(cfdata = data)) return;
+
+ it = elm_list_selected_item_get(cfdata->used_list);
+ if (!it) return;
+ cl = elm_object_item_data_get(it);
+ elm_object_item_del(it);
+ if (!cl) return;
+ cfdata->cfg_layouts = eina_list_remove(cfdata->cfg_layouts, cl);
+ it = elm_list_first_item_get(cfdata->used_list);
+ if (it)
+ elm_list_item_selected_set(it, EINA_TRUE);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_popup_cancel_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ evas_object_del(data);
+}
+
+static void
+_popup_item_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Eina_List **cfg_opts;
+ E_Config_Dialog_Data *cfdata;
+
+ cfg_opts = evas_object_data_get(obj, "cfg_opts");
+ cfdata = evas_object_data_get(obj, "cfdata");
- EINA_LIST_FOREACH(group->options, ll, option)
+ *cfg_opts = eina_list_append((*cfg_opts), data);
+ evas_object_del(cfdata->popup);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+
+ _basic_create_fill(cfdata);
+}
+
+static Evas_Object *
+_popup_item_tooltip(void *data, Evas_Object *obj, Evas_Object *tooltip, void *item)
+{
+ E_XKB_Option *option;
+ Evas_Object *o;
+
+ if (!(option = data)) return NULL;
+ o = elm_label_add(tooltip);
+ elm_object_text_set(o, option->description);
+ elm_label_line_wrap_set(o, ELM_WRAP_WORD);
+
+ return o;
+}
+
+static void
+_popup_add(Evas_Object *win, const char *title, E_Config_Dialog_Data *cfdata, Eina_List *opts, Eina_List **cfg_opts, Evas_Object *list_objects)
+{
+ Evas_Object *popup, *fr, *vbx, *bx, *list, *o;
+ E_XKB_Option *option, *op;
+ Eina_List *l, *ll;
+ Eina_Bool found;
+ Elm_Object_Item *it;
+
+ popup = elm_popup_add(win);
+ elm_popup_allow_events_set(popup, EINA_FALSE);
+
+ fr = elm_frame_add(popup);
+ elm_object_text_set(fr, title);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(popup, fr);
+ vbx = elm_box_add(fr);
+ elm_box_horizontal_set(vbx, EINA_FALSE);
+ elm_object_content_set(fr, vbx);
+
+ bx = elm_box_add(vbx);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_box_pack_end(vbx, bx);
+
+ o = evas_object_rectangle_add(evas_object_evas_get(fr));
+ evas_object_size_hint_min_set(o, 0, 240);
+ elm_box_pack_end(bx, o);
+
+ list = elm_list_add(fr);
+ elm_list_mode_set(list, ELM_LIST_COMPRESS);
+ elm_box_pack_end(bx, list);
+ evas_object_data_set(list, "cfg_opts", cfg_opts);
+ evas_object_data_set(list, "cfdata", cfdata);
+
+ EINA_LIST_FOREACH(opts, l, option)
+ {
+ found = EINA_FALSE;
+ EINA_LIST_FOREACH(*cfg_opts, ll, op)
+ {
+ if (op == option)
+ found = EINA_TRUE;
+ }
+ if (!found)
{
- Evas_Object *chk;
-
- chk = e_widget_check_add(evas, option->description,
- &(((E_XKB_Dialog_Option *)
- eina_list_data_get(lll))->enabled));
- e_widget_check_widget_disable_on_checked_add(dont_touch_my_damn_keyboard, chk);
- e_widget_framelist_object_append(grp, chk);
- lll = eina_list_next(lll);
+ it = elm_list_item_append(list, option->description, NULL, NULL,
+ _popup_item_clicked, option);
+ elm_object_item_tooltip_content_cb_set(it, _popup_item_tooltip,
+ option, NULL);
}
- e_widget_list_object_append(options, grp, 1, 1, 0.0);
}
+ o = elm_button_add(vbx);
+ elm_object_text_set(o, _("Cancel"));
+ evas_object_smart_callback_add(o, "clicked", _popup_cancel_clicked, popup);
+ elm_box_pack_end(vbx, o);
+ evas_object_size_hint_weight_set(vbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(vbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(vbx);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bx);
+ evas_object_show(o);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(list);
+ evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(fr);
+ evas_object_show(popup);
+ cfdata->popup = popup;
+}
- e_widget_size_min_get(options, &mw, &mh);
+static void
+_cb_compose_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- if (mw < 220) mw = 220;
- if (mh < 160) mh = 160;
+ if (!(cfdata = data)) return;
- evas_object_size_hint_min_set(options, mw, mh);
- E_EXPAND(options);
- E_FILL(options);
+ _popup_add(cfdata->cfd->dia->win, _("Compose"), cfdata, optcompose,
+ &cfdata->cfg_compose_options, cfdata->compose_list);
+}
- scroller = elm_scroller_add(e_win_evas_win_get(evas));
- E_EXPAND(scroller);
- E_FILL(scroller);
- elm_scroller_bounce_set(scroller, 0, 0);
- elm_object_content_set(scroller, options);
- e_widget_sub_object_add(mainn, options);
+static void
+_cb_lv3_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- e_widget_toolbook_page_append(mainn, NULL, _("Options"), scroller, 1, 1, 1, 1, 0.5, 0.0);
+ if (!(cfdata = data)) return;
- /* Display the first page by default */
- e_widget_toolbook_page_show(mainn, 0);
+ _popup_add(cfdata->cfd->dia->win, _("Third level"), cfdata, optlv3,
+ &cfdata->cfg_lv3_options, cfdata->lv3_list);
+}
- /* The main evas */
- cfdata->evas = evas;
+static void
+_cb_switch_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- /* Clear up any previous timer */
- if (cfdata->fill_delay)
- ecore_timer_del(cfdata->fill_delay);
+ if (!(cfdata = data)) return;
- /* Trigger the fill */
- cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
+ _popup_add(cfdata->cfd->dia->win, _("Switch Layout"), cfdata, optswitch,
+ &cfdata->cfg_switch_options, cfdata->switch_list);
+}
- return mainn;
+static void
+_cb_led_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Led"), cfdata, optled,
+ &cfdata->cfg_led_options, cfdata->led_list);
}
+
static void
-_cb_add(void *data, void *data2 EINA_UNUSED)
+_cb_ctrl_up(void *data, Evas_Object *obj, void *event)
{
E_Config_Dialog_Data *cfdata;
+
if (!(cfdata = data)) return;
- e_config_dialog_changed_set(cfdata->cfd, 1);
- if (cfdata->dlg_add_new) elm_win_raise(cfdata->dlg_add_new->win);
- else cfdata->dlg_add_new = _dlg_add_new(cfdata);
+ _popup_add(cfdata->cfd->dia->win, _("Switch Layout"), cfdata, optswitch,
+ &cfdata->cfg_ctrl_options, cfdata->ctrl_list);
}
static void
-_cb_del(void *data, void *data2 EINA_UNUSED)
+_cb_keypad_up(void *data, Evas_Object *obj, void *event)
{
E_Config_Dialog_Data *cfdata;
- int n = 0;
if (!(cfdata = data)) return;
- if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
- e_config_dialog_changed_set(cfdata->cfd, 1);
- cfdata->cfg_layouts = eina_list_remove_list(cfdata->cfg_layouts, eina_list_nth_list(cfdata->cfg_layouts, n));
+ _popup_add(cfdata->cfd->dia->win, _("Keypad"), cfdata, optkeypad,
+ &cfdata->cfg_keypad_options, cfdata->keypad_list);
+}
- /* Update the list */
- evas_event_freeze(cfdata->evas);
- edje_freeze();
- e_widget_ilist_freeze(cfdata->used_list);
- e_widget_ilist_remove_num(cfdata->used_list, n);
- e_widget_ilist_go(cfdata->used_list);
- e_widget_ilist_thaw(cfdata->used_list);
- edje_thaw();
- evas_event_thaw(cfdata->evas);
+
+static void
+_cb_delkeypad_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Keypad delete key"), cfdata, optdelkeypad,
+ &cfdata->cfg_delkeypad_options, cfdata->delkeypad_list);
}
static void
-_cb_up(void *data, void *data2 EINA_UNUSED)
+_cb_capslock_up(void *data, Evas_Object *obj, void *event)
{
E_Config_Dialog_Data *cfdata;
- void *nddata;
- Evas_Object *ic;
- Eina_List *l;
- const char *lbl, *file;
- int n;
if (!(cfdata = data)) return;
- if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
- l = eina_list_nth_list(cfdata->cfg_layouts, n);
+ _popup_add(cfdata->cfd->dia->win, _("Capslock"), cfdata, optcapslock,
+ &cfdata->cfg_capslock_options, cfdata->capslock_list);
+}
- nddata = eina_list_data_get(eina_list_prev(l));
- eina_list_data_set(eina_list_prev(l), eina_list_data_get(l));
- eina_list_data_set(l, nddata);
+static void
+_cb_altwin_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- /* Update the list */
+ if (!(cfdata = data)) return;
- evas_event_freeze(cfdata->evas);
- edje_freeze();
- e_widget_ilist_freeze(cfdata->used_list);
+ _popup_add(cfdata->cfd->dia->win, _("Alternate win key"), cfdata, optaltwin,
+ &cfdata->cfg_altwin_options, cfdata->altwin_list);
+}
- ic = e_icon_add(cfdata->evas);
- e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n), &file, NULL);
- e_icon_file_set(ic, file);
- lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n);
- e_widget_ilist_prepend_relative_full(cfdata->used_list, ic, NULL, lbl, _cb_used_select, cfdata, NULL, (n - 1));
- e_widget_ilist_remove_num(cfdata->used_list, n);
+static void
+_cb_currency_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- e_widget_ilist_go(cfdata->used_list);
- e_widget_ilist_thaw(cfdata->used_list);
- edje_thaw();
- evas_event_thaw(cfdata->evas);
+ if (!(cfdata = data)) return;
- e_widget_ilist_selected_set(cfdata->used_list, (n - 1));
+ _popup_add(cfdata->cfd->dia->win, _("Currency"), cfdata, optcurrency,
+ &cfdata->cfg_currency_options, cfdata->currency_list);
}
static void
-_cb_dn(void *data, void *data2 EINA_UNUSED)
+_cb_lv5_up(void *data, Evas_Object *obj, void *event)
{
E_Config_Dialog_Data *cfdata;
- void *nddata;
- Evas_Object *ic;
- Eina_List *l;
- const char *lbl, *file;
- int n;
if (!(cfdata = data)) return;
- if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
- l = eina_list_nth_list(cfdata->cfg_layouts, n);
+ _popup_add(cfdata->cfd->dia->win, _("Fifth level"), cfdata, optlv5,
+ &cfdata->cfg_lv5_options, cfdata->lv5_list);
+}
- nddata = eina_list_data_get(eina_list_next(l));
- eina_list_data_set(eina_list_next(l), eina_list_data_get(l));
- eina_list_data_set(l, nddata);
+static void
+_cb_spacebar_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- /* Update the list */
+ if (!(cfdata = data)) return;
- evas_event_freeze(cfdata->evas);
- edje_freeze();
- e_widget_ilist_freeze(cfdata->used_list);
+ _popup_add(cfdata->cfd->dia->win, _("Spacebar"), cfdata, optspacebar,
+ &cfdata->cfg_spacebar_options, cfdata->spacebar_list);
+}
- ic = e_icon_add(cfdata->evas);
- e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n), &file, NULL);
- e_icon_file_set(ic, file);
- lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n);
- e_widget_ilist_append_relative_full(cfdata->used_list, ic, NULL, lbl, _cb_used_select, cfdata, NULL, n);
- e_widget_ilist_remove_num(cfdata->used_list, n);
+static void
+_cb_japan_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
- e_widget_ilist_go(cfdata->used_list);
- e_widget_ilist_thaw(cfdata->used_list);
- edje_thaw();
- evas_event_thaw(cfdata->evas);
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Japan"), cfdata, optjapan,
+ &cfdata->cfg_japan_options, cfdata->japan_list);
+}
+
+static void
+_cb_korean_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Korean"), cfdata, optkorean,
+ &cfdata->cfg_korean_options, cfdata->korean_list);
+}
+
+static void
+_cb_esperanto_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Esperanto"), cfdata, optesperanto,
+ &cfdata->cfg_esperanto_options, cfdata->esperanto_list);
+}
+
+static void
+_cb_solaris_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Solaris"), cfdata, optsolaris,
+ &cfdata->cfg_solaris_options, cfdata->solaris_list);
+}
+
+static void
+_cb_terminate_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
- e_widget_ilist_selected_set(cfdata->used_list, (n + 1));
+ _popup_add(cfdata->cfd->dia->win, _("Terminate X"), cfdata, optterminate,
+ &cfdata->cfg_terminate_options, cfdata->terminate_list);
+}
+
+static void
+_cb_misc_up(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ _popup_add(cfdata->cfd->dia->win, _("Miscelaneous"), cfdata, optmisc,
+ &cfdata->cfg_misc_options, cfdata->misc_list);
+}
+
+
+static void
+_dont_touch_my_damn_keyboard_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ cfdata->dont_touch_my_damn_keyboard = elm_check_state_get(obj);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+
+ _basic_create_fill(cfdata);
+}
+
+static void
+_only_label_changed(void *data, Evas_Object *obj, void *event)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ if (!(cfdata = data)) return;
+
+ cfdata->only_label = elm_check_state_get(obj);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_cb_up(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+ Elm_Object_Item *it, *prev;
+ E_Config_XKB_Layout *cl;
+ Eina_List *l, *ll;
+ void *ndata;
+
+ if (!(cfdata = data)) return;
+
+ it = elm_list_selected_item_get(cfdata->used_list);
+ if (!it) return;
+ prev = elm_list_item_prev(it);
+ if ((!prev) || (prev == it)) return;
+ ndata = elm_object_item_data_get(it);
+ EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
+ {
+ if (cl == ndata)
+ {
+ ll = eina_list_prev(l);
+ eina_list_data_set(l, eina_list_data_get(ll));
+ eina_list_data_set(ll, ndata);
+ break;
+ }
+ }
+ if (!l) return;
+ prev = elm_list_item_insert_before(cfdata->used_list, prev,
+ elm_object_item_text_get(it),
+ NULL, NULL, NULL,
+ ndata);
+ elm_object_item_del(it);
+ elm_list_item_selected_set(prev, EINA_TRUE);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_cb_dn(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+ Elm_Object_Item *it, *next;
+ E_Config_XKB_Layout *cl;
+ Eina_List *l, *ll;
+ void *ndata;
+
+ if (!(cfdata = data)) return;
+
+ it = elm_list_selected_item_get(cfdata->used_list);
+ if (!it) return;
+ next = elm_list_item_next(it);
+ if ((!next) || (next == it)) return;
+ ndata = elm_object_item_data_get(it);
+ EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
+ {
+ if (cl == ndata)
+ {
+ ll = eina_list_next(l);
+ if (!ll) return;
+ eina_list_data_set(l, eina_list_data_get(ll));
+ eina_list_data_set(ll, ndata);
+ break;
+ }
+ }
+ if (!l) return;
+ next = elm_list_item_insert_after(cfdata->used_list, next,
+ elm_object_item_text_get(it),
+ NULL, NULL, NULL,
+ elm_object_item_data_get(it));
+ elm_object_item_del(it);
+ elm_list_item_selected_set(next, EINA_TRUE);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
}
static E_Dialog *
@@ -546,7 +1323,7 @@ _dlg_add_new(E_Config_Dialog_Data *cfdata)
e_dialog_resizable_set(dlg, 1);
dlg->data = cfdata;
-
+
e_object_del_attach_func_set(E_OBJECT(dlg), _dlg_add_cb_del);
elm_win_center(dlg->win, 1, 1);
@@ -602,7 +1379,7 @@ _dlg_add_cb_ok(void *data EINA_UNUSED, E_Dialog *dlg)
{
E_Config_Dialog_Data *cfdata = dlg->data;
E_Config_XKB_Layout *cl;
- char buf[4096];
+ char buf[PATH_MAX], icon_buf[PATH_MAX];
Evas_Object *ic;
/* Configuration information */
Eina_Stringshare *layout, *model, *variant;
@@ -620,26 +1397,17 @@ _dlg_add_cb_ok(void *data EINA_UNUSED, E_Dialog *dlg)
cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, cl);
/* Update the main list */
- evas_event_freeze(cfdata->evas);
- edje_freeze();
- e_widget_ilist_freeze(cfdata->used_list);
-
- ic = e_icon_add(cfdata->evas);
-
- e_xkb_e_icon_flag_setup(ic, cl->name);
+ ic = elm_icon_add(cfdata->used_list);
+ e_xkb_flag_file_get(icon_buf, sizeof(icon_buf), cl->name);
+ elm_image_file_set(ic, icon_buf, NULL);
snprintf(buf, sizeof(buf), "%s (%s, %s)",
cl->name, cl->model, cl->variant);
- e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf,
- _cb_used_select, cfdata, NULL);
-
- e_widget_ilist_go(cfdata->used_list);
- e_widget_ilist_thaw(cfdata->used_list);
- edje_thaw();
- evas_event_thaw(cfdata->evas);
+ elm_list_item_append(cfdata->used_list, buf, ic, NULL, NULL, cl);
+ elm_list_go(cfdata->used_list);
cfdata->dlg_add_new = NULL;
e_object_del(E_OBJECT(dlg));
- e_config_dialog_changed_set(cfdata->cfd, 1);
+ e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
}
static void
@@ -665,6 +1433,9 @@ _cb_dlg_fill_delay(void *data)
Eina_List *l;
E_XKB_Layout *layout;
char buf[4096];
+ const char *lang;
+ E_Locale_Parts *lang_part = NULL;
+ int i = 0, sel = 0;;
if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
@@ -675,6 +1446,12 @@ _cb_dlg_fill_delay(void *data)
e_widget_ilist_freeze(cfdata->layout_list);
e_widget_ilist_clear(cfdata->layout_list);
+ lang = e_intl_language_get();
+ if (lang)
+ {
+ lang_part = e_intl_locale_parts_get(lang);
+ }
+
EINA_LIST_FOREACH(layouts, l, layout)
{
Evas_Object *ic;
@@ -685,7 +1462,14 @@ _cb_dlg_fill_delay(void *data)
layout->description, layout->name);
e_widget_ilist_append_full(cfdata->layout_list, ic, NULL, buf,
_cb_layout_select, cfdata, layout->name);
+ if (lang_part)
+ {
+ if (!strncasecmp(lang_part->region, layout->name, 2))
+ sel = i;
+ }
+ ++i;
}
+ if (lang_part) e_intl_locale_parts_free(lang_part);
e_widget_ilist_go(cfdata->layout_list);
e_widget_ilist_thaw(cfdata->layout_list);
@@ -693,6 +1477,8 @@ _cb_dlg_fill_delay(void *data)
edje_thaw();
evas_event_thaw(cfdata->dlg_evas);
+ e_widget_ilist_selected_set(cfdata->layout_list, sel);
+
cfdata->dlg_fill_delay = NULL;
return ECORE_CALLBACK_CANCEL;
}
@@ -766,90 +1552,47 @@ static Eina_Bool
_cb_fill_delay(void *data)
{
E_Config_Dialog_Data *cfdata;
- Eina_List *l;
- E_Config_XKB_Layout *cl;
- E_XKB_Model *model;
- int n = 0;
- char buf[4096];
if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
- /* Update the list of used layouts */
- evas_event_freeze(cfdata->evas);
- edje_freeze();
-
- e_widget_ilist_freeze(cfdata->used_list);
- e_widget_ilist_clear(cfdata->used_list);
-
- EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
- {
- Evas_Object *ic = e_icon_add(cfdata->evas);
- const char *name = cl->name;
-
- e_xkb_e_icon_flag_setup(ic, name);
- snprintf(buf, sizeof(buf), "%s (%s, %s)",
- cl->name, cl->model, cl->variant);
- e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf,
- _cb_used_select, cfdata, NULL);
- }
-
- e_widget_ilist_go(cfdata->used_list);
- e_widget_ilist_thaw(cfdata->used_list);
-
- e_widget_ilist_freeze(cfdata->dmodel_list);
- e_widget_ilist_clear(cfdata->dmodel_list);
-
- /* Update the global model list */
- EINA_LIST_FOREACH(models, l, model)
- {
- 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_config->xkb.default_model)
- e_widget_ilist_selected_set(cfdata->dmodel_list, n);
- n++;
- }
-
- e_widget_ilist_go(cfdata->dmodel_list);
- e_widget_ilist_thaw(cfdata->dmodel_list);
- edje_thaw();
- evas_event_thaw(cfdata->evas);
+ _basic_create_fill(cfdata);
cfdata->fill_delay = NULL;
return ECORE_CALLBACK_CANCEL;
}
static void
-_cb_used_select(void *data)
+_cb_used_select(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
E_Config_Dialog_Data *cfdata;
- int n, c;
+ Elm_Widget_Item *it, *first, *last;
+ E_Config_XKB_Layout *cl;
if (!(cfdata = data)) return;
- if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
- c = e_widget_ilist_count(cfdata->used_list);
- e_widget_disabled_set(cfdata->btn_del, EINA_FALSE);
+ it = elm_list_selected_item_get(cfdata->used_list);
+ first = elm_list_first_item_get(cfdata->used_list);
+ last = elm_list_last_item_get(cfdata->used_list);
- if (c == 1)
- {
- e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
- e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
- }
- else if (n == (c - 1))
- {
- e_widget_disabled_set(cfdata->btn_up, EINA_FALSE);
- e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
- }
- else if (n == 0)
+ if (!it) return;
+ cl = elm_object_item_data_get(it);
+ if (!cl) return;
+ elm_object_disabled_set(cfdata->btn_del, EINA_FALSE);
+ if (first == last)
{
- e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
- e_widget_disabled_set(cfdata->btn_down, EINA_FALSE);
+ elm_object_disabled_set(cfdata->btn_up, EINA_TRUE);
+ elm_object_disabled_set(cfdata->btn_down, EINA_TRUE);
}
else
{
- e_widget_disabled_set(cfdata->btn_up, EINA_FALSE);
- e_widget_disabled_set(cfdata->btn_down, EINA_FALSE);
+ if (it == first)
+ elm_object_disabled_set(cfdata->btn_up, EINA_TRUE);
+ else
+ elm_object_disabled_set(cfdata->btn_up, EINA_FALSE);
+ if (it == last)
+ elm_object_disabled_set(cfdata->btn_down, EINA_TRUE);
+ else
+ elm_object_disabled_set(cfdata->btn_down, EINA_FALSE);
}
}
diff --git a/src/modules/xkbswitch/e_mod_main.c b/src/modules/xkbswitch/e_mod_main.c
index ec2105732e..e59f00cdf0 100644
--- a/src/modules/xkbswitch/e_mod_main.c
+++ b/src/modules/xkbswitch/e_mod_main.c
@@ -279,21 +279,6 @@ _xkb_changed_state(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EIN
return ECORE_CALLBACK_PASS_ON;
}
-#if 0
-static int
-_xkb_menu_items_sort(const void *data1, const void *data2)
-{
- const E_Config_XKB_Layout *cl1 = data1;
- const E_Config_XKB_Layout *cl2 = data2;
- int v;
-
- v = strcmp(cl1->name, cl2->name);
- if (!v) v = strcmp(cl1->model, cl2->model);
- if (!v) v = strcmp(cl1->variant, cl2->variant);
- return v;
-}
-
-#endif
static void
_e_xkb_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event)
{
diff --git a/src/modules/xkbswitch/e_mod_parse.c b/src/modules/xkbswitch/e_mod_parse.c
index 513414485a..e309e45e86 100644
--- a/src/modules/xkbswitch/e_mod_parse.c
+++ b/src/modules/xkbswitch/e_mod_parse.c
@@ -1,10 +1,57 @@
#include "e.h"
#include "e_mod_parse.h"
+typedef struct Config_Parse_Label_ {
+ const char *name;
+ Eina_List **list;
+} Config_Parse_Label;
+
Eina_List *layouts = NULL;
Eina_List *models = NULL;
+
Eina_List *optgroups = NULL;
+Eina_List *optled = NULL;
+Eina_List *optswitch = NULL;
+Eina_List *optlv3 = NULL;
+Eina_List *optctrl = NULL;
+Eina_List *optkeypad = NULL;
+Eina_List *optdelkeypad = NULL;
+Eina_List *optcapslock = NULL;
+Eina_List *optaltwin = NULL;
+Eina_List *optcompose = NULL;
+Eina_List *optcurrency = NULL;
+Eina_List *optlv5 = NULL;
+Eina_List *optspacebar = NULL;
+Eina_List *optjapan = NULL;
+Eina_List *optkorean = NULL;
+Eina_List *optesperanto = NULL;
+Eina_List *optsolaris = NULL;
+Eina_List *optterminate = NULL;
+Eina_List *optmisc = NULL;
+
+static Config_Parse_Label grplabels[] = {
+{ "grp_led", &optled },
+{ "grp", &optswitch },
+{ "lv3", &optlv3 },
+{ "ctrl", &optctrl },
+{ "keypad", &optkeypad },
+{ "kpdl", &optdelkeypad },
+{ "caps", &optcapslock },
+{ "altwin", &optaltwin },
+{ "compose", &optcompose },
+{ "currencysign", &optcurrency },
+{ "eurosign", &optcurrency },
+{ "rupeesign", &optcurrency },
+{ "lv5", &optlv5 },
+{ "nbsp", &optspacebar },
+{ "jap", &optjapan },
+{ "korean", &optkorean },
+{ "esperanto", &optesperanto },
+{ "solaris", &optsolaris },
+{ "terminate", &optterminate }
+};
+
static const char *rules_file = NULL;
static int layout_sort_cb(const void *data1, const void *data2);
@@ -54,8 +101,8 @@ parse_rules(void)
E_XKB_Layout *layout = NULL;
E_XKB_Option *option = NULL;
E_XKB_Variant *variant = NULL;
- E_XKB_Option_Group *group = NULL;
FILE *f;
+ int i;
if (!rules_file) return 0;
@@ -211,7 +258,7 @@ parse_rules(void)
{
if (fgets(buf, sizeof(buf), f))
{
- char *n, *p, *t, *tmp, *name, *txt;
+ char *n, *p, *tmp, *name, *txt;
n = strchr(buf, '\n');
if (n) *n = '\0';
@@ -226,41 +273,25 @@ parse_rules(void)
while (p[0] == ' ')
++p;
- /* skip "grp" options for switching kbd layouts */
- //if (strncmp(name, "grp", 3))
- {
- if (!strchr(name, ':'))
- {
- group = E_NEW(E_XKB_Option_Group, 1);
-
- /* A hack to get it to parse right if
- * the group name contains a space
- */
- t = strstr(p, " ");
- if (t)
- {
- while (t[0] == ' ')
- ++t;
- p = t;
- }
-
- txt = evas_textblock_text_markup_to_utf8(NULL, p);
- group->description = eina_stringshare_add(txt);
- E_FREE(txt);
-
- optgroups = eina_list_append(optgroups, group);
- }
- else if (group)
- {
- option = E_NEW(E_XKB_Option, 1);
- option->name = eina_stringshare_add(name);
- txt = evas_textblock_text_markup_to_utf8(NULL, p);
- option->description = eina_stringshare_add(txt);
- E_FREE(txt);
- group->options = eina_list_append(group->options,
- option);
- }
- }
+ if (strchr(name, ':'))
+ {
+ option = E_NEW(E_XKB_Option, 1);
+ option->name = eina_stringshare_add(name);
+ txt = evas_textblock_text_markup_to_utf8(NULL, p);
+ option->description = eina_stringshare_add(txt);
+ E_FREE(txt);
+ for (i = 0; i < (sizeof(grplabels) / sizeof(grplabels[0])); ++i)
+ {
+ if (!strncasecmp(name, grplabels[i].name, (strlen(grplabels[i].name))))
+ {
+ *(grplabels[i].list) = eina_list_append(*(grplabels[i].list), option);
+ break;
+ }
+ }
+ if (i < (sizeof(grplabels) / sizeof(grplabels[0]))) continue;
+ optmisc = eina_list_append(optmisc, option);
+ }
+ else continue;
free(tmp);
}
@@ -277,10 +308,20 @@ err:
return 1;
}
+static void
+_free_option(E_XKB_Option *o)
+{
+ eina_stringshare_del(o->name);
+ eina_stringshare_del(o->description);
+
+ E_FREE(o);
+}
+
+
+
void
clear_rules(void)
{
- E_XKB_Option_Group *og;
E_XKB_Variant *v;
E_XKB_Option *o;
E_XKB_Layout *la;
@@ -310,20 +351,23 @@ clear_rules(void)
E_FREE(m);
}
- EINA_LIST_FREE(optgroups, og)
- {
- eina_stringshare_del(og->description);
-
- EINA_LIST_FREE(og->options, o)
- {
- eina_stringshare_del(o->name);
- eina_stringshare_del(o->description);
-
- E_FREE(o);
- }
-
- E_FREE(og);
- }
+ EINA_LIST_FREE(optled, o) _free_option(o);
+ EINA_LIST_FREE(optswitch, o) _free_option(o);
+ EINA_LIST_FREE(optlv3, o) _free_option(o);
+ EINA_LIST_FREE(optctrl, o) _free_option(o);
+ EINA_LIST_FREE(optkeypad, o) _free_option(o);
+ EINA_LIST_FREE(optdelkeypad, o) _free_option(o);
+ EINA_LIST_FREE(optcapslock, o) _free_option(o);
+ EINA_LIST_FREE(optaltwin, o) _free_option(o);
+ EINA_LIST_FREE(optcompose, o) _free_option(o);
+ EINA_LIST_FREE(optcurrency, o) _free_option(o);
+ EINA_LIST_FREE(optlv5, o) _free_option(o);
+ EINA_LIST_FREE(optspacebar, o) _free_option(o);
+ EINA_LIST_FREE(optjapan, o) _free_option(o);
+ EINA_LIST_FREE(optkorean, o) _free_option(o);
+ EINA_LIST_FREE(optesperanto, o) _free_option(o);
+ EINA_LIST_FREE(optsolaris, o) _free_option(o);
+ EINA_LIST_FREE(optterminate, o) _free_option(o);
optgroups = NULL;
layouts = NULL;
diff --git a/src/modules/xkbswitch/e_mod_parse.h b/src/modules/xkbswitch/e_mod_parse.h
index e0ce201081..f5624cc1c4 100644
--- a/src/modules/xkbswitch/e_mod_parse.h
+++ b/src/modules/xkbswitch/e_mod_parse.h
@@ -26,12 +26,6 @@ typedef struct _E_XKB_Layout
Eina_List *variants;
} E_XKB_Layout;
-typedef struct _E_XKB_Option_Group
-{
- const char *description;
- Eina_List *options;
-} E_XKB_Option_Group;
-
typedef struct _E_XKB_Option
{
const char *name;
@@ -46,6 +40,25 @@ int layout_sort_by_name_cb(const void *data1, const void *data2);
extern Eina_List *models;
extern Eina_List *layouts;
-extern Eina_List *optgroups;
+
+extern Eina_List *optled;
+extern Eina_List *optswitch;
+extern Eina_List *optlv3;
+extern Eina_List *optctrl;
+extern Eina_List *optkeypad;
+extern Eina_List *optdelkeypad;
+extern Eina_List *optcapslock;
+extern Eina_List *optaltwin;
+extern Eina_List *optcompose;
+extern Eina_List *optcurrency;
+extern Eina_List *optlv5;
+extern Eina_List *optspacebar;
+extern Eina_List *optjapan;
+extern Eina_List *optkorean;
+extern Eina_List *optesperanto;
+extern Eina_List *optsolaris;
+extern Eina_List *optterminate;
+extern Eina_List *optmisc;
+
#endif