From f9149c1699515c060d004225c6a2c5653cebe322 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Mon, 9 May 2016 11:35:48 -0400 Subject: [PATCH] elput: Add API function to switch to a given vt This patch adds a new API function to Elput that can be used to switch to a given VT. This allows drm2 or enlightenment to switch to a given virtual terminal in response to keybindings. @feature Signed-off-by: Chris Michael --- src/lib/elput/Elput.h | 13 +++++++++++ src/lib/elput/elput_logind.c | 50 +++++++++++++++++++++++++++++++++++++++++++ src/lib/elput/elput_manager.c | 13 +++++++++++ src/lib/elput/elput_private.h | 1 + 4 files changed, 77 insertions(+) diff --git a/src/lib/elput/Elput.h b/src/lib/elput/Elput.h index 95adfce..d38569d 100644 --- a/src/lib/elput/Elput.h +++ b/src/lib/elput/Elput.h @@ -206,6 +206,19 @@ EAPI int elput_manager_open(Elput_Manager *manager, const char *path, int flags) EAPI void elput_manager_close(Elput_Manager *manager, int fd); /** + * Request to switch to a given vt + * + * @param manager + * @param vt + * + * @return EINA_TRUE on success, EINA_FALSE otherwise + * + * @ingroup Elput_Manager_Group + * @since 1.18 + */ +EAPI Eina_Bool elput_manager_vt_set(Elput_Manager *manager, int vt); + +/** * @defgroup Elput_Input_Group Elput input functions * * Functions that deal with setup of inputs diff --git a/src/lib/elput/elput_logind.c b/src/lib/elput/elput_logind.c index 123861a..394fca5 100644 --- a/src/lib/elput/elput_logind.c +++ b/src/lib/elput/elput_logind.c @@ -574,12 +574,62 @@ _logind_close(Elput_Manager *em, int fd) _logind_device_release(em, major(st.st_rdev), minor(st.st_rdev)); } +static Eina_Bool +_logind_vt_set(Elput_Manager *em, int vt) +{ + Eldbus_Object *obj; + Eldbus_Proxy *proxy; + Eldbus_Message *msg; + char self[PATH_MAX]; + + snprintf(self, sizeof(self), "/org/freedesktop/login1/seat/self"); + + obj = eldbus_object_get(em->dbus.conn, "org.freedesktop.login1", self); + if (!obj) + { + ERR("Could not get dbus object"); + goto obj_err; + } + + proxy = eldbus_proxy_get(obj, "org.freedesktop.login1.Seat"); + if (!proxy) + { + ERR("Could not get dbus proxy"); + goto proxy_err; + } + + msg = eldbus_proxy_method_call_new(proxy, "SwitchTo"); + if (!msg) + { + ERR("Could not create method call for proxy"); + goto msg_err; + } + + eldbus_message_arguments_append(msg, "u", &vt); + + eldbus_proxy_send(proxy, msg, NULL, NULL, -1); + + eldbus_message_unref(msg); + eldbus_proxy_unref(proxy); + eldbus_object_unref(obj); + + return EINA_TRUE; + +msg_err: + eldbus_proxy_unref(proxy); +proxy_err: + eldbus_object_unref(obj); +obj_err: + return EINA_FALSE; +} + Elput_Interface _logind_interface = { _logind_connect, _logind_disconnect, _logind_open, _logind_close, + _logind_vt_set, }; #endif diff --git a/src/lib/elput/elput_manager.c b/src/lib/elput/elput_manager.c index 3dc67d9..e267951 100644 --- a/src/lib/elput/elput_manager.c +++ b/src/lib/elput/elput_manager.c @@ -62,3 +62,16 @@ elput_manager_close(Elput_Manager *manager, int fd) if (manager->interface->close) manager->interface->close(manager, fd); } + +EAPI Eina_Bool +elput_manager_vt_set(Elput_Manager *manager, int vt) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(manager, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(manager->interface, EINA_FALSE); + EINA_SAFETY_ON_TRUE_RETURN_VAL((vt < 0), EINA_FALSE); + + if (manager->interface->vt_set) + return manager->interface->vt_set(manager, vt); + + return EINA_FALSE; +} diff --git a/src/lib/elput/elput_private.h b/src/lib/elput/elput_private.h index 05ee0b1..769d23c 100644 --- a/src/lib/elput/elput_private.h +++ b/src/lib/elput/elput_private.h @@ -72,6 +72,7 @@ typedef struct _Elput_Interface void (*disconnect)(Elput_Manager *manager); int (*open)(Elput_Manager *manager, const char *path, int flags); void (*close)(Elput_Manager *manager, int fd); + Eina_Bool (*vt_set)(Elput_Manager *manager, int vt); } Elput_Interface; typedef struct _Elput_Input -- 2.7.4