From cc3d6d26b79f83101a2a55a019a06fef9a3074e6 Mon Sep 17 00:00:00 2001 From: sndev Date: Thu, 9 Feb 2006 23:24:06 +0000 Subject: [PATCH] New configuration dialog for Binding Key Settings. SVN revision: 20371 --- src/bin/Makefile.am | 2 + src/bin/e_config.c | 2 - src/bin/e_configure.c | 1 + src/bin/e_includes.h | 1 + src/bin/e_int_config_keybindings.c | 1491 ++++++++++++++++++++++++++++++++++++ src/bin/e_int_config_keybindings.h | 9 + 6 files changed, 1504 insertions(+), 2 deletions(-) create mode 100644 src/bin/e_int_config_keybindings.c create mode 100644 src/bin/e_int_config_keybindings.h diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 4b9ab94..6cbb00c 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -126,6 +126,7 @@ e_int_config_background.h \ e_int_config_background_import.h \ e_int_config_theme.h \ e_int_config_menus.h \ +e_int_config_keybindings.h \ e_int_config_cursor.h \ e_int_config_startup.h \ e_int_config_performance.h \ @@ -247,6 +248,7 @@ e_int_config_background.c \ e_int_config_background_import.c \ e_int_config_theme.c \ e_int_config_menus.c \ +e_int_config_keybindings.c \ e_int_config_cursor.c \ e_int_config_startup.c \ e_int_config_performance.c \ diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 3b2b4f1..7b6f9f1 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -815,7 +815,6 @@ e_config_init(void) eb->params = NULL; e_config->key_bindings = evas_list_append(e_config->key_bindings, eb); - // sndev : start eb = E_NEW( E_Config_Binding_Key, 1 ); eb->context = E_BINDING_CONTEXT_ANY; eb->key = evas_stringshare_add("F10"); @@ -833,7 +832,6 @@ e_config_init(void) eb->action = evas_stringshare_add( "window_maximized_toggle" ); eb->params = evas_stringshare_add( "horizontal" ); e_config->key_bindings = evas_list_append( e_config->key_bindings, eb ); - // sndev : end eb = E_NEW(E_Config_Binding_Key, 1); eb->context = E_BINDING_CONTEXT_ANY; diff --git a/src/bin/e_configure.c b/src/bin/e_configure.c index 506eb26..682bedd 100644 --- a/src/bin/e_configure.c +++ b/src/bin/e_configure.c @@ -66,6 +66,7 @@ e_configure_show(E_Container *con) e_configure_standard_item_add(eco, "enlightenment/desktops", _("Background Settings"), e_int_config_background); e_configure_standard_item_add(eco, "enlightenment/themes", _("Theme Selector"), e_int_config_theme); e_configure_standard_item_add(eco, "enlightenment/modules", _("Module Settings"), e_int_config_modules); + e_configure_standard_item_add(eco, "enlightenment/e", _("Key Binding Settings"), e_int_config_keybindings); e_configure_standard_item_add(eco, "enlightenment/mouse", _("Cursor Settings"), e_int_config_cursor); e_configure_standard_item_add(eco, "enlightenment/desktops", _("Desktop Settings"), e_int_config_desks); e_configure_standard_item_add(eco, "enlightenment/desktops", _("Display Settings"), e_int_config_display); diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index ff6d6e8..a224aac 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -104,6 +104,7 @@ #include "e_int_config_background_import.h" #include "e_int_config_theme.h" #include "e_int_config_menus.h" +#include "e_int_config_keybindings.h" #include "e_int_config_cursor.h" #include "e_int_config_startup.h" #include "e_int_config_performance.h" diff --git a/src/bin/e_int_config_keybindings.c b/src/bin/e_int_config_keybindings.c new file mode 100644 index 0000000..f3244de --- /dev/null +++ b/src/bin/e_int_config_keybindings.c @@ -0,0 +1,1491 @@ +#include "e.h" + +#define BTN_NEXT_KEYBINDING_TEXT _("Next Key Binding") +#define BTN_PREV_KEYBINDING_TEXT _("Prev Key Binding") +#define BTN_ADD_KEYBINDING_TEXT _("Add Key Binding") +#define BTN_DEL_KEYBINDING_TEXT _("Delete Key Binding") + +#define ILIST_ICON_WITH_KEYBIND "enlightenment/e" +#define ILIST_ICON_WITHOUT_KEYBIND "" + +static void *_create_data(E_Config_Dialog *cfd); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, + E_Config_Dialog_Data *cfdata); + +static void _ilist_kb_cb_change(void *data, Evas_Object *obj); + +static void _keybind_cb_next_keybind(void *data, void *data2); +static void _keybind_cb_prev_keybind(void *data, void *data2); +static void _keybind_cb_add_keybinding(void *data, void *data2); +static void _keybind_cb_del_keybinding(void *data, void *data2); + +static void _entry_keybind_cb_text_change(void *data, Evas_Object *obj); + +static int _keybind_cb_auto_apply(E_Config_Dialog_Data *cfdata); +static int _keybind_delete_keybinding(E_Config_Dialog_Data *cfdata); + +static void _update_ilist_cur_selection_icon(E_Config_Dialog_Data *cfdata); + +typedef struct _E_Config_KeyBind E_Config_KeyBind; +typedef struct _E_Widget_IList_Data E_Widget_IList_Data; +typedef struct _E_Widget_Radio_Data E_Widget_Radio_Data; +typedef struct _E_Widget_Checkbox_Data E_Widget_Checkbox_Data; +typedef struct _E_Widget_Button_Data E_Widget_Button_Data; +typedef struct _E_Widget_Entry_Data E_Widget_Entry_Data; + +typedef struct _E_Smart_Item E_Smart_Item; +typedef struct _E_Smart_Data E_Smart_Data; + +struct _E_Smart_Data +{ + Evas_Coord x, y, w, h; + + Evas_Object *smart_obj; + Evas_Object *box_obj; + Evas_List *items; + int selected; + Evas_Coord icon_w, icon_h; + unsigned char selector : 1; +}; + +struct _E_Smart_Item +{ + E_Smart_Data *sd; + Evas_Object *base_obj; + Evas_Object *icon_obj; + void (*func) (void *data, void *data2); + void (*func_hilight) (void *data, void *data2); + void *data; + void *data2; +}; + +struct _E_Widget_IList_Data +{ + Evas_Object *o_widget, *o_scrollframe, *o_ilist; + Evas_List *callbacks; + char **value; +}; + +struct _E_Widget_Radio_Data +{ + E_Radio_Group *group; + Evas_Object *o_radio; + int valnum; +}; + +struct _E_Widget_Checkbox_Data +{ + Evas_Object *o_check; + int *valptr; +}; + +struct _E_Widget_Button_Data +{ + Evas_Object *o_button; + Evas_Object *o_icon; + void (*func) (void *data, void *data2); + void *data; + void *data2; +}; + +struct _E_Widget_Entry_Data +{ + Evas_Object *o_entry; + Evas_Object *obj; + char **valptr; + void (*on_change_func) (void *data, Evas_Object *obj); + void *on_change_data; +}; +#define E_BINDING_CONTEXT_NUMBER 10 + +struct _E_Config_KeyBind +{ + int acn; + Evas_List *bk_list; +}; + +struct _E_Config_Dialog_Data +{ + Evas_List *key_bindings; + + int cur_eckb_kb_sel; + E_Config_KeyBind *cur_eckb; + Evas *evas; + + int binding_context; + struct + { + int shift; + int ctrl; + int alt; + int win; + } bind_mod; + char *key_bind; + char *key_action; + char *key_params; + + struct + { + Evas_Object *ilist; + /*Evas_Object *btn_add; + Evas_Object *btn_del;*/ + + Evas_Object *btn_prev_keybind; + Evas_Object *btn_next_keybind; + Evas_Object *btn_add_keybind; + Evas_Object *btn_del_keybind; + + Evas_Object *bind_context[E_BINDING_CONTEXT_NUMBER]; + struct + { + Evas_Object *shift; + Evas_Object *ctrl; + Evas_Object *alt; + Evas_Object *win; + } bind_mod_obj; + Evas_Object *key_bind; + Evas_Object *key_action; + Evas_Object *key_params; + } gui; +}; + +EAPI E_Config_Dialog * +e_int_config_keybindings(E_Container *con) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + v = E_NEW(E_Config_Dialog_View, 1); + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply_data; + v->basic.create_widgets = _basic_create_widgets; + + cfd = e_config_dialog_new(con, _("Key Binding Settings"), NULL, 0, v, NULL); + return cfd; +} + +typedef struct +{ + char *key; + int modifiers; + int context; +}KEY_ACTION_BINDING; + + +typedef struct +{ + char *action_name; + char *action_cmd; + char *action_params; + int def_action; + int restrictions; +}ACTION; + +#define _DEFAULT_ACTION 0 +#define _NONDEFAULT_ACTION 1 + +#define EDIT_RESTRICT_NONE (0 << 0) +#define EDIT_RESTRICT_ACTION (1 << 0) +#define EDIT_RESTRICT_PARAMS (1 << 1) + +const ACTION actions_predefined_names[ ] = { + {"Flip Desktop Left", "desk_flip_by", "-1 0", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Flip Desktop Right", "desk_flip_by", "1 0", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Flip Desktop Up", "desk_flip_by", "0 -1", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Flip Desktop Down", "desk_flip_by", "0 1", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Flip Desktop By", "desk_flip_by", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Flip Desktop To", "desk_flip_to", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + + {"Switch To Left Desktop", "desk_linear_flip_by", "-1", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Right Desktop", "desk_linear_flip_by", "1", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Flip Desktop Linearly", "desk_linear_flip_by", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + + {"Switch To Desktop 0", "desk_linear_flip_to", "0", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 1", "desk_linear_flip_to", "1", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 2", "desk_linear_flip_to", "2", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 3", "desk_linear_flip_to", "3", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 4", "desk_linear_flip_to", "4", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 5", "desk_linear_flip_to", "5", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 6", "desk_linear_flip_to", "6", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 7", "desk_linear_flip_to", "7", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 8", "desk_linear_flip_to", "8", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 9", "desk_linear_flip_to", "9", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 10", "desk_linear_flip_to", "10", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop 11", "desk_linear_flip_to", "11", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Switch To Desktop", "desk_linear_flip_to", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + + {"Run Command", "exebuf", NULL, _DEFAULT_ACTION, EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Exit \'E\'", "exit", NULL, _DEFAULT_ACTION, EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Restart \'E\'", "restart", NULL, _DEFAULT_ACTION, EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + + {"Show Main Menu", "menu_show", "main", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Show Favorites Menu", "menu_show", "favorites", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Show Clients Menu", "menu_show", "clients", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Menu Show", "menu_show", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + + {"Toggle Edit Mode", "edit_mode_toggle", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + + {"Window List - Next Window", "winlist", "next", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window List - Previous Window", "winlist", "prev", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + + {"Window Move To Next Desktop", "window_desk_move_by", "1 0", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Previous Desktop", "window_desk_move_by", "-1 0", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move By Desktop", "window_desk_move_by", NULL, _DEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + + {"Window Move To Desktop 0", "window_desk_move_to", "0", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 1", "window_desk_move_to", "1", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 2", "window_desk_move_to", "2", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 3", "window_desk_move_to", "3", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 4", "window_desk_move_to", "4", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 5", "window_desk_move_to", "5", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 6", "window_desk_move_to", "6", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 7", "window_desk_move_to", "7", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 8", "window_desk_move_to", "8", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 9", "window_desk_move_to", "9", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 10", "window_desk_move_to", "10", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop 11", "window_desk_move_to", "11", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Move To Desktop", "window_desk_move_to", NULL, _NONDEFAULT_ACTION, + EDIT_RESTRICT_ACTION }, + + {"Window Maximize", "window_maximized_toggle", NULL, _DEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Window Maximize Vertically", "window_maximized_toggle", "vertical", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Maximize Horizontally", "window_maximized_toggle", "horizontal", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + + {"Window Iconic Mode Toggle", "window_iconic_toggle", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Shaded Up Mode Toggle", "window_shaded_toggle", "up", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Shaded Down Mode Toggle", "window_shaded_toggle", "down", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Shaded Left Mode Toggle", "window_shaded_toggle", "left", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Shaded Right Mode Toggle", "window_shaded_toggle", "right", _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Sticky Mode Toggle", "window_sticky_toggle", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + + {"Window Lower", "window_lower", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Raise", "window_raise", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Close", "window_close", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Kill", "window_kill", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + {"Window Menu", "window_menu", NULL, _DEFAULT_ACTION, + EDIT_RESTRICT_ACTION | EDIT_RESTRICT_PARAMS }, + + {"Window Move", "window_move", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Window Resize", "window_resize", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Window Move To", "window_move_to", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Window Move By", "window_move_by", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Window Resize", "window_resize_by", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"Window Drag Icon", "window_drag_icon", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + + {"Application", "app", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, + {"User Defined Action", "exec", NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_ACTION }, +// {"Unknown Action", NULL, NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_NONE }, + {NULL, NULL, NULL, _NONDEFAULT_ACTION, EDIT_RESTRICT_NONE } +}; + +static void +_fill_keybindings_data(E_Config_Dialog_Data *cfdata) +{ + int i, j; + int found; + E_Config_KeyBind *eckb; + E_Config_Binding_Key *bk, *t; + const char *action_name = NULL; + + for( i = 0; actions_predefined_names[i].action_name; i++ ) + { + eckb = E_NEW(E_Config_KeyBind, 1); + if(!eckb) + continue; + + eckb->acn = i; + + eckb->bk_list = NULL; + cfdata->key_bindings = evas_list_append(cfdata->key_bindings, eckb); + eckb = NULL; + } + + for (i = 0; i < evas_list_count(e_config->key_bindings); i++) + { + t = evas_list_nth(e_config->key_bindings, i); + + bk = NULL; + for (j = 0; j < evas_list_count(cfdata->key_bindings); j++) + { + eckb = evas_list_nth(cfdata->key_bindings, j); + + if (t->params == NULL) + { + // should I check if actions_pre... has a non-NULL params ? + if (strcasecmp(actions_predefined_names[eckb->acn].action_cmd == NULL ? "" : + actions_predefined_names[eckb->acn].action_cmd, t->action) == 0) + { + // here we found a first occurience of such action; + bk = E_NEW(E_Config_Binding_Key, 1); + if (!bk) + continue; + + bk->context = t->context; + bk->key = strdup(t->key); + bk->modifiers = t->modifiers; + bk->any_mod = t->any_mod; + bk->action = t->action == NULL ? NULL : strdup(t->action); + bk->params = t->params == NULL ? NULL : strdup(t->params); + + eckb->bk_list = evas_list_append(eckb->bk_list, bk); + break; + } + } + else if (t->action != NULL && t->params != NULL) + { + if (strcasecmp(actions_predefined_names[eckb->acn].action_cmd == NULL ? + "" : actions_predefined_names[eckb->acn].action_cmd, + t->action) == 0 && + strcasecmp(actions_predefined_names[eckb->acn].action_params == NULL ? + "" : actions_predefined_names[eckb->acn].action_params, + t->params) == 0) + { + bk = E_NEW(E_Config_Binding_Key, 1); + if (!bk) + continue; + + bk->context = t->context; + bk->key = strdup(t->key); + bk->modifiers = t->modifiers; + bk->any_mod = t->any_mod; + bk->action = t->action == NULL ? NULL : strdup(t->action); + bk->params = t->params == NULL ? NULL : strdup(t->params); + + eckb->bk_list = evas_list_append(eckb->bk_list, bk); + break; + } + } + + if (!bk && actions_predefined_names[eckb->acn].def_action == _NONDEFAULT_ACTION) + { + if (strcasecmp(actions_predefined_names[eckb->acn].action_cmd == NULL ? + "" : actions_predefined_names[eckb->acn].action_cmd, + t->action) == 0 ) + { + bk = E_NEW(E_Config_Binding_Key, 1); + if (!bk) + continue; + + bk->context = t->context; + bk->key = strdup(t->key); + bk->modifiers = t->modifiers; + bk->any_mod = t->any_mod; + bk->action = t->action == NULL ? NULL : strdup(t->action); + bk->params = t->params == NULL ? NULL : strdup(t->params); + + eckb->bk_list = evas_list_append(eckb->bk_list, bk); + break; + } + }// if (!bk ...) + } + } +} + +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + + cfdata->binding_context = E_BINDING_CONTEXT_ANY; + cfdata->key_bind = NULL; + cfdata->key_action = NULL; + cfdata->key_params = NULL; + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + unsigned int i, j; + unsigned int size, size2; + E_Config_KeyBind *eckb; + E_Config_Binding_Key *bk; + + + if (cfdata->key_bind) + E_FREE(cfdata->key_bind); + if (cfdata->key_action) + E_FREE(cfdata->key_action); + if (cfdata->key_params) + E_FREE(cfdata->key_params); + + size = evas_list_count(cfdata->key_bindings); + for (i = 0; i < size; i++) + { + eckb = evas_list_nth(cfdata->key_bindings, i); + if (eckb) + { + size2 = evas_list_count(eckb->bk_list); + for (j = 0; j < size2; j++) + { + bk = evas_list_nth(eckb->bk_list, j); + if (bk) + { + if (bk->key) E_FREE(bk->key); + if (bk->action) E_FREE(bk->action); + if (bk->params) E_FREE(bk->params); + + E_FREE(bk); + } + } + evas_list_free(eckb->bk_list); + E_FREE(eckb); + } + } + evas_list_free(cfdata->key_bindings); + free(cfdata); +} + +static int +_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + E_Config_KeyBind *eckb; + E_Config_Binding_Key *bk, *bk2; + size_t size, size2; + unsigned int i, j; + + // here the removing of the old keybindings goes + while (e_config->key_bindings) + { + E_Config_Binding_Key *eb; + + eb = e_config->key_bindings->data; + e_config->key_bindings = evas_list_remove_list(e_config->key_bindings, + e_config->key_bindings); + if (eb->key) evas_stringshare_del(eb->key); + if (eb->action) evas_stringshare_del(eb->action); + if (eb->params) evas_stringshare_del(eb->params); + E_FREE(eb); + } + + // here the adding of new keybinds are going. + size = evas_list_count(cfdata->key_bindings); + for (i = 0; i < size; i++) + { + eckb = evas_list_nth(cfdata->key_bindings, i); + if (eckb) + { + size2 = evas_list_count(eckb->bk_list); + for (j = 0; j < size2; j++) + { + bk = evas_list_nth(eckb->bk_list, j); + if (bk && bk->key && strlen(bk->key) > 0) + { + bk2 = E_NEW(E_Config_Binding_Key, 1); + if (bk2) + { + bk2->context = bk->context; + bk2->key = (char *)evas_stringshare_add(bk->key); + bk2->modifiers = bk->modifiers; + bk2->any_mod = bk->any_mod; + bk2->action = bk->action == NULL ? NULL : + (char *)evas_stringshare_add(bk->action); + bk2->params = bk->params == NULL ? NULL : + (char *)evas_stringshare_add(bk->params); + e_config->key_bindings = evas_list_append(e_config->key_bindings, bk2); + } + } + } + } + } + + return 1; +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + int i; + Evas_Object *o, *oft, *oft1, *of1, *of2, *ot, *ot1, *btn, *ilist; + Evas_Object *ob; + E_Radio_Group *rg; + int mw, mh; + + cfdata->evas = evas; + _fill_keybindings_data(cfdata); + + o = e_widget_list_add(evas, 0, 0); + + oft = e_widget_table_add(evas, 0); + { + of1 = e_widget_framelist_add(evas, _("Action"), 0); + { + cfdata->gui.ilist = ilist = e_widget_ilist_add(evas, 16, 16, NULL); + { + e_widget_on_change_hook_set(ilist, _ilist_kb_cb_change, cfdata); + + for( i = 0; i < evas_list_count(cfdata->key_bindings); i++ ) + { + Evas_Object *ic; + E_Config_KeyBind *eckb; + + eckb = evas_list_nth(cfdata->key_bindings, i); + ic = edje_object_add(evas); + if (eckb && eckb->bk_list != NULL) + e_util_edje_icon_set(ic, ILIST_ICON_WITH_KEYBIND); + else + e_util_edje_icon_set(ic, ILIST_ICON_WITHOUT_KEYBIND); + + e_widget_ilist_append(ilist, ic, + _(actions_predefined_names[eckb->acn].action_name), + NULL, NULL, NULL); + } + e_widget_min_size_set(ilist, 250, 330); + e_widget_ilist_go(ilist); + } + e_widget_framelist_object_append(of1, ilist); + + /*ot = e_widget_table_add(evas, 0); + { + btn = e_widget_button_add(evas, _("Add"), NULL, NULL/callback/, NULL, NULL); + cfdata->gui.btn_add = btn; + //e_widget_disabled_set(btn, 1); + //edje_object_size_min_calc(btn, &mw, &mh); + e_widget_min_size_set(btn, 110, 28); + e_widget_table_object_append(ot, btn, 1, 0, 1, 1, 1, 1, 1, 1); + + btn = e_widget_button_add(evas, _("Delete"), NULL, NULL/callback/, NULL, NULL); + cfdata->gui.btn_del = btn; + e_widget_disabled_set(btn, 1); + //edje_object_size_min_calc(btn, &mw, &mh); + e_widget_min_size_set(btn, 110, 28); + e_widget_table_object_append(ot, btn, 2, 0, 1, 1, 1, 1, 1, 1); + } + e_widget_framelist_object_append(of1, ot );*/ + } + e_widget_table_object_append(oft, of1, 0, 0, 1, 1, 1, 1, 1, 1); + + of2 = e_widget_framelist_add(evas, _("Parameters"), 0); + { + rg = e_widget_radio_group_new((int *)(&(cfdata->binding_context))); + oft1 = e_widget_frametable_add(evas, _("Binding Context"), 0); + { + // first radio column + ob = e_widget_radio_add(evas, _("Any"), E_BINDING_CONTEXT_ANY, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_ANY] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 0, 0, 1, 1, 1, 0, 1, 0); + + ob = e_widget_radio_add(evas, _("Border"), E_BINDING_CONTEXT_BORDER, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_BORDER] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 0, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_radio_add(evas, _("Zone"), E_BINDING_CONTEXT_ZONE, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_ZONE] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 0, 2, 1, 1, 1, 0, 1, 0); + + // second radio column + ob = e_widget_radio_add(evas, _("Container"), E_BINDING_CONTEXT_CONTAINER, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_CONTAINER] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 1, 0, 1, 1, 1, 0, 1, 0); + + ob = e_widget_radio_add(evas, _("Manager"), E_BINDING_CONTEXT_MANAGER, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_MANAGER] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 1, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_radio_add(evas, _("Menu"), E_BINDING_CONTEXT_MENU, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_MENU] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 1, 2, 1, 1, 1, 0, 1, 0); + + // third radio column + ob = e_widget_radio_add(evas, _("Win List"), E_BINDING_CONTEXT_WINLIST, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_WINLIST] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 2, 0, 1, 1, 1, 0, 1, 0); + + ob = e_widget_radio_add(evas, _("Popup"), E_BINDING_CONTEXT_POPUP, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_POPUP] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 2, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_radio_add(evas, _("None"), E_BINDING_CONTEXT_NONE, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_NONE] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 2, 2, 1, 1, 1, 0, 1, 0); + + // Fourth radio column + ob = e_widget_radio_add(evas, _("Unknown"), E_BINDING_CONTEXT_UNKNOWN, rg); + cfdata->gui.bind_context[E_BINDING_CONTEXT_UNKNOWN] = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 3, 0, 1, 1, 1, 0, 1, 0); + } + e_widget_framelist_object_append(of2, oft1); + + oft1 = e_widget_frametable_add(evas, _("Key Binding"), 0); + { + ob = e_widget_label_add(evas, _("Key :")); + e_widget_frametable_object_append(oft1, ob, 0, 0, 1, 1, 1, 0, 1, 0); + + ob = e_widget_entry_add(evas, &(cfdata->key_bind)); + e_widget_entry_on_change_callback_set(ob, _entry_keybind_cb_text_change, cfdata); + cfdata->gui.key_bind = ob; + //e_widget_disabled_set(ob, 1); + e_widget_min_size_set(ob, 200, 25); + e_widget_frametable_object_append(oft1, ob, 1, 0, 4, 1, 1, 0, 1, 0); + + ob = e_widget_check_add(evas, _("Shift"), &(cfdata->bind_mod.shift)); + cfdata->gui.bind_mod_obj.shift = ob; + //e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 0, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_check_add(evas, _("Control"), &(cfdata->bind_mod.ctrl)); + cfdata->gui.bind_mod_obj.ctrl = ob; + //e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 1, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_check_add(evas, _("Alt"), &(cfdata->bind_mod.alt)); + cfdata->gui.bind_mod_obj.alt = ob; + //e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 2, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_check_add(evas, _("Win"), &(cfdata->bind_mod.win)); + cfdata->gui.bind_mod_obj.win = ob; + //e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(oft1, ob, 3, 1, 1, 1, 1, 0, 1, 0); + } + e_widget_framelist_object_append(of2, oft1); + + oft1 = e_widget_frametable_add(evas, _("Key Action"), 0); + { + ob = e_widget_label_add(evas, _("Action :")); + e_widget_frametable_object_append(oft1, ob, 0, 0, 1, 1, 1, 0, 1, 0); + + ob = e_widget_entry_add(evas, &(cfdata->key_action)); + cfdata->gui.key_action = ob; + e_widget_disabled_set(ob, 1); + e_widget_min_size_set(ob, 200, 25); + e_widget_frametable_object_append(oft1, ob, 1, 0, 1, 1, 1, 0, 1, 0); + + ob = e_widget_label_add(evas, _("Params :")); + e_widget_frametable_object_append(oft1, ob, 0, 1, 1, 1, 1, 0, 1, 0); + + ob = e_widget_entry_add(evas, &(cfdata->key_params)); + cfdata->gui.key_params = ob; + e_widget_disabled_set(ob, 1); + e_widget_min_size_set(ob, 200, 25); + e_widget_frametable_object_append(oft1, ob, 1, 1, 1, 1, 1, 0, 1, 0); + } + e_widget_framelist_object_append(of2, oft1); + + oft1 = e_widget_table_add(evas, 0); + { + btn = e_widget_button_add(evas, BTN_PREV_KEYBINDING_TEXT, NULL, _keybind_cb_prev_keybind, + cfdata, NULL); + cfdata->gui.btn_prev_keybind = btn; + e_widget_disabled_set(btn, 1); + //edje_object_size_min_calc(btn, &mw, &mh); + e_widget_min_size_set(btn, 140, 28); + e_widget_table_object_append(oft1, btn, 1, 0, 1, 1, 1, 1, 1, 1); + + btn = e_widget_button_add(evas, BTN_NEXT_KEYBINDING_TEXT, NULL, _keybind_cb_next_keybind, + cfdata, NULL); + cfdata->gui.btn_next_keybind = btn; + e_widget_disabled_set(btn, 1); + //edje_object_size_min_calc(btn, &mw, &mh); + e_widget_min_size_set(btn, 140, 28); + e_widget_table_object_append(oft1, btn, 2, 0, 1, 1, 1, 1, 1, 1); + + btn = e_widget_button_add(evas, BTN_ADD_KEYBINDING_TEXT, NULL, _keybind_cb_add_keybinding, + cfdata, NULL); + cfdata->gui.btn_add_keybind = btn; + e_widget_disabled_set(btn, 1); + //edje_object_size_min_calc(btn, &mw, &mh); + e_widget_min_size_set(btn, 140, 28); + e_widget_table_object_append(oft1, btn, 1, 1, 1, 1, 1, 1, 1, 1); + + btn = e_widget_button_add(evas, BTN_DEL_KEYBINDING_TEXT, NULL, _keybind_cb_del_keybinding, + cfdata, NULL); + cfdata->gui.btn_del_keybind = btn; + e_widget_disabled_set(btn, 1); + //edje_object_size_min_calc(btn, &mw, &mh); + e_widget_min_size_set(btn, 140, 28); + e_widget_table_object_append(oft1, btn, 2, 1, 1, 1, 1, 1, 1, 1); + } + e_widget_framelist_object_append(of2, oft1); + } + e_widget_table_object_append(oft, of2, 1, 0, 1, 1, 1, 1, 1, 1); + } + e_widget_list_object_append(o, oft, 1, 1, 0.5); + e_dialog_resizable_set(cfd->dia, 1); + return o; +} + +static void _update_context_radios(E_Config_Dialog_Data *cfdata) +{ + E_Widget_Radio_Data *wd; + E_Config_Binding_Key *bk; + + if (cfdata == NULL) return; + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_NONE]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_UNKNOWN]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_BORDER]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_BORDER]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_ZONE]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_CONTAINER]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_MANAGER]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_MENU]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_WINLIST]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_POPUP]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_ANY]); + edje_object_signal_emit(wd->o_radio, "toggle_off", ""); + + if (cfdata->cur_eckb == NULL) return; + if (cfdata->cur_eckb->bk_list == NULL) return; + + if ((bk = evas_list_nth(cfdata->cur_eckb->bk_list, cfdata->cur_eckb_kb_sel)) == NULL ) + return; + + if (bk->context == E_BINDING_CONTEXT_NONE) + { + cfdata->binding_context = E_BINDING_CONTEXT_NONE; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_NONE]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_UNKNOWN) + { + cfdata->binding_context = E_BINDING_CONTEXT_UNKNOWN; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_UNKNOWN]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_BORDER) + { + cfdata->binding_context = E_BINDING_CONTEXT_BORDER; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_BORDER]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_ZONE) + { + cfdata->binding_context = E_BINDING_CONTEXT_ZONE; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_ZONE]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_CONTAINER) + { + cfdata->binding_context = E_BINDING_CONTEXT_CONTAINER; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_CONTAINER]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_MANAGER) + { + cfdata->binding_context = E_BINDING_CONTEXT_MANAGER; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_MANAGER]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_MENU) + { + cfdata->binding_context = E_BINDING_CONTEXT_MENU; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_MENU]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_WINLIST) + { + cfdata->binding_context = E_BINDING_CONTEXT_WINLIST; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_WINLIST]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_POPUP) + { + cfdata->binding_context = E_BINDING_CONTEXT_POPUP; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_POPUP]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } + + if (bk->context == E_BINDING_CONTEXT_ANY) + { + cfdata->binding_context = E_BINDING_CONTEXT_ANY; + wd = e_widget_data_get(cfdata->gui.bind_context[E_BINDING_CONTEXT_ANY]); + edje_object_signal_emit(wd->o_radio, "toggle_on", ""); + } +} +static void _update_modifiers_checkboxs(E_Config_Dialog_Data *cfdata) +{ + E_Widget_Checkbox_Data *wd; + E_Config_Binding_Key *bk; + + if (cfdata == NULL) return; + + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.ctrl); + edje_object_signal_emit(wd->o_check, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.alt); + edje_object_signal_emit(wd->o_check, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.shift); + edje_object_signal_emit(wd->o_check, "toggle_off", ""); + + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.win); + edje_object_signal_emit(wd->o_check, "toggle_off", ""); + + if (cfdata->cur_eckb == NULL) return; + if (cfdata->cur_eckb->bk_list == NULL) return; + + if ((bk = evas_list_nth(cfdata->cur_eckb->bk_list, cfdata->cur_eckb_kb_sel)) == NULL ) + return; + + cfdata->bind_mod.ctrl = 0; + cfdata->bind_mod.alt = 0; + cfdata->bind_mod.shift = 0; + cfdata->bind_mod.win = 0; + + if (bk->modifiers & E_BINDING_MODIFIER_CTRL) + { + cfdata->bind_mod.ctrl = 1; + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.ctrl); + edje_object_signal_emit(wd->o_check, "toggle_on", ""); + } + + if (bk->modifiers & E_BINDING_MODIFIER_ALT) + { + cfdata->bind_mod.alt = 1; + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.alt); + edje_object_signal_emit(wd->o_check, "toggle_on", ""); + } + + if (bk->modifiers & E_BINDING_MODIFIER_SHIFT) + { + cfdata->bind_mod.shift = 1; + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.shift); + edje_object_signal_emit(wd->o_check, "toggle_on", ""); + } + + if (bk->modifiers & E_BINDING_MODIFIER_WIN) + { + cfdata->bind_mod.win = 1; + wd = e_widget_data_get(cfdata->gui.bind_mod_obj.win); + edje_object_signal_emit(wd->o_check, "toggle_on", ""); + } +} + +static void _update_key_binding_entry(E_Config_Dialog_Data *cfdata) +{ + E_Widget_Entry_Data *wd; + E_Config_Binding_Key *bk; + + if( cfdata == NULL ) return; + + wd = e_widget_data_get(cfdata->gui.key_bind); + e_entry_text_set(wd->o_entry, ""); + + + if (cfdata->cur_eckb == NULL)return; + if (cfdata->cur_eckb->bk_list == NULL) return; + + if ((bk = evas_list_nth(cfdata->cur_eckb->bk_list, cfdata->cur_eckb_kb_sel)) == NULL ) + return; + + if (cfdata->key_bind != NULL) + E_FREE(cfdata->key_bind); + cfdata->key_bind = bk->key == NULL ? NULL : strdup(bk->key); + + if (bk->key) + { + wd = e_widget_data_get(cfdata->gui.key_bind); + e_entry_text_set(wd->o_entry, bk->key); + } +} + +static void _update_action_param_entries(E_Config_Dialog_Data *cfdata) +{ + E_Widget_Entry_Data *wd; + E_Config_Binding_Key *bk; + + if (cfdata == NULL) return; + + wd = e_widget_data_get(cfdata->gui.key_action); + e_entry_text_set(wd->o_entry, ""); + + wd = e_widget_data_get(cfdata->gui.key_params); + e_entry_text_set(wd->o_entry, ""); + + e_widget_disabled_set(cfdata->gui.key_action, 1); + e_widget_disabled_set(cfdata->gui.key_params, 1); + + if (cfdata->cur_eckb == NULL) return; + if (cfdata->cur_eckb->bk_list == NULL) return; + + if ((bk = evas_list_nth(cfdata->cur_eckb->bk_list, cfdata->cur_eckb_kb_sel)) == NULL) + return; + + if (cfdata->key_action != NULL) + E_FREE(cfdata->key_action); + cfdata->key_action = bk->action == NULL ? NULL : strdup(bk->action); + + if (bk->action) + { + + wd = e_widget_data_get(cfdata->gui.key_action); + e_entry_text_set(wd->o_entry, bk->action); + } + + if (cfdata->key_params != NULL) + E_FREE(cfdata->key_params); + cfdata->key_params = bk->params == NULL ? NULL : strdup(bk->params); + + if (bk->params) + { + + wd = e_widget_data_get(cfdata->gui.key_params); + e_entry_text_set(wd->o_entry, bk->params); + } + + if (!(actions_predefined_names[cfdata->cur_eckb->acn].restrictions & EDIT_RESTRICT_ACTION)) + e_widget_disabled_set(cfdata->gui.key_action, 0); + + if (!(actions_predefined_names[cfdata->cur_eckb->acn].restrictions & EDIT_RESTRICT_PARAMS)) + e_widget_disabled_set(cfdata->gui.key_params, 0); +} + +static void +_update_next_prev_add_del_buttons(E_Config_Dialog_Data *cfdata) +{ + char buf[ 50 ]; + E_Widget_Button_Data *wd_next; + E_Widget_Button_Data *wd_prev; + E_Widget_Button_Data *wd_add; + E_Widget_Button_Data *wd_del; + E_Config_Binding_Key *bk; + + if (cfdata == NULL) return; + + wd_next = e_widget_data_get(cfdata->gui.btn_next_keybind); + wd_prev = e_widget_data_get(cfdata->gui.btn_prev_keybind); + wd_add = e_widget_data_get(cfdata->gui.btn_add_keybind); + wd_del = e_widget_data_get(cfdata->gui.btn_del_keybind); + + if (evas_list_count(cfdata->cur_eckb->bk_list) > 1) + { + if (cfdata->cur_eckb_kb_sel >= (evas_list_count(cfdata->cur_eckb->bk_list) - 1)) + { + e_widget_disabled_set(cfdata->gui.btn_next_keybind, 1); + sprintf(buf, "%s (%d)", BTN_NEXT_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel); + edje_object_part_text_set(wd_next->o_button, "label", buf); + + e_widget_disabled_set(cfdata->gui.btn_prev_keybind, 0); + sprintf(buf, "%s (%d)", BTN_PREV_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel - 1); + edje_object_part_text_set(wd_prev->o_button, "label", buf); + } + else if (cfdata->cur_eckb_kb_sel <= 0) + { + e_widget_disabled_set(cfdata->gui.btn_next_keybind, 0); + sprintf(buf, "%s (%d)", BTN_NEXT_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel + 1); + edje_object_part_text_set(wd_next->o_button, "label", buf); + + e_widget_disabled_set(cfdata->gui.btn_prev_keybind, 1); + sprintf(buf, "%s (%d)", BTN_PREV_KEYBINDING_TEXT, 0); + edje_object_part_text_set(wd_prev->o_button, "label", buf); + } + else + { + e_widget_disabled_set(cfdata->gui.btn_next_keybind, 0); + sprintf(buf, "%s (%d)", BTN_NEXT_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel + 1); + edje_object_part_text_set(wd_next->o_button, "label", buf); + + e_widget_disabled_set(cfdata->gui.btn_prev_keybind, 0); + sprintf(buf, "%s (%d)", BTN_PREV_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel - 1); + edje_object_part_text_set(wd_prev->o_button, "label", buf); + } + } + else + { + e_widget_disabled_set(cfdata->gui.btn_next_keybind, 1); + sprintf(buf, "%s (%d)", BTN_NEXT_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel); + edje_object_part_text_set(wd_next->o_button, "label", buf); + + e_widget_disabled_set(cfdata->gui.btn_prev_keybind, 1); + sprintf(buf, "%s (%d)", BTN_PREV_KEYBINDING_TEXT, 0); + edje_object_part_text_set(wd_prev->o_button, "label", buf); + } + + if (cfdata->key_bind == NULL || strlen(cfdata->key_bind) == 0) + { + e_widget_disabled_set(cfdata->gui.btn_add_keybind, 1); + sprintf(buf, "%s (%d)", BTN_ADD_KEYBINDING_TEXT, + evas_list_count(cfdata->cur_eckb->bk_list)-1); + edje_object_part_text_set(wd_add->o_button, "label", buf); + } + else + { + e_widget_disabled_set(cfdata->gui.btn_add_keybind, 0); + sprintf(buf, "%s (%d)", BTN_ADD_KEYBINDING_TEXT, evas_list_count(cfdata->cur_eckb->bk_list)); + edje_object_part_text_set(wd_add->o_button, "label", buf); + } + + + if (evas_list_count(cfdata->cur_eckb->bk_list) == 1) + { + if (cfdata->key_bind == NULL || strlen(cfdata->key_bind) == 0) + { + e_widget_disabled_set(cfdata->gui.btn_del_keybind, 1); + } + else + { + e_widget_disabled_set(cfdata->gui.btn_del_keybind, 0); + } + sprintf(buf, "%s (%d)", BTN_DEL_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel); + edje_object_part_text_set(wd_del->o_button, "label", buf); + } + else + { + e_widget_disabled_set(cfdata->gui.btn_del_keybind, 0); + sprintf(buf, "%s (%d)", BTN_DEL_KEYBINDING_TEXT, cfdata->cur_eckb_kb_sel); + edje_object_part_text_set(wd_del->o_button, "label", buf); + } +} + +static void +_update_ilist_cur_selection_icon(E_Config_Dialog_Data *cfdata) +{ + int sel_indx; + E_Smart_Item *si; + E_Smart_Data *sd; + E_Widget_IList_Data *wd; + Evas_Object *obj; + + if (!cfdata) return; + if (!cfdata->cur_eckb) return; + + wd = e_widget_data_get(cfdata->gui.ilist); + + obj = wd->o_ilist; + + sd = evas_object_smart_data_get(obj); + if ((!obj) || (!sd) || + (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), "e_ilist"))) + return; + + si = evas_list_nth(sd->items, sd->selected); + if (si) + { + edje_object_part_unswallow(si->base_obj, si->icon_obj); + evas_object_hide(si->icon_obj); + if (evas_list_count(cfdata->cur_eckb->bk_list) > 1) + { + if (si->icon_obj == NULL) si->icon_obj = edje_object_add(cfdata->evas); + e_util_edje_icon_set(si->icon_obj, ILIST_ICON_WITH_KEYBIND); + } + else if (evas_list_count(cfdata->cur_eckb->bk_list) == 1) + { + if (cfdata->key_bind && strlen(cfdata->key_bind) > 0) + { + if (si->icon_obj == NULL) si->icon_obj = edje_object_add(cfdata->evas); + e_util_edje_icon_set(si->icon_obj, ILIST_ICON_WITH_KEYBIND); + } + else + si->icon_obj = NULL; + //e_util_edje_icon_set(si->icon_obj, ILIST_ICON_WITHOUT_KEYBIND); + } + else + si->icon_obj = NULL; + //e_util_edje_icon_set(si->icon_obj, ILIST_ICON_WITHOUT_KEYBIND); + + if (si->icon_obj) + { + edje_extern_object_min_size_set(si->icon_obj, sd->icon_w, sd->icon_h); + edje_object_part_swallow(si->base_obj, "icon_swallow", si->icon_obj); + evas_object_show(si->icon_obj); + } + } + e_widget_ilist_go(cfdata->gui.ilist); +} + +static void +_ilist_kb_cb_change(void *data, Evas_Object *obj) +{ + char buf[256]; + + int acn, i; + char *label; + E_Config_Dialog_Data *cfdata; + E_Config_KeyBind *eckb = NULL; + E_Config_Binding_Key *bk; + + cfdata = data; + + if (cfdata->cur_eckb) + if (_keybind_cb_auto_apply(cfdata) != 0) + { + //TODO: message box which should ask if we really should proceed. + //If yes, then the current 'empty' binding will be deleted + _keybind_delete_keybinding(cfdata); + } + + label = strdup(e_widget_ilist_selected_label_get(obj)); + for (acn = 0; strcasecmp(label, actions_predefined_names[acn].action_name == NULL ? "" : + actions_predefined_names[acn].action_name) != 0; acn++ ); + + for (i = 0; evas_list_count(cfdata->key_bindings); i++) + { + eckb = evas_list_nth(cfdata->key_bindings, i); + if (eckb->acn == acn) + break; + eckb = NULL; + } + cfdata->cur_eckb = eckb; + cfdata->cur_eckb_kb_sel = 0; + + if (!cfdata->cur_eckb->bk_list || evas_list_count(cfdata->cur_eckb->bk_list) == 0) + { + bk = E_NEW(E_Config_Binding_Key, 1); + + bk->key = NULL; + bk->modifiers = E_BINDING_MODIFIER_NONE; + bk->any_mod = 0; + bk->action = actions_predefined_names[acn].action_cmd == NULL ? NULL : + strdup(actions_predefined_names[acn].action_cmd); + bk->params = actions_predefined_names[acn].action_params == NULL ? NULL : + strdup(actions_predefined_names[acn].action_params); + + cfdata->cur_eckb->bk_list = evas_list_append(cfdata->cur_eckb->bk_list, bk); + } + + if (cfdata->cur_eckb) + { + _update_context_radios(cfdata); + _update_modifiers_checkboxs(cfdata); + _update_key_binding_entry(cfdata); + _update_action_param_entries(cfdata); + _update_next_prev_add_del_buttons(cfdata); + } +} + + +static void +_keybind_cb_next_keybind(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata; + int old_kb_sel; + + cfdata = data; + + if (cfdata == NULL) return; + if (cfdata->cur_eckb == NULL) return; + + old_kb_sel = cfdata->cur_eckb_kb_sel; + + if (_keybind_cb_auto_apply(cfdata) != 0) + { + //TODO: message box which should ask if we really should proceed. + //If yes, then the current 'empty' binding will be deleted + //_keybind_cb_del_keybinding(cfdata, NULL); + _keybind_delete_keybinding(cfdata); + + if (old_kb_sel == 0) + ; + else + cfdata->cur_eckb_kb_sel ++; + } + else + cfdata->cur_eckb_kb_sel ++; + + if (cfdata->cur_eckb_kb_sel >= evas_list_count(cfdata->cur_eckb->bk_list)) + cfdata->cur_eckb_kb_sel = evas_list_count(cfdata->cur_eckb->bk_list) - 1; + + _update_context_radios(cfdata); + _update_modifiers_checkboxs(cfdata); + _update_key_binding_entry(cfdata); + _update_action_param_entries(cfdata); + _update_next_prev_add_del_buttons(cfdata); +} + +static void +_keybind_cb_prev_keybind(void *data, void *data2) +{ + char buf[50]; + E_Config_Dialog_Data *cfdata; + E_Widget_Button_Data *wd_next, *wd_prev; + + int old_kb_sel; + int old_bk_list_size; + + cfdata = data; + + if (cfdata == NULL) return; + if (cfdata->cur_eckb == NULL) return; + + old_kb_sel = cfdata->cur_eckb_kb_sel; + old_bk_list_size = evas_list_count(cfdata->cur_eckb->bk_list); + + if (_keybind_cb_auto_apply(cfdata) != 0) + { + //TODO: message box which should ask if we really should proceed. + //If yes, then the current 'empty' binding will be deleted + //_keybind_cb_del_keybinding(cfdata, NULL); + _keybind_delete_keybinding(cfdata); + + if (old_kb_sel == old_bk_list_size - 1) + ; + else + cfdata->cur_eckb_kb_sel --; + } + else + cfdata->cur_eckb_kb_sel --; + + if (cfdata->cur_eckb_kb_sel < 0) + cfdata->cur_eckb_kb_sel = 0; + + _update_context_radios(cfdata); + _update_modifiers_checkboxs(cfdata); + _update_key_binding_entry(cfdata); + _update_action_param_entries(cfdata); + _update_next_prev_add_del_buttons(cfdata); +} + +static void +_keybind_cb_add_keybinding(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata; + E_Config_Binding_Key *bk; + + cfdata = data; + + if (cfdata == NULL) return; + + if (_keybind_cb_auto_apply(cfdata) != 0) + { + //TODO: message box, that a keybinding cannot be added + //until the current is assigned. + return; + } + + bk = E_NEW(E_Config_Binding_Key, 1); + if (!bk) + return; + + bk->context = E_BINDING_CONTEXT_ANY; + bk->key = NULL; + bk->modifiers = E_BINDING_MODIFIER_NONE; + bk->action = actions_predefined_names[cfdata->cur_eckb->acn].action_cmd == NULL ? NULL : + strdup(actions_predefined_names[cfdata->cur_eckb->acn].action_cmd); + bk->params = actions_predefined_names[cfdata->cur_eckb->acn].action_params == NULL ? NULL : + strdup(actions_predefined_names[cfdata->cur_eckb->acn].action_params); + + cfdata->cur_eckb->bk_list = evas_list_append(cfdata->cur_eckb->bk_list, bk); + cfdata->cur_eckb_kb_sel = evas_list_count(cfdata->cur_eckb->bk_list) - 1; + + _update_context_radios(cfdata); + _update_modifiers_checkboxs(cfdata); + _update_key_binding_entry(cfdata); + _update_action_param_entries(cfdata); + _update_next_prev_add_del_buttons(cfdata); +} + + +static void +_keybind_cb_del_keybinding(void *data, void *data2) +{ + int i; + E_Config_Dialog_Data *cfdata; + E_Config_Binding_Key *bk, *bk_del; + Evas_List *new_bk_list; + + cfdata = data; + + if (cfdata == NULL) return; + if (cfdata->cur_eckb == NULL)return; + + _keybind_delete_keybinding(cfdata); + + _update_context_radios(cfdata); + _update_modifiers_checkboxs(cfdata); + _update_key_binding_entry(cfdata); + _update_action_param_entries(cfdata); + _update_next_prev_add_del_buttons(cfdata); + _update_ilist_cur_selection_icon(cfdata); +} + +static void +_entry_keybind_cb_text_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data *cfdata = data; + _update_ilist_cur_selection_icon(cfdata); + _update_next_prev_add_del_buttons(cfdata); +} + +static int +_keybind_cb_auto_apply(E_Config_Dialog_Data *cfdata) +{ + E_Config_Binding_Key *bk; + if (!cfdata || !cfdata->cur_eckb) + return -1; + + if (cfdata->key_bind == NULL || strlen(cfdata->key_bind) == 0) + return -1; + + bk = evas_list_nth(cfdata->cur_eckb->bk_list, cfdata->cur_eckb_kb_sel); + if (bk == NULL) + return -1; + + bk->context = cfdata->binding_context; + if (bk->key) E_FREE(bk->key); + bk->key = strdup(cfdata->key_bind); + + bk->modifiers = 0; + if (cfdata->bind_mod.shift) + bk->modifiers |= E_BINDING_MODIFIER_SHIFT; + if (cfdata->bind_mod.ctrl) + bk->modifiers |= E_BINDING_MODIFIER_CTRL; + if (cfdata->bind_mod.alt) + bk->modifiers |= E_BINDING_MODIFIER_ALT; + if (cfdata->bind_mod.win) + bk->modifiers |= E_BINDING_MODIFIER_WIN; + + bk->any_mod = 0; + if (bk->action) E_FREE(bk->action); + bk->action = (cfdata->key_action == NULL || strlen(cfdata->key_action) == 0) ? NULL : + strdup(cfdata->key_action); + if (bk->params) E_FREE(bk->params); + bk->params = (cfdata->key_params == NULL || strlen(cfdata->key_params) == 0) ? NULL : + strdup(cfdata->key_params); + + return 0; +} + +/* deletes an entry e from kb_list and returns a new list + * without that entry. + * On error returns NULL + */ +static int +_keybind_delete_keybinding(E_Config_Dialog_Data *cfdata) +{ + int i; + unsigned int kb_list_size; + E_Config_Binding_Key *bk_del; + Evas_List *new_kb_list; + if (!cfdata || !cfdata->cur_eckb || !cfdata->cur_eckb->bk_list) + return -1; + + new_kb_list = NULL; + + kb_list_size = evas_list_count(cfdata->cur_eckb->bk_list); + + if (kb_list_size > 1) + { + bk_del = evas_list_nth(cfdata->cur_eckb->bk_list, cfdata->cur_eckb_kb_sel); + if (!bk_del)return -1; + + for (i = 0; i < kb_list_size; i++) + { + if (i != cfdata->cur_eckb_kb_sel) + new_kb_list = evas_list_append(new_kb_list, + evas_list_nth(cfdata->cur_eckb->bk_list, i)); + } + + if (bk_del->key != NULL) + E_FREE(bk_del->key); + if (bk_del->action != NULL) + E_FREE(bk_del->action); + if (bk_del->params != NULL) + E_FREE(bk_del->params); + bk_del->key = bk_del->action = bk_del->params = NULL; + E_FREE(bk_del); + + evas_list_free(cfdata->cur_eckb->bk_list); + cfdata->cur_eckb->bk_list = new_kb_list; + } + else if (kb_list_size == 1) + { + bk_del = evas_list_nth(cfdata->cur_eckb->bk_list, 0); + if (!bk_del) return -1; + bk_del->context = E_BINDING_CONTEXT_NONE; + if (bk_del->key != NULL) + E_FREE(bk_del->key); + bk_del->key = NULL; + bk_del->modifiers = E_BINDING_MODIFIER_NONE; + bk_del->any_mod = 0; + } + + if (cfdata->cur_eckb_kb_sel >= evas_list_count(cfdata->cur_eckb->bk_list)) + cfdata->cur_eckb_kb_sel = evas_list_count(cfdata->cur_eckb->bk_list) - 1; + + return 0; +} diff --git a/src/bin/e_int_config_keybindings.h b/src/bin/e_int_config_keybindings.h new file mode 100644 index 0000000..0e8a6bf --- /dev/null +++ b/src/bin/e_int_config_keybindings.h @@ -0,0 +1,9 @@ +#ifdef E_TYPEDEFS +#else +#ifndef E_INT_CONFIG_KEYBINDINGS_H +#define E_INT_CONFIG_KEYBINDINGS_H + +EAPI E_Config_Dialog *e_int_config_keybindings(E_Container *con); + +#endif +#endif -- 2.7.4