ecore_evas: Make the engines loadable modules
authorFlavio Vinicius Alvares Ceolin <flavio.ceolin@profusion.mobi>
Wed, 5 Dec 2012 21:15:42 +0000 (21:15 +0000)
committerFlavio Vinicius Alvares Ceolin <flavio.ceolin@profusion.mobi>
Wed, 5 Dec 2012 21:15:42 +0000 (21:15 +0000)
Implementing support for loadables modules. It makes the engines been
loaded when they are needed. It not breakes the api, so each engine
still has its own api.

The implementation basically is:

* Functions that creates Ecore_Evas, for example
  ecore_evas_software_x11_new, request to load its module and then get
  the module's function to create the Ecore_Evas.
* The other functions such as \(.*\)_window_get from the Ecore_Evas
  its interface and then call the appropriate method.
* As there is no unified interface to communicate with the engines
  (not break api problem), all interfaces were declared in
  ecore_evas_private.h
* Now the data necessary for each module is not declared in the
  Ecore_Evas_Engine structure, instead of this, the struct has a void
  pointer that is used by the modules.
* In this first moment engines as software_x11 and gl_x11 were put
  together in the same module, but obviously exporting all the things
  necessary.

SVN revision: 80280

19 files changed:
src/Makefile_Ecore_Evas.am
src/lib/ecore_evas/Ecore_Evas.h
src/lib/ecore_evas/Ecore_Evas_Types.h [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas.c
src/lib/ecore_evas/ecore_evas_module.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_private.h
src/modules/ecore_evas/engines/buffer/ecore_evas_buffer.c [moved from src/lib/ecore_evas/ecore_evas_buffer.c with 81% similarity]
src/modules/ecore_evas/engines/buffer/ecore_evas_buffer_private.h [new file with mode: 0644]
src/modules/ecore_evas/engines/buffer/ecore_evas_extn.c [moved from src/lib/ecore_evas/ecore_evas_extn.c with 88% similarity]
src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c [moved from src/lib/ecore_evas/ecore_evas_cocoa.c with 97% similarity]
src/modules/ecore_evas/engines/fb/ecore_evas_fb.c [moved from src/lib/ecore_evas/ecore_evas_fb.c with 89% similarity]
src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c [moved from src/lib/ecore_evas/ecore_evas_psl1ght.c with 96% similarity]
src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c [moved from src/lib/ecore_evas/ecore_evas_sdl.c with 93% similarity]
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c [moved from src/lib/ecore_evas/ecore_evas_wayland_common.c with 83% similarity]
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c [moved from src/lib/ecore_evas/ecore_evas_wayland_egl.c with 81% similarity]
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h [new file with mode: 0644]
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c [moved from src/lib/ecore_evas/ecore_evas_wayland_shm.c with 78% similarity]
src/modules/ecore_evas/engines/win32/ecore_evas_win32.c [moved from src/lib/ecore_evas/ecore_evas_win32.c with 95% similarity]
src/modules/ecore_evas/engines/x/ecore_evas_x.c [moved from src/lib/ecore_evas/ecore_evas_x.c with 79% similarity]

index 679feee..ac7e007 100644 (file)
@@ -5,30 +5,17 @@ lib_LTLIBRARIES += lib/ecore_evas/libecore_evas.la
 
 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 \
@@ -48,126 +35,180 @@ lib_ecore_evas_libecore_evas_la_CPPFLAGS = \
 -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@
index 5c57025..1a241b5 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _ECORE_EVAS_H
 #define _ECORE_EVAS_H
 
+#include "Ecore_Evas_Types.h"
+
 #include <Evas.h>
 #include <Ecore_Getopt.h>
 #include <Ecore_Input.h>
@@ -145,39 +147,6 @@ typedef enum _Ecore_Evas_Object_Associate_Flags
   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);
diff --git a/src/lib/ecore_evas/Ecore_Evas_Types.h b/src/lib/ecore_evas/Ecore_Evas_Types.h
new file mode 100644 (file)
index 0000000..395c4c0
--- /dev/null
@@ -0,0 +1,38 @@
+#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_ */
index db35a78..7fed529 100644 (file)
@@ -68,6 +68,23 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED)
    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
@@ -79,6 +96,8 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED)
 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:
@@ -252,7 +271,7 @@ ecore_evas_init(void)
    _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;
@@ -274,28 +293,14 @@ ecore_evas_shutdown(void)
 
    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);
    
@@ -490,7 +495,6 @@ _ecore_evas_constructor_opengl_sdl(int x EINA_UNUSED, int y EINA_UNUSED, int w,
 }
 #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)
 {
@@ -506,10 +510,8 @@ _ecore_evas_constructor_fb(int x EINA_UNUSED, int y EINA_UNUSED, int w, int h, c
 
    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)
 {
@@ -523,9 +525,7 @@ _ecore_evas_constructor_psl1ght(int x EINA_UNUSED, int y EINA_UNUSED, int w, int
    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)
 {
@@ -541,9 +541,7 @@ _ecore_evas_constructor_wayland_shm(int x, int y, int w, int h, const char *extr
 
    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)
 {
@@ -559,47 +557,40 @@ _ecore_evas_constructor_wayland_egl(int x, int y, int w, int h, const char *extr
 
    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 *
@@ -813,6 +804,23 @@ ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data)
      }
 }
 
+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;}
 
@@ -2434,6 +2442,8 @@ _ecore_evas_unref(Ecore_Evas *ee)
 void
 _ecore_evas_free(Ecore_Evas *ee)
 {
+   Ecore_Evas_Interface *iface;
+
    ee->deleted = EINA_TRUE;
    if (ee->refcount > 0) return;
 
@@ -2470,6 +2480,11 @@ _ecore_evas_free(Ecore_Evas *ee)
         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);
 }
 
@@ -2752,90 +2767,684 @@ ecore_evas_input_event_unregister(Ecore_Evas *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);
+}
diff --git a/src/lib/ecore_evas/ecore_evas_module.c b/src/lib/ecore_evas/ecore_evas_module.c
new file mode 100644 (file)
index 0000000..1e399b0
--- /dev/null
@@ -0,0 +1,96 @@
+#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);
+}
index d6cff8f..7c3a203 100644 (file)
@@ -1,6 +1,8 @@
 #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;
@@ -109,6 +54,17 @@ typedef void   (*Ecore_Evas_Event_Cb) (Ecore_Evas *ee);
 
 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
 {
@@ -173,102 +129,89 @@ 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
@@ -383,69 +326,13 @@ 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);
@@ -482,8 +369,12 @@ void _ecore_evas_mouse_multi_up_process(Ecore_Evas *ee, int device,
 
 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.
@@ -500,3 +391,4 @@ void _ecore_evas_window_profile_free(Ecore_Evas *ee);
 void _ecore_evas_window_available_profiles_free(Ecore_Evas *ee);
 
 #endif
+
@@ -2,18 +2,15 @@
 # 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)
@@ -22,22 +19,34 @@ _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();
 }
 
@@ -45,6 +54,7 @@ static void
 _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;
@@ -58,19 +68,18 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int 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);
 
-   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);
      }
 
@@ -81,7 +90,7 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
           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;
@@ -92,8 +101,8 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
              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);
 }
 
@@ -103,28 +112,23 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, in
    _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;
 
@@ -135,26 +139,26 @@ _ecore_evas_buffer_render(Ecore_Evas *ee)
            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)
@@ -170,16 +174,17 @@ _ecore_evas_buffer_render(Ecore_Evas *ee)
 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;
@@ -447,10 +452,11 @@ _ecore_evas_buffer_cb_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN
 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;
@@ -545,7 +551,6 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
      NULL, // screen_geometry_get
      NULL  // screen_dpi_get
 };
-#endif
 
 static void *
 _ecore_evas_buffer_pix_alloc(void *data EINA_UNUSED, int size)
@@ -560,18 +565,11 @@ _ecore_evas_buffer_pix_free(void *data EINA_UNUSED, void *pix)
 }
 
 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;
 
@@ -580,15 +578,25 @@ ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, i
    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";
 
@@ -620,15 +628,13 @@ ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, i
    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;
@@ -664,51 +670,36 @@ ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, i
    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;
@@ -719,6 +710,16 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
    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);
@@ -760,69 +761,69 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
    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);
@@ -849,7 +850,21 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
    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;
 }
diff --git a/src/modules/ecore_evas/engines/buffer/ecore_evas_buffer_private.h b/src/modules/ecore_evas/engines/buffer/ecore_evas_buffer_private.h
new file mode 100644 (file)
index 0000000..06f82f9
--- /dev/null
@@ -0,0 +1,24 @@
+#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_ */
@@ -29,7 +29,6 @@ void *alloca (size_t);
 #endif
 
 #include <stdio.h>
-#include <stdlib.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <math.h>
@@ -43,22 +42,13 @@ void *alloca (size_t);
 #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;
 
@@ -72,6 +62,8 @@ struct _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)
 {
@@ -386,12 +378,16 @@ static Eina_List *extn_ee_list = NULL;
 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
@@ -403,18 +399,22 @@ static 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);
 }
 
@@ -424,15 +424,18 @@ _ecore_evas_lock_other_have(Ecore_Evas *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)) &&
@@ -446,8 +449,9 @@ static void
 _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;
@@ -461,8 +465,9 @@ static void
 _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;
@@ -496,15 +501,16 @@ static void
 _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;
@@ -535,8 +541,9 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
 {
    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;
@@ -572,26 +579,26 @@ _ecore_evas_extn_free(Ecore_Evas *ee)
           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);
@@ -603,6 +610,8 @@ _ecore_evas_extn_free(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;
@@ -615,10 +624,10 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
     * 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))
       {
@@ -690,10 +699,11 @@ static void
 _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)
      {
@@ -711,10 +721,11 @@ static void
 _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)
      {
@@ -733,9 +744,10 @@ _ecore_evas_extn_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
 {
    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)
      {
@@ -772,10 +784,11 @@ static void
 _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)
      {
@@ -795,10 +808,11 @@ static void
 _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)
      {
@@ -822,10 +836,11 @@ static void
 _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)
      {
@@ -845,10 +860,11 @@ static void
 _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)
      {
@@ -882,10 +898,11 @@ static void
 _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)
      {
@@ -918,10 +935,11 @@ static void
 _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)
      {
@@ -962,10 +980,11 @@ static void
 _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)
      {
@@ -1018,10 +1037,11 @@ static void
 _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)
      {
@@ -1074,10 +1094,11 @@ static void
 _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)
      {
@@ -1094,12 +1115,12 @@ _ecore_evas_extn_cb_hold(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
 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);
@@ -1108,12 +1129,12 @@ _ecore_evas_extn_cb_focus_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj E
 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);
@@ -1122,12 +1143,12 @@ _ecore_evas_extn_cb_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
 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);
@@ -1136,12 +1157,12 @@ _ecore_evas_extn_cb_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
 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);
@@ -1151,11 +1172,12 @@ static void
 _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)
@@ -1257,13 +1279,14 @@ _ipc_server_add(void *data, int type EINA_UNUSED, void *event)
 {
    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;
@@ -1274,13 +1297,14 @@ _ipc_server_del(void *data, int type EINA_UNUSED, void *event)
 {
    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);
@@ -1301,13 +1325,14 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
 {
    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;
@@ -1332,8 +1357,8 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
 
               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);
                 }
@@ -1357,7 +1382,7 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
          // 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);
@@ -1379,21 +1404,21 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
                                                      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);
@@ -1402,13 +1427,13 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
                                                 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:
@@ -1427,32 +1452,28 @@ _ipc_server_data(void *data, int type EINA_UNUSED, void *event)
      }
    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);*/
@@ -1467,6 +1488,9 @@ ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
 
    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;
@@ -1486,62 +1510,62 @@ ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
    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);
 
@@ -1554,32 +1578,28 @@ ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
    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();
@@ -1592,13 +1612,13 @@ ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum,
                                                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,
@@ -1612,41 +1632,28 @@ ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum,
        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;
@@ -1659,16 +1666,16 @@ _ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
    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);
@@ -1678,7 +1685,7 @@ _ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
                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;
@@ -1721,13 +1728,14 @@ static void
 _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);
@@ -1760,8 +1768,9 @@ _ecore_evas_extn_socket_render(Ecore_Evas *ee)
    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)
      {
@@ -1772,7 +1781,7 @@ _ecore_evas_extn_socket_render(Ecore_Evas *ee)
      }
    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);
@@ -1812,13 +1821,14 @@ _ipc_client_add(void *data, int type EINA_UNUSED, void *event)
 {
    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);
@@ -1847,8 +1857,9 @@ _ipc_client_del(void *data, int type EINA_UNUSED, void *event)
 {
    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;
 
@@ -1863,13 +1874,14 @@ _ipc_client_data(void *data, int type EINA_UNUSED, void *event)
 {
    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;
@@ -2124,6 +2136,7 @@ _ipc_client_data(void *data, int type EINA_UNUSED, void *event)
 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;
@@ -2131,7 +2144,7 @@ _ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
    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;
@@ -2254,13 +2267,12 @@ static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
    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;
 
@@ -2268,13 +2280,23 @@ ecore_evas_extn_socket_new(int w, int h)
    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;
@@ -2342,16 +2364,13 @@ ecore_evas_extn_socket_new(int w, int h)
    _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)
@@ -2404,7 +2423,7 @@ ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, E
              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,
@@ -2419,7 +2438,26 @@ ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, E
                                     _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);
@@ -2,21 +2,17 @@
 # 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
 
@@ -477,12 +473,10 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
      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;
@@ -576,10 +570,4 @@ ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
   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
 }
similarity index 89%
rename from src/lib/ecore_evas/ecore_evas_fb.c
rename to src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
index 8b36e8b..709613e 100644 (file)
@@ -7,22 +7,28 @@
 #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)
 {
@@ -53,37 +59,28 @@ _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);
@@ -96,52 +93,48 @@ _ecore_evas_fb_gain(void *data EINA_UNUSED)
 }
 
 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;
@@ -164,7 +157,7 @@ _ecore_evas_fb_render(Ecore_Evas *ee)
           {
              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);
           }
 
@@ -252,11 +245,33 @@ _ecore_evas_fb_init(Ecore_Evas *ee, int w, int h)
    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();
 }
@@ -435,6 +450,7 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
 {
    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)) ||
@@ -443,8 +459,8 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int 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);
@@ -464,9 +480,9 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
      }
    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);
@@ -483,26 +499,6 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
      }
 }
 
-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,
@@ -564,22 +560,13 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
      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;
@@ -591,15 +578,19 @@ ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
    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";
@@ -666,14 +657,6 @@ ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
 
    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
@@ -9,7 +9,6 @@
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
 
-#ifdef BUILD_ECORE_EVAS_PSL1GHT
 #include <Ecore_Psl1ght.h>
 #include <Evas_Engine_PSL1GHT.h>
 
@@ -130,17 +129,15 @@ _ecore_evas_psl1ght_render(Ecore_Evas *ee)
 {
    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);
 
@@ -411,7 +408,7 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
 };
 
 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;
@@ -503,14 +500,3 @@ ecore_evas_psl1ght_new(const char *name, int w, int h)
    
    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 */
similarity index 93%
rename from src/lib/ecore_evas/ecore_evas_sdl.c
rename to src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
index e609b1a..d632148 100644 (file)
@@ -2,31 +2,26 @@
 # 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; */
@@ -610,11 +605,10 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu
    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;
@@ -625,25 +619,17 @@ ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface
    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;
@@ -655,12 +641,5 @@ ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int nofram
    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
 
@@ -2,18 +2,11 @@
 # 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;
@@ -31,6 +24,7 @@ static Evas_Smart *_ecore_evas_wl_common_smart = NULL;
 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)
 {
@@ -219,19 +213,26 @@ _ecore_evas_wl_common_shutdown(void)
 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);
@@ -243,6 +244,8 @@ _ecore_evas_wl_common_free(Ecore_Evas *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;
@@ -290,8 +293,8 @@ _ecore_evas_wl_common_resize(Ecore_Evas *ee, int w, int h)
              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);
      }
 }
 
@@ -347,10 +350,13 @@ _ecore_evas_wl_common_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_
 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;
 
@@ -358,8 +364,8 @@ _ecore_evas_wl_common_move(Ecore_Evas *ee, int x, int 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);
      }
 }
@@ -480,40 +486,49 @@ _ecore_evas_wl_common_frame_add(Evas *evas)
 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;
@@ -521,8 +536,8 @@ _ecore_evas_wl_common_name_class_set(Ecore_Evas *ee, const char *n, const char *
    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);
 }
 
@@ -591,6 +606,7 @@ void
 _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);
 
@@ -600,7 +616,7 @@ _ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int la
         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;
      }
 
@@ -609,7 +625,7 @@ _ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int la
    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);
@@ -650,23 +666,29 @@ _ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, int iconify)
 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
@@ -706,6 +728,7 @@ _ecore_evas_wl_common_render_updates(Ecore_Evas *ee)
 {
    int rend = 0;
    Eina_List *updates = NULL;
+   Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
@@ -715,7 +738,7 @@ _ecore_evas_wl_common_render_updates(Ecore_Evas *ee)
         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();
@@ -781,3 +804,86 @@ _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee EINA_UNUSED, int *xdpi
    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;
+}
@@ -1,16 +1,4 @@
-#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>
@@ -18,16 +6,8 @@
 # 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);
@@ -101,10 +81,13 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
 
 /* 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;
 
@@ -131,11 +114,22 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
         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);
@@ -175,10 +169,10 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
 
    /* 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)))
      {
@@ -202,9 +196,9 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
 
    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);
@@ -230,6 +224,7 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
 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;
@@ -239,6 +234,7 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
    ee->req.w = w;
    ee->req.h = h;
 
+   wdata = ee->engine.data;
    if (!ee->prop.fullscreen)
      {
         int fw = 0, fh = 0;
@@ -278,14 +274,14 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
              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);
@@ -296,32 +292,34 @@ static void
 _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)
@@ -330,7 +328,7 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
              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 */
@@ -344,11 +342,13 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
 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)
@@ -357,8 +357,8 @@ _ecore_evas_wl_hide(Ecore_Evas *ee)
         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;
@@ -408,10 +408,13 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
 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;
 
@@ -422,14 +425,8 @@ _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
                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
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h
new file mode 100644 (file)
index 0000000..3522263
--- /dev/null
@@ -0,0 +1,81 @@
+#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_ */
@@ -1,33 +1,12 @@
-#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);
@@ -117,10 +96,12 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
 
 /* 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;
 
@@ -146,12 +127,22 @@ ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, in
         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);
@@ -191,10 +182,10 @@ ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, in
 
    /* 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)))
      {
@@ -216,9 +207,9 @@ ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, in
 
    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);
@@ -235,7 +226,6 @@ ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, in
  err:
    ecore_evas_free(ee);
    _ecore_evas_wl_common_shutdown();
-
  ee_err:
    ecore_wl_shutdown();
    return NULL;
@@ -253,6 +243,7 @@ static void
 _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__);
 
@@ -263,6 +254,8 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
    ee->req.w = w;
    ee->req.h = h;
 
+   wdata = ee->engine.data;
+
    if (!ee->prop.fullscreen)
      {
         int fw = 0, fh = 0;
@@ -302,8 +295,8 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
              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);
 
@@ -314,14 +307,14 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int 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);
@@ -344,12 +337,14 @@ static void
 _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)
@@ -358,28 +353,28 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
         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;
@@ -390,14 +385,16 @@ static void
 _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))
@@ -406,8 +403,8 @@ _ecore_evas_wl_hide(Ecore_Evas *ee)
         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;
@@ -419,6 +416,7 @@ static void
 _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__);
@@ -426,22 +424,23 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
    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);
@@ -450,7 +449,7 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
    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);
      }
 }
 
@@ -458,6 +457,7 @@ static void
 _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__);
 
@@ -465,25 +465,26 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
    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);
      }
 }
 
@@ -492,9 +493,11 @@ _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t
 {
    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;
@@ -512,6 +515,7 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
 {
    int rend = 0;
    Ecore_Wl_Window *win = NULL;
+   Ecore_Evas_Engine_Wl_Data *wdata;
 
    if (!ee) return 0;
    if (!ee->visible)
@@ -520,7 +524,8 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
         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))
@@ -547,17 +552,19 @@ _ecore_evas_wl_render(Ecore_Evas *ee)
 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];
@@ -565,7 +572,7 @@ _ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size)
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (size <= ee->engine.wl.pool_size)
+   if (size <= wdata->pool_size)
       return;
 
    size *= 1.5;
@@ -599,9 +606,9 @@ _ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size)
         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);
@@ -610,15 +617,17 @@ _ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size)
 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;
 
@@ -632,26 +641,23 @@ _ecore_evas_wl_buffer_new(Ecore_Evas *ee, int w, int h)
      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
@@ -6,17 +6,29 @@
 
 #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
@@ -25,6 +37,19 @@ static int _ecore_evas_init_count = 0;
 
 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);
@@ -644,9 +669,11 @@ _ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation, int resize)
 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
@@ -658,8 +685,8 @@ _ecore_evas_win32_shaped_set(Ecore_Evas *ee, int shaped)
         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);
@@ -886,14 +913,15 @@ static void
 _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;
@@ -948,6 +976,7 @@ _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
 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;
 
@@ -975,19 +1004,19 @@ _ecore_evas_win32_alpha_set(Ecore_Evas *ee, int alpha)
         /* 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); */
         /*   } */
 
@@ -996,7 +1025,7 @@ _ecore_evas_win32_alpha_set(Ecore_Evas *ee, int alpha)
 
 //        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))
           {
@@ -1291,7 +1320,6 @@ _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
 }
 #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,
@@ -1301,6 +1329,7 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
                                int                 height)
 {
    Ecore_Evas *ee;
+   Ecore_Evas_Engine_Data_Win32 *wdata;
 
    if (!ecore_win32_init())
      return NULL;
@@ -1308,12 +1337,22 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
    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;
@@ -1340,7 +1379,7 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
    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)
      {
@@ -1367,8 +1406,6 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
    return ee;
 }
 
-#endif /* BUILD_ECORE_EVAS_WIN32 */
-
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
 
 EAPI Ecore_Evas *
@@ -1505,21 +1542,24 @@ ecore_evas_gl_glew_new(Ecore_Win32_Window *parent EINA_UNUSED,
 
 #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;
+}
similarity index 79%
rename from src/lib/ecore_evas/ecore_evas_x.c
rename to src/modules/ecore_evas/engines/x/ecore_evas_x.c
index ec8e923..5e44413 100644 (file)
@@ -2,16 +2,35 @@
 # 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];
@@ -19,6 +38,67 @@ 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)
 {
@@ -38,28 +118,30 @@ _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)
@@ -67,20 +149,22 @@ _ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
              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;
 
@@ -90,10 +174,10 @@ _ecore_evas_x_protocols_set(Ecore_Evas *ee)
    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);
@@ -102,42 +186,47 @@ _ecore_evas_x_protocols_set(Ecore_Evas *ee)
 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
@@ -154,20 +243,22 @@ _ecore_evas_x_window_profile_protocol_set(Ecore_Evas *ee)
 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)
                {
@@ -181,11 +272,11 @@ _ecore_evas_x_window_profile_set(Ecore_Evas *ee)
                     &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;
           }
      }
 }
@@ -337,10 +428,11 @@ _ecore_evas_x_render(Ecore_Evas *ee)
    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)
@@ -355,7 +447,7 @@ _ecore_evas_x_render(Ecore_Evas *ee)
    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)
                {
@@ -368,11 +460,11 @@ _ecore_evas_x_render(Ecore_Evas *ee)
                   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;
@@ -390,8 +482,8 @@ _ecore_evas_x_render(Ecore_Evas *ee)
                        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)
                          {
@@ -421,12 +513,12 @@ _ecore_evas_x_render(Ecore_Evas *ee)
                             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)
                          {
@@ -435,16 +527,16 @@ _ecore_evas_x_render(Ecore_Evas *ee)
                              * 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;
@@ -460,11 +552,11 @@ _ecore_evas_x_render(Ecore_Evas *ee)
              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;
@@ -500,6 +592,8 @@ _ecore_evas_x_render(Ecore_Evas *ee)
 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
@@ -511,16 +605,16 @@ _ecore_evas_x_resize_shape(Ecore_Evas *ee)
              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);
@@ -537,11 +631,13 @@ _ecore_evas_x_event_property_change(void *data EINA_UNUSED, int type EINA_UNUSED
 {
    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)
      {
@@ -569,16 +665,16 @@ _ecore_evas_x_event_property_change(void *data EINA_UNUSED, int type EINA_UNUSED
            } 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;
@@ -586,16 +682,16 @@ _ecore_evas_x_event_property_change(void *data EINA_UNUSED, int type EINA_UNUSED
         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;
@@ -611,41 +707,41 @@ _ecore_evas_x_event_property_change(void *data EINA_UNUSED, int type EINA_UNUSED
                   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;
@@ -654,16 +750,16 @@ _ecore_evas_x_event_property_change(void *data EINA_UNUSED, int type EINA_UNUSED
              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) ||
@@ -720,16 +816,18 @@ _ecore_evas_x_event_visibility_change(void *data EINA_UNUSED, int type EINA_UNUS
 {
    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
@@ -742,6 +840,7 @@ _ecore_evas_x_event_client_message(void *data EINA_UNUSED, int type EINA_UNUSED,
 {
    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;
@@ -749,47 +848,52 @@ _ecore_evas_x_event_client_message(void *data EINA_UNUSED, int type EINA_UNUSED,
      {
         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]);
@@ -804,7 +908,7 @@ _ecore_evas_x_event_client_message(void *data EINA_UNUSED, int type EINA_UNUSED,
                   if (ee->func.fn_state_change)
                     ee->func.fn_state_change(ee);
 
-                  ee->engine.x.profile.done = 1;
+                  edata->profile.done = 1;
                   free(p);
                }
           }
@@ -976,42 +1080,44 @@ _ecore_evas_x_event_window_damage(void *data EINA_UNUSED, int type EINA_UNUSED,
 {
    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
@@ -1052,14 +1158,16 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE
 {
    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))
@@ -1217,6 +1325,7 @@ static void
 _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)
@@ -1235,11 +1344,11 @@ _ecore_evas_x_state_update(Ecore_Evas *ee)
      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;
@@ -1250,58 +1359,60 @@ _ecore_evas_x_state_update(Ecore_Evas *ee)
 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);
                }
           }
@@ -1311,28 +1422,28 @@ _ecore_evas_x_layer_update(Ecore_Evas *ee)
         /* 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);
                }
           }
@@ -1388,33 +1499,55 @@ _ecore_evas_x_init(void)
    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();
 }
@@ -1430,11 +1563,13 @@ _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb fu
 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))
                {
@@ -1454,10 +1589,10 @@ _ecore_evas_x_move(Ecore_Evas *ee, int x, int 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;
@@ -1476,11 +1611,13 @@ _ecore_evas_x_move(Ecore_Evas *ee, int x, int 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;
@@ -1493,9 +1630,11 @@ _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
 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))
           {
@@ -1526,9 +1665,9 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int 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);
      }
 }
@@ -1536,23 +1675,25 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int 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;
@@ -1590,11 +1731,11 @@ _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
           }
      }
    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;
@@ -1607,6 +1748,7 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
                                     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;
@@ -1622,7 +1764,7 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
 
         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);
@@ -1731,6 +1873,8 @@ _ecore_evas_x_rotation_effect_setup(void)
 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
@@ -1784,10 +1928,10 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
 
 #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);
@@ -1798,6 +1942,8 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
 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"))
@@ -1814,16 +1960,16 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
                   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);
@@ -1833,8 +1979,8 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
                }
              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))
                     {
@@ -1852,6 +1998,7 @@ _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
 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;
 
@@ -1874,20 +2021,20 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
         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);
           }
 
@@ -1898,9 +2045,9 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
         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))
           {
@@ -1961,13 +2108,13 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
 
         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);
@@ -1975,7 +2122,7 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int 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,
@@ -1985,7 +2132,7 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int 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);
@@ -1996,20 +2143,20 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
         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);
           }
  */
@@ -2019,9 +2166,9 @@ _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
         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))
           {
@@ -2130,11 +2277,13 @@ _ecore_evas_x_urgent_set(Ecore_Evas *ee, int urgent)
 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);
@@ -2143,11 +2292,13 @@ _ecore_evas_x_modal_set(Ecore_Evas *ee, int modal)
 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);
@@ -2156,14 +2307,16 @@ _ecore_evas_x_demand_attention_set(Ecore_Evas *ee, int demand)
 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
@@ -2171,9 +2324,6 @@ _ecore_evas_x_focus_skip_set(Ecore_Evas *ee, int skip)
    _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)
 {
@@ -2210,7 +2360,9 @@ _ecore_evas_x_lower(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);
 }
 
