#include "e.h" #include "e_mod_main.h" #include "e_mod_parse.h" struct _E_Config_Dialog_Data { Evas *evas, *dlg_evas; Evas_Object *layout_list, *used_list; Evas_Object *dmodel_list, *model_list, *variant_list; Evas_Object *btn_add, *btn_del, *btn_up, *btn_down; Ecore_Timer *fill_delay; Ecore_Timer *dlg_fill_delay; 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_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; int dont_touch_my_damn_keyboard; E_Dialog *dlg_add_new; E_Config_Dialog *cfd; }; /* 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 _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); static E_Dialog *_dlg_add_new(E_Config_Dialog_Data *cfdata); 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, Evas_Object *obj, void *event); static Eina_Bool _cb_fill_delay(void *data); /* Externals */ E_Config_Dialog * _xkb_cfg_dialog(Evas_Object *parent EINA_UNUSED, const char *params EINA_UNUSED) { E_Config_Dialog *cfd; E_Config_Dialog_View *v; if (e_config_dialog_find("E", "keyboard_and_mouse/xkbswitch")) return NULL; if (!(v = E_NEW(E_Config_Dialog_View, 1))) return NULL; v->create_cfdata = _create_data; v->free_cfdata = _free_data; v->basic.create_widgets = _basic_create; v->basic.apply_cfdata = _basic_apply; 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", "preferences-desktop-keyboard", 0, v, NULL); _xkb.cfd = cfd; return cfd; } /* 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; E_Config_XKB_Layout *cl, *nl; E_XKB_Option *op; find_rules(); parse_rules(); /* XXX: handle in case nothing was found? */ cfdata = E_NEW(E_Config_Dialog_Data, 1); cfdata->cfd = cfd; cfdata->cfg_layouts = NULL; EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl) { nl = E_NEW(E_Config_XKB_Layout, 1); nl->name = eina_stringshare_add(cl->name); nl->model = eina_stringshare_add(cl->model); nl->variant = eina_stringshare_add(cl->variant); 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; #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) { 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; } static void _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) { E_Config_XKB_Layout *cl; _xkb.cfd = NULL; EINA_LIST_FREE(cfdata->cfg_layouts, cl) { eina_stringshare_del(cl->name); eina_stringshare_del(cl->model); eina_stringshare_del(cl->variant); E_FREE(cl); } eina_stringshare_del(cfdata->default_model); E_FREE(cfdata); clear_rules(); } static int _check_changed(E_Config_Dialog_Data *cfdata) { Eina_List *l, *l2; Eina_List *list_option_found = NULL; E_Config_XKB_Layout *cl, *nl; E_Config_XKB_Option *od, *op; if ((eina_list_count(e_config->xkb.used_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)) return 1; l2 = cfdata->cfg_layouts; EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl) { nl = eina_list_data_get(l2); if ((cl->name != nl->name) || (cl->model != nl->model) || (cl->variant != nl->variant)) return 1; l2 = eina_list_next(l2); } #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) { 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; } static int _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, *op; Eina_Bool cur_ok = EINA_FALSE, sel_ok = EINA_FALSE; EINA_LIST_FREE(e_config->xkb.used_layouts, cl) { eina_stringshare_del(cl->name); eina_stringshare_del(cl->model); eina_stringshare_del(cl->variant); E_FREE(cl); } EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl) { nl = E_NEW(E_Config_XKB_Layout, 1); nl->name = eina_stringshare_ref(cl->name); nl->model = eina_stringshare_ref(cl->model); nl->variant = eina_stringshare_ref(cl->variant); e_config->xkb.used_layouts = 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)) sel_ok = EINA_TRUE; } if (!cur_ok) { 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.current_layout) eina_stringshare_replace(&e_config->xkb.cur_layout, NULL); } if (!sel_ok) { 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.sel_layout) eina_stringshare_replace(&e_config->xkb.selected_layout, NULL); } eina_stringshare_replace(&e_config->xkb.default_model, cfdata->default_model); /* Save options */ e_config->xkb.only_label = cfdata->only_label; e_config->xkb.dont_touch_my_damn_keyboard = cfdata->dont_touch_my_damn_keyboard; EINA_LIST_FREE(e_config->xkb.used_options, oc) { 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) 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 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_UNUSED) { 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) { E_XKB_Option *option; 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); /* 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); /* Trigger the fill */ cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata); 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 _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 = NULL; 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; 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; 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"); *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 EINA_UNUSED, Evas_Object *tooltip, void *item EINA_UNUSED) { 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 EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { E_Config_Dialog_Data *cfdata; if (!(cfdata = data)) return; _popup_add(_("Compose"), cfdata, optcompose, &cfdata->cfg_compose_options, cfdata->compose_list); } static void _cb_lv3_up(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { E_Config_Dialog_Data *cfdata; if (!(cfdata = data)) return; _popup_add(_("Third level"), cfdata, optlv3, &cfdata->cfg_lv3_options, cfdata->lv3_list); } static void _cb_switch_up(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { E_Config_Dialog_Data *cfdata; if (!(cfdata = data)) return; _popup_add(_("Switch Layout"), cfdata, optswitch, &cfdata->cfg_switch_options, cfdata->switch_list); } static void _cb_led_up(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED, void *event EINA_UNUSED) { 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 EINA_UNUSED) { 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 * _dlg_add_new(E_Config_Dialog_Data *cfdata) { E_Dialog *dlg; Evas *evas; Evas_Coord mw, mh; Evas_Object *mainn, *available, *modelss, *variants; if (!(dlg = e_dialog_new(e_win_evas_win_get(cfdata->evas), "E", "xkbswitch_config_add_dialog"))) return NULL; 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); evas = evas_object_evas_get(dlg->win); e_dialog_title_set(dlg, _("Add New Configuration")); /* The main toolbook, holds the lists and tabs */ mainn = e_widget_toolbook_add(evas, 24, 24); /* Holds the available layouts */ available = e_widget_ilist_add(evas, 32, 32, NULL); e_widget_size_min_set(available, 220, 160); e_widget_ilist_go(available); e_widget_toolbook_page_append(mainn, NULL, _("Available"), available, 1, 1, 1, 1, 0.5, 0.0); cfdata->layout_list = available; /* Holds the available models */ modelss = e_widget_ilist_add(evas, 32, 32, NULL); e_widget_toolbook_page_append(mainn, NULL, _("Model"), modelss, 1, 1, 1, 1, 0.5, 0.0); cfdata->model_list = modelss; /* Holds the available variants */ variants = e_widget_ilist_add(evas, 32, 32, NULL); e_widget_toolbook_page_append(mainn, NULL, _("Variant"), variants, 1, 1, 1, 1, 0.5, 0.0); cfdata->variant_list = variants; e_widget_toolbook_page_show(mainn, 0); e_widget_size_min_get(mainn, &mw, &mh); e_dialog_content_set(dlg, mainn, mw, mh); cfdata->dlg_evas = evas; /* Clear up any previous timer */ if (cfdata->dlg_fill_delay) ecore_timer_del(cfdata->dlg_fill_delay); /* Trigger the fill */ cfdata->dlg_fill_delay = ecore_timer_add(0.2, _cb_dlg_fill_delay, cfdata); /* Some buttons */ e_dialog_button_add(dlg, _("OK"), NULL, _dlg_add_cb_ok, cfdata); e_dialog_button_add(dlg, _("Cancel"), NULL, _dlg_add_cb_cancel, cfdata); e_dialog_button_disable_num_set(dlg, 0, 1); e_dialog_button_disable_num_set(dlg, 1, 0); e_dialog_show(dlg); return dlg; } static void _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[PATH_MAX], icon_buf[PATH_MAX]; Evas_Object *ic; /* Configuration information */ Eina_Stringshare *layout, *model, *variant; layout = e_widget_ilist_selected_value_get(cfdata->layout_list); model = e_widget_ilist_selected_value_get(cfdata->model_list); variant = e_widget_ilist_selected_value_get(cfdata->variant_list); /* The new configuration */ cl = E_NEW(E_Config_XKB_Layout, 1); cl->name = eina_stringshare_ref(layout); cl->model = eina_stringshare_ref(model); cl->variant = eina_stringshare_ref(variant); cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, cl); /* Update the main list */ 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); 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, _check_changed(cfdata)); } static void _dlg_add_cb_cancel(void *data EINA_UNUSED, E_Dialog *dlg) { E_Config_Dialog_Data *cfdata = dlg->data; cfdata->dlg_add_new = NULL; e_object_del(E_OBJECT(dlg)); } static void _dlg_add_cb_del(void *obj) { E_Dialog *dlg = obj; E_Config_Dialog_Data *cfdata = dlg->data; cfdata->dlg_add_new = NULL; } static Eina_Bool _cb_dlg_fill_delay(void *data) { E_Config_Dialog_Data *cfdata; 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; /* Update the list of available layouts */ evas_event_freeze(cfdata->dlg_evas); edje_freeze(); 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; ic = e_icon_add(cfdata->dlg_evas); e_xkb_e_icon_flag_setup(ic, layout->name); snprintf(buf, sizeof(buf), "%s (%s)", 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); 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; } static void _cb_layout_select(void *data) { E_Config_Dialog_Data *cfdata; E_XKB_Variant *variant; E_XKB_Layout *layout; E_XKB_Model *model; Eina_List *l; const char *label; int n; char buf[4096]; if (!(cfdata = data)) return; /* Find the right layout */ if ((n = e_widget_ilist_selected_get(cfdata->layout_list)) < 0) return; if (!(label = e_widget_ilist_nth_label_get(cfdata->layout_list, n))) return; if (!(layout = eina_list_search_unsorted (layouts, layout_sort_by_name_cb, e_widget_ilist_nth_value_get(cfdata->layout_list, n) ))) return; /* Update the lists */ evas_event_freeze(cfdata->dlg_evas); edje_freeze(); /* Models */ e_widget_ilist_freeze(cfdata->model_list); e_widget_ilist_clear(cfdata->model_list); EINA_LIST_FOREACH(models, l, model) { snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name); e_widget_ilist_append(cfdata->model_list, NULL, buf, NULL, cfdata, model->name); } e_widget_ilist_go(cfdata->model_list); e_widget_ilist_thaw(cfdata->model_list); /* Variants */ e_widget_ilist_freeze(cfdata->variant_list); e_widget_ilist_clear(cfdata->variant_list); EINA_LIST_FOREACH(layout->variants, l, variant) { snprintf(buf, sizeof(buf), "%s (%s)", variant->name, variant->description); e_widget_ilist_append(cfdata->variant_list, NULL, buf, NULL, cfdata, variant->name); } e_widget_ilist_go(cfdata->variant_list); e_widget_ilist_thaw(cfdata->variant_list); edje_thaw(); evas_event_thaw(cfdata->dlg_evas); e_widget_ilist_selected_set(cfdata->model_list, 0); e_widget_ilist_selected_set(cfdata->variant_list, 0); e_dialog_button_disable_num_set(cfdata->dlg_add_new, 0, 0); } static Eina_Bool _cb_fill_delay(void *data) { E_Config_Dialog_Data *cfdata; if (!(cfdata = data)) return ECORE_CALLBACK_RENEW; _basic_create_fill(cfdata); cfdata->fill_delay = NULL; return ECORE_CALLBACK_CANCEL; } static void _cb_used_select(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { E_Config_Dialog_Data *cfdata; Elm_Widget_Item *it, *first, *last; E_Config_XKB_Layout *cl; if (!(cfdata = data)) return; 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 (!it) return; cl = elm_object_item_data_get(it); if (!cl) return; elm_object_disabled_set(cfdata->btn_del, EINA_FALSE); if (first == last) { elm_object_disabled_set(cfdata->btn_up, EINA_TRUE); elm_object_disabled_set(cfdata->btn_down, EINA_TRUE); } else { 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); } }