From bd4bc5770b7975fb29099d9fce5321224154b144 Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 9 Jan 2017 11:14:05 +0900 Subject: [PATCH] Clean up wayland resources - The window is destroyed - Shutdown efl-util system (ex. input generator, screenshooter) Change-Id: Ifaf1a9e783dad5bc8355494c38a463867001c552 --- src/efl_util.c | 567 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 367 insertions(+), 200 deletions(-) diff --git a/src/efl_util.c b/src/efl_util.c index 3ae9094..19b7ec5 100644 --- a/src/efl_util.c +++ b/src/efl_util.c @@ -98,7 +98,11 @@ typedef struct _Efl_Util_Data struct { Eina_Bool init; + int ref_count; + struct wl_display *dpy; + struct wl_registry *reg; + struct wl_event_queue *queue; struct @@ -120,6 +124,7 @@ typedef struct _Efl_Util_Data { struct tizen_input_device_manager *devicemgr; int request_notified; + Eina_List *device_list; } devmgr; struct { @@ -139,7 +144,8 @@ static Efl_Util_Data _eflutil = { { EINA_FALSE, - NULL, NULL, + 0, + NULL, NULL, NULL, { NULL, NULL, NULL }, /* tizen_policy protocol */ { NULL, NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */ { NULL, -1 } /* tizen_input_device_manager protocol */ @@ -155,6 +161,8 @@ static Eina_Bool _cb_info_del_by_win(Evas_Object *win, int idx); static Eina_List *_cb_info_list_get(int idx); static Efl_Util_Callback_Info *_cb_info_find_by_win(Evas_Object *win, int idx); static Eina_Bool _wl_init(void); +static void _wl_shutdown(void); + static void _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version); static void _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name); static void _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version); @@ -288,7 +296,7 @@ _cb_info_find_by_win(Evas_Object *win, static Eina_Bool _wl_init(void) { - struct wl_registry *reg = NULL; + _eflutil.wl.ref_count++; if (_eflutil.wl.init) return EINA_TRUE; @@ -300,11 +308,11 @@ _wl_init(void) _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy); EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail); - reg = wl_display_get_registry(_eflutil.wl.dpy); - EINA_SAFETY_ON_NULL_GOTO(reg, fail); + _eflutil.wl.reg = wl_display_get_registry(_eflutil.wl.dpy); + EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.reg, fail); - wl_proxy_set_queue((struct wl_proxy*)reg, _eflutil.wl.queue); - wl_registry_add_listener(reg, &_wl_reg_listener, NULL); + wl_proxy_set_queue((struct wl_proxy*)_eflutil.wl.reg, _eflutil.wl.queue); + wl_registry_add_listener(_eflutil.wl.reg, &_wl_reg_listener, NULL); _eflutil.wl.init = EINA_TRUE; @@ -316,11 +324,96 @@ fail: _eflutil.wl.queue = NULL; } + if (_eflutil.wl.reg) + { + wl_registry_destroy(_eflutil.wl.reg); + _eflutil.wl.reg = NULL; + } + + _eflutil.wl.dpy = NULL; + ecore_wl_shutdown(); return EINA_FALSE; } static void +_wl_shutdown(void) +{ + Eina_List *l, *ll; + struct tizen_input_device *data; + Efl_Util_Wl_Output_Info *output; + + if (!_eflutil.wl.init) return; + + _eflutil.wl.ref_count--; + if (_eflutil.wl.ref_count > 0) + return; + + // tizen_policy + if (_eflutil.wl.policy.proto) + tizen_policy_destroy(_eflutil.wl.policy.proto); + _eflutil.wl.policy.proto = NULL; + + eina_hash_free(_eflutil.wl.policy.hash_noti_lv); + _eflutil.wl.policy.hash_noti_lv = NULL; + eina_hash_free(_eflutil.wl.policy.hash_scr_mode); + _eflutil.wl.policy.hash_scr_mode = NULL; + + // wl_output + if (_eflutil.wl.shot.output_list) + { + EINA_LIST_FREE(_eflutil.wl.shot.output_list, output) + { + wl_output_destroy(output->output); + free(output); + } + } + _eflutil.wl.shot.output_list = NULL; + + // screenshooter + if (_eflutil.wl.shot.screenshooter) + screenshooter_destroy(_eflutil.wl.shot.screenshooter); + _eflutil.wl.shot.screenshooter = NULL; + + // tizen_input_device_manager + EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.device_list, l, ll, data) + { + tizen_input_device_release(data); + _eflutil.wl.devmgr.device_list = eina_list_remove_list(_eflutil.wl.devmgr.device_list, l); + } + if (_eflutil.wl.devmgr.devicemgr) + tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr); + _eflutil.wl.devmgr.devicemgr = NULL; + + // tizen_display_policy + if (_eflutil.wl.display_policy.proto) + tizen_display_policy_destroy(_eflutil.wl.display_policy.proto); + _eflutil.wl.display_policy.proto = NULL; + + eina_hash_free(_eflutil.wl.display_policy.hash_brightness); + _eflutil.wl.display_policy.hash_brightness = NULL; + + if (_eflutil.wl.reg) + { + wl_proxy_set_queue((struct wl_proxy*)_eflutil.wl.reg, NULL); + wl_registry_destroy(_eflutil.wl.reg); + _eflutil.wl.reg = NULL; + } + + if (_eflutil.wl.queue) + { + wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + wl_event_queue_destroy(_eflutil.wl.queue); + _eflutil.wl.queue = NULL; + } + + _eflutil.wl.dpy = NULL; + _eflutil.wl.init = EINA_FALSE; + + ecore_wl_shutdown(); +} + +static void _cb_wl_output_geometry(void *data, struct wl_output *wl_output, int x, int y, int physical_width, int physical_height, int subpixel, const char *make, const char *model, int transform) @@ -451,12 +544,53 @@ _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name) { + Eina_List *l, *ll; + struct tizen_input_device *ddata; + Efl_Util_Wl_Output_Info *output; + + // tizen_policy + if (_eflutil.wl.policy.proto) + tizen_policy_destroy(_eflutil.wl.policy.proto); _eflutil.wl.policy.proto = NULL; + eina_hash_free(_eflutil.wl.policy.hash_noti_lv); + _eflutil.wl.policy.hash_noti_lv = NULL; eina_hash_free(_eflutil.wl.policy.hash_scr_mode); + _eflutil.wl.policy.hash_scr_mode = NULL; + + // wl_output + if (_eflutil.wl.shot.output_list) + { + EINA_LIST_FREE(_eflutil.wl.shot.output_list, output) + { + wl_output_destroy(output->output); + free(output); + } + } + _eflutil.wl.shot.output_list = NULL; + + // screenshooter + if (_eflutil.wl.shot.screenshooter) + screenshooter_destroy(_eflutil.wl.shot.screenshooter); + _eflutil.wl.shot.screenshooter = NULL; + + // tizen_input_device_manager + EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.device_list, l, ll, ddata) + { + tizen_input_device_release(ddata); + _eflutil.wl.devmgr.device_list = eina_list_remove_list(_eflutil.wl.devmgr.device_list, l); + } + if (_eflutil.wl.devmgr.devicemgr) + tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr); + _eflutil.wl.devmgr.devicemgr = NULL; + // tizen_display_policy + if (_eflutil.wl.display_policy.proto) + tizen_display_policy_destroy(_eflutil.wl.display_policy.proto); _eflutil.wl.display_policy.proto = NULL; + eina_hash_free(_eflutil.wl.display_policy.hash_brightness); + _eflutil.wl.display_policy.hash_brightness = NULL; } /* LCOV_EXCL_STOP */ @@ -635,13 +769,45 @@ _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo return; eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info); + + eina_hash_population(_eflutil.wl.policy.hash_noti_lv); + + if (eina_hash_population(_eflutil.wl.policy.hash_noti_lv) == 0) + { + _wl_shutdown(); + } +} + +static Eina_Bool +_init_tizen_policy_proto(void) +{ + int ret = 0; + + if (!_eflutil.wl.policy.proto) + { + ret = _wl_init(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EINA_FALSE); + + ret = 0; + while (!_eflutil.wl.policy.proto && ret != -1) + ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EINA_FALSE); + } + + return EINA_TRUE; } API int efl_util_set_notification_window_level(Evas_Object *window, efl_util_notification_level_e level) { - Eina_Bool res; + Eina_Bool ret; + Elm_Win_Type type; + Ecore_Wl_Window *wlwin; + struct wl_surface *surface; + Efl_Util_Wl_Surface_Lv_Info *lv_info; + Ecore_Wl_Window_Type wl_type; EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER); EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) && @@ -664,15 +830,6 @@ efl_util_set_notification_window_level(Evas_Object *window, "DEPRECATION WARNING: EFL_UTIL_NOTIFICATION_LEVEL_3 is deprecated and will be removed from next release. Use EFL_UTIL_NOTIFICATION_LEVEL_TOP instead."); } - Elm_Win_Type type; - Ecore_Wl_Window *wlwin; - struct wl_surface *surface; - Efl_Util_Wl_Surface_Lv_Info *lv_info; - Ecore_Wl_Window_Type wl_type; - - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); - wlwin = elm_win_wl_window_get(window); EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); @@ -684,8 +841,8 @@ efl_util_set_notification_window_level(Evas_Object *window, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); } - while (!_eflutil.wl.policy.proto) - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + ret = _init_tizen_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); surface = ecore_wl_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, @@ -749,19 +906,15 @@ API int efl_util_get_notification_window_level(Evas_Object *window, efl_util_notification_level_e *level) { - Eina_Bool res; - - EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER); - EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER); - + Eina_Bool ret; Elm_Win_Type type; Ecore_Wl_Window *wlwin; struct wl_surface *surface; Efl_Util_Wl_Surface_Lv_Info *lv_info; Ecore_Wl_Window_Type wl_type; - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER); wlwin = elm_win_wl_window_get(window); EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); @@ -774,13 +927,13 @@ efl_util_get_notification_window_level(Evas_Object *window, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); } - while (!_eflutil.wl.policy.proto) - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - surface = ecore_wl_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); + ret = _init_tizen_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); + lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface); if (lv_info) { @@ -864,28 +1017,14 @@ API int efl_util_set_window_opaque_state(Evas_Object *window, int opaque) { - Eina_Bool res; + Eina_Bool ret; + Ecore_Wl_Window *wlwin; + struct wl_surface *surface; EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER); EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)), EFL_UTIL_ERROR_INVALID_PARAMETER); - Ecore_Wl_Window *wlwin; - struct wl_surface *surface; - - if (!_eflutil.wl.policy.proto) - { - int ret = 0; - - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); - - while (!_eflutil.wl.policy.proto && ret != -1) - ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - - EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER); - } - wlwin = elm_win_wl_window_get(window); if (!wlwin) return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE; @@ -894,6 +1033,9 @@ efl_util_set_window_opaque_state(Evas_Object *window, if (!surface) return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE; + ret = _init_tizen_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); + tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque); return EFL_UTIL_ERROR_NONE; @@ -911,72 +1053,65 @@ efl_util_set_window_screen_mode(Evas_Object *window, Ecore_Wl_Window *wlwin; struct wl_surface *surface; Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info; - Eina_Bool res; - - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + Eina_Bool ret; wlwin = elm_win_wl_window_get(window); - if (wlwin) - { - while (!_eflutil.wl.policy.proto) - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER); - surface = ecore_wl_window_surface_get(wlwin); - EINA_SAFETY_ON_NULL_RETURN_VAL(surface, - EFL_UTIL_ERROR_INVALID_PARAMETER); + surface = ecore_wl_window_surface_get(wlwin); + EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); - scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface); - if (!scr_mode_info) - { - scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info)); - EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY); + ret = _init_tizen_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); - scr_mode_info->surface = surface; - scr_mode_info->mode = (unsigned int)mode; - scr_mode_info->wait_for_done = EINA_TRUE; - scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE; + scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface); + if (!scr_mode_info) + { + scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info)); + EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY); - eina_hash_add(_eflutil.wl.policy.hash_scr_mode, - &surface, - scr_mode_info); - } - else + scr_mode_info->surface = surface; + scr_mode_info->mode = (unsigned int)mode; + scr_mode_info->wait_for_done = EINA_TRUE; + scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE; + + eina_hash_add(_eflutil.wl.policy.hash_scr_mode, + &surface, + scr_mode_info); + } + else + { + scr_mode_info->mode = (unsigned int)mode; + scr_mode_info->wait_for_done = EINA_TRUE; + scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE; + } + + tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto, + surface, (unsigned int)mode); + if (scr_mode_info->wait_for_done) + { + int count = 0; + while (scr_mode_info->wait_for_done && (count < 3)) { - scr_mode_info->mode = (unsigned int)mode; - scr_mode_info->wait_for_done = EINA_TRUE; - scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE; + ecore_wl_flush(); + wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + count++; } - tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto, - surface, (unsigned int)mode); if (scr_mode_info->wait_for_done) { - int count = 0; - while (scr_mode_info->wait_for_done && (count < 3)) - { - ecore_wl_flush(); - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - count++; - } - - if (scr_mode_info->wait_for_done) - { - return EFL_UTIL_ERROR_INVALID_PARAMETER; - } - else + return EFL_UTIL_ERROR_INVALID_PARAMETER; + } + else + { + if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED) { - if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED) - { - return EFL_UTIL_ERROR_PERMISSION_DENIED; - } + return EFL_UTIL_ERROR_PERMISSION_DENIED; } } - - return EFL_UTIL_ERROR_NONE; } - else - return EFL_UTIL_ERROR_INVALID_PARAMETER; + + return EFL_UTIL_ERROR_NONE; } API int @@ -989,50 +1124,51 @@ efl_util_get_window_screen_mode(Evas_Object *window, Ecore_Wl_Window *wlwin; struct wl_surface *surface; Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info; - Eina_Bool res; - - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + Eina_Bool ret; wlwin = elm_win_wl_window_get(window); - if (wlwin) - { - while (!_eflutil.wl.policy.proto) - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER); - surface = ecore_wl_window_surface_get(wlwin); - EINA_SAFETY_ON_NULL_RETURN_VAL(surface, - EFL_UTIL_ERROR_INVALID_PARAMETER); + surface = ecore_wl_window_surface_get(wlwin); + EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); - scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface); - if (scr_mode_info) - { - if (scr_mode_info->wait_for_done) - { - while (scr_mode_info->wait_for_done) - { - ecore_wl_flush(); - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - } - } + ret = _init_tizen_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); - switch (scr_mode_info->mode) + scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface); + if (scr_mode_info) + { + if (scr_mode_info->wait_for_done) + { + while (scr_mode_info->wait_for_done) { - case TIZEN_POLICY_MODE_DEFAULT: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; break; - case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break; - default: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; - return EFL_UTIL_ERROR_INVALID_PARAMETER; + ecore_wl_flush(); + wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); } - return EFL_UTIL_ERROR_NONE; } - else + + switch (scr_mode_info->mode) { - *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; - return EFL_UTIL_ERROR_INVALID_PARAMETER; + case TIZEN_POLICY_MODE_DEFAULT: + *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; + break; + + case TIZEN_POLICY_MODE_ALWAYS_ON: + *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; + break; + + default: + *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; + return EFL_UTIL_ERROR_INVALID_PARAMETER; } + + return EFL_UTIL_ERROR_NONE; } else - return EFL_UTIL_ERROR_INVALID_PARAMETER; + { + *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; + return EFL_UTIL_ERROR_INVALID_PARAMETER; + } } #ifndef TIZEN_WEARABLE @@ -1075,80 +1211,94 @@ efl_util_unset_window_screen_mode_error_cb(Evas_Object *window) } #endif +static Eina_Bool +_init_tizen_display_policy_proto(void) +{ + int ret = 0; + + if (!_eflutil.wl.display_policy.proto) + { + ret = _wl_init(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EINA_FALSE); + + ret = 0; + while (!_eflutil.wl.display_policy.proto && ret != -1) + ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.display_policy.proto, EINA_FALSE); + } + + return EINA_TRUE; +} + API int efl_util_set_window_brightness(Evas_Object *window, int brightness) { Ecore_Wl_Window *wlwin; struct wl_surface *surface; Efl_Util_Wl_Surface_Brightness_Info *brightness_info; - Eina_Bool res; + Eina_Bool ret; EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER); EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER); - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); - wlwin = elm_win_wl_window_get(window); - if (wlwin) + EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER); + + surface = ecore_wl_window_surface_get(wlwin); + EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); + + ret = _init_tizen_display_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); + + brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface); + if (!brightness_info) { - while (!_eflutil.wl.display_policy.proto) - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info)); + EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY); - surface = ecore_wl_window_surface_get(wlwin); - EINA_SAFETY_ON_NULL_RETURN_VAL(surface, - EFL_UTIL_ERROR_INVALID_PARAMETER); + brightness_info->surface = surface; + brightness_info->brightness = brightness; + brightness_info->wait_for_done = EINA_TRUE; + brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE; - brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface); - if (!brightness_info) - { - brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info)); - EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY); - - brightness_info->surface = surface; - brightness_info->brightness = brightness; - brightness_info->wait_for_done = EINA_TRUE; - brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE; - - eina_hash_add(_eflutil.wl.display_policy.hash_brightness, - &surface, - brightness_info); - } - else - { - brightness_info->brightness = brightness; - brightness_info->wait_for_done = EINA_TRUE; - brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE; - } - - tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto, - surface, brightness); - if (brightness_info->wait_for_done) - { - int count = 0; - while (brightness_info->wait_for_done && (count < 3)) - { - ecore_wl_flush(); - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - count++; - } - - if (brightness_info->wait_for_done) - { - return EFL_UTIL_ERROR_INVALID_PARAMETER; - } - else - { - if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED) - { - return EFL_UTIL_ERROR_PERMISSION_DENIED; - } - } - } - return EFL_UTIL_ERROR_NONE; + eina_hash_add(_eflutil.wl.display_policy.hash_brightness, + &surface, + brightness_info); } else - return EFL_UTIL_ERROR_INVALID_PARAMETER; + { + brightness_info->brightness = brightness; + brightness_info->wait_for_done = EINA_TRUE; + brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE; + } + + tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto, + surface, brightness); + if (brightness_info->wait_for_done) + { + int count = 0; + while (brightness_info->wait_for_done && (count < 3)) + { + ecore_wl_flush(); + wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + count++; + } + + if (brightness_info->wait_for_done) + { + return EFL_UTIL_ERROR_INVALID_PARAMETER; + } + else + { + if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED) + { + return EFL_UTIL_ERROR_PERMISSION_DENIED; + } + } + } + + return EFL_UTIL_ERROR_NONE; } API int @@ -1157,23 +1307,19 @@ efl_util_get_window_brightness(Evas_Object *window, int *brightness) Ecore_Wl_Window *wlwin; struct wl_surface *surface; Efl_Util_Wl_Surface_Brightness_Info *brightness_info; - Eina_Bool res; + Eina_Bool ret; EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER); EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER); - res = _wl_init(); - EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); - wlwin = elm_win_wl_window_get(window); - if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER; - - while (!_eflutil.wl.display_policy.proto) - wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER); surface = ecore_wl_window_surface_get(wlwin); - EINA_SAFETY_ON_NULL_RETURN_VAL(surface, - EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); + + ret = _init_tizen_display_policy_proto(); + EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED); brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface); if (brightness_info) @@ -1205,10 +1351,18 @@ _cb_device_add(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t serial EINA_UNUSED, const char *identifier EINA_UNUSED, - struct tizen_input_device *device EINA_UNUSED, + struct tizen_input_device *device, struct wl_seat *seat EINA_UNUSED) { - ; + Eina_List *l; + struct tizen_input_device *ddata; + + EINA_LIST_FOREACH(_eflutil.wl.devmgr.device_list, l, ddata) + { + if (device == ddata) return; + } + + _eflutil.wl.devmgr.device_list = eina_list_append(_eflutil.wl.devmgr.device_list, device); } /* LCOV_EXCL_START */ @@ -1217,10 +1371,19 @@ _cb_device_remove(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t serial EINA_UNUSED, const char *identifier EINA_UNUSED, - struct tizen_input_device *device EINA_UNUSED, + struct tizen_input_device *device, struct wl_seat *seat EINA_UNUSED) { - ; + Eina_List *l, *ll; + struct tizen_input_device *ddata; + + EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.device_list, l, ll, ddata) + { + if (device == ddata) + { + _eflutil.wl.devmgr.device_list = eina_list_remove_list(_eflutil.wl.devmgr.device_list, l); + } + } } /* LCOV_EXCL_STOP */ @@ -1335,6 +1498,8 @@ efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h) ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified); _eflutil.wl.devmgr.request_notified = -1; + _wl_shutdown(); + return ret; } @@ -1647,6 +1812,8 @@ efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot) _screenshot_mutex_unlock(); _screenshot_mutex_destory(); + _wl_shutdown(); + return EFL_UTIL_ERROR_NONE; } -- 2.7.4