rimmed pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=8e697ded111730ac3f8f484685e19bdfd7568114

commit 8e697ded111730ac3f8f484685e19bdfd7568114
Author: Mykyta Biliavskyi <[email protected]>
Date:   Wed Oct 26 09:35:45 2016 +0300

    Shortcuts: add infrastructure to make shortcuts changable.
    
    Added API:
    shortcuts_shortcut_new_set
    shortcuts_shortcut_reset
    shortcuts_shortcut_combination_get
    shortcuts_disabled_set
    
    Those function make possible to set new key combination to the
    different type of actions. Reset whole list of shortcuts to default
    values. Generate string representation of shortcut combinations.
---
 src/bin/ui/shortcuts/shortcuts.c | 338 +++++++++++++++++++++++++++++++++++++--
 src/bin/ui/shortcuts/shortcuts.h |  64 +++++++-
 2 files changed, 381 insertions(+), 21 deletions(-)

diff --git a/src/bin/ui/shortcuts/shortcuts.c b/src/bin/ui/shortcuts/shortcuts.c
index 0520c5a..1e227a0 100644
--- a/src/bin/ui/shortcuts/shortcuts.c
+++ b/src/bin/ui/shortcuts/shortcuts.c
@@ -18,7 +18,7 @@
  */
 
 #include "shortcuts.h"
-
+#include "config.h"
 static Eina_List *handlers_stack = NULL;
 
 static inline unsigned int
@@ -98,16 +98,6 @@ _keycode_convert(unsigned int keycode)
    return keycode;
 }
 
-struct _Shortcut
-{
-   unsigned int          keycode;
-   unsigned int          modifiers;
-   Shortcut_Type         type_press;
-   Shortcut_Type         type_unpress;
-   char                  *keyname;
-};
-typedef struct _Shortcut Shortcut;
-
 struct _Shortcut_Module
 {
    Ecore_Event_Handler *shortcuts_wheel_handler; /**< handler for catching 
mouse wheel\
@@ -120,6 +110,7 @@ struct _Shortcut_Module
    Eina_List *shortcuts;      /**< list of user's shortcuts */
    Eina_List *held_shortcuts; /**< list of functions that is being held */
    unsigned int last_modifiers;
+   Eina_Bool disabled;  /**< If shortcuts disabled - there are no reaction to 
input > */
 };
 
 static int
@@ -131,10 +122,6 @@ _shortcut_cmp(Shortcut *s1, Shortcut *s2)
           {
              return strcmp(s1->keyname, s2->keyname);
           }
-        else
-          {
-             return -1;
-          }
      }
    return s1->modifiers - s2->modifiers;
 }
