display: Add getter for lock count and signal on count changed 57/303457/3 accepted/tizen/7.0/unified/20240103.164231 accepted/tizen/7.0/unified/20240104.073230
authorYoungjae Cho <y0.cho@samsung.com>
Thu, 28 Dec 2023 04:11:49 +0000 (13:11 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Fri, 29 Dec 2023 05:06:06 +0000 (14:06 +0900)
The dbus method "PmlockGetLockCount" has been added to get lock count.
And the dbus signal "PowerLockCountChanged" has also been added for
broadcasting on every display lock/unlock. The existing method
"PmlockGetLockState" and signal "PowerLockCountChanged" only say in
'locked' or 'unlocked', however, the "PmLockGetLockCount" and
"PowerLockCountChanged" respond in number.

Change-Id: I63a0eb7a12c76569d4c2de7bfe9089d5f98eac0e
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/display/display-dbus.c
src/display/display-lock.c
src/display/display-lock.h

index 19c30f2eba305ce5c8d4f5d6c07da125ccfacdb9..397fc9c5ac94cd17a45ed8c3b98e02a9f63cbcdd 100644 (file)
@@ -1280,6 +1280,30 @@ static GVariant *dbus_setrotationangle(GDBusConnection *conn,
        return g_variant_new("(i)", ret);
 }
 
+static GVariant *dbus_pmlockgetlockcount(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+{
+       power_lock_e power_lock_type;
+       int pmlock_count = 0;
+       enum state_t pmlock_type;
+       pid_t pid;
+
+       g_variant_get(param, "(i)", &power_lock_type);
+
+       if (power_lock_type < POWER_LOCK_CPU || power_lock_type > POWER_LOCK_DISPLAY_DIM)
+               _W("Invalid parameter power lock type=(%d)", power_lock_type);
+
+       pmlock_type = power_lock_type_to_pmlock(power_lock_type);
+
+       pmlock_count = pmlock_get_lock_count(pmlock_type);
+
+       pid = gdbus_connection_get_sender_pid(conn, sender);
+       _D("Pmlock get lock count pid=%d power lock count=%d", pid, pmlock_count);
+
+       return g_variant_new("(i)", pmlock_count);
+}
+
 static GVariant *dbus_pmlockgetlockstate(GDBusConnection *conn,
        const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
        GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
@@ -1345,6 +1369,7 @@ static const dbus_method_s dbus_methods[] = {
        { "GetWhiteBalance", "i", "i", dbus_getwhitebalance},
        { "GetRotationAngle", "i", "iii", dbus_getrotationangle},
        { "SetRotationAngle", "iii", "i", dbus_setrotationangle},
+       { "PmlockGetLockCount", "i", "i", dbus_pmlockgetlockcount},
        { "PmlockGetLockState", "i", "i", dbus_pmlockgetlockstate},
        /* Add methods here */
 };
index bfdd7e9ffdf501b6934fde8960222a5f420f2b39..21585ae422d24ca0cfe3832fe0d77307490baeab 100644 (file)
@@ -57,6 +57,11 @@ bool check_lock_state(int state)
        return false;
 }
 
+int pmlock_get_lock_count(enum state_t state)
+{
+       return SYS_G_LIST_LENGTH(cond_head[state]);
+}
+
 bool pmlock_get_lock_state(enum state_t state)
 {
        return (bool)SYS_G_LIST_LENGTH(cond_head[state]);
@@ -102,6 +107,14 @@ static void broadcast_pmlock_state_changed(enum state_t state)
        }
 
        num_of_pmlock = g_list_length(cond_head[state]);
+
+       /* broadcast on every change of lock count */
+       gdbus_signal_emit(NULL,
+               DEVICED_PATH_DISPLAY,
+               DEVICED_INTERFACE_DISPLAY,
+               DEVICED_SIGNAL_POWER_LOCK_COUNT_CHANGED,
+               g_variant_new("(ii)", state, num_of_pmlock));
+
        if (num_of_pmlock > 1)
                return;
 
index 98e3376d2461cea67c1e497b869b566496e3081b..d504d7a4d00eb6601bb1197bb22c846c1e56e06a 100644 (file)
@@ -53,6 +53,7 @@ typedef struct _pm_lock_node {
 } PmLockNode;
 
 bool check_lock_state(int state);
+int pmlock_get_lock_count(enum state_t state);
 bool pmlock_get_lock_state(enum state_t state);
 enum state_t power_lock_type_to_pmlock(power_lock_e power_lock_type);
 PmLockNode *find_node(enum state_t s_index, pid_t pid);