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.
19 #define LOG_TAG "TIZEN_N_EFL_UTIL"
26 #include <sys/types.h>
30 #include <tbm_bufmgr.h>
31 #include <tbm_surface.h>
32 #include <tbm_surface_internal.h>
33 #include <Elementary.h>
34 #include <Ecore_Evas.h>
37 #include <Ecore_Wl2.h>
38 #include <wayland-client.h>
39 #include <wayland-tbm-client.h>
40 #include <tizen-extension-client-protocol.h>
42 #include <efl_util_screenshot_extension.h>
49 #define LOG_TAG "TIZEN_N_EFL_UTIL"
50 #define EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER 10
52 typedef struct _Efl_Util_Wl_Surface_Lv_Info
54 void *surface; /* wl_surface */
56 Eina_Bool wait_for_done;
58 } Efl_Util_Wl_Surface_Lv_Info;
60 typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
62 void *surface; /* wl_surface */
64 Eina_Bool wait_for_done;
66 } Efl_Util_Wl_Surface_Scr_Mode_Info;
68 typedef struct _Efl_Util_Wl_Surface_Brightness_Info
70 void *surface; /* wl_surface */
72 Eina_Bool wait_for_done;
74 } Efl_Util_Wl_Surface_Brightness_Info;
76 typedef struct _Efl_Util_Wl_Output_Info
78 struct wl_output *output;
79 int offset_x, offset_y, width, height;
80 } Efl_Util_Wl_Output_Info;
82 typedef struct _Efl_Util_Gesture_Common_Grab_Data
85 } Efl_Util_Gesture_Common_Grab_Data;
87 typedef struct _Efl_Util_Gesture_Edge_Swipe_Grab_Data
89 Efl_Util_Gesture_Common_Grab_Data base;
92 efl_util_gesture_edge_e edge;
93 efl_util_gesture_edge_size_e edge_size;
94 unsigned int start_point;
95 unsigned int end_point;
96 } Efl_Util_Gesture_Edge_Swipe_Grab_Data;
98 typedef struct _Efl_Util_Gesture_Edge_Drag_Grab_Data
100 Efl_Util_Gesture_Common_Grab_Data base;
102 unsigned int fingers;
103 efl_util_gesture_edge_e edge;
104 efl_util_gesture_edge_size_e edge_size;
105 unsigned int start_point;
106 unsigned int end_point;
107 } Efl_Util_Gesture_Edge_Drag_Grab_Data;
109 typedef struct _Efl_Util_Gesture_Tap_Grab_Data
111 Efl_Util_Gesture_Common_Grab_Data base;
113 unsigned int fingers;
114 unsigned int repeats;
115 } Efl_Util_Gesture_Tap_Grab_Data;
117 typedef struct _Efl_Util_Gesture_Palm_Cover_Grab_Data
119 Efl_Util_Gesture_Common_Grab_Data base;
120 } Efl_Util_Gesture_Palm_Cover_Grab_Data;
122 typedef struct _E_Devicemgr_Inputgen_Touch_Axis
129 } E_Devicemgr_Inputgen_Touch_Axis;
131 typedef struct _Efl_Util_Data
133 /* wayland related stuffs */
137 Ecore_Wl2_Display *wl2_display;
138 struct wl_display *dpy;
139 struct wl_event_queue *queue;
144 struct tizen_policy *proto;
145 Eina_Hash *hash_noti_lv;
146 Eina_Hash *hash_scr_mode;
150 struct wl_event_queue *queue;
151 struct tizen_screenshooter *tz_screenshooter;
152 struct wayland_tbm_client *tbm_client;
153 Eina_List *output_list;
158 struct tizen_input_device_manager *devicemgr;
159 int request_notified;
161 Eina_List *wait_devices;
162 struct wl_event_source *wait_timer;
164 int request_touch_count;
166 struct wl_seat *seat;
170 struct tizen_display_policy *proto;
171 Eina_Hash *hash_brightness;
176 typedef struct _Efl_Util_Data_Default_Queue
178 /* wayland related stuffs */
182 Ecore_Wl2_Display *wl2_display;
183 struct wl_display *dpy;
188 struct tizen_gesture *proto;
189 int request_notified;
193 } Efl_Util_Data_Default_Queue;
196 static Efl_Util_Data _eflutil =
201 { 0, NULL, NULL, NULL }, /* tizen_policy protocol */
202 { NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
203 { NULL, -1, NULL, NULL, NULL, 0, 0 }, /* tizen_input_device_manager protocol */
204 NULL, /* wl_seat protocol */
205 { 0, NULL, NULL } /* display_policy protocol */
209 static Efl_Util_Data_Default_Queue _eflutil_defaultqueue =
214 { 0, NULL, -1, 0 } /* gesture protocol */
219 static Eina_Bool _wl_init(void);
220 static Eina_Bool _wl_init_default_queue(void);
221 static void _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
222 static void _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
223 static void _cb_wl_default_queue_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
224 static void _cb_wl_default_queue_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
225 static void _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
226 static void _cb_wl_reg_screenshooter_global_remove(void *data, struct wl_registry *reg, unsigned int name);
227 static void _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t is_conformant);
228 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);
229 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);
230 static void _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id);
231 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);
232 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);
233 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);
234 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id);
235 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);
236 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);
238 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);
240 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);
241 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);
242 static void _cb_error(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t errorcode);
243 static void _cb_block_expired(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED);
244 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);
246 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);
247 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);
248 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);
249 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);
250 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);
251 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);
252 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);
253 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);
254 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);
257 static const struct wl_registry_listener _wl_reg_listener =
260 _cb_wl_reg_global_remove
263 static const struct wl_registry_listener _wl_reg_screenshooter_listener =
265 _cb_wl_reg_screenshooter_global,
266 _cb_wl_reg_screenshooter_global_remove
269 struct tizen_policy_listener _wl_tz_policy_listener =
271 _cb_wl_tz_policy_conformant,
272 _cb_wl_tz_policy_conformant_area,
273 _cb_wl_tz_policy_notification_done,
274 _cb_wl_tz_policy_transient_for_done,
275 _cb_wl_tz_policy_scr_mode_done,
276 _cb_wl_tz_policy_iconify_state_changed,
277 _cb_wl_tz_policy_supported_aux_hints,
278 _cb_wl_tz_policy_allowed_aux_hint,
279 _cb_wl_tz_policy_aux_message,
280 _cb_wl_conformant_region,
283 struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
292 struct tizen_display_policy_listener _wl_tz_display_policy_listener =
294 _cb_wl_tz_display_policy_brightness_done,
297 static const struct wl_registry_listener _wl_default_queue_reg_listener =
299 _cb_wl_default_queue_reg_global,
300 _cb_wl_default_queue_reg_global_remove
303 struct tizen_gesture_listener _wl_tz_gesture_listener =
305 _cb_gesture_edge_swipe_notify,
306 _cb_gesture_edge_swipe,
307 _cb_gesture_edge_drag_notify,
308 _cb_gesture_edge_drag,
309 _cb_gesture_tap_notify,
311 _cb_gesture_palm_cover_notify,
312 _cb_gesture_palm_cover,
313 _cb_gesture_activate_notify
319 struct wl_display *display_wrapper = NULL;
320 struct wl_registry *reg = NULL;
322 if (_eflutil.wl.init) return EINA_TRUE;
326 _eflutil.wl.wl2_display = ecore_wl2_display_connect(NULL);
327 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.wl2_display, fail);
328 _eflutil.wl.dpy = ecore_wl2_display_get(_eflutil.wl.wl2_display);
329 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.dpy, fail);
331 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
332 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
334 _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy);
335 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail);
337 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.queue);
339 reg = wl_display_get_registry(display_wrapper);
340 wl_proxy_wrapper_destroy(display_wrapper);
341 display_wrapper = NULL;
342 EINA_SAFETY_ON_NULL_GOTO(reg, fail);
344 wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
346 _eflutil.wl.init = EINA_TRUE;
351 wl_proxy_wrapper_destroy(display_wrapper);
353 if (_eflutil.wl.queue)
355 wl_event_queue_destroy(_eflutil.wl.queue);
356 _eflutil.wl.queue = NULL;
359 ecore_wl2_shutdown();
364 _wl_init_default_queue(void)
366 struct wl_display *display_wrapper = NULL;
367 struct wl_registry *reg = NULL;
369 if (_eflutil_defaultqueue.wl.init) return EINA_TRUE;
371 if (ecore_wl2_init() <= 0) return EINA_FALSE;
373 _eflutil_defaultqueue.wl.wl2_display = ecore_wl2_connected_display_get(NULL);
374 EINA_SAFETY_ON_NULL_GOTO(_eflutil_defaultqueue.wl.wl2_display, fail);
375 _eflutil_defaultqueue.wl.dpy = ecore_wl2_display_get(_eflutil_defaultqueue.wl.wl2_display);
376 EINA_SAFETY_ON_NULL_GOTO(_eflutil_defaultqueue.wl.dpy, fail);
378 display_wrapper = wl_proxy_create_wrapper(_eflutil_defaultqueue.wl.dpy);
379 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
381 reg = wl_display_get_registry(display_wrapper);
382 wl_proxy_wrapper_destroy(display_wrapper);
383 display_wrapper = NULL;
384 EINA_SAFETY_ON_NULL_GOTO(reg, fail);
386 wl_registry_add_listener(reg, &_wl_default_queue_reg_listener, NULL);
388 _eflutil_defaultqueue.wl.init = EINA_TRUE;
393 ecore_wl2_shutdown();
398 _cb_wl_output_geometry(void *data, struct wl_output *wl_output, int x, int y,
399 int physical_width, int physical_height, int subpixel,
400 const char *make, const char *model, int transform)
402 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
403 if (wl_output == output->output)
405 output->offset_x = x;
406 output->offset_y = y;
411 _cb_wl_output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
412 int width, int height, int refresh)
414 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
415 if (wl_output == output->output && (flags & WL_OUTPUT_MODE_CURRENT))
417 output->width = width;
418 output->height = height;
423 _cb_wl_output_done(void *data, struct wl_output *wl_output)
428 _cb_wl_output_scale(void *data, struct wl_output *wl_output, int32_t factor)
432 static const struct wl_output_listener output_listener =
434 _cb_wl_output_geometry,
441 _cb_tz_screenshot_format(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t format)
446 _cb_tz_screenshot_noti(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t noti)
448 _eflutil.wl.shot.noti = noti;
452 _cb_tz_screenshot_done(void *data, struct tizen_screenshooter *tz_screenshooter)
454 Eina_Bool *shot_done = (Eina_Bool*)data;
456 *shot_done = EINA_TRUE;
459 static const struct tizen_screenshooter_listener tz_screenshooter_listener =
461 _cb_tz_screenshot_format,
462 _cb_tz_screenshot_noti,
463 _cb_tz_screenshot_done,
467 _cb_seat_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps)
472 _cb_seat_name(void *data, struct wl_seat *seat EINA_UNUSED, const char *name)
476 static const struct wl_seat_listener _seat_listener =
478 _cb_seat_capabilities,
483 _cb_wl_reg_global(void *data,
484 struct wl_registry *reg,
486 const char *interface,
487 unsigned int version)
489 if (!strcmp(interface, "tizen_policy"))
491 struct tizen_policy *proto;
492 proto = wl_registry_bind(reg,
494 &tizen_policy_interface,
498 tizen_policy_add_listener(proto,
499 &_wl_tz_policy_listener,
502 _eflutil.wl.policy.hash_noti_lv = eina_hash_pointer_new(free);
503 _eflutil.wl.policy.hash_scr_mode = eina_hash_pointer_new(free);
504 _eflutil.wl.policy.proto = proto;
505 _eflutil.wl.policy.id = id;
507 else if (strcmp(interface, "wl_output") == 0)
509 Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info));
510 EINA_SAFETY_ON_NULL_RETURN(output);
512 _eflutil.wl.shot.output_list = eina_list_append(_eflutil.wl.shot.output_list, output);
514 output->output = wl_registry_bind(reg, id, &wl_output_interface, version);
515 wl_output_add_listener(output->output, &output_listener, output);
517 else if(strcmp(interface, "wl_seat") == 0)
519 _eflutil.wl.seat = wl_registry_bind(reg, id, &wl_seat_interface, version);
520 wl_seat_add_listener(_eflutil.wl.seat, &_seat_listener, NULL);
522 else if (strcmp(interface, "tizen_input_device_manager") == 0)
524 _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
525 tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
527 else if (!strcmp(interface, "tizen_display_policy"))
529 _eflutil.wl.display_policy.proto = wl_registry_bind(reg, id, &tizen_display_policy_interface, version);
530 if (!_eflutil.wl.display_policy.proto) return;
532 tizen_display_policy_add_listener(_eflutil.wl.display_policy.proto,
533 &_wl_tz_display_policy_listener,
536 _eflutil.wl.display_policy.hash_brightness = eina_hash_pointer_new(free);
537 _eflutil.wl.display_policy.id = id;
540 /* LCOV_EXCL_START */
542 _cb_wl_reg_global_remove(void *data,
543 struct wl_registry *reg,
546 /* unset each global id number to 0 since global id is started
547 * from number 1 on server side display structure
549 if (id == _eflutil.wl.policy.id)
551 _eflutil.wl.policy.id = 0;
552 _eflutil.wl.policy.proto = NULL;
553 eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
554 eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
556 else if (id == _eflutil.wl.display_policy.id)
558 _eflutil.wl.display_policy.id = 0;
559 _eflutil.wl.display_policy.proto = NULL;
560 eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
566 _cb_wl_default_queue_reg_global(void *data,
567 struct wl_registry *reg,
569 const char *interface,
570 unsigned int version)
572 if (strcmp(interface, "tizen_gesture") == 0)
574 _eflutil_defaultqueue.wl.gesture.id = id;
575 _eflutil_defaultqueue.wl.gesture.proto = wl_registry_bind(reg, id, &tizen_gesture_interface, version);
576 tizen_gesture_add_listener(_eflutil_defaultqueue.wl.gesture.proto, &_wl_tz_gesture_listener, NULL);
579 /* LCOV_EXCL_START */
581 _cb_wl_default_queue_reg_global_remove(void *data,
582 struct wl_registry *reg,
585 if (id == _eflutil_defaultqueue.wl.gesture.id)
587 _eflutil_defaultqueue.wl.gesture.id = 0;
588 _eflutil_defaultqueue.wl.gesture.proto = NULL;
595 _cb_wl_reg_screenshooter_global(void *data,
596 struct wl_registry *reg,
598 const char *interface,
599 unsigned int version)
601 if (strcmp(interface, "tizen_screenshooter") == 0)
603 _eflutil.wl.shot.tz_screenshooter = wl_registry_bind(reg, name, &tizen_screenshooter_interface, version);
604 tizen_screenshooter_add_listener(_eflutil.wl.shot.tz_screenshooter, &tz_screenshooter_listener, NULL);
606 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
610 /* LCOV_EXCL_START */
612 _cb_wl_reg_screenshooter_global_remove(void *data,
613 struct wl_registry *reg,
619 _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy,
620 struct wl_surface *surface, uint32_t is_conformant)
625 _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy,
626 struct wl_surface *surface, uint32_t conformant_part,
627 uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h)
633 _cb_wl_tz_policy_notification_done(void *data,
634 struct tizen_policy *tizen_policy,
635 struct wl_surface *surface,
639 Efl_Util_Wl_Surface_Lv_Info *lv_info;
641 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
644 lv_info->level = level;
645 lv_info->wait_for_done = EINA_FALSE;
646 lv_info->state = state;
650 /* LCOV_EXCL_START */
652 _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id)
658 _cb_wl_tz_policy_scr_mode_done(void *data,
659 struct tizen_policy *tizen_policy,
660 struct wl_surface *surface,
664 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
666 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
669 scr_mode_info->mode = mode;
670 scr_mode_info->wait_for_done = EINA_FALSE;
671 scr_mode_info->state = state;
675 /* LCOV_EXCL_START */
676 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)
680 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)
684 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id)
688 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)
691 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)
697 _cb_wl_tz_display_policy_brightness_done(void *data,
698 struct tizen_display_policy *tizen_display_policy,
699 struct wl_surface *surface,
703 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
705 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
708 brightness_info->brightness = brightness;
709 brightness_info->wait_for_done = EINA_FALSE;
710 brightness_info->state = state;
715 _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
717 Efl_Util_Wl_Surface_Lv_Info *lv_info;
720 if (EINA_UNLIKELY(!lv_info))
723 eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info);
727 efl_util_set_notification_window_level(Evas_Object *window,
728 efl_util_notification_level_e level)
732 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
733 EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) &&
734 (level <= EFL_UTIL_NOTIFICATION_LEVEL_TOP),
735 EFL_UTIL_ERROR_INVALID_PARAMETER);
738 Ecore_Wl2_Window *wlwin;
739 struct wl_surface *surface;
740 Efl_Util_Wl_Surface_Lv_Info *lv_info;
741 Ecore_Wl2_Window_Type wl_type;
744 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
746 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
747 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
749 type = elm_win_type_get(window);
750 if (type != ELM_WIN_NOTIFICATION)
752 wl_type = ecore_wl2_window_type_get(wlwin);
753 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
754 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
757 while (!_eflutil.wl.policy.proto)
758 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
760 surface = ecore_wl2_window_surface_get(wlwin);
761 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
762 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
764 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
767 lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
768 EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
770 lv_info->surface = surface;
771 lv_info->level = (int)level;
772 lv_info->wait_for_done = EINA_TRUE;
773 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
774 eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
778 evas_object_event_callback_add(window, EVAS_CALLBACK_DEL,
779 _cb_window_del, lv_info);
783 lv_info->level = (int)level;
784 lv_info->wait_for_done = EINA_TRUE;
785 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
789 tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
790 surface, (int)level);
792 if (lv_info->wait_for_done)
795 while (lv_info->wait_for_done && (count < 3))
797 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
798 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
802 if (lv_info->wait_for_done)
804 return EFL_UTIL_ERROR_INVALID_PARAMETER;
808 if (lv_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
810 return EFL_UTIL_ERROR_PERMISSION_DENIED;
815 return EFL_UTIL_ERROR_NONE;
819 efl_util_get_notification_window_level(Evas_Object *window,
820 efl_util_notification_level_e *level)
824 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
825 EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
828 Ecore_Wl2_Window *wlwin;
829 struct wl_surface *surface;
830 Efl_Util_Wl_Surface_Lv_Info *lv_info;
831 Ecore_Wl2_Window_Type wl_type;
834 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
836 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
837 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
839 type = elm_win_type_get(window);
840 if (type != ELM_WIN_NOTIFICATION)
842 wl_type = ecore_wl2_window_type_get(wlwin);
843 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
844 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
847 while (!_eflutil.wl.policy.proto)
848 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
850 surface = ecore_wl2_window_surface_get(wlwin);
851 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
852 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
854 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
857 if (lv_info->wait_for_done)
860 while ((lv_info->wait_for_done) && (count < 3))
862 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
863 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
867 if (lv_info->wait_for_done)
869 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
870 return EFL_UTIL_ERROR_INVALID_PARAMETER;
874 switch (lv_info->level)
876 case TIZEN_POLICY_LEVEL_NONE: *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE; break;
877 case TIZEN_POLICY_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
878 case TIZEN_POLICY_LEVEL_MEDIUM: *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM; break;
879 case TIZEN_POLICY_LEVEL_HIGH: *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH; break;
880 case TIZEN_POLICY_LEVEL_TOP: *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP; break;
881 default: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
882 return EFL_UTIL_ERROR_INVALID_PARAMETER;
884 return EFL_UTIL_ERROR_NONE;
887 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
889 return EFL_UTIL_ERROR_NONE;
893 efl_util_set_window_opaque_state(Evas_Object *window,
898 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
899 EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
900 EFL_UTIL_ERROR_INVALID_PARAMETER);
902 Ecore_Wl2_Window *wlwin;
903 struct wl_surface *surface;
905 if (!_eflutil.wl.policy.proto)
910 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
912 while (!_eflutil.wl.policy.proto && ret != -1)
913 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
915 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
918 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
920 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
922 surface = ecore_wl2_window_surface_get(wlwin);
924 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
926 tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
928 return EFL_UTIL_ERROR_NONE;
932 efl_util_set_window_screen_mode(Evas_Object *window,
933 efl_util_screen_mode_e mode)
935 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
936 EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
937 (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
938 EFL_UTIL_ERROR_INVALID_PARAMETER);
940 Ecore_Wl2_Window *wlwin;
941 struct wl_surface *surface;
942 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
946 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
948 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
951 while (!_eflutil.wl.policy.proto)
952 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
954 surface = ecore_wl2_window_surface_get(wlwin);
955 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
956 EFL_UTIL_ERROR_INVALID_PARAMETER);
958 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
961 scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
962 EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
964 scr_mode_info->surface = surface;
965 scr_mode_info->mode = (unsigned int)mode;
966 scr_mode_info->wait_for_done = EINA_TRUE;
967 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
969 eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
975 scr_mode_info->mode = (unsigned int)mode;
976 scr_mode_info->wait_for_done = EINA_TRUE;
977 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
980 tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
981 surface, (unsigned int)mode);
982 if (scr_mode_info->wait_for_done)
985 while (scr_mode_info->wait_for_done && (count < 3))
987 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
988 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
992 if (scr_mode_info->wait_for_done)
994 return EFL_UTIL_ERROR_INVALID_PARAMETER;
998 if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
1000 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1005 return EFL_UTIL_ERROR_NONE;
1008 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1012 efl_util_get_window_screen_mode(Evas_Object *window,
1013 efl_util_screen_mode_e *mode)
1015 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1016 EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
1018 Ecore_Wl2_Window *wlwin;
1019 struct wl_surface *surface;
1020 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
1024 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1026 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1029 while (!_eflutil.wl.policy.proto)
1030 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1032 surface = ecore_wl2_window_surface_get(wlwin);
1033 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1034 EFL_UTIL_ERROR_INVALID_PARAMETER);
1036 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
1039 if (scr_mode_info->wait_for_done)
1041 while (scr_mode_info->wait_for_done)
1043 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1044 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1048 switch (scr_mode_info->mode)
1050 case TIZEN_POLICY_MODE_DEFAULT: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; break;
1051 case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
1052 default: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1053 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1055 return EFL_UTIL_ERROR_NONE;
1059 *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1060 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1064 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1068 efl_util_set_window_brightness(Evas_Object *window, int brightness)
1070 Ecore_Wl2_Window *wlwin;
1071 struct wl_surface *surface;
1072 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1075 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1076 EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
1079 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1081 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1084 while (!_eflutil.wl.display_policy.proto)
1085 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1087 surface = ecore_wl2_window_surface_get(wlwin);
1088 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1089 EFL_UTIL_ERROR_INVALID_PARAMETER);
1091 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1092 if (!brightness_info)
1094 brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
1095 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1097 brightness_info->surface = surface;
1098 brightness_info->brightness = brightness;
1099 brightness_info->wait_for_done = EINA_TRUE;
1100 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1102 eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
1108 brightness_info->brightness = brightness;
1109 brightness_info->wait_for_done = EINA_TRUE;
1110 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1113 tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
1114 surface, brightness);
1115 if (brightness_info->wait_for_done)
1118 while (brightness_info->wait_for_done && (count < 3))
1120 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1121 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1125 if (brightness_info->wait_for_done)
1127 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1131 if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
1133 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1137 return EFL_UTIL_ERROR_NONE;
1140 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1144 efl_util_get_window_brightness(Evas_Object *window, int *brightness)
1146 Ecore_Wl2_Window *wlwin;
1147 struct wl_surface *surface;
1148 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1151 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1152 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
1155 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1157 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1158 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
1160 while (!_eflutil.wl.display_policy.proto)
1161 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1163 surface = ecore_wl2_window_surface_get(wlwin);
1164 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1165 EFL_UTIL_ERROR_INVALID_PARAMETER);
1167 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1168 if (brightness_info)
1170 if (brightness_info->wait_for_done)
1172 while (brightness_info->wait_for_done)
1174 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1175 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1178 *brightness = brightness_info->brightness;
1183 return EFL_UTIL_ERROR_NONE;
1187 struct _efl_util_inputgen_h
1189 unsigned int init_type;
1191 E_Devicemgr_Inputgen_Touch_Axis *axis_info;
1194 /* LCOV_EXCL_STOP */
1197 _cb_device_add(void *data EINA_UNUSED,
1198 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1199 uint32_t serial EINA_UNUSED,
1200 const char *identifier EINA_UNUSED,
1201 struct tizen_input_device *device,
1202 struct wl_seat *seat EINA_UNUSED)
1208 _cb_device_remove(void *data EINA_UNUSED,
1209 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1210 uint32_t serial EINA_UNUSED,
1211 const char *identifier EINA_UNUSED,
1212 struct tizen_input_device *device,
1213 struct wl_seat *seat EINA_UNUSED)
1219 _cb_error(void *data EINA_UNUSED,
1220 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1223 _eflutil.wl.devmgr.request_notified = errorcode;
1226 /* LCOV_EXCL_START */
1228 _cb_block_expired(void *data EINA_UNUSED,
1229 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
1233 /* LCOV_EXCL_STOP */
1236 _cb_max_touch_count(void *data EINA_UNUSED,
1237 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1238 uint32_t serial EINA_UNUSED,
1240 struct wl_seat *seat EINA_UNUSED)
1242 _eflutil.wl.devmgr.max_touch_count = max_count;
1245 static efl_util_error_e
1246 _efl_util_input_convert_input_generator_error(int ret)
1250 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
1251 return EFL_UTIL_ERROR_NONE;
1252 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
1253 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1254 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
1255 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
1256 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
1257 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1258 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NOT_ALLOWED:
1259 return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
1261 return EFL_UTIL_ERROR_NONE;
1265 static efl_util_inputgen_h
1266 _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *ret, int with_name)
1268 efl_util_inputgen_h inputgen_h = NULL;
1269 unsigned int clas = 0x0;
1272 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1273 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1274 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1276 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1280 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1283 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1287 inputgen_h->init_type |= dev_type;
1290 if (name) strncpy(inputgen_h->name, name, 31);
1291 else strncpy(inputgen_h->name, "Input Generator", 31);
1295 if (*ret == (int)EINA_FALSE)
1297 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1301 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1302 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1303 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1304 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1305 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1306 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1308 while (!_eflutil.wl.devmgr.devicemgr)
1309 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1312 tizen_input_device_manager_init_generator_with_sync(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1313 else if (with_name == 1)
1314 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1316 tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
1319 while (_eflutil.wl.devmgr.request_notified == -1)
1320 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1322 *ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1323 _eflutil.wl.devmgr.request_notified = -1;
1325 set_last_result(*ret);
1326 if (*ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1340 API efl_util_inputgen_h
1341 efl_util_input_initialize_generator(unsigned int dev_type)
1343 int ret = EFL_UTIL_ERROR_NONE;
1344 efl_util_inputgen_h inputgen_h = NULL;
1346 inputgen_h = _efl_util_input_create_inputgen(dev_type, NULL, &ret, 0);
1353 API efl_util_inputgen_h
1354 efl_util_input_initialize_generator_with_name(unsigned int dev_type, const char *name)
1356 int ret = EFL_UTIL_ERROR_NONE;
1357 efl_util_inputgen_h inputgen_h = NULL;
1359 inputgen_h = _efl_util_input_create_inputgen(dev_type, name, &ret, 1);
1366 API efl_util_inputgen_h
1367 efl_util_input_initialize_generator_with_sync(unsigned int dev_type, const char *name)
1369 int ret = EFL_UTIL_ERROR_NONE;
1370 efl_util_inputgen_h inputgen_h = NULL;
1372 inputgen_h = _efl_util_input_create_inputgen(dev_type, name, &ret, 2);
1380 efl_util_input_set_touch_count(int max_count)
1382 int ret = EFL_UTIL_ERROR_NONE;
1385 if (ret == (int)EINA_FALSE)
1387 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1390 while (!_eflutil.wl.devmgr.devicemgr)
1391 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1393 if (_eflutil.wl.devmgr.max_touch_count >= max_count)
1394 return EFL_UTIL_ERROR_NONE;
1396 tizen_input_device_manager_set_touch_count(_eflutil.wl.devmgr.devicemgr, max_count);
1398 while (_eflutil.wl.devmgr.request_notified == -1)
1399 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1401 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1402 _eflutil.wl.devmgr.request_notified = -1;
1404 if (ret == EFL_UTIL_ERROR_NONE)
1406 _eflutil.wl.devmgr.request_touch_count = max_count;
1413 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
1415 int ret = EFL_UTIL_ERROR_NONE;
1416 unsigned int clas = 0x0;
1417 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1419 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1420 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1421 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1422 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1423 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1424 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1426 if (inputgen_h->axis_info)
1427 free(inputgen_h->axis_info);
1432 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1434 tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
1436 while (_eflutil.wl.devmgr.request_notified == -1)
1437 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1439 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1440 _eflutil.wl.devmgr.request_notified = -1;
1446 efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name, int pressed)
1448 int ret = EFL_UTIL_ERROR_NONE;
1450 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1451 EINA_SAFETY_ON_NULL_RETURN_VAL(key_name, EFL_UTIL_ERROR_INVALID_PARAMETER);
1452 EINA_SAFETY_ON_FALSE_RETURN_VAL(pressed == 0 || pressed == 1, EFL_UTIL_ERROR_INVALID_PARAMETER);
1453 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1455 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1457 tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
1459 while (_eflutil.wl.devmgr.request_notified == -1)
1460 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1462 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1463 _eflutil.wl.devmgr.request_notified = -1;
1469 efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
1470 efl_util_input_touch_type_e touch_type, int x, int y)
1473 enum tizen_input_device_manager_pointer_event_type type;
1475 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1476 EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1477 EINA_SAFETY_ON_FALSE_RETURN_VAL((x > 0 && y > 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1478 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1480 if (idx >= _eflutil.wl.devmgr.max_touch_count)
1481 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1483 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1487 case EFL_UTIL_INPUT_TOUCH_BEGIN:
1488 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1490 case EFL_UTIL_INPUT_TOUCH_UPDATE:
1491 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1493 case EFL_UTIL_INPUT_TOUCH_END:
1494 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1497 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1500 tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1502 while (_eflutil.wl.devmgr.request_notified == -1)
1503 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1505 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1506 _eflutil.wl.devmgr.request_notified = -1;
1512 _efl_util_input_generate_touch_axis_send(unsigned int type, double value)
1516 tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_double(value));
1518 while (_eflutil.wl.devmgr.request_notified == -1)
1519 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1521 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1522 _eflutil.wl.devmgr.request_notified = -1;
1528 _efl_util_input_generate_touch_axis_cleanup(efl_util_inputgen_h inputgen_h, int idx)
1533 inputgen_h->axis_info[idx].radius_x = 1.0;
1534 inputgen_h->axis_info[idx].radius_y = 1.0;
1535 inputgen_h->axis_info[idx].pressure = 1.0;
1536 inputgen_h->axis_info[idx].angle = 0.0;
1537 inputgen_h->axis_info[idx].palm = 0.0;
1541 for (i = 0; i < EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER; i++)
1543 inputgen_h->axis_info[i].radius_x = 1.0;
1544 inputgen_h->axis_info[i].radius_y = 1.0;
1545 inputgen_h->axis_info[i].pressure = 1.0;
1546 inputgen_h->axis_info[i].angle = 0.0;
1547 inputgen_h->axis_info[i].palm = 0.0;
1553 _efl_util_input_generate_touch_axis_process(efl_util_inputgen_h inputgen_h, int idx, double radius_x,
1554 double radius_y, double pressure, double angle, double palm)
1556 int ret = EFL_UTIL_ERROR_NONE;
1558 if (!inputgen_h->axis_info)
1560 inputgen_h->axis_info = calloc(EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER,
1561 sizeof(E_Devicemgr_Inputgen_Touch_Axis));
1562 _efl_util_input_generate_touch_axis_cleanup(inputgen_h, -1);
1565 if (inputgen_h->axis_info[idx].radius_x != radius_x)
1567 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_X, radius_x);
1568 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1569 inputgen_h->axis_info[idx].radius_x = radius_x;
1571 if (inputgen_h->axis_info[idx].radius_y != radius_y)
1573 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_Y, radius_y);
1574 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1575 inputgen_h->axis_info[idx].radius_y = radius_y;
1577 if (inputgen_h->axis_info[idx].pressure != pressure)
1579 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PRESSURE, pressure);
1580 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1581 inputgen_h->axis_info[idx].pressure = pressure;
1583 if (inputgen_h->axis_info[idx].angle != angle)
1585 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_ANGLE, angle);
1586 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1587 inputgen_h->axis_info[idx].angle = angle;
1589 if (inputgen_h->axis_info[idx].palm != palm)
1591 ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PALM, palm);
1592 if (ret != EFL_UTIL_ERROR_NONE) return ret;
1593 inputgen_h->axis_info[idx].palm = palm;
1600 efl_util_input_generate_touch_axis(efl_util_inputgen_h inputgen_h, int idx,
1601 efl_util_input_touch_type_e touch_type, int x, int y,
1602 double radius_x, double radius_y,
1603 double pressure, double angle, double palm)
1606 enum tizen_input_device_manager_pointer_event_type type;
1608 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1609 EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1610 EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1611 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1612 EINA_SAFETY_ON_FALSE_RETURN_VAL((radius_x >= 0.0 && radius_y >= 0.0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1613 EINA_SAFETY_ON_FALSE_RETURN_VAL((pressure >= 0.0 && palm >= 0.0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1615 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1616 version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
1617 EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
1621 case EFL_UTIL_INPUT_TOUCH_BEGIN:
1622 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1624 case EFL_UTIL_INPUT_TOUCH_UPDATE:
1625 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1627 case EFL_UTIL_INPUT_TOUCH_END:
1628 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1631 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1634 if (touch_type != EFL_UTIL_INPUT_TOUCH_END)
1635 _efl_util_input_generate_touch_axis_process(inputgen_h, idx, radius_x, radius_y, pressure, angle, palm);
1637 _efl_util_input_generate_touch_axis_cleanup(inputgen_h, idx);
1639 tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1641 while (_eflutil.wl.devmgr.request_notified == -1)
1642 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1644 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1645 _eflutil.wl.devmgr.request_notified = -1;
1652 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)
1655 enum tizen_input_device_manager_pointer_event_type type;
1657 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1658 EINA_SAFETY_ON_FALSE_RETURN_VAL(buttons > 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1659 EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1660 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1662 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1664 switch(pointer_type)
1666 case EFL_UTIL_INPUT_POINTER_BUTTON_DOWN:
1667 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1669 case EFL_UTIL_INPUT_POINTER_MOVE:
1670 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1672 case EFL_UTIL_INPUT_POINTER_BUTTON_UP:
1673 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1676 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1679 tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
1681 while (_eflutil.wl.devmgr.request_notified == -1)
1682 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1684 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1685 _eflutil.wl.devmgr.request_notified = -1;
1691 efl_util_input_generate_wheel(efl_util_inputgen_h inputgen_h, efl_util_input_pointer_wheel_type_e wheel_type, int value)
1694 enum tizen_input_device_manager_pointer_event_type type;
1696 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1697 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1699 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1700 version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
1701 EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
1705 case EFL_UTIL_INPUT_POINTER_WHEEL_VERT:
1706 type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_WHEEL;
1708 case EFL_UTIL_INPUT_POINTER_WHEEL_HORZ:
1709 type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_HWHEEL;
1712 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1715 tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_int(value));
1717 while (_eflutil.wl.devmgr.request_notified == -1)
1718 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1720 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1721 _eflutil.wl.devmgr.request_notified = -1;
1728 struct _efl_util_screenshot_h
1733 Eina_Bool shot_done;
1738 Eina_Bool auto_rotation;
1741 /* scrrenshot handle */
1742 static efl_util_screenshot_h g_screenshot;
1743 static Eina_Bool shot_mutex_init;
1744 static pthread_mutex_t shot_lock;
1747 _screenshot_mutex_init(void)
1749 if (shot_mutex_init)
1752 if (pthread_mutex_init(&shot_lock, NULL))
1754 fprintf(stderr, "[screenshot] fail: mutex init"); /*LCOV_EXCL_LINE*/
1755 return EINA_FALSE; /*LCOV_EXCL_LINE*/
1758 shot_mutex_init = EINA_TRUE;
1764 _screenshot_mutex_destory(void)
1766 if (!shot_mutex_init)
1769 if (pthread_mutex_destroy(&shot_lock))
1771 fprintf(stderr, "[screenshot] fail: mutex destory"); /*LCOV_EXCL_LINE*/
1772 return EINA_FALSE; /*LCOV_EXCL_LINE*/
1775 shot_mutex_init = EINA_FALSE;
1781 _screenshot_mutex_lock(void)
1783 if (!_screenshot_mutex_init())
1786 pthread_mutex_lock(&shot_lock);
1790 _screenshot_mutex_unlock(void)
1792 pthread_mutex_unlock(&shot_lock);
1796 _efl_util_wl_screenshooter_init()
1798 struct wl_display *display_wrapper = NULL;
1799 struct wl_registry *registry = NULL;
1802 if (_wl_init() == EINA_FALSE)
1805 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1807 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
1808 EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE);
1810 _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
1811 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_create_queue);
1813 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
1815 registry = wl_display_get_registry(display_wrapper);
1816 EINA_SAFETY_ON_NULL_GOTO(registry, fail_get_registry);
1818 wl_registry_add_listener(registry, &_wl_reg_screenshooter_listener, NULL);
1820 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
1821 EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_roundtrip);
1822 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tz_screenshooter, fail_roundtrip);
1824 _eflutil.wl.shot.tbm_client = wayland_tbm_client_init(_eflutil.wl.dpy);
1825 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tbm_client, fail_tbm_client_init);
1827 wl_registry_destroy(registry);
1828 wl_proxy_wrapper_destroy(display_wrapper);
1830 if (_eflutil.wl.shot.noti == 0)
1832 fprintf(stderr, "[screenshot] fail: privilege error\n"); /* LCOV_EXCL_LINE */
1838 fail_tbm_client_init:
1839 tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1840 _eflutil.wl.shot.tz_screenshooter = NULL;
1842 wl_registry_destroy(registry);
1844 wl_event_queue_destroy(_eflutil.wl.shot.queue);
1845 _eflutil.wl.shot.queue = NULL;
1847 wl_proxy_wrapper_destroy(display_wrapper);
1853 _efl_util_wl_screenshooter_deinit()
1855 if (_eflutil.wl.shot.tbm_client)
1857 wayland_tbm_client_deinit(_eflutil.wl.shot.tbm_client);
1858 _eflutil.wl.shot.tbm_client = NULL;
1861 if (_eflutil.wl.shot.tz_screenshooter)
1863 tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1864 _eflutil.wl.shot.tz_screenshooter = NULL;
1867 if (_eflutil.wl.shot.queue)
1869 wl_event_queue_destroy(_eflutil.wl.shot.queue);
1870 _eflutil.wl.shot.queue = NULL;
1874 API efl_util_screenshot_h
1875 efl_util_screenshot_initialize(int width, int height)
1877 efl_util_screenshot_h screenshot = NULL;
1879 if (width <= 0 || height <= 0)
1881 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1885 _screenshot_mutex_lock();
1889 if (g_screenshot->width != width || g_screenshot->height != height)
1891 g_screenshot->width = width;
1892 g_screenshot->height = height;
1894 set_last_result(EFL_UTIL_ERROR_NONE);
1896 _screenshot_mutex_unlock();
1898 return g_screenshot;
1901 screenshot = calloc(1, sizeof(struct _efl_util_screenshot_h));
1902 if (screenshot == NULL)
1904 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1906 _screenshot_mutex_unlock();
1911 if (!_eflutil.wl.shot.tz_screenshooter)
1913 if (_efl_util_wl_screenshooter_init() == EINA_FALSE)
1915 if (_eflutil.wl.shot.noti == 0)
1916 set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
1918 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1922 _screenshot_mutex_unlock();
1928 screenshot->width = width;
1929 screenshot->height = height;
1930 screenshot->auto_rotation = EINA_TRUE;
1932 screenshot->bufmgr = wayland_tbm_client_get_bufmgr(_eflutil.wl.shot.tbm_client);
1933 EINA_SAFETY_ON_NULL_GOTO(screenshot->bufmgr, fail_get_bufmgr);
1935 g_screenshot = screenshot;
1936 set_last_result(EFL_UTIL_ERROR_NONE);
1938 tizen_screenshooter_set_user_data(_eflutil.wl.shot.tz_screenshooter, &screenshot->shot_done);
1940 _screenshot_mutex_unlock();
1942 return g_screenshot;
1944 /* LCOV_EXCL_START */
1946 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1947 _screenshot_mutex_unlock();
1948 efl_util_screenshot_deinitialize(screenshot);
1951 /* LCOV_EXCL_STOP */
1955 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
1957 _screenshot_mutex_lock();
1961 _screenshot_mutex_unlock();
1962 _screenshot_mutex_destory();
1963 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1967 g_screenshot = NULL;
1969 _efl_util_wl_screenshooter_deinit();
1971 _screenshot_mutex_unlock();
1972 _screenshot_mutex_destory();
1974 return EFL_UTIL_ERROR_NONE;
1979 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
1981 tbm_surface_h t_surface = NULL;
1982 struct wl_buffer *buffer = NULL;
1983 Efl_Util_Wl_Output_Info *output;
1986 _screenshot_mutex_lock();
1988 if (!screenshot || (screenshot != g_screenshot))
1990 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1991 _screenshot_mutex_unlock();
1995 output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
1998 fprintf(stderr, "[screenshot] fail: no output for screenshot\n"); /* LCOV_EXCL_LINE */
2002 t_surface = tbm_surface_create(screenshot->width, screenshot->height, TBM_FORMAT_XRGB8888);
2005 fprintf(stderr, "[screenshot] fail: tbm_surface_create\n"); /* LCOV_EXCL_LINE */
2009 buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, t_surface);
2012 fprintf(stderr, "[screenshot] fail: create wl_buffer for screenshot\n"); /* LCOV_EXCL_LINE */
2016 tizen_screenshooter_shoot(_eflutil.wl.shot.tz_screenshooter, output->output, buffer);
2018 screenshot->shot_done = EINA_FALSE;
2020 while (!screenshot->shot_done && ret != -1)
2021 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2025 fprintf(stderr, "[screenshot] fail: tizen_screenshooter_shoot\n"); /* LCOV_EXCL_LINE */
2029 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2031 /* reset shot_done for next screenshot */
2032 screenshot->shot_done = EINA_FALSE;
2034 set_last_result(EFL_UTIL_ERROR_NONE);
2036 _screenshot_mutex_unlock();
2042 tbm_surface_destroy(t_surface);
2044 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2046 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL);
2048 _screenshot_mutex_unlock();
2054 efl_util_screenshot_set_auto_rotation(efl_util_screenshot_h screenshot, int set)
2056 if (!screenshot || (screenshot != g_screenshot))
2057 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2059 if (!(set == 0 || set == 1))
2060 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2063 g_screenshot->auto_rotation = EINA_TRUE;
2065 g_screenshot->auto_rotation = EINA_FALSE;
2067 tizen_screenshooter_set_oneshot_auto_rotation(_eflutil.wl.shot.tz_screenshooter, g_screenshot->auto_rotation);
2069 return EFL_UTIL_ERROR_NONE;
2073 efl_util_screenshot_get_auto_rotation(efl_util_screenshot_h screenshot, int *set)
2075 if (!screenshot || (screenshot != g_screenshot) || !set)
2076 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2078 *set = g_screenshot->auto_rotation;
2080 return EFL_UTIL_ERROR_NONE;
2083 /* LCOV_EXCL_START */
2084 struct _efl_util_screenmirror_h
2086 struct tizen_screenmirror *tz_screenmirror;
2092 Eina_List *buffer_list;
2094 Eina_Bool mirror_working;
2097 Eina_Bool cb_content;
2098 efl_util_screenmirror_handler user_func;
2102 typedef struct _efl_util_mirror_buffer efl_util_mirror_buffer;
2103 struct _efl_util_mirror_buffer
2105 struct wl_buffer *buffer;
2107 tbm_surface_h t_surface;
2110 static efl_util_screenmirror_h g_screenmirror;
2113 _efl_util_screenmirror_loop(void *data)
2115 efl_util_screenmirror_h screenmirror;
2118 screenmirror = (efl_util_screenmirror_h)data;
2122 if (!screenmirror->mirror_working)
2125 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2128 fprintf(stderr, "[screenmirror] fail: dispatch_queue\n");
2136 static efl_util_mirror_buffer *
2137 _efl_util_create_mirror_buffer(efl_util_screenmirror_h screenmirror)
2139 efl_util_mirror_buffer *mbuffer;
2141 mbuffer = calloc(1, sizeof(struct _efl_util_mirror_buffer));
2142 EINA_SAFETY_ON_NULL_RETURN_VAL(mbuffer, NULL);
2144 mbuffer->w = screenmirror->width;
2145 mbuffer->h = screenmirror->height;
2147 mbuffer->t_surface = tbm_surface_internal_create_with_flags(mbuffer->w,
2148 mbuffer->h, TBM_FORMAT_ARGB8888, TBM_BO_SCANOUT);
2149 EINA_SAFETY_ON_NULL_GOTO(mbuffer->t_surface, fail_create_surface);
2151 mbuffer->buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, mbuffer->t_surface);
2152 EINA_SAFETY_ON_NULL_GOTO(mbuffer->buffer, fail_create_buffer);
2157 tbm_surface_destroy(mbuffer->t_surface);
2158 fail_create_surface:
2165 _efl_util_destroy_mirror_buffer(efl_util_mirror_buffer *mbuffer)
2167 EINA_SAFETY_ON_NULL_RETURN(mbuffer);
2169 if (mbuffer->buffer)
2170 wl_buffer_destroy(mbuffer->buffer);
2176 _efl_util_screenmirror_handle_dequeued(void *data,
2177 struct tizen_screenmirror *tz_screenmirror, struct wl_buffer *buffer)
2179 efl_util_screenmirror_h screenmirror;
2180 efl_util_mirror_buffer *mbuffer;
2183 screenmirror = (efl_util_screenmirror_h)data;
2184 screenmirror->cb_start = EINA_TRUE;
2186 EINA_LIST_FOREACH_SAFE(screenmirror->buffer_list, l, ll, mbuffer)
2188 if (mbuffer->buffer == buffer)
2190 if (mbuffer->w != screenmirror->width || mbuffer->h != screenmirror->height ||
2191 !screenmirror->mirror_working)
2192 tbm_surface_destroy(mbuffer->t_surface);
2194 screenmirror->user_func(screenmirror, mbuffer->t_surface, screenmirror->user_data);
2196 screenmirror->buffer_list = eina_list_remove_list(screenmirror->buffer_list, l);
2197 _efl_util_destroy_mirror_buffer(mbuffer);
2203 mbuffer = _efl_util_create_mirror_buffer(screenmirror);
2204 if (mbuffer == NULL)
2206 fprintf(stderr, "[screenmirror] fail: buffer create\n");
2209 screenmirror->buffer_list = eina_list_append(screenmirror->buffer_list, mbuffer);
2210 tizen_screenmirror_queue(screenmirror->tz_screenmirror, mbuffer->buffer);
2214 _efl_util_screenmirror_handle_content(void *data,
2215 struct tizen_screenmirror *tz_screenmirror, uint32_t content)
2217 efl_util_screenmirror_h screenmirror = NULL;
2219 screenmirror = (efl_util_screenmirror_h)data;
2220 screenmirror->cb_content = EINA_TRUE;
2224 _efl_util_screenmirror_handle_stop(void *data, struct tizen_screenmirror *tz_screenmirror)
2226 efl_util_screenmirror_h screenmirror = NULL;
2228 screenmirror = (efl_util_screenmirror_h)data;
2229 screenmirror->cb_stop = EINA_TRUE;
2232 static const struct tizen_screenmirror_listener efl_util_screenmirror_listener = {
2233 _efl_util_screenmirror_handle_dequeued,
2234 _efl_util_screenmirror_handle_content,
2235 _efl_util_screenmirror_handle_stop
2238 API efl_util_screenmirror_h
2239 efl_util_screenmirror_initialize(int width, int height)
2241 efl_util_screenmirror_h screenmirror = NULL;
2242 efl_util_mirror_buffer *mbuffer;
2243 Efl_Util_Wl_Output_Info *output;
2246 if (width <= 0 || height <= 0)
2248 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2252 _screenshot_mutex_lock();
2256 if (g_screenmirror->mirror_working)
2258 set_last_result(EFL_UTIL_ERROR_INVALID_OPERATION);
2259 _screenshot_mutex_unlock();
2264 g_screenmirror->width = width;
2265 g_screenmirror->height = height;
2266 set_last_result(EFL_UTIL_ERROR_NONE);
2267 _screenshot_mutex_unlock();
2268 return g_screenmirror;
2272 screenmirror = calloc(1, sizeof(struct _efl_util_screenmirror_h));
2273 if (screenmirror == NULL)
2275 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
2276 _screenshot_mutex_unlock();
2280 if (!_eflutil.wl.shot.tz_screenshooter)
2282 if (_efl_util_wl_screenshooter_init() == EINA_FALSE)
2284 if (_eflutil.wl.shot.noti == 0)
2285 set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
2287 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
2293 output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
2296 set_last_result(EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE);
2297 fprintf(stderr, "[screenmirror] fail: no output for screenmirror\n");
2298 goto fail_get_output;
2301 screenmirror->tz_screenmirror = tizen_screenshooter_get_screenmirror(_eflutil.wl.shot.tz_screenshooter, output->output);
2302 wl_proxy_set_queue((struct wl_proxy *)screenmirror->tz_screenmirror, _eflutil.wl.shot.queue);
2303 tizen_screenmirror_add_listener(screenmirror->tz_screenmirror, &efl_util_screenmirror_listener, screenmirror);
2304 tizen_screenmirror_set_stretch(screenmirror->tz_screenmirror, TIZEN_SCREENMIRROR_STRETCH_KEEP_RATIO);
2305 screenmirror->width = width;
2306 screenmirror->height = height;
2308 g_screenmirror = screenmirror;
2310 for (i = 0; i < 1; i++)
2312 mbuffer = _efl_util_create_mirror_buffer(screenmirror);
2315 screenmirror->buffer_list = eina_list_append(screenmirror->buffer_list, mbuffer);
2316 tizen_screenmirror_queue(screenmirror->tz_screenmirror, mbuffer->buffer);
2319 fprintf(stderr, "[screenmirror] fail: buffer create %d\n", i);
2321 while (!screenmirror->cb_content && ret != -1)
2322 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2324 _screenshot_mutex_unlock();
2326 return screenmirror;
2331 _screenshot_mutex_unlock();
2336 efl_util_screenmirror_deinitialize(efl_util_screenmirror_h screenmirror)
2338 efl_util_mirror_buffer *mbuffer;
2341 _screenshot_mutex_lock();
2343 if (!screenmirror || (screenmirror != g_screenmirror))
2345 _screenshot_mutex_unlock();
2346 _screenshot_mutex_destory();
2347 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2350 if (screenmirror->mirror_working)
2352 fprintf(stderr, "[screenmirror] fail: execute stop before deinit\n");
2353 _screenshot_mutex_unlock();
2354 _screenshot_mutex_destory();
2355 return EFL_UTIL_ERROR_INVALID_OPERATION;
2358 EINA_LIST_FOREACH(screenmirror->buffer_list, l, mbuffer)
2360 tbm_surface_destroy(mbuffer->t_surface);
2361 _efl_util_destroy_mirror_buffer(mbuffer);
2363 eina_list_free(screenmirror->buffer_list);
2365 tizen_screenmirror_destroy(screenmirror->tz_screenmirror);
2367 g_screenmirror = NULL;
2369 _efl_util_wl_screenshooter_deinit();
2371 _screenshot_mutex_unlock();
2372 _screenshot_mutex_destory();
2374 return EFL_UTIL_ERROR_NONE;
2378 efl_util_screenmirror_set_handler(efl_util_screenmirror_h screenmirror,
2379 efl_util_screenmirror_handler func, void *data)
2381 _screenshot_mutex_lock();
2383 if (!screenmirror || (screenmirror != g_screenmirror) || !func)
2385 _screenshot_mutex_unlock();
2386 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2388 screenmirror->user_func = func;
2389 screenmirror->user_data = data;
2391 _screenshot_mutex_unlock();
2393 return EFL_UTIL_ERROR_NONE;
2397 efl_util_screenmirror_start(efl_util_screenmirror_h screenmirror)
2401 _screenshot_mutex_lock();
2403 if (!screenmirror || (screenmirror != g_screenmirror))
2405 _screenshot_mutex_unlock();
2406 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2408 else if (!screenmirror->user_func)
2410 _screenshot_mutex_unlock();
2411 return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2413 else if (screenmirror->mirror_working)
2415 _screenshot_mutex_unlock();
2416 return EFL_UTIL_ERROR_NONE;
2419 screenmirror->cb_start = EINA_FALSE;
2420 screenmirror->mirror_working = EINA_TRUE;
2421 tizen_screenmirror_start(screenmirror->tz_screenmirror);
2422 while (!screenmirror->cb_start && ret != -1)
2423 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2426 fprintf(stderr, "[screenmirror] fail: tizen_screenmirror_start\n");
2427 _screenshot_mutex_unlock();
2428 return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2431 ret = pthread_create(&screenmirror->thread, NULL, _efl_util_screenmirror_loop, screenmirror);
2434 fprintf(stderr, "[screenmirror] fail: thread create fail\n");
2435 _screenshot_mutex_unlock();
2436 return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2439 pthread_setname_np(screenmirror->thread, "e_util_mirror");
2441 _screenshot_mutex_unlock();
2443 return EFL_UTIL_ERROR_NONE;
2447 efl_util_screenmirror_stop(efl_util_screenmirror_h screenmirror)
2451 _screenshot_mutex_lock();
2453 if (!screenmirror || (screenmirror != g_screenmirror))
2455 _screenshot_mutex_unlock();
2456 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2458 else if (!screenmirror->mirror_working)
2460 _screenshot_mutex_unlock();
2461 return EFL_UTIL_ERROR_NONE;
2463 screenmirror->mirror_working = EINA_FALSE;
2464 pthread_join(screenmirror->thread, NULL);
2465 tizen_screenmirror_stop(screenmirror->tz_screenmirror);
2466 screenmirror->cb_stop = EINA_FALSE;
2468 while (!screenmirror->cb_stop && ret != -1)
2469 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2472 fprintf(stderr, "[screenmirror] fail: tizen_screenmirror_stop\n");
2473 _screenshot_mutex_unlock();
2474 return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2477 _screenshot_mutex_unlock();
2479 return EFL_UTIL_ERROR_NONE;
2481 /* LCOV_EXCL_STOP */
2483 struct _efl_util_gesture_h
2488 API int EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2489 API int EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2490 API int EFL_UTIL_EVENT_GESTURE_TAP = 0;
2491 API int EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2493 /* LCOV_EXCL_START */
2495 _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)
2497 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2501 _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)
2503 efl_util_event_gesture_edge_swipe_s *ev = NULL;
2505 ev = (efl_util_event_gesture_edge_swipe_s *)calloc(1, sizeof(*ev));
2510 ev->fingers = fingers;
2515 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE, ev, NULL, NULL);
2519 _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)
2521 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2525 _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)
2527 efl_util_event_gesture_edge_drag_s *ev = NULL;
2529 ev = (efl_util_event_gesture_edge_drag_s *)calloc(1, sizeof(*ev));
2534 ev->fingers = fingers;
2539 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_DRAG, ev, NULL, NULL);
2543 _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)
2545 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2549 _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats)
2551 efl_util_event_gesture_tap_s *ev = NULL;
2553 ev = (efl_util_event_gesture_tap_s *)calloc(1, sizeof(*ev));
2558 ev->fingers = fingers;
2559 ev->repeats = repeats;
2561 ecore_event_add(EFL_UTIL_EVENT_GESTURE_TAP, ev, NULL, NULL);
2563 /* LCOV_EXCL_STOP */
2566 _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)
2568 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2571 /* LCOV_EXCL_START */
2573 _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)
2575 efl_util_event_gesture_palm_cover_s *ev = NULL;
2577 ev = (efl_util_event_gesture_palm_cover_s *)calloc(1, sizeof(*ev));
2582 ev->duration = duration;
2586 ev->pressure = wl_fixed_to_int(pressure);
2588 ecore_event_add(EFL_UTIL_EVENT_GESTURE_PALM_COVER, ev, NULL, NULL);
2590 /* LCOV_EXCL_STOP */
2593 _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)
2595 _eflutil_defaultqueue.wl.gesture.request_notified = error;
2598 static efl_util_error_e
2599 _efl_util_gesture_convert_error(int ret)
2603 case TIZEN_GESTURE_ERROR_NONE:
2604 return EFL_UTIL_ERROR_NONE;
2605 case TIZEN_GESTURE_ERROR_INVALID_DATA:
2606 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2607 case TIZEN_GESTURE_ERROR_NO_PERMISSION:
2608 return EFL_UTIL_ERROR_PERMISSION_DENIED;
2609 case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
2610 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
2611 case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
2612 return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
2613 case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
2614 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2616 return EFL_UTIL_ERROR_NONE;
2620 /* LCOV_EXCL_START */
2621 static efl_util_error_e
2622 _efl_util_gesture_verify_request_notified()
2624 int ret = EFL_UTIL_ERROR_NONE;
2626 while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2627 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2629 ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2630 _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2636 _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed)
2638 int ret = EFL_UTIL_ERROR_NONE;
2639 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2640 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2641 unsigned int fingers = 0;
2642 unsigned int edge = 0;
2643 unsigned int edge_size = 0;
2644 unsigned int start_point = 0;
2645 unsigned int end_point = 0;
2647 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2649 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2650 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2651 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2652 EFL_UTIL_ERROR_INVALID_PARAMETER);
2654 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2656 fingers = edge_swipe_data->fingers;
2657 edge = edge_swipe_data->edge;
2658 edge_size = edge_swipe_data->edge_size;
2659 start_point = edge_swipe_data->start_point;
2660 end_point = edge_swipe_data->end_point;
2663 tizen_gesture_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2665 tizen_gesture_ungrab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2667 ret = _efl_util_gesture_verify_request_notified();
2673 _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed)
2675 int ret = EFL_UTIL_ERROR_NONE;
2676 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2677 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2678 unsigned int fingers = 0;
2679 unsigned int edge = 0;
2680 unsigned int edge_size = 0;
2681 unsigned int start_point = 0;
2682 unsigned int end_point = 0;
2684 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2686 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2687 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2688 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2689 EFL_UTIL_ERROR_INVALID_PARAMETER);
2691 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2693 fingers = edge_drag_data->fingers;
2694 edge = edge_drag_data->edge;
2695 edge_size = edge_drag_data->edge_size;
2696 start_point = edge_drag_data->start_point;
2697 end_point = edge_drag_data->end_point;
2700 tizen_gesture_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2702 tizen_gesture_ungrab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2704 ret = _efl_util_gesture_verify_request_notified();
2710 _efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed)
2712 int ret = EFL_UTIL_ERROR_NONE;
2713 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2714 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2715 unsigned int fingers = 0;
2716 unsigned int repeats = 0;
2718 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2720 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2721 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2722 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2723 EFL_UTIL_ERROR_INVALID_PARAMETER);
2725 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2727 fingers = tap_data->fingers;
2728 repeats = tap_data->repeats;
2731 tizen_gesture_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2733 tizen_gesture_ungrab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2735 ret = _efl_util_gesture_verify_request_notified();
2741 _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data, Eina_Bool grabbed)
2743 int ret = EFL_UTIL_ERROR_NONE;
2744 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2746 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2748 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2749 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2750 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2751 EFL_UTIL_ERROR_INVALID_PARAMETER);
2754 tizen_gesture_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2756 tizen_gesture_ungrab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2758 ret = _efl_util_gesture_verify_request_notified();
2762 /* LCOV_EXCL_STOP */
2764 API efl_util_gesture_h
2765 efl_util_gesture_initialize(void)
2767 efl_util_gesture_h gesture_h = NULL;
2769 gesture_h = (efl_util_gesture_h)calloc(1, sizeof(struct _efl_util_gesture_h));
2772 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2773 goto out; /* LCOV_EXCL_LINE */
2776 if (_wl_init_default_queue() == (int)EINA_FALSE)
2778 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2779 goto out; /* LCOV_EXCL_LINE */
2782 while (!_eflutil_defaultqueue.wl.gesture.proto)
2783 wl_display_dispatch(_eflutil_defaultqueue.wl.dpy); /* LCOV_EXCL_LINE */
2785 if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2787 if (ecore_event_init() <= 0)
2789 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2790 goto out; /* LCOV_EXCL_LINE */
2792 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = ecore_event_type_new();
2793 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = ecore_event_type_new();
2794 EFL_UTIL_EVENT_GESTURE_TAP = ecore_event_type_new();
2795 EFL_UTIL_EVENT_GESTURE_PALM_COVER = ecore_event_type_new();
2797 _eflutil_defaultqueue.wl.gesture.event_init++;
2798 gesture_h->init = EINA_TRUE;
2800 set_last_result(EFL_UTIL_ERROR_NONE);
2804 /* LCOV_EXCL_START */
2811 /* LCOV_EXCL_STOP */
2815 efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
2817 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2818 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2823 _eflutil_defaultqueue.wl.gesture.event_init--;
2825 if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2827 _eflutil_defaultqueue.wl.gesture.event_init = 0;
2828 ecore_event_shutdown();
2829 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2830 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2831 EFL_UTIL_EVENT_GESTURE_TAP = 0;
2832 EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2835 return EFL_UTIL_ERROR_NONE;
2838 API efl_util_gesture_data
2839 efl_util_gesture_edge_swipe_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2841 Efl_Util_Gesture_Edge_Swipe_Grab_Data *data;
2843 if (!gesture_h || gesture_h->init == EINA_FALSE)
2845 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2849 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2851 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2855 data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Swipe_Grab_Data));
2858 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2859 return NULL; /* LCOV_EXCL_LINE */
2862 data->base.type = TIZEN_GESTURE_TYPE_EDGE_SWIPE;
2863 data->fingers = fingers;
2865 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2867 set_last_result(EFL_UTIL_ERROR_NONE);
2869 return (void *)data;
2873 efl_util_gesture_edge_swipe_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2875 if (!gesture_h || gesture_h->init == EINA_FALSE)
2877 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2882 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2888 return EFL_UTIL_ERROR_NONE;
2892 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)
2894 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = data;
2896 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_swipe_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2897 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_swipe_data->base.type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2898 EFL_UTIL_ERROR_INVALID_PARAMETER);
2899 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2900 EFL_UTIL_ERROR_INVALID_PARAMETER);
2901 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2903 edge_swipe_data->edge_size = edge_size;
2904 edge_swipe_data->start_point = start_point;
2905 edge_swipe_data->end_point = end_point;
2907 return EFL_UTIL_ERROR_NONE;
2910 API efl_util_gesture_data
2911 efl_util_gesture_edge_drag_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2913 Efl_Util_Gesture_Edge_Drag_Grab_Data *data;
2915 if (!gesture_h || gesture_h->init == EINA_FALSE)
2917 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2921 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2923 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2927 data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Drag_Grab_Data));
2930 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2931 return NULL; /* LCOV_EXCL_LINE */
2934 data->base.type = TIZEN_GESTURE_TYPE_EDGE_DRAG;
2935 data->fingers = fingers;
2937 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2939 set_last_result(EFL_UTIL_ERROR_NONE);
2941 return (void *)data;
2945 efl_util_gesture_edge_drag_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2947 if (!gesture_h || gesture_h->init == EINA_FALSE)
2949 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2954 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2960 return EFL_UTIL_ERROR_NONE;
2964 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)
2966 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = data;
2968 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_drag_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2969 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_drag_data->base.type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2970 EFL_UTIL_ERROR_INVALID_PARAMETER);
2971 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2972 EFL_UTIL_ERROR_INVALID_PARAMETER);
2973 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2975 edge_drag_data->edge_size = edge_size;
2976 edge_drag_data->start_point = start_point;
2977 edge_drag_data->end_point = end_point;
2979 return EFL_UTIL_ERROR_NONE;
2982 API efl_util_gesture_data
2983 efl_util_gesture_tap_new(efl_util_gesture_h gesture_h, unsigned int fingers, unsigned int repeats)
2985 Efl_Util_Gesture_Tap_Grab_Data *data;
2987 if (!gesture_h || gesture_h->init == EINA_FALSE)
2989 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2993 if (fingers <= 1 || repeats <= 1)
2995 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED);
2999 data = (Efl_Util_Gesture_Tap_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Tap_Grab_Data));
3002 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3003 return NULL; /* LCOV_EXCL_LINE */
3006 data->base.type = TIZEN_GESTURE_TYPE_TAP;
3007 data->fingers = fingers;
3008 data->repeats = repeats;
3010 set_last_result(EFL_UTIL_ERROR_NONE);
3012 return (void *)data;
3016 efl_util_gesture_tap_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3018 if (!gesture_h || gesture_h->init == EINA_FALSE)
3020 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3025 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3031 return EFL_UTIL_ERROR_NONE;
3034 API efl_util_gesture_data
3035 efl_util_gesture_palm_cover_new(efl_util_gesture_h gesture_h)
3037 Efl_Util_Gesture_Palm_Cover_Grab_Data *data;
3039 if (!gesture_h || gesture_h->init == EINA_FALSE)
3041 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
3045 data = (Efl_Util_Gesture_Palm_Cover_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Palm_Cover_Grab_Data));
3048 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3049 return NULL; /* LCOV_EXCL_LINE */
3052 data->base.type = TIZEN_GESTURE_TYPE_PALM_COVER;
3054 set_last_result(EFL_UTIL_ERROR_NONE);
3056 return (void *)data;
3060 efl_util_gesture_palm_cover_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3062 if (!gesture_h || gesture_h->init == EINA_FALSE)
3064 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3069 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3075 return EFL_UTIL_ERROR_NONE;
3078 /* LCOV_EXCL_START */
3080 efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3082 int ret = EFL_UTIL_ERROR_NONE;
3083 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3085 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3087 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3088 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3089 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3091 switch (base_data->type)
3093 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3094 ret = _efl_util_gesture_grab_edge_swipe(data, EINA_TRUE);
3096 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3097 ret = _efl_util_gesture_grab_edge_drag(data, EINA_TRUE);
3099 case TIZEN_GESTURE_TYPE_TAP:
3100 ret = _efl_util_gesture_grab_tap(data, EINA_TRUE);
3102 case TIZEN_GESTURE_TYPE_PALM_COVER:
3103 ret = _efl_util_gesture_grab_palm_cover(data, EINA_TRUE);
3106 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3113 efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3115 int ret = EFL_UTIL_ERROR_NONE;
3116 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3118 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3120 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3121 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3122 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3124 switch (base_data->type)
3126 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3127 ret = _efl_util_gesture_grab_edge_swipe(data, EINA_FALSE);
3129 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3130 ret = _efl_util_gesture_grab_edge_drag(data, EINA_FALSE);
3132 case TIZEN_GESTURE_TYPE_TAP:
3133 ret = _efl_util_gesture_grab_tap(data, EINA_FALSE);
3135 case TIZEN_GESTURE_TYPE_PALM_COVER:
3136 ret = _efl_util_gesture_grab_palm_cover(data, EINA_FALSE);
3139 return EFL_UTIL_ERROR_INVALID_PARAMETER;
3144 /* LCOV_EXCL_STOP */
3147 efl_util_gesture_select(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3149 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3150 Ecore_Wl2_Window *wlwin;
3151 struct wl_surface *surface;
3154 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3156 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3157 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3158 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3159 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3161 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3162 return EFL_UTIL_ERROR_NOT_SUPPORTED;
3164 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3165 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3167 surface = ecore_wl2_window_surface_get(wlwin);
3168 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3169 EFL_UTIL_ERROR_INVALID_PARAMETER);
3171 tizen_gesture_select_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3173 ret = _efl_util_gesture_verify_request_notified();
3179 efl_util_gesture_deselect(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3181 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3182 Ecore_Wl2_Window *wlwin;
3183 struct wl_surface *surface;
3186 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3188 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3189 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3190 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3191 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3193 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3194 return EFL_UTIL_ERROR_NOT_SUPPORTED;
3196 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3197 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3199 surface = ecore_wl2_window_surface_get(wlwin);
3200 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3201 EFL_UTIL_ERROR_INVALID_PARAMETER);
3203 tizen_gesture_deselect_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3205 ret = _efl_util_gesture_verify_request_notified();
3210 /* LCOV_EXCL_START */
3212 efl_util_gesture_activate_set(efl_util_gesture_h gesture_h, unsigned int type, Eina_Bool active)
3216 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3217 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3218 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3220 tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, NULL, type, active);
3222 ret = _efl_util_gesture_verify_request_notified();
3226 /* LCOV_EXCL_STOP */
3229 efl_util_gesture_activate_set_on_window(efl_util_gesture_h gesture_h, Evas_Object *window, unsigned int type, Eina_Bool active)
3231 Ecore_Wl2_Window *wlwin;
3232 struct wl_surface *surface;
3235 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3236 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3237 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3238 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3240 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3241 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3243 surface = ecore_wl2_window_surface_get(wlwin);
3244 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3245 EFL_UTIL_ERROR_INVALID_PARAMETER);
3247 tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, surface, type, active);
3249 ret = _efl_util_gesture_verify_request_notified();