sys - add support for logind/systemd lock/unlock dbus api's
@feat
This commit is contained in:
parent
60d94f771c
commit
f374da2ef0
|
@ -318,6 +318,7 @@ _desklock_show_internal(Eina_Bool suspend)
|
||||||
|
|
||||||
if (getenv("E_START_MANAGER")) kill(getppid(), SIGUSR2);
|
if (getenv("E_START_MANAGER")) kill(getppid(), SIGUSR2);
|
||||||
_e_desklock_state = EINA_TRUE;
|
_e_desklock_state = EINA_TRUE;
|
||||||
|
e_sys_locked_set(_e_desklock_state);
|
||||||
e_bindings_disabled_set(1);
|
e_bindings_disabled_set(1);
|
||||||
e_screensaver_update();
|
e_screensaver_update();
|
||||||
e_dpms_force_update();
|
e_dpms_force_update();
|
||||||
|
@ -386,6 +387,7 @@ _desklock_hide_internal(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
_e_desklock_state = EINA_FALSE;
|
_e_desklock_state = EINA_FALSE;
|
||||||
|
e_sys_locked_set(_e_desklock_state);
|
||||||
e_bindings_disabled_set(0);
|
e_bindings_disabled_set(0);
|
||||||
ev = E_NEW(E_Event_Desklock, 1);
|
ev = E_NEW(E_Event_Desklock, 1);
|
||||||
ev->on = 0;
|
ev->on = 0;
|
||||||
|
|
103
src/bin/e_sys.c
103
src/bin/e_sys.c
|
@ -48,6 +48,7 @@ static const int E_LOGOUT_WAIT_TIME = 3.0;
|
||||||
static Ecore_Timer *action_timeout = NULL;
|
static Ecore_Timer *action_timeout = NULL;
|
||||||
|
|
||||||
static Eldbus_Proxy *login1_manger_proxy = NULL;
|
static Eldbus_Proxy *login1_manger_proxy = NULL;
|
||||||
|
static Eldbus_Proxy *login1_session_proxy = NULL;
|
||||||
|
|
||||||
static int _e_sys_comp_waiting = 0;
|
static int _e_sys_comp_waiting = 0;
|
||||||
|
|
||||||
|
@ -380,12 +381,75 @@ _e_sys_systemd_signal_prepare_sleep(void *data EINA_UNUSED, const Eldbus_Message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_sys_systemd_signal_session_lock(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("SSS: systemd said to lock\n");
|
||||||
|
if (!e_desklock_state_get())
|
||||||
|
{
|
||||||
|
e_desklock_show(EINA_FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_sys_systemd_signal_session_unlock(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("SSS: systemd said to unlock\n");
|
||||||
|
if (e_desklock_state_get())
|
||||||
|
{
|
||||||
|
e_desklock_hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Eina_Bool _e_sys_session_locked = EINA_FALSE;
|
||||||
|
|
||||||
|
E_API void
|
||||||
|
e_sys_locked_set(Eina_Bool locked)
|
||||||
|
{
|
||||||
|
Eldbus_Message *m;
|
||||||
|
|
||||||
|
if (_e_sys_session_locked == locked) return;
|
||||||
|
_e_sys_session_locked = locked;
|
||||||
|
if (!login1_session_proxy) return;
|
||||||
|
m = eldbus_proxy_method_call_new(login1_session_proxy, "SetLockedHint");
|
||||||
|
eldbus_message_arguments_append(m, "b", _e_sys_session_locked);
|
||||||
|
eldbus_proxy_send(login1_manger_proxy, m, NULL, NULL, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_sys_systemd_getsession_cb(void *data EINA_UNUSED, const Eldbus_Message *m, Eldbus_Pending *p EINA_UNUSED)
|
||||||
|
{
|
||||||
|
const char *path = NULL;
|
||||||
|
Eldbus_Connection *conn;
|
||||||
|
Eldbus_Object *obj;
|
||||||
|
Eldbus_Message *m2;
|
||||||
|
|
||||||
|
if (eldbus_message_error_get(m, NULL, NULL)) return;
|
||||||
|
if (!eldbus_message_arguments_get(m, "o", &path)) return;
|
||||||
|
|
||||||
|
printf("SSS: session path [%s]\n", path);
|
||||||
|
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
|
||||||
|
obj = eldbus_object_get(conn, "org.freedesktop.login1", path);
|
||||||
|
login1_session_proxy = eldbus_proxy_get(obj,
|
||||||
|
"org.freedesktop.login1.Session");
|
||||||
|
eldbus_proxy_signal_handler_add(login1_session_proxy, "Lock",
|
||||||
|
_e_sys_systemd_signal_session_lock,
|
||||||
|
NULL);
|
||||||
|
eldbus_proxy_signal_handler_add(login1_session_proxy, "Unlock",
|
||||||
|
_e_sys_systemd_signal_session_unlock,
|
||||||
|
NULL);
|
||||||
|
m2 = eldbus_proxy_method_call_new(login1_session_proxy, "SetLockedHint");
|
||||||
|
eldbus_message_arguments_append(m2, "b", _e_sys_session_locked);
|
||||||
|
eldbus_proxy_send(login1_manger_proxy, m2, NULL, NULL, -1);
|
||||||
|
}
|
||||||
|
|
||||||
/* externally accessible functions */
|
/* externally accessible functions */
|
||||||
EINTERN int
|
EINTERN int
|
||||||
e_sys_init(void)
|
e_sys_init(void)
|
||||||
{
|
{
|
||||||
Eldbus_Connection *conn;
|
Eldbus_Connection *conn;
|
||||||
Eldbus_Object *obj;
|
Eldbus_Object *obj;
|
||||||
|
Eldbus_Message *m;
|
||||||
|
|
||||||
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
|
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
|
||||||
obj = eldbus_object_get(conn, "org.freedesktop.login1",
|
obj = eldbus_object_get(conn, "org.freedesktop.login1",
|
||||||
|
@ -402,6 +466,33 @@ e_sys_init(void)
|
||||||
_e_sys_systemd_exists_cb, NULL);
|
_e_sys_systemd_exists_cb, NULL);
|
||||||
_e_sys_systemd_handle_inhibit();
|
_e_sys_systemd_handle_inhibit();
|
||||||
|
|
||||||
|
if (login1_manger_proxy)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
int fd;
|
||||||
|
ssize_t siz;
|
||||||
|
|
||||||
|
fd = open("/proc/self/sessionid", O_RDONLY);
|
||||||
|
if (fd >= 0)
|
||||||
|
{
|
||||||
|
siz = read(fd, buf, 255);
|
||||||
|
close(fd);
|
||||||
|
if ((siz > 0) && (siz < 255))
|
||||||
|
{
|
||||||
|
buf[siz] = 0;
|
||||||
|
m = eldbus_proxy_method_call_new
|
||||||
|
(login1_manger_proxy, "GetSession");
|
||||||
|
if (m)
|
||||||
|
{
|
||||||
|
eldbus_message_arguments_append(m, "s", buf);
|
||||||
|
eldbus_proxy_send(login1_manger_proxy, m,
|
||||||
|
_e_sys_systemd_getsession_cb,
|
||||||
|
NULL, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
E_EVENT_SYS_SUSPEND = ecore_event_type_new();
|
E_EVENT_SYS_SUSPEND = ecore_event_type_new();
|
||||||
E_EVENT_SYS_HIBERNATE = ecore_event_type_new();
|
E_EVENT_SYS_HIBERNATE = ecore_event_type_new();
|
||||||
E_EVENT_SYS_RESUME = ecore_event_type_new();
|
E_EVENT_SYS_RESUME = ecore_event_type_new();
|
||||||
|
@ -429,6 +520,18 @@ e_sys_shutdown(void)
|
||||||
_e_sys_resume_delay_timer = NULL;
|
_e_sys_resume_delay_timer = NULL;
|
||||||
_e_sys_screensaver_unignore_timer = NULL;
|
_e_sys_screensaver_unignore_timer = NULL;
|
||||||
_e_sys_acpi_handler = NULL;
|
_e_sys_acpi_handler = NULL;
|
||||||
|
if (login1_session_proxy)
|
||||||
|
{
|
||||||
|
Eldbus_Connection *conn;
|
||||||
|
Eldbus_Object *obj;
|
||||||
|
|
||||||
|
obj = eldbus_proxy_object_get(login1_session_proxy);
|
||||||
|
conn = eldbus_object_connection_get(obj);
|
||||||
|
eldbus_proxy_unref(login1_session_proxy);
|
||||||
|
eldbus_object_unref(obj);
|
||||||
|
eldbus_connection_unref(conn);
|
||||||
|
login1_session_proxy = NULL;
|
||||||
|
}
|
||||||
if (login1_manger_proxy)
|
if (login1_manger_proxy)
|
||||||
{
|
{
|
||||||
Eldbus_Connection *conn;
|
Eldbus_Connection *conn;
|
||||||
|
|
|
@ -48,6 +48,7 @@ E_API E_Sys_Con_Action *e_sys_con_extra_action_register(const char *label,
|
||||||
E_API void e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca);
|
E_API void e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca);
|
||||||
E_API const Eina_List *e_sys_con_extra_action_list_get(void);
|
E_API const Eina_List *e_sys_con_extra_action_list_get(void);
|
||||||
E_API Eina_Bool e_sys_on_the_way_out_get(void);
|
E_API Eina_Bool e_sys_on_the_way_out_get(void);
|
||||||
|
E_API void e_sys_locked_set(Eina_Bool locked);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue