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 <cpmichael@osg.samsung.com>
This commit is contained in:
Chris Michael 2016-05-09 11:35:48 -04:00
parent a96266c422
commit f9149c1699
4 changed files with 77 additions and 0 deletions

View File

@ -205,6 +205,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
*

View File

@ -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

View File

@ -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;
}

View File

@ -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