installed_ecoreevasmainheadersdir = $(includedir)/ecore-@VMAJ@
dist_installed_ecoreevasmainheaders_DATA = \
+lib/ecore_evas/Ecore_Evas_Types.h \
lib/ecore_evas/Ecore_Evas.h
lib_ecore_evas_libecore_evas_la_SOURCES = \
lib/ecore_evas/ecore_evas.c \
-lib/ecore_evas/ecore_evas_util.c \
-lib/ecore_evas/ecore_evas_x.c \
-lib/ecore_evas/ecore_evas_fb.c \
-lib/ecore_evas/ecore_evas_buffer.c \
lib/ecore_evas/ecore_evas_deprecated.c \
-lib/ecore_evas/ecore_evas_win32.c \
-lib/ecore_evas/ecore_evas_sdl.c \
-lib/ecore_evas/ecore_evas_cocoa.c \
lib/ecore_evas/ecore_evas_ews.c \
-lib/ecore_evas/ecore_evas_psl1ght.c \
-lib/ecore_evas/ecore_evas_wayland_shm.c \
-lib/ecore_evas/ecore_evas_wayland_egl.c \
-lib/ecore_evas/ecore_evas_extn.c \
+lib/ecore_evas/ecore_evas_util.c \
+lib/ecore_evas/ecore_evas_module.c \
lib/ecore_evas/ecore_evas_private.h
-if HAVE_ECORE_WAYLAND
-lib_ecore_evas_libecore_evas_la_SOURCES += \
-lib/ecore_evas/ecore_evas_wayland_common.c
-endif
-
lib_ecore_evas_libecore_evas_la_CPPFLAGS = \
-I$(top_srcdir)/src/lib/eina \
-I$(top_srcdir)/src/lib/eo \
-I$(top_builddir)/src/lib/ecore_input_evas \
-I$(top_builddir)/src/lib/ecore_evas \
-I$(top_builddir)/src/modules/evas/engines/buffer \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
-DEFL_ECORE_EVAS_BUILD \
@EFL_CFLAGS@ \
@EFL_COV_CFLAGS@
-if HAVE_ECORE_COCOA
+if HAVE_WINDOWS
lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
+-I$(top_srcdir)/src/lib/evil \
+-I$(top_builddir)/src/lib/evil
+endif
+
+lib_ecore_evas_libecore_evas_la_LIBADD = \
+lib/ecore_input/libecore_input_evas.la \
+lib/ecore_input/libecore_input.la \
+lib/ecore_ipc/libecore_ipc.la \
+lib/ecore/libecore.la \
+lib/evas/libevas.la \
+lib/eo/libeo.la \
+lib/eina/libeina.la \
+@ECORE_EVAS_LIBS@
+
+lib_ecore_evas_libecore_evas_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
+
+# Engines
+
+if BUILD_ENGINE_BUFFER
+BUFFERSOURCES = \
+modules/ecore_evas/engines/buffer/ecore_evas_buffer.c \
+modules/ecore_evas/engines/buffer/ecore_evas_extn.c \
+modules/ecore_evas/engines/buffer/ecore_evas_buffer_private.h
+ecoreevasenginebufferpkgdir = $(libdir)/ecore_evas/engines/buffer/$(MODULE_ARCH)
+ecoreevasenginebufferpkg_LTLIBRARIES = modules/ecore_evas/engines/buffer/module.la
+modules_ecore_evas_engines_buffer_module_la_SOURCES = $(BUFFERSOURCES)
+modules_ecore_evas_engines_buffer_module_la_CPPFLAGS = $(lib_ecore_evas_libecore_evas_la_CPPFLAGS)
+modules_ecore_evas_engines_buffer_module_la_LIBADD = lib/ecore_evas/libecore_evas.la @EFL_LIBS@
+modules_ecore_evas_engines_buffer_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_buffer_module_la_LIBTOOLFLAGS = --tag=disable-static
+endif
+
+if HAVE_ECORE_X
+XSOURCES = modules/ecore_evas/engines/x/ecore_evas_x.c
+ecoreevasenginexpkgdir = $(libdir)/ecore_evas/engines/x/$(MODULE_ARCH)
+ecoreevasenginexpkg_LTLIBRARIES = modules/ecore_evas/engines/x/module.la
+modules_ecore_evas_engines_x_module_la_SOURCES = $(XSOURCES)
+modules_ecore_evas_engines_x_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
+-I$(top_srcdir)/src/lib/ecore_x \
+-I$(top_srcdir)/src/modules/evas/engines/software_x11 \
+-I$(top_srcdir)/src/modules/evas/engines/gl_x11 \
+-I$(top_builddir)/src/lib/ecore_x \
+-I$(top_builddir)/src/modules/evas/engines/software_x11 \
+-I$(top_builddir)/src/modules/evas/engines/gl_x11
+modules_ecore_evas_engines_x_module_la_LIBADD = \
+lib/ecore_evas/libecore_evas.la @EFL_LIBS@ \
+lib/ecore_x/libecore_x.la
+modules_ecore_evas_engines_x_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_x_module_la_LIBTOOLFLAGS = --tag=disable-static
+endif
+
+if HAVE_ECORE_COCOA
+COCOASOURCES = modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
+ecoreevasenginecocoapkgdir = $(libdir)/ecore_evas/engines/cocoa/$(MODULE_ARCH)
+ecoreevasenginecocoapkg_LTLIBRARIES = modules/ecore_evas/engines/cocoa/module.la
+modules_ecore_evas_engines_cocoa_module_la_SOURCES = $(COCOASOURCES)
+modules_ecore_evas_engines_cocoa_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
-I$(top_srcdir)/src/lib/ecore_cocoa \
-I$(top_srcdir)/src/modules/evas/engines/gl_cocoa \
-I$(top_builddir)/src/lib/ecore_cocoa \
-I$(top_builddir)/src/modules/evas/engines/gl_cocoa
+modules_ecore_evas_engines_cocoa_module_la_LIBADD = \
+lib/ecore_evas/libecore_evas.la @EFL_LIBS@ \
+lib/ecore_cocoa/libecore_cocoa.la
+modules_ecore_evas_engines_cocoa_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_cocoa_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
if HAVE_ECORE_FB
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
+FBSOURCES = modules/ecore_evas/engines/fb/ecore_evas_fb.c
+ecoreevasenginefbpkgdir = $(libdir)/ecore_evas/engines/fb/$(MODULE_ARCH)
+ecoreevasenginefbpkg_LTLIBRARIES = modules/ecore_evas/engines/fb/module.la
+modules_ecore_evas_engines_fb_module_la_SOURCES = $(FBSOURCES)
+modules_ecore_evas_engines_fb_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
-I$(top_srcdir)/src/lib/ecore_fb \
-I$(top_srcdir)/src/modules/evas/engines/fb \
-I$(top_builddir)/src/lib/ecore_fb \
-I$(top_builddir)/src/modules/evas/engines/fb
+modules_ecore_evas_engines_fb_module_la_LIBADD = \
+lib/ecore_evas/libecore_evas.la @EFL_LIBS@ \
+lib/ecore_fb/libecore_fb.la
+modules_ecore_evas_engines_fb_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_fb_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
if HAVE_PS3
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
+PSL1GHTSOURCES = modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
+ecoreevasenginepsl1ghtpkgdir = $(libdir)/ecore_evas/engines/psl1ght/$(MODULE_ARCH)
+ecoreevasenginepsl1ghtpkg_LTLIBRARIES = modules/ecore_evas/engines/psl1ght/module.la
+modules_ecore_evas_engines_psl1ght_module_la_SOURCES = $(PSL1GHTSOURCES)
+modules_ecore_evas_engines_psl1ght_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
-I$(top_srcdir)/src/lib/ecore_psl1ght \
-I$(top_srcdir)/src/modules/evas/engines/psl1ght \
-I$(top_builddir)/src/lib/ecore_psl1ght \
-I$(top_builddir)/src/modules/evas/engines/psl1ght
-endif
-
-if HAVE_ECORE_SDL
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
--I$(top_srcdir)/src/lib/ecore_sdl \
--I$(top_srcdir)/src/modules/evas/engines/gl_sdl \
--I$(top_builddir)/src/lib/ecore_sdl \
--I$(top_builddir)/src/modules/evas/engines/gl_sdl
+modules_ecore_evas_engines_psl1ght_module_la_LIBADD = \
+lib/ecore_evas/libecore_evas.la @EFL_LIBS@ \
+lib/ecore_psl1ght/libecore_psl1ght.la
+modules_ecore_evas_engines_psl1ght_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_psl1ght_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
if HAVE_ECORE_WAYLAND
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
+WAYLANDSOURCES = \
+modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c \
+modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c \
+modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c \
+modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h
+ecoreevasenginewaylandpkgdir = $(libdir)/ecore_evas/engines/wayland/$(MODULE_ARCH)
+ecoreevasenginewaylandpkg_LTLIBRARIES = modules/ecore_evas/engines/wayland/module.la
+modules_ecore_evas_engines_wayland_module_la_SOURCES = $(WAYLANDSOURCES)
+modules_ecore_evas_engines_wayland_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
-I$(top_srcdir)/src/lib/ecore_wayland \
-I$(top_srcdir)/src/modules/evas/engines/wayland_shm \
-I$(top_srcdir)/src/modules/evas/engines/wayland_egl \
-I$(top_builddir)/src/lib/ecore_wayland \
-I$(top_builddir)/src/modules/evas/engines/wayland_shm \
--I$(top_builddir)/src/modules/evas/engines/wayland_egl
+-I$(top_builddir)/src/modules/evas/engines/wayland_egl \
+@ECORE_WAYLAND_CFLAGS@
+modules_ecore_evas_engines_wayland_module_la_LIBADD = \
+lib/ecore_evas/libecore_evas.la @EFL_LIBS@ \
+lib/ecore_wayland/libecore_wayland.la
+modules_ecore_evas_engines_wayland_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_wayland_module_la_LIBTOOLFLAGS = --tag=disable-static
+endif
+
+if HAVE_ECORE_SDL
+SDLSOURCES = \
+modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
+ecoreevasenginesdlpkgdir = $(libdir)/ecore_evas/engines/sdl/$(MODULE_ARCH)
+ecoreevasenginesdlpkg_LTLIBRARIES = modules/ecore_evas/engines/sdl/module.la
+modules_ecore_evas_engines_sdl_module_la_SOURCES = $(SDLSOURCES)
+modules_ecore_evas_engines_sdl_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
+-I$(top_srcdir)/src/lib/ecore_sdl \
+-I$(top_srcdir)/src/modules/evas/engines/gl_sdl \
+-I$(top_builddir)/src/lib/ecore_sdl \
+-I$(top_builddir)/src/modules/evas/engines/gl_sdl
+modules_ecore_evas_engines_sdl_module_la_LIBADD = \
+lib/ecore_evas/libecore_evas.la @EFL_LIBS@ \
+lib/ecore_sdl/libecore_sdl.la
+modules_ecore_evas_engines_sdl_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_sdl_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
if HAVE_WIN32
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
+WIN32SOURCES = \
+modules/ecore_evas/engines/win32/ecore_evas_win32.c
+ecoreevasengineswin32pkgdir = $(libdir)/ecore_evas/engines/win32/$(MODULE_ARCH)
+ecoreevasengineswin32pkg_LTLIBRARIES = modules/ecore_evas/engines/win32/module.la
+modules_ecore_evas_engines_win32_module_la_SOURCES = $(WIN32SOURCES)
+modules_ecore_evas_engines_win32_module_la_CPPFLAGS = \
+$(lib_ecore_evas_libecore_evas_la_CPPFLAGS) \
-I$(top_srcdir)/src/lib/ecore_win32 \
-I$(top_srcdir)/src/modules/evas/engines/software_ddraw \
-I$(top_srcdir)/src/modules/evas/engines/software_gdi \
-I$(top_builddir)/src/lib/ecore_win32 \
-I$(top_builddir)/src/modules/evas/engines/software_ddraw \
-I$(top_builddir)/src/modules/evas/engines/software_gdi
-endif
-
-if HAVE_WINCE
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
--I$(top_srcdir)/src/lib/ecore_wince \
--I$(top_builddir)/src/lib/ecore_wince
-endif
-
-if HAVE_ECORE_X
-lib_ecore_evas_libecore_evas_la_CPPFLAGS += \
--I$(top_srcdir)/src/lib/ecore_x \
--I$(top_srcdir)/src/modules/evas/engines/software_x11 \
--I$(top_srcdir)/src/modules/evas/engines/gl_x11 \
--I$(top_builddir)/src/lib/ecore_x \
--I$(top_builddir)/src/modules/evas/engines/software_x11 \
--I$(top_builddir)/src/modules/evas/engines/gl_x11
-endif
-
-lib_ecore_evas_libecore_evas_la_LIBADD = \
-lib/ecore_input/libecore_input_evas.la \
-lib/ecore_input/libecore_input.la \
-lib/ecore_ipc/libecore_ipc.la \
-lib/ecore/libecore.la \
-lib/evas/libevas.la \
-lib/eo/libeo.la \
-lib/eina/libeina.la \
-@ECORE_EVAS_LIBS@
-
-if HAVE_ECORE_COCOA
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_cocoa/libecore_cocoa.la
-endif
-
-if HAVE_ECORE_FB
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_fb/libecore_fb.la
-endif
-
-if HAVE_PS3
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_psl1ght/libecore_psl1ght.la
-endif
-
-if HAVE_ECORE_SDL
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_sdl/libecore_sdl.la
-endif
-
-if HAVE_ECORE_WAYLAND
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_wayland/libecore_wayland.la
-endif
-
-if HAVE_WIN32
-lib_ecore_evas_libecore_evas_la_LIBADD += \
+modules_ecore_evas_engines_win32_module_la_LIBADD = \
+lib/ecore/libeecore_evas.la @EFL_LIBS@ \
lib/ecore_win32/libecore_win32.la
+modules_ecore_evas_engines_win32_module_la_LDFLAGS = -no-undefined -module -avoid-version
+modules_ecore_evas_engines_win32_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
-
-if HAVE_WINCE
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_wince/libecore_wince.la
-endif
-
-if HAVE_ECORE_X
-lib_ecore_evas_libecore_evas_la_LIBADD += \
-lib/ecore_x/libecore_x.la
-endif
-
-lib_ecore_evas_libecore_evas_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
#ifndef _ECORE_EVAS_H
#define _ECORE_EVAS_H
+#include "Ecore_Evas_Types.h"
+
#include <Evas.h>
#include <Ecore_Getopt.h>
#include <Ecore_Input.h>
ECORE_EVAS_OBJECT_ASSOCIATE_DEL = 1 << 2
} Ecore_Evas_Object_Associate_Flags;
-#ifndef _ECORE_X_H
-#define _ECORE_X_WINDOW_PREDEF
-typedef unsigned int Ecore_X_Window;
-#endif
-
-#ifndef _ECORE_DIRECTFB_H
-#define _ECORE_DIRECTFB_WINDOW_PREDEF
-typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
-#endif
-
-#ifndef __ECORE_WIN32_H__
-typedef struct _Ecore_Win32_Window Ecore_Win32_Window;
-#endif
-
-#ifndef __ECORE_WINCE_H__
-typedef struct _Ecore_WinCE_Window Ecore_WinCE_Window;
-#endif
-
-#ifndef __ECORE_COCOA_H__
-typedef struct _Ecore_Cocoa_Window Ecore_Cocoa_Window;
-#endif
-
-#ifndef _ECORE_EVAS_PRIVATE_H
-/* basic data types */
-typedef struct _Ecore_Evas Ecore_Evas;
-typedef void (*Ecore_Evas_Event_Cb) (Ecore_Evas *ee); /**< Callback used for several ecore evas events @since 1.2 */
-#endif
-
-#ifndef _ECORE_WAYLAND_H_
-#define _ECORE_WAYLAND_WINDOW_PREDEF
-typedef struct _Ecore_Wl_Window Ecore_Wl_Window;
-#endif
-
/* module setup/shutdown calls */
EAPI int ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine);
--- /dev/null
+#ifndef _ECORE_EVAS_TYPES_H_
+#define _ECORE_EVAS_TYPES_H_
+
+#ifndef _ECORE_X_H
+#define _ECORE_X_WINDOW_PREDEF
+typedef unsigned int Ecore_X_Window;
+#endif
+
+#ifndef _ECORE_DIRECTFB_H
+#define _ECORE_DIRECTFB_WINDOW_PREDEF
+typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
+#endif
+
+#ifndef __ECORE_WIN32_H__
+typedef struct _Ecore_Win32_Window Ecore_Win32_Window;
+#endif
+
+#ifndef __ECORE_WINCE_H__
+typedef struct _Ecore_WinCE_Window Ecore_WinCE_Window;
+#endif
+
+#ifndef __ECORE_COCOA_H__
+typedef struct _Ecore_Cocoa_Window Ecore_Cocoa_Window;
+#endif
+
+#ifndef _ECORE_EVAS_PRIVATE_H
+/* basic data types */
+typedef struct _Ecore_Evas Ecore_Evas;
+typedef void (*Ecore_Evas_Event_Cb) (Ecore_Evas *ee); /**< Callback used for several ecore evas events @since 1.2 */
+#endif
+
+#ifndef _ECORE_WAYLAND_H_
+#define _ECORE_WAYLAND_WINDOW_PREDEF
+typedef struct _Ecore_Wl_Window Ecore_Wl_Window;
+#endif
+
+
+#endif /* _ECORE_EVAS_TYPES_H_ */
return ECORE_CALLBACK_RENEW;
}
+Ecore_Evas_Interface *
+_ecore_evas_interface_get(const Ecore_Evas *ee, const char *iname)
+{
+ Eina_List *l;
+ Ecore_Evas_Interface *i;
+
+ if (!ee || !iname) return NULL;
+
+ EINA_LIST_FOREACH(ee->engine.ifaces, l, i)
+ {
+ if (!strcmp(i->name, iname))
+ return i;
+ }
+
+ return NULL;
+}
+
/**
* Query if a particular rendering engine target has support
* @param engine The engine to check support for
EAPI int
ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine)
{
+ /* It should be done reading the availables engines */
+
switch (engine)
{
case ECORE_EVAS_ENGINE_SOFTWARE_BUFFER:
_ecore_evas_ews_events_init();
#endif
- _ecore_evas_extn_init();
+ _ecore_evas_engine_init();
if (getenv("ECORE_EVAS_COMP_NOSYNC"))
_ecore_evas_app_comp_sync = 0;
while (ecore_evases) _ecore_evas_free(ecore_evases);
- _ecore_evas_extn_shutdown();
-
if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
ecore_idle_enterer_del(ecore_evas_idle_enterer);
ecore_evas_idle_enterer = NULL;
-#ifdef BUILD_ECORE_EVAS_X11
- while (_ecore_evas_x_shutdown());
-#endif
-#ifdef BUILD_ECORE_EVAS_WIN32
- while (_ecore_evas_win32_shutdown());
-#endif
-#ifdef BUILD_ECORE_EVAS_FB
- while (_ecore_evas_fb_shutdown());
-#endif
#ifdef BUILD_ECORE_EVAS_EWS
while (_ecore_evas_ews_shutdown());
#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
- while (_ecore_evas_buffer_shutdown());
-#endif
-
+ _ecore_evas_engine_shutdown();
if (_ecore_evas_async_events_fd)
ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
}
#endif
-#ifdef BUILD_ECORE_EVAS_FB
static Ecore_Evas *
_ecore_evas_constructor_fb(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options)
{
return ee;
}
-#endif
-#ifdef BUILD_ECORE_EVAS_PSL1GHT
static Ecore_Evas *
_ecore_evas_constructor_psl1ght(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options)
{
if (ee) ecore_evas_move(ee, x, y);
return ee;
}
-#endif
-#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
static Ecore_Evas *
_ecore_evas_constructor_wayland_shm(int x, int y, int w, int h, const char *extra_options)
{
return ee;
}
-#endif
-#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
static Ecore_Evas *
_ecore_evas_constructor_wayland_egl(int x, int y, int w, int h, const char *extra_options)
{
return ee;
}
-#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
static Ecore_Evas *
-_ecore_evas_constructor_software_gdi(int x, int y, int w, int h, const char *extra_options)
+_ecore_evas_constructor_software_gdi(int x, int y, int w, int h,
+ const char *extra_options EINA_UNUSED)
{
return ecore_evas_software_gdi_new(NULL, x, y, w, h);
}
-#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
static Ecore_Evas *
-_ecore_evas_constructor_software_ddraw(int x, int y, int w, int h, const char *extra_options)
+_ecore_evas_constructor_software_ddraw(int x, int y, int w, int h,
+ const char *extra_options EINA_UNUSED)
{
return ecore_evas_software_ddraw_new(NULL, x, y, w, h);
}
-#endif
-#ifdef BUILD_ECORE_EVAS_DIRECT3D
static Ecore_Evas *
-_ecore_evas_constructor_direct3d(int x, int y, int w, int h, const char *extra_options)
+_ecore_evas_constructor_direct3d(int x, int y, int w, int h,
+ const char *extra_options EINA_UNUSED)
{
return ecore_evas_direct3d_new(NULL, x, y, w, h);
}
-#endif
-#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
static Ecore_Evas *
-_ecore_evas_constructor_opengl_glew(int x, int y, int w, int h, const char *extra_options)
+_ecore_evas_constructor_opengl_glew(int x, int y, int w, int h,
+ const char *extra_options EINA_UNUSED)
{
return ecore_evas_gl_glew_new(NULL, x, y, w, h);
}
-#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
static Ecore_Evas *
_ecore_evas_constructor_buffer(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, const char *extra_options EINA_UNUSED)
{
return ecore_evas_buffer_new(w, h);
}
-#endif
#ifdef BUILD_ECORE_EVAS_EWS
static Ecore_Evas *
}
}
+EAPI Evas *
+ecore_evas_object_evas_get(Evas_Object *obj)
+{
+ Ecore_Evas *ee;
+
+ ee = evas_object_data_get(obj, "Ecore_Evas");
+ if (!ee) return NULL;
+
+ return ecore_evas_get(ee);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_object_ecore_evas_get(Evas_Object *obj)
+{
+ return evas_object_data_get(obj, "Ecore_Evas");
+}
+
#define IFC(_ee, _fn) if (_ee->engine.func->_fn) {_ee->engine.func->_fn
#define IFE return;}
void
_ecore_evas_free(Ecore_Evas *ee)
{
+ Ecore_Evas_Interface *iface;
+
ee->deleted = EINA_TRUE;
if (ee->refcount > 0) return;
ecore_evases = (Ecore_Evas *)eina_inlist_remove
(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
}
+
+ EINA_LIST_FREE(ee->engine.ifaces, iface)
+ free(iface);
+
+ ee->engine.ifaces = NULL;
free(ee);
}
ecore_event_window_unregister((Ecore_Window)ee);
}
-#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined (BUILD_ECORE_EVAS_WAYLAND_EGL)
+/**
+ * @brief Create Ecore_Evas using fb backend.
+ * @param disp_name The name of the display to be used.
+ * @param rotation The rotation to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return The new Ecore_Evas.
+ */
+EAPI Ecore_Evas *
+ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
+{
+ Ecore_Evas *(*new)(const char *, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("fb");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_fb_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(disp_name, rotation, w, h);
+}
+
+/**
+ * @brief Create Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
+ * @param disp_name The name of the Ecore_Evas to be created.
+ * @param parent The parent of the Ecore_Evas to be created.
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return A handle to the created Ecore_Evas.
+ */
+EAPI Ecore_Evas *
+ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
+{
+ Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("x");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_software_x11_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(disp_name, parent, x, y, w, h);
+}
+
+/**
+ * @brief Get the window from Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_software_x11_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the window.
+ * @return The window of type Ecore_X_Window.
+ */
+EAPI Ecore_X_Window
+ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_Software_X11 *iface;
+ iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
+
+ return iface->window_get(ee);
+}
+
+/**
+ * @brief Set the direct_resize of Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas in which to set direct resize.
+ * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
+ */
+EAPI void
+ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ Ecore_Evas_Interface_Software_X11 *iface;
+ iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->resize_set(ee, on);
+}
+
+/**
+ * @brief Gets if the Ecore_Evas is being directly resized using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
+ * @param ee The Ecore_Evas from which to get direct resize.
+ * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
+ */
+EAPI Eina_Bool
+ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_Software_X11 *iface;
+ iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
+
+ return iface->resize_get(ee);
+}
+
+/**
+ * @brief Add extra window on Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas on which to add the window.
+ * @param win The window to be added at the Ecore_Evas.
+ */
+EAPI void
+ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+{
+ Ecore_Evas_Interface_Software_X11 *iface;
+ iface = (Ecore_Evas_Interface_Software_X11 *)_ecore_evas_interface_get(ee, "software_x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->extra_event_window_add(ee, win);
+}
+
+/**
+ * @brief Create Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
+ * @param disp_name The name of the display of the Ecore_Evas to be created.
+ * @param parent The parent of the Ecore_Evas to be created.
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return The new Ecore_Evas.
+ */
+EAPI Ecore_Evas *
+ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
+{
+ Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("x");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_gl_x11_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(disp_name, parent, x, y, w, h);
+}
+
+EAPI Ecore_Evas *
+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)
+{
+ Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int, const int*);
+ Eina_Module *m = _ecore_evas_engine_load("x");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_gl_x11_options_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(disp_name, parent, x, y, w, h, opt);
+}
+
+/**
+ * @brief Get the window from Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_gl_x11_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the window.
+ * @return The window of type Ecore_X_Window of Ecore_Evas.
+ */
+EAPI Ecore_X_Window
+ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_Gl_X11 *iface;
+ iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
+
+ return iface->window_get(ee);
+}
+
+/**
+ * @brief Set direct_resize for Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas in which to set direct resize.
+ * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
+ */
+EAPI void
+ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ Ecore_Evas_Interface_Gl_X11 *iface;
+ iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->resize_set(ee, on);
+}
+
+/**
+ * @brief Gets if the Ecore_Evas is being directly resized using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
+ * @param ee The Ecore_Evas from which to get direct resize.
+ * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
+ */
+EAPI Eina_Bool
+ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_Gl_X11 *iface;
+ iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
+
+ return iface->resize_get(ee);
+}
+
+/**
+ * @brief Add extra window on Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas for which to add the window.
+ * @param win The window to be added at the Ecore_Evas.
+ */
+EAPI void
+ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+{
+ Ecore_Evas_Interface_Gl_X11 *iface;
+ iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->extra_event_window_add(ee, win);
+}
+
+/**
+ * @brief Set the functions to be used before and after the swap callback.
+ * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
+ * @param ee The Ecore_Evas for which to set the swap callback.
+ * @param data The data for which to set the swap callback.
+ * @param pre_cb The function to be called before the callback.
+ * @param post_cb The function to be called after the callback.
+ */
+EAPI void
+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))
+{
+ Ecore_Evas_Interface_Gl_X11 *iface;
+ iface = (Ecore_Evas_Interface_Gl_X11 *)_ecore_evas_interface_get(ee, "gl_x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->pre_post_swap_callback_set(ee, data, pre_cb, post_cb);
+}
+
+EAPI void
+ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->leader_set(ee, win);
+}
+
+EAPI Ecore_X_Window
+ecore_evas_x11_leader_get(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
+
+ return iface->leader_get(ee);
+}
+
+EAPI void
+ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->leader_default_set(ee);
+}
+
+EAPI void
+ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->shape_input_rectangle_set(ee, x, y, w, h);
+}
+
+EAPI void
+ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->shape_input_rectangle_add(ee, x, y, w, h);
+}
+
+EAPI void
+ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->shape_input_rectangle_subtract(ee, x, y, w, h);
+}
+
+EAPI void
+ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->shape_input_empty(ee);
+}
+
+EAPI void
+ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->shape_input_reset(ee);
+}
+
+EAPI void
+ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_X11 *iface;
+ iface = (Ecore_Evas_Interface_X11 *)_ecore_evas_interface_get(ee, "x11");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->shape_input_apply(ee);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_buffer_new(int w, int h)
+{
+ Ecore_Evas *(*new)(int, int);
+ Eina_Module *m = _ecore_evas_engine_load("buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_buffer_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(w, h);
+}
+
+EAPI const void *
+ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_Buffer *iface;
+ iface = (Ecore_Evas_Interface_Buffer *)_ecore_evas_interface_get(ee, "buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
+
+ return iface->pixels_get(ee);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_buffer_allocfunc_new(int w, int h,
+ void *(*alloc_func) (void *data, int size),
+ void (*free_func) (void *data, void *pix),
+ const void *data)
+{
+ Ecore_Evas *(*new)(int, int, void*(*)(void *, int), void(*)(void *, void *), const void *);
+ Eina_Module *m = _ecore_evas_engine_load("buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_buffer_allocfunc_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(w, h, alloc_func, free_func, data);
+}
+
+int
+ecore_evas_buffer_render(Ecore_Evas *ee)
+{
+ Ecore_Evas_Interface_Buffer *iface;
+ iface = (Ecore_Evas_Interface_Buffer *)_ecore_evas_interface_get(ee, "buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, 0);
+
+ return iface->render(ee);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_extn_socket_new(int w, int h)
+{
+ Ecore_Evas *(*new)(int, int);
+ Eina_Module *m = _ecore_evas_engine_load("buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_extn_socket_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(w, h);
+}
+
+EAPI Eina_Bool
+ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
+{
+ Ecore_Evas_Interface_Extn *iface;
+ iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, EINA_FALSE);
+
+ return iface->listen(ee, svcname, svcnum, svcsys);
+}
+
+EAPI void
+ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
+{
+ Ecore_Evas_Interface_Extn *iface;
+ Ecore_Evas *ee;
+
+ ee = ecore_evas_object_ecore_evas_get(obj);
+ iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->data_lock(ee);
+}
+
+EAPI void
+ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
+{
+ Ecore_Evas_Interface_Extn *iface;
+ Ecore_Evas *ee;
+
+ ee = ecore_evas_object_ecore_evas_get(obj);
+ iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->data_unlock(ee);
+}
+
+EAPI Evas_Object *
+ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
+{
+ Evas_Object *(*new)(Ecore_Evas *);
+ Eina_Module *m = _ecore_evas_engine_load("buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_extn_plug_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(ee_target);
+}
+
+EAPI Eina_Bool
+ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
+{
+ Ecore_Evas_Interface_Extn *iface;
+ Ecore_Evas *ee;
+
+ ee = ecore_evas_object_ecore_evas_get(obj);
+ iface = (Ecore_Evas_Interface_Extn *)_ecore_evas_interface_get(ee, "extn");
+
+ if (!iface) return EINA_FALSE;
+ return iface->connect(ee, svcname, svcnum, svcsys);
+}
+
+EAPI Evas_Object *
+ecore_evas_object_image_new(Ecore_Evas *ee_target)
+{
+ Evas_Object *(*new)(Ecore_Evas *ee_target);
+ Eina_Module *m = _ecore_evas_engine_load("buffer");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_object_image_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(ee_target);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen,
+ int hwsurface, int noframe, int alpha)
+{
+ Ecore_Evas *(*new)(const char *, int, int, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("sdl");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_sdl_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(name, w, h, fullscreen, hwsurface, noframe, alpha);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen,
+ int hwsurface, int noframe, int alpha)
+{
+ Ecore_Evas *(*new)(const char *, int, int, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("sdl");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_sdl16_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(name, w, h, fullscreen, hwsurface, noframe, alpha);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe)
+{
+ Ecore_Evas *(*new)(const char *, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("sdl");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_gl_sdl_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(name, w, h, fullscreen, noframe);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent,
+ int x, int y, int w, int h, Eina_Bool frame)
+{
+ Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool);
+ Eina_Module *m = _ecore_evas_engine_load("wayland");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_wayland_shm_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(disp_name, parent, x, y, w, h, frame);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent,
+ int x, int y, int w, int h, Eina_Bool frame)
+{
+ Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool);
+ Eina_Module *m = _ecore_evas_engine_load("wayland");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_wayland_egl_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(disp_name, parent, x, y, w, h, frame);
+}
+
EAPI void
ecore_evas_wayland_resize(Ecore_Evas *ee, int location)
{
- if (!ee) return;
- if (!strcmp(ee->driver, "wayland_shm"))
- {
-#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
- _ecore_evas_wayland_shm_resize(ee, location);
-#endif
- }
- else if (!strcmp(ee->driver, "wayland_egl"))
- {
-#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
- _ecore_evas_wayland_egl_resize(ee, location);
-#endif
- }
+ Ecore_Evas_Interface_Wayland *iface;
+ iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->resize(ee, location);
}
-EAPI void
+EAPI void
ecore_evas_wayland_move(Ecore_Evas *ee, int x, int y)
{
- if (!ee) return;
- if (!strncmp(ee->driver, "wayland", 7))
- {
- if (ee->engine.wl.win)
- {
- ee->engine.wl.win->moving = EINA_TRUE;
- ecore_wl_window_move(ee->engine.wl.win, x, y);
- }
- }
+ Ecore_Evas_Interface_Wayland *iface;
+ iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->move(ee, x, y);
+}
+
+EAPI void
+ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y)
+{
+ Ecore_Evas_Interface_Wayland *iface;
+ iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->pointer_set(ee, hot_x, hot_y);
}
EAPI void
ecore_evas_wayland_type_set(Ecore_Evas *ee, int type)
{
- if (!ee) return;
- ecore_wl_window_type_set(ee->engine.wl.win, type);
+ Ecore_Evas_Interface_Wayland *iface;
+ iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
+ EINA_SAFETY_ON_NULL_RETURN(iface);
+
+ iface->type_set(ee, type);
}
EAPI Ecore_Wl_Window *
ecore_evas_wayland_window_get(const Ecore_Evas *ee)
{
- if (!(!strncmp(ee->driver, "wayland", 7)))
- return NULL;
+ Ecore_Evas_Interface_Wayland *iface;
+ iface = (Ecore_Evas_Interface_Wayland *)_ecore_evas_interface_get(ee, "wayland");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
- return ee->engine.wl.win;
+ return iface->window_get(ee);
}
-EAPI void
-ecore_evas_wayland_pointer_set(Ecore_Evas *ee EINA_UNUSED, int hot_x EINA_UNUSED, int hot_y EINA_UNUSED)
+EAPI Ecore_Evas *
+ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
+ int x,
+ int y,
+ int width,
+ int height)
{
+ Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("win32");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+ new = eina_module_symbol_get(m, "ecore_evas_software_gdi_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(parent, x, y, width, height);
}
-#else
-EAPI void
-ecore_evas_wayland_resize(Ecore_Evas *ee EINA_UNUSED, int location EINA_UNUSED)
+EAPI Ecore_Evas *
+ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
+ int x,
+ int y,
+ int width,
+ int height)
{
+ Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("win32");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_software_ddraw_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+ return new(parent, x, y, width, height);
}
-EAPI void
-ecore_evas_wayland_move(Ecore_Evas *ee EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED)
+EAPI Ecore_Evas *
+ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
+ int x,
+ int y,
+ int width,
+ int height)
{
+ Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("win32");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_direct3d_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+ return new(parent, x, y, width, height);
}
-EAPI void
-ecore_evas_wayland_type_set(Ecore_Evas *ee EINA_UNUSED, int type EINA_UNUSED)
+EAPI Ecore_Evas *
+ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
+ int x,
+ int y,
+ int width,
+ int height)
{
+ Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("win32");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_gl_glew_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+ return new(parent, x, y, width, height);
}
-EAPI Ecore_Wl_Window *
-ecore_evas_wayland_window_get(const Ecore_Evas *ee EINA_UNUSED)
+EAPI Ecore_Win32_Window *
+ecore_evas_win32_window_get(const Ecore_Evas *ee)
{
- return NULL;
+ Ecore_Evas_Interface_Win32 *iface;
+ iface = (Ecore_Evas_Interface_Win32 *)_ecore_evas_interface_get(ee, "win32");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
+
+ return iface->window_get(ee);
}
-EAPI void
-ecore_evas_wayland_pointer_set(Ecore_Evas *ee EINA_UNUSED, int hot_x EINA_UNUSED, int hot_y EINA_UNUSED)
+EAPI Ecore_Evas *
+ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
{
+ Ecore_Evas *(*new)(Ecore_Cocoa_Window *, int, int, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("cocoa");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+ new = eina_module_symbol_get(m, "ecore_evas_cocoa_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(parent, x, y, w, h);
}
-#endif
+EAPI Ecore_Evas *
+ecore_evas_psl1ght_new(const char* name, int w, int h)
+{
+ Ecore_Evas *(*new)(const char*, int, int);
+ Eina_Module *m = _ecore_evas_engine_load("psl1ght");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
+
+ new = eina_module_symbol_get(m, "ecore_evas_psl1ght_new_internal");
+ EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
+
+ return new(name, w, h);
+}
--- /dev/null
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "Ecore_Evas.h"
+#include "ecore_evas_private.h"
+
+Eina_Hash *_registered_engines = NULL;
+Eina_List *_engines_paths = NULL;
+
+#if defined(__CEGCC__) || defined(__MINGW32CE__) || defined(_WIN32)
+# define ECORE_EVAS_ENGINE_NAME "module.dll"
+#else
+# define ECORE_EVAS_ENGINE_NAME "module.so"
+#endif
+
+
+Eina_Module *
+_ecore_evas_engine_load(const char *engine)
+{
+ const char *path;
+ Eina_List *l;
+ Eina_Module *em = NULL;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(engine, NULL);
+
+ em = (Eina_Module *)eina_hash_find(_registered_engines, engine);
+ if (em) return em;
+
+ EINA_LIST_FOREACH(_engines_paths, l, path)
+ {
+ char tmp[PATH_MAX];
+
+ snprintf(tmp, sizeof (tmp), "%s/%s/%s/"ECORE_EVAS_ENGINE_NAME, path, engine, MODULE_ARCH);
+ em = eina_module_new(tmp);
+ if (!em) continue;
+
+ if (!eina_module_load(em))
+ {
+ eina_module_free(em);
+ continue;
+ }
+ if (eina_hash_add(_registered_engines, engine, em))
+ return em;
+ }
+
+ return NULL;
+}
+
+void
+_ecore_evas_engine_init(void)
+{
+ char *paths[4] = { NULL, NULL, NULL, NULL };
+ unsigned int i;
+ unsigned int j;
+
+ _registered_engines = eina_hash_string_small_new(EINA_FREE_CB(eina_module_free));
+
+ /* 1. ~/.ecore_evas/modules/ */
+ paths[0] = eina_module_environment_path_get("HOME", "/.ecore_evas/engines");
+ /* 2. $(ECORE_ENGINE_DIR)/ecore_evas/modules/ */
+ paths[1] = eina_module_environment_path_get("ECORE_EVAS_ENGINES_DIR", "/ecore_evas/engines");
+ /* 3. libecore_evas.so/../ecore_evas/engines/ */
+ paths[2] = eina_module_symbol_path_get(_ecore_evas_engine_init, "/ecore_evas/engines");
+ /* 4. PREFIX/ecore_evas/engines/ */
+#ifndef _MSC_VER
+ paths[3] = strdup(PACKAGE_LIB_DIR "/ecore_evas/engines");
+#endif
+
+ for (j = 0; j < ((sizeof (paths) / sizeof (char*)) - 1); ++j)
+ for (i = j + 1; i < sizeof (paths) / sizeof (char*); ++i)
+ if (paths[i] && paths[j] && !strcmp(paths[i], paths[j]))
+ {
+ free(paths[i]);
+ paths[i] = NULL;
+ }
+
+ for (i = 0; i < sizeof (paths) / sizeof (char*); ++i)
+ if (paths[i])
+ _engines_paths = eina_list_append(_engines_paths, paths[i]);
+}
+
+void
+_ecore_evas_engine_shutdown(void)
+{
+ char *path;
+
+ if (_registered_engines)
+ {
+ eina_hash_free(_registered_engines);
+ _registered_engines = NULL;
+ }
+
+ EINA_LIST_FREE(_engines_paths, path)
+ free(path);
+}
#ifndef _ECORE_EVAS_PRIVATE_H
#define _ECORE_EVAS_PRIVATE_H
+#include "Ecore_Evas_Types.h"
+
#include <Evas.h>
#include <Ecore.h>
#include <ecore_private.h>
#define ECORE_MAGIC_EVAS 0x76543211
-#ifdef BUILD_ECORE_EVAS_X11
-# include <Ecore_X.h>
-# include <Ecore_X_Atoms.h>
-# ifdef HAVE_ECORE_X_XCB
-# include <xcb/xcb.h>
-# endif
-# ifdef HAVE_ECORE_X_XLIB
-# include <X11/Xlib.h>
-# include <X11/Xutil.h>
-# endif
-#endif
-
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-# include <Evas_Engine_Software_X11.h>
-#endif
-
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-# include <Evas_Engine_GL_X11.h>
-#endif
-
-#ifdef BUILD_ECORE_EVAS_FB
-# include <Evas_Engine_FB.h>
-#endif
-
#if defined(BUILD_ECORE_EVAS_SOFTWARE_BUFFER) || defined(BUILD_ECORE_EVAS_EWS)
# include <Evas_Engine_Buffer.h>
#endif
-#ifdef BUILD_ECORE_EVAS_WIN32
-# include "Ecore_Win32.h"
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
-# include <Evas_Engine_Software_Gdi.h>
-# endif
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
-# include <Evas_Engine_Software_DDraw.h>
-# endif
-# ifdef BUILD_ECORE_EVAS_DIRECT3D
-# include <Evas_Engine_Direct3D.h>
-# endif
-# ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
-# include <Evas_Engine_GL_Glew.h>
-# endif
-#endif
-
-#ifdef BUILD_ECORE_EVAS_GL_COCOA
-# include "Ecore_Cocoa.h"
-# include <Evas_Engine_Gl_Cocoa.h>
-#endif
-
-#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL)
-# include "Ecore_Wayland.h"
-#endif
-
-#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
-# include <Evas_Engine_Wayland_Shm.h>
-#endif
-
-#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
-# include <Evas_Engine_Wayland_Egl.h>
-#endif
-
/** Log domain macros and variables **/
extern int _ecore_evas_log_dom;
typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine;
typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func;
+typedef struct _Ecore_Evas_Interface Ecore_Evas_Interface;
+
+/* Engines interfaces */
+typedef struct _Ecore_Evas_Interface_Buffer Ecore_Evas_Interface_Buffer;
+typedef struct _Ecore_Evas_Interface_Extn Ecore_Evas_Interface_Extn;
+typedef struct _Ecore_Evas_Interface_X11 Ecore_Evas_Interface_X11;
+typedef struct _Ecore_Evas_Interface_Software_X11 Ecore_Evas_Interface_Software_X11;
+typedef struct _Ecore_Evas_Interface_Gl_X11 Ecore_Evas_Interface_Gl_X11;
+typedef struct _Ecore_Evas_Interface_Wayland Ecore_Evas_Interface_Wayland;
+typedef struct _Ecore_Evas_Interface_Win32 Ecore_Evas_Interface_Win32;
+
struct _Ecore_Evas_Engine_Func
{
void (*fn_screen_dpi_get) (const Ecore_Evas *ee, int *xdpi, int *ydpi);
};
+struct _Ecore_Evas_Interface
+
+{
+ const char *name;
+ unsigned int version;
+};
+
+struct _Ecore_Evas_Interface_Buffer {
+ Ecore_Evas_Interface base;
+
+ const void* (*pixels_get)(Ecore_Evas *ee);
+ int (*render)(Ecore_Evas *ee);
+};
+
+struct _Ecore_Evas_Interface_X11 {
+ Ecore_Evas_Interface base;
+
+ void (*leader_set)(Ecore_Evas *ee, Ecore_X_Window win);
+ Ecore_X_Window (*leader_get)(Ecore_Evas *ee);
+ void (*leader_default_set)(Ecore_Evas *ee);
+ void (*shape_input_rectangle_set)(Ecore_Evas *ee, int x, int y, int w, int h);
+ void (*shape_input_rectangle_add)(Ecore_Evas *ee, int x, int y, int w, int h);
+ void (*shape_input_rectangle_subtract)(Ecore_Evas *ee, int x, int y, int w, int h);
+ void (*shape_input_empty)(Ecore_Evas *ee);
+ void (*shape_input_reset)(Ecore_Evas *ee);
+ void (*shape_input_apply)(Ecore_Evas *ee);
+};
+
+struct _Ecore_Evas_Interface_Software_X11 {
+ Ecore_Evas_Interface base;
+
+ Ecore_X_Window (*window_get)(const Ecore_Evas *ee);
+ void (*resize_set)(Ecore_Evas *ee, Eina_Bool on);
+ Eina_Bool (*resize_get)(const Ecore_Evas *ee);
+ void (*extra_event_window_add)(Ecore_Evas *ee, Ecore_X_Window win);
+};
+
+struct _Ecore_Evas_Interface_Gl_X11 {
+ Ecore_Evas_Interface base;
+
+ Ecore_X_Window (*window_get)(const Ecore_Evas *ee);
+ void (*resize_set)(Ecore_Evas *ee, Eina_Bool on);
+ Eina_Bool (*resize_get)(const Ecore_Evas *ee);
+ void (*extra_event_window_add)(Ecore_Evas *ee, Ecore_X_Window win);
+ void (*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));
+};
+
+struct _Ecore_Evas_Interface_Extn {
+ Ecore_Evas_Interface base;
+
+ void (*data_lock)(Ecore_Evas *ee);
+ void (*data_unlock)(Ecore_Evas *ee);
+ Eina_Bool (*connect)(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys);
+ Eina_Bool (*listen)(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys);
+};
+
+struct _Ecore_Evas_Interface_Wayland {
+ Ecore_Evas_Interface base;
+
+ void (*resize)(Ecore_Evas *ee, int location);
+ void (*move)(Ecore_Evas *ee, int x, int y);
+ void (*pointer_set)(Ecore_Evas *ee, int hot_x, int hot_y);
+ void (*type_set)(Ecore_Evas *ee, int type);
+ Ecore_Wl_Window* (*window_get)(const Ecore_Evas *ee);
+};
+
+struct _Ecore_Evas_Interface_Win32 {
+ Ecore_Evas_Interface base;
+
+ Ecore_Win32_Window* (*window_get)(const Ecore_Evas *ee);
+};
+
struct _Ecore_Evas_Engine
{
Ecore_Evas_Engine_Func *func;
-
-/* TODO: UGLY! This should be an union or inheritance! */
-#ifdef BUILD_ECORE_EVAS_X11
- struct
- {
- Ecore_X_Window win_root;
- Eina_List *win_extra;
- Ecore_X_Pixmap pmap;
- Ecore_X_Pixmap mask;
- Ecore_X_GC gc;
- Ecore_X_XRegion *damages;
- Ecore_X_Sync_Counter sync_counter;
- Ecore_X_Window leader;
- Ecore_X_Sync_Counter netwm_sync_counter;
- int netwm_sync_val_hi;
- unsigned int netwm_sync_val_lo;
- int sync_val; // bigger! this will screw up at 2 billion frames (414 days of continual rendering @ 60fps)
- int screen_num;
- int px, py, pw, ph;
- unsigned char direct_resize : 1;
- unsigned char using_bg_pixmap : 1;
- unsigned char managed : 1;
- unsigned char sync_began : 1;
- unsigned char sync_cancel : 1;
- unsigned char netwm_sync_set : 1;
- unsigned char configure_coming : 1;
- struct {
- unsigned char modal : 1;
- unsigned char sticky : 1;
- unsigned char maximized_v : 1;
- unsigned char maximized_h : 1;
- unsigned char shaded : 1;
- unsigned char skip_taskbar : 1;
- unsigned char skip_pager : 1;
- unsigned char fullscreen : 1;
- unsigned char above : 1;
- unsigned char below : 1;
- } state;
- struct {
- unsigned char available : 1; // need to setup available profiles in a window
- unsigned char change : 1; // need to send change event to the WM
- unsigned char done : 1; // need to send change done event to the WM
- } profile;
- Ecore_X_Window win_shaped_input;
- } x;
-#endif
-#ifdef BUILD_ECORE_EVAS_FB
- struct {
- int real_w;
- int real_h;
- } fb;
-#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
- struct {
- void *pixels;
- Evas_Object *image;
- void (*free_func) (void *data, void *pix);
- void *(*alloc_func) (void *data, int size);
- void *data;
- } buffer;
-#endif
-#ifdef BUILD_ECORE_EVAS_WIN32
- struct {
- Ecore_Win32_Window *parent;
- struct {
- unsigned char region : 1;
- unsigned char fullscreen : 1;
- } state;
- } win32;
-#endif
+ void *data;
+ Eina_List *ifaces;
+ Ecore_Timer *idle_flush_timer;
#ifdef BUILD_ECORE_EVAS_EWS
struct {
Evas_Object *image;
} ews;
#endif
-
-#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL)
- struct
- {
- Ecore_Wl_Window *parent, *win;
- Evas_Object *frame;
-
-# if defined(BUILD_ECORE_EVAS_WAYLAND_SHM)
- struct wl_shm_pool *pool;
- size_t pool_size;
- void *pool_data;
- struct wl_buffer *buffer;
-# endif
-
- } wl;
-#endif
-
- Ecore_Timer *idle_flush_timer;
};
struct _Ecore_Evas
void _ecore_evas_ref(Ecore_Evas *ee);
void _ecore_evas_unref(Ecore_Evas *ee);
+int ecore_evas_buffer_render(Ecore_Evas *ee);
-#ifdef BUILD_ECORE_EVAS_X11
-int _ecore_evas_x_shutdown(void);
-#endif
-#ifdef BUILD_ECORE_EVAS_FB
-int _ecore_evas_fb_shutdown(void);
-#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
-int _ecore_evas_buffer_shutdown(void);
-int _ecore_evas_buffer_render(Ecore_Evas *ee);
-#endif
-#ifdef BUILD_ECORE_EVAS_WIN32
-int _ecore_evas_win32_shutdown(void);
-#endif
#ifdef BUILD_ECORE_EVAS_EWS
void _ecore_evas_ews_events_init(void);
int _ecore_evas_ews_shutdown(void);
#endif
-#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL)
-int _ecore_evas_wl_common_init(void);
-int _ecore_evas_wl_common_shutdown(void);
-void _ecore_evas_wl_common_pre_free(Ecore_Evas *ee);
-void _ecore_evas_wl_common_free(Ecore_Evas *ee);
-void _ecore_evas_wl_common_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
-void _ecore_evas_wl_common_move(Ecore_Evas *ee, int x, int y);
-void _ecore_evas_wl_common_raise(Ecore_Evas *ee);
-void _ecore_evas_wl_common_title_set(Ecore_Evas *ee, const char *title);
-void _ecore_evas_wl_common_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
-void _ecore_evas_wl_common_size_min_set(Ecore_Evas *ee, int w, int h);
-void _ecore_evas_wl_common_size_max_set(Ecore_Evas *ee, int w, int h);
-void _ecore_evas_wl_common_size_base_set(Ecore_Evas *ee, int w, int h);
-void _ecore_evas_wl_common_size_step_set(Ecore_Evas *ee, int w, int h);
-void _ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
-void _ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer);
-void _ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, int iconify);
-void _ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, int max);
-void _ecore_evas_wl_common_fullscreen_set(Ecore_Evas *ee, int full);
-void _ecore_evas_wl_common_ignore_events_set(Ecore_Evas *ee, int ignore);
-int _ecore_evas_wl_common_pre_render(Ecore_Evas *ee);
-int _ecore_evas_wl_common_render_updates(Ecore_Evas *ee);
-void _ecore_evas_wl_common_post_render(Ecore_Evas *ee);
-int _ecore_evas_wl_common_render(Ecore_Evas *ee);
-void _ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
-void _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi);
-
-Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas);
-
-#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
-void _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location);
-#endif
-
-#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
-void _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location);
-#endif
-#endif
-
void _ecore_evas_fps_debug_init(void);
void _ecore_evas_fps_debug_shutdown(void);
void _ecore_evas_fps_debug_rendertime_add(double t);
extern Eina_Bool _ecore_evas_app_comp_sync;
-void _ecore_evas_extn_init(void);
-void _ecore_evas_extn_shutdown(void);
+
+Eina_Module *_ecore_evas_engine_load(const char *engine);
+void _ecore_evas_engine_init();
+void _ecore_evas_engine_shutdown();
+
+Ecore_Evas_Interface *_ecore_evas_interface_get(const Ecore_Evas *ee, const char *iname);
/**
* @brief Free the string of the window profile.
void _ecore_evas_window_available_profiles_free(Ecore_Evas *ee);
#endif
+
# include <config.h>
#endif
-// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
-#include <stdlib.h>
+#include "ecore_evas_buffer_private.h"
+
+static int _ecore_evas_init_count = 0;
-#include <Ecore.h>
-#include "ecore_private.h"
-#include <Ecore_Input.h>
+static const char *interface_buffer_name = "buffer";
+static const int interface_buffer_version = 1;
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
-static int _ecore_evas_init_count = 0;
+static Ecore_Evas_Interface_Buffer *_ecore_evas_buffer_interface_new(void);
static int
_ecore_evas_buffer_init(void)
return _ecore_evas_init_count;
}
+static int
+_ecore_evas_buffer_shutdown(void)
+{
+ _ecore_evas_init_count--;
+ if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+ return _ecore_evas_init_count;
+}
+
static void
_ecore_evas_buffer_free(Ecore_Evas *ee)
{
- if (ee->engine.buffer.image)
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
+
+ if (bdata->image)
{
Ecore_Evas *ee2;
- ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
- evas_object_del(ee->engine.buffer.image);
+ ee2 = evas_object_data_get(bdata->image, "Ecore_Evas_Parent");
+ evas_object_del(bdata->image);
ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
}
else
{
- ee->engine.buffer.free_func(ee->engine.buffer.data,
- ee->engine.buffer.pixels);
+ bdata->free_func(bdata->data,
+ bdata->pixels);
}
+
+ free(bdata);
_ecore_evas_buffer_shutdown();
}
_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
{
Evas_Engine_Info_Buffer *einfo;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
int stride = 0;
if (w < 1) w = 1;
evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
- if (ee->engine.buffer.image)
+ if (bdata->image)
{
- ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
- stride = evas_object_image_stride_get(ee->engine.buffer.image);
+ bdata->pixels = evas_object_image_data_get(bdata->image, 1);
+ stride = evas_object_image_stride_get(bdata->image);
}
else
{
- if (ee->engine.buffer.pixels)
- ee->engine.buffer.free_func(ee->engine.buffer.data,
- ee->engine.buffer.pixels);
- ee->engine.buffer.pixels =
- ee->engine.buffer.alloc_func(ee->engine.buffer.data,
- ee->w * ee->h * sizeof(int));
+ if (bdata->pixels)
+ bdata->free_func(bdata->data,
+ bdata->pixels);
+ bdata->pixels = bdata->alloc_func(bdata->data,
+ ee->w * ee->h * sizeof(int));
stride = ee->w * sizeof(int);
}
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
else
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
- einfo->info.dest_buffer = ee->engine.buffer.pixels;
+ einfo->info.dest_buffer = bdata->pixels;
einfo->info.dest_buffer_row_bytes = stride;
einfo->info.use_color_key = 0;
einfo->info.alpha_threshold = 0;
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
}
}
- if (ee->engine.buffer.image)
- evas_object_image_data_set(ee->engine.buffer.image, ee->engine.buffer.pixels);
+ if (bdata->image)
+ evas_object_image_data_set(bdata->image, bdata->pixels);
if (ee->func.fn_resize) ee->func.fn_resize(ee);
}
_ecore_evas_resize(ee, w, h);
}
-int
-_ecore_evas_buffer_shutdown(void)
-{
- _ecore_evas_init_count--;
- if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
- return _ecore_evas_init_count;
-}
-
static void
_ecore_evas_show(Ecore_Evas *ee)
{
- if (ee->engine.buffer.image) return;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
+
+ if (bdata->image) return;
if (ee->prop.focused) return;
ee->prop.focused = 1;
evas_focus_in(ee->evas);
if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
}
-int
+static int
_ecore_evas_buffer_render(Ecore_Evas *ee)
{
Eina_List *updates = NULL, *l, *ll;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Ecore_Evas *ee2;
int rend = 0;
rend |= ee2->engine.func->fn_render(ee2);
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
}
- if (ee->engine.buffer.image)
+ if (bdata->image)
{
int w, h;
- evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
+ evas_object_image_size_get(bdata->image, &w, &h);
if ((w != ee->w) || (h != ee->h))
_ecore_evas_resize(ee, w, h);
- ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
+ bdata->pixels = evas_object_image_data_get(bdata->image, 1);
}
- if (ee->engine.buffer.pixels)
+ if (bdata->pixels)
{
updates = evas_render_updates(ee->evas);
}
- if (ee->engine.buffer.image)
+ if (bdata->image)
{
Eina_Rectangle *r;
- evas_object_image_data_set(ee->engine.buffer.image, ee->engine.buffer.pixels);
+ evas_object_image_data_set(bdata->image, bdata->pixels);
EINA_LIST_FOREACH(updates, l, r)
- evas_object_image_data_update_add(ee->engine.buffer.image,
+ evas_object_image_data_update_add(bdata->image,
r->x, r->y, r->w, r->h);
}
if (updates)
static void
_ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
{
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
- evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
- evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
+ evas_object_geometry_get(bdata->image, &xx, &yy, &ww, &hh);
+ evas_object_image_fill_get(bdata->image, &fx, &fy, &fw, &fh);
if (fw < 1) fw = 1;
if (fh < 1) fh = 1;
- if (evas_object_map_get(ee->engine.buffer.image) &&
- evas_object_map_enable_get(ee->engine.buffer.image))
+ if (evas_object_map_get(bdata->image) &&
+ evas_object_map_enable_get(bdata->image))
{
fx = 0; fy = 0;
fw = ee->w; fh = ee->h;
static void
_ecore_evas_buffer_alpha_set(Ecore_Evas *ee, int alpha)
{
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
ee->alpha = alpha;
- if (ee->engine.buffer.image)
- evas_object_image_alpha_set(ee->engine.buffer.image, ee->alpha);
+ if (bdata->image)
+ evas_object_image_alpha_set(bdata->image, ee->alpha);
else
{
Evas_Engine_Info_Buffer *einfo;
NULL, // screen_geometry_get
NULL // screen_dpi_get
};
-#endif
static void *
_ecore_evas_buffer_pix_alloc(void *data EINA_UNUSED, int size)
}
EAPI Ecore_Evas *
-ecore_evas_buffer_new(int w, int h)
+ecore_evas_buffer_allocfunc_new_internal(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data)
{
- return ecore_evas_buffer_allocfunc_new
- (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
-}
-
-EAPI Ecore_Evas *
-ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data)
-{
-// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
Evas_Engine_Info_Buffer *einfo;
+ Ecore_Evas_Engine_Buffer_Data *bdata;
+ Ecore_Evas_Interface_Buffer *iface;
Ecore_Evas *ee;
int rmethod;
if (!rmethod) return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ bdata = calloc(1, sizeof(Ecore_Evas_Engine_Buffer_Data));
+ if (!bdata)
+ {
+ free(ee);
+ return NULL;
+ }
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
_ecore_evas_buffer_init();
ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
- ee->engine.buffer.alloc_func = alloc_func;
- ee->engine.buffer.free_func = free_func;
- ee->engine.buffer.data = (void *)data;
+ ee->engine.data = bdata;
+ bdata->alloc_func = alloc_func;
+ bdata->free_func = free_func;
+ bdata->data = (void *)data;
+
+ iface = _ecore_evas_buffer_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
ee->driver = "buffer";
evas_output_size_set(ee->evas, w, h);
evas_output_viewport_set(ee->evas, 0, 0, w, h);
- ee->engine.buffer.pixels =
- ee->engine.buffer.alloc_func
- (ee->engine.buffer.data, w * h * sizeof(int));
+ bdata->pixels = bdata->alloc_func(bdata->data, w * h * sizeof(int));
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
if (einfo)
{
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
- einfo->info.dest_buffer = ee->engine.buffer.pixels;
+ einfo->info.dest_buffer = bdata->pixels;
einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
einfo->info.use_color_key = 0;
einfo->info.alpha_threshold = 0;
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
return ee;
-#else
- return NULL;
-#endif
}
-EAPI const void *
-ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
+EAPI Ecore_Evas *
+ecore_evas_buffer_new_internal(int w, int h)
+{
+ return ecore_evas_buffer_allocfunc_new_internal
+ (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
+}
+
+const void *
+_ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
+
if (!ee)
{
CRIT("Ecore_Evas is missing");
return NULL;
}
_ecore_evas_buffer_render(ee);
- return ee->engine.buffer.pixels;
-#else
- return NULL;
-#endif
-}
-
-EAPI Evas *
-ecore_evas_object_evas_get(Evas_Object *obj)
-{
- Ecore_Evas *ee;
-
- ee = evas_object_data_get(obj, "Ecore_Evas");
- if (!ee) return NULL;
-
- return ecore_evas_get(ee);
-}
-
-EAPI Ecore_Evas *
-ecore_evas_object_ecore_evas_get(Evas_Object *obj)
-{
- return evas_object_data_get(obj, "Ecore_Evas");
+ return bdata->pixels;
}
EAPI Evas_Object *
-ecore_evas_object_image_new(Ecore_Evas *ee_target)
+ecore_evas_object_image_new_internal(Ecore_Evas *ee_target)
{
-// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
Evas_Object *o;
+ Ecore_Evas_Engine_Buffer_Data *bdata;
Evas_Engine_Info_Buffer *einfo;
+ Ecore_Evas_Interface_Buffer *iface;
Ecore_Evas *ee;
int rmethod;
int w = 1, h = 1;
if (!rmethod) return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ bdata = calloc(1, sizeof(Ecore_Evas_Engine_Buffer_Data));
+ if (!bdata)
+ {
+ free(ee);
+ return NULL;
+ }
+
+ ee->engine.data = bdata;
+ iface = _ecore_evas_buffer_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
o = evas_object_image_add(ee_target->evas);
evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
evas_output_size_set(ee->evas, w, h);
evas_output_viewport_set(ee->evas, 0, 0, w, h);
- ee->engine.buffer.image = o;
- evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
- evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ bdata->image = o;
+ evas_object_data_set(bdata->image, "Ecore_Evas", ee);
+ evas_object_data_set(bdata->image, "Ecore_Evas_Parent", ee_target);
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_IN,
_ecore_evas_buffer_cb_mouse_in, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_OUT,
_ecore_evas_buffer_cb_mouse_out, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_DOWN,
_ecore_evas_buffer_cb_mouse_down, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_UP,
_ecore_evas_buffer_cb_mouse_up, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_MOVE,
_ecore_evas_buffer_cb_mouse_move, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_WHEEL,
_ecore_evas_buffer_cb_mouse_wheel, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_DOWN,
_ecore_evas_buffer_cb_multi_down, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_UP,
_ecore_evas_buffer_cb_multi_up, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_MOVE,
_ecore_evas_buffer_cb_multi_move, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FREE,
_ecore_evas_buffer_cb_free, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_KEY_DOWN,
_ecore_evas_buffer_cb_key_down, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_KEY_UP,
_ecore_evas_buffer_cb_key_up, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FOCUS_IN,
_ecore_evas_buffer_cb_focus_in, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FOCUS_OUT,
_ecore_evas_buffer_cb_focus_out, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_SHOW,
_ecore_evas_buffer_cb_show, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_HIDE,
_ecore_evas_buffer_cb_hide, ee);
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
if (einfo)
{
- ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
+ bdata->pixels = evas_object_image_data_get(o, 1);
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
- einfo->info.dest_buffer = ee->engine.buffer.pixels;
+ einfo->info.dest_buffer = bdata->pixels;
einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
einfo->info.use_color_key = 0;
einfo->info.alpha_threshold = 0;
einfo->info.func.new_update_region = NULL;
einfo->info.func.free_update_region = NULL;
- evas_object_image_data_set(o, ee->engine.buffer.pixels);
+ evas_object_image_data_set(o, bdata->pixels);
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
return o;
-#else
- return NULL;
-#endif
+}
+
+static Ecore_Evas_Interface_Buffer *
+_ecore_evas_buffer_interface_new(void)
+{
+ Ecore_Evas_Interface_Buffer *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Buffer));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_buffer_name;
+ iface->base.version = interface_buffer_version;
+
+ iface->pixels_get = _ecore_evas_buffer_pixels_get;
+ iface->render = _ecore_evas_buffer_render;
+
+ return iface;
}
--- /dev/null
+#ifndef _ECORE_EVAS_BUFFER_PRIVATE_H_
+#define _ECORE_EVAS_BUFFER_PRIVATE_H_
+
+#include <stdlib.h>
+
+#include <Ecore.h>
+#include "ecore_private.h"
+#include <Ecore_Input.h>
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+
+typedef struct _Ecore_Evas_Engine_Buffer_Data Ecore_Evas_Engine_Buffer_Data;
+
+struct _Ecore_Evas_Engine_Buffer_Data {
+ void *pixels;
+ Evas_Object *image;
+ void (*free_func) (void *data, void *pix);
+ void *(*alloc_func) (void *data, int size);
+ void *data;
+};
+
+#endif /* _ECORE_EVAS_BUFFER_PRIVATE_H_ */
#endif
#include <stdio.h>
-#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <math.h>
#include <sys/file.h>
#include <unistd.h>
-#include <Ecore.h>
-#include "ecore_private.h"
-#include <Ecore_Input.h>
-
-#ifdef BUILD_ECORE_EVAS_EXTN
-
#include <Ecore_Ipc.h>
-#endif
-
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
-
+#include "ecore_evas_buffer_private.h"
-#ifdef BUILD_ECORE_EVAS_EXTN
+static const char *interface_extn_name = "extn";
+static const int interface_extn_version = 1;
typedef struct _Shmfile Shmfile;
static int blank = 0x00000000;
+static Ecore_Evas_Interface_Extn *_ecore_evas_extn_interface_new(void);
+
static Shmfile *
shmfile_new(const char *base, int id, int size, Eina_Bool sys)
{
EAPI int ECORE_EVAS_EXTN_CLIENT_ADD = 0;
EAPI int ECORE_EVAS_EXTN_CLIENT_DEL = 0;
-void
+Eina_Bool
_ecore_evas_extn_init(void)
{
- if (ECORE_EVAS_EXTN_CLIENT_ADD) return;
- ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
- ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
+ if (!ECORE_EVAS_EXTN_CLIENT_ADD)
+ {
+ ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
+ ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
+ }
+
+ return EINA_TRUE;
}
void
_ecore_evas_extn_event_free(void *data, void *ev EINA_UNUSED)
{
Ecore_Evas *ee = data;
- if (ee->engine.buffer.image)
- evas_object_unref(ee->engine.buffer.image);
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
+
+ if (bdata->image)
+ evas_object_unref(bdata->image);
_ecore_evas_unref(ee);
}
static void
_ecore_evas_extn_event(Ecore_Evas *ee, int event)
{
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
_ecore_evas_ref(ee);
- if (ee->engine.buffer.image)
- evas_object_ref(ee->engine.buffer.image);
- ecore_event_add(event, ee->engine.buffer.image,
+
+ if (bdata->image)
+ evas_object_ref(bdata->image);
+ ecore_event_add(event, bdata->image,
_ecore_evas_extn_event_free, ee);
}
Eina_List *l;
Ecore_Evas *ee2;
Extn *extn, *extn2;
-
- extn = ee->engine.buffer.data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
+ Ecore_Evas_Engine_Buffer_Data *bdata2;
+
+ extn = bdata->data;
if (!extn) return EINA_FALSE;
// brute force - i know. i expect extn_ee_list to be fairly short. could
// be improved with a hash of lockfiles
EINA_LIST_FOREACH(extn_ee_list, l, ee2)
{
if (ee == ee2) continue;
- extn2 = ee2->engine.buffer.data;
+ bdata2 = ee2->engine.data;
+ extn2 = bdata2->data;
if (!extn2) continue;
if ((extn->file.lock) && (extn2->file.lock) &&
(!strcmp(extn->file.lock, extn2->file.lock)) &&
_ecore_evas_socket_lock(Ecore_Evas *ee)
{
Extn *extn;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->file.lockfd < 0) return;
if (extn->file.have_lock) return;
_ecore_evas_socket_unlock(Ecore_Evas *ee)
{
Extn *extn;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->file.lockfd < 0) return;
if (!extn->file.have_lock) return;
_ecore_evas_extn_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
{
Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
- evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
- evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
+ evas_object_geometry_get(bdata->image, &xx, &yy, &ww, &hh);
+ evas_object_image_fill_get(bdata->image, &fx, &fy, &fw, &fh);
if (fw < 1) fw = 1;
if (fh < 1) fh = 1;
- if (evas_object_map_get(ee->engine.buffer.image) &&
- evas_object_map_enable_get(ee->engine.buffer.image))
+ if (evas_object_map_get(bdata->image) &&
+ evas_object_map_enable_get(bdata->image))
{
fx = 0; fy = 0;
fw = ee->w; fh = ee->h;
{
Extn *extn;
Ecore_Ipc_Client *client;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (extn)
{
Ecore_Event_Handler *hdl;
ecore_event_handler_del(hdl);
free(extn);
ecore_ipc_shutdown();
- ee->engine.buffer.data = NULL;
+ bdata->data = NULL;
}
- if (ee->engine.buffer.image)
+ if (bdata->image)
{
Ecore_Evas *ee2;
- evas_object_event_callback_del_full(ee->engine.buffer.image,
+ evas_object_event_callback_del_full(bdata->image,
EVAS_CALLBACK_DEL,
_ecore_evas_extn_plug_image_obj_del,
ee);
- evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
+ evas_event_callback_del_full(evas_object_evas_get(bdata->image),
EVAS_CALLBACK_RENDER_PRE,
_ecore_evas_extn_plug_targer_render_pre,
ee);
- evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
+ evas_event_callback_del_full(evas_object_evas_get(bdata->image),
EVAS_CALLBACK_RENDER_POST,
_ecore_evas_extn_plug_targer_render_post,
ee);
- evas_object_del(ee->engine.buffer.image);
- ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
+ evas_object_del(bdata->image);
+ ee2 = evas_object_data_get(bdata->image, "Ecore_Evas_Parent");
if (ee2)
{
ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
static void
_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
{
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
+
if (w < 1) w = 1;
if (h < 1) h = 1;
ee->req.w = w;
* No need for it if not used later.
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
*/
- if (ee->engine.buffer.image)
- evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
+ if (bdata->image)
+ evas_object_image_size_set(bdata->image, ee->w, ee->h);
/* Server can have many plugs, so I block resize comand from client to server *
if ((extn) && (extn->ipc.server))
{
_ecore_evas_extn_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Mouse_In *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Mouse_Out *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
{
Ecore_Evas *ee = data;
Evas_Event_Mouse_Down *ev = event_info;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Mouse_Up *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Mouse_Move *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Mouse_Wheel *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_multi_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Multi_Down *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_multi_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Multi_Up *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_multi_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Multi_Move *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Key_Down *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_key_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Key_Up *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
_ecore_evas_extn_cb_hold(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Evas_Event_Hold *ev = event_info;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (extn->ipc.server)
{
static void
_ecore_evas_extn_cb_focus_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- ee = data;
ee->prop.focused = 1;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (!extn->ipc.server) return;
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
static void
_ecore_evas_extn_cb_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- ee = data;
ee->prop.focused = 0;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (!extn->ipc.server) return;
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
static void
_ecore_evas_extn_cb_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- ee = data;
ee->visible = 1;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (!extn->ipc.server) return;
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
static void
_ecore_evas_extn_cb_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- ee = data;
ee->visible = 0;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (!extn->ipc.server) return;
ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
_ecore_evas_extn_plug_profile_set(Ecore_Evas *ee, const char *profile)
{
Extn *extn;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
_ecore_evas_window_profile_free(ee);
ee->prop.profile.name = NULL;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
if (profile)
{
Ecore_Ipc_Event_Server_Add *e = event;
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
if (ee != ecore_ipc_server_data_get(e->server))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
//FIXME: find a way to let app know server there
return ECORE_CALLBACK_PASS_ON;
{
Ecore_Ipc_Event_Server_Del *e = event;
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
- evas_object_image_data_set(ee->engine.buffer.image, NULL);
- ee->engine.buffer.pixels = NULL;
+ evas_object_image_data_set(bdata->image, NULL);
+ bdata->pixels = NULL;
if (extn->file.shmfile)
{
shmfile_close(extn->file.shmfile);
{
Ecore_Ipc_Event_Server_Data *e = event;
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
if (ee != ecore_ipc_server_data_get(e->server))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
if (e->major != MAJOR)
return ECORE_CALLBACK_PASS_ON;
EINA_LIST_FREE(extn->file.updates, ipc)
{
- if (ee->engine.buffer.image)
- evas_object_image_data_update_add(ee->engine.buffer.image,
+ if (bdata->image)
+ evas_object_image_data_update_add(bdata->image,
ipc->x, ipc->y,
ipc->w, ipc->h);
}
// e->data = shm ref string + nul byte
if ((e->data) && ((unsigned char *)e->data)[e->size - 1] == 0)
{
- ee->engine.buffer.pixels = NULL;
+ bdata->pixels = NULL;
if (extn->file.shmfile)
{
shmfile_close(extn->file.shmfile);
EINA_TRUE);
if (extn->file.shmfile)
{
- ee->engine.buffer.pixels = extn->file.shmfile->addr;
- if (ee->engine.buffer.image)
+ bdata->pixels = extn->file.shmfile->addr;
+ if (bdata->image)
{
if (e->response)
- evas_object_image_alpha_set(ee->engine.buffer.image,
+ evas_object_image_alpha_set(bdata->image,
EINA_TRUE);
else
- evas_object_image_alpha_set(ee->engine.buffer.image,
+ evas_object_image_alpha_set(bdata->image,
EINA_FALSE);
- evas_object_image_size_set(ee->engine.buffer.image,
+ evas_object_image_size_set(bdata->image,
extn->file.w,
extn->file.h);
- evas_object_image_data_set(ee->engine.buffer.image,
- ee->engine.buffer.pixels);
- evas_object_image_data_update_add(ee->engine.buffer.image,
+ evas_object_image_data_set(bdata->image,
+ bdata->pixels);
+ evas_object_image_data_update_add(bdata->image,
0, 0,
extn->file.w,
extn->file.h);
extn->file.h);
}
else
- evas_object_image_data_set(ee->engine.buffer.image, NULL);
+ evas_object_image_data_set(bdata->image, NULL);
}
else
- evas_object_image_data_set(ee->engine.buffer.image, NULL);
+ evas_object_image_data_set(bdata->image, NULL);
}
else
- evas_object_image_data_set(ee->engine.buffer.image, NULL);
+ evas_object_image_data_set(bdata->image, NULL);
}
break;
case OP_RESIZE:
}
return ECORE_CALLBACK_PASS_ON;
}
-#else
-void
-_ecore_evas_extn_init(void)
-{
-}
-
-void
-_ecore_evas_extn_shutdown(void)
-{
-}
-
-#endif /* BUILD_ECORE_EVAS_EXTN */
EAPI Evas_Object *
-ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
+ecore_evas_extn_plug_new_internal(Ecore_Evas *ee_target)
{
-#ifdef BUILD_ECORE_EVAS_EXTN
Evas_Object *o;
Ecore_Evas *ee;
+ Ecore_Evas_Engine_Buffer_Data *bdata;
+ Ecore_Evas_Interface_Extn *iface;
int w = 1, h = 1;
if (!ee_target) return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ bdata = calloc(1, sizeof(Ecore_Evas_Engine_Buffer_Data));
+ if (!bdata)
+ {
+ free(ee);
+ return NULL;
+ }
+ ee->engine.data = bdata;
o = evas_object_image_filled_add(ee_target->evas);
/* this make problem in gl engine, so I'll block this until solve problem
evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);*/
ee->driver = "extn_plug";
+ iface = _ecore_evas_extn_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
+
ee->rotation = 0;
ee->visible = 0;
ee->w = w;
ee->prop.withdrawn = 0;
ee->prop.sticky = 0;
- ee->engine.buffer.image = o;
- evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
- evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ bdata->image = o;
+ evas_object_data_set(bdata->image, "Ecore_Evas", ee);
+ evas_object_data_set(bdata->image, "Ecore_Evas_Parent", ee_target);
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_IN,
_ecore_evas_extn_cb_mouse_in, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_OUT,
_ecore_evas_extn_cb_mouse_out, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_DOWN,
_ecore_evas_extn_cb_mouse_down, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_UP,
_ecore_evas_extn_cb_mouse_up, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_MOVE,
_ecore_evas_extn_cb_mouse_move, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MOUSE_WHEEL,
_ecore_evas_extn_cb_mouse_wheel, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_DOWN,
_ecore_evas_extn_cb_multi_down, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_UP,
_ecore_evas_extn_cb_multi_up, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_MULTI_MOVE,
_ecore_evas_extn_cb_multi_move, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FREE,
_ecore_evas_extn_cb_free, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_KEY_DOWN,
_ecore_evas_extn_cb_key_down, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_KEY_UP,
_ecore_evas_extn_cb_key_up, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_HOLD,
_ecore_evas_extn_cb_hold, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FOCUS_IN,
_ecore_evas_extn_cb_focus_in, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_FOCUS_OUT,
_ecore_evas_extn_cb_focus_out, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_SHOW,
_ecore_evas_extn_cb_show, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_HIDE,
_ecore_evas_extn_cb_hide, ee);
- evas_object_event_callback_add(ee->engine.buffer.image,
+ evas_object_event_callback_add(bdata->image,
EVAS_CALLBACK_DEL,
_ecore_evas_extn_plug_image_obj_del, ee);
evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_POST,
_ecore_evas_extn_plug_targer_render_post, ee);
return o;
-#else
- return NULL;
-#endif
}
-EAPI Eina_Bool
-ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
+static Eina_Bool
+_ecore_evas_extn_plug_connect(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
{
-#ifdef BUILD_ECORE_EVAS_EXTN
Extn *extn;
- Ecore_Evas *ee = NULL;
-
- if (!obj) return EINA_FALSE;
+ Ecore_Evas_Engine_Buffer_Data *bdata;
- ee = evas_object_data_get(obj, "Ecore_Evas");
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) return EINA_FALSE;
+ bdata = ee->engine.data;
if (!svcname)
{
- ee->engine.buffer.data = NULL;
+ bdata->data = NULL;
return EINA_FALSE;
}
extn = calloc(1, sizeof(Extn));
if (!extn) return EINA_FALSE;
+
+
Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
ecore_ipc_init();
extn->svc.num, ee);
if (!extn->ipc.server)
{
- ee->engine.buffer.data = NULL;
+ bdata->data = NULL;
eina_stringshare_del(extn->svc.name);
free(extn);
ecore_ipc_shutdown();
return EINA_FALSE;
}
- ee->engine.buffer.data = extn;
+ bdata->data = extn;
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
_ipc_server_data, ee));
return EINA_TRUE;
-#else
- return EINA_FALSE;
-#endif
}
-EAPI void
-ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
+static void
+_ecore_evas_extn_plug_object_data_lock(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_EXTN
- Ecore_Evas *ee;
-
- ee = ecore_evas_object_ecore_evas_get(obj);
if (!ee) return;
_ecore_evas_socket_lock(ee);
-#endif
}
-EAPI void
-ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
+static void
+_ecore_evas_extn_plug_object_data_unlock(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_EXTN
- Ecore_Evas *ee;
-
- ee = ecore_evas_object_ecore_evas_get(obj);
if (!ee) return;
_ecore_evas_socket_unlock(ee);
-#endif
}
-#ifdef BUILD_ECORE_EVAS_EXTN
static void
_ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
{
Extn *extn;
Evas_Engine_Info_Buffer *einfo;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
int stride = 0;
if (w < 1) w = 1;
evas_output_size_set(ee->evas, ee->w, ee->h);
evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (extn)
{
if (extn->file.shmfile)
shmfile_free(extn->file.shmfile);
- ee->engine.buffer.pixels = NULL;
+ bdata->pixels = NULL;
extn->file.shmfile = shmfile_new(extn->svc.name, extn->svc.num,
ee->w * ee->h * 4, extn->svc.sys);
if (extn->file.shmfile)
- ee->engine.buffer.pixels = extn->file.shmfile->addr;
+ bdata->pixels = extn->file.shmfile->addr;
stride = ee->w * 4;
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
else
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
- einfo->info.dest_buffer = ee->engine.buffer.pixels;
+ einfo->info.dest_buffer = bdata->pixels;
einfo->info.dest_buffer_row_bytes = stride;
einfo->info.use_color_key = 0;
einfo->info.alpha_threshold = 0;
_ecore_evas_extn_socket_window_profile_change_done_send(Ecore_Evas *ee)
{
Extn *extn;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Ecore_Ipc_Client *client;
Eina_List *l = NULL;
Ipc_Data_Profile *ipc;
char *st, *p;
int len = 0;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return;
len += sizeof(Ipc_Data_Profile);
Eina_Rectangle *r;
Extn *extn;
Ecore_Ipc_Client *client;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return rend;
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
{
}
if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
- if (ee->engine.buffer.pixels)
+ if (bdata->pixels)
{
_ecore_evas_socket_lock(ee);
updates = evas_render_updates(ee->evas);
{
Ecore_Ipc_Event_Client_Add *e = event;
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
extn->ipc.clients = eina_list_append(extn->ipc.clients, e->client);
{
Ecore_Ipc_Event_Client_Del *e = event;
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
{
Ecore_Ipc_Event_Client_Data *e = event;
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
return ECORE_CALLBACK_PASS_ON;
if (!eina_list_data_find(extn_ee_list, ee))
return ECORE_CALLBACK_PASS_ON;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (!extn) return ECORE_CALLBACK_PASS_ON;
if (e->major != MAJOR)
return ECORE_CALLBACK_PASS_ON;
static void
_ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
{
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
Extn *extn;
Eina_List *l;
Ecore_Ipc_Client *client;
if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
ee->alpha = alpha;
- extn = ee->engine.buffer.data;
+ extn = bdata->data;
if (extn)
{
Evas_Engine_Info_Buffer *einfo;
NULL, // screen_dpi_get
};
-#endif
-
EAPI Ecore_Evas *
-ecore_evas_extn_socket_new(int w, int h)
+ecore_evas_extn_socket_new_internal(int w, int h)
{
-#ifdef BUILD_ECORE_EVAS_EXTN
Evas_Engine_Info_Buffer *einfo;
+ Ecore_Evas_Interface_Extn *iface;
+ Ecore_Evas_Engine_Buffer_Data *bdata;
Ecore_Evas *ee;
int rmethod;
if (!rmethod) return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ bdata = calloc(1, sizeof(Ecore_Evas_Engine_Buffer_Data));
+ if (!bdata)
+ {
+ free(ee);
+ return NULL;
+ }
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
+ ee->engine.data = bdata;
ee->driver = "extn_socket";
+ iface = _ecore_evas_extn_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
+
ee->rotation = 0;
ee->visible = 0;
ee->w = w;
_ecore_evas_register(ee);
return ee;
-#else
- return NULL;
-#endif
}
-EAPI Eina_Bool
-ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
+Eina_Bool
+_ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
{
-#ifdef BUILD_ECORE_EVAS_EXTN
Extn *extn;
+ Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
extn = calloc(1, sizeof(Extn));
if (!extn)
ecore_ipc_shutdown();
return EINA_FALSE;
}
- ee->engine.buffer.data = extn;
+ bdata->data = extn;
extn->ipc.handlers = eina_list_append
(extn->ipc.handlers,
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
_ipc_client_data, ee));
}
return EINA_TRUE;
-#else
- return EINA_FALSE;
-#endif
}
+
+static Ecore_Evas_Interface_Extn *
+_ecore_evas_extn_interface_new(void)
+{
+ Ecore_Evas_Interface_Extn *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Extn));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_extn_name;
+ iface->base.version = interface_extn_version;
+
+ iface->data_lock = _ecore_evas_extn_plug_object_data_lock;
+ iface->data_unlock = _ecore_evas_extn_plug_object_data_unlock;
+ iface->connect = _ecore_evas_extn_plug_connect;
+ iface->listen = _ecore_evas_extn_socket_listen;
+
+ return iface;
+}
+
+EINA_MODULE_INIT(_ecore_evas_extn_init);
+EINA_MODULE_SHUTDOWN(_ecore_evas_extn_shutdown);
# include <config.h>
#endif
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
#include "Ecore.h"
#include "ecore_private.h"
#include "Ecore_Input.h"
#include "Ecore_Input_Evas.h"
-#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
#include <Ecore_Cocoa.h>
#include <Evas_Engine_GL_Cocoa.h>
-#endif
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
-
-
-#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
// FIXME: this engine has lots of problems. only 1 window at a time, drawRect looks wrong, doesnt handle resizes and more
NULL,
NULL // screen_dpi_get
};
-#endif
EAPI Ecore_Evas *
-ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
+ecore_evas_cocoa_new_internal(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
{
-#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
Evas_Engine_Info_GL_Cocoa *einfo;
Ecore_Evas *ee;
int rmethod;
ecore_cocoa_shutdown();
return NULL;
-#else
- ERR("Cocoa support in ecore-evas not enabled");
- return NULL;
- (void) parent;
- (void) x; (void) y; (void) w; (void) h;
-#endif
}
#include <dirent.h>
#include <Ecore.h>
-#include "ecore_private.h"
-#ifdef BUILD_ECORE_EVAS_FB
+#include <Ecore_Evas.h>
#include <Ecore_Fb.h>
+#include <ecore_evas_private.h>
#include <ecore_fb_private.h>
-#endif
+#include <ecore_private.h>
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
+#include <Eina.h>
+#include <Evas_Engine_FB.h>
-#ifdef BUILD_ECORE_EVAS_FB
static int _ecore_evas_init_count = 0;
static char *ecore_evas_default_display = "0";
static Eina_List *ecore_evas_input_devices = NULL;
static Ecore_Event_Handler *ecore_evas_event_handlers[4] = {NULL, NULL, NULL, NULL};
+typedef struct _Ecore_Evas_Engine_FB_Data Ecore_Evas_Engine_FB_Data;
+
+struct _Ecore_Evas_Engine_FB_Data {
+ int real_w;
+ int real_h;
+};
+
static void
_ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y)
{
}
}
-static Ecore_Evas *fb_ee = NULL;
-
-static Ecore_Evas *
-_ecore_evas_fb_match(void)
-{
- return fb_ee;
-}
-
static void
-_ecore_evas_fb_lose(void *data EINA_UNUSED)
+_ecore_evas_fb_lose(void *data)
{
+ Ecore_Evas *ee = data;
Eina_List *ll;
Ecore_Fb_Input_Device *dev;
- if (fb_ee) fb_ee->visible = 0;
+ if (ee) ee->visible = 0;
EINA_LIST_FOREACH(ecore_evas_input_devices, ll, dev)
ecore_fb_input_device_listen(dev, 0);
}
static void
-_ecore_evas_fb_gain(void *data EINA_UNUSED)
+_ecore_evas_fb_gain(void *data)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
Eina_List *ll;
Ecore_Fb_Input_Device *dev;
- if (fb_ee)
+ if (ee)
{
- ee = fb_ee;
-
ee->visible = 1;
if ((ee->rotation == 90) || (ee->rotation == 270))
evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
}
static Eina_Bool
-_ecore_evas_event_mouse_button_down(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+_ecore_evas_event_mouse_button_down(void *data, int type EINA_UNUSED, void *event)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
Ecore_Event_Mouse_Button *e;
e = event;
- ee = _ecore_evas_fb_match();
if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
-_ecore_evas_event_mouse_button_up(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+_ecore_evas_event_mouse_button_up(void *data, int type EINA_UNUSED, void *event)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
Ecore_Event_Mouse_Button *e;
e = event;
- ee = _ecore_evas_fb_match();
if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
-_ecore_evas_event_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+_ecore_evas_event_mouse_move(void *data, int type EINA_UNUSED, void *event)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
Ecore_Event_Mouse_Move *e;
e = event;
- ee = _ecore_evas_fb_match();
if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
-_ecore_evas_event_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+_ecore_evas_event_mouse_wheel(void *data, int type EINA_UNUSED, void *event)
{
- Ecore_Evas *ee;
+ Ecore_Evas *ee = data;
Ecore_Event_Mouse_Wheel *e;
e = event;
- ee = _ecore_evas_fb_match();
if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return ECORE_CALLBACK_PASS_ON;
{
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
if (ee2->engine.func->fn_render)
- rend |= ee2->engine.func->fn_render(ee2);
+ rend |= ee2->engine.func->fn_render(ee2);
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
}
return _ecore_evas_init_count;
}
+int
+_ecore_evas_fb_shutdown(void)
+{
+ _ecore_evas_init_count--;
+ if (_ecore_evas_init_count == 0)
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (ecore_evas_event_handlers[i])
+ ecore_event_handler_del(ecore_evas_event_handlers[i]);
+ }
+ ecore_fb_ts_shutdown();
+ ecore_event_evas_shutdown();
+ }
+ if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+ return _ecore_evas_init_count;
+}
+
static void
_ecore_evas_fb_free(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_FB_Data *idata = ee->engine.data;
+
ecore_evas_input_event_unregister(ee);
- if (fb_ee == ee) fb_ee = NULL;
+ free(idata);
_ecore_evas_fb_shutdown();
ecore_fb_shutdown();
}
{
Eina_List *l;
Ecore_Fb_Input_Device *dev;
+ Ecore_Evas_Engine_FB_Data *idata = ee->engine.data;
int resized = 0;
if (((ee->prop.fullscreen) && (on)) ||
{
int w, h;
- ee->engine.fb.real_w = ee->w;
- ee->engine.fb.real_h = ee->h;
+ idata->real_w = ee->w;
+ idata->real_h = ee->h;
w = ee->w;
h = ee->h;
ecore_fb_size_get(&w, &h);
}
else
{
- if ((ee->engine.fb.real_w != ee->w) || (ee->engine.fb.real_h != ee->h)) resized = 1;
- ee->w = ee->engine.fb.real_w;
- ee->h = ee->engine.fb.real_h;
+ if ((idata->real_w != ee->w) || (idata->real_h != ee->h)) resized = 1;
+ ee->w = idata->real_w;
+ ee->h = idata->real_h;
ee->req.w = ee->w;
ee->req.h = ee->h;
evas_output_size_set(ee->evas, ee->w, ee->h);
}
}
-int
-_ecore_evas_fb_shutdown(void)
-{
- _ecore_evas_init_count--;
- if (_ecore_evas_init_count == 0)
- {
- int i;
-
- for (i = 0; i < 4; i++)
- {
- if (ecore_evas_event_handlers[i])
- ecore_event_handler_del(ecore_evas_event_handlers[i]);
- }
- ecore_fb_ts_shutdown();
- ecore_event_evas_shutdown();
- }
- if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
- return _ecore_evas_init_count;
-}
-
static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
{
_ecore_evas_fb_free,
NULL, // render
NULL, // screen_geometry_get
NULL // screen_dpi_get
-};
-#endif
+ };
-/**
- * @brief Create Ecore_Evas using fb backend.
- * @param disp_name The name of the display to be used.
- * @param rotation The rotation to be used.
- * @param w The width of the Ecore_Evas to be created.
- * @param h The height of the Ecore_Evas to be created.
- * @return The new Ecore_Evas.
- */
-#ifdef BUILD_ECORE_EVAS_FB
-EAPI Ecore_Evas *
-ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
+Ecore_Evas *
+ecore_evas_fb_new_internal(const char *disp_name, int rotation, int w, int h)
{
Evas_Engine_Info_FB *einfo;
+ Ecore_Evas_Engine_FB_Data *idata;
Ecore_Evas *ee;
int rmethod;
if (!rmethod) return NULL;
if (!ecore_fb_init(disp_name)) return NULL;
- ecore_fb_callback_gain_set(_ecore_evas_fb_gain, NULL);
- ecore_fb_callback_lose_set(_ecore_evas_fb_lose, NULL);
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ idata = calloc(1, sizeof(Ecore_Evas_Engine_FB_Data));
+
+ ee->engine.data = idata;
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
_ecore_evas_fb_init(ee, w, h);
+ ecore_fb_callback_gain_set(_ecore_evas_fb_gain, ee);
+ ecore_fb_callback_lose_set(_ecore_evas_fb_lose, ee);
+
ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_fb_engine_func;
ee->driver = "fb";
ee->engine.func->fn_render = _ecore_evas_fb_render;
_ecore_evas_register(ee);
- fb_ee = ee;
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
return ee;
}
-#else
-EAPI Ecore_Evas *
-ecore_evas_fb_new(const char *disp_name EINA_UNUSED, int rotation EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
-{
- return NULL;
-}
-#endif
#include "ecore_evas_private.h"
#include "Ecore_Evas.h"
-#ifdef BUILD_ECORE_EVAS_PSL1GHT
#include <Ecore_Psl1ght.h>
#include <Evas_Engine_PSL1GHT.h>
{
int rend = 0;
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
Eina_List *ll;
Ecore_Evas *ee2;
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
{
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
- rend |= _ecore_evas_buffer_render(ee2);
+ rend |= ecore_evas_buffer_render(ee2);
if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
}
-#endif
if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
};
EAPI Ecore_Evas *
-ecore_evas_psl1ght_new(const char *name, int w, int h)
+ecore_evas_psl1ght_new_internal(const char *name, int w, int h)
{
void *einfo;
Ecore_Evas *ee;
return ee;
}
-
-#else /* BUILD_ECORE_EVAS_PSL1GHT */
-
-EAPI Ecore_Evas *
-ecore_evas_psl1ght_new(const char *name EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
-{
- ERR("OUTCH !");
- return NULL;
-}
-
-#endif /* BUILD_ECORE_EVAS_PSL1GHT */
# include <config.h>
#endif
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+
#include <Ecore.h>
#include <Ecore_Input.h>
#include <Ecore_Input_Evas.h>
-#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
-# include <Ecore_Sdl.h>
-# ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+#include <Ecore_Sdl.h>
+#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
# include <Evas_Engine_GL_SDL.h>
-# endif
#endif
#include <stdlib.h>
#include <string.h>
-
-#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
#include <SDL/SDL.h>
-#endif
-
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
-
/*
* SDL only handle one window at a time. That's by definition, there is nothing wrong here.
*
*/
-#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
/* static char *ecore_evas_default_display = "0"; */
/* static Ecore_List *ecore_evas_input_devices = NULL; */
sdl_ee = ee;
return ee;
}
-#endif
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
-EAPI Ecore_Evas*
-ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
+EAPI Ecore_Evas *
+ecore_evas_sdl_new_internal(const char* name, int w, int h, int fullscreen,
+ int hwsurface, int noframe, int alpha)
{
Ecore_Evas *ee;
int rmethod;
ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha);
return ee;
}
-#else
-EAPI Ecore_Evas*
-ecore_evas_sdl_new(const char* name EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, int fullscreen EINA_UNUSED, int hwsurface EINA_UNUSED, int noframe EINA_UNUSED, int alpha EINA_UNUSED)
-{
- ERR("OUTCH !");
- return NULL;
-}
-#endif
EAPI Ecore_Evas*
-ecore_evas_sdl16_new(const char* name EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, int fullscreen EINA_UNUSED, int hwsurface EINA_UNUSED, int noframe EINA_UNUSED, int alpha EINA_UNUSED)
+ecore_evas_sdl16_new_internal(const char* name EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, int fullscreen EINA_UNUSED, int hwsurface EINA_UNUSED, int noframe EINA_UNUSED, int alpha EINA_UNUSED)
{
ERR("OUTCH !");
return NULL;
}
#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
-EAPI Ecore_Evas*
-ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe)
+EAPI Ecore_Evas *
+ecore_evas_gl_sdl_new_internal(const char* name, int w, int h, int fullscreen, int noframe)
{
Ecore_Evas *ee;
int rmethod;
if (ee) ee->driver = "gl_sdl";
return ee;
}
-#else
-EAPI Ecore_Evas*
-ecore_evas_gl_sdl_new(const char* name EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, int fullscreen EINA_UNUSED, int noframe EINA_UNUSED)
-{
- ERR("OUTCH !");
- return NULL;
-}
#endif
# include "config.h"
#endif
-//#define LOGFNS 1
-
-#ifdef LOGFNS
-# include <stdio.h>
-# define LOGFN(fl, ln, fn) \
- printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
-#else
-# define LOGFN(fl, ln, fn)
-#endif
+#include "ecore_evas_wayland_private.h"
+
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
+static const char *interface_wl_name = "wayland";
+static const int interface_wl_version = 1;
/* local structures */
typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data;
static int _ecore_evas_wl_init_count = 0;
static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
+
static Eina_Bool
_ecore_evas_wl_common_cb_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
{
void
_ecore_evas_wl_common_pre_free(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
- if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame);
+ wdata = ee->engine.data;
+ if (wdata->frame) evas_object_del(wdata->frame);
}
void
_ecore_evas_wl_common_free(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
- if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
- ee->engine.wl.win = NULL;
+ wdata = ee->engine.data;
+ if (wdata->win) ecore_wl_window_free(wdata->win);
+ wdata->win = NULL;
+ free(wdata);
ecore_event_window_unregister(ee->prop.window);
ecore_evas_input_event_unregister(ee);
void
_ecore_evas_wl_common_resize(Ecore_Evas *ee, int w, int h)
{
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (w < 1) w = 1;
ecore_evas_avoid_damage_set(ee, pdam);
}
- if (ee->engine.wl.frame)
- evas_object_resize(ee->engine.wl.frame, w, h);
+ if (wdata->frame)
+ evas_object_resize(wdata->frame, w, h);
}
}
void
_ecore_evas_wl_common_move(Ecore_Evas *ee, int x, int y)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
+ wdata = ee->engine.data;
ee->req.x = x;
ee->req.y = y;
{
ee->x = x;
ee->y = y;
- if (ee->engine.wl.win)
- ecore_wl_window_update_location(ee->engine.wl.win, x, y);
+ if (wdata->win)
+ ecore_wl_window_update_location(wdata->win, x, y);
if (ee->func.fn_move) ee->func.fn_move(ee);
}
}
void
_ecore_evas_wl_common_raise(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (!ee->visible)) return;
- ecore_wl_window_raise(ee->engine.wl.win);
+ wdata = ee->engine.data;
+ ecore_wl_window_raise(wdata->win);
}
void
_ecore_evas_wl_common_title_set(Ecore_Evas *ee, const char *title)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
if (ee->prop.title) free(ee->prop.title);
ee->prop.title = NULL;
if (title) ee->prop.title = strdup(title);
- if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
+ wdata = ee->engine.data;
+ if ((ee->prop.draw_frame) && (wdata->frame))
{
EE_Wl_Smart_Data *sd;
- if ((sd = evas_object_smart_data_get(ee->engine.wl.frame)))
+ if ((sd = evas_object_smart_data_get(wdata->frame)))
evas_object_text_text_set(sd->text, ee->prop.title);
}
- if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
- wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
+ if ((ee->prop.title) && (wdata->win->shell_surface))
+ wl_shell_surface_set_title(wdata->win->shell_surface,
ee->prop.title);
}
void
_ecore_evas_wl_common_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
+ wdata = ee->engine.data;
if (ee->prop.name) free(ee->prop.name);
if (ee->prop.clas) free(ee->prop.clas);
ee->prop.name = NULL;
if (n) ee->prop.name = strdup(n);
if (c) ee->prop.clas = strdup(c);
- if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
- wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
+ if ((ee->prop.clas) && (wdata->win->shell_surface))
+ wl_shell_surface_set_class(wdata->win->shell_surface,
ee->prop.clas);
}
_ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y, fx, fy;
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
- ecore_wl_window_cursor_default_restore(ee->engine.wl.win);
+ ecore_wl_window_cursor_default_restore(wdata->win);
return;
}
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
- ecore_wl_window_pointer_set(ee->engine.wl.win, NULL, 0, 0);
+ ecore_wl_window_pointer_set(wdata->win, NULL, 0, 0);
evas_pointer_output_xy_get(ee->evas, &x, &y);
evas_output_framespace_get(ee->evas, &fx, &fy, NULL, NULL);
void
_ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, int max)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
+ wdata = ee->engine.data;
if (ee->prop.maximized == max) return;
ee->prop.maximized = max;
- ecore_wl_window_maximized_set(ee->engine.wl.win, max);
+ ecore_wl_window_maximized_set(wdata->win, max);
}
void
_ecore_evas_wl_common_fullscreen_set(Ecore_Evas *ee, int full)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
if (ee->prop.fullscreen == full) return;
+ wdata = ee->engine.data;
ee->prop.fullscreen = full;
- ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
+ ecore_wl_window_fullscreen_set(wdata->win, full);
}
void
{
int rend = 0;
Eina_List *updates = NULL;
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
Eina_Rectangle *r;
EINA_LIST_FOREACH(updates, l, r)
- ecore_wl_window_damage(ee->engine.wl.win,
+ ecore_wl_window_damage(wdata->win,
r->x, r->y, r->w, r->h);
ecore_wl_flush();
if (xdpi) *xdpi = dpi;
if (ydpi) *ydpi = dpi;
}
+
+static void
+_ecore_evas_wayland_resize(Ecore_Evas *ee, int location)
+{
+ if (!ee) return;
+ if (!strcmp(ee->driver, "wayland_shm"))
+ {
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+ _ecore_evas_wayland_shm_resize(ee, location);
+#endif
+ }
+ else if (!strcmp(ee->driver, "wayland_egl"))
+ {
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+ _ecore_evas_wayland_egl_resize(ee, location);
+#endif
+ }
+}
+
+static void
+_ecore_evas_wayland_move(Ecore_Evas *ee, int x, int y)
+{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
+ if (!ee) return;
+ if (!strncmp(ee->driver, "wayland", 7))
+ {
+ wdata = ee->engine.data;
+ if (wdata->win)
+ {
+ wdata->win->moving = EINA_TRUE;
+ ecore_wl_window_move(wdata->win, x, y);
+ }
+ }
+}
+
+static void
+_ecore_evas_wayland_type_set(Ecore_Evas *ee, int type)
+{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
+ if (!ee) return;
+ wdata = ee->engine.data;
+ ecore_wl_window_type_set(wdata->win, type);
+}
+
+static Ecore_Wl_Window *
+_ecore_evas_wayland_window_get(const Ecore_Evas *ee)
+{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
+ if (!(!strncmp(ee->driver, "wayland", 7)))
+ return NULL;
+
+ wdata = ee->engine.data;
+ return wdata->win;
+}
+
+static void
+_ecore_evas_wayland_pointer_set(Ecore_Evas *ee EINA_UNUSED, int hot_x EINA_UNUSED, int hot_y EINA_UNUSED)
+{
+
+}
+
+Ecore_Evas_Interface_Wayland *
+_ecore_evas_wl_interface_new(void)
+{
+ Ecore_Evas_Interface_Wayland *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Wayland));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_wl_name;
+ iface->base.version = interface_wl_version;
+
+ iface->resize = _ecore_evas_wayland_resize;
+ iface->move = _ecore_evas_wayland_move;
+ iface->pointer_set = _ecore_evas_wayland_pointer_set;
+ iface->type_set = _ecore_evas_wayland_type_set;
+ iface->window_get = _ecore_evas_wayland_window_get;
+
+ return iface;
+}
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-//#define LOGFNS 1
-
-#ifdef LOGFNS
-# include <stdio.h>
-# define LOGFN(fl, ln, fn) \
- printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
-#else
-# define LOGFN(fl, ln, fn)
-#endif
+#include "ecore_evas_wayland_private.h"
#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
-#endif
-
-#include <Eina.h>
-
-#include "Ecore_Evas.h"
-
-#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
-# include "ecore_evas_private.h"
# include <Evas_Engine_Wayland_Egl.h>
-# include <Ecore_Wayland.h>
+
/* local function prototypes */
static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
/* external functions */
EAPI Ecore_Evas *
-ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
+ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent,
+ int x, int y, int w, int h, Eina_Bool frame)
{
Ecore_Wl_Window *p = NULL;
Evas_Engine_Info_Wayland_Egl *einfo;
+ Ecore_Evas_Interface_Wayland *iface;
+ Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Evas *ee;
int method = 0, count = 0;
goto ee_err;
}
+ if (!(wdata = calloc(1, sizeof(Ecore_Evas_Engine_Wl_Data))))
+ {
+ ERR("Failed to allocate Ecore_Evas_Engine_Wl_Data");
+ free(ee);
+ goto ee_err;
+ }
+
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
_ecore_evas_wl_common_init();
ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
+ ee->engine.data = wdata;
+
+ iface = _ecore_evas_wl_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
ee->driver = "wayland_egl";
if (disp_name) ee->name = strdup(disp_name);
/* FIXME: Get if parent is alpha, and set */
- ee->engine.wl.parent = p;
- ee->engine.wl.win =
+ wdata->parent = p;
+ wdata->win =
ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW);
- ee->prop.window = ee->engine.wl.win->id;
+ ee->prop.window = wdata->win->id;
if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
{
if (ee->prop.draw_frame)
{
- ee->engine.wl.frame = _ecore_evas_wl_common_frame_add(ee->evas);
- evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
- evas_object_move(ee->engine.wl.frame, 0, 0);
+ wdata->frame = _ecore_evas_wl_common_frame_add(ee->evas);
+ evas_object_is_frame_object_set(wdata->frame, EINA_TRUE);
+ evas_object_move(wdata->frame, 0, 0);
}
_ecore_evas_register(ee);
static void
_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
ee->req.w = w;
ee->req.h = h;
+ wdata = ee->engine.data;
if (!ee->prop.fullscreen)
{
int fw = 0, fh = 0;
ecore_evas_avoid_damage_set(ee, pdam);
}
- if (ee->engine.wl.frame)
- evas_object_resize(ee->engine.wl.frame, w, h);
+ if (wdata->frame)
+ evas_object_resize(wdata->frame, w, h);
- if (ee->engine.wl.win)
+ if (wdata->win)
{
- ecore_wl_window_update_size(ee->engine.wl.win, w, h);
- ecore_wl_window_buffer_attach(ee->engine.wl.win, NULL, 0, 0);
+ ecore_wl_window_update_size(wdata->win, w, h);
+ ecore_wl_window_buffer_attach(wdata->win, NULL, 0, 0);
}
if (ee->func.fn_resize) ee->func.fn_resize(ee);
_ecore_evas_wl_show(Ecore_Evas *ee)
{
Evas_Engine_Info_Wayland_Egl *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (ee->visible)) return;
- if (ee->engine.wl.win)
+ wdata = ee->engine.data;
+ if (wdata->win)
{
- ecore_wl_window_show(ee->engine.wl.win);
- ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
- ecore_wl_window_buffer_attach(ee->engine.wl.win, NULL, 0, 0);
+ ecore_wl_window_show(wdata->win);
+ ecore_wl_window_update_size(wdata->win, ee->w, ee->h);
+ ecore_wl_window_buffer_attach(wdata->win, NULL, 0, 0);
- if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
- wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
+ if ((ee->prop.clas) && (wdata->win->shell_surface))
+ wl_shell_surface_set_class(wdata->win->shell_surface,
ee->prop.clas);
- if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
- wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
+ if ((ee->prop.title) && (wdata->win->shell_surface))
+ wl_shell_surface_set_title(wdata->win->shell_surface,
ee->prop.title);
}
- if (ee->engine.wl.frame)
+ if (wdata->frame)
{
- evas_object_show(ee->engine.wl.frame);
- evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
+ evas_object_show(wdata->frame);
+ evas_object_resize(wdata->frame, ee->w, ee->h);
}
- if (ee->engine.wl.win)
+ if (wdata->win)
{
einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
if (!einfo)
return;
}
- einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win);
+ einfo->info.surface = ecore_wl_window_surface_get(wdata->win);
/* if (einfo->info.surface) */
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
/* else */
static void
_ecore_evas_wl_hide(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
Evas_Engine_Info_Wayland_Egl *einfo;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (!ee->visible)) return;
+ wdata = ee->engine.data;
einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
if (einfo)
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
}
- if (ee->engine.wl.win)
- ecore_wl_window_hide(ee->engine.wl.win);
+ if (wdata->win)
+ ecore_wl_window_hide(wdata->win);
ee->visible = 0;
ee->should_be_visible = 0;
void
_ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
- if (ee->engine.wl.win)
+ wdata = ee->engine.data;
+ if (wdata->win)
{
Evas_Engine_Info_Wayland_Egl *einfo;
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
}
- ee->engine.wl.win->resizing = EINA_TRUE;
- ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
+ wdata->win->resizing = EINA_TRUE;
+ ecore_wl_window_resize(wdata->win, ee->w, ee->h, location);
}
}
-#else
-EAPI Ecore_Evas *
-ecore_evas_wayland_egl_new(const char *disp_name EINA_UNUSED, unsigned int parent EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Eina_Bool frame EINA_UNUSED)
-{
- return NULL;
-}
#endif
--- /dev/null
+#ifndef _ECORE_EVAS_WAYLAND_PRIVATE_H_
+#define _ECORE_EVAS_WAYLAND_PRIVATE_H_
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+//#define LOGFNS 1
+#ifdef LOGFNS
+# include <stdio.h>
+# define LOGFN(fl, ln, fn) \
+ printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
+#else
+# define LOGFN(fl, ln, fn)
+#endif
+
+#include <Eina.h>
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+#include <Ecore_Wayland.h>
+
+typedef struct _Ecore_Evas_Engine_Wl_Data Ecore_Evas_Engine_Wl_Data;
+
+struct _Ecore_Evas_Engine_Wl_Data {
+ Ecore_Wl_Window *parent, *win;
+ Evas_Object *frame;
+
+# if defined(BUILD_ECORE_EVAS_WAYLAND_SHM)
+ struct wl_shm_pool *pool;
+ size_t pool_size;
+ void *pool_data;
+ struct wl_buffer *buffer;
+# endif
+};
+
+Ecore_Evas_Interface_Wayland *_ecore_evas_wl_interface_new(void);
+
+int _ecore_evas_wl_common_init(void);
+int _ecore_evas_wl_common_shutdown(void);
+void _ecore_evas_wl_common_pre_free(Ecore_Evas *ee);
+void _ecore_evas_wl_common_free(Ecore_Evas *ee);
+void _ecore_evas_wl_common_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_move(Ecore_Evas *ee, int x, int y);
+void _ecore_evas_wl_common_raise(Ecore_Evas *ee);
+void _ecore_evas_wl_common_title_set(Ecore_Evas *ee, const char *title);
+void _ecore_evas_wl_common_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
+void _ecore_evas_wl_common_size_min_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_size_max_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_size_base_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_size_step_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
+void _ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer);
+void _ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, int iconify);
+void _ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, int max);
+void _ecore_evas_wl_common_fullscreen_set(Ecore_Evas *ee, int full);
+void _ecore_evas_wl_common_ignore_events_set(Ecore_Evas *ee, int ignore);
+int _ecore_evas_wl_common_pre_render(Ecore_Evas *ee);
+int _ecore_evas_wl_common_render_updates(Ecore_Evas *ee);
+void _ecore_evas_wl_common_post_render(Ecore_Evas *ee);
+int _ecore_evas_wl_common_render(Ecore_Evas *ee);
+void _ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
+void _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi);
+
+Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas);
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+void _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location);
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+void _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location);
+#endif
+
+#endif /* _ECORE_EVAS_WAYLAND_PRIVATE_H_ */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-//#define LOGFNS 1
-
-#ifdef LOGFNS
-# include <stdio.h>
-# define LOGFN(fl, ln, fn) \
- printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
-#else
-# define LOGFN(fl, ln, fn)
-#endif
+#include "ecore_evas_wayland_private.h"
#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+# include <Evas_Engine_Wayland_Shm.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
-#endif
-
-#include <Eina.h>
-
-#include "Ecore_Evas.h"
-
-#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
-# include "ecore_evas_private.h"
-# include <Evas_Engine_Wayland_Shm.h>
-# include <Ecore_Wayland.h>
/* local function prototypes */
static void _ecore_evas_wl_free(Ecore_Evas *ee);
/* external functions */
EAPI Ecore_Evas *
-ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
+ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
{
Ecore_Wl_Window *p = NULL;
Evas_Engine_Info_Wayland_Shm *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
+ Ecore_Evas_Interface_Wayland *iface;
Ecore_Evas *ee;
int method = 0, count = 0;
ERR("Failed to allocate Ecore_Evas");
goto ee_err;
}
+ if (!(wdata = calloc(1, sizeof(Ecore_Evas_Engine_Wl_Data))))
+ {
+ ERR("Failed to allocate Ecore_Evas_Engine_Wl_Data");
+ free(ee);
+ goto ee_err;
+ }
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
_ecore_evas_wl_common_init();
ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
+ ee->engine.data = wdata;
+
+ iface = _ecore_evas_wl_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
ee->driver = "wayland_shm";
if (disp_name) ee->name = strdup(disp_name);
/* FIXME: Get if parent is alpha, and set */
- ee->engine.wl.parent = p;
- ee->engine.wl.win =
+ wdata->parent = p;
+ wdata->win =
ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
- ee->prop.window = ee->engine.wl.win->id;
+ ee->prop.window = wdata->win->id;
if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
{
if (ee->prop.draw_frame)
{
- ee->engine.wl.frame = _ecore_evas_wl_common_frame_add(ee->evas);
- evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
- evas_object_move(ee->engine.wl.frame, 0, 0);
+ wdata->frame = _ecore_evas_wl_common_frame_add(ee->evas);
+ evas_object_is_frame_object_set(wdata->frame, EINA_TRUE);
+ evas_object_move(wdata->frame, 0, 0);
}
_ecore_evas_register(ee);
err:
ecore_evas_free(ee);
_ecore_evas_wl_common_shutdown();
-
ee_err:
ecore_wl_shutdown();
return NULL;
_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
{
Evas_Engine_Info_Wayland_Shm *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
ee->req.w = w;
ee->req.h = h;
+ wdata = ee->engine.data;
+
if (!ee->prop.fullscreen)
{
int fw = 0, fh = 0;
ecore_evas_avoid_damage_set(ee, pdam);
}
- if (ee->engine.wl.frame)
- evas_object_resize(ee->engine.wl.frame, w, h);
+ if (wdata->frame)
+ evas_object_resize(wdata->frame, w, h);
_ecore_evas_wl_buffer_new(ee, w, h);
return;
}
- einfo->info.dest = ee->engine.wl.pool_data;
+ einfo->info.dest = wdata->pool_data;
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
- if (ee->engine.wl.win)
+ if (wdata->win)
{
- ecore_wl_window_update_size(ee->engine.wl.win, w, h);
- ecore_wl_window_buffer_attach(ee->engine.wl.win,
- ee->engine.wl.buffer, 0, 0);
+ ecore_wl_window_update_size(wdata->win, w, h);
+ ecore_wl_window_buffer_attach(wdata->win,
+ wdata->buffer, 0, 0);
}
if (ee->func.fn_resize) ee->func.fn_resize(ee);
_ecore_evas_wl_show(Ecore_Evas *ee)
{
Evas_Engine_Info_Wayland_Shm *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (ee->visible)) return;
_ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
+ wdata = ee->engine.data;
einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
if (!einfo)
return;
}
- einfo->info.dest = ee->engine.wl.pool_data;
+ einfo->info.dest = wdata->pool_data;
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
- if (ee->engine.wl.win)
+ if (wdata->win)
{
- ecore_wl_window_show(ee->engine.wl.win);
- ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
- ecore_wl_window_buffer_attach(ee->engine.wl.win,
- ee->engine.wl.buffer, 0, 0);
+ ecore_wl_window_show(wdata->win);
+ ecore_wl_window_update_size(wdata->win, ee->w, ee->h);
+ ecore_wl_window_buffer_attach(wdata->win,
+ wdata->buffer, 0, 0);
- if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
- wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
+ if ((ee->prop.clas) && (wdata->win->shell_surface))
+ wl_shell_surface_set_class(wdata->win->shell_surface,
ee->prop.clas);
- if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
- wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
+ if ((ee->prop.title) && (wdata->win->shell_surface))
+ wl_shell_surface_set_title(wdata->win->shell_surface,
ee->prop.title);
}
- if (ee->engine.wl.frame)
+ if (wdata->frame)
{
- evas_object_show(ee->engine.wl.frame);
- evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
+ evas_object_show(wdata->frame);
+ evas_object_resize(wdata->frame, ee->w, ee->h);
}
ee->visible = 1;
_ecore_evas_wl_hide(Ecore_Evas *ee)
{
Evas_Engine_Info_Wayland_Shm *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (!ee->visible)) return;
+ wdata = ee->engine.data;
_ecore_evas_wl_buffer_free(ee);
- munmap(ee->engine.wl.pool_data, ee->engine.wl.pool_size);
+ munmap(wdata->pool_data, wdata->pool_size);
einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
if ((einfo) && (einfo->info.dest))
evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
}
- if (ee->engine.wl.win)
- ecore_wl_window_hide(ee->engine.wl.win);
+ if (wdata->win)
+ ecore_wl_window_hide(wdata->win);
ee->visible = 0;
ee->should_be_visible = 0;
_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
{
Evas_Engine_Info_Wayland_Shm *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Wl_Window *win = NULL;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
if ((ee->alpha == alpha)) return;
ee->alpha = alpha;
+ wdata = ee->engine.data;
/* FIXME: NB: We should really add a ecore_wl_window_alpha_set function
* but we are in API freeze, so just hack it in for now and fix when
* freeze is over */
- if ((win = ee->engine.wl.win))
+ if ((win = wdata->win))
win->alpha = alpha;
- /* if (ee->engine.wl.win) */
- /* ecore_wl_window_transparent_set(ee->engine.wl.win, alpha); */
+ /* if (wdata->win) */
+ /* ecore_wl_window_transparent_set(wdata->win, alpha); */
_ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
{
einfo->info.destination_alpha = alpha;
- einfo->info.dest = ee->engine.wl.pool_data;
+ einfo->info.dest = wdata->pool_data;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
if (win)
{
ecore_wl_window_update_size(win, ee->w, ee->h);
- ecore_wl_window_buffer_attach(win, ee->engine.wl.buffer, 0, 0);
+ ecore_wl_window_buffer_attach(win, wdata->buffer, 0, 0);
}
}
_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
{
Evas_Engine_Info_Wayland_Shm *einfo;
+ Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((ee->transparent == transparent)) return;
ee->transparent = transparent;
- if (ee->engine.wl.win)
- ecore_wl_window_transparent_set(ee->engine.wl.win, transparent);
+ wdata = ee->engine.data;
+ if (wdata->win)
+ ecore_wl_window_transparent_set(wdata->win, transparent);
_ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
{
einfo->info.destination_alpha = transparent;
- einfo->info.dest = ee->engine.wl.pool_data;
+ einfo->info.dest = wdata->pool_data;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
}
- if (ee->engine.wl.win)
+ if (wdata->win)
{
- ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
- ecore_wl_window_buffer_attach(ee->engine.wl.win,
- ee->engine.wl.buffer, 0, 0);
+ ecore_wl_window_update_size(wdata->win, ee->w, ee->h);
+ ecore_wl_window_buffer_attach(wdata->win,
+ wdata->buffer, 0, 0);
}
}
{
Ecore_Evas *ee = data;
Ecore_Wl_Window *win = NULL;
+ Ecore_Evas_Engine_Wl_Data *wdata;
if (!ee) return;
- if (!(win = ee->engine.wl.win)) return;
+ wdata = ee->engine.data;
+ if (!(win = wdata->win)) return;
win->frame_callback = NULL;
win->frame_pending = EINA_FALSE;
{
int rend = 0;
Ecore_Wl_Window *win = NULL;
+ Ecore_Evas_Engine_Wl_Data *wdata;
if (!ee) return 0;
if (!ee->visible)
return 0;
}
- if (!(win = ee->engine.wl.win)) return 0;
+ wdata = ee->engine.data;
+ if (!(win = wdata->win)) return 0;
rend = _ecore_evas_wl_common_pre_render(ee);
if (!(win->frame_pending))
static void
_ecore_evas_wl_shm_pool_free(Ecore_Evas *ee)
{
- if (!ee->engine.wl.pool) return;
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
+ if (!wdata->pool) return;
- wl_shm_pool_destroy(ee->engine.wl.pool);
- ee->engine.wl.pool = NULL;
- ee->engine.wl.pool_size = 0;
- ee->engine.wl.pool_data = NULL;
+ wl_shm_pool_destroy(wdata->pool);
+ wdata->pool = NULL;
+ wdata->pool_size = 0;
+ wdata->pool_data = NULL;
}
static void
_ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size)
{
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
struct wl_shm *shm;
void *data;
char tmp[PATH_MAX];
LOGFN(__FILE__, __LINE__, __FUNCTION__);
- if (size <= ee->engine.wl.pool_size)
+ if (size <= wdata->pool_size)
return;
size *= 1.5;
goto end;
}
- ee->engine.wl.pool_size = size;
- ee->engine.wl.pool_data = data;
- ee->engine.wl.pool = wl_shm_create_pool(shm, fd, size);
+ wdata->pool_size = size;
+ wdata->pool_data = data;
+ wdata->pool = wl_shm_create_pool(shm, fd, size);
end:
close(fd);
static void
_ecore_evas_wl_buffer_free(Ecore_Evas *ee)
{
- if (!ee->engine.wl.buffer) return;
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
+ if (!wdata->buffer) return;
- wl_buffer_destroy(ee->engine.wl.buffer);
- ee->engine.wl.buffer = NULL;
+ wl_buffer_destroy(wdata->buffer);
+ wdata->buffer = NULL;
}
static void
_ecore_evas_wl_buffer_new(Ecore_Evas *ee, int w, int h)
{
+ Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
unsigned int format;
int stride = 0;
format = WL_SHM_FORMAT_XRGB8888;
_ecore_evas_wl_buffer_free(ee);
- ee->engine.wl.buffer =
- wl_shm_pool_create_buffer(ee->engine.wl.pool, 0, w, h, stride, format);
+ wdata->buffer =
+ wl_shm_pool_create_buffer(wdata->pool, 0, w, h, stride, format);
}
void
_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
{
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ee) return;
- if (ee->engine.wl.win)
+ wdata = ee->engine.data;
+ if (wdata->win)
{
- ee->engine.wl.win->resizing = EINA_TRUE;
- ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
+ wdata->win->resizing = EINA_TRUE;
+ ecore_wl_window_resize(wdata->win, ee->w, ee->h, location);
}
}
-#else
-EAPI Ecore_Evas *
-ecore_evas_wayland_shm_new(const char *disp_name EINA_UNUSED, unsigned int parent EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, Eina_Bool frame EINA_UNUSED)
-{
- return NULL;
-}
#endif
#include <Ecore.h>
#include "ecore_private.h"
-#ifdef BUILD_ECORE_EVAS_WIN32
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# undef WIN32_LEAN_AND_MEAN
-# include <Ecore_Win32.h>
-# include <ecore_win32_private.h>
-#endif /* BUILD_ECORE_EVAS_WIN32 */
-
#include "ecore_evas_private.h"
#include "Ecore_Evas.h"
+#include "Ecore_Win32.h"
+#include "ecore_win32_private.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+# include <Evas_Engine_Software_Gdi.h>
+#ndif
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
+# include <Evas_Engine_Software_DDraw.h>
+#endif
+#ifdef BUILD_ECORE_EVAS_DIRECT3D
+# include <Evas_Engine_Direct3D.h>
+#endif
+#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
+# include <Evas_Engine_GL_Glew.h>
+#endif
+
#ifdef BUILD_ECORE_EVAS_WIN32
#define ECORE_EVAS_EVENT_COUNT 10
static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
+
+typedef struct _Ecore_Evas_Engine_Data_Win32 Ecore_Evas_Engine_Data_Win32;
+
+struct _Ecore_Evas_Engine_Data_Win32 {
+ Ecore_Win32_Window *parent;
+ struct {
+ unsigned char region : 1;
+ unsigned char fullscreen : 1;
+ } state;
+};
+
+static Ecore_Evas_Interface_Win32 *_ecore_evas_win32_interface_new(void);
+
static Eina_Bool _ecore_evas_win32_event_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
static Eina_Bool _ecore_evas_win32_event_mouse_out(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
static void
_ecore_evas_win32_shaped_set(Ecore_Evas *ee, int shaped)
{
+ Ecore_Evas_Engine_Data_Win32 *wdata;
if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
return;
+ wdata = ee->engine.data;
if (!strcmp(ee->driver, "software_ddraw")) return;
#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
ee->shaped = shaped;
if (einfo)
{
- ee->engine.win32.state.region = ee->shaped;
- einfo->info.region = ee->engine.win32.state.region;
+ wdata->state.region = ee->shaped;
+ einfo->info.region = wdata->state.region;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
_ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
{
struct _Ecore_Win32_Window *window;
+ Ecore_Evas_Engine_Data_Win32 *wdata = ee->engine.data;
INF("ecore evas fullscreen set");
- if ((ee->engine.win32.state.fullscreen && on) ||
- (!ee->engine.win32.state.fullscreen && !on))
+ if ((wdata->state.fullscreen && on) ||
+ (!wdata->state.fullscreen && !on))
return;
- ee->engine.win32.state.fullscreen = on;
+ wdata->state.fullscreen = on;
ee->prop.fullscreen = on;
window = (struct _Ecore_Win32_Window *)ee->prop.window;
static void
_ecore_evas_win32_alpha_set(Ecore_Evas *ee, int alpha)
{
+ Ecore_Evas_Engine_Data_Win32 *wdata = ee->engine.data;
alpha = !!alpha;
if ((ee->alpha == alpha)) return;
/* else */
/* { */
/* if (ee->prop.override) */
- /* ee->prop.window = ecore_win32_window_override_new(ee->engine.win32.win_root, */
+ /* ee->prop.window = ecore_win32_window_override_new(wdata->win_root, */
/* ee->req.x, */
/* ee->req.y, */
/* ee->req.w, */
/* ee->req.h); */
/* else */
- /* ee->prop.window = ecore_win32_window_new(ee->engine.win32.win_root, */
+ /* ee->prop.window = ecore_win32_window_new(wdata->win_root, */
/* ee->req.x, */
/* ee->req.y, */
/* ee->req.w, */
/* ee->req.h); */
- /* if (ee->engine.win32.mask) ecore_x_pixmap_free(ee->engine.x.mask); */
- /* ee->engine.win32.mask = 0; */
+ /* if (wdata->mask) ecore_x_pixmap_free(ee->engine.x.mask); */
+ /* wdata->mask = 0; */
/* ecore_win32_window_shape_input_mask_set(ee->prop.window, 0); */
/* } */
// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
// ee->engine.x.mask = 0;
- /* einfo->info.mask = ee->engine.win32.mask; */
+ /* einfo->info.mask = wdata->mask; */
/* einfo->info.drawable = ee->prop.window; */
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
}
#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
-#ifdef BUILD_ECORE_EVAS_WIN32
static Ecore_Evas *
_ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
Ecore_Win32_Window *parent,
int height)
{
Ecore_Evas *ee;
+ Ecore_Evas_Engine_Data_Win32 *wdata;
if (!ecore_win32_init())
return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee)
return NULL;
+ wdata = calloc(1, sizeof(Ecore_Evas_Engine_Data_Win32));
+ if (!wdata)
+ {
+ free(ee);
+ return NULL;
+ }
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
_ecore_evas_win32_init();
ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_win32_engine_func;
+ ee->engine.data = wdata;
+
+ iface = _ecore_evas_win32_interface_new();
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
if (width < 1) width = 1;
if (height < 1) height = 1;
evas_output_size_set(ee->evas, width, height);
evas_output_viewport_set(ee->evas, 0, 0, width, height);
- ee->engine.win32.parent = parent;
+ wdata->parent = parent;
ee->prop.window = (Ecore_Window)ecore_win32_window_new(parent, x, y, width, height);
if (!ee->prop.window)
{
return ee;
}
-#endif /* BUILD_ECORE_EVAS_WIN32 */
-
#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
EAPI Ecore_Evas *
#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
-
-#ifdef BUILD_ECORE_EVAS_WIN32
-
-EAPI Ecore_Win32_Window *
-ecore_evas_win32_window_get(const Ecore_Evas *ee)
+static Ecore_Win32_Window *
+_ecore_evas_win32_window_get(const Ecore_Evas *ee)
{
return (Ecore_Win32_Window *) ecore_evas_window_get(ee);
}
-#else
-
-EAPI Ecore_Win32_Window *
-ecore_evas_win32_window_get(const Ecore_Evas *ee EINA_UNUSED)
+static Ecore_Evas_Interface_Win32 *
+_ecore_evas_win32_interface_new(void)
{
- return NULL;
-}
+ Ecore_Evas_Interface_Win32 *iface;
-#endif /* BUILD_ECORE_EVAS_WIN32 */
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Win32));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_win32_name;
+ iface->base.version = interface_win32_version;
+
+ iface->window_get = _ecore_evas_win32_window_get;
+
+ return iface;
+}
# include <config.h>
#endif
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
#include <stdlib.h>
#include <string.h>
#include <Eina.h>
#include <Ecore.h>
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
+#include <Ecore_X.h>
+#include <Ecore_X_Atoms.h>
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+# include <Evas_Engine_Software_X11.h>
+#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+# include <Evas_Engine_GL_X11.h>
+#endif
+
+#ifdef HAVE_ECORE_X_XCB
+# include <xcb/xcb.h>
+#endif
+
+#ifdef HAVE_ECORE_X_XLIB
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+#endif
-#ifdef BUILD_ECORE_EVAS_X11
static int _ecore_evas_init_count = 0;
static Ecore_Event_Handler *ecore_evas_event_handlers[13];
static int leader_ref = 0;
static Ecore_X_Window leader_win = 0;
+static const char *interface_x11_name = "x11";
+static const int interface_x11_version = 1;
+
+static const char *interface_software_x11_name = "software_x11";
+static const int interface_software_x11_version = 1;
+
+static const char *interface_gl_x11_name = "gl_x11";
+static const int interface_gl_x11_version = 1;
+
+typedef struct _Ecore_Evas_Engine_Data_X11 Ecore_Evas_Engine_Data_X11;
+
+struct _Ecore_Evas_Engine_Data_X11 {
+ Ecore_X_Window win_root;
+ Eina_List *win_extra;
+ Ecore_X_Pixmap pmap;
+ Ecore_X_Pixmap mask;
+ Ecore_X_GC gc;
+ Ecore_X_XRegion *damages;
+ Ecore_X_Sync_Counter sync_counter;
+ Ecore_X_Window leader;
+ Ecore_X_Sync_Counter netwm_sync_counter;
+ int netwm_sync_val_hi;
+ unsigned int netwm_sync_val_lo;
+ int sync_val; // bigger! this will screw up at 2 billion fram~
+ int screen_num;
+ int px, py, pw, ph;
+ unsigned char direct_resize : 1;
+ unsigned char using_bg_pixmap : 1;
+ unsigned char managed : 1;
+ unsigned char sync_began : 1;
+ unsigned char sync_cancel : 1;
+ unsigned char netwm_sync_set : 1;
+ unsigned char configure_coming : 1;
+ struct {
+ unsigned char modal : 1;
+ unsigned char sticky : 1;
+ unsigned char maximized_v : 1;
+ unsigned char maximized_h : 1;
+ unsigned char shaded : 1;
+ unsigned char skip_taskbar : 1;
+ unsigned char skip_pager : 1;
+ unsigned char fullscreen : 1;
+ unsigned char above : 1;
+ unsigned char below : 1;
+ } state;
+ struct {
+ unsigned char available : 1; // need to setup available profiles in a w
+ unsigned char change : 1; // need to send change event to the WM
+ unsigned char done : 1; // need to send change done event to the WM
+ } profile;
+ Ecore_X_Window win_shaped_input;
+};
+
+static Ecore_Evas_Interface_X11 * _ecore_evas_x_interface_x11_new(void);
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+static Ecore_Evas_Interface_Software_X11 *_ecore_evas_x_interface_software_x11_new(void);
+#endif
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+static Ecore_Evas_Interface_Gl_X11 *_ecore_evas_x_interface_gl_x11_new(void);
+#endif
+
static void
_ecore_evas_x_hints_update(Ecore_Evas *ee)
{
static void
_ecore_evas_x_group_leader_set(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
leader_ref++;
if (leader_ref == 1)
{
char *id = NULL;
leader_win =
- ecore_x_window_override_new(ee->engine.x.win_root, 1234, 5678, 1, 2);
+ ecore_x_window_override_new(edata->win_root, 1234, 5678, 1, 2);
ecore_x_window_defaults_set(leader_win);
if ((id = getenv("DESKTOP_STARTUP_ID")))
ecore_x_netwm_startup_id_set(leader_win,id);
ecore_x_icccm_client_leader_set(leader_win, leader_win);
}
- ee->engine.x.leader = leader_win;
+ edata->leader = leader_win;
ecore_x_icccm_client_leader_set(ee->prop.window, leader_win);
}
static void
_ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
ecore_x_window_prop_property_del(ee->prop.window,
ECORE_X_ATOM_WM_CLIENT_LEADER);
- if (ee->engine.x.leader == leader_win)
+ if (edata->leader == leader_win)
{
leader_ref--;
if (leader_ref <= 0)
ecore_x_window_free(leader_win);
leader_win = 0;
}
- ee->engine.x.leader = 0;
+ edata->leader = 0;
}
}
static void
_ecore_evas_x_group_leader_update(Ecore_Evas *ee)
{
- if (ee->engine.x.leader)
- ecore_x_icccm_client_leader_set(ee->prop.window, ee->engine.x.leader);
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+ if (edata->leader)
+ ecore_x_icccm_client_leader_set(ee->prop.window, edata->leader);
}
static void
_ecore_evas_x_protocols_set(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
Ecore_X_Atom protos[3];
unsigned int num = 0, tmp = 0;
protos[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
- if (!ee->engine.x.netwm_sync_counter)
- ee->engine.x.netwm_sync_counter = ecore_x_sync_counter_new(0);
+ if (!edata->netwm_sync_counter)
+ edata->netwm_sync_counter = ecore_x_sync_counter_new(0);
- tmp = ee->engine.x.netwm_sync_counter;
+ tmp = edata->netwm_sync_counter;
ecore_x_window_prop_card32_set(ee->prop.window,
ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
&tmp, 1);
static void
_ecore_evas_x_sync_set(Ecore_Evas *ee)
{
- Ecore_X_Sync_Counter sync_counter = ee->engine.x.sync_counter;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+ Ecore_X_Sync_Counter sync_counter = edata->sync_counter;
if (((ee->should_be_visible) || (ee->visible)) &&
- ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
+ ((ecore_x_e_comp_sync_supported_get(edata->win_root)) &&
(!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
{
- if (!ee->engine.x.sync_counter)
- ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
+ if (!edata->sync_counter)
+ edata->sync_counter = ecore_x_sync_counter_new(0);
}
else
{
- if (ee->engine.x.sync_counter)
+ if (edata->sync_counter)
{
- ecore_x_sync_counter_free(ee->engine.x.sync_counter);
- ee->engine.x.sync_val = 0;
+ ecore_x_sync_counter_free(edata->sync_counter);
+ edata->sync_val = 0;
}
- ee->engine.x.sync_counter = 0;
+ edata->sync_counter = 0;
}
- if (sync_counter != ee->engine.x.sync_counter)
- ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
+ if (sync_counter != edata->sync_counter)
+ ecore_x_e_comp_sync_counter_set(ee->prop.window, edata->sync_counter);
}
static void
_ecore_evas_x_sync_clear(Ecore_Evas *ee)
{
- if (!ee->engine.x.sync_counter) return;
- ecore_x_sync_counter_free(ee->engine.x.sync_counter);
- ee->engine.x.sync_val = 0;
- ee->engine.x.sync_counter = 0;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
+ if (!edata->sync_counter) return;
+ ecore_x_sync_counter_free(edata->sync_counter);
+ edata->sync_val = 0;
+ edata->sync_counter = 0;
}
static void
_ecore_evas_x_window_profile_protocol_set(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
/* check and set profile protocol hint */
- if (ecore_x_e_window_profile_supported_get(ee->engine.x.win_root))
+ if (ecore_x_e_window_profile_supported_get(edata->win_root))
{
unsigned int v = 1;
ecore_x_window_prop_card32_set
static void
_ecore_evas_x_window_profile_set(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (((ee->should_be_visible) || (ee->visible)) &&
(ee->profile_supported))
{
- if (ee->engine.x.profile.available)
+ if (edata->profile.available)
{
ecore_x_e_window_available_profiles_set
(ee->prop.window,
(const char **)ee->prop.profile.available_list,
(const int)ee->prop.profile.count);
- ee->engine.x.profile.available = 0;
+ edata->profile.available = 0;
}
- if (ee->engine.x.profile.change)
+ if (edata->profile.change)
{
if (ee->prop.profile.name)
{
&a, 1);
ecore_x_e_window_profile_change_send
- (ee->engine.x.win_root,
+ (edata->win_root,
ee->prop.window,
ee->prop.profile.name);
}
- ee->engine.x.profile.change = 0;
+ edata->profile.change = 0;
}
}
}
Eina_List *updates = NULL;
Eina_List *ll;
Ecore_Evas *ee2;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
- (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
- (!ee->engine.x.sync_cancel))
+ (edata->sync_counter) && (!edata->sync_began) &&
+ (!edata->sync_cancel))
return 0;
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
updates = evas_render_updates(ee->evas);
if (ee->prop.avoid_damage)
{
- if (ee->engine.x.using_bg_pixmap)
+ if (edata->using_bg_pixmap)
{
if (updates)
{
if (ee->shaped)
{
ecore_x_window_shape_mask_set(ee->prop.window,
- ee->engine.x.mask);
+ edata->mask);
}
if (ee->alpha)
{
-// ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
+// ecore_x_window_shape_input_mask_set(ee->prop.window, edata->mask);
}
_ecore_evas_idle_timeout_update(ee);
rend = 1;
Ecore_X_Rectangle rect;
Ecore_X_XRegion *tmpr;
- if (!ee->engine.x.damages)
- ee->engine.x.damages = ecore_x_xregion_new();
+ if (!edata->damages)
+ edata->damages = ecore_x_xregion_new();
tmpr = ecore_x_xregion_new();
if (ee->rotation == 0)
{
rect.width = r->h;
rect.height = r->w;
}
- ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages,
+ ecore_x_xregion_union_rect(tmpr, edata->damages,
&rect);
- ecore_x_xregion_free(ee->engine.x.damages);
- ee->engine.x.damages = tmpr;
+ ecore_x_xregion_free(edata->damages);
+ edata->damages = tmpr;
}
- if (ee->engine.x.damages)
+ if (edata->damages)
{
if (ee->shaped)
{
* disabling them just for setting the mask */
ecore_x_event_mask_unset(ee->prop.window, ECORE_X_EVENT_MASK_WINDOW_DAMAGE);
ecore_x_window_shape_mask_set(ee->prop.window,
- ee->engine.x.mask);
+ edata->mask);
/* and re-enable them again */
ecore_x_event_mask_set(ee->prop.window, ECORE_X_EVENT_MASK_WINDOW_DAMAGE);
}
- ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
- ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window,
- ee->engine.x.gc, 0, 0, ee->w, ee->h,
+ ecore_x_xregion_set(edata->damages, edata->gc);
+ ecore_x_pixmap_paste(edata->pmap, ee->prop.window,
+ edata->gc, 0, 0, ee->w, ee->h,
0, 0);
- ecore_x_xregion_free(ee->engine.x.damages);
- ee->engine.x.damages = NULL;
+ ecore_x_xregion_free(edata->damages);
+ edata->damages = NULL;
}
_ecore_evas_idle_timeout_update(ee);
rend = 1;
if (ee->shaped)
{
ecore_x_window_shape_mask_set(ee->prop.window,
- ee->engine.x.mask);
+ edata->mask);
}
if (ee->alpha)
{
-// ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
+// ecore_x_window_shape_input_mask_set(ee->prop.window, edata->mask);
}
_ecore_evas_idle_timeout_update(ee);
rend = 1;
static void
_ecore_evas_x_resize_shape(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (!strcmp(ee->driver, "software_x11"))
{
#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
unsigned int foreground;
Ecore_X_GC gc;
- if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
- ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+ if (edata->mask) ecore_x_pixmap_free(edata->mask);
+ edata->mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
foreground = 0;
- gc = ecore_x_gc_new(ee->engine.x.mask,
+ gc = ecore_x_gc_new(edata->mask,
ECORE_X_GC_VALUE_MASK_FOREGROUND,
&foreground);
- ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
+ ecore_x_drawable_rectangle_fill(edata->mask, gc,
0, 0, ee->w, ee->h);
ecore_x_gc_free(gc);
- einfo->info.mask = ee->engine.x.mask;
+ einfo->info.mask = edata->mask;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
{
Ecore_Evas *ee;
Ecore_X_Event_Window_Property *e;
+ Ecore_Evas_Engine_Data_X11 *edata;
int state_change = 0;
e = event;
ee = ecore_event_window_match(e->win);
if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
{
} prop;
} prev;
- prev.x.modal = ee->engine.x.state.modal;
- prev.x.sticky = ee->engine.x.state.sticky;
- prev.x.maximized_v = ee->engine.x.state.maximized_v;
- prev.x.maximized_h = ee->engine.x.state.maximized_h;
- prev.x.shaded = ee->engine.x.state.shaded;
- prev.x.skip_taskbar = ee->engine.x.state.skip_taskbar;
- prev.x.skip_pager = ee->engine.x.state.skip_pager;
- prev.x.fullscreen = ee->engine.x.state.fullscreen;
- prev.x.above = ee->engine.x.state.above;
- prev.x.below = ee->engine.x.state.below;
+ prev.x.modal = edata->state.modal;
+ prev.x.sticky = edata->state.sticky;
+ prev.x.maximized_v = edata->state.maximized_v;
+ prev.x.maximized_h = edata->state.maximized_h;
+ prev.x.shaded = edata->state.shaded;
+ prev.x.skip_taskbar = edata->state.skip_taskbar;
+ prev.x.skip_pager = edata->state.skip_pager;
+ prev.x.fullscreen = edata->state.fullscreen;
+ prev.x.above = edata->state.above;
+ prev.x.below = edata->state.below;
prev.prop.modal = ee->prop.modal;
prev.prop.maximized = ee->prop.maximized;
prev.prop.fullscreen = ee->prop.fullscreen;
prev.prop.focus_skip = ee->prop.focus_skip;
- ee->engine.x.state.modal = 0;
- ee->engine.x.state.sticky = 0;
- ee->engine.x.state.maximized_v = 0;
- ee->engine.x.state.maximized_h = 0;
- ee->engine.x.state.shaded = 0;
- ee->engine.x.state.skip_taskbar = 0;
- ee->engine.x.state.skip_pager = 0;
- ee->engine.x.state.fullscreen = 0;
- ee->engine.x.state.above = 0;
- ee->engine.x.state.below = 0;
+ edata->state.modal = 0;
+ edata->state.sticky = 0;
+ edata->state.maximized_v = 0;
+ edata->state.maximized_h = 0;
+ edata->state.shaded = 0;
+ edata->state.skip_taskbar = 0;
+ edata->state.skip_pager = 0;
+ edata->state.fullscreen = 0;
+ edata->state.above = 0;
+ edata->state.below = 0;
ee->prop.modal = 0;
ee->prop.maximized = 0;
switch (state[i])
{
case ECORE_X_WINDOW_STATE_MODAL:
- ee->engine.x.state.modal = 1;
+ edata->state.modal = 1;
ee->prop.modal = 1;
break;
case ECORE_X_WINDOW_STATE_STICKY:
ee->prop.sticky = 1;
- ee->engine.x.state.sticky = 1;
+ edata->state.sticky = 1;
break;
case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
- ee->engine.x.state.maximized_v = 1;
+ edata->state.maximized_v = 1;
ee->prop.maximized = 1;
break;
case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
- ee->engine.x.state.maximized_h = 1;
+ edata->state.maximized_h = 1;
ee->prop.maximized = 1;
break;
case ECORE_X_WINDOW_STATE_SHADED:
- ee->engine.x.state.shaded = 1;
+ edata->state.shaded = 1;
break;
case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
- ee->engine.x.state.skip_taskbar = 1;
+ edata->state.skip_taskbar = 1;
ee->prop.focus_skip = 1;
break;
case ECORE_X_WINDOW_STATE_SKIP_PAGER:
- ee->engine.x.state.skip_pager = 1;
+ edata->state.skip_pager = 1;
ee->prop.focus_skip = 1;
break;
case ECORE_X_WINDOW_STATE_FULLSCREEN:
ee->prop.fullscreen = 1;
- ee->engine.x.state.fullscreen = 1;
+ edata->state.fullscreen = 1;
break;
case ECORE_X_WINDOW_STATE_ABOVE:
- ee->engine.x.state.above = 1;
+ edata->state.above = 1;
break;
case ECORE_X_WINDOW_STATE_BELOW:
- ee->engine.x.state.below = 1;
+ edata->state.below = 1;
break;
default:
break;
free(state);
}
if (
-// (prev.x.modal != ee->engine.x.state.modal) ||
- (prev.x.sticky != ee->engine.x.state.sticky) ||
- (prev.x.maximized_v != ee->engine.x.state.maximized_v) ||
- (prev.x.maximized_h != ee->engine.x.state.maximized_h) ||
-// (prev.x.shaded != ee->engine.x.state.shaded) ||
-// (prev.x.skip_taskbar != ee->engine.x.state.skip_taskbar) ||
-// (prev.x.skip_pager != ee->engine.x.state.skip_pager) ||
- (prev.x.fullscreen != ee->engine.x.state.fullscreen) ||
-// (prev.x.above != ee->engine.x.state.above) ||
-// (prev.x.below != ee->engine.x.state.below) ||
+// (prev.x.modal != edata->state.modal) ||
+ (prev.x.sticky != edata->state.sticky) ||
+ (prev.x.maximized_v != edata->state.maximized_v) ||
+ (prev.x.maximized_h != edata->state.maximized_h) ||
+// (prev.x.shaded != edata->state.shaded) ||
+// (prev.x.skip_taskbar != edata->state.skip_taskbar) ||
+// (prev.x.skip_pager != edata->state.skip_pager) ||
+ (prev.x.fullscreen != edata->state.fullscreen) ||
+// (prev.x.above != edata->state.above) ||
+// (prev.x.below != edata->state.below) ||
// (prev.prop.modal != ee->prop.modal) ||
(prev.prop.maximized != ee->prop.maximized) ||
(prev.prop.sticky != ee->prop.sticky) ||
{
Ecore_Evas *ee;
Ecore_X_Event_Window_Visibility_Change *e;
+ Ecore_Evas_Engine_Data_X11 *edata;
e = event;
ee = ecore_event_window_match(e->win);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
// printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
if (e->fully_obscured)
{
/* FIXME: round trip */
- if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
+ if (!ecore_x_screen_is_composited(edata->screen_num))
ee->draw_ok = 0;
}
else
{
Ecore_Evas *ee;
Ecore_X_Event_Client_Message *e;
+ Ecore_Evas_Engine_Data_X11 *edata;
e = event;
if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
{
ee = ecore_event_window_match(e->data.l[0]);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->data.l[0] != (long)ee->prop.window)
return ECORE_CALLBACK_PASS_ON;
- if (!ee->engine.x.sync_began)
+ if (!edata->sync_began)
{
// qeue a damage + draw. work around an event re-ordering thing.
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
}
- ee->engine.x.sync_began = 1;
- ee->engine.x.sync_cancel = 0;
+ edata->sync_began = 1;
+ edata->sync_cancel = 0;
}
else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
{
ee = ecore_event_window_match(e->data.l[0]);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->data.l[0] != (long)ee->prop.window)
return ECORE_CALLBACK_PASS_ON;
- ee->engine.x.sync_began = 0;
- ee->engine.x.sync_cancel = 0;
+ edata->sync_began = 0;
+ edata->sync_cancel = 0;
}
else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
{
ee = ecore_event_window_match(e->data.l[0]);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->data.l[0] != (long)ee->prop.window)
return ECORE_CALLBACK_PASS_ON;
- ee->engine.x.sync_began = 0;
- ee->engine.x.sync_cancel = 1;
+ edata->sync_began = 0;
+ edata->sync_cancel = 1;
}
else if ((e->message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
(e->data.l[0] == (int)ECORE_X_ATOM_NET_WM_SYNC_REQUEST))
{
ee = ecore_event_window_match(e->win);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
- ee->engine.x.netwm_sync_val_lo = (unsigned int)e->data.l[2];
- ee->engine.x.netwm_sync_val_hi = (int)e->data.l[3];
- ee->engine.x.netwm_sync_set = 1;
+ edata = ee->engine.data;
+ edata->netwm_sync_val_lo = (unsigned int)e->data.l[2];
+ edata->netwm_sync_val_hi = (int)e->data.l[3];
+ edata->netwm_sync_set = 1;
}
else if ((e->message_type == ECORE_X_ATOM_E_WINDOW_PROFILE_CHANGE_REQUEST))
{
ee = ecore_event_window_match(e->win);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (ee->profile_supported)
{
char *p = ecore_x_atom_name_get(e->data.l[1]);
if (ee->func.fn_state_change)
ee->func.fn_state_change(ee);
- ee->engine.x.profile.done = 1;
+ edata->profile.done = 1;
free(p);
}
}
{
Ecore_Evas *ee;
Ecore_X_Event_Window_Damage *e;
+ Ecore_Evas_Engine_Data_X11 *edata;
e = event;
ee = ecore_event_window_match(e->win);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
- if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
+ if (edata->using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
// printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
if (ee->prop.avoid_damage)
{
Ecore_X_Rectangle rect;
Ecore_X_XRegion *tmpr;
- if (!ee->engine.x.damages)
- ee->engine.x.damages = ecore_x_xregion_new();
+ if (!edata->damages)
+ edata->damages = ecore_x_xregion_new();
tmpr = ecore_x_xregion_new();
rect.x = e->x;
rect.y = e->y;
rect.width = e->w;
rect.height = e->h;
- ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
- ecore_x_xregion_free(ee->engine.x.damages);
- ee->engine.x.damages = tmpr;
+ ecore_x_xregion_union_rect(tmpr, edata->damages, &rect);
+ ecore_x_xregion_free(edata->damages);
+ edata->damages = tmpr;
/* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
* the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
Ecore_X_Rectangle rect;
Ecore_X_XRegion *tmpr;
- if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
+ if (!edata->damages) edata->damages = ecore_x_xregion_new();
tmpr = ecore_x_xregion_new();
rect.x = e->x;
rect.y = e->y;
rect.width = e->w;
rect.height = e->h;
- ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
- ecore_x_xregion_free(ee->engine.x.damages);
- ee->engine.x.damages = tmpr;
+ ecore_x_xregion_union_rect(tmpr, edata->damages, &rect);
+ ecore_x_xregion_free(edata->damages);
+ edata->damages = tmpr;
*/
}
else
{
Ecore_Evas *ee;
Ecore_X_Event_Window_Configure *e;
+ Ecore_Evas_Engine_Data_X11 *edata;
e = event;
ee = ecore_event_window_match(e->win);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+ edata = ee->engine.data;
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
- if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
+ if (edata->direct_resize) return ECORE_CALLBACK_PASS_ON;
- ee->engine.x.configure_coming = 0;
+ edata->configure_coming = 0;
if ((e->from_wm) || (ee->prop.override))
{
if ((ee->x != e->x) || (ee->y != e->y))
_ecore_evas_x_state_update(Ecore_Evas *ee)
{
Ecore_X_Window_State state[10];
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
int num = 0;
if (ee->prop.modal)
state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
// if (bd->client.netwm.state.hidden)
// state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
- if (ee->engine.x.state.fullscreen)
+ if (edata->state.fullscreen)
state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
- if (ee->engine.x.state.above)
+ if (edata->state.above)
state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
- if (ee->engine.x.state.below)
+ if (edata->state.below)
state[num++] = ECORE_X_WINDOW_STATE_BELOW;
if (ee->prop.demand_attention)
state[num++] = ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
static void
_ecore_evas_x_layer_update(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->should_be_visible)
{
/* We need to send a netwm request to the wm */
/* FIXME: Do we have to remove old state before adding new? */
if (ee->prop.layer < 3)
{
- if (ee->engine.x.state.above)
+ if (edata->state.above)
{
- ee->engine.x.state.above = 0;
+ edata->state.above = 0;
ecore_x_netwm_state_request_send(ee->prop.window,
- ee->engine.x.win_root,
+ edata->win_root,
ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
}
- if (!ee->engine.x.state.below)
+ if (!edata->state.below)
{
- ee->engine.x.state.below = 1;
+ edata->state.below = 1;
ecore_x_netwm_state_request_send(ee->prop.window,
- ee->engine.x.win_root,
+ edata->win_root,
ECORE_X_WINDOW_STATE_BELOW, -1, 1);
}
}
else if (ee->prop.layer > 5)
{
- if (ee->engine.x.state.below)
+ if (edata->state.below)
{
- ee->engine.x.state.below = 0;
+ edata->state.below = 0;
ecore_x_netwm_state_request_send(ee->prop.window,
- ee->engine.x.win_root,
+ edata->win_root,
ECORE_X_WINDOW_STATE_BELOW, -1, 0);
}
- if (!ee->engine.x.state.above)
+ if (!edata->state.above)
{
- ee->engine.x.state.above = 1;
+ edata->state.above = 1;
ecore_x_netwm_state_request_send(ee->prop.window,
- ee->engine.x.win_root,
+ edata->win_root,
ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
}
}
else
{
- if (ee->engine.x.state.below)
+ if (edata->state.below)
{
- ee->engine.x.state.below = 0;
+ edata->state.below = 0;
ecore_x_netwm_state_request_send(ee->prop.window,
- ee->engine.x.win_root,
+ edata->win_root,
ECORE_X_WINDOW_STATE_BELOW, -1, 0);
}
- if (ee->engine.x.state.above)
+ if (edata->state.above)
{
- ee->engine.x.state.above = 0;
+ edata->state.above = 0;
ecore_x_netwm_state_request_send(ee->prop.window,
- ee->engine.x.win_root,
+ edata->win_root,
ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
}
}
/* Just set the state */
if (ee->prop.layer < 3)
{
- if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
+ if ((edata->state.above) || (!edata->state.below))
{
- ee->engine.x.state.above = 0;
- ee->engine.x.state.below = 1;
+ edata->state.above = 0;
+ edata->state.below = 1;
_ecore_evas_x_state_update(ee);
}
}
else if (ee->prop.layer > 5)
{
- if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
+ if ((!edata->state.above) || (edata->state.below))
{
- ee->engine.x.state.above = 1;
- ee->engine.x.state.below = 0;
+ edata->state.above = 1;
+ edata->state.below = 0;
_ecore_evas_x_state_update(ee);
}
}
else
{
- if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
+ if ((edata->state.above) || (edata->state.below))
{
- ee->engine.x.state.above = 0;
- ee->engine.x.state.below = 0;
+ edata->state.above = 0;
+ edata->state.below = 0;
_ecore_evas_x_state_update(ee);
}
}
return _ecore_evas_init_count;
}
+int
+_ecore_evas_x_shutdown(void)
+{
+ _ecore_evas_init_count--;
+ if (_ecore_evas_init_count == 0)
+ {
+ unsigned int i;
+
+ for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
+ {
+ if (ecore_evas_event_handlers[i])
+ ecore_event_handler_del(ecore_evas_event_handlers[i]);
+ }
+ ecore_event_evas_shutdown();
+ }
+ if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+ return _ecore_evas_init_count;
+}
+
static void
_ecore_evas_x_free(Ecore_Evas *ee)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
_ecore_evas_x_group_leader_unset(ee);
_ecore_evas_x_sync_set(ee);
- if (ee->engine.x.win_shaped_input)
- ecore_x_window_free(ee->engine.x.win_shaped_input);
+ if (edata->win_shaped_input)
+ ecore_x_window_free(edata->win_shaped_input);
ecore_x_window_free(ee->prop.window);
- if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
- if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
- if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
- if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
- ee->engine.x.pmap = 0;
- ee->engine.x.mask = 0;
- ee->engine.x.gc = 0;
- ee->engine.x.damages = NULL;
+ if (edata->pmap) ecore_x_pixmap_free(edata->pmap);
+ if (edata->mask) ecore_x_pixmap_free(edata->mask);
+ if (edata->gc) ecore_x_gc_free(edata->gc);
+ if (edata->damages) ecore_x_xregion_free(edata->damages);
+ edata->pmap = 0;
+ edata->mask = 0;
+ edata->gc = 0;
+ edata->damages = NULL;
ecore_event_window_unregister(ee->prop.window);
- while (ee->engine.x.win_extra)
+ while (edata->win_extra)
{
Ecore_X_Window *winp;
- winp = ee->engine.x.win_extra->data;
- ee->engine.x.win_extra =
- eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
+ winp = edata->win_extra->data;
+ edata->win_extra =
+ eina_list_remove_list(edata->win_extra, edata->win_extra);
ecore_event_window_unregister(*winp);
free(winp);
}
+ free(edata);
_ecore_evas_x_shutdown();
ecore_x_shutdown();
}
static void
_ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
ee->req.x = x;
ee->req.y = y;
- if (ee->engine.x.direct_resize)
+ if (edata->direct_resize)
{
- if (!ee->engine.x.managed)
+ if (!edata->managed)
{
if ((x != ee->x) || (y != ee->y))
{
else
{
if (((ee->x != x) || (ee->y != y)) ||
- (ee->engine.x.configure_coming))
+ (edata->configure_coming))
{
- ee->engine.x.configure_coming = 1;
- if (!ee->engine.x.managed)
+ edata->configure_coming = 1;
+ if (!edata->managed)
{
ee->x = x;
ee->y = y;
static void
_ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
ee->req.x = x;
ee->req.y = y;
- if (ee->engine.x.direct_resize)
+ if (edata->direct_resize)
{
- ee->engine.x.managed = 1;
+ edata->managed = 1;
if ((x != ee->x) || (y != ee->y))
{
ee->x = x;
static void
_ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
ee->req.w = w;
ee->req.h = h;
- if (ee->engine.x.direct_resize)
+ if (edata->direct_resize)
{
if ((ee->w != w) || (ee->h != h))
{
}
}
else if (((ee->w != w) || (ee->h != h)) ||
- (ee->engine.x.configure_coming))
+ (edata->configure_coming))
{
- ee->engine.x.configure_coming = 1;
+ edata->configure_coming = 1;
ecore_x_window_resize(ee->prop.window, w, h);
}
}
static void
_ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
ee->req.x = x;
ee->req.y = y;
ee->req.w = w;
ee->req.h = h;
- if (ee->engine.x.direct_resize)
+ if (edata->direct_resize)
{
if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
{
int change_size = 0, change_pos = 0;
if ((ee->w != w) || (ee->h != h)) change_size = 1;
- if (!ee->engine.x.managed)
+ if (!edata->managed)
{
if ((x != ee->x) || (y != ee->y)) change_pos = 1;
}
ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
- if (!ee->engine.x.managed)
+ if (!edata->managed)
{
ee->x = x;
ee->y = y;
}
}
else if (((ee->w != w) || (ee->h != h) || (ee->x != x) || (ee->y != y)) ||
- (ee->engine.x.configure_coming))
+ (edata->configure_coming))
{
- ee->engine.x.configure_coming = 1;
+ edata->configure_coming = 1;
ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
- if (!ee->engine.x.managed)
+ if (!edata->managed)
{
ee->x = x;
ee->y = y;
Evas_Engine_Info *einfo)
{
int rot_dif;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
rot_dif = ee->rotation - rotation;
if (rot_dif < 0) rot_dif = -rot_dif;
if (!resize)
{
- ee->engine.x.configure_coming = 1;
+ edata->configure_coming = 1;
if (!ee->prop.fullscreen)
{
ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
static void
_ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->rotation == rotation) return;
#if _USE_WIN_ROT_EFFECT
#if _USE_WIN_ROT_EFFECT
if ((ee->visible) &&
- ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
+ ((ecore_x_e_comp_sync_supported_get(edata->win_root)) &&
(!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) &&
- (ee->engine.x.sync_counter) &&
- (ee->engine.x.sync_val > 0))
+ (edata->sync_counter) &&
+ (edata->sync_val > 0))
{
_ecore_evas_x_rotation_effect_setup();
_ecore_evas_x_flush_pre(ee, NULL, NULL);
static void
_ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if ((ee->shaped == shaped)) return;
if (!strcmp(ee->driver, "opengl_x11")) return;
if (!strcmp(ee->driver, "software_x11"))
unsigned int foreground;
Ecore_X_GC gc;
- if (!ee->engine.x.mask)
- ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+ if (!edata->mask)
+ edata->mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
foreground = 0;
- gc = ecore_x_gc_new(ee->engine.x.mask,
+ gc = ecore_x_gc_new(edata->mask,
ECORE_X_GC_VALUE_MASK_FOREGROUND,
&foreground);
- ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
+ ecore_x_drawable_rectangle_fill(edata->mask, gc,
0, 0, ee->w, ee->h);
ecore_x_gc_free(gc);
- einfo->info.mask = ee->engine.x.mask;
+ einfo->info.mask = edata->mask;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
}
else
{
- if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
- ee->engine.x.mask = 0;
+ if (edata->mask) ecore_x_pixmap_free(edata->mask);
+ edata->mask = 0;
einfo->info.mask = 0;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
static void
_ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
Ecore_X_Window_Attributes att;
char *id = NULL;
if (ee->alpha)
{
if (ee->prop.override)
- ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ ee->prop.window = ecore_x_window_override_argb_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
else
- ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
-// if (!ee->engine.x.mask)
-// ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
+ ee->prop.window = ecore_x_window_argb_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+// if (!edata->mask)
+// edata->mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
}
else
{
if (ee->prop.override)
- ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ ee->prop.window = ecore_x_window_override_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
else
- ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
- if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
- ee->engine.x.mask = 0;
+ ee->prop.window = ecore_x_window_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ if (edata->mask) ecore_x_pixmap_free(edata->mask);
+ edata->mask = 0;
ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
}
einfo->info.colormap = att.colormap;
einfo->info.depth = att.depth;
-// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
-// ee->engine.x.mask = 0;
- einfo->info.mask = ee->engine.x.mask;
+// if (edata->mask) ecore_x_pixmap_free(edata->mask);
+// edata->mask = 0;
+ einfo->info.mask = edata->mask;
einfo->info.drawable = ee->prop.window;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
einfo->info.destination_alpha = alpha;
- if (ee->engine.x.win_root != 0)
+ if (edata->win_root != 0)
{
/* FIXME: round trip in ecore_x_window_argb_get */
- if (ecore_x_window_argb_get(ee->engine.x.win_root))
+ if (ecore_x_window_argb_get(edata->win_root))
{
ee->prop.window =
- _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
+ _ecore_evas_x_gl_window_new(ee, edata->win_root,
ee->req.x, ee->req.y,
ee->req.w, ee->req.h,
ee->prop.override, 1, NULL);
else
{
ee->prop.window =
- _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
+ _ecore_evas_x_gl_window_new(ee, edata->win_root,
ee->req.x, ee->req.y,
ee->req.w, ee->req.h,
ee->prop.override, ee->alpha,
else
{
ee->prop.window =
- _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
+ _ecore_evas_x_gl_window_new(ee, edata->win_root,
ee->req.x, ee->req.y,
ee->req.w, ee->req.h,
ee->prop.override, ee->alpha, NULL);
if (ee->alpha)
{
if (ee->prop.override)
- ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ ee->prop.window = ecore_x_window_override_argb_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
else
- ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
- if (!ee->engine.x.mask)
- ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
+ ee->prop.window = ecore_x_window_argb_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ if (!edata->mask)
+ edata->mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
}
else
{
if (ee->prop.override)
- ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ ee->prop.window = ecore_x_window_override_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
else
- ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
- if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
- ee->engine.x.mask = 0;
+ ee->prop.window = ecore_x_window_new(edata->win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+ if (edata->mask) ecore_x_pixmap_free(edata->mask);
+ edata->mask = 0;
ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
}
*/
einfo->info.colormap = att.colormap;
einfo->info.depth = att.depth;
-// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
-// ee->engine.x.mask = 0;
-// einfo->info.mask = ee->engine.x.mask;
+// if (edata->mask) ecore_x_pixmap_free(edata->mask);
+// edata->mask = 0;
+// einfo->info.mask = edata->mask;
einfo->info.drawable = ee->prop.window;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
static void
_ecore_evas_x_modal_set(Ecore_Evas *ee, int modal)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.modal == modal) return;
ee->prop.modal = modal;
if (ee->should_be_visible)
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_MODAL, -1, modal);
else
_ecore_evas_x_state_update(ee);
static void
_ecore_evas_x_demand_attention_set(Ecore_Evas *ee, int demand)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.demand_attention == demand) return;
ee->prop.demand_attention = demand;
if (ee->should_be_visible)
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION, -1, demand);
else
_ecore_evas_x_state_update(ee);
static void
_ecore_evas_x_focus_skip_set(Ecore_Evas *ee, int skip)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.focus_skip == skip) return;
ee->prop.focus_skip = skip;
if (ee->should_be_visible)
{
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_SKIP_TASKBAR, -1, skip);
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_SKIP_PAGER, -1, skip);
}
else
_ecore_evas_x_hints_update(ee);
}
-#endif /* BUILD_ECORE_EVAS_X11 */
-
-#ifdef BUILD_ECORE_EVAS_X11
static void
_ecore_evas_x_show(Ecore_Evas *ee)
{
static void
_ecore_evas_x_activate(Ecore_Evas *ee)
{
- ecore_x_netwm_client_active_request(ee->engine.x.win_root,
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
+ ecore_x_netwm_client_active_request(edata->win_root,
ee->prop.window, 2, 0);
}
static void
_ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.iconified == on) return;
ee->prop.iconified = on;
_ecore_evas_x_hints_update(ee);
if (on)
- ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
+ ecore_x_icccm_iconic_request_send(ee->prop.window, edata->win_root);
else
ecore_evas_show(ee);
}
static void
_ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.sticky == sticky) return;
/* We dont want to set prop.sticky here as it will cause
* property change event.
* ee->prop.sticky = sticky;
*/
- ee->engine.x.state.sticky = sticky;
+ edata->state.sticky = sticky;
if (ee->should_be_visible)
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
else
_ecore_evas_x_state_update(ee);
static void
_ecore_evas_x_maximized_set(Ecore_Evas *ee, int on)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.maximized == on) return;
- ee->engine.x.state.maximized_h = 1;
- ee->engine.x.state.maximized_v = 1;
+ edata->state.maximized_h = 1;
+ edata->state.maximized_v = 1;
ee->prop.maximized = on;
if (ee->should_be_visible)
{
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_MAXIMIZED_VERT, -1, on);
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ, -1, on);
}
else
static void
_ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.fullscreen == on) return;
/* FIXME: Detect if WM is EWMH compliant and handle properly if not,
* i.e. reposition, resize, and change borderless hint */
- ee->engine.x.state.fullscreen = on;
+ edata->state.fullscreen = on;
if (ee->should_be_visible)
- ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+ ecore_x_netwm_state_request_send(ee->prop.window, edata->win_root,
ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
else
_ecore_evas_x_state_update(ee);
static void
_ecore_evas_x_profile_set(Ecore_Evas *ee, const char *profile)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
_ecore_evas_window_profile_free(ee);
ee->prop.profile.name = NULL;
if (profile)
ee->prop.profile.name = (char *)eina_stringshare_add(profile);
- ee->engine.x.profile.change = 1;
+ edata->profile.change = 1;
_ecore_evas_x_window_profile_set(ee);
}
_ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n)
{
int i;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
_ecore_evas_window_available_profiles_free(ee);
ee->prop.profile.available_list = NULL;
ee->prop.profile.count = n;
}
}
- ee->engine.x.profile.available = 1;
+ edata->profile.available = 1;
_ecore_evas_x_window_profile_set(ee);
}
static void
_ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
if (ee->prop.avoid_damage == on) return;
if (!strcmp(ee->driver, "opengl_x11")) return;
{
if (ee->prop.avoid_damage)
{
- ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
- ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
- einfo->info.drawable = ee->engine.x.pmap;
+ edata->pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
+ edata->gc = ecore_x_gc_new(edata->pmap, 0, NULL);
+ einfo->info.drawable = edata->pmap;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
{
- ee->engine.x.using_bg_pixmap = 1;
- ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+ edata->using_bg_pixmap = 1;
+ ecore_x_window_pixmap_set(ee->prop.window, edata->pmap);
ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
}
- if (ee->engine.x.direct_resize)
+ if (edata->direct_resize)
{
/* Turn this off for now
- ee->engine.x.using_bg_pixmap = 1;
- ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+ edata->using_bg_pixmap = 1;
+ ecore_x_window_pixmap_set(ee->prop.window, edata->pmap);
*/
}
}
else
{
- if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
- if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
- if (ee->engine.x.using_bg_pixmap)
+ if (edata->pmap) ecore_x_pixmap_free(edata->pmap);
+ if (edata->gc) ecore_x_gc_free(edata->gc);
+ if (edata->using_bg_pixmap)
{
ecore_x_window_pixmap_set(ee->prop.window, 0);
- ee->engine.x.using_bg_pixmap = 0;
+ edata->using_bg_pixmap = 0;
ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
}
- ee->engine.x.pmap = 0;
- ee->engine.x.gc = 0;
+ edata->pmap = 0;
+ edata->gc = 0;
einfo->info.drawable = ee->prop.window;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
{
free(out);
}
-int
-_ecore_evas_x_shutdown(void)
-{
- _ecore_evas_init_count--;
- if (_ecore_evas_init_count == 0)
- {
- unsigned int i;
-
- for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
- {
- if (ecore_evas_event_handlers[i])
- ecore_event_handler_del(ecore_evas_event_handlers[i]);
- }
- ecore_event_evas_shutdown();
- }
- if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
- return _ecore_evas_init_count;
-}
-
static Ecore_Evas_Engine_Func _ecore_x_engine_func =
{
_ecore_evas_x_free,
_ecore_evas_x_screen_geometry_get,
_ecore_evas_x_screen_dpi_get
};
-#endif /* BUILD_ECORE_EVAS_X11 */
/*
* FIXME: there are some round trips. Especially, we can split
_ecore_evas_x_flush_pre(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
if (ee->no_comp_sync) return;
if (!_ecore_evas_app_comp_sync) return;
- if (ee->engine.x.sync_counter)
+ if (edata->sync_counter)
{
- if (ee->engine.x.sync_began)
+ if (edata->sync_began)
{
- ee->engine.x.sync_val++;
- if (!ee->engine.x.sync_cancel)
+ edata->sync_val++;
+ if (!edata->sync_cancel)
{
if (!ee->semi_sync)
- ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
- ee->engine.x.sync_val);
+ ecore_x_sync_counter_val_wait(edata->sync_counter,
+ edata->sync_val);
}
}
}
_ecore_evas_x_flush_post(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
(!ee->gl_sync_draw_done)) // added by gl77.lee
{
- if (ee->engine.x.sync_counter)
+ if (edata->sync_counter)
{
- if (ee->engine.x.sync_began)
+ if (edata->sync_began)
{
- if (!ee->engine.x.sync_cancel)
+ if (!edata->sync_cancel)
{
ecore_x_e_comp_sync_draw_size_done_send
- (ee->engine.x.win_root, ee->prop.window, ee->w, ee->h);
+ (edata->win_root, ee->prop.window, ee->w, ee->h);
}
}
}
}
- if (ee->engine.x.netwm_sync_set)
+ if (edata->netwm_sync_set)
{
- ecore_x_sync_counter_2_set(ee->engine.x.netwm_sync_counter,
- ee->engine.x.netwm_sync_val_hi,
- ee->engine.x.netwm_sync_val_lo);
- ee->engine.x.netwm_sync_set = 0;
+ ecore_x_sync_counter_2_set(edata->netwm_sync_counter,
+ edata->netwm_sync_val_hi,
+ edata->netwm_sync_val_lo);
+ edata->netwm_sync_set = 0;
}
- if (ee->engine.x.profile.done)
+ if (edata->profile.done)
{
ecore_x_e_window_profile_change_done_send
- (ee->engine.x.win_root, ee->prop.window,ee->prop.profile.name);
- ee->engine.x.profile.done = 0;
+ (edata->win_root, ee->prop.window,ee->prop.profile.name);
+ edata->profile.done = 0;
}
}
#endif
-/**
- * @brief Create Ecore_Evas using software x11.
- * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
- * @param disp_name The name of the Ecore_Evas to be created.
- * @param parent The parent of the Ecore_Evas to be created.
- * @param x The X coordinate to be used.
- * @param y The Y coordinate to be used.
- * @param w The width of the Ecore_Evas to be created.
- * @param h The height of the Ecore_Evas to be created.
- * @return A handle to the created Ecore_Evas.
- */
#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
EAPI Ecore_Evas *
-ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
- int x, int y, int w, int h)
+ecore_evas_software_x11_new_internal(const char *disp_name, Ecore_X_Window parent,
+ int x, int y, int w, int h)
{
Evas_Engine_Info_Software_X11 *einfo;
+ Ecore_Evas_Interface_X11 *iface;
+ Ecore_Evas_Interface_Software_X11 *siface;
+ Ecore_Evas_Engine_Data_X11 *edata;
Ecore_Evas *ee;
int argb = 0, rmethod;
static int redraw_debug = -1;
if (!ecore_x_init(disp_name)) return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ edata = calloc(1, sizeof(Ecore_Evas_Engine_Data_X11));
+ if (!edata)
+ {
+ free(ee);
+ return NULL;
+ }
+
+ ee->engine.data = edata;
+ iface = _ecore_evas_x_interface_x11_new();
+ siface = _ecore_evas_x_interface_software_x11_new();
+
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, siface);
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
ee->prop.layer = 4;
ee->prop.request_pos = 0;
ee->prop.sticky = 0;
- ee->engine.x.state.sticky = 0;
+ edata->state.sticky = 0;
/* init evas here */
ee->evas = evas_new();
evas_output_size_set(ee->evas, w, h);
evas_output_viewport_set(ee->evas, 0, 0, w, h);
- ee->engine.x.win_root = parent;
- ee->engine.x.screen_num = 0;
+ edata->win_root = parent;
+ edata->screen_num = 0;
if (parent != 0)
{
- ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
+ edata->screen_num = 1; /* FIXME: get real scren # */
/* FIXME: round trip in ecore_x_window_argb_get */
if (ecore_x_window_argb_get(parent))
{
(Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
return ee;
}
-#else
-EAPI Ecore_Evas *
-ecore_evas_software_x11_new(const char *disp_name EINA_UNUSED, Ecore_X_Window parent EINA_UNUSED,
- int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
-{
- return NULL;
-}
-#endif
-/**
- * @brief Get the window from Ecore_Evas using software x11.
- * @note If ecore is not compiled with support for x11 or if @p ee was not
- * created with ecore_evas_software_x11_new() then nothing is done and
- * 0 is returned.
- * @param ee The Ecore_Evas from which to get the window.
- * @return The window of type Ecore_X_Window.
- */
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-EAPI Ecore_X_Window
-ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
+static Ecore_X_Window
+_ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
{
if (!(!strcmp(ee->driver, "software_x11"))) return 0;
return (Ecore_X_Window) ecore_evas_window_get(ee);
}
-#else
-EAPI Ecore_X_Window
-ecore_evas_software_x11_window_get(const Ecore_Evas *ee EINA_UNUSED)
-{
- return 0;
-}
-#endif
-/**
- * @brief Set the direct_resize of Ecore_Evas using software x11.
- * @note If ecore is not compiled with support to x11 then nothing is done.
- * @param ee The Ecore_Evas in which to set direct resize.
- * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
- */
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-EAPI void
-ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
+static void
+_ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
{
- ee->engine.x.direct_resize = on;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+ edata->direct_resize = on;
if (ee->prop.avoid_damage)
{
- if (ee->engine.x.direct_resize)
+ if (edata->direct_resize)
{
/* turn this off for now
ee->engine.x.using_bg_pixmap = 1;
}
}
}
-#else
-EAPI void
-ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee EINA_UNUSED, Eina_Bool on EINA_UNUSED)
-{
-}
-#endif
-/**
- * @brief Gets if the Ecore_Evas is being directly resized using software x11.
- * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
- * @param ee The Ecore_Evas from which to get direct resize.
- * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
- */
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-EAPI Eina_Bool
-ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
-{
- return ee->engine.x.direct_resize;
-}
-#else
-EAPI Eina_Bool
-ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee EINA_UNUSED)
+static Eina_Bool
+_ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
{
- return 0;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
+ return edata->direct_resize;
}
-#endif
-/**
- * @brief Add extra window on Ecore_Evas using software x11.
- * @note If ecore is not compiled with support to x11 then nothing is done.
- * @param ee The Ecore_Evas on which to add the window.
- * @param win The window to be added at the Ecore_Evas.
- */
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-EAPI void
-ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+static void
+_ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
Ecore_X_Window *winp;
winp = malloc(sizeof(Ecore_X_Window));
if (winp)
{
*winp = win;
- ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
+ edata->win_extra = eina_list_append(edata->win_extra, winp);
ecore_x_input_multi_select(win);
ecore_event_window_register(win, ee, ee->evas,
(Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
(Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
}
}
-#else
-EAPI void
-ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee EINA_UNUSED, Ecore_X_Window win EINA_UNUSED)
-{
-}
#endif
-/**
- * @brief Create Ecore_Evas using opengl x11.
- * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
- * @param disp_name The name of the display of the Ecore_Evas to be created.
- * @param parent The parent of the Ecore_Evas to be created.
- * @param x The X coordinate to be used.
- * @param y The Y coordinate to be used.
- * @param w The width of the Ecore_Evas to be created.
- * @param h The height of the Ecore_Evas to be created.
- * @return The new Ecore_Evas.
- */
#ifdef BUILD_ECORE_EVAS_OPENGL_X11
EAPI Ecore_Evas *
-ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
- int x, int y, int w, int h)
-{
- return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
-}
-
-EAPI Ecore_Evas *
-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)
+ecore_evas_gl_x11_options_new_internal(const char *disp_name, Ecore_X_Window parent,
+ int x, int y, int w, int h, const int *opt)
{
Ecore_Evas *ee;
+ Ecore_Evas_Engine_Data_X11 *edata;
+ Ecore_Evas_Interface_X11 *iface;
+ Ecore_Evas_Interface_Gl_X11 *giface;
int rmethod;
char *id = NULL;
if (!ecore_x_init(disp_name)) return NULL;
ee = calloc(1, sizeof(Ecore_Evas));
if (!ee) return NULL;
+ edata = calloc(1, sizeof(Ecore_Evas_Engine_Data_X11));
+ if (!edata)
+ {
+ free(ee);
+ return NULL;
+ }
+
+ iface = _ecore_evas_x_interface_x11_new();
+ giface = _ecore_evas_x_interface_gl_x11_new();
+
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
+ ee->engine.ifaces = eina_list_append(ee->engine.ifaces, giface);
+
+ ee->engine.data = edata;
ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
ee->prop.layer = 4;
ee->prop.request_pos = 0;
ee->prop.sticky = 0;
- ee->engine.x.state.sticky = 0;
+ edata->state.sticky = 0;
/* init evas here */
ee->evas = evas_new();
evas_output_viewport_set(ee->evas, 0, 0, w, h);
if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
- ee->engine.x.win_root = parent;
+ edata->win_root = parent;
- if (ee->engine.x.win_root != 0)
+ if (edata->win_root != 0)
{
- ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
+ edata->screen_num = 1; /* FIXME: get real scren # */
/* FIXME: round trip in ecore_x_window_argb_get */
- if (ecore_x_window_argb_get(ee->engine.x.win_root))
+ if (ecore_x_window_argb_get(edata->win_root))
{
ee->prop.window = _ecore_evas_x_gl_window_new
- (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
+ (ee, edata->win_root, x, y, w, h, 0, 1, opt);
}
else
ee->prop.window = _ecore_evas_x_gl_window_new
- (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
+ (ee, edata->win_root, x, y, w, h, 0, 0, opt);
}
else
ee->prop.window = _ecore_evas_x_gl_window_new
- (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
+ (ee, edata->win_root, x, y, w, h, 0, 0, opt);
if (!ee->prop.window)
{
ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
return ee;
}
-#else
-EAPI Ecore_Evas *
-ecore_evas_gl_x11_new(const char *disp_name EINA_UNUSED, Ecore_X_Window parent EINA_UNUSED,
- int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
-{
- return NULL;
-}
+
EAPI Ecore_Evas *
-ecore_evas_gl_x11_options_new(const char *disp_name EINA_UNUSED, Ecore_X_Window parent EINA_UNUSED,
- int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED, const int *opt EINA_UNUSED)
+ecore_evas_gl_x11_new_internal(const char *disp_name, Ecore_X_Window parent,
+ int x, int y, int w, int h)
{
- return NULL;
+ return ecore_evas_gl_x11_options_new_internal(disp_name, parent, x, y, w, h, NULL);
}
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
-/**
- * @brief Get the window from Ecore_Evas using opengl x11.
- * @note If ecore is not compiled with support for x11 or if @p ee was not
- * created with ecore_evas_gl_x11_new() then nothing is done and
- * 0 is returned.
- * @param ee The Ecore_Evas from which to get the window.
- * @return The window of type Ecore_X_Window of Ecore_Evas.
- */
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-EAPI Ecore_X_Window
-ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
+static Ecore_X_Window
+_ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
{
if (!(!strcmp(ee->driver, "opengl_x11"))) return 0;
return (Ecore_X_Window) ecore_evas_window_get(ee);
}
-#else
-EAPI Ecore_X_Window
-ecore_evas_gl_x11_window_get(const Ecore_Evas *ee EINA_UNUSED)
-{
- return 0;
-}
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
-/**
- * @brief Set direct_resize for Ecore_Evas using opengl x11.
- * @note If ecore is not compiled with support to x11 then nothing is done.
- * @param ee The Ecore_Evas in which to set direct resize.
- * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
- */
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-EAPI void
-ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
-{
- ee->engine.x.direct_resize = on;
-}
-#else
-EAPI void
-ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee EINA_UNUSED, Eina_Bool on EINA_UNUSED)
+static void
+_ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
{
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+ edata->direct_resize = on;
}
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
-/**
- * @brief Gets if the Ecore_Evas is being directly resized using opengl x11.
- * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
- * @param ee The Ecore_Evas from which to get direct resize.
- * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
- */
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-EAPI Eina_Bool
-ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
-{
- return ee->engine.x.direct_resize;
-}
-#else
-EAPI Eina_Bool
-ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee EINA_UNUSED)
+static Eina_Bool
+_ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
{
- return 0;
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
+ return edata->direct_resize;
}
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
-/**
- * @brief Add extra window on Ecore_Evas using opengl x11.
- * @note If ecore is not compiled with support to x11 then nothing is done.
- * @param ee The Ecore_Evas for which to add the window.
- * @param win The window to be added at the Ecore_Evas.
- */
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-EAPI void
-ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+static void
+_ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
{
ecore_evas_software_x11_extra_event_window_add(ee, win);
}
-#else
-EAPI void
-ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee EINA_UNUSED, Ecore_X_Window win EINA_UNUSED)
-{
-}
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
-/**
- * @brief Set the functions to be used before and after the swap callback.
- * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
- * @param ee The Ecore_Evas for which to set the swap callback.
- * @param data The data for which to set the swap callback.
- * @param pre_cb The function to be called before the callback.
- * @param post_cb The function to be called after the callback.
- */
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-EAPI void
-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))
+static void
+_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))
{
Evas_Engine_Info_GL_X11 *einfo;
}
}
}
-#else
-EAPI void
-ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee EINA_UNUSED, void *data EINA_UNUSED, void (*pre_cb) (void *data, Evas *e) EINA_UNUSED, void (*post_cb) (void *data, Evas *e) EINA_UNUSED)
-{
- return;
-}
#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
-EAPI void
-ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
+static void
+_ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
{
-#ifdef BUILD_ECORE_EVAS_X11
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
_ecore_evas_x_group_leader_unset(ee);
- ee->engine.x.leader = win;
+ edata->leader = win;
_ecore_evas_x_group_leader_update(ee);
-#else
- return;
- ee = NULL;
- win = 0;
-#endif
}
-EAPI Ecore_X_Window
-ecore_evas_x11_leader_get(Ecore_Evas *ee)
+static Ecore_X_Window
+_ecore_evas_x11_leader_get(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_X11
- return ee->engine.x.leader;
-#else
- return 0;
- ee = NULL;
-#endif
+ Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
+
+ return edata->leader;
}
-EAPI void
-ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
+static void
+_ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_X11
_ecore_evas_x_group_leader_unset(ee);
_ecore_evas_x_group_leader_set(ee);
-#else
- return;
- ee = NULL;
-#endif
}
-#ifdef BUILD_ECORE_EVAS_X11
static Eina_Bool
_ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *dst_rect, Ecore_X_Rectangle *src_rect)
{
return 1;
}
-#endif
-EAPI void
-ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
+static void
+_ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
{
-#ifdef BUILD_ECORE_EVAS_X11
Eina_Bool ret;
Ecore_X_Rectangle src_rect;
Ecore_X_Rectangle dst_rect;
+ Ecore_Evas_Engine_Data_X11 *edata;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
return;
}
+ edata = ee->engine.data;
src_rect.x = x;
src_rect.y = y;
src_rect.width = w;
ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
- if (!ee->engine.x.win_shaped_input)
- ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
+ if (!edata->win_shaped_input)
+ edata->win_shaped_input = ecore_x_window_override_new(edata->win_root,
0, 0, 1, 1);
if (ret)
- ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input,
+ ecore_x_window_shape_input_rectangle_set(edata->win_shaped_input,
dst_rect.x, dst_rect.y,
dst_rect.width, dst_rect.height);
-#else
- return;
- ee = NULL;
- x = 0;
- y = 0;
- w = 0;
- h = 0;
-#endif
}
-EAPI void
-ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
+static void
+_ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
{
-#ifdef BUILD_ECORE_EVAS_X11
Eina_Bool ret;
Ecore_X_Rectangle src_rect;
Ecore_X_Rectangle dst_rect;
+ Ecore_Evas_Engine_Data_X11 *edata;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
return;
}
+ edata = ee->engine.data;
src_rect.x = x;
src_rect.y = y;
src_rect.width = w;
ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
- if (!ee->engine.x.win_shaped_input)
- ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
+ if (!edata->win_shaped_input)
+ edata->win_shaped_input = ecore_x_window_override_new(edata->win_root,
0, 0, 1, 1);
if (ret)
- ecore_x_window_shape_input_rectangle_add(ee->engine.x.win_shaped_input,
+ ecore_x_window_shape_input_rectangle_add(edata->win_shaped_input,
dst_rect.x, dst_rect.y,
dst_rect.width, dst_rect.height);
-#else
- return;
- ee = NULL;
- x = 0;
- y = 0;
- w = 0;
- h = 0;
-#endif
}
-EAPI void
-ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
+static void
+_ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
{
-#ifdef BUILD_ECORE_EVAS_X11
Eina_Bool ret;
Ecore_X_Rectangle src_rect;
Ecore_X_Rectangle dst_rect;
+ Ecore_Evas_Engine_Data_X11 *edata;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
return;
}
+ edata = ee->engine.data;
src_rect.x = x;
src_rect.y = y;
src_rect.width = w;
ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
- if (!ee->engine.x.win_shaped_input)
- ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
+ if (!edata->win_shaped_input)
+ edata->win_shaped_input = ecore_x_window_override_new(edata->win_root,
0, 0, 1, 1);
if (ret)
- ecore_x_window_shape_input_rectangle_subtract(ee->engine.x.win_shaped_input,
+ ecore_x_window_shape_input_rectangle_subtract(edata->win_shaped_input,
dst_rect.x, dst_rect.y,
dst_rect.width, dst_rect.height);
-#else
- return;
- ee = NULL;
- x = 0;
- y = 0;
- w = 0;
- h = 0;
-#endif
}
-EAPI void
-ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
+static void
+_ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_X11
+ Ecore_Evas_Engine_Data_X11 *edata;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
return;
}
- if (!ee->engine.x.win_shaped_input)
- ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
+ edata = ee->engine.data;
+ if (!edata->win_shaped_input)
+ edata->win_shaped_input = ecore_x_window_override_new(edata->win_root, 0, 0, 1, 1);
- ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 0, 0);
-#else
- return;
- ee = NULL;
-#endif
+ ecore_x_window_shape_input_rectangle_set(edata->win_shaped_input, 0, 0, 0, 0);
}
-EAPI void
-ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
+static void
+_ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_X11
+ Ecore_Evas_Engine_Data_X11 *edata;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
return;
}
- if (!ee->engine.x.win_shaped_input)
- ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
+ edata = ee->engine.data;
+ if (!edata->win_shaped_input)
+ edata->win_shaped_input = ecore_x_window_override_new(edata->win_root, 0, 0, 1, 1);
- ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 65535, 65535);
-#else
- return;
- ee = NULL;
-#endif
+ ecore_x_window_shape_input_rectangle_set(edata->win_shaped_input, 0, 0, 65535, 65535);
}
-EAPI void
-ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
+static void
+_ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
{
-#ifdef BUILD_ECORE_EVAS_X11
+ Ecore_Evas_Engine_Data_X11 *edata;
if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
{
ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
return;
}
- if (!ee->engine.x.win_shaped_input) return;
+ edata = ee->engine.data;
+ if (!edata->win_shaped_input) return;
- ecore_x_window_shape_input_window_set(ee->prop.window, ee->engine.x.win_shaped_input);
-#else
- return;
- ee = NULL;
+ ecore_x_window_shape_input_window_set(ee->prop.window, edata->win_shaped_input);
+}
+
+static Ecore_Evas_Interface_X11 *
+_ecore_evas_x_interface_x11_new(void)
+{
+ Ecore_Evas_Interface_X11 *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_X11));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_x11_name;
+ iface->base.version = interface_x11_version;
+
+ iface->leader_set = _ecore_evas_x11_leader_set;
+ iface->leader_get = _ecore_evas_x11_leader_get;
+ iface->leader_default_set = _ecore_evas_x11_leader_default_set;
+ iface->shape_input_rectangle_set = _ecore_evas_x11_shape_input_rectangle_set;
+ iface->shape_input_rectangle_add = _ecore_evas_x11_shape_input_rectangle_add;
+ iface->shape_input_rectangle_subtract = _ecore_evas_x11_shape_input_rectangle_subtract;
+ iface->shape_input_empty = _ecore_evas_x11_shape_input_empty;
+ iface->shape_input_reset = _ecore_evas_x11_shape_input_reset;
+ iface->shape_input_reset = _ecore_evas_x11_shape_input_apply;
+
+ return iface;
+}
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+static Ecore_Evas_Interface_Software_X11 *
+_ecore_evas_x_interface_software_x11_new(void)
+{
+ Ecore_Evas_Interface_Software_X11 *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Software_X11));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_software_x11_name;
+ iface->base.version = interface_software_x11_version;
+
+ iface->window_get = _ecore_evas_software_x11_window_get;
+ iface->resize_set = _ecore_evas_software_x11_direct_resize_set;
+ iface->resize_get = _ecore_evas_software_x11_direct_resize_get;
+ iface->extra_event_window_add = _ecore_evas_software_x11_extra_event_window_add;
+
+ return iface;
+}
#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+static Ecore_Evas_Interface_Gl_X11 *
+_ecore_evas_x_interface_gl_x11_new(void)
+{
+ Ecore_Evas_Interface_Gl_X11 *iface;
+
+ iface = calloc(1, sizeof(Ecore_Evas_Interface_Gl_X11));
+ if (!iface) return NULL;
+
+ iface->base.name = interface_gl_x11_name;
+ iface->base.version = interface_gl_x11_version;
+
+ iface->window_get = _ecore_evas_gl_x11_window_get;
+ iface->resize_set = _ecore_evas_gl_x11_direct_resize_set;
+ iface->resize_get = _ecore_evas_gl_x11_direct_resize_get;
+ iface->extra_event_window_add = _ecore_evas_software_x11_extra_event_window_add;
+ iface->pre_post_swap_callback_set = _ecore_evas_gl_x11_pre_post_swap_callback_set;
+
+ return iface;
}
+#endif