devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=d734cd4cada136add5d66e126c659223897fe487

commit d734cd4cada136add5d66e126c659223897fe487
Author: Chris Michael <[email protected]>
Date:   Mon May 9 12:00:35 2016 -0400

    elput: Add code to handle keybindings for vt switching
    
    This patch makes elput handle receiving the key combinations for vt
    switching and perform the actual switch itself. This is done so that
    ecore_drm2, ecore_fb, etc, etc do not each need their own code to
    handle vt switching.
    
    @feature
    
    Signed-off-by: Chris Michael <[email protected]>
---
 src/lib/elput/elput_manager.c | 45 +++++++++++++++++++++++++++++++++++++++----
 src/lib/elput/elput_private.h |  1 +
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/src/lib/elput/elput_manager.c b/src/lib/elput/elput_manager.c
index e267951..13db809 100644
--- a/src/lib/elput/elput_manager.c
+++ b/src/lib/elput/elput_manager.c
@@ -5,11 +5,35 @@ static Elput_Interface *_ifaces[] =
 #ifdef HAVE_SYSTEMD
    &_logind_interface,
 #endif
-   NULL, // launcher
-   NULL, // direct
    NULL,
 };
 
+static Eina_Bool
+_cb_key_down(void *data, int type EINA_UNUSED, void *event)
+{
+   Elput_Manager *em;
+   Ecore_Event_Key *ev;
+   int code = 0, vt = 0;
+
+   em = data;
+   ev = event;
+   code = (ev->keycode - 8);
+
+   if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
+       (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) &&
+       (code >= KEY_F1) && (code <= KEY_F8))
+     {
+        vt = (code - KEY_F1 + 1);
+        if (em->interface->vt_set)
+          {
+             if (!em->interface->vt_set(em, vt))
+               ERR("Failed to switch to virtual terminal %d", vt);
+          }
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
 EAPI Elput_Manager *
 elput_manager_connect(const char *seat, unsigned int tty, Eina_Bool sync)
 {
@@ -41,6 +65,8 @@ elput_manager_disconnect(Elput_Manager *manager)
 EAPI int
 elput_manager_open(Elput_Manager *manager, const char *path, int flags)
 {
+   int ret = -1;
+
    EINA_SAFETY_ON_NULL_RETURN_VAL(manager, -1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(manager->interface, -1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(path, -1);
@@ -48,9 +74,17 @@ elput_manager_open(Elput_Manager *manager, const char *path, 
int flags)
    if (flags < 0) flags = O_RDWR;
 
    if (manager->interface->open)
-     return manager->interface->open(manager, path, flags);
+     {
+        ret = manager->interface->open(manager, path, flags);
+        if (ret)
+          {
+             manager->vt_hdlr =
+               ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
+                                       _cb_key_down, manager);
+          }
+     }
 
-   return -1;
+   return ret;
 }
 
 EAPI void
@@ -59,6 +93,9 @@ elput_manager_close(Elput_Manager *manager, int fd)
    EINA_SAFETY_ON_NULL_RETURN(manager);
    EINA_SAFETY_ON_NULL_RETURN(manager->interface);
 
+   if (manager->vt_hdlr) ecore_event_handler_del(manager->vt_hdlr);
+   manager->vt_hdlr = NULL;
+
    if (manager->interface->close)
      manager->interface->close(manager, fd);
 }
diff --git a/src/lib/elput/elput_private.h b/src/lib/elput/elput_private.h
index 769d23c..d3297fa 100644
--- a/src/lib/elput/elput_private.h
+++ b/src/lib/elput/elput_private.h
@@ -222,6 +222,7 @@ struct _Elput_Manager
    char *sid;
    const char *seat;
    unsigned int vt_num;
+   Ecore_Event_Handler *vt_hdlr;
 
    struct
      {

-- 


Reply via email to