2 * Copyright (c) 2011-2015 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"
23 #include <Elementary.h>
24 #include <Ecore_Evas.h>
29 #endif /* end of X11 */
32 #include <Ecore_Wayland.h>
33 #include <wayland-client.h>
34 #include "tizen_notification-client-protocol.h"
35 #include "tizen_window_screen-client-protocol.h"
36 #endif /* end of WAYLAND */
38 /* callback handler index */
39 #define CBH_NOTI_LEV 0
40 #define CBH_SCR_MODE 1
43 typedef void (*Efl_Util_Cb)(Evas_Object *, int, void *);
45 typedef struct _Efl_Util_Callback_Info
50 } Efl_Util_Callback_Info;
52 typedef struct _Efl_Util_Wl_Surface_Lv_Info
54 void *surface; /* wl_surface */
56 Eina_Bool wait_for_done;
57 } Efl_Util_Wl_Surface_Lv_Info;
59 typedef struct _Efl_Util_Wl_Surface_Scr_Mode_Info
61 void *surface; /* wl_surface */
63 Eina_Bool wait_for_done;
64 } Efl_Util_Wl_Surface_Scr_Mode_Info;
66 typedef struct _Efl_Util_Data
68 Ecore_Event_Handler *handler; /* x11 client message handler */
71 Eina_List *info_list; /* list of callback info */
72 unsigned int atom; /* x11 atom */
73 } cb_handler[CBH_MAX];
75 /* wayland related stuffs */
80 struct wl_display *dpy;
83 struct tizen_notification *proto;
88 struct tizen_window_screen *proto;
91 #endif /* end of WAYLAND */
95 static Efl_Util_Data _eflutil =
99 { NULL, 0 }, /* handler for notification level */
100 { NULL, 0 } /* handler for screen mode */
106 { NULL, NULL }, /* tizen_notification protocol */
107 { NULL, NULL } /* tizen_window_screen protocol */
108 #endif /* end of WAYLAND */
112 static Eina_Bool _cb_info_add(Evas_Object *win, Efl_Util_Cb cb, void *data, int idx);
113 static Eina_Bool _cb_info_del_by_win(Evas_Object *win, int idx);
114 static Eina_List *_cb_info_list_get(int idx);
115 static Efl_Util_Callback_Info *_cb_info_find_by_win(Evas_Object *win, int idx);
117 static Efl_Util_Callback_Info *_cb_info_find_by_xwin(unsigned int xwin);
118 static Eina_Bool _cb_x11_client_msg(void *data, int type, void *event);
119 #endif /* end of X11 */
121 static Eina_Bool _wl_init(void);
122 static void _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
123 static void _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
124 static Efl_Util_Callback_Info *_cb_info_find_by_wlsurf(void *wlsurf, int idx);
125 static void _cb_wl_tz_noti_lv_done(void *data, struct tizen_notification *proto, struct wl_surface *surface, int32_t level, uint32_t state);
126 static void _cb_wl_tz_win_scr_mode_done(void *data, struct tizen_window_screen *proto, struct wl_surface *surface, uint32_t mode, uint32_t state);
128 static const struct wl_registry_listener _wl_reg_listener =
131 _cb_wl_reg_global_remove
134 struct tizen_notification_listener _wl_tz_noti_lv_listener =
136 _cb_wl_tz_noti_lv_done
139 struct tizen_window_screen_listener _wl_tz_win_scr_mode_listener =
141 _cb_wl_tz_win_scr_mode_done
143 #endif /* end of WAYLAND */
146 _cb_info_add(Evas_Object *win,
151 Efl_Util_Callback_Info *info;
153 info = _cb_info_find_by_win(win, idx);
156 _eflutil.cb_handler[idx].info_list
157 = eina_list_remove(_eflutil.cb_handler[idx].info_list,
162 info = (Efl_Util_Callback_Info *)calloc(1, sizeof(Efl_Util_Callback_Info));
163 if (!info) return EINA_FALSE;
169 _eflutil.cb_handler[idx].info_list
170 = eina_list_append(_eflutil.cb_handler[idx].info_list,
174 if (!_eflutil.handler)
175 _eflutil.handler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
178 #endif /* end of X11 */
184 _cb_info_del_by_win(Evas_Object *win,
187 Efl_Util_Callback_Info *info;
190 info = _cb_info_find_by_win(win, idx);
191 if (!info) return EINA_FALSE;
193 _eflutil.cb_handler[idx].info_list
194 = eina_list_remove(_eflutil.cb_handler[idx].info_list,
198 count = eina_list_count(_eflutil.cb_handler[idx].info_list);
199 if ((count == 0) && (_eflutil.handler))
201 ecore_event_handler_del(_eflutil.handler);
202 _eflutil.handler = NULL;
209 _cb_info_list_get(int idx)
211 return _eflutil.cb_handler[idx].info_list;
214 static Efl_Util_Callback_Info *
215 _cb_info_find_by_win(Evas_Object *win,
219 Efl_Util_Callback_Info *info;
221 l = _cb_info_list_get(idx);
222 EINA_LIST_FOREACH(l, ll, info)
224 if (info->win == win) return info;
231 static Efl_Util_Callback_Info *
232 _cb_info_find_by_xwin(unsigned int xwin,
236 Efl_Util_Callback_Info *info;
239 l = _cb_info_list_get(idx);
240 EINA_LIST_FOREACH(l, ll, info)
242 xwin2 = elm_win_xwindow_get(info->win);
243 if (xwin == xwin2) return info;
250 _cb_x11_client_msg(void *data,
254 Ecore_X_Event_Client_Message *ev;
256 Efl_Util_Callback_Info *info;
259 if (!ev) return ECORE_CALLBACK_PASS_ON;
262 if (xwin == 0) return ECORE_CALLBACK_PASS_ON;
264 if (ev->message_type == _eflutil.atom.noti_lv)
266 info = _cb_info_find_by_xwin(xwin, CBH_NOTI_LEV);
268 /* permission denied */
269 if ((ev->data.l[1] == 0) &&
274 EFL_UTIL_ERROR_PERMISSION_DENIED,
278 else if (ev->message_type == _eflutil.atom.scr_mode)
280 info = _cb_info_find_by_xwin(xwin, CBH_SCR_MODE);
282 /* permission denied */
283 if ((ev->data.l[1] == 0) &&
288 EFL_UTIL_ERROR_PERMISSION_DENIED,
292 return ECORE_CALLBACK_PASS_ON;
294 #endif /* end of X11 */
300 struct wl_registry *reg;
302 if (_eflutil.wl.init) return EINA_TRUE;
304 _eflutil.wl.dpy = ecore_wl_display_get();
305 EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.dpy, EINA_FALSE);
307 reg = wl_display_get_registry(_eflutil.wl.dpy);
308 EINA_SAFETY_ON_NULL_RETURN_VAL(reg, EINA_FALSE);
310 wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
312 _eflutil.wl.init = EINA_TRUE;
318 _cb_wl_reg_global(void *data,
319 struct wl_registry *reg,
321 const char *interface,
322 unsigned int version)
324 if (!strcmp(interface, "tizen_notification"))
326 struct tizen_notification *proto;
327 proto = wl_registry_bind(reg,
329 &tizen_notification_interface,
333 tizen_notification_add_listener(proto,
334 &_wl_tz_noti_lv_listener,
337 _eflutil.wl.noti_lv.hash = eina_hash_pointer_new(free);
338 _eflutil.wl.noti_lv.proto = proto;
340 else if (!strcmp(interface, "tizen_window_screen"))
342 struct tizen_window_screen *proto;
343 proto = wl_registry_bind(reg,
345 &tizen_window_screen_interface,
349 tizen_window_screen_add_listener(proto,
350 &_wl_tz_win_scr_mode_listener,
353 _eflutil.wl.win_scr_mode.hash = eina_hash_pointer_new(free);
354 _eflutil.wl.win_scr_mode.proto = proto;
359 _cb_wl_reg_global_remove(void *data,
360 struct wl_registry *reg,
363 _eflutil.wl.noti_lv.proto = NULL;
364 eina_hash_free(_eflutil.wl.noti_lv.hash);
365 _eflutil.wl.win_scr_mode.proto = NULL;
366 eina_hash_free(_eflutil.wl.win_scr_mode.hash);
369 static Efl_Util_Callback_Info *
370 _cb_info_find_by_wlsurf(void *wlsurf,
374 Efl_Util_Callback_Info *info;
375 Ecore_Wl_Window *wlwin2 = NULL;
376 void *wlsurf2 = NULL;
378 l = _cb_info_list_get(idx);
379 EINA_LIST_FOREACH(l, ll, info)
381 wlwin2 = elm_win_wl_window_get(info->win);
382 wlsurf2 = ecore_wl_window_surface_get(wlwin2);
383 if (wlsurf== wlsurf2) return info;
390 _cb_wl_tz_noti_lv_done(void *data,
391 struct tizen_notification *proto,
392 struct wl_surface *surface,
396 Efl_Util_Wl_Surface_Lv_Info *lv_info;
397 Efl_Util_Callback_Info *cb_info;
399 lv_info = eina_hash_find(_eflutil.wl.noti_lv.hash, &surface);
402 lv_info->level = level;
403 lv_info->wait_for_done = EINA_FALSE;
406 if (state != TIZEN_NOTIFICATION_ERROR_STATE_PERMISSION_DENIED) return;
408 cb_info = _cb_info_find_by_wlsurf((void *)surface, CBH_NOTI_LEV);
409 if (!cb_info) return;
410 if (!cb_info->cb) return;
412 cb_info->cb(cb_info->win,
413 EFL_UTIL_ERROR_PERMISSION_DENIED,
418 _cb_wl_tz_win_scr_mode_done(void *data,
419 struct tizen_window_screen *proto,
420 struct wl_surface *surface,
425 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
426 Efl_Util_Callback_Info *cb_info;
428 scr_mode_info = eina_hash_find(_eflutil.wl.win_scr_mode.hash, &surface);
431 scr_mode_info->mode = mode;
432 scr_mode_info->wait_for_done = EINA_FALSE;
435 if (state != TIZEN_WINDOW_SCREEN_ERROR_STATE_PERMISSION_DENIED) return;
437 cb_info = _cb_info_find_by_wlsurf((void *)surface, CBH_SCR_MODE);
438 if (!cb_info) return;
439 if (!cb_info->cb) return;
441 cb_info->cb(cb_info->win,
442 EFL_UTIL_ERROR_PERMISSION_DENIED,
445 #endif /* end of WAYLAND */
448 efl_util_set_notification_window_level(Evas_Object *window,
449 efl_util_notification_level_e level)
451 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
452 EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_1) &&
453 (level <= EFL_UTIL_NOTIFICATION_LEVEL_TOP),
454 EFL_UTIL_ERROR_INVALID_PARAMETER);
457 Ecore_X_Window xwin = elm_win_xwindow_get(window);
460 Ecore_X_Window_Type window_type;
461 if (ecore_x_netwm_window_type_get(xwin, &window_type) == EINA_TRUE)
463 // success to get window type
464 if (window_type != ECORE_X_WINDOW_TYPE_NOTIFICATION)
466 // given EFL window's type is not notification type.
467 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
471 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
473 utilx_set_system_notification_level(ecore_x_display_get(), xwin, level);
474 return EFL_UTIL_ERROR_NONE;
476 #endif /* end of X11 */
480 Ecore_Wl_Window *wlwin;
481 struct wl_surface *surface;
482 Efl_Util_Wl_Surface_Lv_Info *lv_info;
484 type = elm_win_type_get(window);
485 EINA_SAFETY_ON_FALSE_RETURN_VAL((type == ELM_WIN_NOTIFICATION),
486 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
488 wlwin = elm_win_wl_window_get(window);
493 while (!_eflutil.wl.noti_lv.proto)
494 wl_display_dispatch(_eflutil.wl.dpy);
496 surface = ecore_wl_window_surface_get(wlwin);
497 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
498 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
500 lv_info = eina_hash_find(_eflutil.wl.noti_lv.hash, &surface);
503 lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
504 EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
506 lv_info->surface = surface;
507 lv_info->level = (int)level;
508 lv_info->wait_for_done = EINA_TRUE;
510 eina_hash_add(_eflutil.wl.noti_lv.hash,
516 lv_info->level = (int)level;
517 lv_info->wait_for_done = EINA_TRUE;
520 tizen_notification_set_level(_eflutil.wl.noti_lv.proto,
524 return EFL_UTIL_ERROR_NONE;
526 #endif /* end of WAYLAND */
528 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
532 efl_util_get_notification_window_level(Evas_Object *window,
533 efl_util_notification_level_e *level)
535 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
536 EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
539 Ecore_X_Window_Type window_type;
540 Utilx_Notification_Level utilx_level;
541 Ecore_X_Window xwin = elm_win_xwindow_get(window);
544 if (ecore_x_netwm_window_type_get(xwin, &window_type) == EINA_TRUE)
546 // success to get window type
547 if (window_type != ECORE_X_WINDOW_TYPE_NOTIFICATION)
549 // given EFL window's type is not notification type.
550 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
553 utilx_level = utilx_get_system_notification_level(ecore_x_display_get(), xwin);
554 if (utilx_level == UTILX_NOTIFICATION_LEVEL_LOW)
555 *level = EFL_UTIL_NOTIFICATION_LEVEL_1;
556 else if(utilx_level == UTILX_NOTIFICATION_LEVEL_NORMAL)
557 *level = EFL_UTIL_NOTIFICATION_LEVEL_2;
558 else if(utilx_level == UTILX_NOTIFICATION_LEVEL_HIGH)
559 *level = EFL_UTIL_NOTIFICATION_LEVEL_3;
561 return EFL_UTIL_ERROR_INVALID_PARAMETER;
564 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
566 return EFL_UTIL_ERROR_NONE;
568 #endif /* end of X11 */
572 Ecore_Wl_Window *wlwin;
573 struct wl_surface *surface;
574 Efl_Util_Wl_Surface_Lv_Info *lv_info;
576 type = elm_win_type_get(window);
577 EINA_SAFETY_ON_FALSE_RETURN_VAL((type == ELM_WIN_NOTIFICATION),
578 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
580 wlwin = elm_win_wl_window_get(window);
585 while (!_eflutil.wl.noti_lv.proto)
586 wl_display_dispatch(_eflutil.wl.dpy);
588 surface = ecore_wl_window_surface_get(wlwin);
589 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
590 EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
592 lv_info = eina_hash_find(_eflutil.wl.noti_lv.hash, &surface);
595 if (lv_info->wait_for_done)
597 if (ecore_wl_window_shell_surface_get(wlwin) ||
598 ecore_wl_window_xdg_surface_get(wlwin))
600 while (lv_info->wait_for_done)
603 wl_display_dispatch(_eflutil.wl.dpy);
608 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
609 return EFL_UTIL_ERROR_INVALID_PARAMETER;
613 switch (lv_info->level)
615 case TIZEN_NOTIFICATION_LEVEL_1: *level = EFL_UTIL_NOTIFICATION_LEVEL_1; break;
616 case TIZEN_NOTIFICATION_LEVEL_2: *level = EFL_UTIL_NOTIFICATION_LEVEL_2; break;
617 case TIZEN_NOTIFICATION_LEVEL_3: *level = EFL_UTIL_NOTIFICATION_LEVEL_3; break;
618 case TIZEN_NOTIFICATION_LEVEL_NONE: *level = EFL_UTIL_NOTIFICATION_LEVEL_NONE; break;
619 case TIZEN_NOTIFICATION_LEVEL_DEFAULT: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT; break;
620 case TIZEN_NOTIFICATION_LEVEL_MEDIUM: *level = EFL_UTIL_NOTIFICATION_LEVEL_MEDIUM; break;
621 case TIZEN_NOTIFICATION_LEVEL_HIGH: *level = EFL_UTIL_NOTIFICATION_LEVEL_HIGH; break;
622 case TIZEN_NOTIFICATION_LEVEL_TOP: *level = EFL_UTIL_NOTIFICATION_LEVEL_TOP; break;
623 default: *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
624 return EFL_UTIL_ERROR_INVALID_PARAMETER;
626 return EFL_UTIL_ERROR_NONE;
629 *level = EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT;
631 return EFL_UTIL_ERROR_NONE;
633 #endif /* end of WAYLAND */
634 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
638 efl_util_set_notification_window_level_error_cb(Evas_Object *window,
639 efl_util_notification_window_level_error_cb callback,
642 Eina_Bool ret = EINA_FALSE;
644 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
645 EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EFL_UTIL_ERROR_INVALID_PARAMETER);
647 ret = _cb_info_add(window,
648 (Efl_Util_Cb)callback,
651 if (!ret) return EFL_UTIL_ERROR_OUT_OF_MEMORY;
654 if (!_eflutil.atom.noti_lv)
655 _eflutil.atom.noti_lv = ecore_x_atom_get("_E_NOTIFICATION_LEVEL_ACCESS_RESULT");
656 #endif /* end of X11 */
658 return EFL_UTIL_ERROR_NONE;
662 efl_util_unset_notification_window_level_error_cb(Evas_Object *window)
664 Eina_Bool ret = EINA_FALSE;
666 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
668 ret = _cb_info_del_by_win(window, CBH_NOTI_LEV);
669 if (!ret) return EFL_UTIL_ERROR_INVALID_PARAMETER;
671 return EFL_UTIL_ERROR_NONE;
675 efl_util_set_window_opaque_state(Evas_Object *window,
678 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
679 EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
680 EFL_UTIL_ERROR_INVALID_PARAMETER);
683 Ecore_X_Window xwin = elm_win_xwindow_get(window);
684 Ecore_X_Display *xdpy = ecore_x_display_get();
685 Utilx_Opaque_State state;
688 EINA_SAFETY_ON_NULL_RETURN_VAL(xwin, EFL_UTIL_ERROR_INVALID_PARAMETER);
689 EINA_SAFETY_ON_NULL_RETURN_VAL(xdpy, EFL_UTIL_ERROR_INVALID_PARAMETER);
692 state = UTILX_OPAQUE_STATE_ON;
694 state = UTILX_OPAQUE_STATE_OFF;
696 ret = utilx_set_window_opaque_state(xdpy, xwin, state);
699 return EFL_UTIL_ERROR_INVALID_PARAMETER;
701 return EFL_UTIL_ERROR_NONE;
702 #endif /* end of X11 */
705 Ecore_Wl_Window *wlwin;
708 wlwin = elm_win_wl_window_get(window);
713 evas_object_geometry_get(window, &x, &y, &w, &h);
716 ecore_wl_window_opaque_region_set(wlwin, x, y, w, h);
718 ecore_wl_window_opaque_region_set(wlwin, 0, 0, 0, 0);
720 return EFL_UTIL_ERROR_NONE;
723 return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
724 #endif /* end of WAYLAND */
728 efl_util_set_window_screen_mode(Evas_Object *window,
729 efl_util_screen_mode_e mode)
731 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
732 EINA_SAFETY_ON_FALSE_RETURN_VAL(((mode >= EFL_UTIL_SCREEN_MODE_DEFAULT) &&
733 (mode <= EFL_UTIL_SCREEN_MODE_ALWAYS_ON)),
734 EFL_UTIL_ERROR_INVALID_PARAMETER);
741 e = evas_object_evas_get(window);
742 EINA_SAFETY_ON_NULL_RETURN_VAL(e, EFL_UTIL_ERROR_INVALID_PARAMETER);
744 ee = ecore_evas_ecore_evas_get(e);
745 EINA_SAFETY_ON_NULL_RETURN_VAL(ee, EFL_UTIL_ERROR_INVALID_PARAMETER);
747 id = ecore_evas_aux_hint_id_get(ee, "wm.policy.win.lcd.lock");
748 if (mode == EFL_UTIL_SCREEN_MODE_ALWAYS_ON)
751 ecore_evas_aux_hint_add(ee, "wm.policy.win.lcd.lock", "1");
753 ecore_evas_aux_hint_val_set(ee, id, "1");
755 else if (mode == EFL_UTIL_SCREEN_MODE_DEFAULT)
758 ecore_evas_aux_hint_add(ee, "wm.policy.win.lcd.lock", "0");
760 ecore_evas_aux_hint_val_set(ee, id, "0");
763 return EFL_UTIL_ERROR_INVALID_PARAMETER;
765 return EFL_UTIL_ERROR_NONE;
766 #endif /* end of X11 */
769 Ecore_Wl_Window *wlwin;
770 struct wl_surface *surface;
771 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
773 wlwin = elm_win_wl_window_get(window);
778 while (!_eflutil.wl.win_scr_mode.proto)
779 wl_display_dispatch(_eflutil.wl.dpy);
781 surface = ecore_wl_window_surface_get(wlwin);
782 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
783 EFL_UTIL_ERROR_INVALID_PARAMETER);
785 scr_mode_info = eina_hash_find(_eflutil.wl.win_scr_mode.hash, &surface);
788 scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
789 EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
791 scr_mode_info->surface = surface;
792 scr_mode_info->mode = (unsigned int)mode;
793 scr_mode_info->wait_for_done = EINA_TRUE;
795 eina_hash_add(_eflutil.wl.win_scr_mode.hash,
801 scr_mode_info->mode = (unsigned int)mode;
802 scr_mode_info->wait_for_done = EINA_TRUE;
805 tizen_window_screen_set_mode(_eflutil.wl.win_scr_mode.proto,
809 return EFL_UTIL_ERROR_NONE;
812 return EFL_UTIL_ERROR_INVALID_PARAMETER;
813 #endif /* end of WAYLAND */
817 efl_util_get_window_screen_mode(Evas_Object *window,
818 efl_util_screen_mode_e *mode)
820 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
821 EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EFL_UTIL_ERROR_INVALID_PARAMETER);
829 e = evas_object_evas_get(window);
830 EINA_SAFETY_ON_NULL_RETURN_VAL(e, EFL_UTIL_ERROR_INVALID_PARAMETER);
832 ee = ecore_evas_ecore_evas_get(e);
833 EINA_SAFETY_ON_NULL_RETURN_VAL(ee, EFL_UTIL_ERROR_INVALID_PARAMETER);
835 id = ecore_evas_aux_hint_id_get(ee, "wm.policy.win.lcd.lock");
836 EINA_SAFETY_ON_TRUE_RETURN_VAL((id == -1), EFL_UTIL_ERROR_INVALID_PARAMETER);
838 str = ecore_evas_aux_hint_val_get(ee, id);
839 EINA_SAFETY_ON_NULL_RETURN_VAL(str, EFL_UTIL_ERROR_INVALID_PARAMETER);
841 if (strncmp(str, "1", strlen("1")) == 0)
842 *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON;
844 *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
846 return EFL_UTIL_ERROR_NONE;
847 #endif /* end of X11 */
850 Ecore_Wl_Window *wlwin;
851 struct wl_surface *surface;
852 Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
854 wlwin = elm_win_wl_window_get(window);
859 while (!_eflutil.wl.win_scr_mode.proto)
860 wl_display_dispatch(_eflutil.wl.dpy);
862 surface = ecore_wl_window_surface_get(wlwin);
863 EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
864 EFL_UTIL_ERROR_INVALID_PARAMETER);
866 scr_mode_info = eina_hash_find(_eflutil.wl.win_scr_mode.hash, &surface);
869 if (scr_mode_info->wait_for_done)
871 while (scr_mode_info->wait_for_done)
874 wl_display_dispatch(_eflutil.wl.dpy);
878 switch (scr_mode_info->mode)
880 case TIZEN_WINDOW_SCREEN_MODE_DEFAULT: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT; break;
881 case TIZEN_WINDOW_SCREEN_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
882 default: *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
883 return EFL_UTIL_ERROR_INVALID_PARAMETER;
885 return EFL_UTIL_ERROR_NONE;
889 *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
890 return EFL_UTIL_ERROR_INVALID_PARAMETER;
894 return EFL_UTIL_ERROR_INVALID_PARAMETER;
895 #endif /* end of WAYLAND */
899 efl_util_set_window_screen_mode_error_cb(Evas_Object *window,
900 efl_util_window_screen_mode_error_cb callback,
903 Eina_Bool ret = EINA_FALSE;
905 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
906 EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EFL_UTIL_ERROR_INVALID_PARAMETER);
908 ret = _cb_info_add(window,
909 (Efl_Util_Cb)callback,
912 if (!ret) return EFL_UTIL_ERROR_OUT_OF_MEMORY;
915 if (!_eflutil.atom.scr_mode)
916 _eflutil.atom.scr_mode = ecore_x_atom_get("_E_SCREEN_MODE_ACCESS_RESULT");
917 #endif /* end of X11 */
919 return EFL_UTIL_ERROR_NONE;
923 efl_util_unset_window_screen_mode_error_cb(Evas_Object *window)
925 Eina_Bool ret = EINA_FALSE;
927 EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
929 ret = _cb_info_del_by_win(window, CBH_SCR_MODE);
930 if (!ret) return EFL_UTIL_ERROR_INVALID_PARAMETER;
932 return EFL_UTIL_ERROR_NONE;
936 efl_util_input_initialize_generator(efl_util_input_device_type_e dev_type)
938 return EFL_UTIL_ERROR_NONE;
942 efl_util_input_deinitialize_generator(void)
948 efl_util_input_generate_key(const char *key_name,
951 return EFL_UTIL_ERROR_NONE;
955 efl_util_input_generate_touch(int idx,
956 efl_util_input_touch_type_e touch_type,
960 return EFL_UTIL_ERROR_NONE;
963 API efl_util_screenshot_h
964 efl_util_screenshot_initialize(int width,
971 efl_util_screenshot_take_tbm_surface(efl_util_screenshot_h screenshot)
977 efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
979 return EFL_UTIL_ERROR_NONE;