Package version up to 0.7.30
[platform/core/api/efl-util.git] / src / efl_util.c
1 /*
2  * Copyright (c) 2011-2017 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #define _GNU_SOURCE
18
19 #define LOG_TAG "TIZEN_N_EFL_UTIL"
20
21 #include <efl_util.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <fcntl.h>
29 #include <xf86drm.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>
35 #include <pthread.h>
36
37 #include <Ecore_Wl2.h>
38 #include <wayland-client.h>
39 #include <wayland-tbm-client.h>
40 #include <tizen-extension-client-protocol.h>
41
42 #include <efl_util_screenshot_extension.h>
43
44 #include <dlog.h>
45 #ifdef LOG_TAG
46 #undef LOG_TAG
47 #endif
48
49 #define LOG_TAG "TIZEN_N_EFL_UTIL"
50 #define EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER 10
51
52 #define NUM_EVENT_WAIT_DONE_COUNT 10
53
54 typedef struct _Efl_Util_Wl_Surface_Lv_Info
55 {
56    void *surface; /* wl_surface */
57    int level;
58    Eina_Bool wait_for_done;
59    uint32_t state;
60 } Efl_Util_Wl_Surface_Lv_Info;
61
62 typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
63 {
64    void *surface; /* wl_surface */
65    unsigned int mode;
66    Eina_Bool wait_for_done;
67    uint32_t state;
68 } Efl_Util_Wl_Surface_Scr_Mode_Info;
69
70 typedef struct _Efl_Util_Wl_Surface_Brightness_Info
71 {
72    void *surface; /* wl_surface */
73    int brightness;
74    Eina_Bool wait_for_done;
75    uint32_t state;
76 } Efl_Util_Wl_Surface_Brightness_Info;
77
78 typedef struct _Efl_Util_Wl_Output_Info
79 {
80     struct wl_output *output;
81     int offset_x, offset_y, width, height;
82 } Efl_Util_Wl_Output_Info;
83
84 typedef struct _Efl_Util_Gesture_Common_Grab_Data
85 {
86    int type;
87 } Efl_Util_Gesture_Common_Grab_Data;
88
89 typedef struct _Efl_Util_Gesture_Edge_Swipe_Grab_Data
90 {
91    Efl_Util_Gesture_Common_Grab_Data base;
92
93    unsigned int fingers;
94    efl_util_gesture_edge_e edge;
95    efl_util_gesture_edge_size_e edge_size;
96    unsigned int start_point;
97    unsigned int end_point;
98 } Efl_Util_Gesture_Edge_Swipe_Grab_Data;
99
100 typedef struct _Efl_Util_Gesture_Edge_Drag_Grab_Data
101 {
102    Efl_Util_Gesture_Common_Grab_Data base;
103
104    unsigned int fingers;
105    efl_util_gesture_edge_e edge;
106    efl_util_gesture_edge_size_e edge_size;
107    unsigned int start_point;
108    unsigned int end_point;
109 } Efl_Util_Gesture_Edge_Drag_Grab_Data;
110
111 typedef struct _Efl_Util_Gesture_Tap_Grab_Data
112 {
113    Efl_Util_Gesture_Common_Grab_Data base;
114
115    unsigned int fingers;
116    unsigned int repeats;
117 } Efl_Util_Gesture_Tap_Grab_Data;
118
119 typedef struct _Efl_Util_Gesture_Palm_Cover_Grab_Data
120 {
121    Efl_Util_Gesture_Common_Grab_Data base;
122 } Efl_Util_Gesture_Palm_Cover_Grab_Data;
123
124 typedef struct _E_Devicemgr_Inputgen_Touch_Axis
125 {
126    double radius_x;
127    double radius_y;
128    double pressure;
129    double angle;
130    double palm;
131 } E_Devicemgr_Inputgen_Touch_Axis;
132
133 typedef struct _Efl_Util_Data
134 {
135    /* wayland related stuffs */
136    struct
137    {
138       Eina_Bool init;
139       Ecore_Wl2_Display *wl2_display;
140       struct wl_display *dpy;
141       struct wl_event_queue *queue;
142
143       struct
144       {
145          unsigned int id;
146          struct tizen_policy *proto;
147          Eina_Hash *hash_noti_lv;
148          Eina_Hash *hash_scr_mode;
149       } policy;
150       struct
151       {
152          struct wl_event_queue *queue;
153          struct tizen_screenshooter *tz_screenshooter;
154          struct wayland_tbm_client *tbm_client;
155          Eina_List *output_list;
156          uint32_t noti;
157       } shot;
158       struct
159       {
160          struct tizen_input_device_manager *devicemgr;
161          int request_notified;
162          Eina_List *devices;
163          Eina_List *wait_devices;
164          struct wl_event_source *wait_timer;
165          int max_touch_count;
166          int request_touch_count;
167       } devmgr;
168       struct
169       {
170          unsigned int id;
171          struct tizen_display_policy *proto;
172          Eina_Hash *hash_brightness;
173       } display_policy;
174    } wl;
175 } Efl_Util_Data;
176
177 typedef struct _Efl_Util_Data_Default_Queue
178 {
179    /* wayland related stuffs */
180    struct
181    {
182       Eina_Bool init;
183       Ecore_Wl2_Display *wl2_display;
184       struct wl_display *dpy;
185
186       struct
187       {
188          unsigned int id;
189          struct tizen_gesture *proto;
190          int request_notified;
191          int event_init;
192       } gesture;
193    } wl;
194 } Efl_Util_Data_Default_Queue;
195
196
197 static Efl_Util_Data _eflutil =
198 {
199    {
200       EINA_FALSE,
201       NULL, NULL, NULL,
202       { 0, NULL, NULL, NULL }, /* tizen_policy protocol */
203       { NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
204       { NULL, -1, NULL, NULL, NULL, 0, 0 }, /* tizen_input_device_manager protocol */
205       { 0, NULL, NULL } /* display_policy protocol */
206    },
207 };
208
209 static Efl_Util_Data_Default_Queue _eflutil_defaultqueue =
210 {
211    {
212       EINA_FALSE,
213       NULL, NULL,
214       { 0, NULL, -1, 0 } /* gesture protocol */
215    },
216 };
217
218
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);
237
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);
239
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);
245
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);
255
256
257 static const struct wl_registry_listener _wl_reg_listener =
258 {
259    _cb_wl_reg_global,
260    _cb_wl_reg_global_remove
261 };
262
263 static const struct wl_registry_listener _wl_reg_screenshooter_listener =
264 {
265    _cb_wl_reg_screenshooter_global,
266    _cb_wl_reg_screenshooter_global_remove
267 };
268
269 struct tizen_policy_listener _wl_tz_policy_listener =
270 {
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,
281 };
282
283 struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
284 {
285    _cb_device_add,
286    _cb_device_remove,
287    _cb_error,
288    _cb_block_expired,
289    _cb_max_touch_count
290 };
291
292 struct tizen_display_policy_listener _wl_tz_display_policy_listener =
293 {
294    _cb_wl_tz_display_policy_brightness_done,
295 };
296
297 static const struct wl_registry_listener _wl_default_queue_reg_listener =
298 {
299    _cb_wl_default_queue_reg_global,
300    _cb_wl_default_queue_reg_global_remove
301 };
302
303 struct tizen_gesture_listener _wl_tz_gesture_listener =
304 {
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,
310    _cb_gesture_tap,
311    _cb_gesture_palm_cover_notify,
312    _cb_gesture_palm_cover,
313    _cb_gesture_activate_notify
314 };
315
316 static Eina_Bool
317 _wl_init(void)
318 {
319    struct wl_display *display_wrapper = NULL;
320    struct wl_registry *reg = NULL;
321
322    if (_eflutil.wl.init) return EINA_TRUE;
323
324    ecore_wl2_init();
325
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);
330
331    display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
332    EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
333
334    _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy);
335    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail);
336
337    wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.queue);
338
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);
343
344    wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
345
346    _eflutil.wl.init = EINA_TRUE;
347
348    return EINA_TRUE;
349 fail:
350    if (display_wrapper)
351      wl_proxy_wrapper_destroy(display_wrapper);
352
353    if (_eflutil.wl.queue)
354      {
355         wl_event_queue_destroy(_eflutil.wl.queue);
356         _eflutil.wl.queue = NULL;
357      }
358
359    ecore_wl2_shutdown();
360    return EINA_FALSE;
361 }
362
363 static Eina_Bool
364 _wl_init_default_queue(void)
365 {
366    struct wl_display *display_wrapper = NULL;
367    struct wl_registry *reg = NULL;
368
369    if (_eflutil_defaultqueue.wl.init) return EINA_TRUE;
370
371    if (ecore_wl2_init() <= 0) return EINA_FALSE;
372
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);
377
378    display_wrapper = wl_proxy_create_wrapper(_eflutil_defaultqueue.wl.dpy);
379    EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
380
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);
385
386    wl_registry_add_listener(reg, &_wl_default_queue_reg_listener, NULL);
387
388    _eflutil_defaultqueue.wl.init = EINA_TRUE;
389
390    return EINA_TRUE;
391 fail:
392
393    ecore_wl2_shutdown();
394    return EINA_FALSE;
395 }
396
397 static void
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)
401 {
402    Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
403    if (wl_output == output->output)
404      {
405         output->offset_x = x;
406         output->offset_y = y;
407      }
408 }
409
410 static void
411 _cb_wl_output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
412                    int width, int height, int refresh)
413 {
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))
416      {
417         output->width = width;
418         output->height = height;
419      }
420 }
421
422 static void
423 _cb_wl_output_done(void *data, struct wl_output *wl_output)
424 {
425 }
426
427 static void
428 _cb_wl_output_scale(void *data, struct wl_output *wl_output, int32_t factor)
429 {
430 }
431
432 static const struct wl_output_listener output_listener =
433 {
434     _cb_wl_output_geometry,
435     _cb_wl_output_mode,
436     _cb_wl_output_done,
437     _cb_wl_output_scale
438 };
439
440 static void
441 _cb_tz_screenshot_format(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t format)
442 {
443 }
444
445 static void
446 _cb_tz_screenshot_noti(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t noti)
447 {
448    _eflutil.wl.shot.noti = noti;
449 }
450
451 static void
452 _cb_tz_screenshot_done(void *data, struct tizen_screenshooter *tz_screenshooter)
453 {
454    Eina_Bool *shot_done = (Eina_Bool*)data;
455    if (shot_done)
456      *shot_done = EINA_TRUE;
457 }
458
459 static const struct tizen_screenshooter_listener tz_screenshooter_listener =
460 {
461     _cb_tz_screenshot_format,
462     _cb_tz_screenshot_noti,
463     _cb_tz_screenshot_done,
464 };
465
466 static void
467 _cb_wl_reg_global(void *data,
468                   struct wl_registry *reg,
469                   unsigned int id,
470                   const char *interface,
471                   unsigned int version)
472 {
473    if (!strcmp(interface, "tizen_policy"))
474      {
475         struct tizen_policy *proto;
476         proto = wl_registry_bind(reg,
477                                   id,
478                                   &tizen_policy_interface,
479                                   7);
480         if (!proto) return;
481
482         tizen_policy_add_listener(proto,
483                                   &_wl_tz_policy_listener,
484                                   NULL);
485
486         _eflutil.wl.policy.hash_noti_lv = eina_hash_pointer_new(free);
487         _eflutil.wl.policy.hash_scr_mode = eina_hash_pointer_new(free);
488         _eflutil.wl.policy.proto = proto;
489         _eflutil.wl.policy.id = id;
490      }
491    else if (strcmp(interface, "wl_output") == 0)
492      {
493         Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info));
494         EINA_SAFETY_ON_NULL_RETURN(output);
495
496         _eflutil.wl.shot.output_list = eina_list_append(_eflutil.wl.shot.output_list, output);
497
498         output->output = wl_registry_bind(reg, id, &wl_output_interface, version);
499         wl_output_add_listener(output->output, &output_listener, output);
500      }
501    else if (strcmp(interface, "tizen_input_device_manager") == 0)
502      {
503         _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
504         tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
505      }
506    else if (!strcmp(interface, "tizen_display_policy"))
507      {
508         _eflutil.wl.display_policy.proto = wl_registry_bind(reg, id, &tizen_display_policy_interface, version);
509         if (!_eflutil.wl.display_policy.proto) return;
510
511         tizen_display_policy_add_listener(_eflutil.wl.display_policy.proto,
512                                           &_wl_tz_display_policy_listener,
513                                           NULL);
514
515         _eflutil.wl.display_policy.hash_brightness = eina_hash_pointer_new(free);
516         _eflutil.wl.display_policy.id = id;
517      }
518 }
519 /* LCOV_EXCL_START */
520 static void
521 _cb_wl_reg_global_remove(void *data,
522                          struct wl_registry *reg,
523                          unsigned int id)
524 {
525    /* unset each global id number to 0 since global id is started
526     * from number 1 on server side display structure
527     */
528    if (id == _eflutil.wl.policy.id)
529      {
530         _eflutil.wl.policy.id = 0;
531         _eflutil.wl.policy.proto = NULL;
532         eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
533         eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
534      }
535    else if (id == _eflutil.wl.display_policy.id)
536      {
537         _eflutil.wl.display_policy.id = 0;
538         _eflutil.wl.display_policy.proto = NULL;
539         eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
540      }
541 }
542 /* LCOV_EXCL_STOP */
543
544 static void
545 _cb_wl_default_queue_reg_global(void *data,
546                                 struct wl_registry *reg,
547                                 unsigned int id,
548                                 const char *interface,
549                                 unsigned int version)
550 {
551    if (strcmp(interface, "tizen_gesture") == 0)
552      {
553         _eflutil_defaultqueue.wl.gesture.id = id;
554         _eflutil_defaultqueue.wl.gesture.proto = wl_registry_bind(reg, id, &tizen_gesture_interface, version);
555         tizen_gesture_add_listener(_eflutil_defaultqueue.wl.gesture.proto, &_wl_tz_gesture_listener, NULL);
556      }
557 }
558 /* LCOV_EXCL_START */
559 static void
560 _cb_wl_default_queue_reg_global_remove(void *data,
561                                        struct wl_registry *reg,
562                                        unsigned int id)
563 {
564    if (id == _eflutil_defaultqueue.wl.gesture.id)
565      {
566         _eflutil_defaultqueue.wl.gesture.id = 0;
567         _eflutil_defaultqueue.wl.gesture.proto = NULL;
568      }
569 }
570 /* LCOV_EXCL_STOP */
571
572
573 static void
574 _cb_wl_reg_screenshooter_global(void *data,
575                   struct wl_registry *reg,
576                   unsigned int name,
577                   const char *interface,
578                   unsigned int version)
579 {
580    if (strcmp(interface, "tizen_screenshooter") == 0)
581      {
582         _eflutil.wl.shot.tz_screenshooter = wl_registry_bind(reg, name, &tizen_screenshooter_interface, version);
583         tizen_screenshooter_add_listener(_eflutil.wl.shot.tz_screenshooter, &tz_screenshooter_listener, NULL);
584
585         wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
586      }
587 }
588
589 /* LCOV_EXCL_START */
590 static void
591 _cb_wl_reg_screenshooter_global_remove(void *data,
592                          struct wl_registry *reg,
593                          unsigned int name)
594 {
595 }
596
597 static void
598 _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy,
599                             struct wl_surface *surface, uint32_t is_conformant)
600 {
601 }
602
603 static void
604 _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy,
605                                  struct wl_surface *surface, uint32_t conformant_part,
606                                  uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h)
607 {
608 }
609 /* LCOV_EXCL_STOP */
610
611 static void
612 _cb_wl_tz_policy_notification_done(void *data,
613                                    struct tizen_policy *tizen_policy,
614                                    struct wl_surface *surface,
615                                    int32_t level,
616                                    uint32_t state)
617 {
618    Efl_Util_Wl_Surface_Lv_Info *lv_info;
619
620    lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
621    if (lv_info)
622      {
623         lv_info->level = level;
624         lv_info->wait_for_done = EINA_FALSE;
625         lv_info->state = state;
626      }
627 }
628
629 /* LCOV_EXCL_START */
630 static void
631 _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id)
632 {
633 }
634 /* LCOV_EXCL_STOP */
635
636 static void
637 _cb_wl_tz_policy_scr_mode_done(void *data,
638                                struct tizen_policy *tizen_policy,
639                                struct wl_surface *surface,
640                                uint32_t mode,
641                                uint32_t state)
642 {
643    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
644
645    scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
646    if (scr_mode_info)
647      {
648         scr_mode_info->mode = mode;
649         scr_mode_info->wait_for_done = EINA_FALSE;
650         scr_mode_info->state = state;
651      }
652 }
653
654 /* LCOV_EXCL_START */
655 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)
656 {
657 }
658
659 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)
660 {
661 }
662
663 static void                    _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id)
664 {
665 }
666
667 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)
668 {
669 }
670 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)
671 {
672 }
673 /* LCOV_EXCL_STOP */
674
675 static void
676 _cb_wl_tz_display_policy_brightness_done(void *data,
677                                  struct tizen_display_policy *tizen_display_policy,
678                                  struct wl_surface *surface,
679                                  int32_t brightness,
680                                  uint32_t state)
681 {
682    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
683
684    brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
685    if (brightness_info)
686      {
687         brightness_info->brightness = brightness;
688         brightness_info->wait_for_done = EINA_FALSE;
689         brightness_info->state = state;
690      }
691 }
692
693 static void
694 _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
695 {
696    Efl_Util_Wl_Surface_Lv_Info *lv_info;
697
698    lv_info = data;
699    if (EINA_UNLIKELY(!lv_info))
700      return;
701
702    eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info);
703 }
704
705 API int
706 efl_util_set_notification_window_level(Evas_Object *window,
707                                        efl_util_notification_level_e level)
708 {
709    Eina_Bool res;
710
711    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
712    EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) &&
713                                    (level <= EFL_UTIL_NOTIFICATION_LEVEL_TOP),
714                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
715
716    Elm_Win_Type type;
717    Ecore_Wl2_Window *wlwin;
718    struct wl_surface *surface;
719    Efl_Util_Wl_Surface_Lv_Info *lv_info;
720    Ecore_Wl2_Window_Type wl_type;
721    int ret_dispatch = 0;
722
723    res = _wl_init();
724    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
725
726    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
727    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
728
729    type = elm_win_type_get(window);
730    if (type != ELM_WIN_NOTIFICATION)
731      {
732         wl_type = ecore_wl2_window_type_get(wlwin);
733         EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
734                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
735      }
736
737    while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
738      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
739
740    surface = ecore_wl2_window_surface_get(wlwin);
741    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
742                                   EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
743
744    lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
745    if (!lv_info)
746      {
747         lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
748         EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
749
750         lv_info->surface = surface;
751         lv_info->level = (int)level;
752         lv_info->wait_for_done = EINA_TRUE;
753         lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
754         eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
755                       &surface,
756                       lv_info);
757
758         evas_object_event_callback_add(window, EVAS_CALLBACK_DEL,
759                                        _cb_window_del, lv_info);
760      }
761    else
762      {
763         lv_info->level = (int)level;
764         lv_info->wait_for_done = EINA_TRUE;
765         lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
766      }
767
768
769    tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
770                                        surface, (int)level);
771
772    if (lv_info->wait_for_done)
773      {
774         int count = 0;
775         ret_dispatch = 0;
776         while (lv_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
777           {
778              ecore_wl2_display_flush(_eflutil.wl.wl2_display);
779              ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
780              count++;
781           }
782
783         if (lv_info->wait_for_done)
784           {
785              return EFL_UTIL_ERROR_INVALID_PARAMETER;
786           }
787         else
788           {
789              if (lv_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
790                {
791                   return EFL_UTIL_ERROR_PERMISSION_DENIED;
792                }
793           }
794      }
795
796    return EFL_UTIL_ERROR_NONE;
797 }
798
799 API int
800 efl_util_get_notification_window_level(Evas_Object *window,
801                                        efl_util_notification_level_e *level)
802 {
803    Eina_Bool res;
804
805    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
806    EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
807
808    Elm_Win_Type type;
809    Ecore_Wl2_Window *wlwin;
810    struct wl_surface *surface;
811    Efl_Util_Wl_Surface_Lv_Info *lv_info;
812    Ecore_Wl2_Window_Type wl_type;
813    int ret_dispatch = 0;
814
815    res = _wl_init();
816    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
817
818    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
819    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
820
821    type = elm_win_type_get(window);
822    if (type != ELM_WIN_NOTIFICATION)
823      {
824         wl_type = ecore_wl2_window_type_get(wlwin);
825         EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
826                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
827      }
828
829    while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
830      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
831
832    surface = ecore_wl2_window_surface_get(wlwin);
833    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
834                                   EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
835
836    lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
837    if (lv_info)
838      {
839         if (lv_info->wait_for_done)
840           {
841              int count = 0;
842              ret_dispatch = 0;
843              while ((lv_info->wait_for_done) && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
844                {
845                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
846                   ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
847                   count++;
848                }
849
850              if (lv_info->wait_for_done)
851                {
852                   *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
853                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
854                }
855           }
856
857         switch (lv_info->level)
858           {
859            case TIZEN_POLICY_LEVEL_NONE:    *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE;    break;
860            case TIZEN_POLICY_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
861            case TIZEN_POLICY_LEVEL_MEDIUM:  *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM;  break;
862            case TIZEN_POLICY_LEVEL_HIGH:    *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH;    break;
863            case TIZEN_POLICY_LEVEL_TOP:     *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP;     break;
864            default:                         *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
865             return EFL_UTIL_ERROR_INVALID_PARAMETER;
866           }
867         return EFL_UTIL_ERROR_NONE;
868      }
869    else
870      *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
871
872    return EFL_UTIL_ERROR_NONE;
873 }
874
875 API int
876 efl_util_set_window_opaque_state(Evas_Object *window,
877                                  int opaque)
878 {
879    Eina_Bool res;
880
881    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
882    EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
883                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
884
885    Ecore_Wl2_Window *wlwin;
886    struct wl_surface *surface;
887
888    if (!_eflutil.wl.policy.proto)
889      {
890         int ret = 0;
891
892         res = _wl_init();
893         EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
894
895         while (!_eflutil.wl.policy.proto && ret != -1)
896           ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
897
898         EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
899      }
900
901    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
902    if (!wlwin)
903       return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
904
905    surface  = ecore_wl2_window_surface_get(wlwin);
906    if (!surface)
907       return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
908
909    tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
910
911    return EFL_UTIL_ERROR_NONE;
912 }
913
914 API int
915 efl_util_set_window_screen_mode(Evas_Object *window,
916                                 efl_util_screen_mode_e mode)
917 {
918    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
919    EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
920                                     (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
921                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
922
923    Ecore_Wl2_Window *wlwin;
924    struct wl_surface *surface;
925    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
926    Eina_Bool res;
927    int ret_dispatch = 0;
928
929    res = _wl_init();
930    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
931
932    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
933    if (wlwin)
934      {
935         while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
936           ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
937
938         surface = ecore_wl2_window_surface_get(wlwin);
939         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
940                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
941
942         scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
943         if (!scr_mode_info)
944           {
945              scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
946              EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
947
948              scr_mode_info->surface = surface;
949              scr_mode_info->mode = (unsigned int)mode;
950              scr_mode_info->wait_for_done = EINA_TRUE;
951              scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
952
953              eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
954                            &surface,
955                            scr_mode_info);
956           }
957         else
958           {
959              scr_mode_info->mode = (unsigned int)mode;
960              scr_mode_info->wait_for_done = EINA_TRUE;
961              scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
962           }
963
964         tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
965                                             surface, (unsigned int)mode);
966         if (scr_mode_info->wait_for_done)
967           {
968              int count = 0;
969              ret_dispatch = 0;
970              while (scr_mode_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
971                {
972                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
973                   ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
974                   count++;
975                }
976
977              if (scr_mode_info->wait_for_done)
978                {
979                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
980                }
981              else
982                {
983                   if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
984                     {
985                        return EFL_UTIL_ERROR_PERMISSION_DENIED;
986                     }
987                }
988           }
989
990         return EFL_UTIL_ERROR_NONE;
991      }
992    else
993      return EFL_UTIL_ERROR_INVALID_PARAMETER;
994 }
995
996 API int
997 efl_util_get_window_screen_mode(Evas_Object *window,
998                                 efl_util_screen_mode_e *mode)
999 {
1000    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1001    EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
1002
1003    Ecore_Wl2_Window *wlwin;
1004    struct wl_surface *surface;
1005    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
1006    Eina_Bool res;
1007    int ret_dispatch = 0;
1008
1009    res = _wl_init();
1010    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1011
1012    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1013    if (wlwin)
1014      {
1015         while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
1016           ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1017
1018         surface = ecore_wl2_window_surface_get(wlwin);
1019         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1020                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
1021
1022         scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
1023         if (scr_mode_info)
1024           {
1025              if (scr_mode_info->wait_for_done)
1026                {
1027                   ret_dispatch = 0;
1028                   while (scr_mode_info->wait_for_done && (ret_dispatch != -1))
1029                     {
1030                        ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1031                        ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1032                     }
1033                }
1034
1035              switch (scr_mode_info->mode)
1036                {
1037                 case TIZEN_POLICY_MODE_DEFAULT:   *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;   break;
1038                 case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
1039                 default:                          *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1040                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
1041                }
1042              return EFL_UTIL_ERROR_NONE;
1043           }
1044         else
1045           {
1046              *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1047              return EFL_UTIL_ERROR_INVALID_PARAMETER;
1048           }
1049      }
1050    else
1051      return EFL_UTIL_ERROR_INVALID_PARAMETER;
1052 }
1053
1054 API int
1055 efl_util_set_window_brightness(Evas_Object *window, int brightness)
1056 {
1057    Ecore_Wl2_Window *wlwin;
1058    struct wl_surface *surface;
1059    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1060    Eina_Bool res;
1061    int ret_dispatch = 0;
1062
1063    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1064    EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
1065
1066    res = _wl_init();
1067    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1068
1069    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1070    if (wlwin)
1071      {
1072         while (!_eflutil.wl.display_policy.proto  && (ret_dispatch != -1))
1073           ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1074
1075         surface = ecore_wl2_window_surface_get(wlwin);
1076         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1077                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
1078
1079         brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1080         if (!brightness_info)
1081           {
1082              brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
1083              EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1084
1085              brightness_info->surface = surface;
1086              brightness_info->brightness = brightness;
1087              brightness_info->wait_for_done = EINA_TRUE;
1088              brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1089
1090              eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
1091                            &surface,
1092                            brightness_info);
1093            }
1094          else
1095            {
1096               brightness_info->brightness = brightness;
1097               brightness_info->wait_for_done = EINA_TRUE;
1098               brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1099            }
1100
1101          tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
1102                                                     surface, brightness);
1103          if (brightness_info->wait_for_done)
1104            {
1105               int count = 0;
1106               ret_dispatch = 0;
1107               while (brightness_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
1108                 {
1109                    ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1110                    ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1111                    count++;
1112                 }
1113
1114               if (brightness_info->wait_for_done)
1115                 {
1116                    return EFL_UTIL_ERROR_INVALID_PARAMETER;
1117                 }
1118               else
1119                 {
1120                    if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
1121                      {
1122                         return EFL_UTIL_ERROR_PERMISSION_DENIED;
1123                      }
1124                 }
1125            }
1126         return EFL_UTIL_ERROR_NONE;
1127      }
1128    else
1129      return EFL_UTIL_ERROR_INVALID_PARAMETER;
1130 }
1131
1132 API int
1133 efl_util_get_window_brightness(Evas_Object *window, int *brightness)
1134 {
1135    Ecore_Wl2_Window *wlwin;
1136    struct wl_surface *surface;
1137    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1138    Eina_Bool res;
1139    int ret_dispatch = 0;
1140
1141    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1142    EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
1143
1144    res = _wl_init();
1145    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1146
1147    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1148    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
1149
1150    while (!_eflutil.wl.display_policy.proto && (ret_dispatch != -1))
1151      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1152
1153    surface = ecore_wl2_window_surface_get(wlwin);
1154    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1155                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
1156
1157    brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1158    if (brightness_info)
1159      {
1160         if (brightness_info->wait_for_done)
1161           {
1162              ret_dispatch = 0;
1163              while (brightness_info->wait_for_done && (ret_dispatch != -1))
1164                {
1165                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1166                   ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1167                }
1168           }
1169          *brightness = brightness_info->brightness;
1170      }
1171    else
1172      *brightness = -1;
1173
1174    return EFL_UTIL_ERROR_NONE;
1175 }
1176
1177 struct _efl_util_inputgen_h
1178 {
1179    unsigned int init_type;
1180    char name[32];
1181    E_Devicemgr_Inputgen_Touch_Axis *axis_info;
1182 };
1183
1184 static void
1185 _cb_device_add(void *data EINA_UNUSED,
1186                struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1187                uint32_t serial EINA_UNUSED,
1188                const char *identifier EINA_UNUSED,
1189                struct tizen_input_device *device,
1190                struct wl_seat *seat EINA_UNUSED)
1191 {
1192    ;
1193 }
1194
1195 static void
1196 _cb_device_remove(void *data EINA_UNUSED,
1197                struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1198                uint32_t serial  EINA_UNUSED,
1199                const char *identifier  EINA_UNUSED,
1200                struct tizen_input_device *device,
1201                struct wl_seat *seat  EINA_UNUSED)
1202 {
1203    ;
1204 }
1205
1206 static void
1207 _cb_error(void *data EINA_UNUSED,
1208           struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1209           uint32_t errorcode)
1210 {
1211    _eflutil.wl.devmgr.request_notified = errorcode;
1212 }
1213
1214 /* LCOV_EXCL_START */
1215 static void
1216 _cb_block_expired(void *data EINA_UNUSED,
1217                   struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
1218 {
1219    ;
1220 }
1221 /* LCOV_EXCL_STOP */
1222
1223 static void
1224 _cb_max_touch_count(void *data EINA_UNUSED,
1225                     struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1226                     uint32_t serial EINA_UNUSED,
1227                     int32_t max_count,
1228                     struct wl_seat *seat EINA_UNUSED)
1229 {
1230    _eflutil.wl.devmgr.max_touch_count = max_count;
1231 }
1232
1233 static efl_util_error_e
1234 _efl_util_input_convert_input_generator_error(int ret)
1235 {
1236    switch (ret)
1237      {
1238         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
1239            return EFL_UTIL_ERROR_NONE;
1240         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
1241            return EFL_UTIL_ERROR_PERMISSION_DENIED;
1242         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
1243            return EFL_UTIL_ERROR_OUT_OF_MEMORY;
1244         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
1245            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1246         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NOT_ALLOWED:
1247            return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
1248         default :
1249            return EFL_UTIL_ERROR_NONE;
1250      }
1251 }
1252
1253 static efl_util_inputgen_h
1254 _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *ret, int with_name)
1255 {
1256    efl_util_inputgen_h inputgen_h = NULL;
1257    unsigned int clas = 0x0;
1258    int ret_dispatch = 0;
1259
1260    if (!dev_type ||
1261         dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1262                     | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1263                     | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1264      {
1265         set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1266         goto out;
1267      }
1268
1269    inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1270    if (!inputgen_h)
1271      {
1272         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1273         goto out;
1274      }
1275
1276    inputgen_h->init_type |= dev_type;
1277    if (with_name)
1278      {
1279         if (name) strncpy(inputgen_h->name, name, 31);
1280         else strncpy(inputgen_h->name, "Input Generator", 31);
1281      }
1282
1283    *ret = _wl_init();
1284    if (*ret == (int)EINA_FALSE)
1285      {
1286         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1287         goto out;
1288      }
1289
1290    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1291      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1292    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1293      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1294    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1295      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1296
1297    while (!_eflutil.wl.devmgr.devicemgr && (ret_dispatch != -1))
1298      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1299
1300    if (with_name == 2)
1301       tizen_input_device_manager_init_generator_with_sync(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1302    else if (with_name == 1)
1303       tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1304    else
1305       tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
1306
1307    ret_dispatch = 0;
1308    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1309      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1310
1311    *ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1312    _eflutil.wl.devmgr.request_notified = -1;
1313
1314    set_last_result(*ret);
1315    if (*ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1316      goto out;
1317
1318    return inputgen_h;
1319
1320 out:
1321    if (inputgen_h)
1322      {
1323         free(inputgen_h);
1324         inputgen_h = NULL;
1325      }
1326    return NULL;
1327 }
1328
1329 API efl_util_inputgen_h
1330 efl_util_input_initialize_generator(unsigned int dev_type)
1331 {
1332    int ret = EFL_UTIL_ERROR_NONE;
1333    efl_util_inputgen_h inputgen_h = NULL;
1334
1335    inputgen_h = _efl_util_input_create_inputgen(dev_type, NULL, &ret, 0);
1336    if (!inputgen_h)
1337       return NULL;
1338
1339    return inputgen_h;
1340 }
1341
1342 API efl_util_inputgen_h
1343 efl_util_input_initialize_generator_with_name(unsigned int dev_type, const char *name)
1344 {
1345    int ret = EFL_UTIL_ERROR_NONE;
1346    efl_util_inputgen_h inputgen_h = NULL;
1347
1348    inputgen_h = _efl_util_input_create_inputgen(dev_type, name, &ret, 1);
1349    if (!inputgen_h)
1350       return NULL;
1351
1352    return inputgen_h;
1353 }
1354
1355 API efl_util_inputgen_h
1356 efl_util_input_initialize_generator_with_sync(unsigned int dev_type, const char *name)
1357 {
1358    int ret = EFL_UTIL_ERROR_NONE;
1359    efl_util_inputgen_h inputgen_h = NULL;
1360
1361    inputgen_h = _efl_util_input_create_inputgen(dev_type, name, &ret, 2);
1362    if (!inputgen_h)
1363       return NULL;
1364
1365    return inputgen_h;
1366 }
1367
1368 API int
1369 efl_util_input_set_touch_count(int max_count)
1370 {
1371    int ret = EFL_UTIL_ERROR_NONE;
1372    int ret_dispatch = 0;
1373
1374    ret = _wl_init();
1375    if (ret == (int)EINA_FALSE)
1376      {
1377         return EFL_UTIL_ERROR_INVALID_PARAMETER;
1378      }
1379
1380    while (!_eflutil.wl.devmgr.devicemgr && (ret_dispatch != -1))
1381      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1382
1383    if (_eflutil.wl.devmgr.max_touch_count >= max_count)
1384      return EFL_UTIL_ERROR_NONE;
1385
1386    tizen_input_device_manager_set_touch_count(_eflutil.wl.devmgr.devicemgr, max_count);
1387
1388    ret_dispatch = 0;
1389    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1390      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1391
1392    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1393    _eflutil.wl.devmgr.request_notified = -1;
1394
1395    if (ret == EFL_UTIL_ERROR_NONE)
1396      {
1397         _eflutil.wl.devmgr.request_touch_count = max_count;
1398      }
1399
1400    return ret;
1401 }
1402
1403 API int
1404 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
1405 {
1406    int ret = EFL_UTIL_ERROR_NONE;
1407    unsigned int clas = 0x0;
1408    int ret_dispatch = 0;
1409    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1410
1411    if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1412      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1413    if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1414      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1415    if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1416      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1417
1418    if (inputgen_h->axis_info)
1419      free(inputgen_h->axis_info);
1420
1421    free(inputgen_h);
1422    inputgen_h = NULL;
1423
1424    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1425
1426    tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
1427
1428    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1429      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1430
1431    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1432    _eflutil.wl.devmgr.request_notified = -1;
1433
1434    return ret;
1435 }
1436
1437 API int
1438 efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name, int pressed)
1439 {
1440    int ret = EFL_UTIL_ERROR_NONE;
1441    int ret_dispatch = 0;
1442
1443    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1444    EINA_SAFETY_ON_NULL_RETURN_VAL(key_name, EFL_UTIL_ERROR_INVALID_PARAMETER);
1445    EINA_SAFETY_ON_FALSE_RETURN_VAL(pressed == 0 || pressed == 1, EFL_UTIL_ERROR_INVALID_PARAMETER);
1446    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1447
1448    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1449
1450    tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
1451
1452    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1453      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1454
1455    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1456    _eflutil.wl.devmgr.request_notified = -1;
1457
1458    return ret;
1459 }
1460
1461 API int
1462 efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
1463                               efl_util_input_touch_type_e touch_type, int x, int y)
1464 {
1465    int ret;
1466    int ret_dispatch = 0;
1467    enum tizen_input_device_manager_pointer_event_type type;
1468
1469    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1470    EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1471    EINA_SAFETY_ON_FALSE_RETURN_VAL((x > 0 && y > 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1472    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1473
1474    if (_eflutil.wl.devmgr.request_touch_count != 0 &&
1475        _eflutil.wl.devmgr.max_touch_count != _eflutil.wl.devmgr.request_touch_count)
1476      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1477
1478    if (idx >= _eflutil.wl.devmgr.max_touch_count)
1479      return EFL_UTIL_ERROR_INVALID_PARAMETER;
1480
1481    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1482
1483    switch(touch_type)
1484      {
1485         case EFL_UTIL_INPUT_TOUCH_BEGIN:
1486            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1487            break;
1488         case EFL_UTIL_INPUT_TOUCH_UPDATE:
1489            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1490            break;
1491         case EFL_UTIL_INPUT_TOUCH_END:
1492            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1493            break;
1494         default:
1495            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1496      }
1497
1498    tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1499
1500    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1501      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1502
1503    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1504    _eflutil.wl.devmgr.request_notified = -1;
1505
1506    return ret;
1507 }
1508
1509 static int
1510 _efl_util_input_generate_touch_axis_send(unsigned int type, double value)
1511 {
1512    int ret;
1513    int ret_dispatch = 0;
1514
1515    tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_double(value));
1516
1517    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1518      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1519
1520    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1521    _eflutil.wl.devmgr.request_notified = -1;
1522
1523    return ret;
1524 }
1525
1526 static void
1527 _efl_util_input_generate_touch_axis_cleanup(efl_util_inputgen_h inputgen_h, int idx)
1528 {
1529    int i;
1530    if (idx >= 0)
1531      {
1532         inputgen_h->axis_info[idx].radius_x = 1.0;
1533         inputgen_h->axis_info[idx].radius_y = 1.0;
1534         inputgen_h->axis_info[idx].pressure = 1.0;
1535         inputgen_h->axis_info[idx].angle = 0.0;
1536         inputgen_h->axis_info[idx].palm = 0.0;
1537      }
1538    else
1539      {
1540         for (i = 0; i < EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER; i++)
1541           {
1542              inputgen_h->axis_info[i].radius_x = 1.0;
1543              inputgen_h->axis_info[i].radius_y = 1.0;
1544              inputgen_h->axis_info[i].pressure = 1.0;
1545              inputgen_h->axis_info[i].angle = 0.0;
1546              inputgen_h->axis_info[i].palm = 0.0;
1547           }
1548      }
1549 }
1550
1551 static int
1552 _efl_util_input_generate_touch_axis_process(efl_util_inputgen_h inputgen_h, int idx, double radius_x,
1553                                             double radius_y, double pressure, double angle, double palm)
1554 {
1555    int ret = EFL_UTIL_ERROR_NONE;
1556
1557    if (!inputgen_h->axis_info)
1558      {
1559         inputgen_h->axis_info = calloc(EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER,
1560                                        sizeof(E_Devicemgr_Inputgen_Touch_Axis));
1561         _efl_util_input_generate_touch_axis_cleanup(inputgen_h, -1);
1562      }
1563
1564    if (inputgen_h->axis_info[idx].radius_x != radius_x)
1565      {
1566         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_X, radius_x);
1567         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1568         inputgen_h->axis_info[idx].radius_x = radius_x;
1569      }
1570    if (inputgen_h->axis_info[idx].radius_y != radius_y)
1571      {
1572         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_Y, radius_y);
1573         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1574         inputgen_h->axis_info[idx].radius_y = radius_y;
1575      }
1576    if (inputgen_h->axis_info[idx].pressure != pressure)
1577      {
1578         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PRESSURE, pressure);
1579         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1580         inputgen_h->axis_info[idx].pressure = pressure;
1581      }
1582    if (inputgen_h->axis_info[idx].angle != angle)
1583      {
1584         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_ANGLE, angle);
1585         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1586         inputgen_h->axis_info[idx].angle = angle;
1587      }
1588    if (inputgen_h->axis_info[idx].palm != palm)
1589      {
1590         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PALM, palm);
1591         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1592         inputgen_h->axis_info[idx].palm = palm;
1593      }
1594
1595    return ret;
1596 }
1597
1598 API int
1599 efl_util_input_generate_touch_axis(efl_util_inputgen_h inputgen_h, int idx,
1600                                    efl_util_input_touch_type_e touch_type, int x, int y,
1601                                    double radius_x, double radius_y,
1602                                    double pressure, double angle, double palm)
1603 {
1604    int ret, version;
1605    int ret_dispatch = 0;
1606    enum tizen_input_device_manager_pointer_event_type type;
1607
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);
1614
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);
1618
1619    switch(touch_type)
1620      {
1621         case EFL_UTIL_INPUT_TOUCH_BEGIN:
1622            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1623            break;
1624         case EFL_UTIL_INPUT_TOUCH_UPDATE:
1625            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1626            break;
1627         case EFL_UTIL_INPUT_TOUCH_END:
1628            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1629            break;
1630         default:
1631            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1632      }
1633
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);
1636    else
1637      _efl_util_input_generate_touch_axis_cleanup(inputgen_h, idx);
1638
1639    tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1640
1641    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1642      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1643
1644    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1645    _eflutil.wl.devmgr.request_notified = -1;
1646
1647    return ret;
1648 }
1649
1650
1651 API int
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)
1653 {
1654    int ret;
1655    int ret_dispatch = 0;
1656    enum tizen_input_device_manager_pointer_event_type type;
1657
1658    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1659    EINA_SAFETY_ON_FALSE_RETURN_VAL(buttons > 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1660    EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1661    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1662
1663    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1664
1665    switch(pointer_type)
1666      {
1667         case EFL_UTIL_INPUT_POINTER_BUTTON_DOWN:
1668            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1669            break;
1670         case EFL_UTIL_INPUT_POINTER_MOVE:
1671            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1672            break;
1673         case EFL_UTIL_INPUT_POINTER_BUTTON_UP:
1674            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1675            break;
1676         default:
1677            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1678      }
1679
1680    tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
1681
1682    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1683      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1684
1685    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1686    _eflutil.wl.devmgr.request_notified = -1;
1687
1688    return ret;
1689 }
1690
1691 API int
1692 efl_util_input_generate_wheel(efl_util_inputgen_h inputgen_h, efl_util_input_pointer_wheel_type_e wheel_type, int value)
1693 {
1694    int ret, version;
1695    int ret_dispatch = 0;
1696    enum tizen_input_device_manager_pointer_event_type type;
1697
1698    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1699    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1700
1701    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1702    version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
1703    EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
1704
1705    switch(wheel_type)
1706      {
1707         case EFL_UTIL_INPUT_POINTER_WHEEL_VERT:
1708            type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_WHEEL;
1709            break;
1710         case EFL_UTIL_INPUT_POINTER_WHEEL_HORZ:
1711            type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_HWHEEL;
1712            break;
1713         default:
1714            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1715      }
1716
1717    tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_int(value));
1718
1719    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
1720      ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1721
1722    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1723    _eflutil.wl.devmgr.request_notified = -1;
1724
1725    return ret;
1726 }
1727
1728
1729
1730 struct _efl_util_screenshot_h
1731 {
1732    int width;
1733    int height;
1734
1735    Eina_Bool shot_done;
1736
1737    /* tbm bufmgr */
1738    tbm_bufmgr bufmgr;
1739
1740    Eina_Bool auto_rotation;
1741 };
1742
1743 /* scrrenshot handle */
1744 static efl_util_screenshot_h g_screenshot;
1745 static Eina_Bool shot_mutex_init;
1746 static pthread_mutex_t shot_lock;
1747
1748 static Eina_Bool
1749 _screenshot_mutex_init(void)
1750 {
1751    if (shot_mutex_init)
1752      return EINA_TRUE;
1753
1754    if (pthread_mutex_init(&shot_lock, NULL))
1755      {
1756         fprintf(stderr, "[screenshot] fail: mutex init"); /*LCOV_EXCL_LINE*/
1757         return EINA_FALSE; /*LCOV_EXCL_LINE*/
1758      }
1759
1760    shot_mutex_init = EINA_TRUE;
1761
1762    return EINA_TRUE;
1763 }
1764
1765 static Eina_Bool
1766 _screenshot_mutex_destory(void)
1767 {
1768    if (!shot_mutex_init)
1769      return EINA_TRUE;
1770
1771    if (pthread_mutex_destroy(&shot_lock))
1772      {
1773         fprintf(stderr, "[screenshot] fail: mutex destory"); /*LCOV_EXCL_LINE*/
1774         return EINA_FALSE; /*LCOV_EXCL_LINE*/
1775      }
1776
1777    shot_mutex_init = EINA_FALSE;
1778
1779    return EINA_TRUE;
1780 }
1781
1782 void
1783 _screenshot_mutex_lock(void)
1784 {
1785    if (!_screenshot_mutex_init())
1786      return;
1787
1788    pthread_mutex_lock(&shot_lock);
1789 }
1790
1791 void
1792 _screenshot_mutex_unlock(void)
1793 {
1794    pthread_mutex_unlock(&shot_lock);
1795 }
1796
1797 static Eina_Bool
1798 _efl_util_wl_screenshooter_init()
1799 {
1800    struct wl_display *display_wrapper = NULL;
1801    struct wl_registry *registry = NULL;
1802    int ret = 0;
1803
1804    if (_wl_init() == EINA_FALSE)
1805      return EINA_FALSE;
1806
1807    wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1808
1809    display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
1810    EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE);
1811
1812    _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
1813    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_create_queue);
1814
1815    wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
1816
1817    registry = wl_display_get_registry(display_wrapper);
1818    EINA_SAFETY_ON_NULL_GOTO(registry, fail_get_registry);
1819
1820    wl_registry_add_listener(registry, &_wl_reg_screenshooter_listener, NULL);
1821
1822    ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
1823    EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_roundtrip);
1824    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tz_screenshooter, fail_roundtrip);
1825
1826    _eflutil.wl.shot.tbm_client = wayland_tbm_client_init(_eflutil.wl.dpy);
1827    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tbm_client, fail_tbm_client_init);
1828
1829    wl_registry_destroy(registry);
1830    wl_proxy_wrapper_destroy(display_wrapper);
1831
1832    if (_eflutil.wl.shot.noti == 0)
1833      {
1834         fprintf(stderr, "[screenshot] fail: privilege error\n"); /* LCOV_EXCL_LINE */
1835         return EINA_FALSE;
1836      }
1837
1838    return EINA_TRUE;
1839
1840 fail_tbm_client_init:
1841    tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1842    _eflutil.wl.shot.tz_screenshooter = NULL;
1843 fail_roundtrip:
1844    wl_registry_destroy(registry);
1845 fail_get_registry:
1846    wl_event_queue_destroy(_eflutil.wl.shot.queue);
1847    _eflutil.wl.shot.queue = NULL;
1848 fail_create_queue:
1849    wl_proxy_wrapper_destroy(display_wrapper);
1850
1851    return EINA_FALSE;
1852 }
1853
1854 static void
1855 _efl_util_wl_screenshooter_deinit()
1856 {
1857    if (_eflutil.wl.shot.tbm_client)
1858      {
1859         wayland_tbm_client_deinit(_eflutil.wl.shot.tbm_client);
1860         _eflutil.wl.shot.tbm_client = NULL;
1861      }
1862
1863    if (_eflutil.wl.shot.tz_screenshooter)
1864      {
1865         tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1866         _eflutil.wl.shot.tz_screenshooter = NULL;
1867      }
1868
1869    if (_eflutil.wl.shot.queue)
1870      {
1871         wl_event_queue_destroy(_eflutil.wl.shot.queue);
1872         _eflutil.wl.shot.queue = NULL;
1873      }
1874 }
1875
1876 API efl_util_screenshot_h
1877 efl_util_screenshot_initialize(int width, int height)
1878 {
1879    efl_util_screenshot_h screenshot = NULL;
1880
1881    if (width <= 0 || height <= 0)
1882      {
1883         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1884         return NULL;
1885      }
1886
1887    _screenshot_mutex_lock();
1888
1889    if (g_screenshot)
1890      {
1891         if (g_screenshot->width != width || g_screenshot->height != height)
1892           {
1893              g_screenshot->width = width;
1894              g_screenshot->height = height;
1895           }
1896         set_last_result(EFL_UTIL_ERROR_NONE);
1897
1898         _screenshot_mutex_unlock();
1899
1900         return g_screenshot;
1901      }
1902
1903    screenshot = calloc(1, sizeof(struct _efl_util_screenshot_h));
1904    if (screenshot == NULL)
1905      {
1906         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1907
1908         _screenshot_mutex_unlock();
1909
1910         return NULL;
1911      }
1912
1913    if (!_eflutil.wl.shot.tz_screenshooter)
1914      {
1915         if (_efl_util_wl_screenshooter_init() == EINA_FALSE)
1916           {
1917              if (_eflutil.wl.shot.noti == 0)
1918                set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
1919              else
1920                set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1921
1922              free(screenshot);
1923
1924              _screenshot_mutex_unlock();
1925
1926              return NULL;
1927           }
1928      }
1929
1930    screenshot->width = width;
1931    screenshot->height = height;
1932    screenshot->auto_rotation = EINA_TRUE;
1933
1934    screenshot->bufmgr = wayland_tbm_client_get_bufmgr(_eflutil.wl.shot.tbm_client);
1935    EINA_SAFETY_ON_NULL_GOTO(screenshot->bufmgr, fail_get_bufmgr);
1936
1937    g_screenshot = screenshot;
1938    set_last_result(EFL_UTIL_ERROR_NONE);
1939
1940    tizen_screenshooter_set_user_data(_eflutil.wl.shot.tz_screenshooter, &screenshot->shot_done);
1941
1942    _screenshot_mutex_unlock();
1943
1944    return g_screenshot;
1945
1946 /* LCOV_EXCL_START */
1947 fail_get_bufmgr:
1948    set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1949    _screenshot_mutex_unlock();
1950    efl_util_screenshot_deinitialize(screenshot);
1951
1952    return NULL;
1953 /* LCOV_EXCL_STOP */
1954 }
1955
1956 API int
1957 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
1958 {
1959    _screenshot_mutex_lock();
1960
1961    if (!screenshot)
1962      {
1963         _screenshot_mutex_unlock();
1964         _screenshot_mutex_destory();
1965         return EFL_UTIL_ERROR_INVALID_PARAMETER;
1966      }
1967
1968    free(screenshot);
1969    g_screenshot = NULL;
1970
1971    _efl_util_wl_screenshooter_deinit();
1972
1973    _screenshot_mutex_unlock();
1974    _screenshot_mutex_destory();
1975
1976    return EFL_UTIL_ERROR_NONE;
1977 }
1978
1979
1980 API tbm_surface_h
1981 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
1982 {
1983    tbm_surface_h t_surface = NULL;
1984    struct wl_buffer *buffer = NULL;
1985    Efl_Util_Wl_Output_Info *output;
1986    int ret = 0;
1987
1988    _screenshot_mutex_lock();
1989
1990    if (!screenshot || (screenshot != g_screenshot))
1991      {
1992         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1993         _screenshot_mutex_unlock();
1994         return NULL;
1995      }
1996
1997    output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
1998    if (!output)
1999      {
2000         fprintf(stderr, "[screenshot] fail: no output for screenshot\n"); /* LCOV_EXCL_LINE */
2001         goto fail;
2002      }
2003
2004    t_surface = tbm_surface_create(screenshot->width, screenshot->height, TBM_FORMAT_XRGB8888);
2005    if (!t_surface)
2006      {
2007         fprintf(stderr, "[screenshot] fail: tbm_surface_create\n"); /* LCOV_EXCL_LINE */
2008         goto fail;
2009      }
2010
2011    buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, t_surface);
2012    if (!buffer)
2013      {
2014         fprintf(stderr, "[screenshot] fail: create wl_buffer for screenshot\n"); /* LCOV_EXCL_LINE */
2015         goto fail;
2016      }
2017
2018    tizen_screenshooter_shoot(_eflutil.wl.shot.tz_screenshooter, output->output, buffer);
2019
2020    screenshot->shot_done = EINA_FALSE;
2021
2022    while (!screenshot->shot_done && ret != -1)
2023      ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2024
2025    if (ret == -1)
2026      {
2027         fprintf(stderr, "[screenshot] fail: tizen_screenshooter_shoot\n"); /* LCOV_EXCL_LINE */
2028         goto fail;
2029      }
2030
2031    wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2032
2033    /* reset shot_done for next screenshot */
2034    screenshot->shot_done = EINA_FALSE;
2035
2036    set_last_result(EFL_UTIL_ERROR_NONE);
2037
2038    _screenshot_mutex_unlock();
2039
2040    return t_surface;
2041
2042 fail:
2043    if (t_surface)
2044      tbm_surface_destroy(t_surface);
2045    if (buffer)
2046      wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2047
2048    set_last_result(EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL);
2049
2050    _screenshot_mutex_unlock();
2051
2052    return NULL;
2053 }
2054
2055 API int
2056 efl_util_screenshot_set_auto_rotation(efl_util_screenshot_h screenshot, int set)
2057 {
2058    if (!screenshot || (screenshot != g_screenshot))
2059      return EFL_UTIL_ERROR_INVALID_PARAMETER;
2060
2061    if (!(set == 0 || set == 1))
2062      return EFL_UTIL_ERROR_INVALID_PARAMETER;
2063
2064    if (set)
2065      g_screenshot->auto_rotation = EINA_TRUE;
2066    else
2067      g_screenshot->auto_rotation = EINA_FALSE;
2068
2069    tizen_screenshooter_set_oneshot_auto_rotation(_eflutil.wl.shot.tz_screenshooter, g_screenshot->auto_rotation);
2070
2071    return EFL_UTIL_ERROR_NONE;
2072 }
2073
2074 API int
2075 efl_util_screenshot_get_auto_rotation(efl_util_screenshot_h screenshot, int *set)
2076 {
2077    if (!screenshot || (screenshot != g_screenshot) || !set)
2078      return EFL_UTIL_ERROR_INVALID_PARAMETER;
2079
2080    *set = g_screenshot->auto_rotation;
2081
2082    return EFL_UTIL_ERROR_NONE;
2083 }
2084
2085 /* LCOV_EXCL_START */
2086 struct _efl_util_screenmirror_h
2087 {
2088    struct tizen_screenmirror *tz_screenmirror;
2089    pthread_t thread;
2090    int width;
2091    int height;
2092
2093    tbm_bufmgr bufmgr;
2094    Eina_List *buffer_list;
2095
2096    Eina_Bool mirror_working;
2097    Eina_Bool cb_start;
2098    Eina_Bool cb_stop;
2099    Eina_Bool cb_content;
2100    efl_util_screenmirror_handler user_func;
2101    void *user_data;
2102 };
2103
2104 typedef struct _efl_util_mirror_buffer efl_util_mirror_buffer;
2105 struct _efl_util_mirror_buffer
2106 {
2107    struct wl_buffer *buffer;
2108    int w, h;
2109    tbm_surface_h t_surface;
2110 };
2111
2112 static efl_util_screenmirror_h g_screenmirror;
2113
2114 static void *
2115 _efl_util_screenmirror_loop(void *data)
2116 {
2117    efl_util_screenmirror_h screenmirror;
2118    int ret = 0;
2119
2120    screenmirror = (efl_util_screenmirror_h)data;
2121
2122    while (1)
2123      {
2124         if (!screenmirror->mirror_working)
2125           break;
2126
2127         ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2128         if (ret == -1)
2129           {
2130              fprintf(stderr, "[screenmirror] fail: dispatch_queue\n");
2131              break;
2132           }
2133      }
2134
2135    return NULL;
2136 }
2137
2138 static efl_util_mirror_buffer *
2139 _efl_util_create_mirror_buffer(efl_util_screenmirror_h screenmirror)
2140 {
2141    efl_util_mirror_buffer *mbuffer;
2142
2143    mbuffer = calloc(1, sizeof(struct _efl_util_mirror_buffer));
2144    EINA_SAFETY_ON_NULL_RETURN_VAL(mbuffer, NULL);
2145
2146    mbuffer->w = screenmirror->width;
2147    mbuffer->h = screenmirror->height;
2148
2149    mbuffer->t_surface = tbm_surface_internal_create_with_flags(mbuffer->w,
2150                          mbuffer->h, TBM_FORMAT_ARGB8888, TBM_BO_SCANOUT);
2151    EINA_SAFETY_ON_NULL_GOTO(mbuffer->t_surface, fail_create_surface);
2152
2153    mbuffer->buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, mbuffer->t_surface);
2154    EINA_SAFETY_ON_NULL_GOTO(mbuffer->buffer, fail_create_buffer);
2155
2156    return mbuffer;
2157
2158 fail_create_buffer:
2159    tbm_surface_destroy(mbuffer->t_surface);
2160 fail_create_surface:
2161    free(mbuffer);
2162
2163    return NULL;
2164 }
2165
2166 static void
2167 _efl_util_destroy_mirror_buffer(efl_util_mirror_buffer *mbuffer)
2168 {
2169    EINA_SAFETY_ON_NULL_RETURN(mbuffer);
2170
2171    if (mbuffer->buffer)
2172      wl_buffer_destroy(mbuffer->buffer);
2173
2174    free(mbuffer);
2175 }
2176
2177 static void
2178 _efl_util_screenmirror_handle_dequeued(void *data,
2179                                        struct tizen_screenmirror *tz_screenmirror, struct wl_buffer *buffer)
2180 {
2181    efl_util_screenmirror_h screenmirror;
2182    efl_util_mirror_buffer *mbuffer;
2183    Eina_List *l, *ll;
2184
2185    screenmirror = (efl_util_screenmirror_h)data;
2186    screenmirror->cb_start = EINA_TRUE;
2187
2188    EINA_LIST_FOREACH_SAFE(screenmirror->buffer_list, l, ll, mbuffer)
2189      {
2190         if (mbuffer->buffer == buffer)
2191           {
2192              if (mbuffer->w != screenmirror->width || mbuffer->h != screenmirror->height ||
2193                  !screenmirror->mirror_working)
2194                tbm_surface_destroy(mbuffer->t_surface);
2195              else
2196                screenmirror->user_func(screenmirror, mbuffer->t_surface, screenmirror->user_data);
2197
2198              screenmirror->buffer_list = eina_list_remove_list(screenmirror->buffer_list, l);
2199              _efl_util_destroy_mirror_buffer(mbuffer);
2200
2201              break;
2202           }
2203      }
2204
2205    mbuffer = _efl_util_create_mirror_buffer(screenmirror);
2206    if (mbuffer == NULL)
2207      {
2208         fprintf(stderr, "[screenmirror] fail: buffer create\n");
2209         return;
2210      }
2211    screenmirror->buffer_list = eina_list_append(screenmirror->buffer_list, mbuffer);
2212    tizen_screenmirror_queue(screenmirror->tz_screenmirror, mbuffer->buffer);
2213 }
2214
2215 static void
2216 _efl_util_screenmirror_handle_content(void *data,
2217                                       struct tizen_screenmirror *tz_screenmirror, uint32_t content)
2218 {
2219    efl_util_screenmirror_h screenmirror = NULL;
2220
2221    screenmirror = (efl_util_screenmirror_h)data;
2222    screenmirror->cb_content = EINA_TRUE;
2223 }
2224
2225 static void
2226 _efl_util_screenmirror_handle_stop(void *data, struct tizen_screenmirror *tz_screenmirror)
2227 {
2228    efl_util_screenmirror_h screenmirror = NULL;
2229
2230    screenmirror = (efl_util_screenmirror_h)data;
2231    screenmirror->cb_stop = EINA_TRUE;
2232 }
2233
2234 static const struct tizen_screenmirror_listener efl_util_screenmirror_listener = {
2235    _efl_util_screenmirror_handle_dequeued,
2236    _efl_util_screenmirror_handle_content,
2237    _efl_util_screenmirror_handle_stop
2238 };
2239
2240 API efl_util_screenmirror_h
2241 efl_util_screenmirror_initialize(int width, int height)
2242 {
2243    efl_util_screenmirror_h screenmirror = NULL;
2244    efl_util_mirror_buffer *mbuffer;
2245    Efl_Util_Wl_Output_Info *output;
2246    int ret = 0, i;
2247
2248    if (width <= 0 || height <= 0)
2249      {
2250         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2251         return NULL;
2252      }
2253
2254    _screenshot_mutex_lock();
2255
2256    if (g_screenmirror)
2257      {
2258         if (g_screenmirror->mirror_working)
2259           {
2260              set_last_result(EFL_UTIL_ERROR_INVALID_OPERATION);
2261              _screenshot_mutex_unlock();
2262              return NULL;
2263           }
2264         else
2265           {
2266              g_screenmirror->width = width;
2267              g_screenmirror->height = height;
2268              set_last_result(EFL_UTIL_ERROR_NONE);
2269              _screenshot_mutex_unlock();
2270              return g_screenmirror;
2271           }
2272      }
2273
2274    screenmirror = calloc(1, sizeof(struct _efl_util_screenmirror_h));
2275    if (screenmirror == NULL)
2276      {
2277         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
2278         _screenshot_mutex_unlock();
2279         return NULL;
2280      }
2281
2282    if (!_eflutil.wl.shot.tz_screenshooter)
2283      {
2284         if (_efl_util_wl_screenshooter_init() == EINA_FALSE)
2285           {
2286              if (_eflutil.wl.shot.noti == 0)
2287                set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
2288              else
2289                set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
2290
2291              goto fail_wl_init;
2292           }
2293      }
2294
2295    output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
2296    if (!output)
2297      {
2298         set_last_result(EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE);
2299         fprintf(stderr, "[screenmirror] fail: no output for screenmirror\n");
2300         goto fail_get_output;
2301      }
2302
2303    screenmirror->tz_screenmirror = tizen_screenshooter_get_screenmirror(_eflutil.wl.shot.tz_screenshooter, output->output);
2304    wl_proxy_set_queue((struct wl_proxy *)screenmirror->tz_screenmirror, _eflutil.wl.shot.queue);
2305    tizen_screenmirror_add_listener(screenmirror->tz_screenmirror, &efl_util_screenmirror_listener, screenmirror);
2306    tizen_screenmirror_set_stretch(screenmirror->tz_screenmirror, TIZEN_SCREENMIRROR_STRETCH_KEEP_RATIO);
2307    screenmirror->width = width;
2308    screenmirror->height = height;
2309
2310    g_screenmirror = screenmirror;
2311
2312    for (i = 0; i < 1; i++)
2313      {
2314         mbuffer = _efl_util_create_mirror_buffer(screenmirror);
2315         if (mbuffer)
2316           {
2317               screenmirror->buffer_list = eina_list_append(screenmirror->buffer_list, mbuffer);
2318               tizen_screenmirror_queue(screenmirror->tz_screenmirror, mbuffer->buffer);
2319           }
2320         else
2321           fprintf(stderr, "[screenmirror] fail: buffer create %d\n", i);
2322      }
2323    while (!screenmirror->cb_content && ret != -1)
2324      ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2325
2326    _screenshot_mutex_unlock();
2327
2328    return screenmirror;
2329
2330 fail_get_output:
2331 fail_wl_init:
2332    free(screenmirror);
2333    _screenshot_mutex_unlock();
2334    return NULL;
2335 }
2336
2337 API int
2338 efl_util_screenmirror_deinitialize(efl_util_screenmirror_h screenmirror)
2339 {
2340    efl_util_mirror_buffer *mbuffer;
2341    Eina_List *l;
2342
2343    _screenshot_mutex_lock();
2344
2345    if (!screenmirror || (screenmirror != g_screenmirror))
2346      {
2347         _screenshot_mutex_unlock();
2348         _screenshot_mutex_destory();
2349         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2350      }
2351
2352    if (screenmirror->mirror_working)
2353      {
2354         fprintf(stderr, "[screenmirror] fail: execute stop before deinit\n");
2355         _screenshot_mutex_unlock();
2356         _screenshot_mutex_destory();
2357         return EFL_UTIL_ERROR_INVALID_OPERATION;
2358      }
2359
2360    EINA_LIST_FOREACH(screenmirror->buffer_list, l, mbuffer)
2361      {
2362         tbm_surface_destroy(mbuffer->t_surface);
2363         _efl_util_destroy_mirror_buffer(mbuffer);
2364      }
2365    eina_list_free(screenmirror->buffer_list);
2366
2367    tizen_screenmirror_destroy(screenmirror->tz_screenmirror);
2368    free(screenmirror);
2369    g_screenmirror = NULL;
2370
2371    _efl_util_wl_screenshooter_deinit();
2372
2373    _screenshot_mutex_unlock();
2374    _screenshot_mutex_destory();
2375
2376    return EFL_UTIL_ERROR_NONE;
2377 }
2378
2379 API int
2380 efl_util_screenmirror_set_handler(efl_util_screenmirror_h screenmirror,
2381                                   efl_util_screenmirror_handler func, void *data)
2382 {
2383    _screenshot_mutex_lock();
2384
2385    if (!screenmirror || (screenmirror != g_screenmirror) || !func)
2386      {
2387         _screenshot_mutex_unlock();
2388         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2389      }
2390    screenmirror->user_func = func;
2391    screenmirror->user_data = data;
2392
2393    _screenshot_mutex_unlock();
2394
2395    return EFL_UTIL_ERROR_NONE;
2396 }
2397
2398 API int
2399 efl_util_screenmirror_start(efl_util_screenmirror_h screenmirror)
2400 {
2401    int ret = 0;
2402
2403    _screenshot_mutex_lock();
2404
2405    if (!screenmirror || (screenmirror != g_screenmirror))
2406      {
2407         _screenshot_mutex_unlock();
2408         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2409      }
2410    else if (!screenmirror->user_func)
2411      {
2412         _screenshot_mutex_unlock();
2413         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2414      }
2415    else if (screenmirror->mirror_working)
2416      {
2417         _screenshot_mutex_unlock();
2418         return EFL_UTIL_ERROR_NONE;
2419      }
2420
2421    screenmirror->cb_start = EINA_FALSE;
2422    screenmirror->mirror_working = EINA_TRUE;
2423    tizen_screenmirror_start(screenmirror->tz_screenmirror);
2424    while (!screenmirror->cb_start && ret != -1)
2425      ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2426    if (ret == -1)
2427      {
2428         fprintf(stderr, "[screenmirror] fail: tizen_screenmirror_start\n");
2429         _screenshot_mutex_unlock();
2430         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2431      }
2432
2433    ret = pthread_create(&screenmirror->thread, NULL, _efl_util_screenmirror_loop, screenmirror);
2434    if (ret < 0)
2435      {
2436         fprintf(stderr, "[screenmirror] fail: thread create fail\n");
2437         _screenshot_mutex_unlock();
2438         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2439      }
2440
2441    pthread_setname_np(screenmirror->thread, "e_util_mirror");
2442
2443    _screenshot_mutex_unlock();
2444
2445    return EFL_UTIL_ERROR_NONE;
2446 }
2447
2448 API int
2449 efl_util_screenmirror_stop(efl_util_screenmirror_h screenmirror)
2450 {
2451    int ret = 0;
2452
2453    _screenshot_mutex_lock();
2454
2455    if (!screenmirror || (screenmirror != g_screenmirror))
2456      {
2457         _screenshot_mutex_unlock();
2458         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2459      }
2460    else if (!screenmirror->mirror_working)
2461      {
2462         _screenshot_mutex_unlock();
2463         return EFL_UTIL_ERROR_NONE;
2464      }
2465    screenmirror->mirror_working = EINA_FALSE;
2466    pthread_join(screenmirror->thread, NULL);
2467    tizen_screenmirror_stop(screenmirror->tz_screenmirror);
2468    screenmirror->cb_stop = EINA_FALSE;
2469
2470    while (!screenmirror->cb_stop && ret != -1)
2471      ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2472    if (ret == -1)
2473      {
2474         fprintf(stderr, "[screenmirror] fail: tizen_screenmirror_stop\n");
2475         _screenshot_mutex_unlock();
2476         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2477      }
2478
2479    _screenshot_mutex_unlock();
2480
2481    return EFL_UTIL_ERROR_NONE;
2482 }
2483 /* LCOV_EXCL_STOP */
2484
2485 struct _efl_util_gesture_h
2486 {
2487    Eina_Bool init;
2488 };
2489
2490 API int EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2491 API int EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2492 API int EFL_UTIL_EVENT_GESTURE_TAP = 0;
2493 API int EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2494
2495 /* LCOV_EXCL_START */
2496 static void
2497 _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)
2498 {
2499    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2500 }
2501
2502 static void
2503 _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)
2504 {
2505    efl_util_event_gesture_edge_swipe_s *ev = NULL;
2506
2507    ev = (efl_util_event_gesture_edge_swipe_s *)calloc(1, sizeof(*ev));
2508    if (!ev) return;
2509
2510    ev->mode = mode;
2511
2512    ev->fingers = fingers;
2513    ev->sx = sx;
2514    ev->sy = sy;
2515    ev->edge = edge;
2516
2517    ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE, ev, NULL, NULL);
2518 }
2519
2520 static void
2521 _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)
2522 {
2523    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2524 }
2525
2526 static void
2527 _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)
2528 {
2529    efl_util_event_gesture_edge_drag_s *ev = NULL;
2530
2531    ev = (efl_util_event_gesture_edge_drag_s *)calloc(1, sizeof(*ev));
2532    if (!ev) return;
2533
2534    ev->mode = mode;
2535
2536    ev->fingers = fingers;
2537    ev->cx = cx;
2538    ev->cy = cy;
2539    ev->edge = edge;
2540
2541    ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_DRAG, ev, NULL, NULL);
2542 }
2543
2544 static void
2545 _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)
2546 {
2547    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2548 }
2549
2550 static void
2551 _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats)
2552 {
2553    efl_util_event_gesture_tap_s *ev = NULL;
2554
2555    ev = (efl_util_event_gesture_tap_s *)calloc(1, sizeof(*ev));
2556    if (!ev) return;
2557
2558    ev->mode = mode;
2559
2560    ev->fingers = fingers;
2561    ev->repeats = repeats;
2562
2563    ecore_event_add(EFL_UTIL_EVENT_GESTURE_TAP, ev, NULL, NULL);
2564 }
2565 /* LCOV_EXCL_STOP */
2566
2567 static void
2568 _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)
2569 {
2570    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2571 }
2572
2573 /* LCOV_EXCL_START */
2574 static void
2575 _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)
2576 {
2577    efl_util_event_gesture_palm_cover_s *ev = NULL;
2578
2579    ev = (efl_util_event_gesture_palm_cover_s *)calloc(1, sizeof(*ev));
2580    if (!ev) return;
2581
2582    ev->mode = mode;
2583
2584    ev->duration = duration;
2585    ev->cx = cx;
2586    ev->cy = cy;
2587    ev->size = size;
2588    ev->pressure = wl_fixed_to_int(pressure);
2589
2590    ecore_event_add(EFL_UTIL_EVENT_GESTURE_PALM_COVER, ev, NULL, NULL);
2591 }
2592 /* LCOV_EXCL_STOP */
2593
2594 static void
2595 _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)
2596 {
2597    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2598 }
2599
2600 static efl_util_error_e
2601 _efl_util_gesture_convert_error(int ret)
2602 {
2603    switch (ret)
2604      {
2605         case TIZEN_GESTURE_ERROR_NONE:
2606            return EFL_UTIL_ERROR_NONE;
2607         case TIZEN_GESTURE_ERROR_INVALID_DATA:
2608            return EFL_UTIL_ERROR_INVALID_PARAMETER;
2609         case TIZEN_GESTURE_ERROR_NO_PERMISSION:
2610            return EFL_UTIL_ERROR_PERMISSION_DENIED;
2611         case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
2612            return EFL_UTIL_ERROR_OUT_OF_MEMORY;
2613         case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
2614            return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
2615         case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
2616            return EFL_UTIL_ERROR_NOT_SUPPORTED;
2617         default :
2618            return EFL_UTIL_ERROR_NONE;
2619      }
2620 }
2621
2622 /* LCOV_EXCL_START */
2623 static efl_util_error_e
2624 _efl_util_gesture_verify_request_notified()
2625 {
2626    int ret = EFL_UTIL_ERROR_NONE;
2627
2628    while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2629      wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2630
2631    ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2632    _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2633
2634    return ret;
2635 }
2636
2637 static int
2638 _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed)
2639 {
2640    int ret = EFL_UTIL_ERROR_NONE;
2641    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2642    Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2643    unsigned int fingers = 0;
2644    unsigned int edge = 0;
2645    unsigned int edge_size = 0;
2646    unsigned int start_point = 0;
2647    unsigned int end_point = 0;
2648
2649    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2650
2651    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2652    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2653    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2654                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2655
2656    edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2657
2658    fingers = edge_swipe_data->fingers;
2659    edge = edge_swipe_data->edge;
2660    edge_size = edge_swipe_data->edge_size;
2661    start_point = edge_swipe_data->start_point;
2662    end_point = edge_swipe_data->end_point;
2663
2664    if (grabbed)
2665       tizen_gesture_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2666    else
2667       tizen_gesture_ungrab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2668
2669    ret = _efl_util_gesture_verify_request_notified();
2670
2671    return ret;
2672 }
2673
2674 static int
2675 _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed)
2676 {
2677    int ret = EFL_UTIL_ERROR_NONE;
2678    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2679    Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2680    unsigned int fingers = 0;
2681    unsigned int edge = 0;
2682    unsigned int edge_size = 0;
2683    unsigned int start_point = 0;
2684    unsigned int end_point = 0;
2685
2686    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2687
2688    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2689    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2690    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2691                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2692
2693    edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2694
2695    fingers = edge_drag_data->fingers;
2696    edge = edge_drag_data->edge;
2697    edge_size = edge_drag_data->edge_size;
2698    start_point = edge_drag_data->start_point;
2699    end_point = edge_drag_data->end_point;
2700
2701    if (grabbed)
2702       tizen_gesture_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2703    else
2704       tizen_gesture_ungrab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2705
2706    ret = _efl_util_gesture_verify_request_notified();
2707
2708    return ret;
2709 }
2710
2711 static int
2712 _efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed)
2713 {
2714    int ret = EFL_UTIL_ERROR_NONE;
2715    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2716    Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2717    unsigned int fingers = 0;
2718    unsigned int repeats = 0;
2719
2720    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2721
2722    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2723    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2724    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2725                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2726
2727    tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2728
2729    fingers = tap_data->fingers;
2730    repeats = tap_data->repeats;
2731
2732    if (grabbed)
2733       tizen_gesture_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2734    else
2735       tizen_gesture_ungrab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2736
2737    ret = _efl_util_gesture_verify_request_notified();
2738
2739    return ret;
2740 }
2741
2742 static int
2743 _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data, Eina_Bool grabbed)
2744 {
2745    int ret = EFL_UTIL_ERROR_NONE;
2746    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2747
2748    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2749
2750    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2751    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2752    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2753                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2754
2755    if (grabbed)
2756       tizen_gesture_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2757    else
2758       tizen_gesture_ungrab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2759
2760    ret = _efl_util_gesture_verify_request_notified();
2761
2762    return ret;
2763 }
2764 /* LCOV_EXCL_STOP */
2765
2766 API efl_util_gesture_h
2767 efl_util_gesture_initialize(void)
2768 {
2769    efl_util_gesture_h gesture_h = NULL;
2770
2771    gesture_h = (efl_util_gesture_h)calloc(1, sizeof(struct _efl_util_gesture_h));
2772    if (!gesture_h)
2773      {
2774         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2775         goto out; /* LCOV_EXCL_LINE */
2776      }
2777
2778    if (_wl_init_default_queue() == (int)EINA_FALSE)
2779      {
2780         set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2781         goto out; /* LCOV_EXCL_LINE */
2782      }
2783
2784    while (!_eflutil_defaultqueue.wl.gesture.proto)
2785      wl_display_dispatch(_eflutil_defaultqueue.wl.dpy); /* LCOV_EXCL_LINE */
2786
2787    if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2788      {
2789         if (ecore_event_init() <= 0)
2790           {
2791              set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2792              goto out; /* LCOV_EXCL_LINE */
2793           }
2794         EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = ecore_event_type_new();
2795         EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = ecore_event_type_new();
2796         EFL_UTIL_EVENT_GESTURE_TAP = ecore_event_type_new();
2797         EFL_UTIL_EVENT_GESTURE_PALM_COVER = ecore_event_type_new();
2798      }
2799    _eflutil_defaultqueue.wl.gesture.event_init++;
2800    gesture_h->init = EINA_TRUE;
2801
2802    set_last_result(EFL_UTIL_ERROR_NONE);
2803    return gesture_h;
2804
2805 out:
2806 /* LCOV_EXCL_START */
2807    if (gesture_h)
2808      {
2809         free(gesture_h);
2810         gesture_h = NULL;
2811      }
2812    return gesture_h;
2813 /* LCOV_EXCL_STOP */
2814 }
2815
2816 API int
2817 efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
2818 {
2819    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2820    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2821
2822    free(gesture_h);
2823    gesture_h = NULL;
2824
2825    _eflutil_defaultqueue.wl.gesture.event_init--;
2826
2827    if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2828      {
2829         _eflutil_defaultqueue.wl.gesture.event_init = 0;
2830         ecore_event_shutdown();
2831         EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2832         EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2833         EFL_UTIL_EVENT_GESTURE_TAP = 0;
2834         EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2835      }
2836
2837    return EFL_UTIL_ERROR_NONE;
2838 }
2839
2840 API efl_util_gesture_data
2841 efl_util_gesture_edge_swipe_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2842 {
2843    Efl_Util_Gesture_Edge_Swipe_Grab_Data *data;
2844
2845    if (!gesture_h || gesture_h->init == EINA_FALSE)
2846      {
2847         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2848         return NULL;
2849      }
2850
2851    if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2852      {
2853         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2854         return NULL;
2855      }
2856
2857    data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Swipe_Grab_Data));
2858    if (!data)
2859      {
2860         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2861         return NULL; /* LCOV_EXCL_LINE */
2862      }
2863
2864    data->base.type = TIZEN_GESTURE_TYPE_EDGE_SWIPE;
2865    data->fingers = fingers;
2866    data->edge = edge;
2867    data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2868
2869    set_last_result(EFL_UTIL_ERROR_NONE);
2870
2871    return (void *)data;
2872 }
2873
2874 API int
2875 efl_util_gesture_edge_swipe_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2876 {
2877    if (!gesture_h || gesture_h->init == EINA_FALSE)
2878      {
2879         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2880      }
2881
2882    if (!data)
2883      {
2884         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2885      }
2886
2887    free(data);
2888    data = NULL;
2889
2890    return EFL_UTIL_ERROR_NONE;
2891 }
2892
2893 API int
2894 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)
2895 {
2896    Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = data;
2897
2898    EINA_SAFETY_ON_NULL_RETURN_VAL(edge_swipe_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2899    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_swipe_data->base.type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2900                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2901    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2902                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2903    EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2904
2905    edge_swipe_data->edge_size = edge_size;
2906    edge_swipe_data->start_point = start_point;
2907    edge_swipe_data->end_point = end_point;
2908
2909    return EFL_UTIL_ERROR_NONE;
2910 }
2911
2912 API efl_util_gesture_data
2913 efl_util_gesture_edge_drag_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2914 {
2915    Efl_Util_Gesture_Edge_Drag_Grab_Data *data;
2916
2917    if (!gesture_h || gesture_h->init == EINA_FALSE)
2918      {
2919         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2920         return NULL;
2921      }
2922
2923    if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2924      {
2925         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2926         return NULL;
2927      }
2928
2929    data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Drag_Grab_Data));
2930    if (!data)
2931      {
2932         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2933         return NULL; /* LCOV_EXCL_LINE */
2934      }
2935
2936    data->base.type = TIZEN_GESTURE_TYPE_EDGE_DRAG;
2937    data->fingers = fingers;
2938    data->edge = edge;
2939    data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2940
2941    set_last_result(EFL_UTIL_ERROR_NONE);
2942
2943    return (void *)data;
2944 }
2945
2946 API int
2947 efl_util_gesture_edge_drag_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2948 {
2949    if (!gesture_h || gesture_h->init == EINA_FALSE)
2950      {
2951         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2952      }
2953
2954    if (!data)
2955      {
2956         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2957      }
2958
2959    free(data);
2960    data = NULL;
2961
2962    return EFL_UTIL_ERROR_NONE;
2963 }
2964
2965 API int
2966 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)
2967 {
2968    Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = data;
2969
2970    EINA_SAFETY_ON_NULL_RETURN_VAL(edge_drag_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2971    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_drag_data->base.type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2972                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2973    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2974                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2975    EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2976
2977    edge_drag_data->edge_size = edge_size;
2978    edge_drag_data->start_point = start_point;
2979    edge_drag_data->end_point = end_point;
2980
2981    return EFL_UTIL_ERROR_NONE;
2982 }
2983
2984 API efl_util_gesture_data
2985 efl_util_gesture_tap_new(efl_util_gesture_h gesture_h, unsigned int fingers, unsigned int repeats)
2986 {
2987    Efl_Util_Gesture_Tap_Grab_Data *data;
2988
2989    if (!gesture_h || gesture_h->init == EINA_FALSE)
2990      {
2991         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2992         return NULL;
2993      }
2994
2995    if (fingers <= 1 || repeats <= 1)
2996      {
2997         set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED);
2998         return NULL;
2999      }
3000
3001    data = (Efl_Util_Gesture_Tap_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Tap_Grab_Data));
3002    if (!data)
3003      {
3004         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3005         return NULL; /* LCOV_EXCL_LINE */
3006      }
3007
3008    data->base.type = TIZEN_GESTURE_TYPE_TAP;
3009    data->fingers = fingers;
3010    data->repeats = repeats;
3011
3012    set_last_result(EFL_UTIL_ERROR_NONE);
3013
3014    return (void *)data;
3015 }
3016
3017 API int
3018 efl_util_gesture_tap_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3019 {
3020    if (!gesture_h || gesture_h->init == EINA_FALSE)
3021      {
3022         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3023      }
3024
3025    if (!data)
3026      {
3027         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3028      }
3029
3030    free(data);
3031    data = NULL;
3032
3033    return EFL_UTIL_ERROR_NONE;
3034 }
3035
3036 API efl_util_gesture_data
3037 efl_util_gesture_palm_cover_new(efl_util_gesture_h gesture_h)
3038 {
3039    Efl_Util_Gesture_Palm_Cover_Grab_Data *data;
3040
3041    if (!gesture_h || gesture_h->init == EINA_FALSE)
3042      {
3043         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
3044         return NULL;
3045      }
3046
3047    data = (Efl_Util_Gesture_Palm_Cover_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Palm_Cover_Grab_Data));
3048    if (!data)
3049      {
3050         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3051         return NULL; /* LCOV_EXCL_LINE */
3052      }
3053
3054    data->base.type = TIZEN_GESTURE_TYPE_PALM_COVER;
3055
3056    set_last_result(EFL_UTIL_ERROR_NONE);
3057
3058    return (void *)data;
3059 }
3060
3061 API int
3062 efl_util_gesture_palm_cover_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3063 {
3064    if (!gesture_h || gesture_h->init == EINA_FALSE)
3065      {
3066         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3067      }
3068
3069    if (!data)
3070      {
3071         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3072      }
3073
3074    free(data);
3075    data = NULL;
3076
3077    return EFL_UTIL_ERROR_NONE;
3078 }
3079
3080 /* LCOV_EXCL_START */
3081 API int
3082 efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3083 {
3084    int ret = EFL_UTIL_ERROR_NONE;
3085    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3086
3087    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3088
3089    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3090    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3091    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3092
3093    switch (base_data->type)
3094      {
3095         case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3096            ret = _efl_util_gesture_grab_edge_swipe(data, EINA_TRUE);
3097            break;
3098         case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3099            ret = _efl_util_gesture_grab_edge_drag(data, EINA_TRUE);
3100            break;
3101         case TIZEN_GESTURE_TYPE_TAP:
3102            ret = _efl_util_gesture_grab_tap(data, EINA_TRUE);
3103            break;
3104         case TIZEN_GESTURE_TYPE_PALM_COVER:
3105            ret = _efl_util_gesture_grab_palm_cover(data, EINA_TRUE);
3106            break;
3107         default:
3108            return EFL_UTIL_ERROR_INVALID_PARAMETER;
3109      }
3110
3111    return ret;
3112 }
3113
3114 API int
3115 efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3116 {
3117    int ret = EFL_UTIL_ERROR_NONE;
3118    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3119
3120    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3121
3122    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3123    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3124    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3125
3126    switch (base_data->type)
3127      {
3128         case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3129            ret = _efl_util_gesture_grab_edge_swipe(data, EINA_FALSE);
3130            break;
3131         case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3132            ret = _efl_util_gesture_grab_edge_drag(data, EINA_FALSE);
3133            break;
3134         case TIZEN_GESTURE_TYPE_TAP:
3135            ret = _efl_util_gesture_grab_tap(data, EINA_FALSE);
3136            break;
3137         case TIZEN_GESTURE_TYPE_PALM_COVER:
3138            ret = _efl_util_gesture_grab_palm_cover(data, EINA_FALSE);
3139            break;
3140         default:
3141            return EFL_UTIL_ERROR_INVALID_PARAMETER;
3142      }
3143
3144    return ret;
3145 }
3146 /* LCOV_EXCL_STOP */
3147
3148 API int
3149 efl_util_gesture_select(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3150 {
3151    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3152    Ecore_Wl2_Window *wlwin;
3153    struct wl_surface *surface;
3154    int ret;
3155
3156    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3157
3158    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3159    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3160    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3161    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3162
3163    if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3164      return EFL_UTIL_ERROR_NOT_SUPPORTED;
3165
3166    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3167    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3168
3169    surface = ecore_wl2_window_surface_get(wlwin);
3170    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3171                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
3172
3173    tizen_gesture_select_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3174
3175    ret = _efl_util_gesture_verify_request_notified();
3176
3177    return ret;
3178 }
3179
3180 API int
3181 efl_util_gesture_deselect(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3182 {
3183    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3184    Ecore_Wl2_Window *wlwin;
3185    struct wl_surface *surface;
3186    int ret;
3187
3188    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3189
3190    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3191    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3192    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3193    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3194
3195    if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3196      return EFL_UTIL_ERROR_NOT_SUPPORTED;
3197
3198    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3199    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3200
3201    surface = ecore_wl2_window_surface_get(wlwin);
3202    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3203                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
3204
3205    tizen_gesture_deselect_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3206
3207    ret = _efl_util_gesture_verify_request_notified();
3208
3209    return ret;
3210 }
3211
3212 /* LCOV_EXCL_START */
3213 API int
3214 efl_util_gesture_activate_set(efl_util_gesture_h gesture_h, unsigned int type, Eina_Bool active)
3215 {
3216    int ret;
3217
3218    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3219    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3220    EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3221
3222    tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, NULL, type, active);
3223
3224    ret = _efl_util_gesture_verify_request_notified();
3225
3226    return ret;
3227 }
3228 /* LCOV_EXCL_STOP */
3229
3230 API int
3231 efl_util_gesture_activate_set_on_window(efl_util_gesture_h gesture_h, Evas_Object *window, unsigned int type, Eina_Bool active)
3232 {
3233    Ecore_Wl2_Window *wlwin;
3234    struct wl_surface *surface;
3235    int ret;
3236
3237    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3238    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3239    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3240    EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3241
3242    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3243    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3244
3245    surface = ecore_wl2_window_surface_get(wlwin);
3246    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3247                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
3248
3249    tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, surface, type, active);
3250
3251    ret = _efl_util_gesture_verify_request_notified();
3252
3253    return ret;
3254 }