From 3de066469ae76c22e50e9f78b03f1841d81cd7cc Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Mon, 9 May 2016 11:01:30 -0400 Subject: [PATCH] elput: Support sending of session activate/deactivate event This patch adds support for notifying when a session gets activated or deactivated. This will be used in drm2 to notify compositor when to pause/restart rendering during a vt switch @feature Signed-off-by: Chris Michael --- src/lib/elput/Elput.h | 8 ++++++++ src/lib/elput/elput.c | 3 +++ src/lib/elput/elput_logind.c | 37 ++++++++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/lib/elput/Elput.h b/src/lib/elput/Elput.h index f3fe16b..95adfce 100644 --- a/src/lib/elput/Elput.h +++ b/src/lib/elput/Elput.h @@ -91,11 +91,19 @@ typedef struct _Elput_Event_Device_Change Elput_Device_Change_Type type; } Elput_Event_Device_Change; +/* structure to represent session active changes */ +typedef struct _Elput_Event_Session_Active +{ + const char *session; + Eina_Bool active : 1; +} Elput_Event_Session_Active; + EAPI extern int ELPUT_EVENT_SEAT_CAPS; EAPI extern int ELPUT_EVENT_SEAT_FRAME; EAPI extern int ELPUT_EVENT_KEYMAP_SEND; EAPI extern int ELPUT_EVENT_MODIFIERS_SEND; EAPI extern int ELPUT_EVENT_DEVICE_CHANGE; +EAPI extern int ELPUT_EVENT_SESSION_ACTIVE; /** * @file diff --git a/src/lib/elput/elput.c b/src/lib/elput/elput.c index 2e54b3e..95d7a1e 100644 --- a/src/lib/elput/elput.c +++ b/src/lib/elput/elput.c @@ -11,6 +11,7 @@ EAPI int ELPUT_EVENT_SEAT_FRAME = -1; EAPI int ELPUT_EVENT_KEYMAP_SEND = -1; EAPI int ELPUT_EVENT_MODIFIERS_SEND = -1; EAPI int ELPUT_EVENT_DEVICE_CHANGE = -1; +EAPI int ELPUT_EVENT_SESSION_ACTIVE = -1; EAPI int elput_init(void) @@ -34,6 +35,7 @@ elput_init(void) ELPUT_EVENT_KEYMAP_SEND = ecore_event_type_new(); ELPUT_EVENT_MODIFIERS_SEND = ecore_event_type_new(); ELPUT_EVENT_DEVICE_CHANGE = ecore_event_type_new(); + ELPUT_EVENT_SESSION_ACTIVE = ecore_event_type_new(); return _elput_init_count; @@ -60,6 +62,7 @@ elput_shutdown(void) ELPUT_EVENT_KEYMAP_SEND = -1; ELPUT_EVENT_MODIFIERS_SEND = -1; ELPUT_EVENT_DEVICE_CHANGE = -1; + ELPUT_EVENT_SESSION_ACTIVE = -1; eina_log_domain_unregister(_elput_log_dom); _elput_log_dom = -1; diff --git a/src/lib/elput/elput_logind.c b/src/lib/elput/elput_logind.c index 0f32b25..aedcd79 100644 --- a/src/lib/elput/elput_logind.c +++ b/src/lib/elput/elput_logind.c @@ -3,6 +3,31 @@ #ifdef HAVE_SYSTEMD static void +_logind_session_active_cb_free(void *data EINA_UNUSED, void *event) +{ + Elput_Event_Session_Active *ev; + + ev = event; + eina_stringshare_del(ev->session); + free(ev); +} + +static void +_logind_session_active_send(Elput_Manager *em, Eina_Bool active) +{ + Elput_Event_Session_Active *ev; + + ev = calloc(1, sizeof(Elput_Event_Session_Active)); + if (!ev) return; + + ev->session = eina_stringshare_add(em->sid); + ev->active = active; + + ecore_event_add(ELPUT_EVENT_SESSION_ACTIVE, ev, + _logind_session_active_cb_free, NULL); +} + +static void _logind_device_pause_complete(Elput_Manager *em, uint32_t major, uint32_t minor) { Eldbus_Proxy *proxy; @@ -79,9 +104,7 @@ _cb_device_paused(void *data, const Eldbus_Message *msg) _logind_device_pause_complete(em, maj, min); if ((em->sync) && (maj == 226)) // DRM_MAJOR - { - /* TODO: _ecore_drm2_launcher_activate_send(em, EINA_FALSE); */ - } + _logind_session_active_send(em, EINA_FALSE); } } @@ -103,9 +126,7 @@ _cb_device_resumed(void *data, const Eldbus_Message *msg) if (eldbus_message_arguments_get(msg, "u", &maj)) { if ((em->sync) && (maj == 226)) // DRM_MAJOR - { - /* TODO: _ecore_drm2_launcher_activate_send(em, EINA_TRUE); */ - } + _logind_session_active_send(em, EINA_TRUE); } } @@ -125,9 +146,7 @@ _cb_property_changed(void *data, Eldbus_Proxy *proxy EINA_UNUSED, void *event) { eina_value_get(ev->value, &active); if ((!em->sync) || (!active)) - { - /* TODO: _ecore_drm2_launcher_activate_send(em, active); */ - } + _logind_session_active_send(em, active); } } -- 2.7.4