@@ -230,6 +217,9 @@ _mouse_wheel_event_cb(void *data __UNUSED__, int type 
__UNUSED__, void *event)
 {
    Ecore_Event_Mouse_Wheel *ev = event;
 
+   if (ap.shortcuts->disabled)
+     return ECORE_CALLBACK_PASS_ON;
+
    if ((ev->modifiers & 255) != MOD_CTRL)
      return ECORE_CALLBACK_PASS_ON;
 
@@ -248,6 +238,9 @@ _key_press_event_cb(void *data __UNUSED__, int type 
__UNUSED__, void *event)
    Shortcut sc, *shortcut;
    const char *obj_name;
 
+   if (ap.shortcuts->disabled)
+     return ECORE_CALLBACK_PASS_ON;
+
    /*
     *  (ev->modifiers && 255) because modifiers contain both locks and modifs,
     *  so if Caps Lock is clicked, then with MOD_SHIFT it will return not 1, 
but 257.
@@ -326,6 +319,8 @@ _key_unpress_event_cb(void *data __UNUSED__, int type 
__UNUSED__, void *event)
    Shortcut sc, *shortcut;
    unsigned int unpressed_modifiers;
    Eina_List *l, *l_n;
+   if (ap.shortcuts->disabled)
+     return ECORE_CALLBACK_PASS_ON;
 
    /*
     *  (ev->modifiers && 255) because modifiers contain both locks and modifs,
@@ -393,6 +388,30 @@ _win_unfocused_cb(void *data __UNUSED__,
       _shortcut_handle(shortcut->type_unpress);
 }
 
+static char *
+_combination_string_get(Shortcut *sc)
+{
+   Eina_Strbuf *buf = eina_strbuf_new();
+   char *result = NULL;
+   if (sc->modifiers & MOD_CTRL)
+     eina_strbuf_append_length(buf, "Ctrl + ", strlen("Ctrl + "));
+   if (sc->modifiers & MOD_ALT)
+     eina_strbuf_append_length(buf, "Alt + ", strlen("Alt + "));
+   if (sc->modifiers & MOD_SHIFT)
+     eina_strbuf_append_length(buf, "Shift + ", strlen("Shift + "));
+   if (sc->modifiers & MOD_SUPER)
+     eina_strbuf_append_length(buf, "Super + ", strlen("Super + "));
+   if (sc->modifiers & MOD_META)
+     eina_strbuf_append_length(buf, "Meta + ", strlen("Meta + "));
+   if (sc->modifiers & MOD_HYPER)
+     eina_strbuf_append_length(buf, "Hyper + ", strlen("Hyper + "));
+   if (sc->modifiers & MOD_CAPS)
+     eina_strbuf_append_length(buf, "Caps Lock + ", strlen("Caps Lock + "));
+   eina_strbuf_append_length(buf, sc->keyname, strlen(sc->keyname));
+   result = eina_strbuf_string_steal(buf);
+   eina_strbuf_free(buf);
+   return result;
+}
 static void
 _add_shortcut(Shortcut_Type type_press,
               Shortcut_Type type_unpress,
@@ -409,7 +428,7 @@ _add_shortcut(Shortcut_Type type_press,
    sc->keycode = keycode;
    sc->keyname = keyname;
    sc->modifiers = modifiers;
-
+   sc->combination = _combination_string_get(sc);
    ap.shortcuts->shortcuts = eina_list_sorted_insert(ap.shortcuts->shortcuts,
                                                        
(Eina_Compare_Cb)_shortcut_cmp, sc);
 }
@@ -550,8 +569,13 @@ shortcuts_init(void)
                                                                       NULL);
    evas_object_smart_callback_add(ap.win, signals.elm.win.unfocused, 
_win_unfocused_cb, NULL);
 
-   _default_shortcuts_add();
+   ap.shortcuts->shortcuts = ((Profile *)profile_get())->shortcuts;
 
+   if (!ap.shortcuts->shortcuts)
+     {
+        _default_shortcuts_add();
+        ((Profile *)profile_get())->shortcuts = ap.shortcuts->shortcuts;
+     }
    return true;
 }
 
@@ -597,3 +621,283 @@ shortcuts_shortcut_send(Shortcut_Type type)
 {
    _shortcut_handle(type);
 }
+
+
+
+Eina_Bool
+shortcuts_shortcut_new_set(Shortcut_Type type, Evas_Event_Key_Up *ev)
+{
+   Shortcut sc, *shortcut;
+   int ctrl, alt, shift, win, meta;
+
+   ctrl = evas_key_modifier_is_set(ev->modifiers, "Control");
+   alt = evas_key_modifier_is_set(ev->modifiers, "Alt");
+   shift = evas_key_modifier_is_set(ev->modifiers, "Shift");
+   win = evas_key_modifier_is_set(ev->modifiers, "Super");
+   meta = evas_key_modifier_is_set(ev->modifiers, "Meta") ||
+          evas_key_modifier_is_set(ev->modifiers, "AltGr") ||
+          evas_key_modifier_is_set(ev->modifiers, "ISO_Level3_Shift");
+
+   sc.modifiers = 0;
+   if (ctrl) {sc.modifiers |= MOD_CTRL; }
+   if (alt)  {sc.modifiers |= MOD_ALT;  }
+   if (shift){sc.modifiers |= MOD_SHIFT;}
+   if (win)  {sc.modifiers |= MOD_SUPER;}
+   if (meta) {sc.modifiers |= MOD_META; }
+
+   sc.keycode = _keycode_convert(ev->keycode);
+   sc.keyname = (char *)ev->keyname;
+   sc.type_press = type;
+   sc.type_unpress = SHORTCUT_TYPE_NONE;
+
+   Eina_List *l=NULL, *ln = NULL;
+   /* check if shortcut combination already uses */
+   shortcut = eina_list_search_sorted(ap.shortcuts->shortcuts, 
(Eina_Compare_Cb)_shortcut_cmp, &sc);
+   if (shortcut) return false;
+
+   EINA_LIST_FOREACH_SAFE(ap.shortcuts->shortcuts, l, ln, shortcut)
+     {
+        if (sc.type_press == shortcut->type_press)
+          {
+             ap.shortcuts->shortcuts = 
eina_list_remove_list(ap.shortcuts->shortcuts, l);
+             break;
+          }
+        shortcut = NULL;
+     }
+
+   if (shortcut)
+     {
+        shortcut->modifiers = sc.modifiers;
+        shortcut->keycode = sc.keycode;
+        shortcut->keyname = sc.keyname;
+        shortcut->combination = _combination_string_get(shortcut);
+        ap.shortcuts->shortcuts = 
eina_list_sorted_insert(ap.shortcuts->shortcuts,
+                                                          (Eina_Compare_Cb) 
_shortcut_cmp, shortcut);
+     }
+   else return false;
+
+   return true;
+}
+
+const char *
+shortcuts_shortcut_combination_get(Shortcut_Type type)
+{
+   Eina_List *l, *l_n = NULL;
+   Shortcut *shortcut = NULL;
+   EINA_LIST_FOREACH_SAFE(ap.shortcuts->shortcuts, l, l_n, shortcut)
+     {
+        if (shortcut->type_press ==  type)
+          {
+             break;
+          }
+     }
+   if (shortcut == NULL) return NULL;
+
+   return shortcut->combination;
+}
+
+void
+shortcuts_disabled_set(Eina_Bool disabled)
+{
+   ap.shortcuts->disabled = disabled;
+}
+
+void
+shortcuts_shortcut_reset()
+{
+   assert(ap.shortcuts != NULL);
+   Eina_List *l = NULL, *ln = NULL;
+   Shortcut *shortcut = NULL;
+   Eina_List *default_shortcuts = NULL;
+
+   EINA_LIST_FOREACH_SAFE(ap.shortcuts->shortcuts, l, ln, shortcut)
+     {
+        ap.shortcuts->shortcuts = 
eina_list_remove_list(ap.shortcuts->shortcuts, l);
+        switch (shortcut->type_press)
+          {
+           case SHORTCUT_TYPE_QUIT:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keycode = 24;
+              shortcut->keyname =  "q";
+              break;
+           case SHORTCUT_TYPE_UNDO:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keycode = 52;
+              shortcut->keyname =  "z";
+              break;
+           case SHORTCUT_TYPE_REDO:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "y";
+              break;
+           case SHORTCUT_TYPE_SAVE:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "s";
+              break;
+           case SHORTCUT_TYPE_ADD_GROUP:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "n";
+              break;
+           case SHORTCUT_TYPE_ADD_PART:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "q";
+              break;
+           case SHORTCUT_TYPE_ADD_STATE:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "w";
+              break;
+           case SHORTCUT_TYPE_ADD_ITEM:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "e";
+              break;
+           case SHORTCUT_TYPE_ADD_PROGRAM:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "r";
+              break;
+           case SHORTCUT_TYPE_ADD_DATA_ITEM:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "t";
+              break;
+           case SHORTCUT_TYPE_DEL:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "Delete";
+              break;
+           case SHORTCUT_TYPE_STATE_NEXT:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "s";
+              break;
+           case SHORTCUT_TYPE_PART_NEXT:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "x";
+              break;
+           case SHORTCUT_TYPE_PART_PREV:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "z";
+              break;
+           case SHORTCUT_TYPE_PART_SHOWHIDE:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "h";
+              break;
+           case SHORTCUT_TYPE_ALL_PARTS_SHOWHIDE:
+              shortcut->modifiers =  MOD_SHIFT;
+              shortcut->keyname =  "h";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM1:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "1";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM2:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "2";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM3:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "3";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM4:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "4";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM5:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "5";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM6:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "6";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM7:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "7";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM8:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "8";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM9:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "9";
+              break;
+           case SHORTCUT_TYPE_TAB_NUM10:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "0";
+              break;
+           case SHORTCUT_TYPE_TAB_NEXT:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "Tab";
+              break;
+           case SHORTCUT_TYPE_TAB_PREV:
+              shortcut->modifiers =  MOD_CTRL | MOD_SHIFT;
+              shortcut->keyname =  "Tab";
+              break;
+           case SHORTCUT_TYPE_TAB_CLOSE:
+              shortcut->modifiers =  MOD_CTRL;
+              shortcut->keyname =  "w";
+              break;
+           case SHORTCUT_TYPE_HELP:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F1";
+              break;
+           case SHORTCUT_TYPE_MODE_NORMAL:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F2";
+              break;
+           case SHORTCUT_TYPE_MODE_CODE:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F3";
+              break;
+           case SHORTCUT_TYPE_MODE_DEMO:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F4";
+              break;
+           case SHORTCUT_TYPE_TAB_IMAGE_MANAGER:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F7";
+              break;
+           case SHORTCUT_TYPE_TAB_SOUND_MANAGER:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F8";
+              break;
+           case SHORTCUT_TYPE_TAB_STYLE_MANAGER:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F9";
+              break;
+           case SHORTCUT_TYPE_TAB_COLOR_CLASS_MANAGER:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "F10";
+              break;
+           case SHORTCUT_TYPE_ZOOM_IN:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "KP_Add";
+              break;
+           case SHORTCUT_TYPE_ZOOM_OUT:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "KP_Subtract";
+              break;
+           case SHORTCUT_TYPE_ZOOM_RESET:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "KP_Divide";
+              break;
+           case SHORTCUT_TYPE_OBJECT_AREA:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "o";
+              break;
+           case SHORTCUT_TYPE_CANCEL:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "Escape";
+              break;
+           case SHORTCUT_TYPE_DONE:
+              shortcut->modifiers =  MOD_NONE;
+              shortcut->keyname =  "Return";
+              break;
+           default:
+              continue;
+          }
+
+        shortcut->combination = _combination_string_get(shortcut);
+        default_shortcuts = eina_list_sorted_insert(default_shortcuts,
+                                                    
(Eina_Compare_Cb)_shortcut_cmp, shortcut);
+     }
+   ap.shortcuts->shortcuts = default_shortcuts;
+   ((Profile *)profile_get())->shortcuts = ap.shortcuts->shortcuts;
+   return;
+}
diff --git a/src/bin/ui/shortcuts/shortcuts.h b/src/bin/ui/shortcuts/shortcuts.h
index 59810f9..7b2a29f 100644
--- a/src/bin/ui/shortcuts/shortcuts.h
+++ b/src/bin/ui/shortcuts/shortcuts.h
@@ -46,10 +46,13 @@
 #include "eflete.h"
 
 #define MOD_NONE 0
