devilhorns pushed a commit to branch master.

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

commit f9149c1699515c060d004225c6a2c5653cebe322
Author: Chris Michael <[email protected]>
Date:   Mon May 9 11:35:48 2016 -0400

    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 <[email protected]>
---
 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

-- 


Reply via email to