elput: Add code to handle keybindings for vt switching
authorChris Michael <cpmichael@osg.samsung.com>
Mon, 9 May 2016 16:00:35 +0000 (12:00 -0400)
committerChris Michael <cpmichael@osg.samsung.com>
Mon, 9 May 2016 16:00:35 +0000 (12:00 -0400)
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 <cpmichael@osg.samsung.com>
src/lib/elput/elput_manager.c
src/lib/elput/elput_private.h

index e267951..13db809 100644 (file)
@@ -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);
 }
index 769d23c..d3297fa 100644 (file)
@@ -222,6 +222,7 @@ struct _Elput_Manager
    char *sid;
    const char *seat;
    unsigned int vt_num;
+   Ecore_Event_Handler *vt_hdlr;
 
    struct
      {