Hi,

        Follow an attached patch that software_sdl as an engine for EWL. This 
patch 
work as long as you don't create more than one window as the engine didn't 
give you this possibility (should be the same for framebuffer engine).

        This make ewl_test segv when you test menu, popup and stuff that create 
new 
window.

Cedric
diff -Nrau -X exclude.cvs e17-clean/libs/ewl/configure.in e17-dev/libs/ewl/configure.in
--- e17-clean/libs/ewl/configure.in	2007-09-28 14:34:09.000000000 +0200
+++ e17-dev/libs/ewl/configure.in	2007-09-27 18:38:58.000000000 +0200
@@ -89,6 +89,24 @@
 fi
 AM_CONDITIONAL(EWL_ENABLE_EVAS_SOFTWARE_X11, test "x$have_software_x11" = xyes)
 
+AC_ARG_ENABLE(software-sdl,
+	[AC_HELP_STRING([--enable-software-sdl],[enable software SDL support])],
+	[enable_software_sdl=$enableval], [enable_software_sdl="auto"])
+have_software_sdl=no
+if test "x$enable_software_sdl" != "xno" ; then
+	AC_CHECK_HEADER(Evas_Engine_SDL.h,
+		[AC_CHECK_HEADER(Ecore_Sdl.h,
+			[have_software_sdl=yes],
+			[], [#include <Ecore.h>])],
+		[], [#include <Evas.h>])
+	if test "x$have_software_sdl" = "xyes" ; then
+		AC_DEFINE(ENABLE_EWL_SOFTWARE_SDL, 1, [Enable SDL Software])
+	elif test "x$enable_software_sdl" = "xyes" ; then
+		AC_MSG_ERROR(software SDL requested but no evas/ecore support found)
+	fi
+fi
+AM_CONDITIONAL(EWL_ENABLE_EVAS_SOFTWARE_SDL, test "x$have_software_sdl" = xyes)
+
 AC_ARG_ENABLE(software-16-x11,
 	[AC_HELP_STRING([--enable-software-16-x11],[enable software X11 support])],
 	[enable_software_16_x11=$enableval], [enable_software_16_x11="auto"])
@@ -322,6 +340,7 @@
 src/engines/x11/Makefile
 src/engines/evas/Makefile
 src/engines/evas_software_x11/Makefile
+src/engines/evas_software_sdl/Makefile
 src/engines/evas_software_16_x11/Makefile
 src/engines/evas_xrender_x11/Makefile
 src/engines/evas_gl_x11/Makefile
@@ -353,6 +372,7 @@
 echo "  OpenGL X11...............................: $have_opengl_x11" 
 echo "  XRender X11..............................: $have_xrender_x11"
 echo "  Framebuffer..............................: $have_fbcon"
+echo "  SDL......................................: $have_software_sdl"
 echo "  Buffer...................................: $have_buffer"
 echo
 echo "Optional Components:"
diff -Nrau -X exclude.cvs e17-clean/libs/ewl/src/engines/evas_software_sdl/ewl_engine_evas_software_sdl.c e17-dev/libs/ewl/src/engines/evas_software_sdl/ewl_engine_evas_software_sdl.c
--- e17-clean/libs/ewl/src/engines/evas_software_sdl/ewl_engine_evas_software_sdl.c	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/ewl/src/engines/evas_software_sdl/ewl_engine_evas_software_sdl.c	2007-09-29 15:24:18.000000000 +0200
@@ -0,0 +1,333 @@
+/* vim: set sw=8 ts=8 sts=8 noexpandtab: */
+#include "Ewl_Engine_Evas_Software_SDL.h"
+#include "ewl_macros.h"
+#include "ewl_private.h"
+#include "ewl_debug.h"
+
+static int ewl_ev_sdl_key_down(void *data, int type, void *_ev);
+static int ewl_ev_sdl_key_up(void *data, int type, void *_ev);
+static int ewl_ev_sdl_mouse_down(void *data, int type, void *_ev);
+static int ewl_ev_sdl_mouse_up(void *data, int type, void *_ev);
+static int ewl_ev_sdl_mouse_move(void *data, int type, void *_ev);
+
+static Ecore_Event_Handler *ee_key_down_handler = NULL;
+static Ecore_Event_Handler *ee_key_up_handler = NULL;
+static Ecore_Event_Handler *ee_mouse_move_handler = NULL;
+static Ecore_Event_Handler *ee_mouse_down_handler = NULL;
+static Ecore_Event_Handler *ee_mouse_up_handler = NULL;
+
+static Ecore_Idler              *ewl_event = NULL;
+
+static void ee_canvas_setup(Ewl_Window *win, int debug);
+static int ee_init(Ewl_Engine *engine);
+static void ee_shutdown(Ewl_Engine *engine);
+
+static void *canvas_funcs[EWL_ENGINE_CANVAS_MAX] = 
+	{
+		ee_canvas_setup,
+		NULL, NULL, NULL, NULL
+	};
+
+Ecore_DList *
+ewl_engine_dependancies(void)
+{
+	Ecore_DList *d;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	d = ecore_dlist_new();
+	ecore_dlist_append(d, strdup("evas"));
+
+	DRETURN_PTR(d, DLEVEL_STABLE);
+}
+
+Ewl_Engine *
+ewl_engine_create(int *argc __UNUSED__, char ** argv __UNUSED__)
+{
+	Ewl_Engine_Evas_Software_SDL *engine;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	engine = NEW(Ewl_Engine_Evas_Software_SDL, 1);
+	if (!engine)
+		DRETURN_PTR(NULL, DLEVEL_STABLE);
+
+	if (!ee_init(EWL_ENGINE(engine)))
+	{
+		FREE(engine);
+		DRETURN_PTR(NULL, DLEVEL_STABLE);
+	}
+
+	DRETURN_PTR(EWL_ENGINE(engine), DLEVEL_STABLE);
+}
+
+static int
+_ewl_sdl_event(void *data)
+{
+        ecore_sdl_feed_events();
+
+        return 1;
+}
+
+
+static int
+_ewl_idler_event_setup(void *data __UNUSED__)
+{
+        ewl_event = ecore_timer_add(0.008, _ewl_sdl_event, NULL);
+
+        return 0;
+}
+
+static int
+ee_init(Ewl_Engine *engine)
+{
+	Ewl_Engine_Info *info;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+	DCHECK_PARAM_PTR_RET("engine", engine, TRUE);
+
+	if (ee_key_down_handler)
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	if (!ecore_sdl_init(NULL))
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	ee_key_down_handler = ecore_event_handler_add(
+					ECORE_SDL_EVENT_KEY_DOWN,
+					ewl_ev_sdl_key_down, engine);
+	ee_key_up_handler = ecore_event_handler_add(
+					ECORE_SDL_EVENT_KEY_UP, 
+					ewl_ev_sdl_key_up, engine);
+	ee_mouse_down_handler = ecore_event_handler_add(
+					ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN,
+					ewl_ev_sdl_mouse_down, engine);
+	ee_mouse_up_handler = ecore_event_handler_add(
+					ECORE_SDL_EVENT_MOUSE_BUTTON_UP,
+					ewl_ev_sdl_mouse_up, engine);
+	ee_mouse_move_handler = ecore_event_handler_add(
+					ECORE_SDL_EVENT_MOUSE_MOVE,
+					ewl_ev_sdl_mouse_move, engine);
+
+        if (!ee_key_down_handler || !ee_key_up_handler
+			|| !ee_mouse_down_handler || !ee_mouse_up_handler
+			|| !ee_mouse_move_handler)
+	{
+		ee_shutdown(engine);
+		DRETURN_INT(FALSE, DLEVEL_STABLE);
+	}
+
+	info = NEW(Ewl_Engine_Info, 1);
+	info->shutdown = ee_shutdown;
+	info->hooks.canvas = canvas_funcs;
+
+        engine->functions = info;
+
+	DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+static void
+ee_shutdown(Ewl_Engine *engine)
+{
+	DENTER_FUNCTION(DLEVEL_STABLE);
+	DCHECK_PARAM_PTR("engine", engine);
+
+	if (ee_key_down_handler)
+		ecore_event_handler_del(ee_key_down_handler);
+	ee_key_down_handler = NULL;
+
+	if (ee_key_up_handler)
+		ecore_event_handler_del(ee_key_up_handler);
+	ee_key_up_handler = NULL;
+
+	if (ee_mouse_down_handler)
+		ecore_event_handler_del(ee_mouse_down_handler);
+	ee_mouse_down_handler = NULL;
+
+	if (ee_mouse_up_handler)
+		ecore_event_handler_del(ee_mouse_up_handler);
+	ee_mouse_up_handler = NULL;
+
+	if (ee_mouse_move_handler)
+		ecore_event_handler_del(ee_mouse_move_handler);
+	ee_mouse_move_handler = NULL;
+
+        ecore_timer_del(ewl_event);
+	ecore_sdl_shutdown();
+
+	IF_FREE(engine->functions);
+
+	DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static void
+ee_canvas_setup(Ewl_Window *win, int debug __UNUSED__)
+{
+	Evas *evas;
+	Evas_Engine_Info *info = NULL;
+	Evas_Engine_Info_SDL *sdlinfo;
+	Ewl_Object *o;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+	DCHECK_PARAM_PTR("win", win);
+	DCHECK_TYPE("win", win, EWL_WINDOW_TYPE);
+
+	evas = evas_new();
+	evas_output_method_set(evas, evas_render_method_lookup("software_sdl"));
+
+	info = evas_engine_info_get(evas);
+	if (!info)
+	{
+		fprintf(stderr, "Unable to use evas_software_sdl engine for rendering, ");
+		exit(-1);
+	}
+
+	win->window = sdlinfo = (Evas_Engine_Info_SDL *)info;
+
+        sdlinfo->info.fullscreen = 0;
+        sdlinfo->info.hwsurface = 1;
+        sdlinfo->info.noframe = 0;
+        sdlinfo->info.alpha = 1;
+	evas_engine_info_set(evas, (Evas_Engine_Info *)sdlinfo);
+	ewl_object_geometry_request(EWL_OBJECT(win), 0, 0, 240, 320);
+
+	o = EWL_OBJECT(win);
+	evas_engine_info_set(evas, info);
+	evas_output_size_set(evas, ewl_object_current_w_get(o),
+					ewl_object_current_h_get(o));
+	evas_output_viewport_set(evas, ewl_object_current_x_get(o),
+					ewl_object_current_y_get(o),
+					ewl_object_current_w_get(o),
+					ewl_object_current_h_get(o));
+
+        ecore_idler_add(_ewl_idler_event_setup, NULL);
+
+	ewl_embed_canvas_set(EWL_EMBED(win), evas, win->window);
+
+	EWL_ENGINE_EVAS_SOFTWARE_SDL(EWL_EMBED(win)->engine)->window = win;
+
+	DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static int
+ewl_ev_sdl_key_down(void *data, int type __UNUSED__, void *e)
+{
+	Ewl_Embed *embed;
+	Ewl_Engine_Evas_Software_SDL *engine;
+	Ecore_Sdl_Event_Key_Down *ev;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	ev = e;
+	engine = data;
+
+	embed = EWL_EMBED(engine->window);
+	if (!embed)
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	ewl_embed_key_down_feed(embed, ev->keyname, ewl_ev_modifiers_get());
+
+	DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+static int
+ewl_ev_sdl_key_up(void *data, int type __UNUSED__, void *e)
+{
+	Ewl_Embed *embed;
+	Ewl_Engine_Evas_Software_SDL *engine;
+	Ecore_Sdl_Event_Key_Up *ev;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	ev = e;
+	engine = data;
+
+	embed = EWL_EMBED(engine->window);
+	if (!embed)
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	ewl_embed_key_down_feed(embed, ev->keyname, ewl_ev_modifiers_get());
+
+	DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+static int
+ewl_ev_sdl_mouse_down(void *data, int type __UNUSED__, void *e)
+{
+	int clicks = 1;
+	Ewl_Embed *embed;
+	Ewl_Engine_Evas_Software_SDL *engine;
+	Ecore_Sdl_Event_Mouse_Button_Down *ev;
+	unsigned int key_modifiers;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	ev = e;
+	engine = data;
+
+	embed = EWL_EMBED(engine->window);
+	if (!embed)
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	if (ev->double_click)
+		clicks = 2;
+	if (ev->triple_click)
+		clicks = 3;
+
+	key_modifiers = ewl_ev_modifiers_get();
+
+	/* Feed a mouse move, since they don't occur prior to mouse down on a
+	 * touchscreen */
+	ewl_embed_mouse_move_feed(embed, ev->x, ev->y, key_modifiers);
+
+	ewl_embed_mouse_down_feed(embed, ev->button, clicks, ev->x, ev->y,
+				  key_modifiers);
+
+	DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+static int
+ewl_ev_sdl_mouse_up(void *data, int type __UNUSED__, void *e)
+{
+	Ewl_Embed *embed;
+	Ewl_Engine_Evas_Software_SDL *engine;
+	Ecore_Sdl_Event_Mouse_Button_Up *ev;
+	unsigned int key_modifiers;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	ev = e;
+	engine = data;
+
+	embed = EWL_EMBED(engine->window);
+	if (!embed)
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	key_modifiers = ewl_ev_modifiers_get();
+	ewl_embed_mouse_move_feed(embed, ev->x, ev->y, key_modifiers);
+	ewl_embed_mouse_up_feed(embed, ev->button, ev->x, ev->y, key_modifiers);
+
+	DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+static int
+ewl_ev_sdl_mouse_move(void *data, int type __UNUSED__, void *e)
+{
+	Ewl_Embed *embed;
+	Ewl_Engine_Evas_Software_SDL *engine;
+	Ecore_Sdl_Event_Mouse_Move *ev;
+
+	DENTER_FUNCTION(DLEVEL_STABLE);
+
+	ev = e;
+	engine = data;
+
+	embed = EWL_EMBED(engine->window);
+	if (!embed)
+		DRETURN_INT(TRUE, DLEVEL_STABLE);
+
+	ewl_embed_mouse_move_feed(embed, ev->x, ev->y,
+					ewl_ev_modifiers_get());
+
+	DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
diff -Nrau -X exclude.cvs e17-clean/libs/ewl/src/engines/evas_software_sdl/Ewl_Engine_Evas_Software_SDL.h e17-dev/libs/ewl/src/engines/evas_software_sdl/Ewl_Engine_Evas_Software_SDL.h
--- e17-clean/libs/ewl/src/engines/evas_software_sdl/Ewl_Engine_Evas_Software_SDL.h	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/ewl/src/engines/evas_software_sdl/Ewl_Engine_Evas_Software_SDL.h	2007-09-27 14:32:21.000000000 +0200
@@ -0,0 +1,23 @@
+/* vim: set sw=8 ts=8 sts=8 noexpandtab: */
+#ifndef EWL_ENGINE_EVAS_SOFTWARE_SDL_H
+#define EWL_ENGINE_EVAS_SOFTWARE_SDL_H
+
+#include "ewl_base.h"
+#include <Ecore_Sdl.h>
+#include <Evas.h>
+#include <Evas_Engine_SDL.h>
+
+#define EWL_ENGINE_EVAS_SOFTWARE_SDL(engine) \
+		((Ewl_Engine_Evas_Software_SDL *)engine)
+
+typedef struct Ewl_Engine_Evas_Software_SDL Ewl_Engine_Evas_Software_SDL;
+struct Ewl_Engine_Evas_Software_SDL
+{
+	Ewl_Engine engine;
+
+	/* There can be only one window in fb land */
+	Ewl_Window *window; 
+};
+
+#endif
+
diff -Nrau -X exclude.cvs e17-clean/libs/ewl/src/engines/evas_software_sdl/Makefile.am e17-dev/libs/ewl/src/engines/evas_software_sdl/Makefile.am
--- e17-clean/libs/ewl/src/engines/evas_software_sdl/Makefile.am	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/ewl/src/engines/evas_software_sdl/Makefile.am	2007-09-27 18:24:01.000000000 +0200
@@ -0,0 +1,28 @@
+MAINTAINERCLEANFILES = Makefile Makefile.in
+
+AUTOMAKE_OPTIONS = 1.4 foreign
+
+INCLUDES = -I$(top_srcdir)/src/lib \
+		-I$(top_builddir)/src/lib \
+		-I$(top_srcdir)/src/engines/evas_software_sdl \
+		-I$(top_builddir)/src/engines/evas_software_sdl \
+		@ECORE_CFLAGS@
+
+pkgdir = $(libdir)/ewl/engines
+
+if EWL_ENABLE_EVAS_SOFTWARE_SDL
+
+pkg_LTLIBRARIES = evas_software_sdl.la
+
+evas_software_sdl_la_SOURCES = \
+	Ewl_Engine_Evas_Software_SDL.h \
+	ewl_engine_evas_software_sdl.c
+
+evas_software_sdl_la_LIBADD = $(top_builddir)/src/lib/libewl.la
+evas_software_sdl_la_LDFLAGS = -module -version-info @INTERFACE_CURRENT@:@INTERFACE_REVISION@:@INTERFACE_AGE@ \
+		-L$(top_builddir)/src/lib \
+		-L$(top_builddir)/src/lib/.libs
+evas_software_sdl_la_DEPENDENCIES =
+
+endif
+
diff -Nrau -X exclude.cvs e17-clean/libs/ewl/src/engines/Makefile.am e17-dev/libs/ewl/src/engines/Makefile.am
--- e17-clean/libs/ewl/src/engines/Makefile.am	2007-07-04 15:00:24.000000000 +0200
+++ e17-dev/libs/ewl/src/engines/Makefile.am	2007-09-27 18:24:17.000000000 +0200
@@ -1,4 +1,5 @@
 MAINTAINERCLEANFILES = Makefile Makefile.in
 
 SUBDIRS = x11 evas evas_software_x11 evas_software_16_x11 evas_xrender_x11 \
-	evas_gl_x11 evas_fb evas_buffer
+	evas_gl_x11 evas_fb evas_buffer evas_software_sdl
+
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to