-#define MOD_SHIFT 1
-#define MOD_CTRL 2
-#define MOD_ALT 4
-#define MOD_SUPER  8
+#define MOD_SHIFT   (1 << 0)
+#define MOD_CTRL    (1 << 1)
+#define MOD_ALT     (1 << 2)
+#define MOD_META    (1 << 3)
+#define MOD_HYPER   (1 << 4)
+#define MOD_SUPER   (1 << 5)
+#define MOD_CAPS    (1 << 6)
 
 typedef enum {
    SHORTCUT_TYPE_NONE,
@@ -104,6 +107,17 @@ typedef enum {
    SHORTCUT_TYPE_LAST,
 } Shortcut_Type;
 
+struct _Shortcut
+{
+   unsigned int          keycode;
+   unsigned int          modifiers;
+   Shortcut_Type         type_press;
+   Shortcut_Type         type_unpress;
+   char                  *keyname;
+   char                  *combination;
+};
+typedef struct _Shortcut Shortcut;
+
 /**
  * Setting shortcuts from user's profile.
  *
@@ -178,4 +192,46 @@ shortcuts_object_check_pop(Evas_Object *obj);
 void
 shortcuts_shortcut_send(Shortcut_Type type);
 
+/**
+ * Change combination for choosen Shortcut type.
+ *
+ * @param type Type of shortcut that should be cahnged.
+ * @param ev Ecore_Event_Key_Up structure, that describe combination.
+ *
+ * @return true in case of success change shortcut for action type. Or false
+ * in case if combination already attached to another action.
+ */
+Eina_Bool
+shortcuts_shortcut_new_set(Shortcut_Type type, Evas_Event_Key_Up *ev);
+
+/**
+ * Reset shortcut combination to default for choosen type action.
+ *
+ * @param type Type of shortcut that should be cahnged.
+ *
+ */
+void
+shortcuts_shortcut_reset();
+
+/**
+ * Get text interpretation of shortcut combination.
+ *
+ * For example: for combination of Ctrl and 'h' keys will be
+ * returned string "Ctrl + h"
+ *
+ * @param type Type of shortcut that should be cahnged.
+ *
+ * @return String that contain shortcut combination.
+ */
+const char *
+shortcuts_shortcut_combination_get(Shortcut_Type type);
+
+/**
+ * Disable recation on input shortcuts.
+ *
+ * @param disabled If true - shortcuts module will avoid any reaction.
+ *
+ */
+void
+shortcuts_disabled_set(Eina_Bool disabled);
 #endif /* SHORTCUTS_H */

-- 


Reply via email to