summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/iot/display/device-interface.c49
-rw-r--r--plugins/mobile/display/device-interface.c49
-rw-r--r--plugins/tv/display/device-interface.c49
-rw-r--r--plugins/wearable/display/device-interface.c49
-rw-r--r--src/display/display-dpms.c52
5 files changed, 146 insertions, 102 deletions
diff --git a/plugins/iot/display/device-interface.c b/plugins/iot/display/device-interface.c
index 37a86cb0..abea4c36 100644
--- a/plugins/iot/display/device-interface.c
+++ b/plugins/iot/display/device-interface.c
@@ -262,31 +262,30 @@ static int get_lcd_power(void)
int ret;
if (!display_dev || !display_dev->get_state) {
- _E("There is no display device.");
- return -ENOENT;
- }
-
- ret = display_dev->get_state(&val);
- if (ret < 0)
- return ret;
-
- if (val == DISPLAY_ON && ambient_get_state())
- return DPMS_OFF;
-
- if (dpms_running_state != DPMS_SETTING_DONE)
- return dpms_running_state;
-
- switch (val) {
- case DISPLAY_ON:
- return DPMS_ON;
- case DISPLAY_STANDBY:
- return DPMS_STANDBY;
- case DISPLAY_SUSPEND:
- return DPMS_SUSPEND;
- case DISPLAY_OFF:
- return DPMS_OFF;
- default:
- return -EINVAL;
+ return dpms_get_state();
+ } else {
+ ret = display_dev->get_state(&val);
+ if (ret < 0)
+ return ret;
+
+ if (val == DISPLAY_ON && ambient_get_state())
+ return DPMS_OFF;
+
+ if (dpms_running_state != DPMS_SETTING_DONE)
+ return dpms_running_state;
+
+ switch (val) {
+ case DISPLAY_ON:
+ return DPMS_ON;
+ case DISPLAY_STANDBY:
+ return DPMS_STANDBY;
+ case DISPLAY_SUSPEND:
+ return DPMS_SUSPEND;
+ case DISPLAY_OFF:
+ return DPMS_OFF;
+ default:
+ return -EINVAL;
+ }
}
}
diff --git a/plugins/mobile/display/device-interface.c b/plugins/mobile/display/device-interface.c
index 37a86cb0..abea4c36 100644
--- a/plugins/mobile/display/device-interface.c
+++ b/plugins/mobile/display/device-interface.c
@@ -262,31 +262,30 @@ static int get_lcd_power(void)
int ret;
if (!display_dev || !display_dev->get_state) {
- _E("There is no display device.");
- return -ENOENT;
- }
-
- ret = display_dev->get_state(&val);
- if (ret < 0)
- return ret;
-
- if (val == DISPLAY_ON && ambient_get_state())
- return DPMS_OFF;
-
- if (dpms_running_state != DPMS_SETTING_DONE)
- return dpms_running_state;
-
- switch (val) {
- case DISPLAY_ON:
- return DPMS_ON;
- case DISPLAY_STANDBY:
- return DPMS_STANDBY;
- case DISPLAY_SUSPEND:
- return DPMS_SUSPEND;
- case DISPLAY_OFF:
- return DPMS_OFF;
- default:
- return -EINVAL;
+ return dpms_get_state();
+ } else {
+ ret = display_dev->get_state(&val);
+ if (ret < 0)
+ return ret;
+
+ if (val == DISPLAY_ON && ambient_get_state())
+ return DPMS_OFF;
+
+ if (dpms_running_state != DPMS_SETTING_DONE)
+ return dpms_running_state;
+
+ switch (val) {
+ case DISPLAY_ON:
+ return DPMS_ON;
+ case DISPLAY_STANDBY:
+ return DPMS_STANDBY;
+ case DISPLAY_SUSPEND:
+ return DPMS_SUSPEND;
+ case DISPLAY_OFF:
+ return DPMS_OFF;
+ default:
+ return -EINVAL;
+ }
}
}
diff --git a/plugins/tv/display/device-interface.c b/plugins/tv/display/device-interface.c
index 37a86cb0..abea4c36 100644
--- a/plugins/tv/display/device-interface.c
+++ b/plugins/tv/display/device-interface.c
@@ -262,31 +262,30 @@ static int get_lcd_power(void)
int ret;
if (!display_dev || !display_dev->get_state) {
- _E("There is no display device.");
- return -ENOENT;
- }
-
- ret = display_dev->get_state(&val);
- if (ret < 0)
- return ret;
-
- if (val == DISPLAY_ON && ambient_get_state())
- return DPMS_OFF;
-
- if (dpms_running_state != DPMS_SETTING_DONE)
- return dpms_running_state;
-
- switch (val) {
- case DISPLAY_ON:
- return DPMS_ON;
- case DISPLAY_STANDBY:
- return DPMS_STANDBY;
- case DISPLAY_SUSPEND:
- return DPMS_SUSPEND;
- case DISPLAY_OFF:
- return DPMS_OFF;
- default:
- return -EINVAL;
+ return dpms_get_state();
+ } else {
+ ret = display_dev->get_state(&val);
+ if (ret < 0)
+ return ret;
+
+ if (val == DISPLAY_ON && ambient_get_state())
+ return DPMS_OFF;
+
+ if (dpms_running_state != DPMS_SETTING_DONE)
+ return dpms_running_state;
+
+ switch (val) {
+ case DISPLAY_ON:
+ return DPMS_ON;
+ case DISPLAY_STANDBY:
+ return DPMS_STANDBY;
+ case DISPLAY_SUSPEND:
+ return DPMS_SUSPEND;
+ case DISPLAY_OFF:
+ return DPMS_OFF;
+ default:
+ return -EINVAL;
+ }
}
}
diff --git a/plugins/wearable/display/device-interface.c b/plugins/wearable/display/device-interface.c
index 06e101da..70de2fe7 100644
--- a/plugins/wearable/display/device-interface.c
+++ b/plugins/wearable/display/device-interface.c
@@ -263,31 +263,30 @@ static int get_lcd_power(void)
int ret;
if (!display_dev || !display_dev->get_state) {
- _E("There is no display device.");
- return -ENOENT;
- }
-
- ret = display_dev->get_state(&val);
- if (ret < 0)
- return ret;
-
- if (val == DISPLAY_ON && ambient_get_state())
- return DPMS_OFF;
-
- if (dpms_running_state != DPMS_SETTING_DONE)
- return dpms_running_state;
-
- switch (val) {
- case DISPLAY_ON:
- return DPMS_ON;
- case DISPLAY_STANDBY:
- return DPMS_STANDBY;
- case DISPLAY_SUSPEND:
- return DPMS_SUSPEND;
- case DISPLAY_OFF:
- return DPMS_OFF;
- default:
- return -EINVAL;
+ return dpms_get_state();
+ } else {
+ ret = display_dev->get_state(&val);
+ if (ret < 0)
+ return ret;
+
+ if (val == DISPLAY_ON && ambient_get_state())
+ return DPMS_OFF;
+
+ if (dpms_running_state != DPMS_SETTING_DONE)
+ return dpms_running_state;
+
+ switch (val) {
+ case DISPLAY_ON:
+ return DPMS_ON;
+ case DISPLAY_STANDBY:
+ return DPMS_STANDBY;
+ case DISPLAY_SUSPEND:
+ return DPMS_SUSPEND;
+ case DISPLAY_OFF:
+ return DPMS_OFF;
+ default:
+ return -EINVAL;
+ }
}
}
diff --git a/src/display/display-dpms.c b/src/display/display-dpms.c
index 1705b630..f1b4d26d 100644
--- a/src/display/display-dpms.c
+++ b/src/display/display-dpms.c
@@ -27,6 +27,8 @@
#include "core/log.h"
#include "display/util.h"
+#define DPMS_GET_TIMEOUT 10 /* milisecond */
+
typedef struct {
GSource gsource;
GPollFD gfd;
@@ -46,6 +48,10 @@ bool wm_is_ready;
static bool dpms_connected;
static GSource *wl_glib_data = NULL;
+static GMainLoop *dpms_loop;
+static GMainContext *dpms_context;
+static bool dpms_get_state_done;
+
static void dpms_handle_set_state(void *data, struct tizen_dpms_manager *tz_dpms, uint32_t mode, uint32_t error)
{
_D("Dpms_state_cb set - mode:%u, error:%u", mode, error);
@@ -56,6 +62,18 @@ static void dpms_handle_get_state(void *data, struct tizen_dpms_manager *tz_dpms
{
_D("Dpms_state_cb get - mode:%u, error:%u", mode, error);
info->dpms_mode = mode;
+
+ dpms_get_state_done = true;
+ if (g_main_loop_is_running(dpms_loop))
+ g_main_loop_quit(dpms_loop);
+}
+
+static gboolean dpms_loop_quit(void *data)
+{
+ if (g_main_loop_is_running(dpms_loop))
+ g_main_loop_quit(dpms_loop);
+
+ return G_SOURCE_REMOVE;
}
void disconnect_interface_with_dpms(void)
@@ -90,6 +108,8 @@ void disconnect_interface_with_dpms(void)
wl_glib_data = NULL;
}
+ g_main_loop_unref(dpms_loop);
+ g_main_context_unref(dpms_context);
dpms_connected = false;
}
@@ -339,11 +359,14 @@ GSource* wl_glib_client_init(void)
goto err;
}
+ dpms_context = g_main_context_new();
+ dpms_loop = g_main_loop_new(dpms_context, false);
+
info->gfd.events = G_IO_IN | G_IO_ERR;
info->gfd.revents = 0;
g_source_add_poll(&info->gsource, &info->gfd);
- g_source_attach(&info->gsource, NULL);
+ g_source_attach(&info->gsource, dpms_context);
g_source_unref(&info->gsource);
return &info->gsource;
@@ -414,13 +437,38 @@ void dpms_set_state(int on)
int dpms_get_state(void)
{
+ GSource* timeout;
+
if (!dpms_is_available()) {
_E("Dpms is not available.");
return -EINVAL;
}
+ // clear pending events
+ while (g_main_context_pending(dpms_context))
+ g_main_context_iteration(dpms_context, true);
+
+ dpms_get_state_done = false;
+
+ // request for a dpms state to dpms server
tizen_dpms_manager_get_dpms(info->tz_dpms_mng, info->wl_output);
wl_display_flush(info->wl_disp);
- return (int)info->dpms_mode;
+ // Set a response timeout
+ timeout = g_timeout_source_new(DPMS_GET_TIMEOUT);
+ g_source_set_callback(timeout, dpms_loop_quit, NULL, NULL);
+ g_source_attach(timeout, dpms_context);
+
+ // Start dpms_loop, waiting for a event
+ // dpms_loop stops running when
+ // 1. dpms_handle_get_state is invoked (by dpms server as a dpms response)
+ // 2. dpms_loop_quit is invoked (by timeout event)
+ g_main_loop_run(dpms_loop);
+ g_source_destroy(timeout);
+ g_source_unref(timeout);
+
+ if (dpms_get_state_done)
+ return (int)info->dpms_mode;
+ else
+ return -ETIMEDOUT;
}