forked from enlightenment/efl
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:
parent
a96266c422
commit
f9149c1699
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue