This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository enlightenment.

View the commit online.

commit f374da2ef055268a2ff1bae2d48815efb0f5693b
Author: Carsten Haitzler <ras...@rasterman.com>
AuthorDate: Fri Jun 3 11:46:34 2022 +0100

    sys - add support for logind/systemd lock/unlock dbus api's
    
    @feat
---
 src/bin/e_desklock.c |   2 +
 src/bin/e_sys.c      | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/bin/e_sys.h      |   1 +
 3 files changed, 106 insertions(+)

diff --git a/src/bin/e_desklock.c b/src/bin/e_desklock.c
index b78a93988..de5806c60 100644
--- a/src/bin/e_desklock.c
+++ b/src/bin/e_desklock.c
@@ -318,6 +318,7 @@ _desklock_show_internal(Eina_Bool suspend)
 
    if (getenv("E_START_MANAGER")) kill(getppid(), SIGUSR2);
    _e_desklock_state = EINA_TRUE;
+   e_sys_locked_set(_e_desklock_state);
    e_bindings_disabled_set(1);
    e_screensaver_update();
    e_dpms_force_update();
@@ -386,6 +387,7 @@ _desklock_hide_internal(void)
      }
 
    _e_desklock_state = EINA_FALSE;
+   e_sys_locked_set(_e_desklock_state);
    e_bindings_disabled_set(0);
    ev = E_NEW(E_Event_Desklock, 1);
    ev->on = 0;
diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c
index ae7abb4d3..de743ef66 100644
--- a/src/bin/e_sys.c
+++ b/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 Eldbus_Proxy *login1_manger_proxy = NULL;
+static Eldbus_Proxy *login1_session_proxy = NULL;
 
 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 */
 EINTERN int
 e_sys_init(void)
 {
    Eldbus_Connection *conn;
    Eldbus_Object *obj;
+   Eldbus_Message *m;
 
    conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
    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_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_HIBERNATE = 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_screensaver_unignore_timer = 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)
      {
          Eldbus_Connection *conn;
diff --git a/src/bin/e_sys.h b/src/bin/e_sys.h
index a096a371b..9bf71f804 100644
--- a/src/bin/e_sys.h
+++ b/src/bin/e_sys.h
@@ -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 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 void e_sys_locked_set(Eina_Bool locked);
 
 #endif
 #endif

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to