5 #define ECORE_EVAS_INTERNAL
6 #define EFL_INPUT_EVENT_PROTECTED
10 #include <sys/types.h>
19 #if defined(HAVE_SYS_MMAN_H) || defined(HAVE_EVIL)
20 # include <sys/mman.h>
28 #include "ecore_private.h"
29 #include <Ecore_Input.h>
30 #include <Ecore_Input_Evas.h>
32 #include "Ecore_Evas.h"
33 #include "ecore_evas_private.h"
34 #include "ecore_evas_x11.h"
35 #include "ecore_evas_wayland.h"
36 #include "ecore_evas_cocoa.h"
37 #include "ecore_evas_extn.h"
38 #include "ecore_evas_win32.h"
40 #define EFL_INTERNAL_UNSTABLE
41 #include "interfaces/efl_common_internal.h"
47 #define ECORE_EVAS_CHECK(ee, ...) \
48 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) \
50 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__); \
54 EAPI Eina_Bool _ecore_evas_app_comp_sync = EINA_FALSE;
55 EAPI int _ecore_evas_log_dom = -1;
56 static int _ecore_evas_init_count = 0;
57 static Ecore_Fd_Handler *_ecore_evas_async_events_fd = NULL;
58 static Eina_Bool _ecore_evas_async_events_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
60 static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
61 static Ecore_Evas *ecore_evases = NULL;
62 static int _ecore_evas_fps_debug = 0;
65 static int _ecore_evas_render_sync = 1;
66 static Ecore_Animator *ecore_evas_animator = NULL;
67 static Eina_Bool ecore_evas_animator_ticked = EINA_FALSE;
68 static Eina_Bool ecore_evas_first = EINA_TRUE;
69 static int overtick = 0;
72 _ecore_evas_animator(void *data EINA_UNUSED)
74 ecore_evas_animator_ticked = EINA_TRUE;
78 ecore_evas_animator = NULL;
85 _ecore_evas_changes_get(Ecore_Evas *ee)
89 if (evas_changed_get(ee->evas)) return EINA_TRUE;
90 EINA_LIST_FOREACH(ee->sub_ecore_evas, l, ee)
92 if (evas_changed_get(ee->evas)) return EINA_TRUE;
98 _ecore_evas_changes_check(void)
102 EINA_INLIST_FOREACH(ecore_evases, ee)
104 if (_ecore_evas_changes_get(ee)) return EINA_TRUE;
110 _ecore_evas_idle_enter(void *data EINA_UNUSED)
116 #ifdef ECORE_EVAS_ASYNC_RENDER_DEBUG
117 double now = ecore_loop_time_get();
120 if (!ecore_evases) return ECORE_CALLBACK_RENEW;
122 if (_ecore_evas_render_sync)
124 if (!ecore_evas_first)
126 if ((!ecore_evas_animator_ticked) &&
127 (!ecore_main_loop_animator_ticked_get()))
129 if (_ecore_evas_changes_check())
131 if (!ecore_evas_animator)
134 ecore_evas_animator = ecore_animator_add(_ecore_evas_animator, NULL);
137 return ECORE_CALLBACK_RENEW;
139 ecore_evas_animator_ticked = EINA_FALSE;
141 ecore_evas_first = EINA_FALSE;
144 if (_ecore_evas_fps_debug)
146 t1 = ecore_time_get();
148 EINA_INLIST_FOREACH(ecore_evases, ee)
150 #ifdef ECORE_EVAS_ASYNC_RENDER_DEBUG
151 if ((ee->in_async_render) && (now - ee->async_render_start > 2.0))
153 ERR("stuck async render: time=%f, ee=%p, engine=%s, geometry=(%d, %d, %d, %d), visible=%hhu, shaped=%hhu, alpha=%hhu, transparent=%hhu",
154 now - ee->async_render_start, ee, ee->driver, ee->x, ee->y, ee->w, ee->h, ee->visible, ee->shaped, ee->alpha, ee->transparent);
156 ERR("delayed.avoid_damage=%hhu", ee->delayed.avoid_damage);
157 ERR("delayed.resize_shape=%hhu", ee->delayed.resize_shape);
158 ERR("delayed.shaped=%hhu", ee->delayed.shaped);
159 ERR("delayed.shaped_changed=%hhu", ee->delayed.shaped_changed);
160 ERR("delayed.alpha=%hhu", ee->delayed.alpha);
161 ERR("delayed.alpha_changed=%hhu", ee->delayed.alpha_changed);
162 ERR("delayed.transparent=%hhu", ee->delayed.transparent);
163 ERR("delayed.transparent_changed=%hhu", ee->delayed.transparent_changed);
164 ERR("delayed.rotation=%d", ee->delayed.rotation);
165 ERR("delayed.rotation_resize=%d", ee->delayed.rotation_resize);
166 ERR("delayed.rotation_changed=%d", ee->delayed.rotation_changed);
168 ERR("reset in_async_render of ee=%p", ee);
169 ee->in_async_render = EINA_FALSE;
170 ee->async_render_start = 0.0;
173 else if ((!ee->in_async_render) && (ee->async_render_start > 0.0))
175 DBG("--- async render %f ee=%p [%s] (%d, %d, %d, %d) visible=%hhu shaped=%hhu alpha=%hhu transparent=%hhu",
176 now, ee, ee->driver, ee->x, ee->y, ee->w, ee->h, ee->visible, ee->shaped, ee->alpha, ee->transparent);
177 ee->async_render_start = 0.0;
181 if (!ee->manual_render)
183 if (ee->engine.func->fn_render)
184 rend |= ee->engine.func->fn_render(ee);
186 * Some engines that generate their own ticks based on hardware
187 * events need to know that render has been considered, and
188 * whether it will actually generate a new image or not
190 if (ee->engine.func->fn_evas_changed)
191 ee->engine.func->fn_evas_changed(ee, rend);
193 #ifdef ECORE_EVAS_ASYNC_RENDER_DEBUG
194 if ((ee->in_async_render) && (ee->async_render_start <= 0.0))
196 DBG("+++ async render %f ee=%p [%s] (%d, %d, %d, %d) visible=%hhu shaped=%hhu alpha=%hhu transparent=%hhu",
197 now, ee, ee->driver, ee->x, ee->y, ee->w, ee->h, ee->visible, ee->shaped, ee->alpha, ee->transparent);
198 ee->async_render_start = now;
202 if (_ecore_evas_fps_debug)
204 t2 = ecore_time_get();
206 _ecore_evas_fps_debug_rendertime_add(t2 - t1);
208 return ECORE_CALLBACK_RENEW;
211 EAPI Ecore_Evas_Interface *
212 _ecore_evas_interface_get(const Ecore_Evas *ee, const char *iname)
215 Ecore_Evas_Interface *i;
217 EINA_SAFETY_ON_NULL_RETURN_VAL(ee, NULL);
218 EINA_SAFETY_ON_NULL_RETURN_VAL(iname, NULL);
220 EINA_LIST_FOREACH(ee->engine.ifaces, l, i)
222 if (!strcmp(i->name, iname))
226 CRI("Ecore_Evas %p (engine: %s) does not have interface '%s'",
227 ee, ee->driver, iname);
233 * Query if a particular rendering engine target has support
234 * @param engine The engine to check support for
235 * @return 1 if the particular engine is supported, 0 if it is not
237 * Query if engine @param engine is supported by ecore_evas. 1 is returned if
238 * it is, and 0 is returned if it is not supported.
241 ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine)
243 /* It should be done reading the availables engines */
247 case ECORE_EVAS_ENGINE_SOFTWARE_BUFFER:
250 case ECORE_EVAS_ENGINE_SOFTWARE_XLIB:
251 #ifdef BUILD_ECORE_EVAS_SOFTWARE_XLIB
256 case ECORE_EVAS_ENGINE_XRENDER_X11:
258 case ECORE_EVAS_ENGINE_OPENGL_X11:
259 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
264 case ECORE_EVAS_ENGINE_SOFTWARE_XCB:
265 #ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
270 case ECORE_EVAS_ENGINE_XRENDER_XCB:
272 case ECORE_EVAS_ENGINE_SOFTWARE_GDI:
273 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
278 case ECORE_EVAS_ENGINE_SOFTWARE_DDRAW:
279 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
284 case ECORE_EVAS_ENGINE_SOFTWARE_SDL:
285 #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
290 case ECORE_EVAS_ENGINE_OPENGL_SDL:
291 #ifdef BUILD_ECORE_EVAS_OPENGL_SDL
296 case ECORE_EVAS_ENGINE_DIRECTFB:
298 case ECORE_EVAS_ENGINE_SOFTWARE_FB:
299 #ifdef BUILD_ECORE_EVAS_FB
305 case ECORE_EVAS_ENGINE_SOFTWARE_8_X11:
307 case ECORE_EVAS_ENGINE_SOFTWARE_16_X11:
309 case ECORE_EVAS_ENGINE_SOFTWARE_16_DDRAW:
311 case ECORE_EVAS_ENGINE_SOFTWARE_16_WINCE:
313 case ECORE_EVAS_ENGINE_DIRECT3D:
315 case ECORE_EVAS_ENGINE_OPENGL_GLEW:
318 case ECORE_EVAS_ENGINE_OPENGL_COCOA:
319 #ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
324 case ECORE_EVAS_ENGINE_EWS:
325 #ifdef BUILD_ECORE_EVAS_EWS
330 case ECORE_EVAS_ENGINE_PSL1GHT:
331 #ifdef BUILD_ECORE_EVAS_PSL1GHT
336 case ECORE_EVAS_ENGINE_WAYLAND_SHM:
337 #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
342 case ECORE_EVAS_ENGINE_WAYLAND_EGL:
343 #ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
348 case ECORE_EVAS_ENGINE_DRM:
349 #ifdef BUILD_ECORE_EVAS_DRM
354 case ECORE_EVAS_ENGINE_OPENGL_DRM:
355 #ifdef BUILD_ECORE_EVAS_GL_DRM
367 _ecore_evas_fork_cb(void *data EINA_UNUSED)
371 if (_ecore_evas_async_events_fd)
372 ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
373 fd = evas_async_events_fd_get();
375 _ecore_evas_async_events_fd =
376 ecore_main_fd_handler_add(fd, ECORE_FD_READ,
377 _ecore_evas_async_events_fd_handler, NULL,
382 ecore_evas_init(void)
386 if (++_ecore_evas_init_count != 1)
387 return _ecore_evas_init_count;
390 return --_ecore_evas_init_count;
395 _ecore_evas_log_dom = eina_log_domain_register
396 ("ecore_evas", ECORE_EVAS_DEFAULT_LOG_COLOR);
397 if(_ecore_evas_log_dom < 0)
399 EINA_LOG_ERR("Impossible to create a log domain for Ecore_Evas.");
403 ecore_fork_reset_callback_add(_ecore_evas_fork_cb, NULL);
404 fd = evas_async_events_fd_get();
406 _ecore_evas_async_events_fd =
407 ecore_main_fd_handler_add(fd, ECORE_FD_READ,
408 _ecore_evas_async_events_fd_handler, NULL,
411 ecore_evas_idle_enterer =
412 ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
413 if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
414 if (getenv("ECORE_EVAS_RENDER_NOSYNC")) _ecore_evas_render_sync = 0;
415 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
417 #ifdef BUILD_ECORE_EVAS_EWS
418 _ecore_evas_ews_events_init();
421 _ecore_evas_extn_init();
423 _ecore_evas_engine_init();
425 eina_log_timing(_ecore_evas_log_dom,
427 EINA_LOG_STATE_INIT);
429 if (getenv("ECORE_EVAS_COMP_NOSYNC"))
430 _ecore_evas_app_comp_sync = EINA_FALSE;
431 else if (getenv("ECORE_EVAS_COMP_SYNC"))
432 _ecore_evas_app_comp_sync = EINA_TRUE;
433 return _ecore_evas_init_count;
440 return --_ecore_evas_init_count;
444 ecore_evas_shutdown(void)
446 if (--_ecore_evas_init_count != 0)
447 return _ecore_evas_init_count;
449 eina_log_timing(_ecore_evas_log_dom,
450 EINA_LOG_STATE_START,
451 EINA_LOG_STATE_SHUTDOWN);
453 while (ecore_evases) _ecore_evas_free(ecore_evases);
455 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
456 ecore_idle_enterer_del(ecore_evas_idle_enterer);
457 ecore_evas_idle_enterer = NULL;
459 if (_ecore_evas_render_sync)
461 if (ecore_evas_animator) ecore_animator_del(ecore_evas_animator);
462 ecore_evas_animator = NULL;
465 _ecore_evas_extn_shutdown();
467 #ifdef BUILD_ECORE_EVAS_EWS
468 while (_ecore_evas_ews_shutdown());
470 _ecore_evas_engine_shutdown();
471 if (_ecore_evas_async_events_fd)
472 ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
474 ecore_fork_reset_callback_del(_ecore_evas_fork_cb, NULL);
476 eina_log_domain_unregister(_ecore_evas_log_dom);
477 _ecore_evas_log_dom = -1;
481 return _ecore_evas_init_count;
485 ecore_evas_app_comp_sync_set(Eina_Bool do_sync)
487 _ecore_evas_app_comp_sync = do_sync;
491 ecore_evas_app_comp_sync_get(void)
493 return _ecore_evas_app_comp_sync;
496 struct ecore_evas_engine {
498 Ecore_Evas *(*constructor)(int x, int y, int w, int h, const char *extra_options);
501 /* inline is just to avoid need to ifdef around it */
502 static inline const char *
503 _ecore_evas_parse_extra_options_str(const char *extra_options, const char *key, char **value)
505 int len = strlen(key);
507 while (extra_options)
511 if (strncmp(extra_options, key, len) != 0)
513 extra_options = strchr(extra_options, ';');
519 extra_options += len;
520 p = strchr(extra_options, ';');
523 len = p - extra_options;
524 *value = malloc(len + 1);
525 memcpy(*value, extra_options, len);
526 (*value)[len] = '\0';
527 extra_options = p + 1;
531 *value = strdup(extra_options);
532 extra_options = NULL;
535 return extra_options;
538 /* inline is just to avoid need to ifdef around it */
539 static inline const char *
540 _ecore_evas_parse_extra_options_uint(const char *extra_options, const char *key, unsigned int *value)
542 int len = strlen(key);
544 while (extra_options)
548 if (strncmp(extra_options, key, len) != 0)
550 extra_options = strchr(extra_options, ';');
556 extra_options += len;
557 *value = strtol(extra_options, NULL, 0);
559 p = strchr(extra_options, ';');
561 extra_options = p + 1;
563 extra_options = NULL;
565 return extra_options;
568 /* inline is just to avoid need to ifdef around it */
569 static inline const char *
570 _ecore_evas_parse_extra_options_x(const char *extra_options, char **disp_name, unsigned int *parent)
572 _ecore_evas_parse_extra_options_str(extra_options, "display=", disp_name);
573 _ecore_evas_parse_extra_options_uint(extra_options, "parent=", parent);
574 return extra_options;
578 _ecore_evas_constructor_software_x11(int x, int y, int w, int h, const char *extra_options)
580 unsigned int parent = 0;
581 char *disp_name = NULL;
584 _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
585 ee = ecore_evas_software_x11_new(disp_name, parent, x, y, w, h);
592 _ecore_evas_constructor_cocoa(int x, int y, int w, int h, const char *extra_options)
597 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
598 ee = ecore_evas_cocoa_new(NULL, x, y, w, h);
601 if (ee) ecore_evas_move(ee, x, y);
606 _ecore_evas_constructor_opengl_x11(int x, int y, int w, int h, const char *extra_options)
608 Ecore_X_Window parent = 0;
609 char *disp_name = NULL;
612 _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
613 ee = ecore_evas_gl_x11_new(disp_name, parent, x, y, w, h);
620 _ecore_evas_constructor_sdl(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options)
623 unsigned int fullscreen = 0, hwsurface = 0, noframe = 0, alpha = 0;
626 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
627 _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
628 _ecore_evas_parse_extra_options_uint(extra_options, "hwsurface=", &hwsurface);
629 _ecore_evas_parse_extra_options_uint(extra_options, "noframe=", &noframe);
630 _ecore_evas_parse_extra_options_uint(extra_options, "alpha=", &alpha);
632 ee = ecore_evas_sdl_new(name, w, h, fullscreen, hwsurface, noframe, alpha);
638 _ecore_evas_constructor_opengl_sdl(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options)
641 unsigned int fullscreen = 0, noframe = 0;
644 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
645 _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
646 _ecore_evas_parse_extra_options_uint(extra_options, "noframe=", &noframe);
648 ee = ecore_evas_gl_sdl_new(name, w, h, fullscreen, noframe);
655 _ecore_evas_constructor_fb(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options)
658 char *disp_name = NULL;
659 unsigned int rotation = 0;
661 _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
662 _ecore_evas_parse_extra_options_uint(extra_options, "rotation=", &rotation);
664 ee = ecore_evas_fb_new(disp_name, rotation, w, h);
671 _ecore_evas_constructor_psl1ght(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options)
676 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
677 ee = ecore_evas_psl1ght_new(name, w, h);
680 if (ee) ecore_evas_move(ee, x, y);
685 _ecore_evas_constructor_wayland_shm(int x, int y, int w, int h, const char *extra_options)
687 char *disp_name = NULL;
688 unsigned int frame = 0, parent = 0;
691 _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
692 _ecore_evas_parse_extra_options_uint(extra_options, "frame=", &frame);
693 _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent);
694 ee = ecore_evas_wayland_shm_new(disp_name, parent, x, y, w, h, frame);
701 _ecore_evas_constructor_wayland_egl(int x, int y, int w, int h, const char *extra_options)
703 char *disp_name = NULL;
704 unsigned int frame = 0, parent = 0;
707 _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
708 _ecore_evas_parse_extra_options_uint(extra_options, "frame=", &frame);
709 _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent);
710 ee = ecore_evas_wayland_egl_new(disp_name, parent, x, y, w, h, frame);
717 _ecore_evas_constructor_drm(int x, int y, int w, int h, const char *extra_options)
720 unsigned int parent = 0;
723 _ecore_evas_parse_extra_options_str(extra_options, "device=", &device);
724 _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent);
725 ee = ecore_evas_drm_new(device, parent, x, y, w, h);
732 _ecore_evas_constructor_opengl_drm(int x, int y, int w, int h, const char *extra_options)
735 unsigned int parent = 0;
738 _ecore_evas_parse_extra_options_str(extra_options, "device=", &device);
739 _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent);
740 ee = ecore_evas_gl_drm_new(device, parent, x, y, w, h);
747 _ecore_evas_constructor_software_gdi(int x, int y, int w, int h,
748 const char *extra_options EINA_UNUSED)
750 return ecore_evas_software_gdi_new(NULL, x, y, w, h);
754 _ecore_evas_constructor_software_ddraw(int x, int y, int w, int h,
755 const char *extra_options EINA_UNUSED)
757 return ecore_evas_software_ddraw_new(NULL, x, y, w, h);
761 _ecore_evas_constructor_direct3d(int x, int y, int w, int h,
762 const char *extra_options EINA_UNUSED)
764 return ecore_evas_direct3d_new(NULL, x, y, w, h);
768 _ecore_evas_constructor_opengl_glew(int x, int y, int w, int h,
769 const char *extra_options EINA_UNUSED)
771 return ecore_evas_gl_glew_new(NULL, x, y, w, h);
775 _ecore_evas_constructor_buffer(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options EINA_UNUSED)
777 return ecore_evas_buffer_new(w, h);
780 #ifdef BUILD_ECORE_EVAS_EWS
782 _ecore_evas_constructor_ews(int x, int y, int w, int h, const char *extra_options EINA_UNUSED)
784 return ecore_evas_ews_new(x, y, w, h);
788 /* note: keep sorted by priority, highest first */
789 static const struct ecore_evas_engine _engines[] = {
791 {"software_x11", _ecore_evas_constructor_software_x11},
792 {"opengl_x11", _ecore_evas_constructor_opengl_x11},
793 {"fb", _ecore_evas_constructor_fb},
794 {"software_gdi", _ecore_evas_constructor_software_gdi},
795 {"software_ddraw", _ecore_evas_constructor_software_ddraw},
796 {"direct3d", _ecore_evas_constructor_direct3d},
797 {"opengl_glew", _ecore_evas_constructor_opengl_glew},
798 {"opengl_cocoa", _ecore_evas_constructor_cocoa},
799 {"psl1ght", _ecore_evas_constructor_psl1ght},
800 {"wayland_shm", _ecore_evas_constructor_wayland_shm},
801 {"wayland_egl", _ecore_evas_constructor_wayland_egl},
802 {"drm", _ecore_evas_constructor_drm},
803 {"gl_drm", _ecore_evas_constructor_opengl_drm},
804 {"opengl_sdl", _ecore_evas_constructor_opengl_sdl},
805 {"sdl", _ecore_evas_constructor_sdl},
806 {"buffer", _ecore_evas_constructor_buffer},
807 #ifdef BUILD_ECORE_EVAS_EWS
808 {"ews", _ecore_evas_constructor_ews},
814 ecore_evas_engines_get(void)
816 return eina_list_clone(_ecore_evas_available_engines_get());
820 ecore_evas_engines_free(Eina_List *engines)
822 eina_list_free(engines);
826 _ecore_evas_new_auto_discover(int x, int y, int w, int h, const char *extra_options)
828 const struct ecore_evas_engine *itr;
830 DBG("auto discover engine");
832 for (itr = _engines; itr->constructor; itr++)
834 Ecore_Evas *ee = itr->constructor(x, y, w, h, extra_options);
837 INF("auto discovered '%s'", itr->name);
842 WRN("could not auto discover.");
847 ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options)
849 const struct ecore_evas_engine *itr;
853 engine_name = getenv("ECORE_EVAS_ENGINE");
855 DBG("no engine_name provided, using ECORE_EVAS_ENGINE='%s'",
859 return _ecore_evas_new_auto_discover(x, y, w, h, extra_options);
861 for (itr = _engines; itr->name; itr++)
862 if (strcmp(itr->name, engine_name) == 0)
864 INF("using engine '%s', extra_options=%s",
865 engine_name, extra_options ? extra_options : "(null)");
866 return itr->constructor(x, y, w, h, extra_options);
869 WRN("unknown engine '%s'", engine_name);
874 ecore_evas_engine_name_get(const Ecore_Evas *ee)
882 ecore_evas_ecore_evas_get(const Evas *e)
884 Ecore_Evas *ee = evas_data_attach_get(e);
885 if (!ee) return NULL;
886 ECORE_EVAS_CHECK(ee, NULL);
891 ecore_evas_free(Ecore_Evas *ee)
894 ECORE_EVAS_CHECK(ee);
895 _ecore_evas_free(ee);
900 ecore_evas_data_get(const Ecore_Evas *ee, const char *key)
902 ECORE_EVAS_CHECK(ee, NULL);
904 if (!key) return NULL;
905 if (!ee->data) return NULL;
907 return eina_hash_find(ee->data, key);
911 ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data)
913 ECORE_EVAS_CHECK(ee);
918 eina_hash_del(ee->data, key, NULL);
922 ee->data = eina_hash_string_superfast_new(NULL);
923 eina_hash_add(ee->data, key, data);
928 ecore_evas_object_evas_get(Evas_Object *obj)
932 ee = evas_object_data_get(obj, "Ecore_Evas");
933 if (!ee) return NULL;
935 return ecore_evas_get(ee);
939 ecore_evas_object_ecore_evas_get(Evas_Object *obj)
941 return evas_object_data_get(obj, "Ecore_Evas");
944 #define IFC(_ee, _fn) if (_ee->engine.func->_fn) {_ee->engine.func->_fn
948 ecore_evas_callback_resize_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
950 ECORE_EVAS_CHECK(ee);
951 IFC(ee, fn_callback_resize_set) (ee, func);
953 ee->func.fn_resize = func;
957 ecore_evas_callback_move_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
959 ECORE_EVAS_CHECK(ee);
960 IFC(ee, fn_callback_move_set) (ee, func);
962 ee->func.fn_move = func;
966 ecore_evas_callback_show_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
968 ECORE_EVAS_CHECK(ee);
969 IFC(ee, fn_callback_show_set) (ee, func);
971 ee->func.fn_show = func;
975 ecore_evas_callback_hide_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
977 ECORE_EVAS_CHECK(ee);
978 IFC(ee, fn_callback_hide_set) (ee, func);
980 ee->func.fn_hide = func;
984 ecore_evas_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
986 ECORE_EVAS_CHECK(ee);
987 IFC(ee, fn_callback_delete_request_set) (ee, func);
989 ee->func.fn_delete_request = func;
993 ecore_evas_callback_destroy_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
995 ECORE_EVAS_CHECK(ee);
996 IFC(ee, fn_callback_destroy_set) (ee, func);
998 ee->func.fn_destroy = func;
1002 ecore_evas_callback_focus_in_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1004 ECORE_EVAS_CHECK(ee);
1005 IFC(ee, fn_callback_focus_in_set) (ee, func);
1007 ee->func.fn_focus_in = func;
1011 ecore_evas_callback_focus_out_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1013 ECORE_EVAS_CHECK(ee);
1014 IFC(ee, fn_callback_focus_out_set) (ee, func);
1016 ee->func.fn_focus_out = func;
1020 ecore_evas_callback_sticky_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1022 ECORE_EVAS_CHECK(ee);
1023 IFC(ee, fn_callback_sticky_set) (ee, func);
1025 ee->func.fn_sticky = func;
1029 ecore_evas_callback_unsticky_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1031 ECORE_EVAS_CHECK(ee);
1032 IFC(ee, fn_callback_unsticky_set) (ee, func);
1034 ee->func.fn_unsticky = func;
1038 ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1040 ECORE_EVAS_CHECK(ee);
1041 IFC(ee, fn_callback_mouse_in_set) (ee, func);
1043 ee->func.fn_mouse_in = func;
1047 ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1049 ECORE_EVAS_CHECK(ee);
1050 IFC(ee, fn_callback_mouse_out_set) (ee, func);
1052 ee->func.fn_mouse_out = func;
1056 ecore_evas_callback_pre_render_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1058 ECORE_EVAS_CHECK(ee);
1059 IFC(ee, fn_callback_pre_render_set) (ee, func);
1061 ee->func.fn_pre_render = func;
1065 ecore_evas_callback_post_render_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1067 ECORE_EVAS_CHECK(ee);
1068 IFC(ee, fn_callback_post_render_set) (ee, func);
1070 ee->func.fn_post_render = func;
1074 ecore_evas_callback_pre_free_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1076 ECORE_EVAS_CHECK(ee);
1077 ee->func.fn_pre_free = func;
1081 ecore_evas_callback_state_change_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1083 ECORE_EVAS_CHECK(ee);
1084 ee->func.fn_state_change = func;
1088 ecore_evas_get(const Ecore_Evas *ee)
1090 ECORE_EVAS_CHECK(ee, NULL);
1095 ecore_evas_move(Ecore_Evas *ee, int x, int y)
1097 ECORE_EVAS_CHECK(ee);
1098 if (ee->prop.fullscreen) return;
1099 IFC(ee, fn_move) (ee, x, y);
1104 ecore_evas_managed_move(Ecore_Evas *ee, int x, int y)
1106 ECORE_EVAS_CHECK(ee);
1107 IFC(ee, fn_managed_move) (ee, x, y);
1112 ecore_evas_resize(Ecore_Evas *ee, int w, int h)
1114 ECORE_EVAS_CHECK(ee);
1115 if (ee->prop.fullscreen) return;
1118 if (ECORE_EVAS_PORTRAIT(ee))
1120 IFC(ee, fn_resize) (ee, w, h);
1125 IFC(ee, fn_resize) (ee, h, w);
1131 ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1133 ECORE_EVAS_CHECK(ee);
1134 if (ee->prop.fullscreen) return;
1137 if (ECORE_EVAS_PORTRAIT(ee))
1139 IFC(ee, fn_move_resize) (ee, x, y, w, h);
1144 IFC(ee, fn_move_resize) (ee, x, y, h, w);
1150 ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
1152 ECORE_EVAS_CHECK(ee);
1153 if (ECORE_EVAS_PORTRAIT(ee))
1170 ecore_evas_request_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
1172 ECORE_EVAS_CHECK(ee);
1173 if (ECORE_EVAS_PORTRAIT(ee))
1175 if (x) *x = ee->req.x;
1176 if (y) *y = ee->req.y;
1177 if (w) *w = ee->req.w;
1178 if (h) *h = ee->req.h;
1182 if (x) *x = ee->req.x;
1183 if (y) *y = ee->req.y;
1184 if (w) *w = ee->req.h;
1185 if (h) *h = ee->req.w;
1190 ecore_evas_rotation_set(Ecore_Evas *ee, int rot)
1192 ECORE_EVAS_CHECK(ee);
1194 while (rot < 0) rot += 360;
1195 IFC(ee, fn_rotation_set) (ee, rot, 0);
1196 /* make sure everything gets redrawn */
1197 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1198 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1203 ecore_evas_rotation_with_resize_set(Ecore_Evas *ee, int rot)
1205 ECORE_EVAS_CHECK(ee);
1207 while (rot < 0) rot += 360;
1208 IFC(ee, fn_rotation_set) (ee, rot, 1);
1209 /* make sure everything gets redrawn */
1210 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1211 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1216 ecore_evas_rotation_get(const Ecore_Evas *ee)
1218 ECORE_EVAS_CHECK(ee, 0);
1219 return ee->rotation;
1223 ecore_evas_shaped_set(Ecore_Evas *ee, Eina_Bool shaped)
1225 ECORE_EVAS_CHECK(ee);
1226 IFC(ee, fn_shaped_set) (ee, shaped);
1231 ecore_evas_shaped_get(const Ecore_Evas *ee)
1233 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1234 return ee->shaped ? EINA_TRUE : EINA_FALSE;
1238 ecore_evas_alpha_set(Ecore_Evas *ee, Eina_Bool alpha)
1240 ECORE_EVAS_CHECK(ee);
1241 IFC(ee, fn_alpha_set) (ee, alpha);
1246 ecore_evas_alpha_get(const Ecore_Evas *ee)
1248 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1249 return ee->alpha ? EINA_TRUE : EINA_FALSE;
1253 ecore_evas_transparent_set(Ecore_Evas *ee, Eina_Bool transparent)
1255 ECORE_EVAS_CHECK(ee);
1256 IFC(ee, fn_transparent_set) (ee, transparent);
1261 ecore_evas_transparent_get(const Ecore_Evas *ee)
1263 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1264 return ee->transparent ? EINA_TRUE : 0;
1268 ecore_evas_show(Ecore_Evas *ee)
1270 ECORE_EVAS_CHECK(ee);
1271 IFC(ee, fn_show) (ee);
1276 ecore_evas_hide(Ecore_Evas *ee)
1278 ECORE_EVAS_CHECK(ee);
1279 IFC(ee, fn_hide) (ee);
1284 ecore_evas_visibility_get(const Ecore_Evas *ee)
1286 ECORE_EVAS_CHECK(ee, 0);
1287 return ee->visible ? 1:0;
1291 ecore_evas_raise(Ecore_Evas *ee)
1293 ECORE_EVAS_CHECK(ee);
1294 IFC(ee, fn_raise) (ee);
1299 ecore_evas_lower(Ecore_Evas *ee)
1301 ECORE_EVAS_CHECK(ee);
1302 IFC(ee, fn_lower) (ee);
1307 ecore_evas_activate(Ecore_Evas *ee)
1309 ECORE_EVAS_CHECK(ee);
1310 IFC(ee, fn_activate) (ee);
1315 ecore_evas_title_set(Ecore_Evas *ee, const char *t)
1317 ECORE_EVAS_CHECK(ee);
1318 IFC(ee, fn_title_set) (ee, t);
1323 ecore_evas_title_get(const Ecore_Evas *ee)
1325 ECORE_EVAS_CHECK(ee, NULL);
1326 return ee->prop.title;
1330 ecore_evas_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
1332 ECORE_EVAS_CHECK(ee);
1333 IFC(ee, fn_name_class_set) (ee, n, c);
1338 ecore_evas_name_class_get(const Ecore_Evas *ee, const char **n, const char **c)
1342 ECORE_EVAS_CHECK(ee);
1343 if (n) *n = ee->prop.name;
1344 if (c) *c = ee->prop.clas;
1348 ecore_evas_size_min_set(Ecore_Evas *ee, int w, int h)
1350 ECORE_EVAS_CHECK(ee);
1353 if (ECORE_EVAS_PORTRAIT(ee))
1355 IFC(ee, fn_size_min_set) (ee, w, h);
1360 IFC(ee, fn_size_min_set) (ee, h, w);
1366 ecore_evas_size_min_get(const Ecore_Evas *ee, int *w, int *h)
1370 ECORE_EVAS_CHECK(ee);
1371 if (ECORE_EVAS_PORTRAIT(ee))
1373 if (w) *w = ee->prop.min.w;
1374 if (h) *h = ee->prop.min.h;
1378 if (w) *w = ee->prop.min.h;
1379 if (h) *h = ee->prop.min.w;
1384 ecore_evas_size_max_set(Ecore_Evas *ee, int w, int h)
1386 ECORE_EVAS_CHECK(ee);
1389 if (ECORE_EVAS_PORTRAIT(ee))
1391 IFC(ee, fn_size_max_set) (ee, w, h);
1396 IFC(ee, fn_size_max_set) (ee, h, w);
1402 ecore_evas_size_max_get(const Ecore_Evas *ee, int *w, int *h)
1406 ECORE_EVAS_CHECK(ee);
1407 if (ECORE_EVAS_PORTRAIT(ee))
1409 if (w) *w = ee->prop.max.w;
1410 if (h) *h = ee->prop.max.h;
1414 if (w) *w = ee->prop.max.h;
1415 if (h) *h = ee->prop.max.w;
1420 ecore_evas_size_base_set(Ecore_Evas *ee, int w, int h)
1422 ECORE_EVAS_CHECK(ee);
1425 if (ECORE_EVAS_PORTRAIT(ee))
1427 IFC(ee, fn_size_base_set) (ee, w, h);
1432 IFC(ee, fn_size_base_set) (ee, h, w);
1438 ecore_evas_size_base_get(const Ecore_Evas *ee, int *w, int *h)
1440 ECORE_EVAS_CHECK(ee);
1441 if (ECORE_EVAS_PORTRAIT(ee))
1443 if (w) *w = ee->prop.base.w;
1444 if (h) *h = ee->prop.base.h;
1448 if (w) *w = ee->prop.base.h;
1449 if (h) *h = ee->prop.base.w;
1454 ecore_evas_size_step_set(Ecore_Evas *ee, int w, int h)
1456 ECORE_EVAS_CHECK(ee);
1459 if (ECORE_EVAS_PORTRAIT(ee))
1461 IFC(ee, fn_size_step_set) (ee, w, h);
1466 IFC(ee, fn_size_step_set) (ee, h, w);
1472 ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h)
1474 ECORE_EVAS_CHECK(ee);
1475 if (ECORE_EVAS_PORTRAIT(ee))
1477 if (w) *w = ee->prop.step.w;
1478 if (h) *h = ee->prop.step.h;
1482 if (w) *w = ee->prop.step.h;
1483 if (h) *h = ee->prop.step.w;
1488 ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y)
1490 Evas_Object *obj = NULL;
1492 ECORE_EVAS_CHECK(ee);
1498 obj = evas_object_image_add(ee->evas);
1499 evas_object_image_file_set(obj, file, NULL);
1500 evas_object_image_size_get(obj, &x, &y);
1501 evas_object_resize(obj, x, y);
1502 evas_object_image_fill_set(obj, 0, 0, x, y);
1505 IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
1510 ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
1512 ECORE_EVAS_CHECK(ee);
1513 IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
1518 ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y)
1520 ECORE_EVAS_CHECK(ee);
1521 if (obj) *obj = ee->prop.cursor.object;
1522 if (layer) *layer = ee->prop.cursor.layer;
1523 if (hot_x) *hot_x = ee->prop.cursor.hot.x;
1524 if (hot_y) *hot_y = ee->prop.cursor.hot.y;
1528 ecore_evas_cursor_unset(Ecore_Evas *ee)
1532 ECORE_EVAS_CHECK(ee, NULL);
1534 obj = ee->prop.cursor.object;
1535 IFC(ee, fn_object_cursor_unset) (ee);
1536 evas_object_hide(obj);
1537 ee->prop.cursor.object = NULL;
1544 ecore_evas_layer_set(Ecore_Evas *ee, int layer)
1546 ECORE_EVAS_CHECK(ee);
1547 IFC(ee, fn_layer_set) (ee, layer);
1549 ee->prop.layer = layer;
1553 ecore_evas_layer_get(const Ecore_Evas *ee)
1555 ECORE_EVAS_CHECK(ee, 0);
1556 return ee->prop.layer;
1560 ecore_evas_focus_set(Ecore_Evas *ee, Eina_Bool on)
1562 ECORE_EVAS_CHECK(ee);
1563 IFC(ee, fn_focus_set) (ee, on);
1567 evas_focus_in(ee->evas);
1568 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
1572 evas_focus_out(ee->evas);
1573 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
1575 ee->prop.focused = !!on;
1579 ecore_evas_focus_get(const Ecore_Evas *ee)
1581 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1582 return ee->prop.focused ? EINA_TRUE : EINA_FALSE;
1586 ecore_evas_iconified_set(Ecore_Evas *ee, Eina_Bool on)
1588 ECORE_EVAS_CHECK(ee);
1589 IFC(ee, fn_iconified_set) (ee, on);
1591 ee->prop.iconified = !!on;
1595 ecore_evas_iconified_get(const Ecore_Evas *ee)
1597 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1598 return ee->prop.iconified ? EINA_TRUE : EINA_FALSE;
1602 ecore_evas_borderless_set(Ecore_Evas *ee, Eina_Bool on)
1604 ECORE_EVAS_CHECK(ee);
1605 IFC(ee, fn_borderless_set) (ee, on);
1607 ee->prop.borderless = !!on;
1611 ecore_evas_borderless_get(const Ecore_Evas *ee)
1613 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1614 return ee->prop.borderless ? EINA_TRUE : EINA_FALSE;
1618 ecore_evas_override_set(Ecore_Evas *ee, Eina_Bool on)
1620 ECORE_EVAS_CHECK(ee);
1621 IFC(ee, fn_override_set) (ee, on);
1623 ee->prop.override = !!on;
1627 ecore_evas_override_get(const Ecore_Evas *ee)
1629 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1630 return ee->prop.override ? EINA_TRUE : EINA_FALSE;
1634 ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on)
1636 ECORE_EVAS_CHECK(ee);
1637 IFC(ee, fn_maximized_set) (ee, on);
1642 ecore_evas_maximized_get(const Ecore_Evas *ee)
1644 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1645 return ee->prop.maximized ? EINA_TRUE : EINA_FALSE;
1649 ecore_evas_window_profile_supported_get(const Ecore_Evas *ee)
1651 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1652 return ee->profile_supported ? EINA_TRUE : EINA_FALSE;
1656 ecore_evas_window_profile_set(Ecore_Evas *ee, const char *profile)
1658 ECORE_EVAS_CHECK(ee);
1659 IFC(ee, fn_profile_set) (ee, profile);
1664 ecore_evas_window_profile_get(const Ecore_Evas *ee)
1666 ECORE_EVAS_CHECK(ee, NULL);
1667 return ee->prop.profile.name;
1671 ecore_evas_window_available_profiles_set(Ecore_Evas *ee, const char **profiles, const unsigned int count)
1673 ECORE_EVAS_CHECK(ee);
1674 IFC(ee, fn_profiles_set) (ee, profiles, count);
1679 ecore_evas_window_available_profiles_get(Ecore_Evas *ee, char ***profiles, unsigned int *count)
1681 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1683 if ((ee->prop.profile.available_list) &&
1684 (ee->prop.profile.count >= 1))
1686 if (profiles) *profiles = ee->prop.profile.available_list;
1687 if (count) *count = ee->prop.profile.count;
1695 ecore_evas_wm_rotation_supported_get(const Ecore_Evas *ee)
1697 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1698 return ee->prop.wm_rot.supported;
1702 ecore_evas_wm_rotation_preferred_rotation_set(Ecore_Evas *ee, int rotation)
1704 ECORE_EVAS_CHECK(ee);
1707 if (ee->prop.wm_rot.available_rots)
1709 Eina_Bool found = EINA_FALSE;
1711 for (i = 0; i < ee->prop.wm_rot.count; i++)
1713 if (ee->prop.wm_rot.available_rots[i] == rotation)
1722 IFC(ee, fn_wm_rot_preferred_rotation_set) (ee, rotation);
1727 ecore_evas_wm_rotation_preferred_rotation_get(const Ecore_Evas *ee)
1729 ECORE_EVAS_CHECK(ee, -1);
1730 return ee->prop.wm_rot.preferred_rot;
1734 ecore_evas_wm_rotation_available_rotations_set(Ecore_Evas *ee, const int *rotations, unsigned int count)
1736 ECORE_EVAS_CHECK(ee);
1737 IFC(ee, fn_wm_rot_available_rotations_set) (ee, rotations, count);
1742 ecore_evas_wm_rotation_available_rotations_get(const Ecore_Evas *ee, int **rotations, unsigned int *count)
1744 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1745 if ((!rotations) || (!count))
1748 if ((!ee->prop.wm_rot.available_rots) || (ee->prop.wm_rot.count == 0))
1751 *rotations = calloc(ee->prop.wm_rot.count, sizeof(int));
1752 if (!*rotations) return EINA_FALSE;
1754 memcpy(*rotations, ee->prop.wm_rot.available_rots, sizeof(int) * ee->prop.wm_rot.count);
1755 *count = ee->prop.wm_rot.count;
1761 ecore_evas_wm_rotation_manual_rotation_done_set(Ecore_Evas *ee, Eina_Bool set)
1763 ECORE_EVAS_CHECK(ee);
1764 if (!ee->prop.wm_rot.app_set)
1769 IFC(ee, fn_wm_rot_manual_rotation_done_set) (ee, set);
1774 ecore_evas_wm_rotation_manual_rotation_done_get(const Ecore_Evas *ee)
1776 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1777 if (!ee->prop.wm_rot.app_set)
1782 return ee->prop.wm_rot.manual_mode.set;
1786 ecore_evas_wm_rotation_manual_rotation_done(Ecore_Evas *ee)
1788 ECORE_EVAS_CHECK(ee);
1789 if (!ee->prop.wm_rot.app_set)
1794 IFC(ee, fn_wm_rot_manual_rotation_done) (ee);
1798 EAPI const Eina_List *
1799 ecore_evas_aux_hints_supported_get(const Ecore_Evas *ee)
1801 ECORE_EVAS_CHECK(ee, NULL);
1802 return ee->prop.aux_hint.supported_list;
1806 ecore_evas_aux_hints_allowed_get(const Ecore_Evas *ee)
1808 ECORE_EVAS_CHECK(ee, NULL);
1810 Eina_List *list = NULL, *ll;
1811 Ecore_Evas_Aux_Hint *aux;
1812 EINA_LIST_FOREACH(ee->prop.aux_hint.hints, ll, aux)
1814 if ((aux->allowed) && !(aux->notified))
1816 list = eina_list_append(list, (void*)(uintptr_t)aux->id);
1824 ecore_evas_aux_hint_add(Ecore_Evas *ee, const char *hint, const char *val)
1826 ECORE_EVAS_CHECK(ee, -1);
1829 char *supported_hint;
1830 EINA_LIST_FOREACH(ee->prop.aux_hint.supported_list, ll, supported_hint)
1832 if (!strncmp(supported_hint, hint, strlen(hint)))
1834 Ecore_Evas_Aux_Hint *aux= (Ecore_Evas_Aux_Hint *)calloc(1, sizeof(Ecore_Evas_Aux_Hint));
1837 aux->id = ee->prop.aux_hint.id;
1838 aux->hint = eina_stringshare_add(hint);
1839 aux->val = eina_stringshare_add(val);
1841 ee->prop.aux_hint.hints = eina_list_append(ee->prop.aux_hint.hints, aux);
1843 Eina_Strbuf *buf = _ecore_evas_aux_hints_string_get(ee);
1846 if (ee->engine.func->fn_aux_hints_set)
1847 ee->engine.func->fn_aux_hints_set(ee, eina_strbuf_string_get(buf));
1849 eina_strbuf_free(buf);
1851 ee->prop.aux_hint.id++;
1856 eina_stringshare_del(aux->hint);
1857 eina_stringshare_del(aux->val);
1868 ecore_evas_aux_hint_del(Ecore_Evas *ee, const int id)
1870 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1873 Ecore_Evas_Aux_Hint *aux;
1874 EINA_LIST_FOREACH(ee->prop.aux_hint.hints, ll, aux)
1878 ee->prop.aux_hint.hints = eina_list_remove(ee->prop.aux_hint.hints, aux);
1880 eina_stringshare_del(aux->hint);
1881 eina_stringshare_del(aux->val);
1884 Eina_Strbuf *buf = _ecore_evas_aux_hints_string_get(ee);
1887 if (ee->engine.func->fn_aux_hints_set)
1888 ee->engine.func->fn_aux_hints_set(ee, eina_strbuf_string_get(buf));
1890 eina_strbuf_free(buf);
1902 ecore_evas_aux_hint_val_set(Ecore_Evas *ee, const int id, const char *val)
1904 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1907 Ecore_Evas_Aux_Hint *aux;
1908 EINA_LIST_FOREACH(ee->prop.aux_hint.hints, ll, aux)
1912 eina_stringshare_del(aux->val);
1913 aux->val = eina_stringshare_add(val);
1917 Eina_Strbuf *buf = _ecore_evas_aux_hints_string_get(ee);
1920 if (ee->engine.func->fn_aux_hints_set)
1921 ee->engine.func->fn_aux_hints_set(ee, eina_strbuf_string_get(buf));
1923 eina_strbuf_free(buf);
1935 ecore_evas_aux_hint_val_get(const Ecore_Evas *ee, int id)
1937 ECORE_EVAS_CHECK(ee, NULL);
1940 Ecore_Evas_Aux_Hint *aux;
1941 EINA_LIST_FOREACH(ee->prop.aux_hint.hints, ll, aux)
1943 if (id == aux->id) return aux->val;
1950 ecore_evas_aux_hint_id_get(const Ecore_Evas *ee, const char *hint)
1952 ECORE_EVAS_CHECK(ee, -1);
1955 Ecore_Evas_Aux_Hint *aux;
1956 EINA_LIST_FOREACH(ee->prop.aux_hint.hints, ll, aux)
1958 if (!strcmp(hint,aux->hint)) return aux->id;
1965 ecore_evas_fullscreen_set(Ecore_Evas *ee, Eina_Bool on)
1967 ECORE_EVAS_CHECK(ee);
1968 IFC(ee, fn_fullscreen_set) (ee, on);
1973 ecore_evas_fullscreen_get(const Ecore_Evas *ee)
1975 ECORE_EVAS_CHECK(ee, EINA_FALSE);
1976 return ee->prop.fullscreen ? EINA_TRUE : EINA_FALSE;
1980 ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on)
1982 ECORE_EVAS_CHECK(ee);
1983 IFC(ee, fn_avoid_damage_set) (ee, on);
1987 EAPI Ecore_Evas_Avoid_Damage_Type
1988 ecore_evas_avoid_damage_get(const Ecore_Evas *ee)
1990 ECORE_EVAS_CHECK(ee, ECORE_EVAS_AVOID_DAMAGE_NONE);
1991 return ee->prop.avoid_damage;
1995 ecore_evas_withdrawn_set(Ecore_Evas *ee, Eina_Bool withdrawn)
1997 ECORE_EVAS_CHECK(ee);
1998 IFC(ee, fn_withdrawn_set) (ee, withdrawn);
2003 ecore_evas_withdrawn_get(const Ecore_Evas *ee)
2005 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2006 return ee->prop.withdrawn ? EINA_TRUE : EINA_FALSE;
2010 ecore_evas_sticky_set(Ecore_Evas *ee, Eina_Bool on)
2012 ECORE_EVAS_CHECK(ee);
2013 IFC(ee, fn_sticky_set) (ee, on);
2018 ecore_evas_sticky_get(const Ecore_Evas *ee)
2020 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2021 return ee->prop.sticky ? EINA_TRUE : EINA_FALSE;
2025 ecore_evas_window_group_set(Ecore_Evas *ee, const Ecore_Evas *ee_group)
2027 ECORE_EVAS_CHECK(ee);
2028 IFC(ee, fn_window_group_set) (ee, ee_group);
2032 EAPI const Ecore_Evas *
2033 ecore_evas_window_group_get(const Ecore_Evas *ee)
2035 ECORE_EVAS_CHECK(ee, NULL);
2036 return ee->prop.group_ee;
2040 ecore_evas_aspect_set(Ecore_Evas *ee, double aspect)
2042 ECORE_EVAS_CHECK(ee);
2043 IFC(ee, fn_aspect_set) (ee, aspect);
2048 ecore_evas_aspect_get(const Ecore_Evas *ee)
2050 ECORE_EVAS_CHECK(ee, 0.0);
2051 return ee->prop.aspect;
2055 ecore_evas_urgent_set(Ecore_Evas *ee, Eina_Bool on)
2057 ECORE_EVAS_CHECK(ee);
2058 IFC(ee, fn_urgent_set) (ee, on);
2063 ecore_evas_urgent_get(const Ecore_Evas *ee)
2065 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2066 return ee->prop.urgent ? EINA_TRUE : EINA_FALSE;
2070 ecore_evas_modal_set(Ecore_Evas *ee, Eina_Bool on)
2072 ECORE_EVAS_CHECK(ee);
2073 IFC(ee, fn_modal_set) (ee, on);
2078 ecore_evas_modal_get(const Ecore_Evas *ee)
2080 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2081 return ee->prop.modal ? EINA_TRUE : EINA_FALSE;
2085 ecore_evas_demand_attention_set(Ecore_Evas *ee, Eina_Bool on)
2087 ECORE_EVAS_CHECK(ee);
2088 IFC(ee, fn_demands_attention_set) (ee, on);
2093 ecore_evas_demand_attention_get(const Ecore_Evas *ee)
2095 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2096 return ee->prop.demand_attention ? EINA_TRUE : EINA_FALSE;
2100 ecore_evas_focus_skip_set(Ecore_Evas *ee, Eina_Bool on)
2102 ECORE_EVAS_CHECK(ee);
2103 IFC(ee, fn_focus_skip_set) (ee, on);
2108 ecore_evas_focus_skip_get(const Ecore_Evas *ee)
2110 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2111 return ee->prop.focus_skip ? EINA_TRUE : EINA_FALSE;
2115 ecore_evas_ignore_events_set(Ecore_Evas *ee, Eina_Bool ignore)
2117 ECORE_EVAS_CHECK(ee);
2118 IFC(ee, fn_ignore_events_set) (ee, ignore);
2123 ecore_evas_ignore_events_get(const Ecore_Evas *ee)
2125 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2126 return ee->ignore_events ? EINA_TRUE : EINA_FALSE;
2130 ecore_evas_manual_render_set(Ecore_Evas *ee, Eina_Bool manual_render)
2132 ECORE_EVAS_CHECK(ee);
2133 ee->manual_render = manual_render;
2137 ecore_evas_manual_render_get(const Ecore_Evas *ee)
2139 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2140 return ee->manual_render ? EINA_TRUE : EINA_FALSE;
2144 ecore_evas_manual_render(Ecore_Evas *ee)
2146 ECORE_EVAS_CHECK(ee);
2147 if (ee->engine.func->fn_render)
2148 ee->engine.func->fn_render(ee);
2152 ecore_evas_msg_parent_send(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
2154 ECORE_EVAS_CHECK(ee);
2155 DBG("Msg(to parent): ee=%p msg_domain=%d msg_id=%d size=%d", ee, msg_domain, msg_id, size);
2156 IFC(ee, fn_msg_parent_send) (ee, msg_domain, msg_id, data, size);
2161 ecore_evas_msg_send(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
2163 ECORE_EVAS_CHECK(ee);
2164 DBG("Msg: ee=%p msg_domain=%d msg_id=%d size=%d", ee, msg_domain, msg_id, size);
2165 IFC(ee, fn_msg_send) (ee, msg_domain, msg_id, data, size);
2170 ecore_evas_callback_msg_parent_handle_set(Ecore_Evas *ee, void (*func_parent_handle)(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size))
2172 ECORE_EVAS_CHECK(ee);
2173 DBG("Msg Parent handle: ee=%p", ee);
2174 ee->func.fn_msg_parent_handle = func_parent_handle;
2178 ecore_evas_callback_msg_handle_set(Ecore_Evas *ee, void (*func_handle)(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size))
2180 ECORE_EVAS_CHECK(ee);
2181 DBG("Msg handle: ee=%p", ee);
2182 ee->func.fn_msg_handle = func_handle;
2187 ecore_evas_comp_sync_set(Ecore_Evas *ee, Eina_Bool do_sync)
2189 ECORE_EVAS_CHECK(ee);
2190 ee->no_comp_sync = !do_sync;
2194 ecore_evas_comp_sync_get(const Ecore_Evas *ee)
2196 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2197 return !ee->no_comp_sync;
2201 ecore_evas_window_get(const Ecore_Evas *ee)
2203 ECORE_EVAS_CHECK(ee, 0);
2204 return ee->prop.window;
2208 ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
2214 ECORE_EVAS_CHECK(ee);
2215 IFC(ee, fn_screen_geometry_get) (ee, x, y, w, h);
2220 ecore_evas_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi)
2222 if (xdpi) *xdpi = 0;
2223 if (ydpi) *ydpi = 0;
2224 ECORE_EVAS_CHECK(ee);
2225 IFC(ee, fn_screen_dpi_get) (ee, xdpi, ydpi);
2230 ecore_evas_draw_frame_set(Ecore_Evas *ee EINA_UNUSED, Eina_Bool draw_frame EINA_UNUSED)
2232 WRN("Calling deprecated function %s (not implemented)", __FUNCTION__);
2236 ecore_evas_draw_frame_get(const Ecore_Evas *ee EINA_UNUSED)
2238 WRN("Calling deprecated function %s (not implemented)", __FUNCTION__);
2243 ecore_evas_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
2247 ECORE_EVAS_CHECK(ee);
2248 IFC(ee, fn_pointer_xy_get) (ee, x, y);
2253 ecore_evas_pointer_warp(const Ecore_Evas *ee, Evas_Coord x, Evas_Coord y)
2255 ECORE_EVAS_CHECK(ee, EINA_FALSE);
2256 if (ee->engine.func->fn_pointer_warp)
2257 return ee->engine.func->fn_pointer_warp(ee, x, y);
2263 ecore_evas_pixmap_visual_get(const Ecore_Evas *ee)
2265 ECORE_EVAS_CHECK(ee, NULL);
2267 if (!strcmp(ee->driver, "software_x11"))
2269 Ecore_Evas_Interface_Software_X11 *iface;
2270 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
2271 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
2273 if (iface->pixmap_visual_get)
2274 return iface->pixmap_visual_get(ee);
2276 else if (!strcmp(ee->driver, "opengl_x11"))
2278 Ecore_Evas_Interface_Gl_X11 *iface;
2279 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
2280 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
2282 if (iface->pixmap_visual_get)
2283 return iface->pixmap_visual_get(ee);
2290 ecore_evas_pixmap_colormap_get(const Ecore_Evas *ee)
2292 ECORE_EVAS_CHECK(ee, 0);
2294 if (!strcmp(ee->driver, "software_x11"))
2296 Ecore_Evas_Interface_Software_X11 *iface;
2297 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
2298 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
2300 if (iface->pixmap_colormap_get)
2301 return iface->pixmap_colormap_get(ee);
2303 else if (!strcmp(ee->driver, "opengl_x11"))
2305 Ecore_Evas_Interface_Gl_X11 *iface;
2306 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
2307 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
2309 if (iface->pixmap_colormap_get)
2310 return iface->pixmap_colormap_get(ee);
2317 ecore_evas_pixmap_depth_get(const Ecore_Evas *ee)
2319 ECORE_EVAS_CHECK(ee, 0);
2321 if (!strcmp(ee->driver, "software_x11"))
2323 Ecore_Evas_Interface_Software_X11 *iface;
2324 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
2325 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
2327 if (iface->pixmap_depth_get)
2328 return iface->pixmap_depth_get(ee);
2330 else if (!strcmp(ee->driver, "opengl_x11"))
2332 Ecore_Evas_Interface_Gl_X11 *iface;
2333 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
2334 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
2336 if (iface->pixmap_depth_get)
2337 return iface->pixmap_depth_get(ee);
2343 /* fps debug calls - for debugging how much time your app actually spends */
2344 /* rendering graphics... :) */
2346 static int _ecore_evas_fps_debug_init_count = 0;
2347 static int _ecore_evas_fps_debug_fd = -1;
2348 unsigned int *_ecore_evas_fps_rendertime_mmap = NULL;
2351 _ecore_evas_fps_debug_init(void)
2355 _ecore_evas_fps_debug_init_count++;
2356 if (_ecore_evas_fps_debug_init_count > 1) return;
2358 snprintf(buf, sizeof(buf), "%s/.ecore_evas_fps_debug-%i",
2359 eina_environment_tmp_get(), (int)getpid());
2360 _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_BINARY | O_TRUNC | O_RDWR, 0644);
2361 if (_ecore_evas_fps_debug_fd < 0)
2364 _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_BINARY | O_TRUNC | O_RDWR, 0644);
2366 if (_ecore_evas_fps_debug_fd >= 0)
2368 unsigned int zero = 0;
2369 char *buf2 = (char *)&zero;
2370 ssize_t todo = sizeof(unsigned int);
2374 ssize_t r = write(_ecore_evas_fps_debug_fd, buf2, todo);
2380 else if ((r < 0) && (errno == EINTR))
2384 ERR("could not write to file '%s' fd %d: %s",
2385 buf, _ecore_evas_fps_debug_fd, strerror(errno));
2386 close(_ecore_evas_fps_debug_fd);
2387 _ecore_evas_fps_debug_fd = -1;
2391 _ecore_evas_fps_rendertime_mmap = mmap(NULL, sizeof(unsigned int),
2392 PROT_READ | PROT_WRITE,
2394 _ecore_evas_fps_debug_fd, 0);
2395 if (_ecore_evas_fps_rendertime_mmap == MAP_FAILED)
2396 _ecore_evas_fps_rendertime_mmap = NULL;
2401 _ecore_evas_fps_debug_shutdown(void)
2403 _ecore_evas_fps_debug_init_count--;
2404 if (_ecore_evas_fps_debug_init_count > 0) return;
2405 if (_ecore_evas_fps_debug_fd >= 0)
2409 snprintf(buf, sizeof(buf), "%s/.ecore_evas_fps_debug-%i",
2410 eina_environment_tmp_get(), (int)getpid());
2412 if (_ecore_evas_fps_rendertime_mmap)
2414 munmap(_ecore_evas_fps_rendertime_mmap, sizeof(int));
2415 _ecore_evas_fps_rendertime_mmap = NULL;
2417 close(_ecore_evas_fps_debug_fd);
2418 _ecore_evas_fps_debug_fd = -1;
2423 _ecore_evas_fps_debug_rendertime_add(double t)
2425 static double rtime = 0.0;
2426 static double rlapse = 0.0;
2427 static int frames = 0;
2428 static int flapse = 0;
2431 tim = ecore_time_get();
2439 else if ((tim - rlapse) >= 0.5)
2441 printf("FRAME: %i, FPS: %3.1f, RTIME %3.0f%%\n",
2443 (frames - flapse) / (tim - rlapse),
2444 (100.0 * rtime) / (tim - rlapse)
2452 static Ecore_Evas *_general_tick = NULL;
2455 ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport)
2459 Efl_Event_Animator_Tick a = { { 0, 0, 0, 0 } };
2463 evas_output_size_get(ee->evas, &a.update_area.w, &a.update_area.h);
2467 a.update_area = *viewport;
2470 efl_event_callback_legacy_call(ee->evas, EFL_EVENT_ANIMATOR_TICK, &a);
2472 // FIXME: We do not support partial animator in the subcanvas
2473 EINA_LIST_FOREACH(ee->sub_ecore_evas, l, subee)
2475 ecore_evas_animator_tick(subee, NULL);
2478 // We are the source of sync for general animator.
2479 if (_general_tick == ee)
2481 // Check first we didn't tick during this loop
2482 if (!ecore_main_loop_animator_ticked_get())
2483 ecore_animator_custom_tick();
2486 DBG("Animator ticked on %p.", ee->evas);
2490 _ecore_evas_tick_source_find(void)
2494 _general_tick = NULL;
2495 EINA_INLIST_FOREACH(ecore_evases, ee)
2496 if (ee->anim_count &&
2497 ee->engine.func->fn_animator_register &&
2498 ee->engine.func->fn_animator_unregister)
2506 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
2510 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
2515 _ecore_evas_animator_fallback(void *data)
2517 ecore_evas_animator_tick(data, NULL);
2522 _check_animator_event_catcher_add(void *data, const Efl_Event *event)
2524 const Efl_Callback_Array_Item *array = event->info;
2525 Ecore_Evas *ee = data;
2528 for (i = 0; array[i].desc != NULL; i++)
2530 if (array[i].desc == EFL_EVENT_ANIMATOR_TICK)
2532 if (ee->anim_count++ > 0) return;
2533 INF("Setting up animator for %p from '%s' with title '%s'.", ee->evas, ee->driver, ee->prop.title);
2535 if (ee->engine.func->fn_animator_register &&
2536 ee->engine.func->fn_animator_unregister)
2538 // Backend support per window vsync
2539 ee->engine.func->fn_animator_register(ee);
2540 if (!_general_tick) _general_tick = ee;
2544 // Backend doesn't support per window vsync, fallback to generic support
2545 ee->anim = ecore_animator_add(_ecore_evas_animator_fallback, ee);
2548 // No need to walk more than once per array as you can not del
2556 _check_animator_event_catcher_del(void *data, const Efl_Event *event)
2558 const Efl_Callback_Array_Item *array = event->info;
2559 Ecore_Evas *ee = data;
2562 for (i = 0; array[i].desc != NULL; i++)
2564 if (array[i].desc == EFL_EVENT_ANIMATOR_TICK)
2566 if ((--ee->anim_count) > 0) return;
2568 INF("Unsetting up animator for %p from '%s' titled '%s'.", ee->evas, ee->driver, ee->prop.title);
2569 if (ee->engine.func->fn_animator_register &&
2570 ee->engine.func->fn_animator_unregister)
2572 // Backend support per window vsync
2573 ee->engine.func->fn_animator_unregister(ee);
2574 if (_general_tick == ee) _ecore_evas_tick_source_find();
2578 // Backend doesn't support per window vsync, fallback to generic support
2579 ecore_animator_del(ee->anim);
2587 EFL_CALLBACKS_ARRAY_DEFINE(animator_watch,
2588 { EFL_EVENT_CALLBACK_ADD, _check_animator_event_catcher_add },
2589 { EFL_EVENT_CALLBACK_DEL, _check_animator_event_catcher_del });
2592 _ecore_evas_register_animators(Ecore_Evas *ee)
2594 efl_event_callback_array_add(ee->evas, animator_watch(), ee);
2598 _ecore_evas_register(Ecore_Evas *ee)
2601 ecore_evases = (Ecore_Evas *)eina_inlist_prepend
2602 (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
2604 _ecore_evas_register_animators(ee);
2606 if (_ecore_evas_render_sync) ecore_evas_first = EINA_TRUE;
2610 _ecore_evas_ref(Ecore_Evas *ee)
2616 _ecore_evas_unref(Ecore_Evas *ee)
2619 if (ee->refcount == 0)
2621 if (ee->deleted) _ecore_evas_free(ee);
2623 else if (ee->refcount < -1)
2624 ERR("Ecore_Evas %p->refcount=%d < 0", ee, ee->refcount);
2628 _ecore_evas_vnc_stop(Ecore_Evas *ee)
2631 void (*vnc_del)(void *);
2633 mod = _ecore_evas_vnc_server_module_load();
2634 EINA_SAFETY_ON_NULL_RETURN_VAL(mod, EINA_FALSE);
2636 vnc_del = eina_module_symbol_get(mod, "ecore_evas_vnc_server_del");
2637 EINA_SAFETY_ON_NULL_RETURN_VAL(vnc_del, EINA_FALSE);
2639 vnc_del(ee->vnc_server);
2640 ee->vnc_server = NULL;
2645 _ecore_evas_free(Ecore_Evas *ee)
2647 Ecore_Evas_Interface *iface;
2649 ee->deleted = EINA_TRUE;
2650 if (ee->refcount > 0) return;
2652 // Stop all vsync first
2653 if (ee->engine.func->fn_animator_register &&
2654 ee->engine.func->fn_animator_unregister)
2656 // Backend support per window vsync
2657 ee->engine.func->fn_animator_unregister(ee);
2658 if (_general_tick == ee) _ecore_evas_tick_source_find();
2661 ecore_animator_del(ee->anim);
2664 if (ee->func.fn_pre_free) ee->func.fn_pre_free(ee);
2665 if (ee->vnc_server) _ecore_evas_vnc_stop(ee);
2666 while (ee->sub_ecore_evas)
2668 _ecore_evas_free(ee->sub_ecore_evas->data);
2670 if (ee->data) eina_hash_free(ee->data);
2672 if (ee->name) free(ee->name);
2674 if (ee->prop.title) free(ee->prop.title);
2675 ee->prop.title = NULL;
2676 if (ee->prop.name) free(ee->prop.name);
2677 ee->prop.name = NULL;
2678 if (ee->prop.clas) free(ee->prop.clas);
2679 ee->prop.clas = NULL;
2680 _ecore_evas_window_profile_free(ee);
2681 ee->prop.profile.name = NULL;
2682 _ecore_evas_window_available_profiles_free(ee);
2683 ee->prop.profile.available_list = NULL;
2684 if (ee->prop.wm_rot.available_rots) free(ee->prop.wm_rot.available_rots);
2685 ee->prop.wm_rot.available_rots = NULL;
2686 if (ee->prop.wm_rot.manual_mode.timer)
2687 ecore_timer_del(ee->prop.wm_rot.manual_mode.timer);
2688 _ecore_evas_aux_hint_free(ee);
2689 ee->prop.wm_rot.manual_mode.timer = NULL;
2690 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2691 ee->prop.cursor.object = NULL;
2692 if (ee->evas) evas_free(ee->evas);
2694 ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
2696 if (ee->engine.idle_flush_timer)
2697 ecore_timer_del(ee->engine.idle_flush_timer);
2698 ee->engine.idle_flush_timer = NULL;
2699 if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee);
2702 ecore_evases = (Ecore_Evas *)eina_inlist_remove
2703 (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
2706 EINA_LIST_FREE(ee->engine.ifaces, iface)
2709 ee->engine.ifaces = NULL;
2714 _ecore_evas_cb_idle_flush(void *data)
2716 Ecore_Evas *ee = data;
2718 ee->engine.idle_flush_timer = NULL;
2719 evas_render_idle_flush(ee->evas);
2720 return ECORE_CALLBACK_CANCEL;
2724 _ecore_evas_async_events_fd_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fd_handler EINA_UNUSED)
2726 evas_async_events_process();
2728 return ECORE_CALLBACK_RENEW;
2732 _ecore_evas_idle_timeout_update(Ecore_Evas *ee)
2734 if (ee->engine.idle_flush_timer)
2735 ecore_timer_del(ee->engine.idle_flush_timer);
2736 ee->engine.idle_flush_timer =
2737 ecore_timer_add(IDLE_FLUSH_TIME, _ecore_evas_cb_idle_flush, ee);
2741 _ecore_evas_mouse_move_process_internal(Ecore_Evas *ee, int x, int y, unsigned int timestamp, Eina_Bool feed)
2747 evas_output_framespace_get(ee->evas, &fx, &fy, &fw, &fh);
2749 if (ee->prop.cursor.object)
2751 evas_object_show(ee->prop.cursor.object);
2752 if (ee->rotation == 0)
2753 evas_object_move(ee->prop.cursor.object,
2754 x - fx - ee->prop.cursor.hot.x,
2755 y - fy - ee->prop.cursor.hot.y);
2756 else if (ee->rotation == 90)
2757 evas_object_move(ee->prop.cursor.object,
2758 ee->h + fw - y - fx - 1 - ee->prop.cursor.hot.x,
2759 x - fy - ee->prop.cursor.hot.y);
2760 else if (ee->rotation == 180)
2761 evas_object_move(ee->prop.cursor.object,
2762 ee->w + fw - x - fx - 1 - ee->prop.cursor.hot.x,
2763 ee->h + fh - y - fy - 1 - ee->prop.cursor.hot.y);
2764 else if (ee->rotation == 270)
2765 evas_object_move(ee->prop.cursor.object,
2766 y - fx - ee->prop.cursor.hot.x,
2767 ee->w + fh - x - fy - 1 - ee->prop.cursor.hot.y);
2770 if (ee->rotation == 0)
2771 evas_event_input_mouse_move(ee->evas, x, y, timestamp, NULL);
2772 else if (ee->rotation == 90)
2773 evas_event_input_mouse_move(ee->evas, ee->h + fw - y - 1, x, timestamp, NULL);
2774 else if (ee->rotation == 180)
2775 evas_event_input_mouse_move(ee->evas, ee->w + fw - x - 1, ee->h + fh - y - 1, timestamp, NULL);
2776 else if (ee->rotation == 270)
2777 evas_event_input_mouse_move(ee->evas, y, ee->w + fh - x - 1, timestamp, NULL);
2781 _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
2783 _ecore_evas_mouse_move_process_internal(ee, x, y, timestamp, EINA_TRUE);
2787 _ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
2790 double radius_x, double radius_y,
2793 double mx, double my,
2794 unsigned int timestamp)
2796 if (ee->rotation == 0)
2797 evas_event_input_multi_move(ee->evas, device,
2802 angle - ee->rotation,
2805 else if (ee->rotation == 90)
2806 evas_event_input_multi_move(ee->evas, device,
2811 angle - ee->rotation,
2814 else if (ee->rotation == 180)
2815 evas_event_input_multi_move(ee->evas, device,
2816 ee->w - x - 1, ee->h - y - 1,
2820 angle - ee->rotation,
2821 ee->w - mx - 1, ee->h - my - 1,
2823 else if (ee->rotation == 270)
2824 evas_event_input_multi_move(ee->evas, device,
2829 angle - ee->rotation,
2835 _ecore_evas_mouse_multi_down_process(Ecore_Evas *ee, int device,
2838 double radius_x, double radius_y,
2841 double mx, double my,
2842 Evas_Button_Flags flags,
2843 unsigned int timestamp)
2845 if (ee->rotation == 0)
2846 evas_event_input_multi_down(ee->evas, device,
2851 angle - ee->rotation,
2853 flags, timestamp, NULL);
2854 else if (ee->rotation == 90)
2855 evas_event_input_multi_down(ee->evas, device,
2860 angle - ee->rotation,
2862 flags, timestamp, NULL);
2863 else if (ee->rotation == 180)
2864 evas_event_input_multi_down(ee->evas, device,
2865 ee->w - x - 1, ee->h - y - 1,
2869 angle - ee->rotation,
2870 ee->w - mx - 1, ee->h - my - 1,
2871 flags, timestamp, NULL);
2872 else if (ee->rotation == 270)
2873 evas_event_input_multi_down(ee->evas, device,
2878 angle - ee->rotation,
2880 flags, timestamp, NULL);
2884 _ecore_evas_mouse_multi_up_process(Ecore_Evas *ee, int device,
2887 double radius_x, double radius_y,
2890 double mx, double my,
2891 Evas_Button_Flags flags,
2892 unsigned int timestamp)
2894 if (ee->rotation == 0)
2895 evas_event_input_multi_up(ee->evas, device,
2900 angle - ee->rotation,
2902 flags, timestamp, NULL);
2903 else if (ee->rotation == 90)
2904 evas_event_input_multi_up(ee->evas, device,
2909 angle - ee->rotation,
2911 flags, timestamp, NULL);
2912 else if (ee->rotation == 180)
2913 evas_event_input_multi_up(ee->evas, device,
2914 ee->w - x - 1, ee->h - y - 1,
2918 angle - ee->rotation,
2919 ee->w - mx - 1, ee->h - my - 1,
2920 flags, timestamp, NULL);
2921 else if (ee->rotation == 270)
2922 evas_event_input_multi_up(ee->evas, device,
2927 angle - ee->rotation,
2929 flags, timestamp, NULL);
2933 _ecore_evas_window_profile_free(Ecore_Evas *ee)
2935 if (ee->prop.profile.name)
2936 eina_stringshare_del(ee->prop.profile.name);
2940 _ecore_evas_window_available_profiles_free(Ecore_Evas *ee)
2942 if (ee->prop.profile.available_list)
2945 for (i = 0; i < ee->prop.profile.count; i++)
2947 if (ee->prop.profile.available_list[i])
2949 eina_stringshare_del(ee->prop.profile.available_list[i]);
2950 ee->prop.profile.available_list[i] = NULL;
2953 free(ee->prop.profile.available_list);
2958 ecore_evas_ecore_evas_list_get(void)
2961 Eina_List *l = NULL;
2963 EINA_INLIST_FOREACH(ecore_evases, ee)
2965 l = eina_list_append(l, ee);
2972 ecore_evas_sub_ecore_evas_list_get(const Ecore_Evas *ee)
2974 ECORE_EVAS_CHECK(ee, NULL);
2975 return ee->sub_ecore_evas;
2979 ecore_evas_input_event_register(Ecore_Evas *ee)
2981 ecore_event_window_register((Ecore_Window)ee, ee, ee->evas,
2982 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2983 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2984 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2985 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2986 _ecore_event_window_direct_cb_set((Ecore_Window)ee, _ecore_evas_input_direct_cb);
2990 ecore_evas_input_event_unregister(Ecore_Evas *ee)
2992 ecore_event_window_unregister((Ecore_Window)ee);
2996 _ecore_evas_aux_hints_string_get(Ecore_Evas *ee)
2998 Eina_Strbuf *buf = eina_strbuf_new();
3001 if (eina_list_count(ee->prop.aux_hint.hints) > 0)
3004 Ecore_Evas_Aux_Hint *aux;
3007 EINA_LIST_FOREACH(ee->prop.aux_hint.hints, l, aux)
3010 if (i > 0) eina_strbuf_append_char(buf, ',');
3011 eina_strbuf_append_printf(buf, "%d:%s:%s", aux->id, aux->hint, aux->val);
3020 _ecore_evas_aux_hint_free(Ecore_Evas *ee)
3023 EINA_LIST_FREE(ee->prop.aux_hint.supported_list, hint)
3025 eina_stringshare_del(hint);
3028 Ecore_Evas_Aux_Hint *aux;
3029 EINA_LIST_FREE(ee->prop.aux_hint.hints, aux)
3031 eina_stringshare_del(aux->hint);
3032 eina_stringshare_del(aux->val);
3038 ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
3040 Ecore_Evas *(*new)(const char *, int, int, int);
3041 Eina_Module *m = _ecore_evas_engine_load("fb");
3042 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3044 new = eina_module_symbol_get(m, "ecore_evas_fb_new_internal");
3045 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3047 return new(disp_name, rotation, w, h);
3051 ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
3053 Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
3054 Eina_Module *m = _ecore_evas_engine_load("x");
3055 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3057 new = eina_module_symbol_get(m, "ecore_evas_software_x11_new_internal");
3058 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3060 return new(disp_name, parent, x, y, w, h);
3064 ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3066 Ecore_Evas_Interface_Software_X11 *iface;
3067 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
3068 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
3070 return iface->window_get(ee);
3074 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3076 Ecore_Evas_Interface_Software_X11 *iface;
3077 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
3078 EINA_SAFETY_ON_NULL_RETURN(iface);
3080 iface->resize_set(ee, on);
3084 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3086 Ecore_Evas_Interface_Software_X11 *iface;
3087 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
3088 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
3090 return iface->resize_get(ee);
3094 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3096 Ecore_Evas_Interface_Software_X11 *iface;
3097 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
3098 EINA_SAFETY_ON_NULL_RETURN(iface);
3100 iface->extra_event_window_add(ee, win);
3104 ecore_evas_software_x11_pixmap_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
3106 Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
3107 Eina_Module *m = _ecore_evas_engine_load("x");
3108 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3110 new = eina_module_symbol_get(m, "ecore_evas_software_x11_pixmap_new_internal");
3111 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3113 return new(disp_name, parent, x, y, w, h);
3117 ecore_evas_software_x11_pixmap_get(const Ecore_Evas *ee)
3119 Ecore_Evas_Interface_Software_X11 *iface;
3120 iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
3121 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
3123 if (iface->pixmap_get)
3124 return iface->pixmap_get(ee);
3130 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
3132 Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
3133 Eina_Module *m = _ecore_evas_engine_load("x");
3134 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3136 new = eina_module_symbol_get(m, "ecore_evas_gl_x11_new_internal");
3137 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3139 return new(disp_name, parent, x, y, w, h);
3143 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, const int *opt)
3145 Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int, const int*);
3146 Eina_Module *m = _ecore_evas_engine_load("x");
3147 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3149 new = eina_module_symbol_get(m, "ecore_evas_gl_x11_options_new_internal");
3150 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3152 return new(disp_name, parent, x, y, w, h, opt);
3156 ecore_evas_gl_x11_pixmap_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
3158 Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
3159 Eina_Module *m = _ecore_evas_engine_load("x");
3160 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3162 new = eina_module_symbol_get(m, "ecore_evas_gl_x11_pixmap_new_internal");
3163 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3165 return new(disp_name, parent, x, y, w, h);
3169 ecore_evas_gl_x11_pixmap_get(const Ecore_Evas *ee)
3171 Ecore_Evas_Interface_Gl_X11 *iface;
3172 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
3173 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
3175 if (iface->pixmap_get)
3176 return iface->pixmap_get(ee);
3182 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3184 Ecore_Evas_Interface_Gl_X11 *iface;
3185 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
3186 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
3188 return iface->window_get(ee);
3192 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3194 Ecore_Evas_Interface_Gl_X11 *iface;
3195 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
3196 EINA_SAFETY_ON_NULL_RETURN(iface);
3198 iface->resize_set(ee, on);
3202 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3204 Ecore_Evas_Interface_Gl_X11 *iface;
3205 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
3206 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
3208 return iface->resize_get(ee);
3212 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3214 Ecore_Evas_Interface_Gl_X11 *iface;
3215 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
3216 EINA_SAFETY_ON_NULL_RETURN(iface);
3218 iface->extra_event_window_add(ee, win);
3222 ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e))
3224 Ecore_Evas_Interface_Gl_X11 *iface;
3225 iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
3226 EINA_SAFETY_ON_NULL_RETURN(iface);
3228 iface->pre_post_swap_callback_set(ee, data, pre_cb, post_cb);
3232 ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
3234 Ecore_Evas_Interface_X11 *iface;
3235 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3236 EINA_SAFETY_ON_NULL_RETURN(iface);
3238 iface->leader_set(ee, win);
3242 ecore_evas_x11_leader_get(Ecore_Evas *ee)
3244 Ecore_Evas_Interface_X11 *iface;
3245 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3246 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
3248 return iface->leader_get(ee);
3252 ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
3254 Ecore_Evas_Interface_X11 *iface;
3255 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3256 EINA_SAFETY_ON_NULL_RETURN(iface);
3258 iface->leader_default_set(ee);
3262 ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
3264 Ecore_Evas_Interface_X11 *iface;
3265 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3266 EINA_SAFETY_ON_NULL_RETURN(iface);
3268 iface->shape_input_rectangle_set(ee, x, y, w, h);
3272 ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
3274 Ecore_Evas_Interface_X11 *iface;
3275 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3276 EINA_SAFETY_ON_NULL_RETURN(iface);
3278 iface->shape_input_rectangle_add(ee, x, y, w, h);
3282 ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
3284 Ecore_Evas_Interface_X11 *iface;
3285 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3286 EINA_SAFETY_ON_NULL_RETURN(iface);
3288 iface->shape_input_rectangle_subtract(ee, x, y, w, h);
3292 ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
3294 Ecore_Evas_Interface_X11 *iface;
3295 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3296 EINA_SAFETY_ON_NULL_RETURN(iface);
3298 iface->shape_input_empty(ee);
3302 ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
3304 Ecore_Evas_Interface_X11 *iface;
3305 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3306 EINA_SAFETY_ON_NULL_RETURN(iface);
3308 iface->shape_input_reset(ee);
3312 ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
3314 Ecore_Evas_Interface_X11 *iface;
3315 iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
3316 EINA_SAFETY_ON_NULL_RETURN(iface);
3318 iface->shape_input_apply(ee);
3322 ecore_evas_vnc_start(Ecore_Evas *ee, const char *addr, int port,
3323 Ecore_Evas_Vnc_Client_Accept_Cb cb, void *data)
3326 void *(*vnc_new)(Ecore_Evas *, int, const char *,
3327 Ecore_Evas_Vnc_Client_Accept_Cb, void *);
3329 EINA_SAFETY_ON_NULL_RETURN_VAL(ee, EINA_FALSE);
3334 mod = _ecore_evas_vnc_server_module_load();
3335 EINA_SAFETY_ON_NULL_RETURN_VAL(mod, EINA_FALSE);
3337 vnc_new = eina_module_symbol_get(mod, "ecore_evas_vnc_server_new");
3338 EINA_SAFETY_ON_NULL_RETURN_VAL(vnc_new, EINA_FALSE);
3340 ee->vnc_server = vnc_new(ee, port, addr, cb, data);
3341 EINA_SAFETY_ON_NULL_RETURN_VAL(ee->vnc_server, EINA_FALSE);
3346 ecore_evas_vnc_stop(Ecore_Evas *ee)
3348 EINA_SAFETY_ON_NULL_RETURN_VAL(ee, EINA_FALSE);
3349 EINA_SAFETY_ON_FALSE_RETURN_VAL(ee->vnc_server, EINA_FALSE);
3351 return _ecore_evas_vnc_stop(ee);
3355 ecore_evas_extn_socket_new(int w, int h)
3357 Ecore_Evas *(*new)(int, int);
3358 Eina_Module *m = _ecore_evas_engine_load("extn");
3359 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3361 new = eina_module_symbol_get(m, "ecore_evas_extn_socket_new_internal");
3362 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3368 ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
3370 Ecore_Evas_Interface_Extn *iface;
3371 iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
3372 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
3374 return iface->listen(ee, svcname, svcnum, svcsys);
3378 ecore_evas_extn_socket_events_block_set(Ecore_Evas *ee, Eina_Bool events_block)
3380 void (*set)(Ecore_Evas*, Eina_Bool);
3381 Eina_Module *m = _ecore_evas_engine_load("extn");
3382 EINA_SAFETY_ON_NULL_RETURN(m);
3384 set = eina_module_symbol_get(m,
3385 "ecore_evas_extn_socket_events_block_set_internal");
3386 EINA_SAFETY_ON_NULL_RETURN(set);
3388 set(ee, events_block);
3392 ecore_evas_extn_socket_events_block_get(Ecore_Evas *ee)
3394 Eina_Bool (*get)(Ecore_Evas*);
3395 Eina_Module *m = _ecore_evas_engine_load("extn");
3396 EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
3398 get = eina_module_symbol_get(m,
3399 "ecore_evas_extn_socket_events_block_get_internal");
3400 EINA_SAFETY_ON_NULL_RETURN_VAL(get, EINA_FALSE);
3406 ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
3408 Ecore_Evas_Interface_Extn *iface;
3411 ee = ecore_evas_object_ecore_evas_get(obj);
3412 EINA_SAFETY_ON_NULL_RETURN(ee);
3414 iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
3415 EINA_SAFETY_ON_NULL_RETURN(iface);
3417 iface->data_lock(ee);
3421 ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
3423 Ecore_Evas_Interface_Extn *iface;
3426 ee = ecore_evas_object_ecore_evas_get(obj);
3427 EINA_SAFETY_ON_NULL_RETURN(ee);
3429 iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
3430 EINA_SAFETY_ON_NULL_RETURN(iface);
3432 iface->data_unlock(ee);
3436 ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
3438 Evas_Object *(*new)(Ecore_Evas *);
3439 Eina_Module *m = _ecore_evas_engine_load("extn");
3440 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3442 new = eina_module_symbol_get(m, "ecore_evas_extn_plug_new_internal");
3443 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3445 return new(ee_target);
3449 ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
3451 Ecore_Evas_Interface_Extn *iface;
3454 ee = ecore_evas_object_ecore_evas_get(obj);
3455 EINA_SAFETY_ON_NULL_RETURN_VAL(ee, EINA_FALSE);
3457 iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
3458 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
3460 return iface->connect(ee, svcname, svcnum, svcsys);
3464 ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen,
3465 int hwsurface, int noframe, int alpha)
3467 Ecore_Evas *(*new)(const char *, int, int, int, int, int, int);
3468 Eina_Module *m = _ecore_evas_engine_load("sdl");
3469 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3471 new = eina_module_symbol_get(m, "ecore_evas_sdl_new_internal");
3472 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3474 return new(name, w, h, fullscreen, hwsurface, noframe, alpha);
3478 ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen,
3479 int hwsurface, int noframe, int alpha)
3481 Ecore_Evas *(*new)(const char *, int, int, int, int, int, int);
3482 Eina_Module *m = _ecore_evas_engine_load("sdl");
3483 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3485 new = eina_module_symbol_get(m, "ecore_evas_sdl16_new_internal");
3486 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3488 return new(name, w, h, fullscreen, hwsurface, noframe, alpha);
3492 ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe)
3494 Ecore_Evas *(*new)(const char *, int, int, int, int);
3495 Eina_Module *m = _ecore_evas_engine_load("sdl");
3496 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3498 new = eina_module_symbol_get(m, "ecore_evas_gl_sdl_new_internal");
3499 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3501 return new(name, w, h, fullscreen, noframe);
3505 ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent,
3506 int x, int y, int w, int h, Eina_Bool frame)
3508 Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool);
3509 Eina_Module *m = _ecore_evas_engine_load("wayland");
3510 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3512 new = eina_module_symbol_get(m, "ecore_evas_wayland_shm_new_internal");
3513 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3515 return new(disp_name, parent, x, y, w, h, frame);
3519 ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent,
3520 int x, int y, int w, int h, Eina_Bool frame)
3522 Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool);
3523 Eina_Module *m = _ecore_evas_engine_load("wayland");
3524 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3526 new = eina_module_symbol_get(m, "ecore_evas_wayland_egl_new_internal");
3527 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3529 return new(disp_name, parent, x, y, w, h, frame);
3533 ecore_evas_wayland_resize(Ecore_Evas *ee, int location)
3535 Ecore_Evas_Interface_Wayland *iface;
3536 iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
3537 EINA_SAFETY_ON_NULL_RETURN(iface);
3539 iface->resize(ee, location);
3543 ecore_evas_wayland_move(Ecore_Evas *ee, int x, int y)
3545 Ecore_Evas_Interface_Wayland *iface;
3546 iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
3547 EINA_SAFETY_ON_NULL_RETURN(iface);
3549 iface->move(ee, x, y);
3553 ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y)
3555 Ecore_Evas_Interface_Wayland *iface;
3556 iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
3557 EINA_SAFETY_ON_NULL_RETURN(iface);
3559 iface->pointer_set(ee, hot_x, hot_y);
3563 ecore_evas_wayland_type_set(Ecore_Evas *ee, int type)
3565 Ecore_Evas_Interface_Wayland *iface;
3566 iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
3567 EINA_SAFETY_ON_NULL_RETURN(iface);
3569 iface->type_set(ee, type);
3572 EAPI Ecore_Wl_Window *
3573 ecore_evas_wayland_window_get(const Ecore_Evas *ee)
3575 Ecore_Evas_Interface_Wayland *iface;
3576 iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
3577 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
3579 return iface->window_get(ee);
3582 EAPI Ecore_Cocoa_Window *
3583 ecore_evas_cocoa_window_get(const Ecore_Evas *ee)
3585 Ecore_Evas_Interface_Cocoa *iface;
3586 iface = (Ecore_Evas_Interface_Cocoa *)_ecore_evas_interface_get(ee, "opengl_cocoa");
3587 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
3588 return iface->window_get(ee);
3591 EAPI Ecore_Wl2_Window *
3592 ecore_evas_wayland2_window_get(const Ecore_Evas *ee)
3594 Ecore_Evas_Interface_Wayland *iface;
3595 iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
3596 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
3598 return iface->window2_get(ee);
3602 ecore_evas_drm_new(const char *disp_name, unsigned int parent,
3603 int x, int y, int w, int h)
3605 Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int);
3606 Eina_Module *m = _ecore_evas_engine_load("drm");
3607 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3609 new = eina_module_symbol_get(m, "ecore_evas_drm_new_internal");
3610 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3612 return new(disp_name, parent, x, y, w, h);
3616 ecore_evas_gl_drm_new(const char *disp_name, unsigned int parent,
3617 int x, int y, int w, int h)
3619 Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int);
3620 Eina_Module *m = _ecore_evas_engine_load("drm");
3621 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3623 new = eina_module_symbol_get(m, "ecore_evas_gl_drm_new_internal");
3624 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3626 return new(disp_name, parent, x, y, w, h);
3630 ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
3636 Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
3637 Eina_Module *m = _ecore_evas_engine_load("win32");
3638 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3640 new = eina_module_symbol_get(m, "ecore_evas_software_gdi_new_internal");
3641 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3643 return new(parent, x, y, width, height);
3647 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
3653 Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
3654 Eina_Module *m = _ecore_evas_engine_load("win32");
3655 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3657 new = eina_module_symbol_get(m, "ecore_evas_software_ddraw_new_internal");
3658 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3660 return new(parent, x, y, width, height);
3663 EAPI Ecore_Win32_Window *
3664 ecore_evas_win32_window_get(const Ecore_Evas *ee)
3666 Ecore_Evas_Interface_Win32 *iface;
3667 iface = (Ecore_Evas_Interface_Win32 *)_ecore_evas_interface_get(ee, "win32");
3668 EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
3670 return iface->window_get(ee);
3674 ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
3676 Ecore_Evas *(*new)(Ecore_Cocoa_Window *, int, int, int, int);
3677 Eina_Module *m = _ecore_evas_engine_load("cocoa");
3678 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3680 new = eina_module_symbol_get(m, "ecore_evas_cocoa_new_internal");
3681 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3683 return new(parent, x, y, w, h);
3687 ecore_evas_psl1ght_new(const char* name, int w, int h)
3689 Ecore_Evas *(*new)(const char*, int, int);
3690 Eina_Module *m = _ecore_evas_engine_load("psl1ght");
3691 EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
3693 new = eina_module_symbol_get(m, "ecore_evas_psl1ght_new_internal");
3694 EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
3696 return new(name, w, h);
3700 /* new input model with eo:
3701 * 1. pass all events from ecore_input_evas through
3702 * ecore_evas and send eo events from here
3703 * 2. those eo events can then be translated to legacy by evas
3704 * 3. let evas send legacy & eo events to the objects
3707 #define EVENT_XY_SET(EV, MX, MY, FX, FY) do { \
3708 EV->cur.x = (MX) - (FX); EV->cur.y = (MY) - (FY); \
3712 _pointer_position_set(Efl_Input_Pointer_Data *ev, Ecore_Evas *ee, int x, int y,
3713 double mx, double my)
3723 evas_output_framespace_get(ee->evas, &fx, &fy, &fw, &fh);
3724 if (ee->rotation == 0)
3725 EVENT_XY_SET(ev, mx, my, fx, fy);
3726 else if (ee->rotation == 90)
3727 EVENT_XY_SET(ev, ee->h + fw - my - 1, mx, fx, fy);
3728 else if (ee->rotation == 180)
3729 EVENT_XY_SET(ev, ee->w + fw - mx - 1, ee->h + fh - my - 1, fx, fy);
3730 else if (ee->rotation == 270)
3731 EVENT_XY_SET(ev, my, ee->w + fh - mx - 1, fx, fy);
3734 static const Efl_Event_Description *
3735 _event_description_get(Efl_Pointer_Action action)
3739 case EFL_POINTER_ACTION_MOVE:
3740 return EFL_EVENT_POINTER_MOVE;
3741 case EFL_POINTER_ACTION_DOWN:
3742 return EFL_EVENT_POINTER_DOWN;
3743 case EFL_POINTER_ACTION_UP:
3744 return EFL_EVENT_POINTER_UP;
3745 case EFL_POINTER_ACTION_CANCEL:
3746 return EFL_EVENT_POINTER_CANCEL;
3747 case EFL_POINTER_ACTION_IN:
3748 return EFL_EVENT_POINTER_IN;
3749 case EFL_POINTER_ACTION_OUT:
3750 return EFL_EVENT_POINTER_OUT;
3751 case EFL_POINTER_ACTION_WHEEL:
3752 return EFL_EVENT_POINTER_WHEEL;
3753 case EFL_POINTER_ACTION_AXIS:
3754 return EFL_EVENT_POINTER_AXIS;
3755 default: return NULL;
3760 _direct_mouse_updown(Ecore_Evas *ee, const Ecore_Event_Mouse_Button *info, Efl_Pointer_Action action)
3762 Efl_Input_Pointer_Data *ev;
3763 Efl_Input_Pointer *evt;
3765 Eina_Bool processed;
3767 /* Unused information:
3773 * modifiers (already passed to evas, no need to do anything)
3776 evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, e, (void **) &ev);
3777 if (!evt) return EINA_FALSE;
3779 ev->action = action;
3780 ev->button = info->buttons;
3781 if (info->double_click) ev->button_flags |= EFL_POINTER_FLAGS_DOUBLE_CLICK;
3782 if (info->triple_click) ev->button_flags |= EFL_POINTER_FLAGS_TRIPLE_CLICK;
3783 ev->timestamp = info->timestamp;
3784 ev->tool = info->multi.device;
3785 _pointer_position_set(ev, ee, info->x, info->y, info->multi.x, info->multi.y);
3786 ev->radius = info->multi.radius;
3787 ev->radius_x = info->multi.radius_x;
3788 ev->radius_y = info->multi.radius_y;
3789 ev->pressure = info->multi.pressure;
3790 ev->angle = info->multi.angle - ee->rotation;
3792 efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt);
3793 processed = ev->evas_done;
3800 _direct_mouse_down_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Button *info)
3802 return _direct_mouse_updown(ee, info, EFL_POINTER_ACTION_DOWN);
3806 _direct_mouse_up_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Button *info)
3808 return _direct_mouse_updown(ee, info, EFL_POINTER_ACTION_UP);
3812 _direct_mouse_cancel_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Button *info)
3814 return _direct_mouse_updown(ee, info, EFL_POINTER_ACTION_CANCEL);
3818 _direct_mouse_move_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Move *info)
3820 Efl_Input_Pointer_Data *ev;
3821 Efl_Input_Pointer *evt;
3823 Eina_Bool processed;
3825 _ecore_evas_mouse_move_process_internal(ee, info->x, info->y, info->timestamp, EINA_FALSE);
3827 /* Unused information:
3833 * modifiers (already passed to evas, no need to do anything)
3836 evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, e, (void **) &ev);
3837 if (!evt) return EINA_FALSE;
3839 ev->action = EFL_POINTER_ACTION_MOVE;
3840 ev->timestamp = info->timestamp;
3841 ev->tool = info->multi.device;
3842 _pointer_position_set(ev, ee, info->x, info->y, info->multi.x, info->multi.y);
3844 ev->radius = info->multi.radius;
3845 ev->radius_x = info->multi.radius_x;
3846 ev->radius_y = info->multi.radius_y;
3847 ev->pressure = info->multi.pressure;
3848 ev->angle = info->multi.angle - ee->rotation;
3850 efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt);
3851 processed = ev->evas_done;
3858 _direct_mouse_wheel_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Wheel *info)
3860 Efl_Input_Pointer_Data *ev;
3861 Efl_Input_Pointer *evt;
3863 Eina_Bool processed;
3865 /* Unused information:
3870 * modifiers (already passed to evas, no need to do anything)
3873 evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, e, (void **) &ev);
3874 if (!evt) return EINA_FALSE;
3876 ev->action = EFL_POINTER_ACTION_WHEEL;
3877 ev->timestamp = info->timestamp;
3878 _pointer_position_set(ev, ee, info->x, info->y, info->x, info->y);
3879 ev->wheel.z = info->z;
3880 ev->wheel.dir = info->direction ? EFL_ORIENT_HORIZONTAL : EFL_ORIENT_VERTICAL;
3882 efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt);
3883 processed = ev->evas_done;
3890 _direct_mouse_inout(Ecore_Evas *ee, const Ecore_Event_Mouse_IO *info, Efl_Pointer_Action action)
3892 Efl_Input_Pointer_Data *ev;
3893 Efl_Input_Pointer *evt;
3895 Eina_Bool processed;
3897 /* Unused information:
3899 * modifiers (already passed to evas, no need to do anything)
3902 evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, e, (void **) &ev);
3903 if (!evt) return EINA_FALSE;
3905 ev->action = action;
3906 ev->timestamp = info->timestamp;
3907 _pointer_position_set(ev, ee, info->x, info->y, info->x, info->y);
3909 efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt);
3910 processed = ev->evas_done;
3917 _direct_mouse_in_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_IO *info)
3919 return _direct_mouse_inout(ee, info, EFL_POINTER_ACTION_IN);
3923 _direct_mouse_out_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_IO *info)
3925 return _direct_mouse_inout(ee, info, EFL_POINTER_ACTION_OUT);
3929 _direct_axis_update_cb(Ecore_Evas *ee, const Ecore_Event_Axis_Update *info)
3931 Eina_Bool haswinx = 0, haswiny = 0;
3932 Efl_Input_Pointer_Data *ev;
3933 Efl_Input_Pointer *evt;
3935 Eina_Bool processed;
3936 double x = 0, y = 0;
3939 /* Unused information:
3940 * window, root_window, event_window
3943 evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, e, (void **) &ev);
3944 if (!ev) return EINA_FALSE;
3946 ev->action = EFL_POINTER_ACTION_AXIS;
3947 ev->timestamp = info->timestamp;
3948 ev->tool = info->toolid;
3950 // see also evas_events.c
3951 for (n = 0; n < info->naxis; n++)
3953 const Ecore_Axis *axis = &(info->axis[n]);
3954 switch (axis->label)
3956 case EVAS_AXIS_LABEL_WINDOW_X:
3957 _efl_input_value_mark(ev, EFL_INPUT_VALUE_X);
3959 haswinx = EINA_TRUE;
3962 case EVAS_AXIS_LABEL_WINDOW_Y:
3963 _efl_input_value_mark(ev, EFL_INPUT_VALUE_Y);
3965 haswiny = EINA_TRUE;
3968 case EVAS_AXIS_LABEL_X:
3971 _efl_input_value_mark(ev, EFL_INPUT_VALUE_X);
3974 ev->raw.x = axis->value;
3975 ev->has_raw = EINA_TRUE;
3978 case EVAS_AXIS_LABEL_Y:
3981 _efl_input_value_mark(ev, EFL_INPUT_VALUE_Y);
3984 ev->raw.y = axis->value;
3985 ev->has_raw = EINA_TRUE;
3988 case EVAS_AXIS_LABEL_NORMAL_X:
3989 ev->norm.x = axis->value;
3990 ev->has_norm = EINA_TRUE;
3993 case EVAS_AXIS_LABEL_NORMAL_Y:
3994 ev->norm.y = axis->value;
3995 ev->has_norm = EINA_TRUE;
3998 case EVAS_AXIS_LABEL_PRESSURE:
3999 _efl_input_value_mark(ev, EFL_INPUT_VALUE_PRESSURE);
4000 ev->pressure = axis->value;
4003 case EVAS_AXIS_LABEL_DISTANCE:
4004 _efl_input_value_mark(ev, EFL_INPUT_VALUE_DISTANCE);
4005 ev->distance = axis->value;
4008 case EVAS_AXIS_LABEL_AZIMUTH:
4009 _efl_input_value_mark(ev, EFL_INPUT_VALUE_AZIMUTH);
4010 ev->azimuth = axis->value;
4013 case EVAS_AXIS_LABEL_TILT:
4014 _efl_input_value_mark(ev, EFL_INPUT_VALUE_TILT);
4015 ev->tilt = axis->value;
4018 case EVAS_AXIS_LABEL_TWIST:
4019 _efl_input_value_mark(ev, EFL_INPUT_VALUE_TWIST);
4020 ev->twist = axis->value;
4023 case EVAS_AXIS_LABEL_UNKNOWN:
4024 case EVAS_AXIS_LABEL_TOUCH_WIDTH_MAJOR:
4025 case EVAS_AXIS_LABEL_TOUCH_WIDTH_MINOR:
4026 case EVAS_AXIS_LABEL_TOOL_WIDTH_MAJOR:
4027 case EVAS_AXIS_LABEL_TOOL_WIDTH_MINOR:
4029 DBG("Unsupported axis label %d, value %f (discarded)",
4030 axis->label, axis->value);
4034 _pointer_position_set(ev, ee, x, y, x, y);
4036 efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt);
4037 processed = ev->evas_done;
4044 _direct_key_updown_cb(Ecore_Evas *ee, const Ecore_Event_Key *info, Eina_Bool down)
4046 Efl_Input_Key_Data *ev;
4049 Eina_Bool processed;
4051 /* Unused information:
4056 * modifiers (already passed to evas, no need to do anything)
4059 evt = efl_input_instance_get(EFL_INPUT_KEY_CLASS, e, (void **) &ev);
4060 if (!evt || !ev) return EINA_FALSE;
4062 ev->timestamp = info->timestamp;
4064 eina_stringshare_replace(&ev->keyname, info->keyname);
4065 eina_stringshare_replace(&ev->key, info->key);
4066 eina_stringshare_replace(&ev->string, info->string);
4067 eina_stringshare_replace(&ev->compose, info->compose);
4068 ev->keycode = info->keycode;
4069 ev->data = info->data;
4070 ev->event_flags = 0;
4071 ev->device = NULL; /* FIXME */
4074 efl_event_callback_legacy_call(e, EFL_EVENT_KEY_DOWN, evt);
4076 efl_event_callback_legacy_call(e, EFL_EVENT_KEY_UP, evt);
4078 processed = ev->evas_done;
4085 _ecore_evas_input_direct_cb(void *window, int type, const void *info)
4087 Ecore_Evas *ee = window;
4089 if (type == ECORE_EVENT_MOUSE_MOVE)
4090 return _direct_mouse_move_cb(ee, (const Ecore_Event_Mouse_Move *) info);
4091 else if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
4092 return _direct_mouse_down_cb(ee, (const Ecore_Event_Mouse_Button *) info);
4093 else if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
4094 return _direct_mouse_up_cb(ee, (const Ecore_Event_Mouse_Button *) info);
4095 else if (type == ECORE_EVENT_MOUSE_WHEEL)
4096 return _direct_mouse_wheel_cb(ee, (const Ecore_Event_Mouse_Wheel *) info);
4097 else if (type == ECORE_EVENT_MOUSE_IN)
4098 return _direct_mouse_in_cb(ee, (const Ecore_Event_Mouse_IO *) info);
4099 else if (type == ECORE_EVENT_MOUSE_OUT)
4100 return _direct_mouse_out_cb(ee, (const Ecore_Event_Mouse_IO *) info);
4101 else if (type == ECORE_EVENT_KEY_DOWN)
4102 return _direct_key_updown_cb(ee, (const Ecore_Event_Key *) info, EINA_TRUE);
4103 else if (type == ECORE_EVENT_KEY_UP)
4104 return _direct_key_updown_cb(ee, (const Ecore_Event_Key *) info, EINA_FALSE);
4105 else if (type == ECORE_EVENT_MOUSE_BUTTON_CANCEL)
4106 return _direct_mouse_cancel_cb(ee, (const Ecore_Event_Mouse_Button *) info);
4107 else if (type == ECORE_EVENT_AXIS_UPDATE)
4108 return _direct_axis_update_cb(ee, (const Ecore_Event_Axis_Update *) info);
4111 ERR("unhandled input event type %d", type);