From ad7579c1294222d0647673499f062b137d30d270 Mon Sep 17 00:00:00 2001 From: Flavio Vinicius Alvares Ceolin Date: Wed, 5 Dec 2012 21:15:42 +0000 Subject: [PATCH] ecore_evas: Make the engines loadable modules 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 --- src/Makefile_Ecore_Evas.am | 269 ++-- src/lib/ecore_evas/Ecore_Evas.h | 35 +- src/lib/ecore_evas/Ecore_Evas_Types.h | 38 + src/lib/ecore_evas/ecore_evas.c | 773 ++++++++-- src/lib/ecore_evas/ecore_evas_module.c | 96 ++ src/lib/ecore_evas/ecore_evas_private.h | 300 ++-- .../engines/buffer}/ecore_evas_buffer.c | 261 ++-- .../buffer/ecore_evas_buffer_private.h | 24 + .../engines/buffer}/ecore_evas_extn.c | 392 +++--- .../engines/cocoa}/ecore_evas_cocoa.c | 20 +- .../ecore_evas/engines/fb}/ecore_evas_fb.c | 149 +- .../engines/psl1ght}/ecore_evas_psl1ght.c | 18 +- .../ecore_evas/engines/sdl}/ecore_evas_sdl.c | 57 +- .../wayland}/ecore_evas_wayland_common.c | 164 ++- .../engines/wayland}/ecore_evas_wayland_egl.c | 113 +- .../wayland/ecore_evas_wayland_private.h | 81 ++ .../engines/wayland}/ecore_evas_wayland_shm.c | 188 +-- .../engines/win32}/ecore_evas_win32.c | 108 +- .../ecore_evas/engines/x}/ecore_evas_x.c | 1251 +++++++++-------- 19 files changed, 2633 insertions(+), 1704 deletions(-) create mode 100644 src/lib/ecore_evas/Ecore_Evas_Types.h create mode 100644 src/lib/ecore_evas/ecore_evas_module.c rename src/{lib/ecore_evas => modules/ecore_evas/engines/buffer}/ecore_evas_buffer.c (81%) create mode 100644 src/modules/ecore_evas/engines/buffer/ecore_evas_buffer_private.h rename src/{lib/ecore_evas => modules/ecore_evas/engines/buffer}/ecore_evas_extn.c (88%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/cocoa}/ecore_evas_cocoa.c (97%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/fb}/ecore_evas_fb.c (89%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/psl1ght}/ecore_evas_psl1ght.c (96%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/sdl}/ecore_evas_sdl.c (93%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/wayland}/ecore_evas_wayland_common.c (83%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/wayland}/ecore_evas_wayland_egl.c (81%) create mode 100644 src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h rename src/{lib/ecore_evas => modules/ecore_evas/engines/wayland}/ecore_evas_wayland_shm.c (78%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/win32}/ecore_evas_win32.c (95%) rename src/{lib/ecore_evas => modules/ecore_evas/engines/x}/ecore_evas_x.c (79%) diff --git a/src/Makefile_Ecore_Evas.am b/src/Makefile_Ecore_Evas.am index 679feee895..ac7e0074ab 100644 --- a/src/Makefile_Ecore_Evas.am +++ b/src/Makefile_Ecore_Evas.am @@ -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,76 +35,15 @@ 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/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 -endif - -if HAVE_ECORE_FB -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 -endif - -if HAVE_PS3 -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 -endif - -if HAVE_ECORE_WAYLAND -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 -endif - -if HAVE_WIN32 -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 +-I$(top_srcdir)/src/lib/evil \ +-I$(top_builddir)/src/lib/evil endif lib_ecore_evas_libecore_evas_la_LIBADD = \ @@ -130,44 +56,159 @@ 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 +lib_ecore_evas_libecore_evas_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@ -if HAVE_ECORE_FB -lib_ecore_evas_libecore_evas_la_LIBADD += \ -lib/ecore_fb/libecore_fb.la -endif +# Engines -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 += \ -lib/ecore_win32/libecore_win32.la -endif - -if HAVE_WINCE -lib_ecore_evas_libecore_evas_la_LIBADD += \ -lib/ecore_wince/libecore_wince.la +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 -lib_ecore_evas_libecore_evas_la_LIBADD += \ +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 -lib_ecore_evas_libecore_evas_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@ +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 +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 +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 +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 +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 \ +@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 +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 +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 diff --git a/src/lib/ecore_evas/Ecore_Evas.h b/src/lib/ecore_evas/Ecore_Evas.h index 5c57025747..1a241b5d84 100644 --- a/src/lib/ecore_evas/Ecore_Evas.h +++ b/src/lib/ecore_evas/Ecore_Evas.h @@ -1,6 +1,8 @@ #ifndef _ECORE_EVAS_H #define _ECORE_EVAS_H +#include "Ecore_Evas_Types.h" + #include #include #include @@ -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 index 0000000000..395c4c016f --- /dev/null +++ b/src/lib/ecore_evas/Ecore_Evas_Types.h @@ -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_ */ diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index db35a7837e..7fed5299c2 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -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 index 0000000000..1e399b07d6 --- /dev/null +++ b/src/lib/ecore_evas/ecore_evas_module.c @@ -0,0 +1,96 @@ +#ifdef HAVE_CONFIG_H +# include +#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); +} diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index d6cff8f023..7c3a203931 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -1,6 +1,8 @@ #ifndef _ECORE_EVAS_PRIVATE_H #define _ECORE_EVAS_PRIVATE_H +#include "Ecore_Evas_Types.h" + #include #include #include @@ -9,67 +11,10 @@ #define ECORE_MAGIC_EVAS 0x76543211 -#ifdef BUILD_ECORE_EVAS_X11 -# include -# include -# ifdef HAVE_ECORE_X_XCB -# include -# endif -# ifdef HAVE_ECORE_X_XLIB -# include -# include -# endif -#endif - -#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11 -# include -#endif - -#ifdef BUILD_ECORE_EVAS_OPENGL_X11 -# include -#endif - -#ifdef BUILD_ECORE_EVAS_FB -# include -#endif - #if defined(BUILD_ECORE_EVAS_SOFTWARE_BUFFER) || defined(BUILD_ECORE_EVAS_EWS) # include #endif -#ifdef BUILD_ECORE_EVAS_WIN32 -# include "Ecore_Win32.h" -# ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI -# include -# endif -# ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW -# include -# endif -# ifdef BUILD_ECORE_EVAS_DIRECT3D -# include -# endif -# ifdef BUILD_ECORE_EVAS_OPENGL_GLEW -# include -# endif -#endif - -#ifdef BUILD_ECORE_EVAS_GL_COCOA -# include "Ecore_Cocoa.h" -# include -#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 -#endif - -#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL -# include -#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 + diff --git a/src/lib/ecore_evas/ecore_evas_buffer.c b/src/modules/ecore_evas/engines/buffer/ecore_evas_buffer.c similarity index 81% rename from src/lib/ecore_evas/ecore_evas_buffer.c rename to src/modules/ecore_evas/engines/buffer/ecore_evas_buffer.c index 8dcd71442e..744fa73d61 100644 --- a/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/src/modules/ecore_evas/engines/buffer/ecore_evas_buffer.c @@ -2,19 +2,16 @@ # include #endif -// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar! -#include +#include "ecore_evas_buffer_private.h" -#include -#include "ecore_private.h" -#include - -#include "ecore_evas_private.h" -#include "Ecore_Evas.h" - -#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER static int _ecore_evas_init_count = 0; +static const char *interface_buffer_name = "buffer"; +static const int interface_buffer_version = 1; + + +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) { -#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER + 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) +{ + 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 index 0000000000..06f82f9fea --- /dev/null +++ b/src/modules/ecore_evas/engines/buffer/ecore_evas_buffer_private.h @@ -0,0 +1,24 @@ +#ifndef _ECORE_EVAS_BUFFER_PRIVATE_H_ +#define _ECORE_EVAS_BUFFER_PRIVATE_H_ + +#include + +#include +#include "ecore_private.h" +#include + +#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_ */ diff --git a/src/lib/ecore_evas/ecore_evas_extn.c b/src/modules/ecore_evas/engines/buffer/ecore_evas_extn.c similarity index 88% rename from src/lib/ecore_evas/ecore_evas_extn.c rename to src/modules/ecore_evas/engines/buffer/ecore_evas_extn.c index 41bdb665e3..b21b34b321 100644 --- a/src/lib/ecore_evas/ecore_evas_extn.c +++ b/src/modules/ecore_evas/engines/buffer/ecore_evas_extn.c @@ -29,7 +29,6 @@ void *alloca (size_t); #endif #include -#include #include #include #include @@ -43,22 +42,13 @@ void *alloca (size_t); #include #include -#include -#include "ecore_private.h" -#include - -#ifdef BUILD_ECORE_EVAS_EXTN - #include -#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; + Ecore_Evas_Engine_Buffer_Data *bdata; - if (!obj) return EINA_FALSE; - - 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); diff --git a/src/lib/ecore_evas/ecore_evas_cocoa.c b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c similarity index 97% rename from src/lib/ecore_evas/ecore_evas_cocoa.c rename to src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c index 32acb57ccb..7aecac07cc 100644 --- a/src/lib/ecore_evas/ecore_evas_cocoa.c +++ b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c @@ -2,21 +2,17 @@ # include #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 #include -#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 } diff --git a/src/lib/ecore_evas/ecore_evas_fb.c b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c 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 8b36e8b825..709613eaf6 100644 --- a/src/lib/ecore_evas/ecore_evas_fb.c +++ b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c @@ -7,22 +7,28 @@ #include #include -#include "ecore_private.h" -#ifdef BUILD_ECORE_EVAS_FB +#include #include +#include #include -#endif +#include -#include "ecore_evas_private.h" -#include "Ecore_Evas.h" +#include +#include -#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 diff --git a/src/lib/ecore_evas/ecore_evas_psl1ght.c b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c similarity index 96% rename from src/lib/ecore_evas/ecore_evas_psl1ght.c rename to src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c index c9f62e4702..99bd9d4436 100644 --- a/src/lib/ecore_evas/ecore_evas_psl1ght.c +++ b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c @@ -9,7 +9,6 @@ #include "ecore_evas_private.h" #include "Ecore_Evas.h" -#ifdef BUILD_ECORE_EVAS_PSL1GHT #include #include @@ -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 */ diff --git a/src/lib/ecore_evas/ecore_evas_sdl.c b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c 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 e609b1a60f..d632148e9b 100644 --- a/src/lib/ecore_evas/ecore_evas_sdl.c +++ b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c @@ -2,31 +2,26 @@ # include #endif -#include -#include -#include -#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) -# include -# ifdef BUILD_ECORE_EVAS_OPENGL_SDL -# include -# endif -#endif - -#include -#include - -#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) -#include -#endif #include "ecore_evas_private.h" #include "Ecore_Evas.h" + +#include +#include +#include +#include +#ifdef BUILD_ECORE_EVAS_OPENGL_SDL +# include +#endif + +#include +#include +#include /* * 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 diff --git a/src/lib/ecore_evas/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c similarity index 83% rename from src/lib/ecore_evas/ecore_evas_wayland_common.c rename to src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index 5e83175932..c0cc37dd3b 100644 --- a/src/lib/ecore_evas/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -2,18 +2,11 @@ # include "config.h" #endif -//#define LOGFNS 1 +#include "ecore_evas_wayland_private.h" -#ifdef LOGFNS -# include -# 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_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; +} diff --git a/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c similarity index 81% rename from src/lib/ecore_evas/ecore_evas_wayland_egl.c rename to src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c index 61d0f89e35..033208ed18 100644 --- a/src/lib/ecore_evas/ecore_evas_wayland_egl.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c @@ -1,16 +1,4 @@ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -//#define LOGFNS 1 - -#ifdef LOGFNS -# include -# 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 @@ -18,16 +6,8 @@ # include # include # include -#endif - -#include - -#include "Ecore_Evas.h" - -#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL -# include "ecore_evas_private.h" # include -# include + /* 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 index 0000000000..35222637b0 --- /dev/null +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h @@ -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 +# define LOGFN(fl, ln, fn) \ + printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn); +#else +# define LOGFN(fl, ln, fn) +#endif + +#include + +#include "ecore_evas_private.h" +#include "Ecore_Evas.h" +#include + +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_ */ diff --git a/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c similarity index 78% rename from src/lib/ecore_evas/ecore_evas_wayland_shm.c rename to src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index 470ac6ddda..36136b15fb 100644 --- a/src/lib/ecore_evas/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -1,33 +1,12 @@ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -//#define LOGFNS 1 - -#ifdef LOGFNS -# include -# 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 # include # include # include # include # include -#endif - -#include - -#include "Ecore_Evas.h" - -#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM -# include "ecore_evas_private.h" -# include -# include /* 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 diff --git a/src/lib/ecore_evas/ecore_evas_win32.c b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c similarity index 95% rename from src/lib/ecore_evas/ecore_evas_win32.c rename to src/modules/ecore_evas/engines/win32/ecore_evas_win32.c index 4a2eff7f4f..6f45062e92 100644 --- a/src/lib/ecore_evas/ecore_evas_win32.c +++ b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c @@ -6,17 +6,29 @@ #include #include "ecore_private.h" -#ifdef BUILD_ECORE_EVAS_WIN32 -# define WIN32_LEAN_AND_MEAN -# include -# undef WIN32_LEAN_AND_MEAN -# include -# include -#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 +#undef WIN32_LEAN_AND_MEAN + +#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI +# include +#ndif +#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW +# include +#endif +#ifdef BUILD_ECORE_EVAS_DIRECT3D +# include +#endif +#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW +# include +#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; +} diff --git a/src/lib/ecore_evas/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c 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 ec8e923aec..5e44413382 100644 --- a/src/lib/ecore_evas/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -2,16 +2,35 @@ # include #endif +#include "ecore_evas_private.h" +#include "Ecore_Evas.h" + #include #include #include #include -#include "ecore_evas_private.h" -#include "Ecore_Evas.h" +#include +#include + +#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11 +# include +#endif + +#ifdef BUILD_ECORE_EVAS_OPENGL_X11 +# include +#endif + +#ifdef HAVE_ECORE_X_XCB +# include +#endif + +#ifdef HAVE_ECORE_X_XLIB +# include +# include +#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) +static 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) -{ - return 0; -} -#endif + Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data; -/** - * @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) + return edata->direct_resize; +} + +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) -{ - return 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) +EAPI Ecore_Evas * +ecore_evas_gl_x11_new_internal(const char *disp_name, Ecore_X_Window parent, + int x, int y, int w, int h) +{ + return ecore_evas_gl_x11_options_new_internal(disp_name, parent, x, y, w, h, NULL); +} + +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) +static void +_ecore_evas_gl_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; } -#else -EAPI void -ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee EINA_UNUSED, Eina_Bool on EINA_UNUSED) -{ -} -#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) +static 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) -{ - return 0; -} -#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */ + Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data; -/** - * @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) + return edata->direct_resize; +} + +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; -#endif + 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