increase the wait_for_done event count (5->10)
[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
722    res = _wl_init();
723    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
724
725    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
726    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
727
728    type = elm_win_type_get(window);
729    if (type != ELM_WIN_NOTIFICATION)
730      {
731         wl_type = ecore_wl2_window_type_get(wlwin);
732         EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
733                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
734      }
735
736    while (!_eflutil.wl.policy.proto)
737      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
738
739    surface = ecore_wl2_window_surface_get(wlwin);
740    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
741                                   EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
742
743    lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
744    if (!lv_info)
745      {
746         lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
747         EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
748
749         lv_info->surface = surface;
750         lv_info->level = (int)level;
751         lv_info->wait_for_done = EINA_TRUE;
752         lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
753         eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
754                       &surface,
755                       lv_info);
756
757         evas_object_event_callback_add(window, EVAS_CALLBACK_DEL,
758                                        _cb_window_del, lv_info);
759      }
760    else
761      {
762         lv_info->level = (int)level;
763         lv_info->wait_for_done = EINA_TRUE;
764         lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
765      }
766
767
768    tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
769                                        surface, (int)level);
770
771    if (lv_info->wait_for_done)
772      {
773         int count = 0;
774         while (lv_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT))
775           {
776              ecore_wl2_display_flush(_eflutil.wl.wl2_display);
777              wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
778              count++;
779           }
780
781         if (lv_info->wait_for_done)
782           {
783              return EFL_UTIL_ERROR_INVALID_PARAMETER;
784           }
785         else
786           {
787              if (lv_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
788                {
789                   return EFL_UTIL_ERROR_PERMISSION_DENIED;
790                }
791           }
792      }
793
794    return EFL_UTIL_ERROR_NONE;
795 }
796
797 API int
798 efl_util_get_notification_window_level(Evas_Object *window,
799                                        efl_util_notification_level_e *level)
800 {
801    Eina_Bool res;
802
803    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
804    EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
805
806    Elm_Win_Type type;
807    Ecore_Wl2_Window *wlwin;
808    struct wl_surface *surface;
809    Efl_Util_Wl_Surface_Lv_Info *lv_info;
810    Ecore_Wl2_Window_Type wl_type;
811
812    res = _wl_init();
813    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
814
815    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
816    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
817
818    type = elm_win_type_get(window);
819    if (type != ELM_WIN_NOTIFICATION)
820      {
821         wl_type = ecore_wl2_window_type_get(wlwin);
822         EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
823                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
824      }
825
826    while (!_eflutil.wl.policy.proto)
827      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
828
829    surface = ecore_wl2_window_surface_get(wlwin);
830    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
831                                   EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
832
833    lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
834    if (lv_info)
835      {
836         if (lv_info->wait_for_done)
837           {
838              int count = 0;
839              while ((lv_info->wait_for_done) && (count < NUM_EVENT_WAIT_DONE_COUNT))
840                {
841                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
842                   wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
843                   count++;
844                }
845
846              if (lv_info->wait_for_done)
847                {
848                   *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
849                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
850                }
851           }
852
853         switch (lv_info->level)
854           {
855            case TIZEN_POLICY_LEVEL_NONE:    *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE;    break;
856            case TIZEN_POLICY_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
857            case TIZEN_POLICY_LEVEL_MEDIUM:  *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM;  break;
858            case TIZEN_POLICY_LEVEL_HIGH:    *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH;    break;
859            case TIZEN_POLICY_LEVEL_TOP:     *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP;     break;
860            default:                         *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
861             return EFL_UTIL_ERROR_INVALID_PARAMETER;
862           }
863         return EFL_UTIL_ERROR_NONE;
864      }
865    else
866      *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
867
868    return EFL_UTIL_ERROR_NONE;
869 }
870
871 API int
872 efl_util_set_window_opaque_state(Evas_Object *window,
873                                  int opaque)
874 {
875    Eina_Bool res;
876
877    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
878    EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
879                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
880
881    Ecore_Wl2_Window *wlwin;
882    struct wl_surface *surface;
883
884    if (!_eflutil.wl.policy.proto)
885      {
886         int ret = 0;
887
888         res = _wl_init();
889         EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
890
891         while (!_eflutil.wl.policy.proto && ret != -1)
892           ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
893
894         EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
895      }
896
897    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
898    if (!wlwin)
899       return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
900
901    surface  = ecore_wl2_window_surface_get(wlwin);
902    if (!surface)
903       return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
904
905    tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
906
907    return EFL_UTIL_ERROR_NONE;
908 }
909
910 API int
911 efl_util_set_window_screen_mode(Evas_Object *window,
912                                 efl_util_screen_mode_e mode)
913 {
914    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
915    EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
916                                     (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
917                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
918
919    Ecore_Wl2_Window *wlwin;
920    struct wl_surface *surface;
921    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
922    Eina_Bool res;
923
924    res = _wl_init();
925    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
926
927    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
928    if (wlwin)
929      {
930         while (!_eflutil.wl.policy.proto)
931           wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
932
933         surface = ecore_wl2_window_surface_get(wlwin);
934         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
935                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
936
937         scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
938         if (!scr_mode_info)
939           {
940              scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
941              EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
942
943              scr_mode_info->surface = surface;
944              scr_mode_info->mode = (unsigned int)mode;
945              scr_mode_info->wait_for_done = EINA_TRUE;
946              scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
947
948              eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
949                            &surface,
950                            scr_mode_info);
951           }
952         else
953           {
954              scr_mode_info->mode = (unsigned int)mode;
955              scr_mode_info->wait_for_done = EINA_TRUE;
956              scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
957           }
958
959         tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
960                                             surface, (unsigned int)mode);
961         if (scr_mode_info->wait_for_done)
962           {
963              int count = 0;
964              while (scr_mode_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT))
965                {
966                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
967                   wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
968                   count++;
969                }
970
971              if (scr_mode_info->wait_for_done)
972                {
973                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
974                }
975              else
976                {
977                   if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
978                     {
979                        return EFL_UTIL_ERROR_PERMISSION_DENIED;
980                     }
981                }
982           }
983
984         return EFL_UTIL_ERROR_NONE;
985      }
986    else
987      return EFL_UTIL_ERROR_INVALID_PARAMETER;
988 }
989
990 API int
991 efl_util_get_window_screen_mode(Evas_Object *window,
992                                 efl_util_screen_mode_e *mode)
993 {
994    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
995    EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
996
997    Ecore_Wl2_Window *wlwin;
998    struct wl_surface *surface;
999    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
1000    Eina_Bool res;
1001
1002    res = _wl_init();
1003    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1004
1005    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1006    if (wlwin)
1007      {
1008         while (!_eflutil.wl.policy.proto)
1009           wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1010
1011         surface = ecore_wl2_window_surface_get(wlwin);
1012         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1013                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
1014
1015         scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
1016         if (scr_mode_info)
1017           {
1018              if (scr_mode_info->wait_for_done)
1019                {
1020                   while (scr_mode_info->wait_for_done)
1021                     {
1022                        ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1023                        wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1024                     }
1025                }
1026
1027              switch (scr_mode_info->mode)
1028                {
1029                 case TIZEN_POLICY_MODE_DEFAULT:   *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;   break;
1030                 case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
1031                 default:                          *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1032                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
1033                }
1034              return EFL_UTIL_ERROR_NONE;
1035           }
1036         else
1037           {
1038              *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1039              return EFL_UTIL_ERROR_INVALID_PARAMETER;
1040           }
1041      }
1042    else
1043      return EFL_UTIL_ERROR_INVALID_PARAMETER;
1044 }
1045
1046 API int
1047 efl_util_set_window_brightness(Evas_Object *window, int brightness)
1048 {
1049    Ecore_Wl2_Window *wlwin;
1050    struct wl_surface *surface;
1051    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1052    Eina_Bool res;
1053
1054    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1055    EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
1056
1057    res = _wl_init();
1058    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1059
1060    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1061    if (wlwin)
1062      {
1063         while (!_eflutil.wl.display_policy.proto)
1064           wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1065
1066         surface = ecore_wl2_window_surface_get(wlwin);
1067         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1068                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
1069
1070         brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1071         if (!brightness_info)
1072           {
1073              brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
1074              EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1075
1076              brightness_info->surface = surface;
1077              brightness_info->brightness = brightness;
1078              brightness_info->wait_for_done = EINA_TRUE;
1079              brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1080
1081              eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
1082                            &surface,
1083                            brightness_info);
1084            }
1085          else
1086            {
1087               brightness_info->brightness = brightness;
1088               brightness_info->wait_for_done = EINA_TRUE;
1089               brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1090            }
1091
1092          tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
1093                                                     surface, brightness);
1094          if (brightness_info->wait_for_done)
1095            {
1096               int count = 0;
1097               while (brightness_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT))
1098                 {
1099                    ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1100                    wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1101                    count++;
1102                 }
1103
1104               if (brightness_info->wait_for_done)
1105                 {
1106                    return EFL_UTIL_ERROR_INVALID_PARAMETER;
1107                 }
1108               else
1109                 {
1110                    if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
1111                      {
1112                         return EFL_UTIL_ERROR_PERMISSION_DENIED;
1113                      }
1114                 }
1115            }
1116         return EFL_UTIL_ERROR_NONE;
1117      }
1118    else
1119      return EFL_UTIL_ERROR_INVALID_PARAMETER;
1120 }
1121
1122 API int
1123 efl_util_get_window_brightness(Evas_Object *window, int *brightness)
1124 {
1125    Ecore_Wl2_Window *wlwin;
1126    struct wl_surface *surface;
1127    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1128    Eina_Bool res;
1129
1130    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1131    EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
1132
1133    res = _wl_init();
1134    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1135
1136    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1137    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
1138
1139    while (!_eflutil.wl.display_policy.proto)
1140      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1141
1142    surface = ecore_wl2_window_surface_get(wlwin);
1143    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1144                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
1145
1146    brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1147    if (brightness_info)
1148      {
1149         if (brightness_info->wait_for_done)
1150           {
1151              while (brightness_info->wait_for_done)
1152                {
1153                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1154                   wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1155                }
1156           }
1157          *brightness = brightness_info->brightness;
1158      }
1159    else
1160      *brightness = -1;
1161
1162    return EFL_UTIL_ERROR_NONE;
1163 }
1164
1165
1166 struct _efl_util_inputgen_h
1167 {
1168    unsigned int init_type;
1169    char name[32];
1170    E_Devicemgr_Inputgen_Touch_Axis *axis_info;
1171 };
1172
1173 /* LCOV_EXCL_STOP */
1174
1175 static void
1176 _cb_device_add(void *data EINA_UNUSED,
1177                struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1178                uint32_t serial EINA_UNUSED,
1179                const char *identifier EINA_UNUSED,
1180                struct tizen_input_device *device,
1181                struct wl_seat *seat EINA_UNUSED)
1182 {
1183    ;
1184 }
1185
1186 static void
1187 _cb_device_remove(void *data EINA_UNUSED,
1188                struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1189                uint32_t serial  EINA_UNUSED,
1190                const char *identifier  EINA_UNUSED,
1191                struct tizen_input_device *device,
1192                struct wl_seat *seat  EINA_UNUSED)
1193 {
1194    ;
1195 }
1196
1197 static void
1198 _cb_error(void *data EINA_UNUSED,
1199           struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1200           uint32_t errorcode)
1201 {
1202    _eflutil.wl.devmgr.request_notified = errorcode;
1203 }
1204
1205 /* LCOV_EXCL_START */
1206 static void
1207 _cb_block_expired(void *data EINA_UNUSED,
1208                   struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
1209 {
1210    ;
1211 }
1212 /* LCOV_EXCL_STOP */
1213
1214 static void
1215 _cb_max_touch_count(void *data EINA_UNUSED,
1216                     struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1217                     uint32_t serial EINA_UNUSED,
1218                     int32_t max_count,
1219                     struct wl_seat *seat EINA_UNUSED)
1220 {
1221    _eflutil.wl.devmgr.max_touch_count = max_count;
1222 }
1223
1224 static efl_util_error_e
1225 _efl_util_input_convert_input_generator_error(int ret)
1226 {
1227    switch (ret)
1228      {
1229         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
1230            return EFL_UTIL_ERROR_NONE;
1231         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
1232            return EFL_UTIL_ERROR_PERMISSION_DENIED;
1233         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
1234            return EFL_UTIL_ERROR_OUT_OF_MEMORY;
1235         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
1236            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1237         case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NOT_ALLOWED:
1238            return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
1239         default :
1240            return EFL_UTIL_ERROR_NONE;
1241      }
1242 }
1243
1244 static efl_util_inputgen_h
1245 _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *ret, int with_name)
1246 {
1247    efl_util_inputgen_h inputgen_h = NULL;
1248    unsigned int clas = 0x0;
1249
1250    if (!dev_type ||
1251         dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1252                     | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1253                     | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1254      {
1255         set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1256         goto out;
1257      }
1258
1259    inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1260    if (!inputgen_h)
1261      {
1262         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1263         goto out;
1264      }
1265
1266    inputgen_h->init_type |= dev_type;
1267    if (with_name)
1268      {
1269         if (name) strncpy(inputgen_h->name, name, 31);
1270         else strncpy(inputgen_h->name, "Input Generator", 31);
1271      }
1272
1273    *ret = _wl_init();
1274    if (*ret == (int)EINA_FALSE)
1275      {
1276         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1277         goto out;
1278      }
1279
1280    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1281      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1282    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1283      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1284    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1285      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1286
1287    while (!_eflutil.wl.devmgr.devicemgr)
1288      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1289
1290    if (with_name == 2)
1291       tizen_input_device_manager_init_generator_with_sync(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1292    else if (with_name == 1)
1293       tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1294    else
1295       tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
1296
1297
1298    while (_eflutil.wl.devmgr.request_notified == -1)
1299      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1300
1301    *ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1302    _eflutil.wl.devmgr.request_notified = -1;
1303
1304    set_last_result(*ret);
1305    if (*ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1306      goto out;
1307
1308    return inputgen_h;
1309
1310 out:
1311    if (inputgen_h)
1312      {
1313         free(inputgen_h);
1314         inputgen_h = NULL;
1315      }
1316    return NULL;
1317 }
1318
1319 API efl_util_inputgen_h
1320 efl_util_input_initialize_generator(unsigned int dev_type)
1321 {
1322    int ret = EFL_UTIL_ERROR_NONE;
1323    efl_util_inputgen_h inputgen_h = NULL;
1324
1325    inputgen_h = _efl_util_input_create_inputgen(dev_type, NULL, &ret, 0);
1326    if (!inputgen_h)
1327       return NULL;
1328
1329    return inputgen_h;
1330 }
1331
1332 API efl_util_inputgen_h
1333 efl_util_input_initialize_generator_with_name(unsigned int dev_type, const char *name)
1334 {
1335    int ret = EFL_UTIL_ERROR_NONE;
1336    efl_util_inputgen_h inputgen_h = NULL;
1337
1338    inputgen_h = _efl_util_input_create_inputgen(dev_type, name, &ret, 1);
1339    if (!inputgen_h)
1340       return NULL;
1341
1342    return inputgen_h;
1343 }
1344
1345 API efl_util_inputgen_h
1346 efl_util_input_initialize_generator_with_sync(unsigned int dev_type, const char *name)
1347 {
1348    int ret = EFL_UTIL_ERROR_NONE;
1349    efl_util_inputgen_h inputgen_h = NULL;
1350
1351    inputgen_h = _efl_util_input_create_inputgen(dev_type, name, &ret, 2);
1352    if (!inputgen_h)
1353       return NULL;
1354
1355    return inputgen_h;
1356 }
1357
1358 API int
1359 efl_util_input_set_touch_count(int max_count)
1360 {
1361    int ret = EFL_UTIL_ERROR_NONE;
1362
1363    ret = _wl_init();
1364    if (ret == (int)EINA_FALSE)
1365      {
1366         return EFL_UTIL_ERROR_INVALID_PARAMETER;
1367      }
1368
1369    while (!_eflutil.wl.devmgr.devicemgr)
1370      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1371
1372    if (_eflutil.wl.devmgr.max_touch_count >= max_count)
1373      return EFL_UTIL_ERROR_NONE;
1374
1375    tizen_input_device_manager_set_touch_count(_eflutil.wl.devmgr.devicemgr, max_count);
1376
1377    while (_eflutil.wl.devmgr.request_notified == -1)
1378      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1379
1380    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1381    _eflutil.wl.devmgr.request_notified = -1;
1382
1383    if (ret == EFL_UTIL_ERROR_NONE)
1384      {
1385         _eflutil.wl.devmgr.request_touch_count = max_count;
1386      }
1387
1388    return ret;
1389 }
1390
1391 API int
1392 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
1393 {
1394    int ret = EFL_UTIL_ERROR_NONE;
1395    unsigned int clas = 0x0;
1396    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1397
1398    if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1399      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1400    if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1401      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1402    if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1403      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1404
1405    if (inputgen_h->axis_info)
1406      free(inputgen_h->axis_info);
1407
1408    free(inputgen_h);
1409    inputgen_h = NULL;
1410
1411    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1412
1413    tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
1414
1415    while (_eflutil.wl.devmgr.request_notified == -1)
1416      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1417
1418    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1419    _eflutil.wl.devmgr.request_notified = -1;
1420
1421    return ret;
1422 }
1423
1424 API int
1425 efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name, int pressed)
1426 {
1427    int ret = EFL_UTIL_ERROR_NONE;
1428
1429    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1430    EINA_SAFETY_ON_NULL_RETURN_VAL(key_name, EFL_UTIL_ERROR_INVALID_PARAMETER);
1431    EINA_SAFETY_ON_FALSE_RETURN_VAL(pressed == 0 || pressed == 1, EFL_UTIL_ERROR_INVALID_PARAMETER);
1432    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1433
1434    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1435
1436    tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
1437
1438    while (_eflutil.wl.devmgr.request_notified == -1)
1439      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1440
1441    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1442    _eflutil.wl.devmgr.request_notified = -1;
1443
1444    return ret;
1445 }
1446
1447 API int
1448 efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
1449                               efl_util_input_touch_type_e touch_type, int x, int y)
1450 {
1451    int ret;
1452    enum tizen_input_device_manager_pointer_event_type type;
1453
1454    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1455    EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1456    EINA_SAFETY_ON_FALSE_RETURN_VAL((x > 0 && y > 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1457    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1458
1459    if (idx >= _eflutil.wl.devmgr.max_touch_count)
1460      return EFL_UTIL_ERROR_INVALID_PARAMETER;
1461
1462    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1463
1464    switch(touch_type)
1465      {
1466         case EFL_UTIL_INPUT_TOUCH_BEGIN:
1467            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1468            break;
1469         case EFL_UTIL_INPUT_TOUCH_UPDATE:
1470            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1471            break;
1472         case EFL_UTIL_INPUT_TOUCH_END:
1473            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1474            break;
1475         default:
1476            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1477      }
1478
1479    tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1480
1481    while (_eflutil.wl.devmgr.request_notified == -1)
1482      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1483
1484    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1485    _eflutil.wl.devmgr.request_notified = -1;
1486
1487    return ret;
1488 }
1489
1490 static int
1491 _efl_util_input_generate_touch_axis_send(unsigned int type, double value)
1492 {
1493    int ret;
1494
1495    tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_double(value));
1496
1497    while (_eflutil.wl.devmgr.request_notified == -1)
1498      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1499
1500    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1501    _eflutil.wl.devmgr.request_notified = -1;
1502
1503    return ret;
1504 }
1505
1506 static void
1507 _efl_util_input_generate_touch_axis_cleanup(efl_util_inputgen_h inputgen_h, int idx)
1508 {
1509    int i;
1510    if (idx >= 0)
1511      {
1512         inputgen_h->axis_info[idx].radius_x = 1.0;
1513         inputgen_h->axis_info[idx].radius_y = 1.0;
1514         inputgen_h->axis_info[idx].pressure = 1.0;
1515         inputgen_h->axis_info[idx].angle = 0.0;
1516         inputgen_h->axis_info[idx].palm = 0.0;
1517      }
1518    else
1519      {
1520         for (i = 0; i < EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER; i++)
1521           {
1522              inputgen_h->axis_info[i].radius_x = 1.0;
1523              inputgen_h->axis_info[i].radius_y = 1.0;
1524              inputgen_h->axis_info[i].pressure = 1.0;
1525              inputgen_h->axis_info[i].angle = 0.0;
1526              inputgen_h->axis_info[i].palm = 0.0;
1527           }
1528      }
1529 }
1530
1531 static int
1532 _efl_util_input_generate_touch_axis_process(efl_util_inputgen_h inputgen_h, int idx, double radius_x,
1533                                             double radius_y, double pressure, double angle, double palm)
1534 {
1535    int ret = EFL_UTIL_ERROR_NONE;
1536
1537    if (!inputgen_h->axis_info)
1538      {
1539         inputgen_h->axis_info = calloc(EFL_UTIL_INPUT_GENERATOR_TOUCH_MAX_FINGER,
1540                                        sizeof(E_Devicemgr_Inputgen_Touch_Axis));
1541         _efl_util_input_generate_touch_axis_cleanup(inputgen_h, -1);
1542      }
1543
1544    if (inputgen_h->axis_info[idx].radius_x != radius_x)
1545      {
1546         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_X, radius_x);
1547         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1548         inputgen_h->axis_info[idx].radius_x = radius_x;
1549      }
1550    if (inputgen_h->axis_info[idx].radius_y != radius_y)
1551      {
1552         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_RADIUS_Y, radius_y);
1553         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1554         inputgen_h->axis_info[idx].radius_y = radius_y;
1555      }
1556    if (inputgen_h->axis_info[idx].pressure != pressure)
1557      {
1558         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PRESSURE, pressure);
1559         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1560         inputgen_h->axis_info[idx].pressure = pressure;
1561      }
1562    if (inputgen_h->axis_info[idx].angle != angle)
1563      {
1564         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_ANGLE, angle);
1565         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1566         inputgen_h->axis_info[idx].angle = angle;
1567      }
1568    if (inputgen_h->axis_info[idx].palm != palm)
1569      {
1570         ret = _efl_util_input_generate_touch_axis_send(TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_PALM, palm);
1571         if (ret != EFL_UTIL_ERROR_NONE) return ret;
1572         inputgen_h->axis_info[idx].palm = palm;
1573      }
1574
1575    return ret;
1576 }
1577
1578 API int
1579 efl_util_input_generate_touch_axis(efl_util_inputgen_h inputgen_h, int idx,
1580                                    efl_util_input_touch_type_e touch_type, int x, int y,
1581                                    double radius_x, double radius_y,
1582                                    double pressure, double angle, double palm)
1583 {
1584    int ret, version;
1585    enum tizen_input_device_manager_pointer_event_type type;
1586
1587    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1588    EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1589    EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1590    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1591    EINA_SAFETY_ON_FALSE_RETURN_VAL((radius_x >= 0.0 && radius_y >= 0.0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1592    EINA_SAFETY_ON_FALSE_RETURN_VAL((pressure >= 0.0 && palm >= 0.0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1593
1594    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1595    version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
1596    EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
1597
1598    switch(touch_type)
1599      {
1600         case EFL_UTIL_INPUT_TOUCH_BEGIN:
1601            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1602            break;
1603         case EFL_UTIL_INPUT_TOUCH_UPDATE:
1604            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1605            break;
1606         case EFL_UTIL_INPUT_TOUCH_END:
1607            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1608            break;
1609         default:
1610            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1611      }
1612
1613    if (touch_type != EFL_UTIL_INPUT_TOUCH_END)
1614      _efl_util_input_generate_touch_axis_process(inputgen_h, idx, radius_x, radius_y, pressure, angle, palm);
1615    else
1616      _efl_util_input_generate_touch_axis_cleanup(inputgen_h, idx);
1617
1618    tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1619
1620    while (_eflutil.wl.devmgr.request_notified == -1)
1621      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1622
1623    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1624    _eflutil.wl.devmgr.request_notified = -1;
1625
1626    return ret;
1627 }
1628
1629
1630 API int
1631 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)
1632 {
1633    int ret;
1634    enum tizen_input_device_manager_pointer_event_type type;
1635
1636    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1637    EINA_SAFETY_ON_FALSE_RETURN_VAL(buttons > 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1638    EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1639    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1640
1641    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1642
1643    switch(pointer_type)
1644      {
1645         case EFL_UTIL_INPUT_POINTER_BUTTON_DOWN:
1646            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1647            break;
1648         case EFL_UTIL_INPUT_POINTER_MOVE:
1649            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1650            break;
1651         case EFL_UTIL_INPUT_POINTER_BUTTON_UP:
1652            type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1653            break;
1654         default:
1655            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1656      }
1657
1658    tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
1659
1660    while (_eflutil.wl.devmgr.request_notified == -1)
1661      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1662
1663    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1664    _eflutil.wl.devmgr.request_notified = -1;
1665
1666    return ret;
1667 }
1668
1669 API int
1670 efl_util_input_generate_wheel(efl_util_inputgen_h inputgen_h, efl_util_input_pointer_wheel_type_e wheel_type, int value)
1671 {
1672    int ret, version;
1673    enum tizen_input_device_manager_pointer_event_type type;
1674
1675    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1676    EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1677
1678    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1679    version = tizen_input_device_manager_get_version(_eflutil.wl.devmgr.devicemgr);
1680    EINA_SAFETY_ON_FALSE_RETURN_VAL((version >= 3), EFL_UTIL_ERROR_NOT_SUPPORTED);
1681
1682    switch(wheel_type)
1683      {
1684         case EFL_UTIL_INPUT_POINTER_WHEEL_VERT:
1685            type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_WHEEL;
1686            break;
1687         case EFL_UTIL_INPUT_POINTER_WHEEL_HORZ:
1688            type = TIZEN_INPUT_DEVICE_MANAGER_AXIS_TYPE_HWHEEL;
1689            break;
1690         default:
1691            return EFL_UTIL_ERROR_INVALID_PARAMETER;
1692      }
1693
1694    tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_int(value));
1695
1696    while (_eflutil.wl.devmgr.request_notified == -1)
1697      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1698
1699    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1700    _eflutil.wl.devmgr.request_notified = -1;
1701
1702    return ret;
1703 }
1704
1705
1706
1707 struct _efl_util_screenshot_h
1708 {
1709    int width;
1710    int height;
1711
1712    Eina_Bool shot_done;
1713
1714    /* tbm bufmgr */
1715    tbm_bufmgr bufmgr;
1716
1717    Eina_Bool auto_rotation;
1718 };
1719
1720 /* scrrenshot handle */
1721 static efl_util_screenshot_h g_screenshot;
1722 static Eina_Bool shot_mutex_init;
1723 static pthread_mutex_t shot_lock;
1724
1725 static Eina_Bool
1726 _screenshot_mutex_init(void)
1727 {
1728    if (shot_mutex_init)
1729      return EINA_TRUE;
1730
1731    if (pthread_mutex_init(&shot_lock, NULL))
1732      {
1733         fprintf(stderr, "[screenshot] fail: mutex init"); /*LCOV_EXCL_LINE*/
1734         return EINA_FALSE; /*LCOV_EXCL_LINE*/
1735      }
1736
1737    shot_mutex_init = EINA_TRUE;
1738
1739    return EINA_TRUE;
1740 }
1741
1742 static Eina_Bool
1743 _screenshot_mutex_destory(void)
1744 {
1745    if (!shot_mutex_init)
1746      return EINA_TRUE;
1747
1748    if (pthread_mutex_destroy(&shot_lock))
1749      {
1750         fprintf(stderr, "[screenshot] fail: mutex destory"); /*LCOV_EXCL_LINE*/
1751         return EINA_FALSE; /*LCOV_EXCL_LINE*/
1752      }
1753
1754    shot_mutex_init = EINA_FALSE;
1755
1756    return EINA_TRUE;
1757 }
1758
1759 void
1760 _screenshot_mutex_lock(void)
1761 {
1762    if (!_screenshot_mutex_init())
1763      return;
1764
1765    pthread_mutex_lock(&shot_lock);
1766 }
1767
1768 void
1769 _screenshot_mutex_unlock(void)
1770 {
1771    pthread_mutex_unlock(&shot_lock);
1772 }
1773
1774 static Eina_Bool
1775 _efl_util_wl_screenshooter_init()
1776 {
1777    struct wl_display *display_wrapper = NULL;
1778    struct wl_registry *registry = NULL;
1779    int ret = 0;
1780
1781    if (_wl_init() == EINA_FALSE)
1782      return EINA_FALSE;
1783
1784    wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1785
1786    display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
1787    EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE);
1788
1789    _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
1790    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_create_queue);
1791
1792    wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
1793
1794    registry = wl_display_get_registry(display_wrapper);
1795    EINA_SAFETY_ON_NULL_GOTO(registry, fail_get_registry);
1796
1797    wl_registry_add_listener(registry, &_wl_reg_screenshooter_listener, NULL);
1798
1799    ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
1800    EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_roundtrip);
1801    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tz_screenshooter, fail_roundtrip);
1802
1803    _eflutil.wl.shot.tbm_client = wayland_tbm_client_init(_eflutil.wl.dpy);
1804    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tbm_client, fail_tbm_client_init);
1805
1806    wl_registry_destroy(registry);
1807    wl_proxy_wrapper_destroy(display_wrapper);
1808
1809    if (_eflutil.wl.shot.noti == 0)
1810      {
1811         fprintf(stderr, "[screenshot] fail: privilege error\n"); /* LCOV_EXCL_LINE */
1812         return EINA_FALSE;
1813      }
1814
1815    return EINA_TRUE;
1816
1817 fail_tbm_client_init:
1818    tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1819    _eflutil.wl.shot.tz_screenshooter = NULL;
1820 fail_roundtrip:
1821    wl_registry_destroy(registry);
1822 fail_get_registry:
1823    wl_event_queue_destroy(_eflutil.wl.shot.queue);
1824    _eflutil.wl.shot.queue = NULL;
1825 fail_create_queue:
1826    wl_proxy_wrapper_destroy(display_wrapper);
1827
1828    return EINA_FALSE;
1829 }
1830
1831 static void
1832 _efl_util_wl_screenshooter_deinit()
1833 {
1834    if (_eflutil.wl.shot.tbm_client)
1835      {
1836         wayland_tbm_client_deinit(_eflutil.wl.shot.tbm_client);
1837         _eflutil.wl.shot.tbm_client = NULL;
1838      }
1839
1840    if (_eflutil.wl.shot.tz_screenshooter)
1841      {
1842         tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1843         _eflutil.wl.shot.tz_screenshooter = NULL;
1844      }
1845
1846    if (_eflutil.wl.shot.queue)
1847      {
1848         wl_event_queue_destroy(_eflutil.wl.shot.queue);
1849         _eflutil.wl.shot.queue = NULL;
1850      }
1851 }
1852
1853 API efl_util_screenshot_h
1854 efl_util_screenshot_initialize(int width, int height)
1855 {
1856    efl_util_screenshot_h screenshot = NULL;
1857
1858    if (width <= 0 || height <= 0)
1859      {
1860         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1861         return NULL;
1862      }
1863
1864    _screenshot_mutex_lock();
1865
1866    if (g_screenshot)
1867      {
1868         if (g_screenshot->width != width || g_screenshot->height != height)
1869           {
1870              g_screenshot->width = width;
1871              g_screenshot->height = height;
1872           }
1873         set_last_result(EFL_UTIL_ERROR_NONE);
1874
1875         _screenshot_mutex_unlock();
1876
1877         return g_screenshot;
1878      }
1879
1880    screenshot = calloc(1, sizeof(struct _efl_util_screenshot_h));
1881    if (screenshot == NULL)
1882      {
1883         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1884
1885         _screenshot_mutex_unlock();
1886
1887         return NULL;
1888      }
1889
1890    if (!_eflutil.wl.shot.tz_screenshooter)
1891      {
1892         if (_efl_util_wl_screenshooter_init() == EINA_FALSE)
1893           {
1894              if (_eflutil.wl.shot.noti == 0)
1895                set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
1896              else
1897                set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1898
1899              free(screenshot);
1900
1901              _screenshot_mutex_unlock();
1902
1903              return NULL;
1904           }
1905      }
1906
1907    screenshot->width = width;
1908    screenshot->height = height;
1909    screenshot->auto_rotation = EINA_TRUE;
1910
1911    screenshot->bufmgr = wayland_tbm_client_get_bufmgr(_eflutil.wl.shot.tbm_client);
1912    EINA_SAFETY_ON_NULL_GOTO(screenshot->bufmgr, fail_get_bufmgr);
1913
1914    g_screenshot = screenshot;
1915    set_last_result(EFL_UTIL_ERROR_NONE);
1916
1917    tizen_screenshooter_set_user_data(_eflutil.wl.shot.tz_screenshooter, &screenshot->shot_done);
1918
1919    _screenshot_mutex_unlock();
1920
1921    return g_screenshot;
1922
1923 /* LCOV_EXCL_START */
1924 fail_get_bufmgr:
1925    set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1926    _screenshot_mutex_unlock();
1927    efl_util_screenshot_deinitialize(screenshot);
1928
1929    return NULL;
1930 /* LCOV_EXCL_STOP */
1931 }
1932
1933 API int
1934 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
1935 {
1936    _screenshot_mutex_lock();
1937
1938    if (!screenshot)
1939      {
1940         _screenshot_mutex_unlock();
1941         _screenshot_mutex_destory();
1942         return EFL_UTIL_ERROR_INVALID_PARAMETER;
1943      }
1944
1945    free(screenshot);
1946    g_screenshot = NULL;
1947
1948    _efl_util_wl_screenshooter_deinit();
1949
1950    _screenshot_mutex_unlock();
1951    _screenshot_mutex_destory();
1952
1953    return EFL_UTIL_ERROR_NONE;
1954 }
1955
1956
1957 API tbm_surface_h
1958 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
1959 {
1960    tbm_surface_h t_surface = NULL;
1961    struct wl_buffer *buffer = NULL;
1962    Efl_Util_Wl_Output_Info *output;
1963    int ret = 0;
1964
1965    _screenshot_mutex_lock();
1966
1967    if (!screenshot || (screenshot != g_screenshot))
1968      {
1969         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1970         _screenshot_mutex_unlock();
1971         return NULL;
1972      }
1973
1974    output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
1975    if (!output)
1976      {
1977         fprintf(stderr, "[screenshot] fail: no output for screenshot\n"); /* LCOV_EXCL_LINE */
1978         goto fail;
1979      }
1980
1981    t_surface = tbm_surface_create(screenshot->width, screenshot->height, TBM_FORMAT_XRGB8888);
1982    if (!t_surface)
1983      {
1984         fprintf(stderr, "[screenshot] fail: tbm_surface_create\n"); /* LCOV_EXCL_LINE */
1985         goto fail;
1986      }
1987
1988    buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, t_surface);
1989    if (!buffer)
1990      {
1991         fprintf(stderr, "[screenshot] fail: create wl_buffer for screenshot\n"); /* LCOV_EXCL_LINE */
1992         goto fail;
1993      }
1994
1995    tizen_screenshooter_shoot(_eflutil.wl.shot.tz_screenshooter, output->output, buffer);
1996
1997    screenshot->shot_done = EINA_FALSE;
1998
1999    while (!screenshot->shot_done && ret != -1)
2000      ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2001
2002    if (ret == -1)
2003      {
2004         fprintf(stderr, "[screenshot] fail: tizen_screenshooter_shoot\n"); /* LCOV_EXCL_LINE */
2005         goto fail;
2006      }
2007
2008    wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2009
2010    /* reset shot_done for next screenshot */
2011    screenshot->shot_done = EINA_FALSE;
2012
2013    set_last_result(EFL_UTIL_ERROR_NONE);
2014
2015    _screenshot_mutex_unlock();
2016
2017    return t_surface;
2018
2019 fail:
2020    if (t_surface)
2021      tbm_surface_destroy(t_surface);
2022    if (buffer)
2023      wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2024
2025    set_last_result(EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL);
2026
2027    _screenshot_mutex_unlock();
2028
2029    return NULL;
2030 }
2031
2032 API int
2033 efl_util_screenshot_set_auto_rotation(efl_util_screenshot_h screenshot, int set)
2034 {
2035    if (!screenshot || (screenshot != g_screenshot))
2036      return EFL_UTIL_ERROR_INVALID_PARAMETER;
2037
2038    if (!(set == 0 || set == 1))
2039      return EFL_UTIL_ERROR_INVALID_PARAMETER;
2040
2041    if (set)
2042      g_screenshot->auto_rotation = EINA_TRUE;
2043    else
2044      g_screenshot->auto_rotation = EINA_FALSE;
2045
2046    tizen_screenshooter_set_oneshot_auto_rotation(_eflutil.wl.shot.tz_screenshooter, g_screenshot->auto_rotation);
2047
2048    return EFL_UTIL_ERROR_NONE;
2049 }
2050
2051 API int
2052 efl_util_screenshot_get_auto_rotation(efl_util_screenshot_h screenshot, int *set)
2053 {
2054    if (!screenshot || (screenshot != g_screenshot) || !set)
2055      return EFL_UTIL_ERROR_INVALID_PARAMETER;
2056
2057    *set = g_screenshot->auto_rotation;
2058
2059    return EFL_UTIL_ERROR_NONE;
2060 }
2061
2062 /* LCOV_EXCL_START */
2063 struct _efl_util_screenmirror_h
2064 {
2065    struct tizen_screenmirror *tz_screenmirror;
2066    pthread_t thread;
2067    int width;
2068    int height;
2069
2070    tbm_bufmgr bufmgr;
2071    Eina_List *buffer_list;
2072
2073    Eina_Bool mirror_working;
2074    Eina_Bool cb_start;
2075    Eina_Bool cb_stop;
2076    Eina_Bool cb_content;
2077    efl_util_screenmirror_handler user_func;
2078    void *user_data;
2079 };
2080
2081 typedef struct _efl_util_mirror_buffer efl_util_mirror_buffer;
2082 struct _efl_util_mirror_buffer
2083 {
2084    struct wl_buffer *buffer;
2085    int w, h;
2086    tbm_surface_h t_surface;
2087 };
2088
2089 static efl_util_screenmirror_h g_screenmirror;
2090
2091 static void *
2092 _efl_util_screenmirror_loop(void *data)
2093 {
2094    efl_util_screenmirror_h screenmirror;
2095    int ret = 0;
2096
2097    screenmirror = (efl_util_screenmirror_h)data;
2098
2099    while (1)
2100      {
2101         if (!screenmirror->mirror_working)
2102           break;
2103
2104         ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2105         if (ret == -1)
2106           {
2107              fprintf(stderr, "[screenmirror] fail: dispatch_queue\n");
2108              break;
2109           }
2110      }
2111
2112    return NULL;
2113 }
2114
2115 static efl_util_mirror_buffer *
2116 _efl_util_create_mirror_buffer(efl_util_screenmirror_h screenmirror)
2117 {
2118    efl_util_mirror_buffer *mbuffer;
2119
2120    mbuffer = calloc(1, sizeof(struct _efl_util_mirror_buffer));
2121    EINA_SAFETY_ON_NULL_RETURN_VAL(mbuffer, NULL);
2122
2123    mbuffer->w = screenmirror->width;
2124    mbuffer->h = screenmirror->height;
2125
2126    mbuffer->t_surface = tbm_surface_internal_create_with_flags(mbuffer->w,
2127                          mbuffer->h, TBM_FORMAT_ARGB8888, TBM_BO_SCANOUT);
2128    EINA_SAFETY_ON_NULL_GOTO(mbuffer->t_surface, fail_create_surface);
2129
2130    mbuffer->buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, mbuffer->t_surface);
2131    EINA_SAFETY_ON_NULL_GOTO(mbuffer->buffer, fail_create_buffer);
2132
2133    return mbuffer;
2134
2135 fail_create_buffer:
2136    tbm_surface_destroy(mbuffer->t_surface);
2137 fail_create_surface:
2138    free(mbuffer);
2139
2140    return NULL;
2141 }
2142
2143 static void
2144 _efl_util_destroy_mirror_buffer(efl_util_mirror_buffer *mbuffer)
2145 {
2146    EINA_SAFETY_ON_NULL_RETURN(mbuffer);
2147
2148    if (mbuffer->buffer)
2149      wl_buffer_destroy(mbuffer->buffer);
2150
2151    free(mbuffer);
2152 }
2153
2154 static void
2155 _efl_util_screenmirror_handle_dequeued(void *data,
2156                                        struct tizen_screenmirror *tz_screenmirror, struct wl_buffer *buffer)
2157 {
2158    efl_util_screenmirror_h screenmirror;
2159    efl_util_mirror_buffer *mbuffer;
2160    Eina_List *l, *ll;
2161
2162    screenmirror = (efl_util_screenmirror_h)data;
2163    screenmirror->cb_start = EINA_TRUE;
2164
2165    EINA_LIST_FOREACH_SAFE(screenmirror->buffer_list, l, ll, mbuffer)
2166      {
2167         if (mbuffer->buffer == buffer)
2168           {
2169              if (mbuffer->w != screenmirror->width || mbuffer->h != screenmirror->height ||
2170                  !screenmirror->mirror_working)
2171                tbm_surface_destroy(mbuffer->t_surface);
2172              else
2173                screenmirror->user_func(screenmirror, mbuffer->t_surface, screenmirror->user_data);
2174
2175              screenmirror->buffer_list = eina_list_remove_list(screenmirror->buffer_list, l);
2176              _efl_util_destroy_mirror_buffer(mbuffer);
2177
2178              break;
2179           }
2180      }
2181
2182    mbuffer = _efl_util_create_mirror_buffer(screenmirror);
2183    if (mbuffer == NULL)
2184      {
2185         fprintf(stderr, "[screenmirror] fail: buffer create\n");
2186         return;
2187      }
2188    screenmirror->buffer_list = eina_list_append(screenmirror->buffer_list, mbuffer);
2189    tizen_screenmirror_queue(screenmirror->tz_screenmirror, mbuffer->buffer);
2190 }
2191
2192 static void
2193 _efl_util_screenmirror_handle_content(void *data,
2194                                       struct tizen_screenmirror *tz_screenmirror, uint32_t content)
2195 {
2196    efl_util_screenmirror_h screenmirror = NULL;
2197
2198    screenmirror = (efl_util_screenmirror_h)data;
2199    screenmirror->cb_content = EINA_TRUE;
2200 }
2201
2202 static void
2203 _efl_util_screenmirror_handle_stop(void *data, struct tizen_screenmirror *tz_screenmirror)
2204 {
2205    efl_util_screenmirror_h screenmirror = NULL;
2206
2207    screenmirror = (efl_util_screenmirror_h)data;
2208    screenmirror->cb_stop = EINA_TRUE;
2209 }
2210
2211 static const struct tizen_screenmirror_listener efl_util_screenmirror_listener = {
2212    _efl_util_screenmirror_handle_dequeued,
2213    _efl_util_screenmirror_handle_content,
2214    _efl_util_screenmirror_handle_stop
2215 };
2216
2217 API efl_util_screenmirror_h
2218 efl_util_screenmirror_initialize(int width, int height)
2219 {
2220    efl_util_screenmirror_h screenmirror = NULL;
2221    efl_util_mirror_buffer *mbuffer;
2222    Efl_Util_Wl_Output_Info *output;
2223    int ret = 0, i;
2224
2225    if (width <= 0 || height <= 0)
2226      {
2227         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2228         return NULL;
2229      }
2230
2231    _screenshot_mutex_lock();
2232
2233    if (g_screenmirror)
2234      {
2235         if (g_screenmirror->mirror_working)
2236           {
2237              set_last_result(EFL_UTIL_ERROR_INVALID_OPERATION);
2238              _screenshot_mutex_unlock();
2239              return NULL;
2240           }
2241         else
2242           {
2243              g_screenmirror->width = width;
2244              g_screenmirror->height = height;
2245              set_last_result(EFL_UTIL_ERROR_NONE);
2246              _screenshot_mutex_unlock();
2247              return g_screenmirror;
2248           }
2249      }
2250
2251    screenmirror = calloc(1, sizeof(struct _efl_util_screenmirror_h));
2252    if (screenmirror == NULL)
2253      {
2254         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
2255         _screenshot_mutex_unlock();
2256         return NULL;
2257      }
2258
2259    if (!_eflutil.wl.shot.tz_screenshooter)
2260      {
2261         if (_efl_util_wl_screenshooter_init() == EINA_FALSE)
2262           {
2263              if (_eflutil.wl.shot.noti == 0)
2264                set_last_result(EFL_UTIL_ERROR_PERMISSION_DENIED);
2265              else
2266                set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
2267
2268              goto fail_wl_init;
2269           }
2270      }
2271
2272    output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
2273    if (!output)
2274      {
2275         set_last_result(EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE);
2276         fprintf(stderr, "[screenmirror] fail: no output for screenmirror\n");
2277         goto fail_get_output;
2278      }
2279
2280    screenmirror->tz_screenmirror = tizen_screenshooter_get_screenmirror(_eflutil.wl.shot.tz_screenshooter, output->output);
2281    wl_proxy_set_queue((struct wl_proxy *)screenmirror->tz_screenmirror, _eflutil.wl.shot.queue);
2282    tizen_screenmirror_add_listener(screenmirror->tz_screenmirror, &efl_util_screenmirror_listener, screenmirror);
2283    tizen_screenmirror_set_stretch(screenmirror->tz_screenmirror, TIZEN_SCREENMIRROR_STRETCH_KEEP_RATIO);
2284    screenmirror->width = width;
2285    screenmirror->height = height;
2286
2287    g_screenmirror = screenmirror;
2288
2289    for (i = 0; i < 1; i++)
2290      {
2291         mbuffer = _efl_util_create_mirror_buffer(screenmirror);
2292         if (mbuffer)
2293           {
2294               screenmirror->buffer_list = eina_list_append(screenmirror->buffer_list, mbuffer);
2295               tizen_screenmirror_queue(screenmirror->tz_screenmirror, mbuffer->buffer);
2296           }
2297         else
2298           fprintf(stderr, "[screenmirror] fail: buffer create %d\n", i);
2299      }
2300    while (!screenmirror->cb_content && ret != -1)
2301      ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2302
2303    _screenshot_mutex_unlock();
2304
2305    return screenmirror;
2306
2307 fail_get_output:
2308 fail_wl_init:
2309    free(screenmirror);
2310    _screenshot_mutex_unlock();
2311    return NULL;
2312 }
2313
2314 API int
2315 efl_util_screenmirror_deinitialize(efl_util_screenmirror_h screenmirror)
2316 {
2317    efl_util_mirror_buffer *mbuffer;
2318    Eina_List *l;
2319
2320    _screenshot_mutex_lock();
2321
2322    if (!screenmirror || (screenmirror != g_screenmirror))
2323      {
2324         _screenshot_mutex_unlock();
2325         _screenshot_mutex_destory();
2326         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2327      }
2328
2329    if (screenmirror->mirror_working)
2330      {
2331         fprintf(stderr, "[screenmirror] fail: execute stop before deinit\n");
2332         _screenshot_mutex_unlock();
2333         _screenshot_mutex_destory();
2334         return EFL_UTIL_ERROR_INVALID_OPERATION;
2335      }
2336
2337    EINA_LIST_FOREACH(screenmirror->buffer_list, l, mbuffer)
2338      {
2339         tbm_surface_destroy(mbuffer->t_surface);
2340         _efl_util_destroy_mirror_buffer(mbuffer);
2341      }
2342    eina_list_free(screenmirror->buffer_list);
2343
2344    tizen_screenmirror_destroy(screenmirror->tz_screenmirror);
2345    free(screenmirror);
2346    g_screenmirror = NULL;
2347
2348    _efl_util_wl_screenshooter_deinit();
2349
2350    _screenshot_mutex_unlock();
2351    _screenshot_mutex_destory();
2352
2353    return EFL_UTIL_ERROR_NONE;
2354 }
2355
2356 API int
2357 efl_util_screenmirror_set_handler(efl_util_screenmirror_h screenmirror,
2358                                   efl_util_screenmirror_handler func, void *data)
2359 {
2360    _screenshot_mutex_lock();
2361
2362    if (!screenmirror || (screenmirror != g_screenmirror) || !func)
2363      {
2364         _screenshot_mutex_unlock();
2365         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2366      }
2367    screenmirror->user_func = func;
2368    screenmirror->user_data = data;
2369
2370    _screenshot_mutex_unlock();
2371
2372    return EFL_UTIL_ERROR_NONE;
2373 }
2374
2375 API int
2376 efl_util_screenmirror_start(efl_util_screenmirror_h screenmirror)
2377 {
2378    int ret = 0;
2379
2380    _screenshot_mutex_lock();
2381
2382    if (!screenmirror || (screenmirror != g_screenmirror))
2383      {
2384         _screenshot_mutex_unlock();
2385         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2386      }
2387    else if (!screenmirror->user_func)
2388      {
2389         _screenshot_mutex_unlock();
2390         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2391      }
2392    else if (screenmirror->mirror_working)
2393      {
2394         _screenshot_mutex_unlock();
2395         return EFL_UTIL_ERROR_NONE;
2396      }
2397
2398    screenmirror->cb_start = EINA_FALSE;
2399    screenmirror->mirror_working = EINA_TRUE;
2400    tizen_screenmirror_start(screenmirror->tz_screenmirror);
2401    while (!screenmirror->cb_start && ret != -1)
2402      ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2403    if (ret == -1)
2404      {
2405         fprintf(stderr, "[screenmirror] fail: tizen_screenmirror_start\n");
2406         _screenshot_mutex_unlock();
2407         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2408      }
2409
2410    ret = pthread_create(&screenmirror->thread, NULL, _efl_util_screenmirror_loop, screenmirror);
2411    if (ret < 0)
2412      {
2413         fprintf(stderr, "[screenmirror] fail: thread create fail\n");
2414         _screenshot_mutex_unlock();
2415         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2416      }
2417
2418    pthread_setname_np(screenmirror->thread, "e_util_mirror");
2419
2420    _screenshot_mutex_unlock();
2421
2422    return EFL_UTIL_ERROR_NONE;
2423 }
2424
2425 API int
2426 efl_util_screenmirror_stop(efl_util_screenmirror_h screenmirror)
2427 {
2428    int ret = 0;
2429
2430    _screenshot_mutex_lock();
2431
2432    if (!screenmirror || (screenmirror != g_screenmirror))
2433      {
2434         _screenshot_mutex_unlock();
2435         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2436      }
2437    else if (!screenmirror->mirror_working)
2438      {
2439         _screenshot_mutex_unlock();
2440         return EFL_UTIL_ERROR_NONE;
2441      }
2442    screenmirror->mirror_working = EINA_FALSE;
2443    pthread_join(screenmirror->thread, NULL);
2444    tizen_screenmirror_stop(screenmirror->tz_screenmirror);
2445    screenmirror->cb_stop = EINA_FALSE;
2446
2447    while (!screenmirror->cb_stop && ret != -1)
2448      ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2449    if (ret == -1)
2450      {
2451         fprintf(stderr, "[screenmirror] fail: tizen_screenmirror_stop\n");
2452         _screenshot_mutex_unlock();
2453         return EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL;
2454      }
2455
2456    _screenshot_mutex_unlock();
2457
2458    return EFL_UTIL_ERROR_NONE;
2459 }
2460 /* LCOV_EXCL_STOP */
2461
2462 struct _efl_util_gesture_h
2463 {
2464    Eina_Bool init;
2465 };
2466
2467 API int EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2468 API int EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2469 API int EFL_UTIL_EVENT_GESTURE_TAP = 0;
2470 API int EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2471
2472 /* LCOV_EXCL_START */
2473 static void
2474 _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)
2475 {
2476    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2477 }
2478
2479 static void
2480 _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)
2481 {
2482    efl_util_event_gesture_edge_swipe_s *ev = NULL;
2483
2484    ev = (efl_util_event_gesture_edge_swipe_s *)calloc(1, sizeof(*ev));
2485    if (!ev) return;
2486
2487    ev->mode = mode;
2488
2489    ev->fingers = fingers;
2490    ev->sx = sx;
2491    ev->sy = sy;
2492    ev->edge = edge;
2493
2494    ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE, ev, NULL, NULL);
2495 }
2496
2497 static void
2498 _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)
2499 {
2500    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2501 }
2502
2503 static void
2504 _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)
2505 {
2506    efl_util_event_gesture_edge_drag_s *ev = NULL;
2507
2508    ev = (efl_util_event_gesture_edge_drag_s *)calloc(1, sizeof(*ev));
2509    if (!ev) return;
2510
2511    ev->mode = mode;
2512
2513    ev->fingers = fingers;
2514    ev->cx = cx;
2515    ev->cy = cy;
2516    ev->edge = edge;
2517
2518    ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_DRAG, ev, NULL, NULL);
2519 }
2520
2521 static void
2522 _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)
2523 {
2524    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2525 }
2526
2527 static void
2528 _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats)
2529 {
2530    efl_util_event_gesture_tap_s *ev = NULL;
2531
2532    ev = (efl_util_event_gesture_tap_s *)calloc(1, sizeof(*ev));
2533    if (!ev) return;
2534
2535    ev->mode = mode;
2536
2537    ev->fingers = fingers;
2538    ev->repeats = repeats;
2539
2540    ecore_event_add(EFL_UTIL_EVENT_GESTURE_TAP, ev, NULL, NULL);
2541 }
2542 /* LCOV_EXCL_STOP */
2543
2544 static void
2545 _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)
2546 {
2547    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2548 }
2549
2550 /* LCOV_EXCL_START */
2551 static void
2552 _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)
2553 {
2554    efl_util_event_gesture_palm_cover_s *ev = NULL;
2555
2556    ev = (efl_util_event_gesture_palm_cover_s *)calloc(1, sizeof(*ev));
2557    if (!ev) return;
2558
2559    ev->mode = mode;
2560
2561    ev->duration = duration;
2562    ev->cx = cx;
2563    ev->cy = cy;
2564    ev->size = size;
2565    ev->pressure = wl_fixed_to_int(pressure);
2566
2567    ecore_event_add(EFL_UTIL_EVENT_GESTURE_PALM_COVER, ev, NULL, NULL);
2568 }
2569 /* LCOV_EXCL_STOP */
2570
2571 static void
2572 _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)
2573 {
2574    _eflutil_defaultqueue.wl.gesture.request_notified = error;
2575 }
2576
2577 static efl_util_error_e
2578 _efl_util_gesture_convert_error(int ret)
2579 {
2580    switch (ret)
2581      {
2582         case TIZEN_GESTURE_ERROR_NONE:
2583            return EFL_UTIL_ERROR_NONE;
2584         case TIZEN_GESTURE_ERROR_INVALID_DATA:
2585            return EFL_UTIL_ERROR_INVALID_PARAMETER;
2586         case TIZEN_GESTURE_ERROR_NO_PERMISSION:
2587            return EFL_UTIL_ERROR_PERMISSION_DENIED;
2588         case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
2589            return EFL_UTIL_ERROR_OUT_OF_MEMORY;
2590         case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
2591            return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
2592         case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
2593            return EFL_UTIL_ERROR_NOT_SUPPORTED;
2594         default :
2595            return EFL_UTIL_ERROR_NONE;
2596      }
2597 }
2598
2599 /* LCOV_EXCL_START */
2600 static efl_util_error_e
2601 _efl_util_gesture_verify_request_notified()
2602 {
2603    int ret = EFL_UTIL_ERROR_NONE;
2604
2605    while (_eflutil_defaultqueue.wl.gesture.request_notified == -1)
2606      wl_display_dispatch(_eflutil_defaultqueue.wl.dpy);
2607
2608    ret = _efl_util_gesture_convert_error(_eflutil_defaultqueue.wl.gesture.request_notified);
2609    _eflutil_defaultqueue.wl.gesture.request_notified = -1;
2610
2611    return ret;
2612 }
2613
2614 static int
2615 _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed)
2616 {
2617    int ret = EFL_UTIL_ERROR_NONE;
2618    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2619    Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2620    unsigned int fingers = 0;
2621    unsigned int edge = 0;
2622    unsigned int edge_size = 0;
2623    unsigned int start_point = 0;
2624    unsigned int end_point = 0;
2625
2626    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2627
2628    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2629    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2630    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2631                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2632
2633    edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2634
2635    fingers = edge_swipe_data->fingers;
2636    edge = edge_swipe_data->edge;
2637    edge_size = edge_swipe_data->edge_size;
2638    start_point = edge_swipe_data->start_point;
2639    end_point = edge_swipe_data->end_point;
2640
2641    if (grabbed)
2642       tizen_gesture_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2643    else
2644       tizen_gesture_ungrab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2645
2646    ret = _efl_util_gesture_verify_request_notified();
2647
2648    return ret;
2649 }
2650
2651 static int
2652 _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed)
2653 {
2654    int ret = EFL_UTIL_ERROR_NONE;
2655    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2656    Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2657    unsigned int fingers = 0;
2658    unsigned int edge = 0;
2659    unsigned int edge_size = 0;
2660    unsigned int start_point = 0;
2661    unsigned int end_point = 0;
2662
2663    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2664
2665    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2666    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2667    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2668                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2669
2670    edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2671
2672    fingers = edge_drag_data->fingers;
2673    edge = edge_drag_data->edge;
2674    edge_size = edge_drag_data->edge_size;
2675    start_point = edge_drag_data->start_point;
2676    end_point = edge_drag_data->end_point;
2677
2678    if (grabbed)
2679       tizen_gesture_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2680    else
2681       tizen_gesture_ungrab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2682
2683    ret = _efl_util_gesture_verify_request_notified();
2684
2685    return ret;
2686 }
2687
2688 static int
2689 _efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed)
2690 {
2691    int ret = EFL_UTIL_ERROR_NONE;
2692    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2693    Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2694    unsigned int fingers = 0;
2695    unsigned int repeats = 0;
2696
2697    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2698
2699    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2700    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2701    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2702                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2703
2704    tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2705
2706    fingers = tap_data->fingers;
2707    repeats = tap_data->repeats;
2708
2709    if (grabbed)
2710       tizen_gesture_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2711    else
2712       tizen_gesture_ungrab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
2713
2714    ret = _efl_util_gesture_verify_request_notified();
2715
2716    return ret;
2717 }
2718
2719 static int
2720 _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data, Eina_Bool grabbed)
2721 {
2722    int ret = EFL_UTIL_ERROR_NONE;
2723    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2724
2725    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2726
2727    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil_defaultqueue.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2728    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2729    EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2730                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
2731
2732    if (grabbed)
2733       tizen_gesture_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2734    else
2735       tizen_gesture_ungrab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
2736
2737    ret = _efl_util_gesture_verify_request_notified();
2738
2739    return ret;
2740 }
2741 /* LCOV_EXCL_STOP */
2742
2743 API efl_util_gesture_h
2744 efl_util_gesture_initialize(void)
2745 {
2746    efl_util_gesture_h gesture_h = NULL;
2747
2748    gesture_h = (efl_util_gesture_h)calloc(1, sizeof(struct _efl_util_gesture_h));
2749    if (!gesture_h)
2750      {
2751         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2752         goto out; /* LCOV_EXCL_LINE */
2753      }
2754
2755    if (_wl_init_default_queue() == (int)EINA_FALSE)
2756      {
2757         set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2758         goto out; /* LCOV_EXCL_LINE */
2759      }
2760
2761    while (!_eflutil_defaultqueue.wl.gesture.proto)
2762      wl_display_dispatch(_eflutil_defaultqueue.wl.dpy); /* LCOV_EXCL_LINE */
2763
2764    if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2765      {
2766         if (ecore_event_init() <= 0)
2767           {
2768              set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2769              goto out; /* LCOV_EXCL_LINE */
2770           }
2771         EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = ecore_event_type_new();
2772         EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = ecore_event_type_new();
2773         EFL_UTIL_EVENT_GESTURE_TAP = ecore_event_type_new();
2774         EFL_UTIL_EVENT_GESTURE_PALM_COVER = ecore_event_type_new();
2775      }
2776    _eflutil_defaultqueue.wl.gesture.event_init++;
2777    gesture_h->init = EINA_TRUE;
2778
2779    set_last_result(EFL_UTIL_ERROR_NONE);
2780    return gesture_h;
2781
2782 out:
2783 /* LCOV_EXCL_START */
2784    if (gesture_h)
2785      {
2786         free(gesture_h);
2787         gesture_h = NULL;
2788      }
2789    return gesture_h;
2790 /* LCOV_EXCL_STOP */
2791 }
2792
2793 API int
2794 efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
2795 {
2796    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2797    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2798
2799    free(gesture_h);
2800    gesture_h = NULL;
2801
2802    _eflutil_defaultqueue.wl.gesture.event_init--;
2803
2804    if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
2805      {
2806         _eflutil_defaultqueue.wl.gesture.event_init = 0;
2807         ecore_event_shutdown();
2808         EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2809         EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2810         EFL_UTIL_EVENT_GESTURE_TAP = 0;
2811         EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2812      }
2813
2814    return EFL_UTIL_ERROR_NONE;
2815 }
2816
2817 API efl_util_gesture_data
2818 efl_util_gesture_edge_swipe_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2819 {
2820    Efl_Util_Gesture_Edge_Swipe_Grab_Data *data;
2821
2822    if (!gesture_h || gesture_h->init == EINA_FALSE)
2823      {
2824         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2825         return NULL;
2826      }
2827
2828    if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2829      {
2830         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2831         return NULL;
2832      }
2833
2834    data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Swipe_Grab_Data));
2835    if (!data)
2836      {
2837         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2838         return NULL; /* LCOV_EXCL_LINE */
2839      }
2840
2841    data->base.type = TIZEN_GESTURE_TYPE_EDGE_SWIPE;
2842    data->fingers = fingers;
2843    data->edge = edge;
2844    data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2845
2846    set_last_result(EFL_UTIL_ERROR_NONE);
2847
2848    return (void *)data;
2849 }
2850
2851 API int
2852 efl_util_gesture_edge_swipe_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2853 {
2854    if (!gesture_h || gesture_h->init == EINA_FALSE)
2855      {
2856         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2857      }
2858
2859    if (!data)
2860      {
2861         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2862      }
2863
2864    free(data);
2865    data = NULL;
2866
2867    return EFL_UTIL_ERROR_NONE;
2868 }
2869
2870 API int
2871 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)
2872 {
2873    Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = data;
2874
2875    EINA_SAFETY_ON_NULL_RETURN_VAL(edge_swipe_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2876    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_swipe_data->base.type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2877                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2878    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2879                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2880    EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2881
2882    edge_swipe_data->edge_size = edge_size;
2883    edge_swipe_data->start_point = start_point;
2884    edge_swipe_data->end_point = end_point;
2885
2886    return EFL_UTIL_ERROR_NONE;
2887 }
2888
2889 API efl_util_gesture_data
2890 efl_util_gesture_edge_drag_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2891 {
2892    Efl_Util_Gesture_Edge_Drag_Grab_Data *data;
2893
2894    if (!gesture_h || gesture_h->init == EINA_FALSE)
2895      {
2896         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2897         return NULL;
2898      }
2899
2900    if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2901      {
2902         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2903         return NULL;
2904      }
2905
2906    data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Drag_Grab_Data));
2907    if (!data)
2908      {
2909         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2910         return NULL; /* LCOV_EXCL_LINE */
2911      }
2912
2913    data->base.type = TIZEN_GESTURE_TYPE_EDGE_DRAG;
2914    data->fingers = fingers;
2915    data->edge = edge;
2916    data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2917
2918    set_last_result(EFL_UTIL_ERROR_NONE);
2919
2920    return (void *)data;
2921 }
2922
2923 API int
2924 efl_util_gesture_edge_drag_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2925 {
2926    if (!gesture_h || gesture_h->init == EINA_FALSE)
2927      {
2928         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2929      }
2930
2931    if (!data)
2932      {
2933         return EFL_UTIL_ERROR_INVALID_PARAMETER;
2934      }
2935
2936    free(data);
2937    data = NULL;
2938
2939    return EFL_UTIL_ERROR_NONE;
2940 }
2941
2942 API int
2943 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)
2944 {
2945    Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = data;
2946
2947    EINA_SAFETY_ON_NULL_RETURN_VAL(edge_drag_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2948    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_drag_data->base.type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2949                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2950    EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2951                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
2952    EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2953
2954    edge_drag_data->edge_size = edge_size;
2955    edge_drag_data->start_point = start_point;
2956    edge_drag_data->end_point = end_point;
2957
2958    return EFL_UTIL_ERROR_NONE;
2959 }
2960
2961 API efl_util_gesture_data
2962 efl_util_gesture_tap_new(efl_util_gesture_h gesture_h, unsigned int fingers, unsigned int repeats)
2963 {
2964    Efl_Util_Gesture_Tap_Grab_Data *data;
2965
2966    if (!gesture_h || gesture_h->init == EINA_FALSE)
2967      {
2968         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2969         return NULL;
2970      }
2971
2972    if (fingers <= 1 || repeats <= 1)
2973      {
2974         set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED);
2975         return NULL;
2976      }
2977
2978    data = (Efl_Util_Gesture_Tap_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Tap_Grab_Data));
2979    if (!data)
2980      {
2981         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2982         return NULL; /* LCOV_EXCL_LINE */
2983      }
2984
2985    data->base.type = TIZEN_GESTURE_TYPE_TAP;
2986    data->fingers = fingers;
2987    data->repeats = repeats;
2988
2989    set_last_result(EFL_UTIL_ERROR_NONE);
2990
2991    return (void *)data;
2992 }
2993
2994 API int
2995 efl_util_gesture_tap_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2996 {
2997    if (!gesture_h || gesture_h->init == EINA_FALSE)
2998      {
2999         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3000      }
3001
3002    if (!data)
3003      {
3004         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3005      }
3006
3007    free(data);
3008    data = NULL;
3009
3010    return EFL_UTIL_ERROR_NONE;
3011 }
3012
3013 API efl_util_gesture_data
3014 efl_util_gesture_palm_cover_new(efl_util_gesture_h gesture_h)
3015 {
3016    Efl_Util_Gesture_Palm_Cover_Grab_Data *data;
3017
3018    if (!gesture_h || gesture_h->init == EINA_FALSE)
3019      {
3020         set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
3021         return NULL;
3022      }
3023
3024    data = (Efl_Util_Gesture_Palm_Cover_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Palm_Cover_Grab_Data));
3025    if (!data)
3026      {
3027         set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
3028         return NULL; /* LCOV_EXCL_LINE */
3029      }
3030
3031    data->base.type = TIZEN_GESTURE_TYPE_PALM_COVER;
3032
3033    set_last_result(EFL_UTIL_ERROR_NONE);
3034
3035    return (void *)data;
3036 }
3037
3038 API int
3039 efl_util_gesture_palm_cover_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3040 {
3041    if (!gesture_h || gesture_h->init == EINA_FALSE)
3042      {
3043         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3044      }
3045
3046    if (!data)
3047      {
3048         return EFL_UTIL_ERROR_INVALID_PARAMETER;
3049      }
3050
3051    free(data);
3052    data = NULL;
3053
3054    return EFL_UTIL_ERROR_NONE;
3055 }
3056
3057 /* LCOV_EXCL_START */
3058 API int
3059 efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3060 {
3061    int ret = EFL_UTIL_ERROR_NONE;
3062    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3063
3064    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3065
3066    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3067    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3068    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3069
3070    switch (base_data->type)
3071      {
3072         case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3073            ret = _efl_util_gesture_grab_edge_swipe(data, EINA_TRUE);
3074            break;
3075         case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3076            ret = _efl_util_gesture_grab_edge_drag(data, EINA_TRUE);
3077            break;
3078         case TIZEN_GESTURE_TYPE_TAP:
3079            ret = _efl_util_gesture_grab_tap(data, EINA_TRUE);
3080            break;
3081         case TIZEN_GESTURE_TYPE_PALM_COVER:
3082            ret = _efl_util_gesture_grab_palm_cover(data, EINA_TRUE);
3083            break;
3084         default:
3085            return EFL_UTIL_ERROR_INVALID_PARAMETER;
3086      }
3087
3088    return ret;
3089 }
3090
3091 API int
3092 efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
3093 {
3094    int ret = EFL_UTIL_ERROR_NONE;
3095    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3096
3097    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3098
3099    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3100    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3101    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3102
3103    switch (base_data->type)
3104      {
3105         case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
3106            ret = _efl_util_gesture_grab_edge_swipe(data, EINA_FALSE);
3107            break;
3108         case TIZEN_GESTURE_TYPE_EDGE_DRAG:
3109            ret = _efl_util_gesture_grab_edge_drag(data, EINA_FALSE);
3110            break;
3111         case TIZEN_GESTURE_TYPE_TAP:
3112            ret = _efl_util_gesture_grab_tap(data, EINA_FALSE);
3113            break;
3114         case TIZEN_GESTURE_TYPE_PALM_COVER:
3115            ret = _efl_util_gesture_grab_palm_cover(data, EINA_FALSE);
3116            break;
3117         default:
3118            return EFL_UTIL_ERROR_INVALID_PARAMETER;
3119      }
3120
3121    return ret;
3122 }
3123 /* LCOV_EXCL_STOP */
3124
3125 API int
3126 efl_util_gesture_select(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3127 {
3128    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3129    Ecore_Wl2_Window *wlwin;
3130    struct wl_surface *surface;
3131    int ret;
3132
3133    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3134
3135    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3136    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3137    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3138    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3139
3140    if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3141      return EFL_UTIL_ERROR_NOT_SUPPORTED;
3142
3143    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3144    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3145
3146    surface = ecore_wl2_window_surface_get(wlwin);
3147    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3148                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
3149
3150    tizen_gesture_select_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3151
3152    ret = _efl_util_gesture_verify_request_notified();
3153
3154    return ret;
3155 }
3156
3157 API int
3158 efl_util_gesture_deselect(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
3159 {
3160    Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
3161    Ecore_Wl2_Window *wlwin;
3162    struct wl_surface *surface;
3163    int ret;
3164
3165    base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
3166
3167    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3168    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3169    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3170    EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
3171
3172    if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
3173      return EFL_UTIL_ERROR_NOT_SUPPORTED;
3174
3175    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3176    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3177
3178    surface = ecore_wl2_window_surface_get(wlwin);
3179    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3180                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
3181
3182    tizen_gesture_deselect_palm_cover(_eflutil_defaultqueue.wl.gesture.proto, surface);
3183
3184    ret = _efl_util_gesture_verify_request_notified();
3185
3186    return ret;
3187 }
3188
3189 /* LCOV_EXCL_START */
3190 API int
3191 efl_util_gesture_activate_set(efl_util_gesture_h gesture_h, unsigned int type, Eina_Bool active)
3192 {
3193    int ret;
3194
3195    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3196    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3197    EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3198
3199    tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, NULL, type, active);
3200
3201    ret = _efl_util_gesture_verify_request_notified();
3202
3203    return ret;
3204 }
3205 /* LCOV_EXCL_STOP */
3206
3207 API int
3208 efl_util_gesture_activate_set_on_window(efl_util_gesture_h gesture_h, Evas_Object *window, unsigned int type, Eina_Bool active)
3209 {
3210    Ecore_Wl2_Window *wlwin;
3211    struct wl_surface *surface;
3212    int ret;
3213
3214    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
3215    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
3216    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
3217    EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
3218
3219    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
3220    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
3221
3222    surface = ecore_wl2_window_surface_get(wlwin);
3223    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3224                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
3225
3226    tizen_gesture_activate_set(_eflutil_defaultqueue.wl.gesture.proto, surface, type, active);
3227
3228    ret = _efl_util_gesture_verify_request_notified();
3229
3230    return ret;
3231 }