@@ -2357,11 +2509,13 @@ _ecore_evas_x_focus_set(Ecore_Evas *ee, int on EINA_UNUSED)
 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);
 }
@@ -2387,6 +2541,8 @@ _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
 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
@@ -2394,9 +2550,9 @@ _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
     * 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);
@@ -2459,15 +2615,17 @@ _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
 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
@@ -2477,13 +2635,15 @@ _ecore_evas_x_maximized_set(Ecore_Evas *ee, int on)
 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);
@@ -2492,12 +2652,14 @@ _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
 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);
 }
 
@@ -2505,6 +2667,8 @@ static void
 _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;
 
@@ -2518,13 +2682,15 @@ _ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n)
              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;
 
@@ -2539,9 +2705,9 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
           {
              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);
@@ -2552,30 +2718,30 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
                     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))
                     {
@@ -2660,25 +2826,6 @@ norandr:
    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,
@@ -2741,7 +2888,6 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func =
      _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
@@ -2753,19 +2899,20 @@ static void
 _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);
                }
           }
      }
@@ -2775,55 +2922,48 @@ static void
 _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;
@@ -2834,6 +2974,19 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
    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);
 
@@ -2860,7 +3013,7 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
    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();
@@ -2873,12 +3026,12 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
    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))
           {
@@ -2998,52 +3151,22 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window 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;
@@ -3060,50 +3183,26 @@ ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
           }
      }
 }
-#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,
@@ -3112,37 +3211,17 @@ ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window wi
                                     (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;
 
@@ -3151,6 +3230,20 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
    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);
 
@@ -3186,7 +3279,7 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
    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();
@@ -3198,24 +3291,24 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
    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);
@@ -3249,113 +3342,44 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
 
    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;
 
@@ -3373,52 +3397,33 @@ ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, v
           }
      }
 }
-#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)
 {
@@ -3459,15 +3464,14 @@ _ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *
 
    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))
      {
@@ -3476,6 +3480,7 @@ ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, in
         return;
      }
 
+   edata = ee->engine.data;
    src_rect.x = x;
    src_rect.y = y;
    src_rect.width = w;
@@ -3488,31 +3493,23 @@ ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, in
 
    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))
      {
@@ -3521,6 +3518,7 @@ ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, in
         return;
      }
 
+   edata = ee->engine.data;
    src_rect.x = x;
    src_rect.y = y;
    src_rect.width = w;
@@ -3533,31 +3531,23 @@ ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, in
 
    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))
      {
@@ -3566,6 +3556,7 @@ ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int
         return;
      }
 
+   edata = ee->engine.data;
    src_rect.x = x;
    src_rect.y = y;
    src_rect.width = w;
@@ -3578,28 +3569,20 @@ ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int
 
    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,
@@ -3607,20 +3590,17 @@ ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
         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,
@@ -3628,20 +3608,17 @@ ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
         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,
@@ -3649,11 +3626,75 @@ ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
         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