2 * Copyright (c) 2011-2017 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #define LOG_TAG "TIZEN_N_EFL_UTIL"
24 #include <sys/types.h>
28 #include <tbm_bufmgr.h>
29 #include <tbm_surface.h>
30 #include <tbm_surface_internal.h>
31 #include <Elementary.h>
32 #include <Ecore_Evas.h>
35 #include <Ecore_Wl2.h>
36 #include <wayland-client.h>
37 #include <wayland-tbm-client.h>
38 #include <tizen-extension-client-protocol.h>
39 #include <screenshooter-client-protocol.h>
41 #include <efl_util_screenshot_extension.h>
48 /* Determine Tizen profile at runtime */
49 #include <system_info.h>
51 TIZEN_PROFILE_UNKNOWN = 0,
52 TIZEN_PROFILE_MOBILE = 0x1,
53 TIZEN_PROFILE_WEARABLE = 0x2,
54 TIZEN_PROFILE_TV = 0x4,
55 TIZEN_PROFILE_IVI = 0x8,
56 TIZEN_PROFILE_COMMON = 0x10,
58 static tizen_profile_t profile = TIZEN_PROFILE_UNKNOWN;
59 static tizen_profile_t _get_tizen_profile()
62 system_info_get_platform_string("http://tizen.org/feature/profile", &profileName);
63 switch (*profileName) {
66 profile = TIZEN_PROFILE_MOBILE;
70 profile = TIZEN_PROFILE_WEARABLE;
74 profile = TIZEN_PROFILE_TV;
78 profile = TIZEN_PROFILE_IVI;
80 default: // common or unknown ==> ALL ARE COMMON.
81 profile = TIZEN_PROFILE_COMMON;
87 static inline tizen_profile_t get_tizen_profile()
89 if (__builtin_expect(profile != TIZEN_PROFILE_UNKNOWN, 1))
91 return _get_tizen_profile();
95 #define LOG_TAG "TIZEN_N_EFL_UTIL"
96 #define EFL_UTIL_INPUT_GENERATOR_DEFAULT_TIME_OUT 1000
97 #define EFL_UTIL_INPUT_GENERATOR_DEFAULT_DISPATCH_TIME_OUT 10
99 typedef struct _Efl_Util_Wl_Surface_Lv_Info
101 void *surface; /* wl_surface */
103 Eina_Bool wait_for_done;
105 } Efl_Util_Wl_Surface_Lv_Info;
107 typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
109 void *surface; /* wl_surface */
111 Eina_Bool wait_for_done;
113 } Efl_Util_Wl_Surface_Scr_Mode_Info;
115 typedef struct _Efl_Util_Wl_Surface_Brightness_Info
117 void *surface; /* wl_surface */
119 Eina_Bool wait_for_done;
121 } Efl_Util_Wl_Surface_Brightness_Info;
123 typedef struct _Efl_Util_Wl_Output_Info
125 struct wl_output *output;
126 int offset_x, offset_y, width, height;
127 } Efl_Util_Wl_Output_Info;
129 typedef struct _Efl_Util_Gesture_Common_Grab_Data
132 } Efl_Util_Gesture_Common_Grab_Data;
134 typedef struct _Efl_Util_Gesture_Edge_Swipe_Grab_Data
136 Efl_Util_Gesture_Common_Grab_Data base;
138 unsigned int fingers;
139 efl_util_gesture_edge_e edge;
140 efl_util_gesture_edge_size_e edge_size;
141 unsigned int start_point;
142 unsigned int end_point;
143 } Efl_Util_Gesture_Edge_Swipe_Grab_Data;
145 typedef struct _Efl_Util_Gesture_Edge_Drag_Grab_Data
147 Efl_Util_Gesture_Common_Grab_Data base;
149 unsigned int fingers;
150 efl_util_gesture_edge_e edge;
151 efl_util_gesture_edge_size_e edge_size;
152 unsigned int start_point;
153 unsigned int end_point;
154 } Efl_Util_Gesture_Edge_Drag_Grab_Data;
156 typedef struct _Efl_Util_Gesture_Tap_Grab_Data
158 Efl_Util_Gesture_Common_Grab_Data base;
160 unsigned int fingers;
161 unsigned int repeats;
162 } Efl_Util_Gesture_Tap_Grab_Data;
164 typedef struct _Efl_Util_Gesture_Palm_Cover_Grab_Data
166 Efl_Util_Gesture_Common_Grab_Data base;
167 } Efl_Util_Gesture_Palm_Cover_Grab_Data;
169 typedef struct _Efl_Util_Device_Info
171 struct tizen_input_device *device;
172 Ecore_Device_Class clas;
173 Eina_Stringshare *name;
174 } Efl_Util_Device_Info;
176 typedef struct _Efl_Util_Data
178 /* wayland related stuffs */
182 Ecore_Wl2_Display *wl2_display;
183 struct wl_display *dpy;
184 struct wl_event_queue *queue;
186 Ecore_Fd_Handler *fd_hdl;
191 struct tizen_policy *proto;
192 Eina_Hash *hash_noti_lv;
193 Eina_Hash *hash_scr_mode;
197 struct wl_event_queue *queue;
198 struct screenshooter *screenshooter;
199 struct tizen_screenshooter *tz_screenshooter;
200 struct wayland_tbm_client *tbm_client;
201 Eina_List *output_list;
206 struct tizen_input_device_manager *devicemgr;
207 int request_notified;
209 Eina_List *wait_devices;
210 struct wl_event_source *wait_timer;
215 struct tizen_display_policy *proto;
216 Eina_Hash *hash_brightness;
220 struct tizen_gesture *proto;
221 int request_notified;
227 static Efl_Util_Data _eflutil =
233 { 0, NULL, NULL, NULL }, /* tizen_policy protocol */
234 { NULL, NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
235 { NULL, -1 }, /* tizen_input_device_manager protocol */
236 { 0, NULL, NULL }, /* display_policy protocol */
237 { NULL, -1, EINA_FALSE } /* tizen_gesture protocol */
241 static Eina_Bool _wl_init(void);
242 static void _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
243 static void _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
244 static void _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
245 static void _cb_wl_reg_screenshooter_global_remove(void *data, struct wl_registry *reg, unsigned int name);
246 static void _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t is_conformant);
247 static void _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t conformant_part, uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h);
248 static void _cb_wl_tz_policy_notification_done(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, int32_t level, uint32_t state);
249 static void _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id);
250 static void _cb_wl_tz_policy_scr_mode_done(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t mode, uint32_t state);
251 static void _cb_wl_tz_policy_iconify_state_changed(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, uint32_t iconified, uint32_t force);
252 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);
253 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id);
254 static void _cb_wl_tz_policy_aux_message(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, const char *key, const char *val, struct wl_array *options);
255 static void _cb_wl_conformant_region(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t conformant_part, uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t serial);
257 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);
259 static void _cb_device_info(void *data, struct tizen_input_device *tizen_input_device EINA_UNUSED, const char *name, uint32_t clas, uint32_t subclas EINA_UNUSED, struct wl_array *axes EINA_UNUSED);
260 static void _cb_event_device(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, unsigned int serial EINA_UNUSED, const char *name EINA_UNUSED, uint32_t time EINA_UNUSED);
261 static void _cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED);
263 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);
264 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);
265 static void _cb_error(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t errorcode);
266 static void _cb_block_expired(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED);
268 static void _cb_gesture_edge_swipe_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t fingers EINA_UNUSED, uint32_t edge EINA_UNUSED, uint32_t edge_size EINA_UNUSED, uint32_t start_point EINA_UNUSED, uint32_t end_point EINA_UNUSED, uint32_t error);
269 static void _cb_gesture_edge_swipe(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, int sx, int sy, uint32_t edge);
270 static void _cb_gesture_edge_drag_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t fingers EINA_UNUSED, uint32_t edge EINA_UNUSED, uint32_t edge_size EINA_UNUSED, uint32_t start_point EINA_UNUSED, uint32_t end_point EINA_UNUSED, uint32_t error);
271 static void _cb_gesture_edge_drag(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, int cx, int cy, uint32_t edge);
272 static void _cb_gesture_tap_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t fingers EINA_UNUSED, uint32_t repeats EINA_UNUSED, uint32_t error);
273 static void _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats);
274 static void _cb_gesture_palm_cover_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, struct wl_surface *surface EINA_UNUSED, uint32_t error);
275 static void _cb_gesture_palm_cover(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, struct wl_surface *surface EINA_UNUSED, uint32_t mode, uint32_t duration, int cx, int cy, uint32_t size, wl_fixed_t pressure);
276 static void _cb_gesture_activate_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, struct wl_surface *surface EINA_UNUSED, uint32_t type EINA_UNUSED, uint32_t active EINA_UNUSED, uint32_t error);
279 static const struct wl_registry_listener _wl_reg_listener =
282 _cb_wl_reg_global_remove
285 static const struct wl_registry_listener _wl_reg_screenshooter_listener =
287 _cb_wl_reg_screenshooter_global,
288 _cb_wl_reg_screenshooter_global_remove
291 struct tizen_policy_listener _wl_tz_policy_listener =
293 _cb_wl_tz_policy_conformant,
294 _cb_wl_tz_policy_conformant_area,
295 _cb_wl_tz_policy_notification_done,
296 _cb_wl_tz_policy_transient_for_done,
297 _cb_wl_tz_policy_scr_mode_done,
298 _cb_wl_tz_policy_iconify_state_changed,
299 _cb_wl_tz_policy_supported_aux_hints,
300 _cb_wl_tz_policy_allowed_aux_hint,
301 _cb_wl_tz_policy_aux_message,
302 _cb_wl_conformant_region,
305 static const struct tizen_input_device_listener _wl_tz_input_device_listener =
312 struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
320 struct tizen_display_policy_listener _wl_tz_display_policy_listener =
322 _cb_wl_tz_display_policy_brightness_done,
325 struct tizen_gesture_listener _wl_tz_gesture_listener =
327 _cb_gesture_edge_swipe_notify,
328 _cb_gesture_edge_swipe,
329 _cb_gesture_edge_drag_notify,
330 _cb_gesture_edge_drag,
331 _cb_gesture_tap_notify,
333 _cb_gesture_palm_cover_notify,
334 _cb_gesture_palm_cover,
335 _cb_gesture_activate_notify
341 struct wl_display *display_wrapper = NULL;
342 struct wl_registry *reg = NULL;
344 if (_eflutil.wl.init) return EINA_TRUE;
348 _eflutil.wl.wl2_display = ecore_wl2_display_connect(NULL);
349 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.wl2_display, fail);
350 _eflutil.wl.dpy = ecore_wl2_display_get(_eflutil.wl.wl2_display);
351 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.dpy, fail);
353 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
354 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
356 _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy);
357 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail);
359 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.queue);
361 reg = wl_display_get_registry(display_wrapper);
362 wl_proxy_wrapper_destroy(display_wrapper);
363 display_wrapper = NULL;
364 EINA_SAFETY_ON_NULL_GOTO(reg, fail);
366 wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
368 _eflutil.wl.init = EINA_TRUE;
373 wl_proxy_wrapper_destroy(display_wrapper);
375 if (_eflutil.wl.queue)
377 wl_event_queue_destroy(_eflutil.wl.queue);
378 _eflutil.wl.queue = NULL;
381 ecore_wl2_shutdown();
386 _cb_wl_output_geometry(void *data, struct wl_output *wl_output, int x, int y,
387 int physical_width, int physical_height, int subpixel,
388 const char *make, const char *model, int transform)
390 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
391 if (wl_output == output->output)
393 output->offset_x = x;
394 output->offset_y = y;
399 _cb_wl_output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
400 int width, int height, int refresh)
402 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
403 if (wl_output == output->output && (flags & WL_OUTPUT_MODE_CURRENT))
405 output->width = width;
406 output->height = height;
411 _cb_wl_output_done(void *data, struct wl_output *wl_output)
416 _cb_wl_output_scale(void *data, struct wl_output *wl_output, int32_t factor)
420 static const struct wl_output_listener output_listener =
422 _cb_wl_output_geometry,
429 _cb_wl_screenshot_done(void *data, struct screenshooter *screenshooter)
431 Eina_Bool *shot_done = (Eina_Bool*)data;
433 *shot_done = EINA_TRUE;
436 static const struct screenshooter_listener screenshooter_listener =
438 _cb_wl_screenshot_done
442 _cb_tz_screenshot_format(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t format)
447 _cb_tz_screenshot_noti(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t noti)
449 _eflutil.wl.shot.noti = noti;
452 static const struct tizen_screenshooter_listener tz_screenshooter_listener =
454 _cb_tz_screenshot_format,
455 _cb_tz_screenshot_noti
459 _cb_wl_reg_global(void *data,
460 struct wl_registry *reg,
462 const char *interface,
463 unsigned int version)
465 if (!strcmp(interface, "tizen_policy"))
467 struct tizen_policy *proto;
468 proto = wl_registry_bind(reg,
470 &tizen_policy_interface,
474 tizen_policy_add_listener(proto,
475 &_wl_tz_policy_listener,
478 _eflutil.wl.policy.hash_noti_lv = eina_hash_pointer_new(free);
479 _eflutil.wl.policy.hash_scr_mode = eina_hash_pointer_new(free);
480 _eflutil.wl.policy.proto = proto;
481 _eflutil.wl.policy.id = id;
483 else if (strcmp(interface, "wl_output") == 0)
485 Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info));
486 EINA_SAFETY_ON_NULL_RETURN(output);
488 _eflutil.wl.shot.output_list = eina_list_append(_eflutil.wl.shot.output_list, output);
490 output->output = wl_registry_bind(reg, id, &wl_output_interface, version);
491 wl_output_add_listener(output->output, &output_listener, output);
493 else if (strcmp(interface, "tizen_input_device_manager") == 0)
495 _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
496 tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
498 else if (!strcmp(interface, "tizen_display_policy"))
500 _eflutil.wl.display_policy.proto = wl_registry_bind(reg, id, &tizen_display_policy_interface, version);
501 if (!_eflutil.wl.display_policy.proto) return;
503 tizen_display_policy_add_listener(_eflutil.wl.display_policy.proto,
504 &_wl_tz_display_policy_listener,
507 _eflutil.wl.display_policy.hash_brightness = eina_hash_pointer_new(free);
508 _eflutil.wl.display_policy.id = id;
510 else if (strcmp(interface, "tizen_gesture") == 0)
512 _eflutil.wl.gesture.proto = wl_registry_bind(reg, id, &tizen_gesture_interface, version);
513 tizen_gesture_add_listener(_eflutil.wl.gesture.proto, &_wl_tz_gesture_listener, NULL);
516 /* LCOV_EXCL_START */
518 _cb_wl_reg_global_remove(void *data,
519 struct wl_registry *reg,
522 /* unset each global id number to 0 since global id is started
523 * from number 1 on server side display structure
525 if (id == _eflutil.wl.policy.id)
527 _eflutil.wl.policy.id = 0;
528 _eflutil.wl.policy.proto = NULL;
529 eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
530 eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
532 else if (id == _eflutil.wl.display_policy.id)
534 _eflutil.wl.display_policy.id = 0;
535 _eflutil.wl.display_policy.proto = NULL;
536 eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
542 _cb_wl_reg_screenshooter_global(void *data,
543 struct wl_registry *reg,
545 const char *interface,
546 unsigned int version)
548 if (strcmp(interface, "screenshooter") == 0)
550 _eflutil.wl.shot.screenshooter = wl_registry_bind(reg, name, &screenshooter_interface, version);
551 screenshooter_add_listener(_eflutil.wl.shot.screenshooter, &screenshooter_listener, NULL);
553 else if (strcmp(interface, "tizen_screenshooter") == 0)
555 _eflutil.wl.shot.tz_screenshooter = wl_registry_bind(reg, name, &tizen_screenshooter_interface, version);
556 tizen_screenshooter_add_listener(_eflutil.wl.shot.tz_screenshooter, &tz_screenshooter_listener, NULL);
558 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
562 /* LCOV_EXCL_START */
564 _cb_wl_reg_screenshooter_global_remove(void *data,
565 struct wl_registry *reg,
571 _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy,
572 struct wl_surface *surface, uint32_t is_conformant)
577 _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy,
578 struct wl_surface *surface, uint32_t conformant_part,
579 uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h)
585 _cb_wl_tz_policy_notification_done(void *data,
586 struct tizen_policy *tizen_policy,
587 struct wl_surface *surface,
591 Efl_Util_Wl_Surface_Lv_Info *lv_info;
593 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
596 lv_info->level = level;
597 lv_info->wait_for_done = EINA_FALSE;
598 lv_info->state = state;
602 /* LCOV_EXCL_START */
604 _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id)
610 _cb_wl_tz_policy_scr_mode_done(void *data,
611 struct tizen_policy *tizen_policy,
612 struct wl_surface *surface,
616 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
618 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
621 scr_mode_info->mode = mode;
622 scr_mode_info->wait_for_done = EINA_FALSE;
623 scr_mode_info->state = state;
627 /* LCOV_EXCL_START */
628 static void _cb_wl_tz_policy_iconify_state_changed(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, uint32_t iconified, uint32_t force)
632 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)
636 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id)
640 static void _cb_wl_tz_policy_aux_message(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, const char *key, const char *val, struct wl_array *options)
643 static void _cb_wl_conformant_region(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t conformant_part, uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t serial)
649 _cb_wl_tz_display_policy_brightness_done(void *data,
650 struct tizen_display_policy *tizen_display_policy,
651 struct wl_surface *surface,
655 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
657 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
660 brightness_info->brightness = brightness;
661 brightness_info->wait_for_done = EINA_FALSE;
662 brightness_info->state = state;
667 _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
669 Efl_Util_Wl_Surface_Lv_Info *lv_info;
672 if (EINA_UNLIKELY(!lv_info))
675 eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info);
679 efl_util_set_notification_window_level(Evas_Object *window,
680 efl_util_notification_level_e level)
684 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
685 EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) &&
686 (level <= EFL_UTIL_NOTIFICATION_LEVEL_TOP),
687 EFL_UTIL_ERROR_INVALID_PARAMETER);
690 Ecore_Wl2_Window *wlwin;
691 struct wl_surface *surface;
692 Efl_Util_Wl_Surface_Lv_Info *lv_info;
693 Ecore_Wl2_Window_Type wl_type;
696 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
698 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
699 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
701 type = elm_win_type_get(window);
702 if (type != ELM_WIN_NOTIFICATION)
704 wl_type = ecore_wl2_window_type_get(wlwin);
705 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
706 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
709 while (!_eflutil.wl.policy.proto)
710 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
712 surface = ecore_wl2_window_surface_get(wlwin);
713 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
714 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
716 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
719 lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
720 EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
722 lv_info->surface = surface;
723 lv_info->level = (int)level;
724 lv_info->wait_for_done = EINA_TRUE;
725 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
726 eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
730 evas_object_event_callback_add(window, EVAS_CALLBACK_DEL,
731 _cb_window_del, lv_info);
735 lv_info->level = (int)level;
736 lv_info->wait_for_done = EINA_TRUE;
737 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
741 tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
742 surface, (int)level);
744 if (lv_info->wait_for_done)
747 while (lv_info->wait_for_done && (count < 3))
749 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
750 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
754 if (lv_info->wait_for_done)
756 return EFL_UTIL_ERROR_INVALID_PARAMETER;
760 if (lv_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
762 return EFL_UTIL_ERROR_PERMISSION_DENIED;
767 return EFL_UTIL_ERROR_NONE;
771 efl_util_get_notification_window_level(Evas_Object *window,
772 efl_util_notification_level_e *level)
776 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
777 EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
780 Ecore_Wl2_Window *wlwin;
781 struct wl_surface *surface;
782 Efl_Util_Wl_Surface_Lv_Info *lv_info;
783 Ecore_Wl2_Window_Type wl_type;
786 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
788 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
789 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
791 type = elm_win_type_get(window);
792 if (type != ELM_WIN_NOTIFICATION)
794 wl_type = ecore_wl2_window_type_get(wlwin);
795 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
796 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
799 while (!_eflutil.wl.policy.proto)
800 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
802 surface = ecore_wl2_window_surface_get(wlwin);
803 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
804 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
806 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
809 if (lv_info->wait_for_done)
812 while ((lv_info->wait_for_done) && (count < 3))
814 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
815 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
819 if (lv_info->wait_for_done)
821 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
822 return EFL_UTIL_ERROR_INVALID_PARAMETER;
826 switch (lv_info->level)
828 case TIZEN_POLICY_LEVEL_NONE: *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE; break;
829 case TIZEN_POLICY_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
830 case TIZEN_POLICY_LEVEL_MEDIUM: *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM; break;
831 case TIZEN_POLICY_LEVEL_HIGH: *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH; break;
832 case TIZEN_POLICY_LEVEL_TOP: *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP; break;
833 default: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
834 return EFL_UTIL_ERROR_INVALID_PARAMETER;
836 return EFL_UTIL_ERROR_NONE;
839 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
841 return EFL_UTIL_ERROR_NONE;
845 efl_util_set_window_opaque_state(Evas_Object *window,
850 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
851 EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
852 EFL_UTIL_ERROR_INVALID_PARAMETER);
854 Ecore_Wl2_Window *wlwin;
855 struct wl_surface *surface;
857 if (!_eflutil.wl.policy.proto)
862 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
864 while (!_eflutil.wl.policy.proto && ret != -1)
865 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
867 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
870 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
872 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
874 surface = ecore_wl2_window_surface_get(wlwin);
876 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
878 tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
880 return EFL_UTIL_ERROR_NONE;
884 efl_util_set_window_screen_mode(Evas_Object *window,
885 efl_util_screen_mode_e mode)
887 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
888 EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
889 (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
890 EFL_UTIL_ERROR_INVALID_PARAMETER);
892 Ecore_Wl2_Window *wlwin;
893 struct wl_surface *surface;
894 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
898 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
900 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
903 while (!_eflutil.wl.policy.proto)
904 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
906 surface = ecore_wl2_window_surface_get(wlwin);
907 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
908 EFL_UTIL_ERROR_INVALID_PARAMETER);
910 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
913 scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
914 EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
916 scr_mode_info->surface = surface;
917 scr_mode_info->mode = (unsigned int)mode;
918 scr_mode_info->wait_for_done = EINA_TRUE;
919 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
921 eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
927 scr_mode_info->mode = (unsigned int)mode;
928 scr_mode_info->wait_for_done = EINA_TRUE;
929 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
932 tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
933 surface, (unsigned int)mode);
934 if (scr_mode_info->wait_for_done)
937 while (scr_mode_info->wait_for_done && (count < 3))
939 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
940 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
944 if (scr_mode_info->wait_for_done)
946 return EFL_UTIL_ERROR_INVALID_PARAMETER;
950 if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
952 return EFL_UTIL_ERROR_PERMISSION_DENIED;
957 return EFL_UTIL_ERROR_NONE;
960 return EFL_UTIL_ERROR_INVALID_PARAMETER;
964 efl_util_get_window_screen_mode(Evas_Object *window,
965 efl_util_screen_mode_e *mode)
967 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
968 EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
970 Ecore_Wl2_Window *wlwin;
971 struct wl_surface *surface;
972 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
976 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
978 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
981 while (!_eflutil.wl.policy.proto)
982 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
984 surface = ecore_wl2_window_surface_get(wlwin);
985 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
986 EFL_UTIL_ERROR_INVALID_PARAMETER);
988 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
991 if (scr_mode_info->wait_for_done)
993 while (scr_mode_info->wait_for_done)
995 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
996 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1000 switch (scr_mode_info->mode)
1002 case TIZEN_POLICY_MODE_DEFAULT: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; break;
1003 case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
1004 default: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1005 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1007 return EFL_UTIL_ERROR_NONE;
1011 *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1012 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1016 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1020 efl_util_set_window_brightness(Evas_Object *window, int brightness)
1022 Ecore_Wl2_Window *wlwin;
1023 struct wl_surface *surface;
1024 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1027 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1028 EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
1031 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1033 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1036 while (!_eflutil.wl.display_policy.proto)
1037 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1039 surface = ecore_wl2_window_surface_get(wlwin);
1040 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1041 EFL_UTIL_ERROR_INVALID_PARAMETER);
1043 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1044 if (!brightness_info)
1046 brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
1047 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1049 brightness_info->surface = surface;
1050 brightness_info->brightness = brightness;
1051 brightness_info->wait_for_done = EINA_TRUE;
1052 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1054 eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
1060 brightness_info->brightness = brightness;
1061 brightness_info->wait_for_done = EINA_TRUE;
1062 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1065 tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
1066 surface, brightness);
1067 if (brightness_info->wait_for_done)
1070 while (brightness_info->wait_for_done && (count < 3))
1072 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1073 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1077 if (brightness_info->wait_for_done)
1079 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1083 if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
1085 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1089 return EFL_UTIL_ERROR_NONE;
1092 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1096 efl_util_get_window_brightness(Evas_Object *window, int *brightness)
1098 Ecore_Wl2_Window *wlwin;
1099 struct wl_surface *surface;
1100 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1103 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1104 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
1107 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1109 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1110 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
1112 while (!_eflutil.wl.display_policy.proto)
1113 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1115 surface = ecore_wl2_window_surface_get(wlwin);
1116 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1117 EFL_UTIL_ERROR_INVALID_PARAMETER);
1119 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1120 if (brightness_info)
1122 if (brightness_info->wait_for_done)
1124 while (brightness_info->wait_for_done)
1126 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1127 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1130 *brightness = brightness_info->brightness;
1135 return EFL_UTIL_ERROR_NONE;
1139 struct _efl_util_inputgen_h
1141 unsigned int init_type;
1146 _efl_util_input_check_wait_device_full(void)
1148 Eina_List *l, *ll, *l_next;
1149 Efl_Util_Device_Info *dev, *wait_dev;
1152 wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
1153 if (wait_cnt <= 0) return EINA_TRUE;
1155 EINA_LIST_FOREACH(_eflutil.wl.devmgr.devices, l, dev)
1157 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, ll, l_next, wait_dev)
1159 if ((dev->clas == wait_dev->clas) &&
1160 (!strncmp(dev->name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
1162 eina_stringshare_del(wait_dev->name);
1163 _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, ll);
1167 if (wait_cnt <= 0) return EINA_TRUE;
1178 _efl_util_input_check_wait_device(const char *name, unsigned int type)
1180 Eina_List *l, *l_next;
1181 Efl_Util_Device_Info *wait_dev;
1184 wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
1185 if (wait_cnt <= 0) return EINA_TRUE;
1187 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, l, l_next, wait_dev)
1189 if ((type == wait_dev->clas) &&
1190 (!strncmp(name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
1192 eina_stringshare_del(wait_dev->name);
1193 _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, l);
1197 if (wait_cnt <= 0) return EINA_TRUE;
1207 _cb_device_info(void *data, struct tizen_input_device *tizen_input_device EINA_UNUSED, const char *name, uint32_t clas, uint32_t subclas EINA_UNUSED, struct wl_array *axes EINA_UNUSED)
1209 Efl_Util_Device_Info *dev;
1211 if (!(dev = data)) return;
1212 dev->clas = (Ecore_Device_Class)clas;
1213 dev->name = eina_stringshare_add(name);
1215 if (_eflutil.wl.devmgr.wait_timer &&
1216 _efl_util_input_check_wait_device(name, clas))
1218 wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
1219 _eflutil.wl.devmgr.wait_timer = NULL;
1223 /* LCOV_EXCL_START */
1225 _cb_event_device(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, unsigned int serial EINA_UNUSED, const char *name EINA_UNUSED, uint32_t time EINA_UNUSED)
1231 _cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED)
1235 /* LCOV_EXCL_STOP */
1238 _cb_device_add(void *data EINA_UNUSED,
1239 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1240 uint32_t serial EINA_UNUSED,
1241 const char *identifier EINA_UNUSED,
1242 struct tizen_input_device *device,
1243 struct wl_seat *seat EINA_UNUSED)
1245 Efl_Util_Device_Info *dev;
1247 EINA_SAFETY_ON_NULL_RETURN(device);
1249 dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
1250 EINA_SAFETY_ON_NULL_RETURN(dev);
1252 dev->device = device;
1253 tizen_input_device_add_listener(device, &_wl_tz_input_device_listener, dev);
1255 _eflutil.wl.devmgr.devices = eina_list_append(_eflutil.wl.devmgr.devices, dev);
1259 _cb_device_remove(void *data EINA_UNUSED,
1260 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1261 uint32_t serial EINA_UNUSED,
1262 const char *identifier EINA_UNUSED,
1263 struct tizen_input_device *device,
1264 struct wl_seat *seat EINA_UNUSED)
1266 Eina_List *l, *l_next;
1267 Efl_Util_Device_Info *dev;
1269 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.devices, l, l_next, dev)
1271 if (dev->device == device)
1273 if (dev->name) eina_stringshare_del(dev->name);
1274 tizen_input_device_release(dev->device);
1276 _eflutil.wl.devmgr.devices = eina_list_remove_list(_eflutil.wl.devmgr.devices, l);
1285 _cb_error(void *data EINA_UNUSED,
1286 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1289 _eflutil.wl.devmgr.request_notified = errorcode;
1292 /* LCOV_EXCL_START */
1294 _cb_block_expired(void *data EINA_UNUSED,
1295 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
1299 /* LCOV_EXCL_STOP */
1301 static efl_util_error_e
1302 _efl_util_input_convert_input_generator_error(int ret)
1306 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
1307 return EFL_UTIL_ERROR_NONE;
1308 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
1309 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1310 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
1311 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
1312 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
1313 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1315 return EFL_UTIL_ERROR_NONE;
1319 /* LCOV_EXCL_START */
1321 _timer_wait(void *data)
1323 Efl_Util_Device_Info *dev;
1325 _eflutil.wl.devmgr.request_notified = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES;
1327 if (eina_list_count(_eflutil.wl.devmgr.wait_devices) > 0)
1329 EINA_LIST_FREE(_eflutil.wl.devmgr.wait_devices, dev)
1331 eina_stringshare_del(dev->name);
1336 wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
1337 _eflutil.wl.devmgr.wait_timer = NULL;
1341 /* LCOV_EXCL_STOP */
1344 _efl_util_input_initialize_wait_device(void)
1346 struct wl_event_loop *loop;
1349 if (_efl_util_input_check_wait_device_full()) return;
1351 loop = wl_event_loop_create();
1352 _eflutil.wl.devmgr.wait_timer = wl_event_loop_add_timer(loop, _timer_wait, NULL);
1353 if (_eflutil.wl.devmgr.wait_timer)
1355 ret = wl_event_source_timer_update(_eflutil.wl.devmgr.wait_timer,
1356 EFL_UTIL_INPUT_GENERATOR_DEFAULT_TIME_OUT);
1357 if (ret != 0) _timer_wait(NULL);
1361 while (_eflutil.wl.devmgr.wait_timer)
1363 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1364 ret = wl_event_loop_dispatch(loop, EFL_UTIL_INPUT_GENERATOR_DEFAULT_DISPATCH_TIME_OUT);
1365 if (ret != 0) _timer_wait(NULL);
1370 _efl_util_input_initialize_append_device(const char *name, Ecore_Device_Class clas)
1372 Efl_Util_Device_Info *dev;
1374 dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
1375 EINA_SAFETY_ON_NULL_RETURN(dev);
1377 dev->name = eina_stringshare_add(name);
1380 _eflutil.wl.devmgr.wait_devices = eina_list_append(_eflutil.wl.devmgr.wait_devices, dev);
1384 _efl_util_input_initialize_add_wait_device(const char *name, unsigned int dev_type)
1386 EINA_SAFETY_ON_NULL_RETURN(name);
1388 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1389 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_TOUCH);
1391 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1392 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_KEYBOARD);
1394 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1395 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_MOUSE);
1398 API efl_util_inputgen_h
1399 efl_util_input_initialize_generator(unsigned int dev_type)
1401 int ret = EFL_UTIL_ERROR_NONE;
1402 efl_util_inputgen_h inputgen_h = NULL;
1403 unsigned int clas = 0x0;
1406 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1407 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1408 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1410 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1414 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1417 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1421 inputgen_h->init_type |= dev_type;
1424 if (ret == (int)EINA_FALSE)
1426 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1430 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1431 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1432 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1433 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1434 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1435 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1437 while (!_eflutil.wl.devmgr.devicemgr)
1438 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1440 tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
1442 while (_eflutil.wl.devmgr.request_notified == -1)
1443 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1445 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1446 _eflutil.wl.devmgr.request_notified = -1;
1448 set_last_result(ret);
1449 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1463 API efl_util_inputgen_h
1464 efl_util_input_initialize_generator_with_name(unsigned int dev_type, const char *name)
1466 int ret = EFL_UTIL_ERROR_NONE;
1467 efl_util_inputgen_h inputgen_h = NULL;
1468 unsigned int clas = 0x0;
1471 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1472 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1473 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1475 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1479 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1482 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1486 inputgen_h->init_type |= dev_type;
1487 strncpy(inputgen_h->name, name, 31);
1490 if (ret == (int)EINA_FALSE)
1492 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1496 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1497 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1498 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1499 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1500 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1501 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1503 while (!_eflutil.wl.devmgr.devicemgr)
1504 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1506 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1508 while (_eflutil.wl.devmgr.request_notified == -1)
1509 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1511 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1512 _eflutil.wl.devmgr.request_notified = -1;
1514 set_last_result(ret);
1515 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1529 API efl_util_inputgen_h
1530 efl_util_input_initialize_generator_with_sync(unsigned int dev_type, const char *name)
1532 int ret = EFL_UTIL_ERROR_NONE;
1533 efl_util_inputgen_h inputgen_h = NULL;
1534 unsigned int clas = 0x0;
1537 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1538 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1539 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1541 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1545 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1548 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1552 inputgen_h->init_type |= dev_type;
1553 if (name) strncpy(inputgen_h->name, name, 31);
1554 else strncpy(inputgen_h->name, "Input Generator", 31);
1557 if (ret == (int)EINA_FALSE)
1559 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1563 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1564 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1565 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1566 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1567 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1568 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1570 while (!_eflutil.wl.devmgr.devicemgr)
1571 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1573 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1575 while (_eflutil.wl.devmgr.request_notified == -1)
1576 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1578 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1579 _eflutil.wl.devmgr.request_notified = -1;
1581 if (ret == EFL_UTIL_ERROR_NONE)
1583 _efl_util_input_initialize_add_wait_device(inputgen_h->name, dev_type);
1584 _efl_util_input_initialize_wait_device();
1585 if (_eflutil.wl.devmgr.request_notified != -1)
1587 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1588 _eflutil.wl.devmgr.request_notified = -1;
1592 set_last_result(ret);
1593 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1608 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
1610 int ret = EFL_UTIL_ERROR_NONE;
1611 unsigned int clas = 0x0;
1612 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1614 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1615 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1616 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1617 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1618 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1619 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1624 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1626 tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
1628 while (_eflutil.wl.devmgr.request_notified == -1)
1629 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1631 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1632 _eflutil.wl.devmgr.request_notified = -1;
1638 efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name, int pressed)
1640 int ret = EFL_UTIL_ERROR_NONE;
1642 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1643 EINA_SAFETY_ON_NULL_RETURN_VAL(key_name, EFL_UTIL_ERROR_INVALID_PARAMETER);
1644 EINA_SAFETY_ON_FALSE_RETURN_VAL(pressed == 0 || pressed == 1, EFL_UTIL_ERROR_INVALID_PARAMETER);
1645 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1647 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1649 tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
1651 while (_eflutil.wl.devmgr.request_notified == -1)
1652 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1654 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1655 _eflutil.wl.devmgr.request_notified = -1;
1661 efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
1662 efl_util_input_touch_type_e touch_type, int x, int y)
1665 enum tizen_input_device_manager_pointer_event_type type;
1667 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1668 EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1669 EINA_SAFETY_ON_FALSE_RETURN_VAL((x > 0 && y > 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1670 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1672 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1676 case EFL_UTIL_INPUT_TOUCH_BEGIN:
1677 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1679 case EFL_UTIL_INPUT_TOUCH_UPDATE:
1680 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1682 case EFL_UTIL_INPUT_TOUCH_END:
1683 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1686 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1689 tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1691 while (_eflutil.wl.devmgr.request_notified == -1)
1692 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1694 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1695 _eflutil.wl.devmgr.request_notified = -1;
1701 efl_util_input_generate_pointer(efl_util_inputgen_h inputgen_h, int buttons, efl_util_input_pointer_type_e pointer_type, int x, int y)
1704 enum tizen_input_device_manager_pointer_event_type type;
1706 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1707 EINA_SAFETY_ON_FALSE_RETURN_VAL(buttons > 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1708 EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1709 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1711 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1713 switch(pointer_type)
1715 case EFL_UTIL_INPUT_POINTER_BUTTON_DOWN:
1716 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1718 case EFL_UTIL_INPUT_POINTER_MOVE:
1719 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1721 case EFL_UTIL_INPUT_POINTER_BUTTON_UP:
1722 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1725 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1728 tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
1730 while (_eflutil.wl.devmgr.request_notified == -1)
1731 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1733 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1734 _eflutil.wl.devmgr.request_notified = -1;
1740 struct _efl_util_screenshot_h
1745 Eina_Bool shot_done;
1750 Eina_Bool auto_rotation;
1753 /* scrrenshot handle */
1754 static efl_util_screenshot_h g_screenshot;
1755 static Eina_Bool shot_mutex_init;
1756 static pthread_mutex_t shot_lock;
1759 _screenshot_mutex_init(void)
1761 if (shot_mutex_init)
1764 if (pthread_mutex_init(&shot_lock, NULL))
1766 fprintf(stderr, "[screenshot] fail: mutex init"); /*LCOV_EXCL_LINE*/
1767 return EINA_FALSE; /*LCOV_EXCL_LINE*/
1770 shot_mutex_init = EINA_TRUE;
1776 _screenshot_mutex_destory(void)
1778 if (!shot_mutex_init)
1781 if (pthread_mutex_destroy(&shot_lock))
1783 fprintf(stderr, "[screenshot] fail: mutex destory"); /*LCOV_EXCL_LINE*/
1784 return EINA_FALSE; /*LCOV_EXCL_LINE*/
1787 shot_mutex_init = EINA_FALSE;
1793 _screenshot_mutex_lock(void)
1795 if (!_screenshot_mutex_init())
1798 pthread_mutex_lock(&shot_lock);
1802 _screenshot_mutex_unlock(void)
1804 pthread_mutex_unlock(&shot_lock);
1807 API efl_util_screenshot_h
1808 efl_util_screenshot_initialize(int width, int height)
1810 efl_util_screenshot_h screenshot = NULL;
1811 struct wl_display *display_wrapper = NULL;
1812 struct wl_registry *reg = NULL;
1815 if (width <= 0 || height <= 0)
1817 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1821 _screenshot_mutex_lock();
1825 screenshot = calloc(1, sizeof(struct _efl_util_screenshot_h));
1826 EINA_SAFETY_ON_NULL_GOTO(screenshot, fail_memory);
1829 if (!_eflutil.wl.shot.screenshooter)
1832 if (ret == (int)EINA_FALSE)
1834 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1835 _screenshot_mutex_unlock();
1838 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1840 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
1841 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail_memory);
1843 _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
1844 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_memory);
1846 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
1848 reg = wl_display_get_registry(display_wrapper);
1849 wl_proxy_wrapper_destroy(display_wrapper);
1850 display_wrapper = NULL;
1851 EINA_SAFETY_ON_NULL_GOTO(reg, fail_init);
1853 wl_registry_add_listener(reg, &_wl_reg_screenshooter_listener, NULL);
1855 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
1856 EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_init);
1857 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.screenshooter, fail_init);
1858 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tz_screenshooter, fail_init);
1860 _eflutil.wl.shot.tbm_client = wayland_tbm_client_init(_eflutil.wl.dpy);
1861 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tbm_client, fail_init);
1863 wl_registry_destroy(reg);
1867 if (_eflutil.wl.shot.noti == 0)
1869 fprintf(stderr, "[screenshot] fail: privilege error\n"); /* LCOV_EXCL_LINE */
1875 if (g_screenshot->width != width || g_screenshot->height != height)
1877 g_screenshot->width = width;
1878 g_screenshot->height = height;
1880 set_last_result(EFL_UTIL_ERROR_NONE);
1882 _screenshot_mutex_unlock();
1884 return g_screenshot;
1887 screenshot->width = width;
1888 screenshot->height = height;
1889 screenshot->auto_rotation = EINA_TRUE;
1891 screenshot->bufmgr = wayland_tbm_client_get_bufmgr(_eflutil.wl.shot.tbm_client);
1892 EINA_SAFETY_ON_NULL_GOTO(screenshot->bufmgr, fail_init);
1894 g_screenshot = screenshot;
1895 set_last_result(EFL_UTIL_ERROR_NONE);
1897 screenshooter_set_user_data(_eflutil.wl.shot.screenshooter, &screenshot->shot_done);
1899 _screenshot_mutex_unlock();
1901 return g_screenshot;
1903 /* LCOV_EXCL_START */
1905 if (display_wrapper)
1906 wl_proxy_wrapper_destroy(display_wrapper);
1907 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1908 _screenshot_mutex_unlock();
1913 wl_registry_destroy(reg);
1916 _screenshot_mutex_unlock();
1917 efl_util_screenshot_deinitialize(screenshot);
1919 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1921 /* LCOV_EXCL_STOP */
1925 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
1927 _screenshot_mutex_lock();
1931 _screenshot_mutex_unlock();
1932 _screenshot_mutex_destory();
1933 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1937 g_screenshot = NULL;
1939 if (_eflutil.wl.shot.tbm_client)
1941 wayland_tbm_client_deinit(_eflutil.wl.shot.tbm_client);
1942 _eflutil.wl.shot.tbm_client = NULL;
1945 if (_eflutil.wl.shot.screenshooter)
1947 screenshooter_destroy(_eflutil.wl.shot.screenshooter);
1948 _eflutil.wl.shot.screenshooter = NULL;
1950 if (_eflutil.wl.shot.tz_screenshooter)
1952 tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1953 _eflutil.wl.shot.tz_screenshooter = NULL;
1956 if (_eflutil.wl.shot.queue)
1958 wl_event_queue_destroy(_eflutil.wl.shot.queue);
1959 _eflutil.wl.shot.queue = NULL;
1962 _screenshot_mutex_unlock();
1963 _screenshot_mutex_destory();
1965 return EFL_UTIL_ERROR_NONE;
1970 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
1972 tbm_surface_h t_surface = NULL;
1973 struct wl_buffer *buffer = NULL;
1974 Efl_Util_Wl_Output_Info *output;
1977 _screenshot_mutex_lock();
1979 if (!screenshot || (screenshot != g_screenshot))
1981 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1982 _screenshot_mutex_unlock();
1986 output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
1989 fprintf(stderr, "[screenshot] fail: no output for screenshot\n"); /* LCOV_EXCL_LINE */
1993 t_surface = tbm_surface_create(screenshot->width, screenshot->height, TBM_FORMAT_XRGB8888);
1996 fprintf(stderr, "[screenshot] fail: tbm_surface_create\n"); /* LCOV_EXCL_LINE */
2000 buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, t_surface);
2003 fprintf(stderr, "[screenshot] fail: create wl_buffer for screenshot\n"); /* LCOV_EXCL_LINE */
2007 screenshooter_shoot(_eflutil.wl.shot.screenshooter, output->output, buffer);
2009 screenshot->shot_done = EINA_FALSE;
2010 while (!screenshot->shot_done && ret != -1)
2011 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2015 fprintf(stderr, "[screenshot] fail: screenshooter_shoot\n"); /* LCOV_EXCL_LINE */
2019 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2021 /* reset shot_done for next screenshot */
2022 screenshot->shot_done = EINA_FALSE;
2024 set_last_result(EFL_UTIL_ERROR_NONE);
2026 _screenshot_mutex_unlock();
2032 tbm_surface_destroy(t_surface);
2034 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2036 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL);
2038 _screenshot_mutex_unlock();
2043 /* LCOV_EXCL_START */
2045 efl_util_screenshot_set_auto_rotation(efl_util_screenshot_h screenshot, int set)
2047 if (!screenshot || (screenshot != g_screenshot))
2048 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2050 if (!(set == 0 || set == 1))
2051 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2054 g_screenshot->auto_rotation = EINA_TRUE;
2056 g_screenshot->auto_rotation = EINA_FALSE;
2058 tizen_screenshooter_set_oneshot_auto_rotation(_eflutil.wl.shot.tz_screenshooter, g_screenshot->auto_rotation);
2060 return EFL_UTIL_ERROR_NONE;
2064 efl_util_screenshot_get_auto_rotation(efl_util_screenshot_h screenshot, int *set)
2066 if (!screenshot || (screenshot != g_screenshot) || !set)
2067 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2069 *set = g_screenshot->auto_rotation;
2071 return EFL_UTIL_ERROR_NONE;
2073 /* LCOV_EXCL_STOP */
2075 struct _efl_util_gesture_h
2080 API int EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2081 API int EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2082 API int EFL_UTIL_EVENT_GESTURE_TAP = 0;
2083 API int EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2085 /* LCOV_EXCL_START */
2087 _cb_gesture_edge_swipe_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t fingers EINA_UNUSED, uint32_t edge EINA_UNUSED, uint32_t edge_size EINA_UNUSED, uint32_t start_point EINA_UNUSED, uint32_t end_point EINA_UNUSED, uint32_t error)
2089 _eflutil.wl.gesture.request_notified = error;
2093 _cb_gesture_edge_swipe(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, int sx, int sy, uint32_t edge)
2095 efl_util_event_gesture_edge_swipe_s *ev = NULL;
2097 ev = (efl_util_event_gesture_edge_swipe_s *)calloc(1, sizeof(*ev));
2102 ev->fingers = fingers;
2107 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE, ev, NULL, NULL);
2111 _cb_gesture_edge_drag_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t fingers EINA_UNUSED, uint32_t edge EINA_UNUSED, uint32_t edge_size EINA_UNUSED, uint32_t start_point EINA_UNUSED, uint32_t end_point EINA_UNUSED, uint32_t error)
2113 _eflutil.wl.gesture.request_notified = error;
2117 _cb_gesture_edge_drag(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, int cx, int cy, uint32_t edge)
2119 efl_util_event_gesture_edge_drag_s *ev = NULL;
2121 ev = (efl_util_event_gesture_edge_drag_s *)calloc(1, sizeof(*ev));
2126 ev->fingers = fingers;
2131 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_DRAG, ev, NULL, NULL);
2135 _cb_gesture_tap_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t fingers EINA_UNUSED, uint32_t repeat EINA_UNUSED, uint32_t error)
2137 _eflutil.wl.gesture.request_notified = error;
2141 _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats)
2143 efl_util_event_gesture_tap_s *ev = NULL;
2145 ev = (efl_util_event_gesture_tap_s *)calloc(1, sizeof(*ev));
2150 ev->fingers = fingers;
2151 ev->repeats = repeats;
2153 ecore_event_add(EFL_UTIL_EVENT_GESTURE_TAP, ev, NULL, NULL);
2155 /* LCOV_EXCL_STOP */
2158 _cb_gesture_palm_cover_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, struct wl_surface *surface EINA_UNUSED, uint32_t error)
2160 _eflutil.wl.gesture.request_notified = error;
2163 /* LCOV_EXCL_START */
2165 _cb_gesture_palm_cover(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, struct wl_surface *surface, uint32_t mode, uint32_t duration, int cx, int cy, uint32_t size, wl_fixed_t pressure)
2167 efl_util_event_gesture_palm_cover_s *ev = NULL;
2169 ev = (efl_util_event_gesture_palm_cover_s *)calloc(1, sizeof(*ev));
2174 ev->duration = duration;
2178 ev->pressure = wl_fixed_to_int(pressure);
2180 ecore_event_add(EFL_UTIL_EVENT_GESTURE_PALM_COVER, ev, NULL, NULL);
2182 /* LCOV_EXCL_STOP */
2185 _cb_gesture_activate_notify(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, struct wl_surface *surface EINA_UNUSED, uint32_t type EINA_UNUSED, uint32_t active EINA_UNUSED, uint32_t error)
2187 _eflutil.wl.gesture.request_notified = error;
2190 static efl_util_error_e
2191 _efl_util_gesture_convert_error(int ret)
2195 case TIZEN_GESTURE_ERROR_NONE:
2196 return EFL_UTIL_ERROR_NONE;
2197 case TIZEN_GESTURE_ERROR_INVALID_DATA:
2198 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2199 case TIZEN_GESTURE_ERROR_NO_PERMISSION:
2200 return EFL_UTIL_ERROR_PERMISSION_DENIED;
2201 case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
2202 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
2203 case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
2204 return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
2205 case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
2206 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2208 return EFL_UTIL_ERROR_NONE;
2212 /* LCOV_EXCL_START */
2214 _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data)
2216 int ret = EFL_UTIL_ERROR_NONE;
2217 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2218 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2219 unsigned int fingers = 0;
2220 unsigned int edge = 0;
2221 unsigned int edge_size = 0;
2222 unsigned int start_point = 0;
2223 unsigned int end_point = 0;
2225 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2227 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2228 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2229 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2230 EFL_UTIL_ERROR_INVALID_PARAMETER);
2232 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2234 fingers = edge_swipe_data->fingers;
2235 edge = edge_swipe_data->edge;
2236 edge_size = edge_swipe_data->edge_size;
2237 start_point = edge_swipe_data->start_point;
2238 end_point = edge_swipe_data->end_point;
2240 tizen_gesture_grab_edge_swipe(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2242 while (_eflutil.wl.gesture.request_notified == -1)
2243 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2245 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2246 _eflutil.wl.gesture.request_notified = -1;
2252 _efl_util_gesture_ungrab_edge_swipe(efl_util_gesture_data data)
2254 int ret = EFL_UTIL_ERROR_NONE;
2255 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2256 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2257 unsigned int fingers = 0;
2258 unsigned int edge = 0;
2259 unsigned int edge_size = 0;
2260 unsigned int start_point = 0;
2261 unsigned int end_point = 0;
2263 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2265 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2266 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2267 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2268 EFL_UTIL_ERROR_INVALID_PARAMETER);
2270 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2272 fingers = edge_swipe_data->fingers;
2273 edge = edge_swipe_data->edge;
2274 edge_size = edge_swipe_data->edge_size;
2275 start_point = edge_swipe_data->start_point;
2276 end_point = edge_swipe_data->end_point;
2278 tizen_gesture_ungrab_edge_swipe(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2280 while (_eflutil.wl.gesture.request_notified == -1)
2281 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2283 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2284 _eflutil.wl.gesture.request_notified = -1;
2290 _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data)
2292 int ret = EFL_UTIL_ERROR_NONE;
2293 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2294 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2295 unsigned int fingers = 0;
2296 unsigned int edge = 0;
2297 unsigned int edge_size = 0;
2298 unsigned int start_point = 0;
2299 unsigned int end_point = 0;
2301 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2303 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2304 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2305 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2306 EFL_UTIL_ERROR_INVALID_PARAMETER);
2308 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2310 fingers = edge_drag_data->fingers;
2311 edge = edge_drag_data->edge;
2312 edge_size = edge_drag_data->edge_size;
2313 start_point = edge_drag_data->start_point;
2314 end_point = edge_drag_data->end_point;
2316 tizen_gesture_grab_edge_drag(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2318 while (_eflutil.wl.gesture.request_notified == -1)
2319 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2321 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2322 _eflutil.wl.gesture.request_notified = -1;
2328 _efl_util_gesture_ungrab_edge_drag(efl_util_gesture_data data)
2330 int ret = EFL_UTIL_ERROR_NONE;
2331 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2332 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2333 unsigned int fingers = 0;
2334 unsigned int edge = 0;
2335 unsigned int edge_size = 0;
2336 unsigned int start_point = 0;
2337 unsigned int end_point = 0;
2339 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2341 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2342 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2343 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2344 EFL_UTIL_ERROR_INVALID_PARAMETER);
2346 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2348 fingers = edge_drag_data->fingers;
2349 edge = edge_drag_data->edge;
2350 edge_size = edge_drag_data->edge_size;
2351 start_point = edge_drag_data->start_point;
2352 end_point = edge_drag_data->end_point;
2354 tizen_gesture_ungrab_edge_drag(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2356 while (_eflutil.wl.gesture.request_notified == -1)
2357 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2359 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2360 _eflutil.wl.gesture.request_notified = -1;
2367 _efl_util_gesture_grab_tap(efl_util_gesture_data data)
2369 int ret = EFL_UTIL_ERROR_NONE;
2370 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2371 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2372 unsigned int fingers = 0;
2373 unsigned int repeats = 0;
2375 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2377 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2378 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2379 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2380 EFL_UTIL_ERROR_INVALID_PARAMETER);
2382 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2384 fingers = tap_data->fingers;
2385 repeats = tap_data->repeats;
2387 tizen_gesture_grab_tap(_eflutil.wl.gesture.proto, fingers, repeats);
2389 while (_eflutil.wl.gesture.request_notified == -1)
2390 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2392 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2393 _eflutil.wl.gesture.request_notified = -1;
2399 _efl_util_gesture_ungrab_tap(efl_util_gesture_data data)
2401 int ret = EFL_UTIL_ERROR_NONE;
2402 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2403 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2404 unsigned int fingers = 0;
2405 unsigned int repeats = 0;
2407 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2409 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2410 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2411 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2412 EFL_UTIL_ERROR_INVALID_PARAMETER);
2414 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2416 fingers = tap_data->fingers;
2417 repeats = tap_data->repeats;
2419 tizen_gesture_ungrab_tap(_eflutil.wl.gesture.proto, fingers, repeats);
2421 while (_eflutil.wl.gesture.request_notified == -1)
2422 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2424 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2425 _eflutil.wl.gesture.request_notified = -1;
2431 _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data)
2433 int ret = EFL_UTIL_ERROR_NONE;
2434 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2436 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2438 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2439 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2440 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2441 EFL_UTIL_ERROR_INVALID_PARAMETER);
2443 tizen_gesture_grab_palm_cover(_eflutil.wl.gesture.proto);
2445 while (_eflutil.wl.gesture.request_notified == -1)
2446 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2448 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2449 _eflutil.wl.gesture.request_notified = -1;
2455 _efl_util_gesture_ungrab_palm_cover(efl_util_gesture_data data)
2457 int ret = EFL_UTIL_ERROR_NONE;
2458 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2460 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2462 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2463 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2464 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2465 EFL_UTIL_ERROR_INVALID_PARAMETER);
2467 tizen_gesture_ungrab_palm_cover(_eflutil.wl.gesture.proto);
2469 while (_eflutil.wl.gesture.request_notified == -1)
2470 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2472 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2473 _eflutil.wl.gesture.request_notified = -1;
2479 _efl_util_fd_cb(void *data, Ecore_Fd_Handler *hdl)
2481 if (_eflutil.wl.dpy && _eflutil.wl.queue)
2483 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2484 return ECORE_CALLBACK_RENEW;
2488 return ECORE_CALLBACK_CANCEL;
2491 /* LCOV_EXCL_STOP */
2493 API efl_util_gesture_h
2494 efl_util_gesture_initialize(void)
2496 efl_util_gesture_h gesture_h = NULL;
2499 gesture_h = (efl_util_gesture_h)calloc(1, sizeof(struct _efl_util_gesture_h));
2502 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2503 goto out; /* LCOV_EXCL_LINE */
2506 if (_wl_init() == (int)EINA_FALSE)
2508 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2509 goto out; /* LCOV_EXCL_LINE */
2512 while (!_eflutil.wl.gesture.proto)
2513 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); /* LCOV_EXCL_LINE */
2515 if (_eflutil.wl.gesture.event_init <= 0)
2517 if (ecore_event_init() <= 0)
2519 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2520 goto out; /* LCOV_EXCL_LINE */
2522 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = ecore_event_type_new();
2523 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = ecore_event_type_new();
2524 EFL_UTIL_EVENT_GESTURE_TAP = ecore_event_type_new();
2525 EFL_UTIL_EVENT_GESTURE_PALM_COVER = ecore_event_type_new();
2527 dpy_fd = wl_display_get_fd(_eflutil.wl.dpy);
2528 _eflutil.wl.dpy_fd = fcntl(dpy_fd, F_DUPFD_CLOEXEC, 0);
2529 if (_eflutil.wl.dpy_fd >= 0)
2530 _eflutil.wl.fd_hdl = ecore_main_fd_handler_add(_eflutil.wl.dpy_fd,
2531 ECORE_FD_READ | ECORE_FD_WRITE | ECORE_FD_ERROR,
2532 _efl_util_fd_cb, NULL,
2535 _eflutil.wl.gesture.event_init++;
2536 gesture_h->init = EINA_TRUE;
2538 set_last_result(EFL_UTIL_ERROR_NONE);
2542 /* LCOV_EXCL_START */
2549 /* LCOV_EXCL_STOP */
2553 efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
2555 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2556 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2561 _eflutil.wl.gesture.event_init--;
2563 if (_eflutil.wl.gesture.event_init <= 0)
2565 _eflutil.wl.gesture.event_init = 0;
2566 ecore_event_shutdown();
2567 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2568 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2569 EFL_UTIL_EVENT_GESTURE_TAP = 0;
2570 EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2571 if (_eflutil.wl.dpy_fd >= 0)
2573 ecore_main_fd_handler_del(_eflutil.wl.fd_hdl);
2574 _eflutil.wl.fd_hdl = NULL;
2575 close(_eflutil.wl.dpy_fd);
2576 _eflutil.wl.dpy_fd = -1;
2580 return EFL_UTIL_ERROR_NONE;
2583 API efl_util_gesture_data
2584 efl_util_gesture_edge_swipe_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2586 Efl_Util_Gesture_Edge_Swipe_Grab_Data *data;
2588 if (!gesture_h || gesture_h->init == EINA_FALSE)
2590 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2594 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2596 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2600 data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Swipe_Grab_Data));
2603 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2604 return NULL; /* LCOV_EXCL_LINE */
2607 data->base.type = TIZEN_GESTURE_TYPE_EDGE_SWIPE;
2608 data->fingers = fingers;
2610 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2612 set_last_result(EFL_UTIL_ERROR_NONE);
2614 return (void *)data;
2618 efl_util_gesture_edge_swipe_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2620 if (!gesture_h || gesture_h->init == EINA_FALSE)
2622 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2627 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2633 return EFL_UTIL_ERROR_NONE;
2637 efl_util_gesture_edge_swipe_size_set(efl_util_gesture_data data, efl_util_gesture_edge_size_e edge_size, unsigned int start_point, unsigned int end_point)
2639 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = data;
2641 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_swipe_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2642 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_swipe_data->base.type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2643 EFL_UTIL_ERROR_INVALID_PARAMETER);
2644 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2645 EFL_UTIL_ERROR_INVALID_PARAMETER);
2646 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2648 edge_swipe_data->edge_size = edge_size;
2649 edge_swipe_data->start_point = start_point;
2650 edge_swipe_data->end_point = end_point;
2652 return EFL_UTIL_ERROR_NONE;
2655 API efl_util_gesture_data
2656 efl_util_gesture_edge_drag_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2658 Efl_Util_Gesture_Edge_Drag_Grab_Data *data;
2660 if (!gesture_h || gesture_h->init == EINA_FALSE)
2662 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2666 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2668 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2672 data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Drag_Grab_Data));
2675 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2676 return NULL; /* LCOV_EXCL_LINE */
2679 data->base.type = TIZEN_GESTURE_TYPE_EDGE_DRAG;
2680 data->fingers = fingers;
2682 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2684 set_last_result(EFL_UTIL_ERROR_NONE);
2686 return (void *)data;
2690 efl_util_gesture_edge_drag_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2692 if (!gesture_h || gesture_h->init == EINA_FALSE)
2694 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2699 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2705 return EFL_UTIL_ERROR_NONE;
2709 efl_util_gesture_edge_drag_size_set(efl_util_gesture_data data, efl_util_gesture_edge_size_e edge_size, unsigned int start_point, unsigned int end_point)
2711 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = data;
2713 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_drag_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2714 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_drag_data->base.type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2715 EFL_UTIL_ERROR_INVALID_PARAMETER);
2716 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2717 EFL_UTIL_ERROR_INVALID_PARAMETER);
2718 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2720 edge_drag_data->edge_size = edge_size;
2721 edge_drag_data->start_point = start_point;
2722 edge_drag_data->end_point = end_point;
2724 return EFL_UTIL_ERROR_NONE;
2727 API efl_util_gesture_data
2728 efl_util_gesture_tap_new(efl_util_gesture_h gesture_h, unsigned int fingers, unsigned int repeats)
2730 Efl_Util_Gesture_Tap_Grab_Data *data;
2732 if (!gesture_h || gesture_h->init == EINA_FALSE)
2734 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2738 if (fingers <= 1 || repeats <= 1)
2740 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED);
2744 data = (Efl_Util_Gesture_Tap_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Tap_Grab_Data));
2747 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2748 return NULL; /* LCOV_EXCL_LINE */
2751 data->base.type = TIZEN_GESTURE_TYPE_TAP;
2752 data->fingers = fingers;
2753 data->repeats = repeats;
2755 set_last_result(EFL_UTIL_ERROR_NONE);
2757 return (void *)data;
2761 efl_util_gesture_tap_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2763 if (!gesture_h || gesture_h->init == EINA_FALSE)
2765 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2770 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2776 return EFL_UTIL_ERROR_NONE;
2779 API efl_util_gesture_data
2780 efl_util_gesture_palm_cover_new(efl_util_gesture_h gesture_h)
2782 Efl_Util_Gesture_Palm_Cover_Grab_Data *data;
2784 if (!gesture_h || gesture_h->init == EINA_FALSE)
2786 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2790 data = (Efl_Util_Gesture_Palm_Cover_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Palm_Cover_Grab_Data));
2793 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2794 return NULL; /* LCOV_EXCL_LINE */
2797 data->base.type = TIZEN_GESTURE_TYPE_PALM_COVER;
2799 set_last_result(EFL_UTIL_ERROR_NONE);
2801 return (void *)data;
2805 efl_util_gesture_palm_cover_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2807 if (!gesture_h || gesture_h->init == EINA_FALSE)
2809 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2814 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2820 return EFL_UTIL_ERROR_NONE;
2823 /* LCOV_EXCL_START */
2825 efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2827 int ret = EFL_UTIL_ERROR_NONE;
2828 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2830 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2832 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2833 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2834 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2836 switch (base_data->type)
2838 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
2839 ret = _efl_util_gesture_grab_edge_swipe(data);
2841 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
2842 ret = _efl_util_gesture_grab_edge_drag(data);
2844 case TIZEN_GESTURE_TYPE_TAP:
2845 ret = _efl_util_gesture_grab_tap(data);
2847 case TIZEN_GESTURE_TYPE_PALM_COVER:
2848 ret = _efl_util_gesture_grab_palm_cover(data);
2851 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2858 efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2860 int ret = EFL_UTIL_ERROR_NONE;
2861 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2863 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2865 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2866 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2867 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2869 switch (base_data->type)
2871 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
2872 ret = _efl_util_gesture_ungrab_edge_swipe(data);
2874 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
2875 ret = _efl_util_gesture_ungrab_edge_drag(data);
2877 case TIZEN_GESTURE_TYPE_TAP:
2878 ret = _efl_util_gesture_ungrab_tap(data);
2880 case TIZEN_GESTURE_TYPE_PALM_COVER:
2881 ret = _efl_util_gesture_ungrab_palm_cover(data);
2884 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2889 /* LCOV_EXCL_STOP */
2892 efl_util_gesture_select(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
2894 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2895 Ecore_Wl2_Window *wlwin;
2896 struct wl_surface *surface;
2899 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2901 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2902 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2903 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
2904 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2906 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
2907 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2909 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
2910 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
2912 surface = ecore_wl2_window_surface_get(wlwin);
2913 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
2914 EFL_UTIL_ERROR_INVALID_PARAMETER);
2916 tizen_gesture_select_palm_cover(_eflutil.wl.gesture.proto, surface);
2918 while (_eflutil.wl.gesture.request_notified == -1)
2919 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2921 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2922 _eflutil.wl.gesture.request_notified = -1;
2928 efl_util_gesture_deselect(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
2930 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2931 Ecore_Wl2_Window *wlwin;
2932 struct wl_surface *surface;
2935 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2937 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2938 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2939 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
2940 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2942 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
2943 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2945 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
2946 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
2948 surface = ecore_wl2_window_surface_get(wlwin);
2949 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
2950 EFL_UTIL_ERROR_INVALID_PARAMETER);
2952 tizen_gesture_deselect_palm_cover(_eflutil.wl.gesture.proto, surface);
2954 while (_eflutil.wl.gesture.request_notified == -1)
2955 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2957 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2958 _eflutil.wl.gesture.request_notified = -1;
2963 /* LCOV_EXCL_START */
2965 efl_util_gesture_activate_set(efl_util_gesture_h gesture_h, unsigned int type, Eina_Bool active)
2969 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2970 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2971 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
2973 tizen_gesture_activate_set(_eflutil.wl.gesture.proto, NULL, type, active);
2975 while (_eflutil.wl.gesture.request_notified == -1)
2976 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2978 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2979 _eflutil.wl.gesture.request_notified = -1;
2983 /* LCOV_EXCL_STOP */
2986 efl_util_gesture_activate_set_on_window(efl_util_gesture_h gesture_h, Evas_Object *window, unsigned int type, Eina_Bool active)
2988 Ecore_Wl2_Window *wlwin;
2989 struct wl_surface *surface;
2992 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2993 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2994 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
2995 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
2997 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
2998 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3000 surface = ecore_wl2_window_surface_get(wlwin);
3001 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3002 EFL_UTIL_ERROR_INVALID_PARAMETER);
3004 tizen_gesture_activate_set(_eflutil.wl.gesture.proto, surface, type, active);
3006 while (_eflutil.wl.gesture.request_notified == -1)
3007 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
3009 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
3010 _eflutil.wl.gesture.request_notified = -1;