diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c index d615aad80..e7fa89833 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 int _check_changed(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 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? */ @@ -112,28 +194,37 @@ _create_data(E_Config_Dialog *cfd) } /* 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,28 +245,21 @@ _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)) || + eina_list_count(cfdata->cfg_layouts)) || (e_config->xkb.default_model != cfdata->default_model) || (e_config->xkb.only_label != cfdata->only_label) || (e_config->xkb.dont_touch_my_damn_keyboard != cfdata->dont_touch_my_damn_keyboard)) @@ -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) @@ -243,7 +368,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) nl->variant = eina_stringshare_ref(cl->variant); e_config->xkb.used_layouts = - eina_list_append(e_config->xkb.used_layouts, nl); + eina_list_append(e_config->xkb.used_layouts, nl); if (e_config_xkb_layout_eq(e_config->xkb.current_layout, nl)) cur_ok = EINA_TRUE; if (e_config_xkb_layout_eq(e_config->xkb.sel_layout, nl)) @@ -253,11 +378,11 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) { E_FREE_FUNC(e_config->xkb.current_layout, e_config_xkb_layout_free); EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl) - if (e_config->xkb.cur_layout == cl->name) - { - e_config->xkb.current_layout = e_config_xkb_layout_dup(cl); - break; - } + if (e_config->xkb.cur_layout == cl->name) + { + e_config->xkb.current_layout = e_config_xkb_layout_dup(cl); + break; + } if (!e_config->xkb.current_layout) eina_stringshare_replace(&e_config->xkb.cur_layout, NULL); } @@ -265,11 +390,11 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) { E_FREE_FUNC(e_config->xkb.sel_layout, e_config_xkb_layout_free); EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl) - if (e_config->xkb.selected_layout == cl->name) - { - e_config->xkb.sel_layout = e_config_xkb_layout_dup(cl); - break; - } + if (e_config->xkb.selected_layout == cl->name) + { + e_config->xkb.sel_layout = e_config_xkb_layout_dup(cl); + break; + } if (!e_config->xkb.sel_layout) eina_stringshare_replace(&e_config->xkb.selected_layout, NULL); } @@ -285,131 +410,342 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) eina_stringshare_del(oc->name); E_FREE(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) - 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); - } + 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; - /* 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); + Eina_List *l; + Evas_Object *o; + E_Config_XKB_Layout *cl; + Elm_Object_Item *it, *sel = NULL; - /* Holds the used layouts ilist and the button table */ - layoutss = e_widget_list_add(evas, 0, 0); + 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"); - /* Holds the used layouts */ - configs = e_widget_ilist_add(evas, 32, 32, NULL); - - e_widget_size_min_set(configs, 220, 160); - e_widget_ilist_go(configs); - - e_widget_list_object_append(layoutss, configs, 1, 1, 0.5); - 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); - - 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); - - 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); - - 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); - - e_widget_list_object_append(layoutss, buttons, 1, 0, 1); - - e_widget_toolbook_page_append(mainn, NULL, _("Configurations"), layoutss, 1, 1, 1, 1, 0.5, 0.0); - - /* 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); - - /* Holds the options */ - options = e_widget_list_add(evas, 0, 0); - - 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); - - lll = cfdata->cfg_options; - - EINA_LIST_FOREACH(optgroups, l, group) + /* Update the list of used layouts */ + elm_list_clear(cfdata->used_list); + if (!cfdata->dont_touch_my_damn_keyboard) { - Evas_Object *grp; - - grp = e_widget_framelist_add(evas, group->description, 0); - - EINA_LIST_FOREACH(group->options, ll, option) + EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl) { - Evas_Object *chk; + Evas_Object *ic = elm_icon_add(cfdata->used_list); + const char *name = cl->name; + char buf[PATH_MAX]; - 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); + 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; } - e_widget_list_object_append(options, grp, 1, 1, 0.0); + if (sel) + elm_list_item_selected_set(sel, EINA_TRUE); + elm_list_go(cfdata->used_list); } - e_widget_size_min_get(options, &mw, &mh); - if (mw < 220) mw = 220; - if (mh < 160) mh = 160; +#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) - evas_object_size_hint_min_set(options, mw, mh); - E_EXPAND(options); - E_FILL(options); + 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); +} - 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 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; - e_widget_toolbook_page_append(mainn, NULL, _("Options"), scroller, 1, 1, 1, 1, 0.5, 0.0); - - /* Display the first page by default */ - e_widget_toolbook_page_show(mainn, 0); + /* Holds the dialog contents, displays a toolbar on the top */ + e_dialog_resizable_set(cfd->dia, 1); /* The main evas */ cfdata->evas = evas; + 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); + + /* 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 = 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); + + return mainn; +} + +static Evas_Object * +_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *mainn; + + mainn = _config_basic_create(cfd, evas, cfdata); + /* Clear up any previous timer */ if (cfdata->fill_delay) ecore_timer_del(cfdata->fill_delay); @@ -420,118 +756,560 @@ _basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data return mainn; } + +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); + + /* Clear up any previous timer */ + if (cfdata->fill_delay) + ecore_timer_del(cfdata->fill_delay); + + /* Trigger the fill */ + cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata); + + return sc; +} + static void -_cb_add(void *data, void *data2 EINA_UNUSED) +_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) + { + 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")))) + sel = it; + } + if (sel) + elm_list_item_selected_set(sel, 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; - 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); } static void -_cb_del(void *data, void *data2 EINA_UNUSED) +_cb_del(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { E_Config_Dialog_Data *cfdata; - int n = 0; + Elm_Object_Item *it; + E_Config_XKB_Layout *cl; 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)); - - /* 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); + 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 -_cb_up(void *data, void *data2 EINA_UNUSED) +_popup_cancel_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - 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); - - 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); - - /* Update the list */ - - evas_event_freeze(cfdata->evas); - edje_freeze(); - e_widget_ilist_freeze(cfdata->used_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); - - e_widget_ilist_go(cfdata->used_list); - e_widget_ilist_thaw(cfdata->used_list); - edje_thaw(); - evas_event_thaw(cfdata->evas); - - e_widget_ilist_selected_set(cfdata->used_list, (n - 1)); + evas_object_del(data); } static void -_cb_dn(void *data, void *data2 EINA_UNUSED) +_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"); + + *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(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(cfdata->cfd->dia->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) + { + 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); + } + } + 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; +} + +static void +_cb_compose_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(_("Compose"), cfdata, optcompose, + &cfdata->cfg_compose_options, cfdata->compose_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_lv3_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(_("Third level"), cfdata, optlv3, + &cfdata->cfg_lv3_options, cfdata->lv3_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_switch_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(_("Switch Layout"), cfdata, optswitch, + &cfdata->cfg_switch_options, cfdata->switch_list); +} + +static void +_cb_led_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Led"), cfdata, optled, + &cfdata->cfg_led_options, cfdata->led_list); +} + + +static void +_cb_ctrl_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Switch Layout"), cfdata, optswitch, + &cfdata->cfg_ctrl_options, cfdata->ctrl_list); +} + +static void +_cb_keypad_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Keypad"), cfdata, optkeypad, + &cfdata->cfg_keypad_options, cfdata->keypad_list); +} + + +static void +_cb_delkeypad_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Keypad delete key"), cfdata, optdelkeypad, + &cfdata->cfg_delkeypad_options, cfdata->delkeypad_list); +} + +static void +_cb_capslock_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Capslock"), cfdata, optcapslock, + &cfdata->cfg_capslock_options, cfdata->capslock_list); +} + +static void +_cb_altwin_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Alternate win key"), cfdata, optaltwin, + &cfdata->cfg_altwin_options, cfdata->altwin_list); +} + +static void +_cb_currency_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Currency"), cfdata, optcurrency, + &cfdata->cfg_currency_options, cfdata->currency_list); +} + +static void +_cb_lv5_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Fifth level"), cfdata, optlv5, + &cfdata->cfg_lv5_options, cfdata->lv5_list); +} + +static void +_cb_spacebar_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("Spacebar"), cfdata, optspacebar, + &cfdata->cfg_spacebar_options, cfdata->spacebar_list); +} + +static void +_cb_japan_up(void *data, Evas_Object *obj, void *event) +{ + E_Config_Dialog_Data *cfdata; + + if (!(cfdata = data)) return; + + _popup_add(_("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(_("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(_("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(_("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; + + _popup_add(_("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(_("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 +1324,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 +1380,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 +1398,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 +1434,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 +1447,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 +1463,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 +1478,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 +1553,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) + 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_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) - { - 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 ec2105732..e59f00cdf 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 513414485..e309e45e8 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 e0ce20108..f5624cc1c 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