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