2 * Copyright (c) 2011-2017 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #define LOG_TAG "TIZEN_N_EFL_UTIL"
24 #include <sys/types.h>
28 #include <tbm_bufmgr.h>
29 #include <tbm_surface.h>
30 #include <tbm_surface_internal.h>
31 #include <Elementary.h>
32 #include <Ecore_Evas.h>
35 #include <Ecore_Wl2.h>
36 #include <wayland-client.h>
37 #include <wayland-tbm-client.h>
38 #include <tizen-extension-client-protocol.h>
39 #include <screenshooter-client-protocol.h>
41 #include <efl_util_screenshot_extension.h>
48 /* Determine Tizen profile at runtime */
49 #include <system_info.h>
51 TIZEN_PROFILE_UNKNOWN = 0,
52 TIZEN_PROFILE_MOBILE = 0x1,
53 TIZEN_PROFILE_WEARABLE = 0x2,
54 TIZEN_PROFILE_TV = 0x4,
55 TIZEN_PROFILE_IVI = 0x8,
56 TIZEN_PROFILE_COMMON = 0x10,
58 static tizen_profile_t profile = TIZEN_PROFILE_UNKNOWN;
59 static tizen_profile_t _get_tizen_profile()
62 system_info_get_platform_string("http://tizen.org/feature/profile", &profileName);
63 switch (*profileName) {
66 profile = TIZEN_PROFILE_MOBILE;
70 profile = TIZEN_PROFILE_WEARABLE;
74 profile = TIZEN_PROFILE_TV;
78 profile = TIZEN_PROFILE_IVI;
80 default: // common or unknown ==> ALL ARE COMMON.
81 profile = TIZEN_PROFILE_COMMON;
87 static inline tizen_profile_t get_tizen_profile()
89 if (__builtin_expect(profile != TIZEN_PROFILE_UNKNOWN, 1))
91 return _get_tizen_profile();
95 #define LOG_TAG "TIZEN_N_EFL_UTIL"
96 #define EFL_UTIL_INPUT_GENERATOR_DEFAULT_TIME_OUT 1000
97 #define EFL_UTIL_INPUT_GENERATOR_DEFAULT_DISPATCH_TIME_OUT 10
99 typedef struct _Efl_Util_Wl_Surface_Lv_Info
101 void *surface; /* wl_surface */
103 Eina_Bool wait_for_done;
105 } Efl_Util_Wl_Surface_Lv_Info;
107 typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
109 void *surface; /* wl_surface */
111 Eina_Bool wait_for_done;
113 } Efl_Util_Wl_Surface_Scr_Mode_Info;
115 typedef struct _Efl_Util_Wl_Surface_Brightness_Info
117 void *surface; /* wl_surface */
119 Eina_Bool wait_for_done;
121 } Efl_Util_Wl_Surface_Brightness_Info;
123 typedef struct _Efl_Util_Wl_Output_Info
125 struct wl_output *output;
126 int offset_x, offset_y, width, height;
127 } Efl_Util_Wl_Output_Info;
129 typedef struct _Efl_Util_Gesture_Common_Grab_Data
132 } Efl_Util_Gesture_Common_Grab_Data;
134 typedef struct _Efl_Util_Gesture_Edge_Swipe_Grab_Data
136 Efl_Util_Gesture_Common_Grab_Data base;
138 unsigned int fingers;
139 efl_util_gesture_edge_e edge;
140 efl_util_gesture_edge_size_e edge_size;
141 unsigned int start_point;
142 unsigned int end_point;
143 } Efl_Util_Gesture_Edge_Swipe_Grab_Data;
145 typedef struct _Efl_Util_Gesture_Edge_Drag_Grab_Data
147 Efl_Util_Gesture_Common_Grab_Data base;
149 unsigned int fingers;
150 efl_util_gesture_edge_e edge;
151 efl_util_gesture_edge_size_e edge_size;
152 unsigned int start_point;
153 unsigned int end_point;
154 } Efl_Util_Gesture_Edge_Drag_Grab_Data;
156 typedef struct _Efl_Util_Gesture_Tap_Grab_Data
158 Efl_Util_Gesture_Common_Grab_Data base;
160 unsigned int fingers;
161 unsigned int repeats;
162 } Efl_Util_Gesture_Tap_Grab_Data;
164 typedef struct _Efl_Util_Gesture_Palm_Cover_Grab_Data
166 Efl_Util_Gesture_Common_Grab_Data base;
167 } Efl_Util_Gesture_Palm_Cover_Grab_Data;
169 typedef struct _Efl_Util_Device_Info
171 struct tizen_input_device *device;
172 Ecore_Device_Class clas;
173 Eina_Stringshare *name;
174 } Efl_Util_Device_Info;
176 typedef struct _Efl_Util_Data
178 /* wayland related stuffs */
182 Ecore_Wl2_Display *wl2_display;
183 struct wl_display *dpy;
184 struct wl_event_queue *queue;
186 Ecore_Fd_Handler *fd_hdl;
191 struct tizen_policy *proto;
192 Eina_Hash *hash_noti_lv;
193 Eina_Hash *hash_scr_mode;
197 struct wl_event_queue *queue;
198 struct screenshooter *screenshooter;
199 struct tizen_screenshooter *tz_screenshooter;
200 struct wayland_tbm_client *tbm_client;
201 Eina_List *output_list;
206 struct tizen_input_device_manager *devicemgr;
207 int request_notified;
209 Eina_List *wait_devices;
210 struct wl_event_source *wait_timer;
215 struct tizen_display_policy *proto;
216 Eina_Hash *hash_brightness;
220 struct tizen_gesture *proto;
221 int request_notified;
227 static Efl_Util_Data _eflutil =
233 { 0, NULL, NULL, NULL }, /* tizen_policy protocol */
234 { NULL, NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
235 { NULL, -1 }, /* tizen_input_device_manager protocol */
236 { 0, NULL, NULL }, /* display_policy protocol */
237 { NULL, -1, EINA_FALSE } /* tizen_gesture protocol */
241 static Eina_Bool _wl_init(void);
242 static void _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
243 static void _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
244 static void _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
245 static void _cb_wl_reg_screenshooter_global_remove(void *data, struct wl_registry *reg, unsigned int name);
246 static void _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t is_conformant);
247 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);
248 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);
249 static void _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id);
250 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);
251 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);
252 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);
253 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id);
254 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);
255 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);
257 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);
259 static void _cb_device_info(void *data, struct tizen_input_device *tizen_input_device EINA_UNUSED, const char *name, uint32_t clas, uint32_t subclas EINA_UNUSED, struct wl_array *axes EINA_UNUSED);
260 static void _cb_event_device(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, unsigned int serial EINA_UNUSED, const char *name EINA_UNUSED, uint32_t time EINA_UNUSED);
261 static void _cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED);
263 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);
264 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);
265 static void _cb_error(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED, uint32_t errorcode);
266 static void _cb_block_expired(void *data EINA_UNUSED, struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED);
268 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);
269 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);
270 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);
271 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);
272 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);
273 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);
274 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);
275 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);
276 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);
279 static const struct wl_registry_listener _wl_reg_listener =
282 _cb_wl_reg_global_remove
285 static const struct wl_registry_listener _wl_reg_screenshooter_listener =
287 _cb_wl_reg_screenshooter_global,
288 _cb_wl_reg_screenshooter_global_remove
291 struct tizen_policy_listener _wl_tz_policy_listener =
293 _cb_wl_tz_policy_conformant,
294 _cb_wl_tz_policy_conformant_area,
295 _cb_wl_tz_policy_notification_done,
296 _cb_wl_tz_policy_transient_for_done,
297 _cb_wl_tz_policy_scr_mode_done,
298 _cb_wl_tz_policy_iconify_state_changed,
299 _cb_wl_tz_policy_supported_aux_hints,
300 _cb_wl_tz_policy_allowed_aux_hint,
301 _cb_wl_tz_policy_aux_message,
302 _cb_wl_conformant_region,
305 static const struct tizen_input_device_listener _wl_tz_input_device_listener =
312 struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
320 struct tizen_display_policy_listener _wl_tz_display_policy_listener =
322 _cb_wl_tz_display_policy_brightness_done,
325 struct tizen_gesture_listener _wl_tz_gesture_listener =
327 _cb_gesture_edge_swipe_notify,
328 _cb_gesture_edge_swipe,
329 _cb_gesture_edge_drag_notify,
330 _cb_gesture_edge_drag,
331 _cb_gesture_tap_notify,
333 _cb_gesture_palm_cover_notify,
334 _cb_gesture_palm_cover,
335 _cb_gesture_activate_notify
341 struct wl_display *display_wrapper = NULL;
342 struct wl_registry *reg = NULL;
344 if (_eflutil.wl.init) return EINA_TRUE;
348 _eflutil.wl.wl2_display = ecore_wl2_display_connect(NULL);
349 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.wl2_display, fail);
350 _eflutil.wl.dpy = ecore_wl2_display_get(_eflutil.wl.wl2_display);
351 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.dpy, fail);
353 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
354 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
356 _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy);
357 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail);
359 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.queue);
361 reg = wl_display_get_registry(display_wrapper);
362 wl_proxy_wrapper_destroy(display_wrapper);
363 display_wrapper = NULL;
364 EINA_SAFETY_ON_NULL_GOTO(reg, fail);
366 wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
368 _eflutil.wl.init = EINA_TRUE;
373 wl_proxy_wrapper_destroy(display_wrapper);
375 if (_eflutil.wl.queue)
377 wl_event_queue_destroy(_eflutil.wl.queue);
378 _eflutil.wl.queue = NULL;
381 ecore_wl2_shutdown();
386 _cb_wl_output_geometry(void *data, struct wl_output *wl_output, int x, int y,
387 int physical_width, int physical_height, int subpixel,
388 const char *make, const char *model, int transform)
390 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
391 if (wl_output == output->output)
393 output->offset_x = x;
394 output->offset_y = y;
399 _cb_wl_output_mode(void *data, struct wl_output *wl_output, uint32_t flags,
400 int width, int height, int refresh)
402 Efl_Util_Wl_Output_Info *output = wl_output_get_user_data(wl_output);
403 if (wl_output == output->output && (flags & WL_OUTPUT_MODE_CURRENT))
405 output->width = width;
406 output->height = height;
411 _cb_wl_output_done(void *data, struct wl_output *wl_output)
416 _cb_wl_output_scale(void *data, struct wl_output *wl_output, int32_t factor)
420 static const struct wl_output_listener output_listener =
422 _cb_wl_output_geometry,
429 _cb_wl_screenshot_done(void *data, struct screenshooter *screenshooter)
431 Eina_Bool *shot_done = (Eina_Bool*)data;
433 *shot_done = EINA_TRUE;
436 static const struct screenshooter_listener screenshooter_listener =
438 _cb_wl_screenshot_done
442 _cb_tz_screenshot_format(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t format)
447 _cb_tz_screenshot_noti(void *data, struct tizen_screenshooter *tz_screenshooter, uint32_t noti)
449 _eflutil.wl.shot.noti = noti;
452 static const struct tizen_screenshooter_listener tz_screenshooter_listener =
454 _cb_tz_screenshot_format,
455 _cb_tz_screenshot_noti
459 _cb_wl_reg_global(void *data,
460 struct wl_registry *reg,
462 const char *interface,
463 unsigned int version)
465 if (!strcmp(interface, "tizen_policy"))
467 struct tizen_policy *proto;
468 proto = wl_registry_bind(reg,
470 &tizen_policy_interface,
474 tizen_policy_add_listener(proto,
475 &_wl_tz_policy_listener,
478 _eflutil.wl.policy.hash_noti_lv = eina_hash_pointer_new(free);
479 _eflutil.wl.policy.hash_scr_mode = eina_hash_pointer_new(free);
480 _eflutil.wl.policy.proto = proto;
481 _eflutil.wl.policy.id = id;
483 else if (strcmp(interface, "wl_output") == 0)
485 Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info));
486 EINA_SAFETY_ON_NULL_RETURN(output);
488 _eflutil.wl.shot.output_list = eina_list_append(_eflutil.wl.shot.output_list, output);
490 output->output = wl_registry_bind(reg, id, &wl_output_interface, version);
491 wl_output_add_listener(output->output, &output_listener, output);
493 else if (strcmp(interface, "tizen_input_device_manager") == 0)
495 _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
496 tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
498 else if (!strcmp(interface, "tizen_display_policy"))
500 _eflutil.wl.display_policy.proto = wl_registry_bind(reg, id, &tizen_display_policy_interface, version);
501 if (!_eflutil.wl.display_policy.proto) return;
503 tizen_display_policy_add_listener(_eflutil.wl.display_policy.proto,
504 &_wl_tz_display_policy_listener,
507 _eflutil.wl.display_policy.hash_brightness = eina_hash_pointer_new(free);
508 _eflutil.wl.display_policy.id = id;
510 else if (strcmp(interface, "tizen_gesture") == 0)
512 _eflutil.wl.gesture.proto = wl_registry_bind(reg, id, &tizen_gesture_interface, version);
513 tizen_gesture_add_listener(_eflutil.wl.gesture.proto, &_wl_tz_gesture_listener, NULL);
516 /* LCOV_EXCL_START */
518 _cb_wl_reg_global_remove(void *data,
519 struct wl_registry *reg,
522 /* unset each global id number to 0 since global id is started
523 * from number 1 on server side display structure
525 if (id == _eflutil.wl.policy.id)
527 _eflutil.wl.policy.id = 0;
528 _eflutil.wl.policy.proto = NULL;
529 eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
530 eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
532 else if (id == _eflutil.wl.display_policy.id)
534 _eflutil.wl.display_policy.id = 0;
535 _eflutil.wl.display_policy.proto = NULL;
536 eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
542 _cb_wl_reg_screenshooter_global(void *data,
543 struct wl_registry *reg,
545 const char *interface,
546 unsigned int version)
548 if (strcmp(interface, "screenshooter") == 0)
550 _eflutil.wl.shot.screenshooter = wl_registry_bind(reg, name, &screenshooter_interface, version);
551 screenshooter_add_listener(_eflutil.wl.shot.screenshooter, &screenshooter_listener, NULL);
553 else if (strcmp(interface, "tizen_screenshooter") == 0)
555 _eflutil.wl.shot.tz_screenshooter = wl_registry_bind(reg, name, &tizen_screenshooter_interface, version);
556 tizen_screenshooter_add_listener(_eflutil.wl.shot.tz_screenshooter, &tz_screenshooter_listener, NULL);
558 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
562 /* LCOV_EXCL_START */
564 _cb_wl_reg_screenshooter_global_remove(void *data,
565 struct wl_registry *reg,
571 _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy,
572 struct wl_surface *surface, uint32_t is_conformant)
577 _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy,
578 struct wl_surface *surface, uint32_t conformant_part,
579 uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h)
585 _cb_wl_tz_policy_notification_done(void *data,
586 struct tizen_policy *tizen_policy,
587 struct wl_surface *surface,
591 Efl_Util_Wl_Surface_Lv_Info *lv_info;
593 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
596 lv_info->level = level;
597 lv_info->wait_for_done = EINA_FALSE;
598 lv_info->state = state;
602 /* LCOV_EXCL_START */
604 _cb_wl_tz_policy_transient_for_done(void *data, struct tizen_policy *tizen_policy, uint32_t child_id)
610 _cb_wl_tz_policy_scr_mode_done(void *data,
611 struct tizen_policy *tizen_policy,
612 struct wl_surface *surface,
616 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
618 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
621 scr_mode_info->mode = mode;
622 scr_mode_info->wait_for_done = EINA_FALSE;
623 scr_mode_info->state = state;
627 /* LCOV_EXCL_START */
628 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)
632 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)
636 static void _cb_wl_tz_policy_allowed_aux_hint(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id)
640 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)
643 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)
649 _cb_wl_tz_display_policy_brightness_done(void *data,
650 struct tizen_display_policy *tizen_display_policy,
651 struct wl_surface *surface,
655 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
657 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
660 brightness_info->brightness = brightness;
661 brightness_info->wait_for_done = EINA_FALSE;
662 brightness_info->state = state;
667 _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
669 Efl_Util_Wl_Surface_Lv_Info *lv_info;
672 if (EINA_UNLIKELY(!lv_info))
675 eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info);
679 efl_util_set_notification_window_level(Evas_Object *window,
680 efl_util_notification_level_e level)
684 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
685 EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) &&
686 (level <= EFL_UTIL_NOTIFICATION_LEVEL_TOP),
687 EFL_UTIL_ERROR_INVALID_PARAMETER);
690 Ecore_Wl2_Window *wlwin;
691 struct wl_surface *surface;
692 Efl_Util_Wl_Surface_Lv_Info *lv_info;
693 Ecore_Wl2_Window_Type wl_type;
696 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
698 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
699 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
701 type = elm_win_type_get(window);
702 if (type != ELM_WIN_NOTIFICATION)
704 wl_type = ecore_wl2_window_type_get(wlwin);
705 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
706 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
709 while (!_eflutil.wl.policy.proto)
710 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
712 surface = ecore_wl2_window_surface_get(wlwin);
713 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
714 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
716 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
719 lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
720 EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
722 lv_info->surface = surface;
723 lv_info->level = (int)level;
724 lv_info->wait_for_done = EINA_TRUE;
725 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
726 eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
730 evas_object_event_callback_add(window, EVAS_CALLBACK_DEL,
731 _cb_window_del, lv_info);
735 lv_info->level = (int)level;
736 lv_info->wait_for_done = EINA_TRUE;
737 lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
741 tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
742 surface, (int)level);
744 if (lv_info->wait_for_done)
747 while (lv_info->wait_for_done && (count < 3))
749 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
750 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
754 if (lv_info->wait_for_done)
756 return EFL_UTIL_ERROR_INVALID_PARAMETER;
760 if (lv_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
762 return EFL_UTIL_ERROR_PERMISSION_DENIED;
767 return EFL_UTIL_ERROR_NONE;
771 efl_util_get_notification_window_level(Evas_Object *window,
772 efl_util_notification_level_e *level)
776 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
777 EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
780 Ecore_Wl2_Window *wlwin;
781 struct wl_surface *surface;
782 Efl_Util_Wl_Surface_Lv_Info *lv_info;
783 Ecore_Wl2_Window_Type wl_type;
786 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
788 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
789 EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
791 type = elm_win_type_get(window);
792 if (type != ELM_WIN_NOTIFICATION)
794 wl_type = ecore_wl2_window_type_get(wlwin);
795 EINA_SAFETY_ON_FALSE_RETURN_VAL((wl_type == ECORE_WL2_WINDOW_TYPE_NOTIFICATION),
796 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
799 while (!_eflutil.wl.policy.proto)
800 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
802 surface = ecore_wl2_window_surface_get(wlwin);
803 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
804 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
806 lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
809 if (lv_info->wait_for_done)
812 while ((lv_info->wait_for_done) && (count < 3))
814 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
815 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
819 if (lv_info->wait_for_done)
821 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
822 return EFL_UTIL_ERROR_INVALID_PARAMETER;
826 switch (lv_info->level)
828 case TIZEN_POLICY_LEVEL_NONE: *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE; break;
829 case TIZEN_POLICY_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
830 case TIZEN_POLICY_LEVEL_MEDIUM: *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM; break;
831 case TIZEN_POLICY_LEVEL_HIGH: *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH; break;
832 case TIZEN_POLICY_LEVEL_TOP: *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP; break;
833 default: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
834 return EFL_UTIL_ERROR_INVALID_PARAMETER;
836 return EFL_UTIL_ERROR_NONE;
839 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
841 return EFL_UTIL_ERROR_NONE;
845 efl_util_set_window_opaque_state(Evas_Object *window,
850 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
851 EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
852 EFL_UTIL_ERROR_INVALID_PARAMETER);
854 Ecore_Wl2_Window *wlwin;
855 struct wl_surface *surface;
857 if (!_eflutil.wl.policy.proto)
862 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
864 while (!_eflutil.wl.policy.proto && ret != -1)
865 ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
867 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
870 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
872 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
874 surface = ecore_wl2_window_surface_get(wlwin);
876 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
878 tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
880 return EFL_UTIL_ERROR_NONE;
884 efl_util_set_window_screen_mode(Evas_Object *window,
885 efl_util_screen_mode_e mode)
887 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
888 EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
889 (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
890 EFL_UTIL_ERROR_INVALID_PARAMETER);
892 Ecore_Wl2_Window *wlwin;
893 struct wl_surface *surface;
894 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
898 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
900 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
903 while (!_eflutil.wl.policy.proto)
904 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
906 surface = ecore_wl2_window_surface_get(wlwin);
907 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
908 EFL_UTIL_ERROR_INVALID_PARAMETER);
910 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
913 scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
914 EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
916 scr_mode_info->surface = surface;
917 scr_mode_info->mode = (unsigned int)mode;
918 scr_mode_info->wait_for_done = EINA_TRUE;
919 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
921 eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
927 scr_mode_info->mode = (unsigned int)mode;
928 scr_mode_info->wait_for_done = EINA_TRUE;
929 scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
932 tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
933 surface, (unsigned int)mode);
934 if (scr_mode_info->wait_for_done)
937 while (scr_mode_info->wait_for_done && (count < 3))
939 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
940 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
944 if (scr_mode_info->wait_for_done)
946 return EFL_UTIL_ERROR_INVALID_PARAMETER;
950 if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
952 return EFL_UTIL_ERROR_PERMISSION_DENIED;
957 return EFL_UTIL_ERROR_NONE;
960 return EFL_UTIL_ERROR_INVALID_PARAMETER;
964 efl_util_get_window_screen_mode(Evas_Object *window,
965 efl_util_screen_mode_e *mode)
967 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
968 EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
970 Ecore_Wl2_Window *wlwin;
971 struct wl_surface *surface;
972 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
976 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
978 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
981 while (!_eflutil.wl.policy.proto)
982 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
984 surface = ecore_wl2_window_surface_get(wlwin);
985 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
986 EFL_UTIL_ERROR_INVALID_PARAMETER);
988 scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
991 if (scr_mode_info->wait_for_done)
993 while (scr_mode_info->wait_for_done)
995 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
996 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1000 switch (scr_mode_info->mode)
1002 case TIZEN_POLICY_MODE_DEFAULT: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; break;
1003 case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
1004 default: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1005 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1007 return EFL_UTIL_ERROR_NONE;
1011 *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
1012 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1016 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1020 efl_util_set_window_brightness(Evas_Object *window, int brightness)
1022 Ecore_Wl2_Window *wlwin;
1023 struct wl_surface *surface;
1024 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1027 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1028 EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
1031 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1033 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1036 while (!_eflutil.wl.display_policy.proto)
1037 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1039 surface = ecore_wl2_window_surface_get(wlwin);
1040 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1041 EFL_UTIL_ERROR_INVALID_PARAMETER);
1043 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1044 if (!brightness_info)
1046 brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
1047 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
1049 brightness_info->surface = surface;
1050 brightness_info->brightness = brightness;
1051 brightness_info->wait_for_done = EINA_TRUE;
1052 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1054 eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
1060 brightness_info->brightness = brightness;
1061 brightness_info->wait_for_done = EINA_TRUE;
1062 brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
1065 tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
1066 surface, brightness);
1067 if (brightness_info->wait_for_done)
1070 while (brightness_info->wait_for_done && (count < 3))
1072 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1073 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1077 if (brightness_info->wait_for_done)
1079 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1083 if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
1085 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1089 return EFL_UTIL_ERROR_NONE;
1092 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1096 efl_util_get_window_brightness(Evas_Object *window, int *brightness)
1098 Ecore_Wl2_Window *wlwin;
1099 struct wl_surface *surface;
1100 Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
1103 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
1104 EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
1107 EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
1109 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
1110 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
1112 while (!_eflutil.wl.display_policy.proto)
1113 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1115 surface = ecore_wl2_window_surface_get(wlwin);
1116 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
1117 EFL_UTIL_ERROR_INVALID_PARAMETER);
1119 brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
1120 if (brightness_info)
1122 if (brightness_info->wait_for_done)
1124 while (brightness_info->wait_for_done)
1126 ecore_wl2_display_flush(_eflutil.wl.wl2_display);
1127 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1130 *brightness = brightness_info->brightness;
1135 return EFL_UTIL_ERROR_NONE;
1139 struct _efl_util_inputgen_h
1141 unsigned int init_type;
1146 _efl_util_input_check_wait_device_full(void)
1148 Eina_List *l, *ll, *l_next;
1149 Efl_Util_Device_Info *dev, *wait_dev;
1152 wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
1153 if (wait_cnt <= 0) return EINA_TRUE;
1155 EINA_LIST_FOREACH(_eflutil.wl.devmgr.devices, l, dev)
1157 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, ll, l_next, wait_dev)
1159 if ((dev->clas == wait_dev->clas) &&
1160 (!strncmp(dev->name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
1162 eina_stringshare_del(wait_dev->name);
1163 _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, ll);
1167 if (wait_cnt <= 0) return EINA_TRUE;
1178 _efl_util_input_check_wait_device(const char *name, unsigned int type)
1180 Eina_List *l, *l_next;
1181 Efl_Util_Device_Info *wait_dev;
1184 wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
1185 if (wait_cnt <= 0) return EINA_TRUE;
1187 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, l, l_next, wait_dev)
1189 if ((type == wait_dev->clas) &&
1190 (!strncmp(name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
1192 eina_stringshare_del(wait_dev->name);
1193 _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, l);
1197 if (wait_cnt <= 0) return EINA_TRUE;
1207 _cb_device_info(void *data, struct tizen_input_device *tizen_input_device EINA_UNUSED, const char *name, uint32_t clas, uint32_t subclas EINA_UNUSED, struct wl_array *axes EINA_UNUSED)
1209 Efl_Util_Device_Info *dev;
1211 if (!(dev = data)) return;
1212 dev->clas = (Ecore_Device_Class)clas;
1213 dev->name = eina_stringshare_add(name);
1215 if (_eflutil.wl.devmgr.wait_timer &&
1216 _efl_util_input_check_wait_device(name, clas))
1218 wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
1219 _eflutil.wl.devmgr.wait_timer = NULL;
1223 /* LCOV_EXCL_START */
1225 _cb_event_device(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, unsigned int serial EINA_UNUSED, const char *name EINA_UNUSED, uint32_t time EINA_UNUSED)
1231 _cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED)
1235 /* LCOV_EXCL_STOP */
1238 _cb_device_add(void *data EINA_UNUSED,
1239 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1240 uint32_t serial EINA_UNUSED,
1241 const char *identifier EINA_UNUSED,
1242 struct tizen_input_device *device,
1243 struct wl_seat *seat EINA_UNUSED)
1245 Efl_Util_Device_Info *dev;
1247 EINA_SAFETY_ON_NULL_RETURN(device);
1249 dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
1250 EINA_SAFETY_ON_NULL_RETURN(dev);
1252 dev->device = device;
1253 tizen_input_device_add_listener(device, &_wl_tz_input_device_listener, dev);
1255 _eflutil.wl.devmgr.devices = eina_list_append(_eflutil.wl.devmgr.devices, dev);
1259 _cb_device_remove(void *data EINA_UNUSED,
1260 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1261 uint32_t serial EINA_UNUSED,
1262 const char *identifier EINA_UNUSED,
1263 struct tizen_input_device *device,
1264 struct wl_seat *seat EINA_UNUSED)
1266 Eina_List *l, *l_next;
1267 Efl_Util_Device_Info *dev;
1269 EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.devices, l, l_next, dev)
1271 if (dev->device == device)
1273 if (dev->name) eina_stringshare_del(dev->name);
1274 tizen_input_device_release(dev->device);
1276 _eflutil.wl.devmgr.devices = eina_list_remove_list(_eflutil.wl.devmgr.devices, l);
1285 _cb_error(void *data EINA_UNUSED,
1286 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
1289 _eflutil.wl.devmgr.request_notified = errorcode;
1292 /* LCOV_EXCL_START */
1294 _cb_block_expired(void *data EINA_UNUSED,
1295 struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
1299 /* LCOV_EXCL_STOP */
1301 static efl_util_error_e
1302 _efl_util_input_convert_input_generator_error(int ret)
1306 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
1307 return EFL_UTIL_ERROR_NONE;
1308 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
1309 return EFL_UTIL_ERROR_PERMISSION_DENIED;
1310 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
1311 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
1312 case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
1313 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1315 return EFL_UTIL_ERROR_NONE;
1319 /* LCOV_EXCL_START */
1321 _timer_wait(void *data)
1323 Efl_Util_Device_Info *dev;
1325 _eflutil.wl.devmgr.request_notified = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES;
1327 if (eina_list_count(_eflutil.wl.devmgr.wait_devices) > 0)
1329 EINA_LIST_FREE(_eflutil.wl.devmgr.wait_devices, dev)
1331 eina_stringshare_del(dev->name);
1336 wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
1337 _eflutil.wl.devmgr.wait_timer = NULL;
1341 /* LCOV_EXCL_STOP */
1344 _efl_util_input_initialize_wait_device(void)
1346 struct wl_event_loop *loop;
1349 if (_efl_util_input_check_wait_device_full()) return;
1351 loop = wl_event_loop_create();
1352 _eflutil.wl.devmgr.wait_timer = wl_event_loop_add_timer(loop, _timer_wait, NULL);
1353 if (_eflutil.wl.devmgr.wait_timer)
1355 ret = wl_event_source_timer_update(_eflutil.wl.devmgr.wait_timer,
1356 EFL_UTIL_INPUT_GENERATOR_DEFAULT_TIME_OUT);
1357 if (ret != 0) _timer_wait(NULL);
1361 while (_eflutil.wl.devmgr.wait_timer)
1363 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1364 ret = wl_event_loop_dispatch(loop, EFL_UTIL_INPUT_GENERATOR_DEFAULT_DISPATCH_TIME_OUT);
1365 if (ret != 0) _timer_wait(NULL);
1370 _efl_util_input_initialize_append_device(const char *name, Ecore_Device_Class clas)
1372 Efl_Util_Device_Info *dev;
1374 dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
1375 EINA_SAFETY_ON_NULL_RETURN(dev);
1377 dev->name = eina_stringshare_add(name);
1380 _eflutil.wl.devmgr.wait_devices = eina_list_append(_eflutil.wl.devmgr.wait_devices, dev);
1384 _efl_util_input_initialize_add_wait_device(const char *name, unsigned int dev_type)
1386 EINA_SAFETY_ON_NULL_RETURN(name);
1388 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1389 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_TOUCH);
1391 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1392 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_KEYBOARD);
1394 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1395 _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_MOUSE);
1398 API efl_util_inputgen_h
1399 efl_util_input_initialize_generator(unsigned int dev_type)
1401 int ret = EFL_UTIL_ERROR_NONE;
1402 efl_util_inputgen_h inputgen_h = NULL;
1403 unsigned int clas = 0x0;
1406 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1407 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1408 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1410 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1414 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1417 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1421 inputgen_h->init_type |= dev_type;
1424 if (ret == (int)EINA_FALSE)
1426 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1430 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1431 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1432 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1433 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1434 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1435 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1437 while (!_eflutil.wl.devmgr.devicemgr)
1438 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1440 tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
1442 while (_eflutil.wl.devmgr.request_notified == -1)
1443 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1445 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1446 _eflutil.wl.devmgr.request_notified = -1;
1448 set_last_result(ret);
1449 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1463 API efl_util_inputgen_h
1464 efl_util_input_initialize_generator_with_name(unsigned int dev_type, const char *name)
1466 int ret = EFL_UTIL_ERROR_NONE;
1467 efl_util_inputgen_h inputgen_h = NULL;
1468 unsigned int clas = 0x0;
1471 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1472 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1473 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1475 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1479 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1482 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1486 inputgen_h->init_type |= dev_type;
1487 strncpy(inputgen_h->name, name, 31);
1490 if (ret == (int)EINA_FALSE)
1492 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1496 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1497 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1498 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1499 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1500 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1501 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1503 while (!_eflutil.wl.devmgr.devicemgr)
1504 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1506 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1508 while (_eflutil.wl.devmgr.request_notified == -1)
1509 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1511 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1512 _eflutil.wl.devmgr.request_notified = -1;
1514 set_last_result(ret);
1515 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1529 API efl_util_inputgen_h
1530 efl_util_input_initialize_generator_with_sync(unsigned int dev_type, const char *name)
1532 int ret = EFL_UTIL_ERROR_NONE;
1533 efl_util_inputgen_h inputgen_h = NULL;
1534 unsigned int clas = 0x0;
1537 dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
1538 | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
1539 | EFL_UTIL_INPUT_DEVTYPE_POINTER))
1541 set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1545 inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
1548 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1552 inputgen_h->init_type |= dev_type;
1553 if (name) strncpy(inputgen_h->name, name, 31);
1554 else strncpy(inputgen_h->name, "Input Generator", 31);
1557 if (ret == (int)EINA_FALSE)
1559 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1563 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1564 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1565 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1566 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1567 if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1568 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1570 while (!_eflutil.wl.devmgr.devicemgr)
1571 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1573 tizen_input_device_manager_init_generator_with_name(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
1575 while (_eflutil.wl.devmgr.request_notified == -1)
1576 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1578 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1579 _eflutil.wl.devmgr.request_notified = -1;
1581 if (ret == EFL_UTIL_ERROR_NONE)
1583 _efl_util_input_initialize_add_wait_device(inputgen_h->name, dev_type);
1584 _efl_util_input_initialize_wait_device();
1585 if (_eflutil.wl.devmgr.request_notified != -1)
1587 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1588 _eflutil.wl.devmgr.request_notified = -1;
1592 set_last_result(ret);
1593 if (ret != TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
1608 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
1610 int ret = EFL_UTIL_ERROR_NONE;
1611 unsigned int clas = 0x0;
1612 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1614 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
1615 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
1616 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
1617 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
1618 if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
1619 clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
1624 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1626 tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
1628 while (_eflutil.wl.devmgr.request_notified == -1)
1629 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1631 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1632 _eflutil.wl.devmgr.request_notified = -1;
1638 efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name, int pressed)
1640 int ret = EFL_UTIL_ERROR_NONE;
1642 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1643 EINA_SAFETY_ON_NULL_RETURN_VAL(key_name, EFL_UTIL_ERROR_INVALID_PARAMETER);
1644 EINA_SAFETY_ON_FALSE_RETURN_VAL(pressed == 0 || pressed == 1, EFL_UTIL_ERROR_INVALID_PARAMETER);
1645 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1647 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1649 tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
1651 while (_eflutil.wl.devmgr.request_notified == -1)
1652 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1654 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1655 _eflutil.wl.devmgr.request_notified = -1;
1661 efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
1662 efl_util_input_touch_type_e touch_type, int x, int y)
1665 enum tizen_input_device_manager_pointer_event_type type;
1667 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1668 EINA_SAFETY_ON_FALSE_RETURN_VAL(idx >= 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1669 EINA_SAFETY_ON_FALSE_RETURN_VAL((x > 0 && y > 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1670 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1672 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1676 case EFL_UTIL_INPUT_TOUCH_BEGIN:
1677 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1679 case EFL_UTIL_INPUT_TOUCH_UPDATE:
1680 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1682 case EFL_UTIL_INPUT_TOUCH_END:
1683 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1686 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1689 tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
1691 while (_eflutil.wl.devmgr.request_notified == -1)
1692 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1694 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1695 _eflutil.wl.devmgr.request_notified = -1;
1701 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)
1704 enum tizen_input_device_manager_pointer_event_type type;
1706 EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
1707 EINA_SAFETY_ON_FALSE_RETURN_VAL(buttons > 0, EFL_UTIL_ERROR_INVALID_PARAMETER);
1708 EINA_SAFETY_ON_FALSE_RETURN_VAL((x >= 0 && y >= 0), EFL_UTIL_ERROR_INVALID_PARAMETER);
1709 EINA_SAFETY_ON_FALSE_RETURN_VAL(inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER, EFL_UTIL_ERROR_NO_SUCH_DEVICE);
1711 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
1713 switch(pointer_type)
1715 case EFL_UTIL_INPUT_POINTER_BUTTON_DOWN:
1716 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_BEGIN;
1718 case EFL_UTIL_INPUT_POINTER_MOVE:
1719 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_UPDATE;
1721 case EFL_UTIL_INPUT_POINTER_BUTTON_UP:
1722 type = TIZEN_INPUT_DEVICE_MANAGER_POINTER_EVENT_TYPE_END;
1725 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1728 tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
1730 while (_eflutil.wl.devmgr.request_notified == -1)
1731 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1733 ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
1734 _eflutil.wl.devmgr.request_notified = -1;
1740 struct _efl_util_screenshot_h
1745 Eina_Bool shot_done;
1750 Eina_Bool auto_rotation;
1753 /* scrrenshot handle */
1754 static efl_util_screenshot_h g_screenshot;
1755 static Eina_Bool shot_mutex_init;
1756 static pthread_mutex_t shot_lock;
1759 _screenshot_mutex_init(void)
1761 if (shot_mutex_init)
1764 if (pthread_mutex_init(&shot_lock, NULL))
1766 fprintf(stderr, "[screenshot] fail: mutex init"); /*LCOV_EXCL_LINE*/
1767 return EINA_FALSE; /*LCOV_EXCL_LINE*/
1770 shot_mutex_init = EINA_TRUE;
1776 _screenshot_mutex_destory(void)
1778 if (!shot_mutex_init)
1781 if (pthread_mutex_destroy(&shot_lock))
1783 fprintf(stderr, "[screenshot] fail: mutex destory"); /*LCOV_EXCL_LINE*/
1784 return EINA_FALSE; /*LCOV_EXCL_LINE*/
1787 shot_mutex_init = EINA_FALSE;
1793 _screenshot_mutex_lock(void)
1795 if (!_screenshot_mutex_init())
1798 pthread_mutex_lock(&shot_lock);
1802 _screenshot_mutex_unlock(void)
1804 pthread_mutex_unlock(&shot_lock);
1807 API efl_util_screenshot_h
1808 efl_util_screenshot_initialize(int width, int height)
1810 efl_util_screenshot_h screenshot = NULL;
1811 struct wl_display *display_wrapper = NULL;
1812 struct wl_registry *reg = NULL;
1815 if (width <= 0 || height <= 0)
1817 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1821 _screenshot_mutex_lock();
1825 screenshot = calloc(1, sizeof(struct _efl_util_screenshot_h));
1826 EINA_SAFETY_ON_NULL_GOTO(screenshot, fail_memory);
1829 if (!_eflutil.wl.shot.screenshooter)
1832 if (ret == (int)EINA_FALSE)
1834 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1835 _screenshot_mutex_unlock();
1838 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
1840 display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
1841 EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail_memory);
1843 _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
1844 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_memory);
1846 wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
1848 reg = wl_display_get_registry(display_wrapper);
1849 wl_proxy_wrapper_destroy(display_wrapper);
1850 display_wrapper = NULL;
1851 EINA_SAFETY_ON_NULL_GOTO(reg, fail_init);
1853 wl_registry_add_listener(reg, &_wl_reg_screenshooter_listener, NULL);
1855 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
1856 EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_init);
1857 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.screenshooter, fail_init);
1858 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tz_screenshooter, fail_init);
1860 _eflutil.wl.shot.tbm_client = wayland_tbm_client_init(_eflutil.wl.dpy);
1861 EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.tbm_client, fail_init);
1863 wl_registry_destroy(reg);
1867 if (_eflutil.wl.shot.noti == 0)
1869 fprintf(stderr, "[screenshot] fail: privilege error\n"); /* LCOV_EXCL_LINE */
1875 if (g_screenshot->width != width || g_screenshot->height != height)
1877 g_screenshot->width = width;
1878 g_screenshot->height = height;
1880 set_last_result(EFL_UTIL_ERROR_NONE);
1882 _screenshot_mutex_unlock();
1884 return g_screenshot;
1887 screenshot->width = width;
1888 screenshot->height = height;
1889 screenshot->auto_rotation = EINA_TRUE;
1891 screenshot->bufmgr = wayland_tbm_client_get_bufmgr(_eflutil.wl.shot.tbm_client);
1892 EINA_SAFETY_ON_NULL_GOTO(screenshot->bufmgr, fail_init);
1894 g_screenshot = screenshot;
1895 set_last_result(EFL_UTIL_ERROR_NONE);
1897 screenshooter_set_user_data(_eflutil.wl.shot.screenshooter, &screenshot->shot_done);
1899 _screenshot_mutex_unlock();
1901 return g_screenshot;
1903 /* LCOV_EXCL_START */
1905 if (display_wrapper)
1906 wl_proxy_wrapper_destroy(display_wrapper);
1907 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
1908 _screenshot_mutex_unlock();
1913 wl_registry_destroy(reg);
1916 _screenshot_mutex_unlock();
1917 efl_util_screenshot_deinitialize(screenshot);
1919 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
1921 /* LCOV_EXCL_STOP */
1925 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
1927 _screenshot_mutex_lock();
1931 _screenshot_mutex_unlock();
1932 _screenshot_mutex_destory();
1933 return EFL_UTIL_ERROR_INVALID_PARAMETER;
1937 g_screenshot = NULL;
1939 if (_eflutil.wl.shot.tbm_client)
1941 wayland_tbm_client_deinit(_eflutil.wl.shot.tbm_client);
1942 _eflutil.wl.shot.tbm_client = NULL;
1945 if (_eflutil.wl.shot.screenshooter)
1947 screenshooter_destroy(_eflutil.wl.shot.screenshooter);
1948 _eflutil.wl.shot.screenshooter = NULL;
1950 if (_eflutil.wl.shot.tz_screenshooter)
1952 tizen_screenshooter_destroy(_eflutil.wl.shot.tz_screenshooter);
1953 _eflutil.wl.shot.tz_screenshooter = NULL;
1956 if (_eflutil.wl.shot.queue)
1958 wl_event_queue_destroy(_eflutil.wl.shot.queue);
1959 _eflutil.wl.shot.queue = NULL;
1962 _screenshot_mutex_unlock();
1963 _screenshot_mutex_destory();
1965 return EFL_UTIL_ERROR_NONE;
1970 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
1972 tbm_surface_h t_surface = NULL;
1973 struct wl_buffer *buffer = NULL;
1974 Efl_Util_Wl_Output_Info *output;
1977 _screenshot_mutex_lock();
1979 if (!screenshot || (screenshot != g_screenshot))
1981 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
1982 _screenshot_mutex_unlock();
1986 output = eina_list_nth(_eflutil.wl.shot.output_list, 0);
1989 fprintf(stderr, "[screenshot] fail: no output for screenshot\n"); /* LCOV_EXCL_LINE */
1993 t_surface = tbm_surface_create(screenshot->width, screenshot->height, TBM_FORMAT_XRGB8888);
1996 fprintf(stderr, "[screenshot] fail: tbm_surface_create\n"); /* LCOV_EXCL_LINE */
2000 buffer = wayland_tbm_client_create_buffer(_eflutil.wl.shot.tbm_client, t_surface);
2003 fprintf(stderr, "[screenshot] fail: create wl_buffer for screenshot\n"); /* LCOV_EXCL_LINE */
2007 screenshooter_shoot(_eflutil.wl.shot.screenshooter, output->output, buffer);
2009 screenshot->shot_done = EINA_FALSE;
2010 while (!screenshot->shot_done && ret != -1)
2011 ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
2015 fprintf(stderr, "[screenshot] fail: screenshooter_shoot\n"); /* LCOV_EXCL_LINE */
2019 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2021 /* reset shot_done for next screenshot */
2022 screenshot->shot_done = EINA_FALSE;
2024 set_last_result(EFL_UTIL_ERROR_NONE);
2026 _screenshot_mutex_unlock();
2032 tbm_surface_destroy(t_surface);
2034 wayland_tbm_client_destroy_buffer(_eflutil.wl.shot.tbm_client, buffer);
2036 set_last_result(EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL);
2038 _screenshot_mutex_unlock();
2044 efl_util_screenshot_set_auto_rotation(efl_util_screenshot_h screenshot, int set)
2046 if (!screenshot || (screenshot != g_screenshot))
2047 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2049 if (!(set == 0 || set == 1))
2050 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2053 g_screenshot->auto_rotation = EINA_TRUE;
2055 g_screenshot->auto_rotation = EINA_FALSE;
2057 tizen_screenshooter_set_oneshot_auto_rotation(_eflutil.wl.shot.tz_screenshooter, g_screenshot->auto_rotation);
2059 return EFL_UTIL_ERROR_NONE;
2063 efl_util_screenshot_get_auto_rotation(efl_util_screenshot_h screenshot, int *set)
2065 if (!screenshot || (screenshot != g_screenshot) || !set)
2066 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2068 *set = g_screenshot->auto_rotation;
2070 return EFL_UTIL_ERROR_NONE;
2073 struct _efl_util_gesture_h
2078 API int EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2079 API int EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2080 API int EFL_UTIL_EVENT_GESTURE_TAP = 0;
2081 API int EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2083 /* LCOV_EXCL_START */
2085 _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)
2087 _eflutil.wl.gesture.request_notified = error;
2091 _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)
2093 efl_util_event_gesture_edge_swipe_s *ev = NULL;
2095 ev = (efl_util_event_gesture_edge_swipe_s *)calloc(1, sizeof(*ev));
2100 ev->fingers = fingers;
2105 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE, ev, NULL, NULL);
2109 _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)
2111 _eflutil.wl.gesture.request_notified = error;
2115 _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)
2117 efl_util_event_gesture_edge_drag_s *ev = NULL;
2119 ev = (efl_util_event_gesture_edge_drag_s *)calloc(1, sizeof(*ev));
2124 ev->fingers = fingers;
2129 ecore_event_add(EFL_UTIL_EVENT_GESTURE_EDGE_DRAG, ev, NULL, NULL);
2133 _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)
2135 _eflutil.wl.gesture.request_notified = error;
2139 _cb_gesture_tap(void *data EINA_UNUSED, struct tizen_gesture *tizen_gesture EINA_UNUSED, uint32_t mode, uint32_t fingers, uint32_t repeats)
2141 efl_util_event_gesture_tap_s *ev = NULL;
2143 ev = (efl_util_event_gesture_tap_s *)calloc(1, sizeof(*ev));
2148 ev->fingers = fingers;
2149 ev->repeats = repeats;
2151 ecore_event_add(EFL_UTIL_EVENT_GESTURE_TAP, ev, NULL, NULL);
2153 /* LCOV_EXCL_STOP */
2156 _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)
2158 _eflutil.wl.gesture.request_notified = error;
2161 /* LCOV_EXCL_START */
2163 _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)
2165 efl_util_event_gesture_palm_cover_s *ev = NULL;
2167 ev = (efl_util_event_gesture_palm_cover_s *)calloc(1, sizeof(*ev));
2172 ev->duration = duration;
2176 ev->pressure = wl_fixed_to_int(pressure);
2178 ecore_event_add(EFL_UTIL_EVENT_GESTURE_PALM_COVER, ev, NULL, NULL);
2180 /* LCOV_EXCL_STOP */
2183 _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)
2185 _eflutil.wl.gesture.request_notified = error;
2188 static efl_util_error_e
2189 _efl_util_gesture_convert_error(int ret)
2193 case TIZEN_GESTURE_ERROR_NONE:
2194 return EFL_UTIL_ERROR_NONE;
2195 case TIZEN_GESTURE_ERROR_INVALID_DATA:
2196 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2197 case TIZEN_GESTURE_ERROR_NO_PERMISSION:
2198 return EFL_UTIL_ERROR_PERMISSION_DENIED;
2199 case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
2200 return EFL_UTIL_ERROR_OUT_OF_MEMORY;
2201 case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
2202 return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
2203 case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
2204 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2206 return EFL_UTIL_ERROR_NONE;
2210 /* LCOV_EXCL_START */
2212 _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data)
2214 int ret = EFL_UTIL_ERROR_NONE;
2215 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2216 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2217 unsigned int fingers = 0;
2218 unsigned int edge = 0;
2219 unsigned int edge_size = 0;
2220 unsigned int start_point = 0;
2221 unsigned int end_point = 0;
2223 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2225 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2226 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2227 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2228 EFL_UTIL_ERROR_INVALID_PARAMETER);
2230 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2232 fingers = edge_swipe_data->fingers;
2233 edge = edge_swipe_data->edge;
2234 edge_size = edge_swipe_data->edge_size;
2235 start_point = edge_swipe_data->start_point;
2236 end_point = edge_swipe_data->end_point;
2238 tizen_gesture_grab_edge_swipe(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2240 while (_eflutil.wl.gesture.request_notified == -1)
2241 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2243 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2244 _eflutil.wl.gesture.request_notified = -1;
2250 _efl_util_gesture_ungrab_edge_swipe(efl_util_gesture_data data)
2252 int ret = EFL_UTIL_ERROR_NONE;
2253 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2254 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = NULL;
2255 unsigned int fingers = 0;
2256 unsigned int edge = 0;
2257 unsigned int edge_size = 0;
2258 unsigned int start_point = 0;
2259 unsigned int end_point = 0;
2261 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2263 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2264 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2265 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2266 EFL_UTIL_ERROR_INVALID_PARAMETER);
2268 edge_swipe_data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)data;
2270 fingers = edge_swipe_data->fingers;
2271 edge = edge_swipe_data->edge;
2272 edge_size = edge_swipe_data->edge_size;
2273 start_point = edge_swipe_data->start_point;
2274 end_point = edge_swipe_data->end_point;
2276 tizen_gesture_ungrab_edge_swipe(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2278 while (_eflutil.wl.gesture.request_notified == -1)
2279 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2281 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2282 _eflutil.wl.gesture.request_notified = -1;
2288 _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data)
2290 int ret = EFL_UTIL_ERROR_NONE;
2291 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2292 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2293 unsigned int fingers = 0;
2294 unsigned int edge = 0;
2295 unsigned int edge_size = 0;
2296 unsigned int start_point = 0;
2297 unsigned int end_point = 0;
2299 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2301 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2302 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2303 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2304 EFL_UTIL_ERROR_INVALID_PARAMETER);
2306 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2308 fingers = edge_drag_data->fingers;
2309 edge = edge_drag_data->edge;
2310 edge_size = edge_drag_data->edge_size;
2311 start_point = edge_drag_data->start_point;
2312 end_point = edge_drag_data->end_point;
2314 tizen_gesture_grab_edge_drag(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2316 while (_eflutil.wl.gesture.request_notified == -1)
2317 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2319 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2320 _eflutil.wl.gesture.request_notified = -1;
2326 _efl_util_gesture_ungrab_edge_drag(efl_util_gesture_data data)
2328 int ret = EFL_UTIL_ERROR_NONE;
2329 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2330 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = NULL;
2331 unsigned int fingers = 0;
2332 unsigned int edge = 0;
2333 unsigned int edge_size = 0;
2334 unsigned int start_point = 0;
2335 unsigned int end_point = 0;
2337 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2339 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2340 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2341 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2342 EFL_UTIL_ERROR_INVALID_PARAMETER);
2344 edge_drag_data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)data;
2346 fingers = edge_drag_data->fingers;
2347 edge = edge_drag_data->edge;
2348 edge_size = edge_drag_data->edge_size;
2349 start_point = edge_drag_data->start_point;
2350 end_point = edge_drag_data->end_point;
2352 tizen_gesture_ungrab_edge_drag(_eflutil.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
2354 while (_eflutil.wl.gesture.request_notified == -1)
2355 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2357 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2358 _eflutil.wl.gesture.request_notified = -1;
2365 _efl_util_gesture_grab_tap(efl_util_gesture_data data)
2367 int ret = EFL_UTIL_ERROR_NONE;
2368 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2369 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2370 unsigned int fingers = 0;
2371 unsigned int repeats = 0;
2373 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2375 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2376 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2377 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2378 EFL_UTIL_ERROR_INVALID_PARAMETER);
2380 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2382 fingers = tap_data->fingers;
2383 repeats = tap_data->repeats;
2385 tizen_gesture_grab_tap(_eflutil.wl.gesture.proto, fingers, repeats);
2387 while (_eflutil.wl.gesture.request_notified == -1)
2388 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2390 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2391 _eflutil.wl.gesture.request_notified = -1;
2397 _efl_util_gesture_ungrab_tap(efl_util_gesture_data data)
2399 int ret = EFL_UTIL_ERROR_NONE;
2400 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2401 Efl_Util_Gesture_Tap_Grab_Data *tap_data = NULL;
2402 unsigned int fingers = 0;
2403 unsigned int repeats = 0;
2405 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2407 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2408 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2409 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_TAP,
2410 EFL_UTIL_ERROR_INVALID_PARAMETER);
2412 tap_data = (Efl_Util_Gesture_Tap_Grab_Data *)data;
2414 fingers = tap_data->fingers;
2415 repeats = tap_data->repeats;
2417 tizen_gesture_ungrab_tap(_eflutil.wl.gesture.proto, fingers, repeats);
2419 while (_eflutil.wl.gesture.request_notified == -1)
2420 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2422 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2423 _eflutil.wl.gesture.request_notified = -1;
2429 _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data)
2431 int ret = EFL_UTIL_ERROR_NONE;
2432 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2434 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2436 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2437 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2438 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2439 EFL_UTIL_ERROR_INVALID_PARAMETER);
2441 tizen_gesture_grab_palm_cover(_eflutil.wl.gesture.proto);
2443 while (_eflutil.wl.gesture.request_notified == -1)
2444 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2446 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2447 _eflutil.wl.gesture.request_notified = -1;
2453 _efl_util_gesture_ungrab_palm_cover(efl_util_gesture_data data)
2455 int ret = EFL_UTIL_ERROR_NONE;
2456 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2458 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2460 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.gesture.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
2461 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2462 EINA_SAFETY_ON_FALSE_RETURN_VAL(base_data->type == TIZEN_GESTURE_TYPE_PALM_COVER,
2463 EFL_UTIL_ERROR_INVALID_PARAMETER);
2465 tizen_gesture_ungrab_palm_cover(_eflutil.wl.gesture.proto);
2467 while (_eflutil.wl.gesture.request_notified == -1)
2468 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2470 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2471 _eflutil.wl.gesture.request_notified = -1;
2477 _efl_util_fd_cb(void *data, Ecore_Fd_Handler *hdl)
2479 if (_eflutil.wl.dpy && _eflutil.wl.queue)
2481 wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2482 return ECORE_CALLBACK_RENEW;
2486 return ECORE_CALLBACK_CANCEL;
2489 /* LCOV_EXCL_STOP */
2491 API efl_util_gesture_h
2492 efl_util_gesture_initialize(void)
2494 efl_util_gesture_h gesture_h = NULL;
2497 gesture_h = (efl_util_gesture_h)calloc(1, sizeof(struct _efl_util_gesture_h));
2500 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2501 goto out; /* LCOV_EXCL_LINE */
2504 if (_wl_init() == (int)EINA_FALSE)
2506 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2507 goto out; /* LCOV_EXCL_LINE */
2510 while (!_eflutil.wl.gesture.proto)
2511 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); /* LCOV_EXCL_LINE */
2513 if (_eflutil.wl.gesture.event_init <= 0)
2515 if (ecore_event_init() <= 0)
2517 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
2518 goto out; /* LCOV_EXCL_LINE */
2520 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = ecore_event_type_new();
2521 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = ecore_event_type_new();
2522 EFL_UTIL_EVENT_GESTURE_TAP = ecore_event_type_new();
2523 EFL_UTIL_EVENT_GESTURE_PALM_COVER = ecore_event_type_new();
2525 dpy_fd = wl_display_get_fd(_eflutil.wl.dpy);
2526 _eflutil.wl.dpy_fd = fcntl(dpy_fd, F_DUPFD_CLOEXEC, 0);
2527 if (_eflutil.wl.dpy_fd >= 0)
2528 _eflutil.wl.fd_hdl = ecore_main_fd_handler_add(_eflutil.wl.dpy_fd,
2529 ECORE_FD_READ | ECORE_FD_WRITE | ECORE_FD_ERROR,
2530 _efl_util_fd_cb, NULL,
2533 _eflutil.wl.gesture.event_init++;
2534 gesture_h->init = EINA_TRUE;
2536 set_last_result(EFL_UTIL_ERROR_NONE);
2540 /* LCOV_EXCL_START */
2547 /* LCOV_EXCL_STOP */
2551 efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
2553 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2554 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2559 _eflutil.wl.gesture.event_init--;
2561 if (_eflutil.wl.gesture.event_init <= 0)
2563 _eflutil.wl.gesture.event_init = 0;
2564 ecore_event_shutdown();
2565 EFL_UTIL_EVENT_GESTURE_EDGE_SWIPE = 0;
2566 EFL_UTIL_EVENT_GESTURE_EDGE_DRAG = 0;
2567 EFL_UTIL_EVENT_GESTURE_TAP = 0;
2568 EFL_UTIL_EVENT_GESTURE_PALM_COVER = 0;
2569 if (_eflutil.wl.dpy_fd >= 0)
2571 ecore_main_fd_handler_del(_eflutil.wl.fd_hdl);
2572 _eflutil.wl.fd_hdl = NULL;
2573 close(_eflutil.wl.dpy_fd);
2574 _eflutil.wl.dpy_fd = -1;
2578 return EFL_UTIL_ERROR_NONE;
2581 API efl_util_gesture_data
2582 efl_util_gesture_edge_swipe_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2584 Efl_Util_Gesture_Edge_Swipe_Grab_Data *data;
2586 if (!gesture_h || gesture_h->init == EINA_FALSE)
2588 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2592 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2594 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2598 data = (Efl_Util_Gesture_Edge_Swipe_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Swipe_Grab_Data));
2601 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2602 return NULL; /* LCOV_EXCL_LINE */
2605 data->base.type = TIZEN_GESTURE_TYPE_EDGE_SWIPE;
2606 data->fingers = fingers;
2608 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2610 set_last_result(EFL_UTIL_ERROR_NONE);
2612 return (void *)data;
2616 efl_util_gesture_edge_swipe_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2618 if (!gesture_h || gesture_h->init == EINA_FALSE)
2620 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2625 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2631 return EFL_UTIL_ERROR_NONE;
2635 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)
2637 Efl_Util_Gesture_Edge_Swipe_Grab_Data *edge_swipe_data = data;
2639 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_swipe_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2640 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_swipe_data->base.type == TIZEN_GESTURE_TYPE_EDGE_SWIPE,
2641 EFL_UTIL_ERROR_INVALID_PARAMETER);
2642 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2643 EFL_UTIL_ERROR_INVALID_PARAMETER);
2644 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2646 edge_swipe_data->edge_size = edge_size;
2647 edge_swipe_data->start_point = start_point;
2648 edge_swipe_data->end_point = end_point;
2650 return EFL_UTIL_ERROR_NONE;
2653 API efl_util_gesture_data
2654 efl_util_gesture_edge_drag_new(efl_util_gesture_h gesture_h, unsigned int fingers, efl_util_gesture_edge_e edge)
2656 Efl_Util_Gesture_Edge_Drag_Grab_Data *data;
2658 if (!gesture_h || gesture_h->init == EINA_FALSE)
2660 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2664 if (edge <= EFL_UTIL_GESTURE_EDGE_NONE || edge > EFL_UTIL_GESTURE_EDGE_LEFT)
2666 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2670 data = (Efl_Util_Gesture_Edge_Drag_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Edge_Drag_Grab_Data));
2673 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2674 return NULL; /* LCOV_EXCL_LINE */
2677 data->base.type = TIZEN_GESTURE_TYPE_EDGE_DRAG;
2678 data->fingers = fingers;
2680 data->edge_size = EFL_UTIL_GESTURE_EDGE_SIZE_FULL;
2682 set_last_result(EFL_UTIL_ERROR_NONE);
2684 return (void *)data;
2688 efl_util_gesture_edge_drag_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2690 if (!gesture_h || gesture_h->init == EINA_FALSE)
2692 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2697 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2703 return EFL_UTIL_ERROR_NONE;
2707 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)
2709 Efl_Util_Gesture_Edge_Drag_Grab_Data *edge_drag_data = data;
2711 EINA_SAFETY_ON_NULL_RETURN_VAL(edge_drag_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2712 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_drag_data->base.type == TIZEN_GESTURE_TYPE_EDGE_DRAG,
2713 EFL_UTIL_ERROR_INVALID_PARAMETER);
2714 EINA_SAFETY_ON_FALSE_RETURN_VAL(edge_size == EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL,
2715 EFL_UTIL_ERROR_INVALID_PARAMETER);
2716 EINA_SAFETY_ON_FALSE_RETURN_VAL(end_point > start_point, EFL_UTIL_ERROR_INVALID_PARAMETER);
2718 edge_drag_data->edge_size = edge_size;
2719 edge_drag_data->start_point = start_point;
2720 edge_drag_data->end_point = end_point;
2722 return EFL_UTIL_ERROR_NONE;
2725 API efl_util_gesture_data
2726 efl_util_gesture_tap_new(efl_util_gesture_h gesture_h, unsigned int fingers, unsigned int repeats)
2728 Efl_Util_Gesture_Tap_Grab_Data *data;
2730 if (!gesture_h || gesture_h->init == EINA_FALSE)
2732 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2736 if (fingers <= 1 || repeats <= 1)
2738 set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED);
2742 data = (Efl_Util_Gesture_Tap_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Tap_Grab_Data));
2745 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2746 return NULL; /* LCOV_EXCL_LINE */
2749 data->base.type = TIZEN_GESTURE_TYPE_TAP;
2750 data->fingers = fingers;
2751 data->repeats = repeats;
2753 set_last_result(EFL_UTIL_ERROR_NONE);
2755 return (void *)data;
2759 efl_util_gesture_tap_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2761 if (!gesture_h || gesture_h->init == EINA_FALSE)
2763 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2768 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2774 return EFL_UTIL_ERROR_NONE;
2777 API efl_util_gesture_data
2778 efl_util_gesture_palm_cover_new(efl_util_gesture_h gesture_h)
2780 Efl_Util_Gesture_Palm_Cover_Grab_Data *data;
2782 if (!gesture_h || gesture_h->init == EINA_FALSE)
2784 set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
2788 data = (Efl_Util_Gesture_Palm_Cover_Grab_Data *)calloc(1, sizeof(Efl_Util_Gesture_Palm_Cover_Grab_Data));
2791 set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
2792 return NULL; /* LCOV_EXCL_LINE */
2795 data->base.type = TIZEN_GESTURE_TYPE_PALM_COVER;
2797 set_last_result(EFL_UTIL_ERROR_NONE);
2799 return (void *)data;
2803 efl_util_gesture_palm_cover_free(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2805 if (!gesture_h || gesture_h->init == EINA_FALSE)
2807 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2812 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2818 return EFL_UTIL_ERROR_NONE;
2821 /* LCOV_EXCL_START */
2823 efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2825 int ret = EFL_UTIL_ERROR_NONE;
2826 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2828 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2830 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2831 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2832 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2834 switch (base_data->type)
2836 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
2837 ret = _efl_util_gesture_grab_edge_swipe(data);
2839 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
2840 ret = _efl_util_gesture_grab_edge_drag(data);
2842 case TIZEN_GESTURE_TYPE_TAP:
2843 ret = _efl_util_gesture_grab_tap(data);
2845 case TIZEN_GESTURE_TYPE_PALM_COVER:
2846 ret = _efl_util_gesture_grab_palm_cover(data);
2849 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2856 efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
2858 int ret = EFL_UTIL_ERROR_NONE;
2859 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2861 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2863 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2864 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2865 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2867 switch (base_data->type)
2869 case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
2870 ret = _efl_util_gesture_ungrab_edge_swipe(data);
2872 case TIZEN_GESTURE_TYPE_EDGE_DRAG:
2873 ret = _efl_util_gesture_ungrab_edge_drag(data);
2875 case TIZEN_GESTURE_TYPE_TAP:
2876 ret = _efl_util_gesture_ungrab_tap(data);
2878 case TIZEN_GESTURE_TYPE_PALM_COVER:
2879 ret = _efl_util_gesture_ungrab_palm_cover(data);
2882 return EFL_UTIL_ERROR_INVALID_PARAMETER;
2887 /* LCOV_EXCL_STOP */
2890 efl_util_gesture_select(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
2892 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2893 Ecore_Wl2_Window *wlwin;
2894 struct wl_surface *surface;
2897 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2899 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2900 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2901 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
2902 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2904 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
2905 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2907 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
2908 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
2910 surface = ecore_wl2_window_surface_get(wlwin);
2911 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
2912 EFL_UTIL_ERROR_INVALID_PARAMETER);
2914 tizen_gesture_select_palm_cover(_eflutil.wl.gesture.proto, surface);
2916 while (_eflutil.wl.gesture.request_notified == -1)
2917 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2919 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2920 _eflutil.wl.gesture.request_notified = -1;
2926 efl_util_gesture_deselect(efl_util_gesture_h gesture_h, Evas_Object *window, efl_util_gesture_data data)
2928 Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
2929 Ecore_Wl2_Window *wlwin;
2930 struct wl_surface *surface;
2933 base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
2935 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2936 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2937 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
2938 EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
2940 if (base_data->type != TIZEN_GESTURE_TYPE_PALM_COVER)
2941 return EFL_UTIL_ERROR_NOT_SUPPORTED;
2943 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
2944 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
2946 surface = ecore_wl2_window_surface_get(wlwin);
2947 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
2948 EFL_UTIL_ERROR_INVALID_PARAMETER);
2950 tizen_gesture_deselect_palm_cover(_eflutil.wl.gesture.proto, surface);
2952 while (_eflutil.wl.gesture.request_notified == -1)
2953 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2955 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2956 _eflutil.wl.gesture.request_notified = -1;
2961 /* LCOV_EXCL_START */
2963 efl_util_gesture_activate_set(efl_util_gesture_h gesture_h, unsigned int type, Eina_Bool active)
2967 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2968 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2969 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
2971 tizen_gesture_activate_set(_eflutil.wl.gesture.proto, NULL, type, active);
2973 while (_eflutil.wl.gesture.request_notified == -1)
2974 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
2976 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
2977 _eflutil.wl.gesture.request_notified = -1;
2981 /* LCOV_EXCL_STOP */
2984 efl_util_gesture_activate_set_on_window(efl_util_gesture_h gesture_h, Evas_Object *window, unsigned int type, Eina_Bool active)
2986 Ecore_Wl2_Window *wlwin;
2987 struct wl_surface *surface;
2990 EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
2991 EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
2992 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
2993 EINA_SAFETY_ON_TRUE_RETURN_VAL(type == EFL_UTIL_GESTURE_TYPE_NONE, EFL_UTIL_ERROR_INVALID_PARAMETER);
2995 wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
2996 if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
2998 surface = ecore_wl2_window_surface_get(wlwin);
2999 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
3000 EFL_UTIL_ERROR_INVALID_PARAMETER);
3002 tizen_gesture_activate_set(_eflutil.wl.gesture.proto, surface, type, active);
3004 while (_eflutil.wl.gesture.request_notified == -1)
3005 wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
3007 ret = _efl_util_gesture_convert_error(_eflutil.wl.gesture.request_notified);
3008 _eflutil.wl.gesture.request_notified = -1;