diff options
-rw-r--r-- | plugins/iot/display/device-interface.c | 49 | ||||
-rw-r--r-- | plugins/mobile/display/device-interface.c | 49 | ||||
-rw-r--r-- | plugins/tv/display/device-interface.c | 49 | ||||
-rw-r--r-- | plugins/wearable/display/device-interface.c | 49 | ||||
-rw-r--r-- | src/display/display-dpms.c | 52 |
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; } |