From d734cd4cada136add5d66e126c659223897fe487 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Mon, 9 May 2016 12:00:35 -0400 Subject: [PATCH] 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 --- 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 { -- 2.7.4