summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/efl_util.h36
-rw-r--r--src/efl_util.c172
2 files changed, 208 insertions, 0 deletions
diff --git a/include/efl_util.h b/include/efl_util.h
index 7ee6fca..4fb2363 100644
--- a/include/efl_util.h
+++ b/include/efl_util.h
@@ -257,6 +257,42 @@ API int efl_util_set_window_screen_mode_error_cb(Evas_Object *window, efl_util_w
API int efl_util_unset_window_screen_mode_error_cb(Evas_Object *window);
/**
+ * @brief Sets the user's preferred brightness of the specified window.
+ * @details This API is useful when the application need to change the brightness of the screen when it is appeared on the screen.
+ * If the application sets the brightness 0 to 100 to its window and the application window is shown wholly or partially,
+ * the window manager requests the display system to change the brightness of the screen using user's preferred brightness.
+ * If the window is no longer shown, then the window manger request the display system to go back to default brightness.
+ * If the brightness is less than 0, this means to use the default screen brightness.
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/display
+ * @remarks This API needs the privilege.
+ * If the application which is not get the privilege use this API, the window manager generates the permission deny error.
+ * @param[in] window The EFL window
+ * @param[in] brightness The preferred brightness
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #EFL_UTIL_ERROR_NONE Successful
+ * @retval #EFL_UTIL_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #EFL_UTIL_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #EFL_UTIL_ERROR_OUT_OF_MEMORY Out of memory
+ * @see efl_util_get_window_brightness()
+ */
+API int efl_util_set_window_brightness(Evas_Object *window, int brightness);
+
+/**
+ * @brief Gets the user's preferred brightness of the specified window.
+ * @since_tizen 3.0
+ * @param[in] window The EFL window
+ * @param[out] brightness The preferred brightness
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #EFL_UTIL_ERROR_NONE Successful
+ * @retval #EFL_UTIL_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see efl_util_set_window_brightness()
+ */
+API int efl_util_get_window_brightness(Evas_Object *window, int *brightness);
+
+
+/**
* @}
*/
diff --git a/src/efl_util.c b/src/efl_util.c
index ad213a2..8bce9b9 100644
--- a/src/efl_util.c
+++ b/src/efl_util.c
@@ -80,6 +80,14 @@ typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
uint32_t state;
} Efl_Util_Wl_Surface_Scr_Mode_Info;
+typedef struct _Efl_Util_Wl_Surface_Brightness_Info
+{
+ void *surface; /* wl_surface */
+ int brightness;
+ Eina_Bool wait_for_done;
+ uint32_t state;
+} Efl_Util_Wl_Surface_Brightness_Info;
+
typedef struct _Efl_Util_Wl_Output_Info
{
struct wl_output *output;
@@ -124,6 +132,11 @@ typedef struct _Efl_Util_Data
struct tizen_input_device_manager *devicemgr;
int request_notified;
} devmgr;
+ struct
+ {
+ struct tizen_display_policy *proto;
+ Eina_Hash *hash_brightness;
+ } display_policy;
} wl;
#endif /* end of WAYLAND */
@@ -181,6 +194,8 @@ static void _cb_wl_tz_policy_iconify_state_changed(void *data
static void _cb_wl_tz_policy_supported_aux_hints(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, struct wl_array *hints, uint32_t num_hints);
static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id);
+static void _cb_wl_tz_display_policy_brightness_done(void *data, struct tizen_display_policy *tizen_display_policy, struct wl_surface *surface_resource, int32_t brightness, uint32_t state);
+
static void _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 wl_seat *seat EINA_UNUSED);
static void _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 wl_seat *seat EINA_UNUSED);
static void _cb_error(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t errorcode);
@@ -212,6 +227,10 @@ struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
_cb_block_expired
};
+struct tizen_display_policy_listener _wl_tz_display_policy_listener =
+{
+ _cb_wl_tz_display_policy_brightness_done,
+};
#endif /* end of WAYLAND */
static Eina_Bool
@@ -517,6 +536,18 @@ _cb_wl_reg_global(void *data,
_eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, name, &tizen_input_device_manager_interface, version);
tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
}
+ else if (!strcmp(interface, "tizen_display_policy"))
+ {
+ _eflutil.wl.display_policy.proto = wl_registry_bind(reg, name, &tizen_display_policy_interface, version);
+ if (!_eflutil.wl.display_policy.proto) return;
+
+ tizen_display_policy_add_listener(_eflutil.wl.display_policy.proto,
+ &_wl_tz_display_policy_listener,
+ NULL);
+
+ _eflutil.wl.display_policy.hash_brightness = eina_hash_pointer_new(free);
+ }
+
}
static void
@@ -527,6 +558,9 @@ _cb_wl_reg_global_remove(void *data,
_eflutil.wl.policy.proto = NULL;
eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
+
+ _eflutil.wl.display_policy.proto = NULL;
+ eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
}
static Efl_Util_Callback_Info *
@@ -639,6 +673,24 @@ static void _cb_wl_tz_policy_allowed_aux_hint(void *data, str
}
static void
+_cb_wl_tz_display_policy_brightness_done(void *data,
+ struct tizen_display_policy *tizen_display_policy,
+ struct wl_surface *surface,
+ int32_t brightness,
+ uint32_t state)
+{
+ Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
+
+ brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
+ if (brightness_info)
+ {
+ brightness_info->brightness = brightness;
+ brightness_info->wait_for_done = EINA_FALSE;
+ brightness_info->state = state;
+ }
+}
+
+static void
_cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Efl_Util_Wl_Surface_Lv_Info *lv_info;
@@ -1233,6 +1285,126 @@ efl_util_unset_window_screen_mode_error_cb(Evas_Object *window)
return EFL_UTIL_ERROR_NONE;
}
+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_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)
+ {
+ while (!_eflutil.wl.display_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_INVALID_PARAMETER);
+
+ 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;
+ }
+ else
+ return EFL_UTIL_ERROR_INVALID_PARAMETER;
+}
+
+API int
+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_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);
+
+ surface = ecore_wl_window_surface_get(wlwin);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
+ EFL_UTIL_ERROR_INVALID_PARAMETER);
+
+ brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
+ if (brightness_info)
+ {
+ if (brightness_info->wait_for_done)
+ {
+ while (brightness_info->wait_for_done)
+ {
+ ecore_wl_flush();
+ wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+ }
+ }
+ *brightness = brightness_info->brightness;
+ }
+ else
+ *brightness = -1;
+
+ return EFL_UTIL_ERROR_NONE;
+}
+
+
struct _efl_util_inputgen_h
{
unsigned int init_type;