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
98 #define EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER 10
100 typedef struct _Efl_Util_Wl_Surface_Lv_Info
102 void *surface; /* wl_surface */
104 Eina_Bool wait_for_done;
106 } Efl_Util_Wl_Surface_Lv_Info;
108 typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
110 void *surface; /* wl_surface */
112 Eina_Bool wait_for_done;
114 } Efl_Util_Wl_Surface_Scr_Mode_Info;
116 typedef struct _Efl_Util_Wl_Surface_Brightness_Info
118 void *surface; /* wl_surface */
120 Eina_Bool wait_for_done;
122 } Efl_Util_Wl_Surface_Brightness_Info;
124 typedef struct _Efl_Util_Wl_Output_Info
126 struct wl_output *output;
127 int offset_x, offset_y, width, height;
128 } Efl_Util_Wl_Output_Info;
130 typedef struct _Efl_Util_Gesture_Common_Grab_Data
133 } Efl_Util_Gesture_Common_Grab_Data;
135 typedef struct _Efl_Util_Gesture_Edge_Swipe_Grab_Data
137 Efl_Util_Gesture_Common_Grab_Data base;
139 unsigned int fingers;
140 efl_util_gesture_edge_e edge;
141 efl_util_gesture_edge_size_e edge_size;
142 unsigned int start_point;
143 unsigned int end_point;
144 } Efl_Util_Gesture_Edge_Swipe_Grab_Data;
146 typedef struct _Efl_Util_Gesture_Edge_Drag_Grab_Data
148 Efl_Util_Gesture_Common_Grab_Data base;
150 unsigned int fingers;
151 efl_util_gesture_edge_e edge;
152 efl_util_gesture_edge_size_e edge_size;
153 unsigned int start_point;
154 unsigned int end_point;
155 } Efl_Util_Gesture_Edge_Drag_Grab_Data;
157 typedef struct _Efl_Util_Gesture_Tap_Grab_Data
159 Efl_Util_Gesture_Common_Grab_Data base;
161 unsigned int fingers;
162 unsigned int repeats;
163 } Efl_Util_Gesture_Tap_Grab_Data;
165 typedef struct _Efl_Util_Gesture_Palm_Cover_Grab_Data
167 Efl_Util_Gesture_Common_Grab_Data base;
168 } Efl_Util_Gesture_Palm_Cover_Grab_Data;
170 typedef struct _Efl_Util_Device_Info
172 struct tizen_input_device *device;
173 Ecore_Device_Class clas;
174 Eina_Stringshare *name;
175 } Efl_Util_Device_Info;
177 typedef struct _E_Devicemgr_Inputgen_Touch_Axis
184 } E_Devicemgr_Inputgen_Touch_Axis;
186 typedef struct _Efl_Util_Data
188 /* wayland related stuffs */
192 Ecore_Wl2_Display *wl2_display;
193 struct wl_display *dpy;
194 struct wl_event_queue *queue;
199 struct tizen_policy *proto;
200 Eina_Hash *hash_noti_lv;
201 Eina_Hash *hash_scr_mode;
205 struct wl_event_queue *queue;
206 struct screenshooter *screenshooter;
207 struct tizen_screenshooter *tz_screenshooter;
208 struct wayland_tbm_client *tbm_client;
209 Eina_List *output_list;
214 struct tizen_input_device_manager *devicemgr;
215 int request_notified;
217 Eina_List *wait_devices;
218 struct wl_event_source *wait_timer;
220 int request_touch_count;
225 struct tizen_display_policy *proto;
226 Eina_Hash *hash_brightness;
231 typedef struct _Efl_Util_Data_Default_Queue
233 /* wayland related stuffs */
237 Ecore_Wl2_Display *wl2_display;
238 struct wl_display *dpy;
243 struct tizen_gesture *proto;
244 int request_notified;
248 } Efl_Util_Data_Default_Queue;
251 static Efl_Util_Data _eflutil =
256 { 0, NULL, NULL, NULL }, /* tizen_policy protocol */
257 { NULL, NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
258 { NULL, -1, NULL, NULL, NULL, 0, 0 }, /* tizen_input_device_manager protocol */
259 { 0, NULL, NULL } /* display_policy protocol */
263 static Efl_Util_Data_Default_Queue _eflutil_defaultqueue =
268 { 0, NULL, -1, 0 } /* gesture protocol */
273 static Eina_Bool _wl_init(void);
274 static Eina_Bool _wl_init_default_queue(void);
275 static void _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
276 static void _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
277 static void _cb_wl_default_queue_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
278 static void _cb_wl_default_queue_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
279 static void _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
280 static void _cb_wl_reg_screenshooter_global_remove(void *data, struct wl_registry *reg, unsigned int name);
281 static void _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t is_conformant);
282 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);
283 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);
284 static void _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id);
285 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);
286 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);
287 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);
288 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id);
289 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);
290 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);
292 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);
294 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);
295 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);
296 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);
298 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);
299 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);
300 static void _cb_error(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t errorcode);
301 static void _cb_block_expired(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED);
302 static void _cb_max_touch_count(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t serial EINA_UNUSED, int32_t max_count EINA_UNUSED, struct wl_seat *seat EINA_UNUSED);
304 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);
305 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);
306 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);
307 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);
308 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);
309 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);
310 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);
311 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);
312 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);
315 static const struct wl_registry_listener _wl_reg_listener =
318 _cb_wl_reg_global_remove
321 static const struct wl_registry_listener _wl_reg_screenshooter_listener =
323 _cb_wl_reg_screenshooter_global,
324 _cb_wl_reg_screenshooter_global_remove
327 struct tizen_policy_listener _wl_tz_policy_listener =
329 _cb_wl_tz_policy_conformant,
330 _cb_wl_tz_policy_conformant_area,
331 _cb_wl_tz_policy_notification_done,
332 _cb_wl_tz_policy_transient_for_done,
333 _cb_wl_tz_policy_scr_mode_done,
334 _cb_wl_tz_policy_iconify_state_changed,
335 _cb_wl_tz_policy_supported_aux_hints,
336 _cb_wl_tz_policy_allowed_aux_hint,
337 _cb_wl_tz_policy_aux_message,
338 _cb_wl_conformant_region,
341 static const struct tizen_input_device_listener _wl_tz_input_device_listener =
348 struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
357 struct tizen_display_policy_listener _wl_tz_display_policy_listener =
359 _cb_wl_tz_display_policy_brightness_done,
362 static const struct wl_registry_listener _wl_default_queue_reg_listener =
364 _cb_wl_default_queue_reg_global,
365 _cb_wl_default_queue_reg_global_remove
368 struct tizen_gesture_listener _wl_tz_gesture_listener =
370 _cb_gesture_edge_swipe_notify,
371 _cb_gesture_edge_swipe,
372 _cb_gesture_edge_drag_notify,
373 _cb_gesture_edge_drag,
374 _cb_gesture_tap_notify,
376 _cb_gesture_palm_cover_notify,
377 _cb_gesture_palm_cover,
378 _cb_gesture_activate_notify
384 struct wl_display *display_wrapper = NULL;
385 struct wl_registry *reg = NULL;
387 if (_eflutil.wl.init) return EINA_TRUE;
391 _eflutil.wl.wl2_display = ecore_wl2_display_connect(NULL);
392 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.wl2_display, fail);
393 _eflutil.wl.dpy = ecore_wl2_display_get(_eflutil.wl.wl2_display);
394 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.dpy, fail);
396 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
397 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
399 _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy);
400 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail);
402 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.queue);
404 reg = wl_display_get_registry(display_wrapper);
405 wl_proxy_wrapper_destroy(display_wrapper);
406 display_wrapper = NULL;
407 EINA_SAFETY_ON_NULL_GOTO(reg, fail);
409 wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
411 _eflutil.wl.init = EINA_TRUE;
416 wl_proxy_wrapper_destroy(display_wrapper);
418 if (_eflutil.wl.queue)
420 wl_event_queue_destroy(_eflutil.wl.queue);
421 _eflutil.wl.queue = NULL;
424 ecore_wl2_shutdown();
429 _wl_init_default_queue(void)
431 struct wl_display *display_wrapper = NULL;
432 struct wl_registry *reg = NULL;
434 if (_eflutil_defaultqueue.wl.init) return EINA_TRUE;
436 if (ecore_wl2_init() <= 0) return EINA_FALSE;
438 _eflutil_defaultqueue.wl.wl2_display = ecore_wl2_connected_display_get(NULL);
439 EINA_SAFETY_ON_NULL_GOTO(_eflutil_defaultqueue.wl.wl2_display, fail);
440 _eflutil_defaultqueue.wl.dpy = ecore_wl2_display_get(_eflutil_defaultqueue.wl.wl2_display);
441 EINA_SAFETY_ON_NULL_GOTO(_eflutil_defaultqueue.wl.dpy, fail);
443 display_wrapper = wl_proxy_create_wrapper(_eflutil_defaultqueue.wl.dpy);
444 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
446 reg = wl_display_get_registry(display_wrapper);
447 wl_proxy_wrapper_destroy(display_wrapper);
448 display_wrapper = NULL;
449 EINA_SAFETY_ON_NULL_GOTO(reg, fail);
451 wl_registry_add_listener(reg, &_wl_default_queue_reg_listener, NULL);
453 _eflutil_defaultqueue.wl.init = EINA_TRUE;
458 ecore_wl2_shutdown();
463 _cb_wl_output_geometry(void *data, struct wl_output *wl_output, int x, int y,
464 int physical_width, int physical_height, int subpixel,
465 const char *make, const char *model, int transform)
467 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
468 if (wl_output == output->output)
470 output->offset_x = x;
471 output->offset_y = y;
476 _cb_wl_output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
477 int width, int height, int refresh)
479 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
480 if (wl_output == output->output && (flags & WL_OUTPUT_MODE_CURRENT))
482 output->width = width;
483 output->height = height;
488 _cb_wl_output_done(void *data, struct wl_output *wl_output)
493 _cb_wl_output_scale(void *data, struct wl_output *wl_output, int32_t factor)
497 static const struct wl_output_listener output_listener =
499 _cb_wl_output_geometry,
506 _cb_wl_screenshot_done(void *data, struct screenshooter *screenshooter)
508 Eina_Bool *shot_done = (Eina_Bool*)data;
510 *shot_done = EINA_TRUE;
513 static const struct screenshooter_listener screenshooter_listener =
515 _cb_wl_screenshot_done
519 _cb_tz_screenshot_format(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t format)
524 _cb_tz_screenshot_noti(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t noti)
526 _eflutil.wl.shot.noti = noti;
529 static const struct tizen_screenshooter_listener tz_screenshooter_listener =
531 _cb_tz_screenshot_format,
532 _cb_tz_screenshot_noti
536 _cb_wl_reg_global(void *data,
537 struct wl_registry *reg,
539 const char *interface,
540 unsigned int version)
542 if (!strcmp(interface, "tizen_policy"))
544 struct tizen_policy *proto;
545 proto = wl_registry_bind(reg,
547 &tizen_policy_interface,
551 tizen_policy_add_listener(proto,
552 &_wl_tz_policy_listener,
555 _eflutil.wl.policy.hash_noti_lv = eina_hash_pointer_new(free);
556 _eflutil.wl.policy.hash_scr_mode = eina_hash_pointer_new(free);
557 _eflutil.wl.policy.proto = proto;
558 _eflutil.wl.policy.id = id;
560 else if (strcmp(interface, "wl_output") == 0)
562 Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info));
563 EINA_SAFETY_ON_NULL_RETURN(output);
565 _eflutil.wl.shot.output_list = eina_list_append(_eflutil.wl.shot.output_list, output);
567 output->output = wl_registry_bind(reg, id, &wl_output_interface, version);
568 wl_output_add_listener(output->output, &output_listener, output);
570 else if (strcmp(interface, "tizen_input_device_manager") == 0)
572 _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
573 tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
575 else if (!strcmp(interface, "tizen_display_policy"))
577 _eflutil.wl.display_policy.proto = wl_registry_bind(reg, id, &tizen_display_policy_interface, version);
578 if (!_eflutil.wl.display_policy.proto) return;
580 tizen_display_policy_add_listener(_eflutil.wl.display_policy.proto,
581 &_wl_tz_display_policy_listener,
584 _eflutil.wl.display_policy.hash_brightness = eina_hash_pointer_new(free);
585 _eflutil.wl.display_policy.id = id;
588 /* LCOV_EXCL_START */
590 _cb_wl_reg_global_remove(void *data,
591 struct wl_registry *reg,
594 /* unset each global id number to 0 since global id is started
595 * from number 1 on server side display structure
597 if (id == _eflutil.wl.policy.id)
599 _eflutil.wl.policy.id = 0;
600 _eflutil.wl.policy.proto = NULL;
601 eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
602 eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
604 else if (id == _eflutil.wl.display_policy.id)
606 _eflutil.wl.display_policy.id = 0;
607 _eflutil.wl.display_policy.proto = NULL;
608 eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
614 _cb_wl_default_queue_reg_global(void *data,
615 struct wl_registry *reg,
617 const char *interface,
618 unsigned int version)
620 if (strcmp(interface, "tizen_gesture") == 0)
622 _eflutil_defaultqueue.wl.gesture.id = id;
623 _eflutil_defaultqueue.wl.gesture.proto = wl_registry_bind(reg, id, &tizen_gesture_interface, version);
624 tizen_gesture_add_listener(_eflutil_defaultqueue.wl.gesture.proto, &_wl_tz_gesture_listener, NULL);
627 /* LCOV_EXCL_START */
629 _cb_wl_default_queue_reg_global_remove(void *data,
630 struct wl_registry *reg,
633 if (id == _eflutil_defaultqueue.wl.gesture.id)
635 _eflutil_defaultqueue.wl.gesture.id = 0;
636 _eflutil_defaultqueue.wl.gesture.proto = NULL;
643 _cb_wl_reg_screenshooter_global(void *data,
644 struct wl_registry *reg,
646 const char *interface,
647 unsigned int version)
649 if (strcmp(interface, "screenshooter") == 0)
651 _eflutil.wl.shot.screenshooter = wl_registry_bind(reg, name, &screenshooter_interface, version);
652 screenshooter_add_listener(_eflutil.wl.shot.screenshooter, &screenshooter_listener, NULL);
654 else if (strcmp(interface, "tizen_screenshooter") == 0)
656 _eflutil.wl.shot.tz_screenshooter = wl_registry_bind(reg, name, &tizen_screenshooter_interface, version);
657 tizen_screenshooter_add_listener(_eflutil.wl.shot.tz_screenshooter, &tz_screenshooter_listener, NULL);
659 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
663 /* LCOV_EXCL_START */
665 _cb_wl_reg_screenshooter_global_remove(void *data,
666 struct wl_registry *reg,
672 _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy,
673 struct wl_surface *surface, uint32_t is_conformant)
678 _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy,
679 struct wl_surface *surface, uint32_t conformant_part,
680 uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h)
686 _cb_wl_tz_policy_notification_done(void *data,
687 struct tizen_policy *tizen_policy,
688 struct wl_surface *surface,
692 Efl_Util_Wl_Surface_Lv_Info *lv_info;
694 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
697 lv_info->level = level;
698 lv_info->wait_for_done = EINA_FALSE;
699 lv_info->state = state;
703 /* LCOV_EXCL_START */
705 _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id)
711 _cb_wl_tz_policy_scr_mode_done(void *data,
712 struct tizen_policy *tizen_policy,
713 struct wl_surface *surface,
717 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
719 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
722 scr_mode_info->mode = mode;
723 scr_mode_info->wait_for_done = EINA_FALSE;
724 scr_mode_info->state = state;
728 /* LCOV_EXCL_START */
729 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)
733 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)
737 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id)
741 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)
744 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)
750 _cb_wl_tz_display_policy_brightness_done(void *data,
751 struct tizen_display_policy *tizen_display_policy,
752 struct wl_surface *surface,
756 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
758 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
761 brightness_info->brightness = brightness;
762 brightness_info->wait_for_done = EINA_FALSE;
763 brightness_info->state = state;
768 _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
770 Efl_Util_Wl_Surface_Lv_Info *lv_info;
773 if (EINA_UNLIKELY(!lv_info))
776 eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info);
780 efl_util_set_notification_window_level(Evas_Object *window,
781 efl_util_notification_level_e level)
785 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
786 EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) &&
787 (level <= EFL_UTIL_NOTIFICATION_LEVEL_TOP),
788 EFL_UTIL_ERROR_INVALID_PARAMETER);
791 Ecore_Wl2_Window *wlwin;
792 struct wl_surface *surface;
793 Efl_Util_Wl_Surface_Lv_Info *lv_info;
794 Ecore_Wl2_Window_Type wl_type;
797 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
799 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
800 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
802 type = elm_win_type_get(window);
803 if (type != ELM_WIN_NOTIFICATION)
805 wl_type = ecore_wl2_window_type_get(wlwin);
806 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
807 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
810 while (!_eflutil.wl.policy.proto)
811 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
813 surface = ecore_wl2_window_surface_get(wlwin);
814 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
815 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
817 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
820 lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
821 EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
823 lv_info->surface = surface;
824 lv_info->level = (int)level;
825 lv_info->wait_for_done = EINA_TRUE;
826 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
827 eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
831 evas_object_event_callback_add(window, EVAS_CALLBACK_DEL,
832 _cb_window_del, lv_info);
836 lv_info->level = (int)level;
837 lv_info->wait_for_done = EINA_TRUE;
838 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
842 tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
843 surface, (int)level);
845 if (lv_info->wait_for_done)
848 while (lv_info->wait_for_done && (count < 3))
850 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
851 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
855 if (lv_info->wait_for_done)
857 return EFL_UTIL_ERROR_INVALID_PARAMETER;
861 if (lv_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
863 return EFL_UTIL_ERROR_PERMISSION_DENIED;
868 return EFL_UTIL_ERROR_NONE;
872 efl_util_get_notification_window_level(Evas_Object *window,
873 efl_util_notification_level_e *level)
877 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
878 EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
881 Ecore_Wl2_Window *wlwin;
882 struct wl_surface *surface;
883 Efl_Util_Wl_Surface_Lv_Info *lv_info;
884 Ecore_Wl2_Window_Type wl_type;
887 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
889 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
890 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
892 type = elm_win_type_get(window);
893 if (type != ELM_WIN_NOTIFICATION)
895 wl_type = ecore_wl2_window_type_get(wlwin);
896 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
897 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
900 while (!_eflutil.wl.policy.proto)
901 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
903 surface = ecore_wl2_window_surface_get(wlwin);
904 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
905 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
907 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
910 if (lv_info->wait_for_done)
913 while ((lv_info->wait_for_done) && (count < 3))
915 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
916 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
920 if (lv_info->wait_for_done)
922 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
923 return EFL_UTIL_ERROR_INVALID_PARAMETER;
927 switch (lv_info->level)
929 case TIZEN_POLICY_LEVEL_NONE: *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE; break;
930 case TIZEN_POLICY_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
931 case TIZEN_POLICY_LEVEL_MEDIUM: *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM; break;
932 case TIZEN_POLICY_LEVEL_HIGH: *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH; break;
933 case TIZEN_POLICY_LEVEL_TOP: *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP; break;
934 default: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
935 return EFL_UTIL_ERROR_INVALID_PARAMETER;
937 return EFL_UTIL_ERROR_NONE;
940 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
942 return EFL_UTIL_ERROR_NONE;
946 efl_util_set_window_opaque_state(Evas_Object *window,
951 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
952 EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
953 EFL_UTIL_ERROR_INVALID_PARAMETER);
955 Ecore_Wl2_Window *wlwin;
956 struct wl_surface *surface;
958 if (!_eflutil.wl.policy.proto)
963 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
965 while (!_eflutil.wl.policy.proto && ret != -1)
966 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
968 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
971 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
973 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
975 surface = ecore_wl2_window_surface_get(wlwin);
977 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
979 tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
981 return EFL_UTIL_ERROR_NONE;
985 efl_util_set_window_screen_mode(Evas_Object *window,
986 efl_util_screen_mode_e mode)
988 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
989 EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
990 (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
991 EFL_UTIL_ERROR_INVALID_PARAMETER);
993 Ecore_Wl2_Window *wlwin;
994 struct wl_surface *surface;
995 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
999 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1001 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1004 while (!_eflutil.wl.policy.proto)
1005 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1007 surface = ecore_wl2_window_surface_get(wlwin);
1008 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1009 EFL_UTIL_ERROR_INVALID_PARAMETER);
1011 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
1014 scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
1015 EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1017 scr_mode_info->surface = surface;
1018 scr_mode_info->mode = (unsigned int)mode;
1019 scr_mode_info->wait_for_done = EINA_TRUE;
1020 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
1022 eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
1028 scr_mode_info->mode = (unsigned int)mode;
1029 scr_mode_info->wait_for_done = EINA_TRUE;
1030 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
1033 tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
1034 surface, (unsigned int)mode);
1035 if (scr_mode_info->wait_for_done)
1038 while (scr_mode_info->wait_for_done && (count < 3))
1040 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1041 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1045 if (scr_mode_info->wait_for_done)
1047 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1051 if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
1053 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1058 return EFL_UTIL_ERROR_NONE;
1061 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1065 efl_util_get_window_screen_mode(Evas_Object *window,
1066 efl_util_screen_mode_e *mode)
1068 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1069 EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
1071 Ecore_Wl2_Window *wlwin;
1072 struct wl_surface *surface;
1073 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
1077 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1079 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1082 while (!_eflutil.wl.policy.proto)
1083 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1085 surface = ecore_wl2_window_surface_get(wlwin);
1086 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1087 EFL_UTIL_ERROR_INVALID_PARAMETER);
1089 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
1092 if (scr_mode_info->wait_for_done)
1094 while (scr_mode_info->wait_for_done)
1096 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1097 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1101 switch (scr_mode_info->mode)
1103 case TIZEN_POLICY_MODE_DEFAULT: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; break;
1104 case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
1105 default: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1106 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1108 return EFL_UTIL_ERROR_NONE;
1112 *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1113 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1117 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1121 efl_util_set_window_brightness(Evas_Object *window, int brightness)
1123 Ecore_Wl2_Window *wlwin;
1124 struct wl_surface *surface;
1125 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1128 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1129 EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
1132 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1134 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1137 while (!_eflutil.wl.display_policy.proto)
1138 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1140 surface = ecore_wl2_window_surface_get(wlwin);
1141 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1142 EFL_UTIL_ERROR_INVALID_PARAMETER);
1144 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1145 if (!brightness_info)
1147 brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
1148 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1150 brightness_info->surface = surface;
1151 brightness_info->brightness = brightness;
1152 brightness_info->wait_for_done = EINA_TRUE;
1153 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1155 eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
1161 brightness_info->brightness = brightness;
1162 brightness_info->wait_for_done = EINA_TRUE;
1163 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1166 tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
1167 surface, brightness);
1168 if (brightness_info->wait_for_done)
1171 while (brightness_info->wait_for_done && (count < 3))
1173 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1174 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1178 if (brightness_info->wait_for_done)
1180 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1184 if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
1186 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1190 return EFL_UTIL_ERROR_NONE;
1193 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1197 efl_util_get_window_brightness(Evas_Object *window, int *brightness)
1199 Ecore_Wl2_Window *wlwin;
1200 struct wl_surface *surface;
1201 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1204 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1205 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
1208 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1210 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1211 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
1213 while (!_eflutil.wl.display_policy.proto)
1214 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1216 surface = ecore_wl2_window_surface_get(wlwin);
1217 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1218 EFL_UTIL_ERROR_INVALID_PARAMETER);
1220 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1221 if (brightness_info)
1223 if (brightness_info->wait_for_done)
1225 while (brightness_info->wait_for_done)
1227 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1228 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1231 *brightness = brightness_info->brightness;
1236 return EFL_UTIL_ERROR_NONE;
1240 struct _efl_util_inputgen_h
1242 unsigned int init_type;
1244 E_Devicemgr_Inputgen_Touch_Axis *axis_info;
1248 _efl_util_input_check_wait_device_full(void)
1250 Eina_List *l, *ll, *l_next;
1251 Efl_Util_Device_Info *dev, *wait_dev;
1254 wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
1255 if (wait_cnt <= 0) return EINA_TRUE;
1257 EINA_LIST_FOREACH(_eflutil.wl.devmgr.devices, l, dev)
1259 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, ll, l_next, wait_dev)
1261 if ((dev->clas == wait_dev->clas) &&
1262 (!strncmp(dev->name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
1264 eina_stringshare_del(wait_dev->name);
1265 _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, ll);
1269 if (wait_cnt <= 0) return EINA_TRUE;
1280 _efl_util_input_check_wait_device(const char *name, unsigned int type)
1282 Eina_List *l, *l_next;
1283 Efl_Util_Device_Info *wait_dev;
1286 wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
1287 if (wait_cnt <= 0) return EINA_TRUE;
1289 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, l, l_next, wait_dev)
1291 if ((type == wait_dev->clas) &&
1292 (!strncmp(name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
1294 eina_stringshare_del(wait_dev->name);
1295 _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, l);
1299 if (wait_cnt <= 0) return EINA_TRUE;
1309 _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)
1311 Efl_Util_Device_Info *dev;
1313 if (!(dev = data)) return;
1314 dev->clas = (Ecore_Device_Class)clas;
1315 dev->name = eina_stringshare_add(name);
1317 if (_eflutil.wl.devmgr.wait_timer &&
1318 _efl_util_input_check_wait_device(name, clas))
1320 wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
1321 _eflutil.wl.devmgr.wait_timer = NULL;
1325 /* LCOV_EXCL_START */
1327 _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)
1333 _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)
1337 /* LCOV_EXCL_STOP */
1340 _cb_device_add(void *data EINA_UNUSED,
1341 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1342 uint32_t serial EINA_UNUSED,
1343 const char *identifier EINA_UNUSED,
1344 struct tizen_input_device *device,
1345 struct wl_seat *seat EINA_UNUSED)
1347 Efl_Util_Device_Info *dev;
1349 EINA_SAFETY_ON_NULL_RETURN(device);
1351 dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
1352 EINA_SAFETY_ON_NULL_RETURN(dev);
1354 dev->device = device;
1355 tizen_input_device_add_listener(device, &_wl_tz_input_device_listener, dev);
1357 _eflutil.wl.devmgr.devices = eina_list_append(_eflutil.wl.devmgr.devices, dev);
1361 _cb_device_remove(void *data EINA_UNUSED,
1362 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1363 uint32_t serial EINA_UNUSED,
1364 const char *identifier EINA_UNUSED,
1365 struct tizen_input_device *device,
1366 struct wl_seat *seat EINA_UNUSED)
1368 Eina_List *l, *l_next;
1369 Efl_Util_Device_Info *dev;
1371 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.devices, l, l_next, dev)
1373 if (dev->device == device)
1375 if (dev->name) eina_stringshare_del(dev->name);
1376 tizen_input_device_release(dev->device);
1378 _eflutil.wl.devmgr.devices = eina_list_remove_list(_eflutil.wl.devmgr.devices, l);
1387 _cb_error(void *data EINA_UNUSED,
1388 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1391 _eflutil.wl.devmgr.request_notified = errorcode;
1394 /* LCOV_EXCL_START */
1396 _cb_block_expired(void *data EINA_UNUSED,
1397 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
1401 /* LCOV_EXCL_STOP */
1404 _cb_max_touch_count(void *data EINA_UNUSED,
1405 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1406 uint32_t serial EINA_UNUSED,
1408 struct wl_seat *seat EINA_UNUSED)
1410 _eflutil.wl.devmgr.max_touch_count = max_count;
1413 static efl_util_error_e
1414 _efl_util_input_convert_input_generator_error(int ret)
1418 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
1419 return EFL_UTIL_ERROR_NONE;
1420 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
1421 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1422 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
1423 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
1424 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
1425 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1426 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NOT_ALLOWED:
1427 return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
1429 return EFL_UTIL_ERROR_NONE;
1433 /* LCOV_EXCL_START */
1435 _timer_wait(void *data)
1437 Efl_Util_Device_Info *dev;
1439 _eflutil.wl.devmgr.request_notified = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES;
1441 if (eina_list_count(_eflutil.wl.devmgr.wait_devices) > 0)
1443 EINA_LIST_FREE(_eflutil.wl.devmgr.wait_devices, dev)
1445 eina_stringshare_del(dev->name);
1450 wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
1451 _eflutil.wl.devmgr.wait_timer = NULL;
1455 /* LCOV_EXCL_STOP */
1458 _efl_util_input_initialize_wait_device(void)
1460 struct wl_event_loop *loop;
1463 if (_efl_util_input_check_wait_device_full()) return;
1465 loop = wl_event_loop_create();
1466 _eflutil.wl.devmgr.wait_timer = wl_event_loop_add_timer(loop, _timer_wait, NULL);
1467 if (_eflutil.wl.devmgr.wait_timer)
1469 ret = wl_event_source_timer_update(_eflutil.wl.devmgr.wait_timer,
1470 EFL_UTIL_INPUT_GENERATOR_DEFAULT_TIME_OUT);
1478 while (_eflutil.wl.devmgr.wait_timer)
1480 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1481 ret = wl_event_loop_dispatch(loop, EFL_UTIL_INPUT_GENERATOR_DEFAULT_DISPATCH_TIME_OUT);
1482 if (ret != 0) _timer_wait(NULL);
1487 _efl_util_input_initialize_append_device(const char *name, Ecore_Device_Class clas)
1489 Efl_Util_Device_Info *dev;
1491 dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
1492 EINA_SAFETY_ON_NULL_RETURN(dev);
1494 dev->name = eina_stringshare_add(name);
1497 _eflutil.wl.devmgr.wait_devices = eina_list_append(_eflutil.wl.devmgr.wait_devices, dev);
1501 _efl_util_input_initialize_add_wait_device(const char *name, unsigned int dev_type)
1503 EINA_SAFETY_ON_NULL_RETURN(name);
1505 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1506 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_TOUCH);
1508 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1509 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_KEYBOARD);
1511 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1512 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_MOUSE);
1515 API efl_util_inputgen_h
1516 efl_util_input_initialize_generator(unsigned int dev_type)
1518 int ret = EFL_UTIL_ERROR_NONE;
1519 efl_util_inputgen_h inputgen_h = NULL;
1520 unsigned int clas = 0x0;
1523 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1524 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1525 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1527 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1531 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1534 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1538 inputgen_h->init_type |= dev_type;
1541 if (ret == (int)EINA_FALSE)
1543 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1547 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1548 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1549 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1550 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1551 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1552 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1554 while (!_eflutil.wl.devmgr.devicemgr)
1555 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1557 tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
1559 while (_eflutil.wl.devmgr.request_notified == -1)
1560 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1562 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1563 _eflutil.wl.devmgr.request_notified = -1;
1565 set_last_result(ret);
1566 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1580 API efl_util_inputgen_h
1581 efl_util_input_initialize_generator_with_name(unsigned int dev_type, const char *name)
1583 int ret = EFL_UTIL_ERROR_NONE;
1584 efl_util_inputgen_h inputgen_h = NULL;
1585 unsigned int clas = 0x0;
1588 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1589 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1590 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1592 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1596 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1599 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1603 inputgen_h->init_type |= dev_type;
1604 strncpy(inputgen_h->name, name, 31);
1607 if (ret == (int)EINA_FALSE)
1609 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1613 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1614 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1615 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1616 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1617 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1618 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1620 while (!_eflutil.wl.devmgr.devicemgr)
1621 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1623 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1625 while (_eflutil.wl.devmgr.request_notified == -1)
1626 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1628 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1629 _eflutil.wl.devmgr.request_notified = -1;
1631 set_last_result(ret);
1632 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1646 API efl_util_inputgen_h
1647 efl_util_input_initialize_generator_with_sync(unsigned int dev_type, const char *name)
1649 int ret = EFL_UTIL_ERROR_NONE;
1650 efl_util_inputgen_h inputgen_h = NULL;
1651 unsigned int clas = 0x0;
1654 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1655 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1656 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1658 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1662 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1665 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1669 inputgen_h->init_type |= dev_type;
1670 if (name) strncpy(inputgen_h->name, name, 31);
1671 else strncpy(inputgen_h->name, "Input Generator", 31);
1674 if (ret == (int)EINA_FALSE)
1676 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1680 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1681 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1682 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1683 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1684 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1685 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1687 while (!_eflutil.wl.devmgr.devicemgr)
1688 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1690 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1692 while (_eflutil.wl.devmgr.request_notified == -1)
1693 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1695 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1696 _eflutil.wl.devmgr.request_notified = -1;
1698 if (ret == EFL_UTIL_ERROR_NONE)
1700 _efl_util_input_initialize_add_wait_device(inputgen_h->name, dev_type);
1701 _efl_util_input_initialize_wait_device();
1702 if (_eflutil.wl.devmgr.request_notified != -1)
1704 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1705 _eflutil.wl.devmgr.request_notified = -1;
1709 set_last_result(ret);
1710 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1725 efl_util_input_set_touch_count(int max_count)
1727 int ret = EFL_UTIL_ERROR_NONE;
1730 if (ret == (int)EINA_FALSE)
1732 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1735 while (!_eflutil.wl.devmgr.devicemgr)
1736 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1738 if (_eflutil.wl.devmgr.max_touch_count >= max_count)
1739 return EFL_UTIL_ERROR_NONE;
1741 tizen_input_device_manager_set_touch_count(_eflutil.wl.devmgr.devicemgr, max_count);
1743 while (_eflutil.wl.devmgr.request_notified == -1)
1744 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1746 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1747 _eflutil.wl.devmgr.request_notified = -1;
1749 if (ret == EFL_UTIL_ERROR_NONE)
1751 _eflutil.wl.devmgr.request_touch_count = max_count;
1758 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
1760 int ret = EFL_UTIL_ERROR_NONE;
1761 unsigned int clas = 0x0;
1762 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1764 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1765 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1766 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1767 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1768 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1769 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1771 if (inputgen_h->axis_info)
1772 free(inputgen_h->axis_info);
1777 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1779 tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
1781 while (_eflutil.wl.devmgr.request_notified == -1)
1782 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1784 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1785 _eflutil.wl.devmgr.request_notified = -1;
1791 efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name, int pressed)
1793 int ret = EFL_UTIL_ERROR_NONE;
1795 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1796 EINA_SAFETY_ON_NULL_RETURN_VAL(key_name, EFL_UTIL_ERROR_INVALID_PARAMETER);
1797 EINA_SAFETY_ON_FALSE_RETURN_VAL(pressed == 0 || pressed == 1, EFL_UTIL_ERROR_INVALID_PARAMETER);
1798 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1800 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1802 tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
1804 while (_eflutil.wl.devmgr.request_notified == -1)
1805 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1807 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1808 _eflutil.wl.devmgr.request_notified = -1;
1814 efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
1815 efl_util_input_touch_type_e touch_type, int x, int y)
1818 enum tizen_input_device_manager_pointer_event_type type;
1820 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1821 EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1822 EINA_SAFETY_ON_FALSE_RETURN_VAL((x > 0 && y > 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1823 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1825 if (idx >= _eflutil.wl.devmgr.max_touch_count)
1826 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1828 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1832 case EFL_UTIL_INPUT_TOUCH_BEGIN:
1833 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1835 case EFL_UTIL_INPUT_TOUCH_UPDATE:
1836 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1838 case EFL_UTIL_INPUT_TOUCH_END:
1839 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1842 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1845 tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1847 while (_eflutil.wl.devmgr.request_notified == -1)
1848 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1850 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1851 _eflutil.wl.devmgr.request_notified = -1;
1857 _efl_util_input_generate_touch_axis_send(unsigned int type, double value)
1861 tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_double(value));
1863 while (_eflutil.wl.devmgr.request_notified == -1)
1864 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1866 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1867 _eflutil.wl.devmgr.request_notified = -1;
1873 _efl_util_input_generate_touch_axis_cleanup(efl_util_inputgen_h inputgen_h, int idx)
1878 inputgen_h->axis_info[idx].radius_x = 1.0;
1879 inputgen_h->axis_info[idx].radius_y = 1.0;
1880 inputgen_h->axis_info[idx].pressure = 1.0;
1881 inputgen_h->axis_info[idx].angle = 0.0;
1882 inputgen_h->axis_info[idx].palm = 0.0;
1886 for (i = 0; i < EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER; i++)
1888 inputgen_h->axis_info[i].radius_x = 1.0;
1889 inputgen_h->axis_info[i].radius_y = 1.0;
1890 inputgen_h->axis_info[i].pressure = 1.0;
1891 inputgen_h->axis_info[i].angle = 0.0;
1892 inputgen_h->axis_info[i].palm = 0.0;
1898 _efl_util_input_generate_touch_axis_process(efl_util_inputgen_h inputgen_h, int idx, double radius_x,
1899 double radius_y, double pressure, double angle, double palm)
1901 int ret = EFL_UTIL_ERROR_NONE;
1903 if (!inputgen_h->axis_info)
1905 inputgen_h->axis_info = calloc(EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER,
1906 sizeof(E_Devicemgr_Inputgen_Touch_Axis));
1907 _efl_util_input_generate_touch_axis_cleanup(inputgen_h, -1);
1910 if (inputgen_h->axis_info[idx].radius_x != radius_x)
1912 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_X, radius_x);
1913 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1914 inputgen_h->axis_info[idx].radius_x = radius_x;
1916 if (inputgen_h->axis_info[idx].radius_y != radius_y)
1918 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_Y, radius_y);
1919 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1920 inputgen_h->axis_info[idx].radius_y = radius_y;
1922 if (inputgen_h->axis_info[idx].pressure != pressure)
1924 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PRESSURE, pressure);
1925 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1926 inputgen_h->axis_info[idx].pressure = pressure;
1928 if (inputgen_h->axis_info[idx].angle != angle)
1930 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_ANGLE, angle);
1931 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1932 inputgen_h->axis_info[idx].angle = angle;
1934 if (inputgen_h->axis_info[idx].palm != palm)
1936 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PALM, palm);
1937 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1938 inputgen_h->axis_info[idx].palm = palm;
1945 efl_util_input_generate_touch_axis(efl_util_inputgen_h inputgen_h, int idx,
1946 efl_util_input_touch_type_e touch_type, int x, int y,
1947 double radius_x, double radius_y,
1948 double pressure, double angle, double palm)
1951 enum tizen_input_device_manager_pointer_event_type type;
1953 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1954 EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1955 EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1956 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1957 EINA_SAFETY_ON_FALSE_RETURN_VAL((radius_x >= 0.0 && radius_y >= 0.0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1958 EINA_SAFETY_ON_FALSE_RETURN_VAL((pressure >= 0.0 && palm >= 0.0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1960 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1961 version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
1962 EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
1966 case EFL_UTIL_INPUT_TOUCH_BEGIN:
1967 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1969 case EFL_UTIL_INPUT_TOUCH_UPDATE:
1970 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1972 case EFL_UTIL_INPUT_TOUCH_END:
1973 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1976 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1979 if (touch_type != EFL_UTIL_INPUT_TOUCH_END)
1980 _efl_util_input_generate_touch_axis_process(inputgen_h, idx, radius_x, radius_y, pressure, angle, palm);
1982 _efl_util_input_generate_touch_axis_cleanup(inputgen_h, idx);
1984 tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1986 while (_eflutil.wl.devmgr.request_notified == -1)
1987 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1989 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1990 _eflutil.wl.devmgr.request_notified = -1;
1997 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)
2000 enum tizen_input_device_manager_pointer_event_type type;
2002 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2003 EINA_SAFETY_ON_FALSE_RETURN_VAL(buttons > 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
2004 EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
2005 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
2007 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
2009 switch(pointer_type)
2011 case EFL_UTIL_INPUT_POINTER_BUTTON_DOWN:
2012 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
2014 case EFL_UTIL_INPUT_POINTER_MOVE:
2015 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
2017 case EFL_UTIL_INPUT_POINTER_BUTTON_UP:
2018 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
2021 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2024 tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
2026 while (_eflutil.wl.devmgr.request_notified == -1)
2027 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2029 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
2030 _eflutil.wl.devmgr.request_notified = -1;
2036 efl_util_input_generate_wheel(efl_util_inputgen_h inputgen_h, efl_util_input_pointer_wheel_type_e wheel_type, int value)
2039 enum tizen_input_device_manager_pointer_event_type type;
2041 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2042 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
2044 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
2045 version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
2046 EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
2050 case EFL_UTIL_INPUT_POINTER_WHEEL_VERT:
2051 type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_WHEEL;
2053 case EFL_UTIL_INPUT_POINTER_WHEEL_HORZ:
2054 type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_HWHEEL;
2057 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2060 tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_int(value));
2062 while (_eflutil.wl.devmgr.request_notified == -1)
2063 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2065 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
2066 _eflutil.wl.devmgr.request_notified = -1;
2073 struct _efl_util_screenshot_h
2078 Eina_Bool shot_done;
2083 Eina_Bool auto_rotation;
2086 /* scrrenshot handle */
2087 static efl_util_screenshot_h g_screenshot;
2088 static Eina_Bool shot_mutex_init;
2089 static pthread_mutex_t shot_lock;
2092 _screenshot_mutex_init(void)
2094 if (shot_mutex_init)
2097 if (pthread_mutex_init(&shot_lock, NULL))
2099 fprintf(stderr, "[screenshot] fail: mutex init"); /*LCOV_EXCL_LINE*/
2100 return EINA_FALSE; /*LCOV_EXCL_LINE*/
2103 shot_mutex_init = EINA_TRUE;
2109 _screenshot_mutex_destory(void)
2111 if (!shot_mutex_init)
2114 if (pthread_mutex_destroy(&shot_lock))
2116 fprintf(stderr, "[screenshot] fail: mutex destory"); /*LCOV_EXCL_LINE*/
2117 return EINA_FALSE; /*LCOV_EXCL_LINE*/
2120 shot_mutex_init = EINA_FALSE;
2126 _screenshot_mutex_lock(void)
2128 if (!_screenshot_mutex_init())
2131 pthread_mutex_lock(&shot_lock);
2135 _screenshot_mutex_unlock(void)
2137 pthread_mutex_unlock(&shot_lock);
2140 API efl_util_screenshot_h
2141 efl_util_screenshot_initialize(int width, int height)
2143 efl_util_screenshot_h screenshot = NULL;
2144 struct wl_display *display_wrapper = NULL;
2145 struct wl_registry *reg = NULL;
2148 if (width <= 0 || height <= 0)
2150 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2154 _screenshot_mutex_lock();
2158 screenshot = calloc(1, sizeof(struct _efl_util_screenshot_h));
2159 EINA_SAFETY_ON_NULL_GOTO(screenshot, fail_memory);
2162 if (!_eflutil.wl.shot.screenshooter)
2165 if (ret == (int)EINA_FALSE)
2167 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2168 _screenshot_mutex_unlock();
2173 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2175 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
2176 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail_memory);
2178 _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
2179 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_memory);
2181 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
2183 reg = wl_display_get_registry(display_wrapper);
2184 wl_proxy_wrapper_destroy(display_wrapper);
2185 display_wrapper = NULL;
2186 EINA_SAFETY_ON_NULL_GOTO(reg, fail_init);
2188 wl_registry_add_listener(reg, &_wl_reg_screenshooter_listener, NULL);
2190 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2191 EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_init);
2192 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.screenshooter, fail_init);
2193 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tz_screenshooter, fail_init);
2195 _eflutil.wl.shot.tbm_client = wayland_tbm_client_init(_eflutil.wl.dpy);
2196 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tbm_client, fail_init);
2198 wl_registry_destroy(reg);
2202 if (_eflutil.wl.shot.noti == 0)
2204 fprintf(stderr, "[screenshot] fail: privilege error\n"); /* LCOV_EXCL_LINE */
2210 if (g_screenshot->width != width || g_screenshot->height != height)
2212 g_screenshot->width = width;
2213 g_screenshot->height = height;
2215 set_last_result(EFL_UTIL_ERROR_NONE);
2217 _screenshot_mutex_unlock();
2219 return g_screenshot;
2222 screenshot->width = width;
2223 screenshot->height = height;
2224 screenshot->auto_rotation = EINA_TRUE;
2226 screenshot->bufmgr = wayland_tbm_client_get_bufmgr(_eflutil.wl.shot.tbm_client);
2227 EINA_SAFETY_ON_NULL_GOTO(screenshot->bufmgr, fail_init);
2229 g_screenshot = screenshot;
2230 set_last_result(EFL_UTIL_ERROR_NONE);
2232 screenshooter_set_user_data(_eflutil.wl.shot.screenshooter, &screenshot->shot_done);
2234 _screenshot_mutex_unlock();
2236 return g_screenshot;
2238 /* LCOV_EXCL_START */
2240 if (display_wrapper)
2241 wl_proxy_wrapper_destroy(display_wrapper);
2242 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
2245 _screenshot_mutex_unlock();
2250 wl_registry_destroy(reg);
2253 _screenshot_mutex_unlock();
2254 efl_util_screenshot_deinitialize(screenshot);
2256 if (_eflutil.wl.shot.noti == 0)
2257 set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
2259 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
2261 /* LCOV_EXCL_STOP */
2265 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
2267 _screenshot_mutex_lock();
2271 _screenshot_mutex_unlock();
2272 _screenshot_mutex_destory();
2273 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2277 g_screenshot = NULL;
2279 if (_eflutil.wl.shot.tbm_client)
2281 wayland_tbm_client_deinit(_eflutil.wl.shot.tbm_client);
2282 _eflutil.wl.shot.tbm_client = NULL;
2285 if (_eflutil.wl.shot.screenshooter)
2287 screenshooter_destroy(_eflutil.wl.shot.screenshooter);
2288 _eflutil.wl.shot.screenshooter = NULL;
2290 if (_eflutil.wl.shot.tz_screenshooter)
2292 tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
2293 _eflutil.wl.shot.tz_screenshooter = NULL;
2296 if (_eflutil.wl.shot.queue)
2298 wl_event_queue_destroy(_eflutil.wl.shot.queue);
2299 _eflutil.wl.shot.queue = NULL;
2302 _screenshot_mutex_unlock();
2303 _screenshot_mutex_destory();
2305 return EFL_UTIL_ERROR_NONE;
2310 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
2312 tbm_surface_h t_surface = NULL;
2313 struct wl_buffer *buffer = NULL;
2314 Efl_Util_Wl_Output_Info *output;
2317 _screenshot_mutex_lock();
2319 if (!screenshot || (screenshot != g_screenshot))
2321 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2322 _screenshot_mutex_unlock();
2326 output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
2329 fprintf(stderr, "[screenshot] fail: no output for screenshot\n"); /* LCOV_EXCL_LINE */
2333 t_surface = tbm_surface_create(screenshot->width, screenshot->height, TBM_FORMAT_XRGB8888);
2336 fprintf(stderr, "[screenshot] fail: tbm_surface_create\n"); /* LCOV_EXCL_LINE */
2340 buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, t_surface);
2343 fprintf(stderr, "[screenshot] fail: create wl_buffer for screenshot\n"); /* LCOV_EXCL_LINE */
2347 screenshooter_shoot(_eflutil.wl.shot.screenshooter, output->output, buffer);
2349 screenshot->shot_done = EINA_FALSE;
2350 while (!screenshot->shot_done && ret != -1)
2351 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2355 fprintf(stderr, "[screenshot] fail: screenshooter_shoot\n"); /* LCOV_EXCL_LINE */
2359 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2361 /* reset shot_done for next screenshot */
2362 screenshot->shot_done = EINA_FALSE;
2364 set_last_result(EFL_UTIL_ERROR_NONE);
2366 _screenshot_mutex_unlock();
2372 tbm_surface_destroy(t_surface);
2374 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2376 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL);
2378 _screenshot_mutex_unlock();
2384 efl_util_screenshot_set_auto_rotation(efl_util_screenshot_h screenshot, int set)
2386 if (!screenshot || (screenshot != g_screenshot))
2387 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2389 if (!(set == 0 || set == 1))
2390 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2393 g_screenshot->auto_rotation = EINA_TRUE;
2395 g_screenshot->auto_rotation = EINA_FALSE;
2397 tizen_screenshooter_set_oneshot_auto_rotation(_eflutil.wl.shot.tz_screenshooter, g_screenshot->auto_rotation);
2399 return EFL_UTIL_ERROR_NONE;
2403 efl_util_screenshot_get_auto_rotation(efl_util_screenshot_h screenshot, int *set)
2405 if (!screenshot || (screenshot != g_screenshot) || !set)
2406 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2408 *set = g_screenshot->auto_rotation;
2410 return EFL_UTIL_ERROR_NONE;
2413 struct _efl_util_gesture_h
2418 API int EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2419 API int EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2420 API int EFL_UTIL_EVENT_GESTURE_TAP = 0;
2421 API int EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2423 /* LCOV_EXCL_START */
2425 _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)
2427 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2431 _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)
2433 efl_util_event_gesture_edge_swipe_s *ev = NULL;
2435 ev = (efl_util_event_gesture_edge_swipe_s *)calloc(1, sizeof(*ev));
2440 ev->fingers = fingers;
2445 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE, ev, NULL, NULL);
2449 _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)
2451 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2455 _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)
2457 efl_util_event_gesture_edge_drag_s *ev = NULL;
2459 ev = (efl_util_event_gesture_edge_drag_s *)calloc(1, sizeof(*ev));
2464 ev->fingers = fingers;
2469 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_DRAG, ev, NULL, NULL);
2473 _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)
2475 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2479 _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats)
2481 efl_util_event_gesture_tap_s *ev = NULL;
2483 ev = (efl_util_event_gesture_tap_s *)calloc(1, sizeof(*ev));
2488 ev->fingers = fingers;
2489 ev->repeats = repeats;
2491 ecore_event_add(EFL_UTIL_EVENT_GESTURE_TAP, ev, NULL, NULL);
2493 /* LCOV_EXCL_STOP */
2496 _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)
2498 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2501 /* LCOV_EXCL_START */
2503 _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)
2505 efl_util_event_gesture_palm_cover_s *ev = NULL;
2507 ev = (efl_util_event_gesture_palm_cover_s *)calloc(1, sizeof(*ev));
2512 ev->duration = duration;
2516 ev->pressure = wl_fixed_to_int(pressure);
2518 ecore_event_add(EFL_UTIL_EVENT_GESTURE_PALM_COVER, ev, NULL, NULL);
2520 /* LCOV_EXCL_STOP */
2523 _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)
2525 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2528 static efl_util_error_e
2529 _efl_util_gesture_convert_error(int ret)
2533 case TIZEN_GESTURE_ERROR_NONE:
2534 return EFL_UTIL_ERROR_NONE;
2535 case TIZEN_GESTURE_ERROR_INVALID_DATA:
2536 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2537 case TIZEN_GESTURE_ERROR_NO_PERMISSION:
2538 return EFL_UTIL_ERROR_PERMISSION_DENIED;
2539 case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
2540 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
2541 case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
2542 return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
2543 case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
2544 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2546 return EFL_UTIL_ERROR_NONE;
2550 /* LCOV_EXCL_START */
2552 _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data)
2554 int ret = EFL_UTIL_ERROR_NONE;
2555 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2556 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2557 unsigned int fingers = 0;
2558 unsigned int edge = 0;
2559 unsigned int edge_size = 0;
2560 unsigned int start_point = 0;
2561 unsigned int end_point = 0;
2563 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2565 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2566 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2567 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2568 EFL_UTIL_ERROR_INVALID_PARAMETER);
2570 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2572 fingers = edge_swipe_data->fingers;
2573 edge = edge_swipe_data->edge;
2574 edge_size = edge_swipe_data->edge_size;
2575 start_point = edge_swipe_data->start_point;
2576 end_point = edge_swipe_data->end_point;
2578 tizen_gesture_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2580 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2581 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2583 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2584 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2590 _efl_util_gesture_ungrab_edge_swipe(efl_util_gesture_data data)
2592 int ret = EFL_UTIL_ERROR_NONE;
2593 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2594 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2595 unsigned int fingers = 0;
2596 unsigned int edge = 0;
2597 unsigned int edge_size = 0;
2598 unsigned int start_point = 0;
2599 unsigned int end_point = 0;
2601 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2603 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2604 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2605 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2606 EFL_UTIL_ERROR_INVALID_PARAMETER);
2608 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2610 fingers = edge_swipe_data->fingers;
2611 edge = edge_swipe_data->edge;
2612 edge_size = edge_swipe_data->edge_size;
2613 start_point = edge_swipe_data->start_point;
2614 end_point = edge_swipe_data->end_point;
2616 tizen_gesture_ungrab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2618 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2619 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2621 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2622 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2628 _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data)
2630 int ret = EFL_UTIL_ERROR_NONE;
2631 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2632 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2633 unsigned int fingers = 0;
2634 unsigned int edge = 0;
2635 unsigned int edge_size = 0;
2636 unsigned int start_point = 0;
2637 unsigned int end_point = 0;
2639 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2641 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2642 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2643 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2644 EFL_UTIL_ERROR_INVALID_PARAMETER);
2646 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2648 fingers = edge_drag_data->fingers;
2649 edge = edge_drag_data->edge;
2650 edge_size = edge_drag_data->edge_size;
2651 start_point = edge_drag_data->start_point;
2652 end_point = edge_drag_data->end_point;
2654 tizen_gesture_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2656 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2657 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2659 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2660 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2666 _efl_util_gesture_ungrab_edge_drag(efl_util_gesture_data data)
2668 int ret = EFL_UTIL_ERROR_NONE;
2669 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2670 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2671 unsigned int fingers = 0;
2672 unsigned int edge = 0;
2673 unsigned int edge_size = 0;
2674 unsigned int start_point = 0;
2675 unsigned int end_point = 0;
2677 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2679 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2680 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2681 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2682 EFL_UTIL_ERROR_INVALID_PARAMETER);
2684 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2686 fingers = edge_drag_data->fingers;
2687 edge = edge_drag_data->edge;
2688 edge_size = edge_drag_data->edge_size;
2689 start_point = edge_drag_data->start_point;
2690 end_point = edge_drag_data->end_point;
2692 tizen_gesture_ungrab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2694 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2695 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2697 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2698 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2705 _efl_util_gesture_grab_tap(efl_util_gesture_data data)
2707 int ret = EFL_UTIL_ERROR_NONE;
2708 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2709 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2710 unsigned int fingers = 0;
2711 unsigned int repeats = 0;
2713 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2715 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2716 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2717 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2718 EFL_UTIL_ERROR_INVALID_PARAMETER);
2720 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2722 fingers = tap_data->fingers;
2723 repeats = tap_data->repeats;
2725 tizen_gesture_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2727 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2728 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2730 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2731 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2737 _efl_util_gesture_ungrab_tap(efl_util_gesture_data data)
2739 int ret = EFL_UTIL_ERROR_NONE;
2740 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2741 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2742 unsigned int fingers = 0;
2743 unsigned int repeats = 0;
2745 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2747 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2748 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2749 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2750 EFL_UTIL_ERROR_INVALID_PARAMETER);
2752 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2754 fingers = tap_data->fingers;
2755 repeats = tap_data->repeats;
2757 tizen_gesture_ungrab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2759 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2760 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2762 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2763 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2769 _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data)
2771 int ret = EFL_UTIL_ERROR_NONE;
2772 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2774 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2776 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2777 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2778 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2779 EFL_UTIL_ERROR_INVALID_PARAMETER);
2781 tizen_gesture_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2783 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2784 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2786 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2787 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2793 _efl_util_gesture_ungrab_palm_cover(efl_util_gesture_data data)
2795 int ret = EFL_UTIL_ERROR_NONE;
2796 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2798 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2800 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2801 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2802 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2803 EFL_UTIL_ERROR_INVALID_PARAMETER);
2805 tizen_gesture_ungrab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2807 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2808 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2810 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2811 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2815 /* LCOV_EXCL_STOP */
2817 API efl_util_gesture_h
2818 efl_util_gesture_initialize(void)
2820 efl_util_gesture_h gesture_h = NULL;
2822 gesture_h = (efl_util_gesture_h)calloc(1, sizeof(struct _efl_util_gesture_h));
2825 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2826 goto out; /* LCOV_EXCL_LINE */
2829 if (_wl_init_default_queue() == (int)EINA_FALSE)
2831 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2832 goto out; /* LCOV_EXCL_LINE */
2835 while (!_eflutil_defaultqueue.wl.gesture.proto)
2836 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy); /* LCOV_EXCL_LINE */
2838 if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2840 if (ecore_event_init() <= 0)
2842 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2843 goto out; /* LCOV_EXCL_LINE */
2845 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = ecore_event_type_new();
2846 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = ecore_event_type_new();
2847 EFL_UTIL_EVENT_GESTURE_TAP = ecore_event_type_new();
2848 EFL_UTIL_EVENT_GESTURE_PALM_COVER = ecore_event_type_new();
2850 _eflutil_defaultqueue.wl.gesture.event_init++;
2851 gesture_h->init = EINA_TRUE;
2853 set_last_result(EFL_UTIL_ERROR_NONE);
2857 /* LCOV_EXCL_START */
2864 /* LCOV_EXCL_STOP */
2868 efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
2870 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2871 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2876 _eflutil_defaultqueue.wl.gesture.event_init--;
2878 if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2880 _eflutil_defaultqueue.wl.gesture.event_init = 0;
2881 ecore_event_shutdown();
2882 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2883 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2884 EFL_UTIL_EVENT_GESTURE_TAP = 0;
2885 EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2888 return EFL_UTIL_ERROR_NONE;
2891 API efl_util_gesture_data
2892 efl_util_gesture_edge_swipe_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2894 Efl_Util_Gesture_Edge_Swipe_Grab_Data *data;
2896 if (!gesture_h || gesture_h->init == EINA_FALSE)
2898 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2902 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2904 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2908 data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Swipe_Grab_Data));
2911 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2912 return NULL; /* LCOV_EXCL_LINE */
2915 data->base.type = TIZEN_GESTURE_TYPE_EDGE_SWIPE;
2916 data->fingers = fingers;
2918 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2920 set_last_result(EFL_UTIL_ERROR_NONE);
2922 return (void *)data;
2926 efl_util_gesture_edge_swipe_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2928 if (!gesture_h || gesture_h->init == EINA_FALSE)
2930 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2935 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2941 return EFL_UTIL_ERROR_NONE;
2945 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)
2947 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = data;
2949 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_swipe_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2950 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_swipe_data->base.type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2951 EFL_UTIL_ERROR_INVALID_PARAMETER);
2952 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2953 EFL_UTIL_ERROR_INVALID_PARAMETER);
2954 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2956 edge_swipe_data->edge_size = edge_size;
2957 edge_swipe_data->start_point = start_point;
2958 edge_swipe_data->end_point = end_point;
2960 return EFL_UTIL_ERROR_NONE;
2963 API efl_util_gesture_data
2964 efl_util_gesture_edge_drag_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2966 Efl_Util_Gesture_Edge_Drag_Grab_Data *data;
2968 if (!gesture_h || gesture_h->init == EINA_FALSE)
2970 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2974 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2976 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2980 data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Drag_Grab_Data));
2983 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2984 return NULL; /* LCOV_EXCL_LINE */
2987 data->base.type = TIZEN_GESTURE_TYPE_EDGE_DRAG;
2988 data->fingers = fingers;
2990 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2992 set_last_result(EFL_UTIL_ERROR_NONE);
2994 return (void *)data;
2998 efl_util_gesture_edge_drag_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3000 if (!gesture_h || gesture_h->init == EINA_FALSE)
3002 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3007 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3013 return EFL_UTIL_ERROR_NONE;
3017 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)
3019 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = data;
3021 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_drag_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3022 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_drag_data->base.type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
3023 EFL_UTIL_ERROR_INVALID_PARAMETER);
3024 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
3025 EFL_UTIL_ERROR_INVALID_PARAMETER);
3026 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
3028 edge_drag_data->edge_size = edge_size;
3029 edge_drag_data->start_point = start_point;
3030 edge_drag_data->end_point = end_point;
3032 return EFL_UTIL_ERROR_NONE;
3035 API efl_util_gesture_data
3036 efl_util_gesture_tap_new(efl_util_gesture_h gesture_h, unsigned int fingers, unsigned int repeats)
3038 Efl_Util_Gesture_Tap_Grab_Data *data;
3040 if (!gesture_h || gesture_h->init == EINA_FALSE)
3042 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
3046 if (fingers <= 1 || repeats <= 1)
3048 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED);
3052 data = (Efl_Util_Gesture_Tap_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Tap_Grab_Data));
3055 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3056 return NULL; /* LCOV_EXCL_LINE */
3059 data->base.type = TIZEN_GESTURE_TYPE_TAP;
3060 data->fingers = fingers;
3061 data->repeats = repeats;
3063 set_last_result(EFL_UTIL_ERROR_NONE);
3065 return (void *)data;
3069 efl_util_gesture_tap_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3071 if (!gesture_h || gesture_h->init == EINA_FALSE)
3073 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3078 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3084 return EFL_UTIL_ERROR_NONE;
3087 API efl_util_gesture_data
3088 efl_util_gesture_palm_cover_new(efl_util_gesture_h gesture_h)
3090 Efl_Util_Gesture_Palm_Cover_Grab_Data *data;
3092 if (!gesture_h || gesture_h->init == EINA_FALSE)
3094 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
3098 data = (Efl_Util_Gesture_Palm_Cover_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Palm_Cover_Grab_Data));
3101 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3102 return NULL; /* LCOV_EXCL_LINE */
3105 data->base.type = TIZEN_GESTURE_TYPE_PALM_COVER;
3107 set_last_result(EFL_UTIL_ERROR_NONE);
3109 return (void *)data;
3113 efl_util_gesture_palm_cover_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3115 if (!gesture_h || gesture_h->init == EINA_FALSE)
3117 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3122 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3128 return EFL_UTIL_ERROR_NONE;
3131 /* LCOV_EXCL_START */
3133 efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3135 int ret = EFL_UTIL_ERROR_NONE;
3136 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3138 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3140 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3141 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3142 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3144 switch (base_data->type)
3146 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3147 ret = _efl_util_gesture_grab_edge_swipe(data);
3149 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3150 ret = _efl_util_gesture_grab_edge_drag(data);
3152 case TIZEN_GESTURE_TYPE_TAP:
3153 ret = _efl_util_gesture_grab_tap(data);
3155 case TIZEN_GESTURE_TYPE_PALM_COVER:
3156 ret = _efl_util_gesture_grab_palm_cover(data);
3159 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3166 efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3168 int ret = EFL_UTIL_ERROR_NONE;
3169 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3171 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3173 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3174 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3175 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3177 switch (base_data->type)
3179 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3180 ret = _efl_util_gesture_ungrab_edge_swipe(data);
3182 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3183 ret = _efl_util_gesture_ungrab_edge_drag(data);
3185 case TIZEN_GESTURE_TYPE_TAP:
3186 ret = _efl_util_gesture_ungrab_tap(data);
3188 case TIZEN_GESTURE_TYPE_PALM_COVER:
3189 ret = _efl_util_gesture_ungrab_palm_cover(data);
3192 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3197 /* LCOV_EXCL_STOP */
3200 efl_util_gesture_select(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3202 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3203 Ecore_Wl2_Window *wlwin;
3204 struct wl_surface *surface;
3207 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3209 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3210 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3211 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3212 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3214 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3215 return EFL_UTIL_ERROR_NOT_SUPPORTED;
3217 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3218 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3220 surface = ecore_wl2_window_surface_get(wlwin);
3221 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3222 EFL_UTIL_ERROR_INVALID_PARAMETER);
3224 tizen_gesture_select_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3226 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
3227 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
3229 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
3230 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
3236 efl_util_gesture_deselect(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3238 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3239 Ecore_Wl2_Window *wlwin;
3240 struct wl_surface *surface;
3243 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3245 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3246 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3247 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3248 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3250 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3251 return EFL_UTIL_ERROR_NOT_SUPPORTED;
3253 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3254 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3256 surface = ecore_wl2_window_surface_get(wlwin);
3257 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3258 EFL_UTIL_ERROR_INVALID_PARAMETER);
3260 tizen_gesture_deselect_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3262 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
3263 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
3265 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
3266 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
3271 /* LCOV_EXCL_START */
3273 efl_util_gesture_activate_set(efl_util_gesture_h gesture_h, unsigned int type, Eina_Bool active)
3277 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3278 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3279 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3281 tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, NULL, type, active);
3283 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
3284 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
3286 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
3287 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
3291 /* LCOV_EXCL_STOP */
3294 efl_util_gesture_activate_set_on_window(efl_util_gesture_h gesture_h, Evas_Object *window, unsigned int type, Eina_Bool active)
3296 Ecore_Wl2_Window *wlwin;
3297 struct wl_surface *surface;
3300 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3301 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3302 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3303 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3305 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3306 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3308 surface = ecore_wl2_window_surface_get(wlwin);
3309 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3310 EFL_UTIL_ERROR_INVALID_PARAMETER);
3312 tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, surface, type, active);
3314 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
3315 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
3317 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
3318 _eflutil_defaultqueue.wl.gesture.request_notified = -1;