Hi,

        Follow a patch that use my previous Etk Engine to provide a generic 
engine 
for Ecore engine that don't support multiple window (like FB and SDL). It 
suffer the same bugs of the original Etk SDL engine. So it something in Etk 
or the way I use Etk.
        The only "hack" I don't really like in this patch, is the need to call 
engine_init a second time with feedback from the sub engine. But it work !

Cedric
diff -Nrua -X exclude.cvs e17-clean/libs/etk/configure.in e17-dev/libs/etk/configure.in
--- e17-clean/libs/etk/configure.in	2007-10-15 11:21:59.000000000 +0200
+++ e17-dev/libs/etk/configure.in	2007-10-19 16:55:00.000000000 +0200
@@ -112,6 +112,19 @@
 AM_CONDITIONAL(BUILD_ENGINE_EE_S_X11, test "x$have_ecore_x" = "xyes")
 
 #####################################################################
+## Ecore_SDL
+PKG_CHECK_MODULES(ECORE_SDL, [ecore-sdl >= 0.9.9], [
+    have_ecore_sdl=yes
+    AC_DEFINE(HAVE_ECORE_SDL, 1, [Define to 1 if you have the Ecore_SDL headers and libraries])
+    requirements="$requirements ecore-sdl"
+  ], [
+    have_ecore_sdl=no
+    AC_DEFINE(HAVE_ECORE_SDL, 0, [Define to 1 if you have the Ecore_SDL headers and libraries])
+])
+
+AM_CONDITIONAL(BUILD_ENGINE_EE_S_SDL, test "x$have_ecore_sdl" = "xyes")
+
+#####################################################################
 ## Ecore_FB
 PKG_CHECK_MODULES(ECORE_FB, [ecore-fb >= 0.9.9], [
     have_ecore_fb=yes
@@ -143,6 +156,11 @@
 fi
 
 AM_CONDITIONAL(BUILD_ENGINE_E_FB, test "x$have_ecore_fb" = "xyes")
+AM_CONDITIONAL(BUILD_ENGINE_EE_S_FB, test "x$have_ecore_fb" = "xyes")
+
+#####################################################################
+## Generic support for software windows system using Etk_Mdi_Window
+AM_CONDITIONAL(BUILD_ENGINE_EE_ETK_WINDOWS, test "x$have_ecore_sdl" = "xyes" -o "x$have_ecore_fb" = "xyes")
 
 #####################################################################
 ## Gettext
@@ -169,10 +187,13 @@
 src/lib/Makefile
 src/engines/Makefile
 src/engines/ecore_evas/Makefile
+src/engines/ecore_evas_etk_windows/Makefile
 src/engines/ecore_evas_x11/Makefile
 src/engines/ecore_evas_software_x11/Makefile
 src/engines/ecore_evas_software_x11_16/Makefile
 src/engines/ecore_evas_gl_x11/Makefile
+src/engines/ecore_evas_software_sdl/Makefile
+src/engines/ecore_evas_software_fb/Makefile
 src/engines/ecore_fb/Makefile
 src/bin/Makefile
 src/tools/Makefile
@@ -242,6 +263,7 @@
 echo "Configuration Options Summary:"
 echo
 echo "  Ecore Evas Software X11 Engine..............: $have_ecore_x"
+echo "  Ecore SDL Engine............................: $have_ecore_sdl"
 echo "  Ecore FB Engine.............................: $have_ecore_fb"
 echo "  Ecore FB Engine X11 Support.................: $have_ecore_fb_x11_support"
 echo
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_etk_windows/ecore_evas_etk_windows.c e17-dev/libs/etk/src/engines/ecore_evas_etk_windows/ecore_evas_etk_windows.c
--- e17-clean/libs/etk/src/engines/ecore_evas_etk_windows/ecore_evas_etk_windows.c	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_etk_windows/ecore_evas_etk_windows.c	2007-10-19 16:22:22.000000000 +0200
@@ -0,0 +1,722 @@
+#include <assert.h>
+#include <sys/param.h>
+#include <string.h>
+#include <stdlib.h>
+#include <Ecore_Evas.h>
+#include <Ecore_Sdl.h>
+#include <Ecore_File.h>
+#include <Edje.h>
+#include <Etk.h>
+
+#include "config.h"
+
+#include "Ecore_Evas_Etk_Windows.h"
+
+static void             (*_event_callback)(Etk_Event_Type event, Etk_Event_Global event_info) = NULL;
+static char             *_theme_find(const char *theme_name);
+
+static Etk_Bool          _engine_init(void);
+static void              _engine_shutdown(void);
+
+static void              _generic_window_constructor(Etk_Window *window);
+static void              _generic_window_destructor(Etk_Window *window);
+static void              _generic_window_show(Etk_Window *window);
+static void              _generic_window_hide(Etk_Window *window);
+static Evas             *_generic_window_evas_get(Etk_Window *window);
+static void              _generic_window_title_set(Etk_Window *window, const char *title);
+static const char       *_generic_window_title_get(Etk_Window *window);
+
+static void              _generic_window_move(Etk_Window *window, int x, int y);
+static void              _generic_window_resize(Etk_Window *window, int w, int h);
+static void              _generic_window_size_min_set(Etk_Window *window, int w, int h);
+static void              _generic_window_evas_position_get(Etk_Window *window, int *x, int *y);
+static void              _generic_window_screen_position_get(Etk_Window *window, int *x, int *y);
+static void              _generic_window_size_get(Etk_Window *window, int *w, int *h);
+static void              _generic_window_screen_geometry_get(Etk_Window *window, int *x, int *y, int *w, int *h);
+
+static void              _generic_window_maximized_set(Etk_Window *window, Etk_Bool maximized);
+static Etk_Bool          _generic_window_maximized_get(Etk_Window *window);
+
+static void              _generic_window_raise(Etk_Window *window);
+static void              _generic_window_lower(Etk_Window *window);
+
+static void              _generic_window_focused_set(Etk_Window *window, Etk_Bool focused);
+static Etk_Bool          _generic_window_focused_get(Etk_Window *window);
+static void              _generic_window_decorated_set(Etk_Window *window, Etk_Bool decorated);
+static Etk_Bool          _generic_window_decorated_get(Etk_Window *window);
+
+static void              _generic_window_pointer_set(Etk_Window *window, Etk_Pointer_Type pointer_type);
+
+static void              _generic_event_callback_set(void (*callback)(Etk_Event_Type event, Etk_Event_Global event_info));
+
+static void              _generic_mouse_position_get(int *x, int *y);
+static void              _generic_mouse_screen_geometry_get(int *x, int *y, int *w, int *h);
+
+static Ecore_Evas       *_generic_ecore_evas = NULL;
+static Evas             *_generic_evas = NULL;
+
+static Etk_Widget       *_generic_root_window = NULL;
+static Etk_Widget       *_generic_mdi_area = NULL;
+
+static Evas_Object      *_generic_background = NULL;
+static Evas_Object      *_generic_mouse_pointer = NULL;
+
+#define DEFAULT_WIDTH 1024
+#define DEFAULT_HEIGHT 768
+
+static char             *_wm_theme_file = NULL;
+
+struct _Etk_Engine_Window_Info
+{
+  struct
+  {
+    int w;
+    int h;
+  } min;
+
+  struct
+  {
+    int w;
+    int h;
+  } current;
+};
+typedef struct _Etk_Engine_Window_Info  Etk_Engine_Window_Info;
+
+static Etk_Engine engine_info = {
+  NULL, /* engine specific data */
+  NULL, /* engine name */
+  NULL, /* super (parent) engine */
+  NULL, /* DL handle */
+
+  _engine_init,
+  _engine_shutdown,
+
+  _generic_window_constructor,
+  _generic_window_destructor,
+  _generic_window_show,
+  _generic_window_hide,
+  _generic_window_evas_get,
+  _generic_window_title_set,
+  _generic_window_title_get,
+
+  NULL, /* window_wmclass_set */
+
+  _generic_window_move,
+  _generic_window_resize,
+  _generic_window_size_min_set,
+  _generic_window_evas_position_get,
+  _generic_window_screen_position_get,
+  _generic_window_size_get,
+  _generic_window_screen_geometry_get,
+
+  NULL, /* window_modal_for_window */
+  NULL, /* window_iconified_set */
+  NULL, /* window_iconified_get */
+
+  _generic_window_maximized_set,
+  _generic_window_maximized_get,
+
+  NULL, /* window_fullscreen_set */
+  NULL, /* window_fullscreen_get */
+
+  _generic_window_raise,
+  _generic_window_lower,
+
+  NULL, /* window_stacking_set */
+  NULL, /* window_stacking_get */
+  NULL, /* window_sticky_set */
+  NULL, /* window_sticky_get */
+
+  _generic_window_focused_set,
+  _generic_window_focused_get,
+  _generic_window_decorated_set,
+  _generic_window_decorated_get,
+
+  NULL, /* window_shaped_set */
+  NULL, /* window_shaped_get */
+  NULL, /* window_has_alpha_set */
+  NULL, /* window_has_alpha_get */     
+  NULL, /* window_skip_taskbar_hint_set */
+  NULL, /* window_skip_taskbar_hint_get */
+  NULL, /* window_skip_pager_hint_set */
+  NULL, /* window_skip_pager_hint_get */
+
+  _generic_window_pointer_set,
+
+  NULL, /* popup_window_constructor */
+  NULL, /* popup_window_popup */
+  NULL, /* popup_window_popdown */
+
+  _generic_event_callback_set,
+
+  NULL, /* event_timestamp_get */
+
+  _generic_mouse_position_get,
+  _generic_mouse_screen_geometry_get,
+
+  NULL, /* selection_text_set */
+  NULL, /* selection_text_request */
+  NULL, /* selection_clear */
+
+  NULL, /* drag_constructor */
+  NULL, /* drag_begin */
+};
+
+/* Called when the engine is loaded */
+Etk_Engine*
+engine_open(void)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data;
+   char *_width_arg = NULL;
+   char *_height_arg = NULL;
+
+   _wm_theme_file = _theme_find(etk_config_wm_theme_get());
+   if (!_wm_theme_file)
+   {
+      /* fallback to default theme */
+      _wm_theme_file = _theme_find("default");
+      if (!_wm_theme_file)
+      {
+         return NULL;
+      }
+   }
+
+   engine_info.engine_name = strdup("ecore_evas_etk_windows");
+   engine_data = malloc(sizeof (Ecore_Evas_Etk_Windows_Engine));
+   if (engine_data == NULL)
+     {
+        ETK_WARNING("Unable to init engine data.");
+        return NULL;
+     }
+   engine_info.engine_data = engine_data;
+
+   engine_data->ee = NULL;
+   engine_data->w = DEFAULT_WIDTH;
+   engine_data->h = DEFAULT_HEIGHT;
+
+   /* Parse the arguments */
+   etk_argument_value_get("width", 0, ETK_TRUE, &_width_arg);
+   if (_width_arg)
+     {
+        engine_data->w = (int) strtol(_width_arg, (char **) NULL, 10);
+        if (engine_data->w <= 0)
+          engine_data->w = DEFAULT_WIDTH;
+     }
+
+   etk_argument_value_get("height", 0, ETK_TRUE, &_height_arg);
+   if (_height_arg)
+     {
+        engine_data->h = (int) strtol(_height_arg, (char **) NULL, 10);
+        if (engine_data->h <= 0)
+          engine_data->h = DEFAULT_HEIGHT;
+     }
+
+   return &engine_info;
+}
+
+/* Called when the engine is unloaded */
+void
+engine_close(void)
+{
+   free(engine_info.engine_name);
+   free(_wm_theme_file);
+}
+
+/* On ecore_evas window resize */
+static void
+_generic_root_window_resize_cb(Ecore_Evas *ecore_evas)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data;
+   Evas_Object *obj;
+
+   if (!ecore_evas)
+     return;
+
+   engine_data = engine_info.engine_data;
+
+   ecore_evas_geometry_get(_generic_ecore_evas, NULL, NULL, &engine_data->w, &engine_data->h);
+   obj = etk_embed_object_get(ETK_EMBED(_generic_root_window));
+   evas_object_resize(obj, engine_data->w, engine_data->h);
+   evas_object_resize(_generic_background, engine_data->w, engine_data->h);
+}
+
+/* Initializes the engine */
+static Etk_Bool
+_engine_init(void)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data = engine_info.engine_data;
+
+   assert(engine_info.engine_data != NULL);
+
+   /* If not yet initialised, we are waiting the sub engine to do it and call us again. */
+   if (engine_data->ee == NULL)
+     return ETK_TRUE;
+
+   _generic_ecore_evas = engine_data->ee;
+   _generic_evas = ecore_evas_get(_generic_ecore_evas);
+   if (!_generic_evas)
+     {
+        ETK_WARNING("Unable to create an Evas surface.");
+        return ETK_FALSE;
+     }
+
+   ecore_evas_show(_generic_ecore_evas);
+
+   /* Create the root window. */
+   _generic_root_window = etk_embed_new(_generic_evas);
+   _generic_root_window_resize_cb(_generic_ecore_evas);
+
+   ecore_evas_callback_resize_set(_generic_ecore_evas, _generic_root_window_resize_cb);
+   ecore_evas_callback_delete_request_set(_generic_ecore_evas, ecore_evas_hide);
+
+   /* Create the background. */
+   _generic_background = edje_object_add(_generic_evas);
+   edje_object_file_set(_generic_background, _wm_theme_file, "etk/wm_background");
+   evas_object_move(_generic_background, 0, 0);
+   evas_object_resize(_generic_background, engine_data->w, engine_data->h);
+   evas_object_show(_generic_background);
+
+   /* Create the mdi area. */
+   _generic_mdi_area = etk_mdi_area_new();
+   etk_container_add(ETK_CONTAINER(_generic_root_window), _generic_mdi_area);
+
+   /* Setup default pointer. */
+   _generic_window_pointer_set(NULL, ETK_POINTER_DEFAULT);
+
+   /* Show all widget. */
+   etk_widget_show_all(ETK_WIDGET(_generic_root_window));
+
+   return ETK_TRUE;
+}
+
+/* Shutdowns the engine */
+static void
+_engine_shutdown(void)
+{
+   _generic_ecore_evas = NULL;
+}
+
+static void
+_generic_window_constructor(Etk_Window *window)
+{
+   Etk_Engine_Window_Info       *info;
+   Etk_Widget                   *widget;
+
+   widget = etk_mdi_window_new();
+
+   window->engine_data = widget;
+
+   info = calloc(1, sizeof (Etk_Engine_Window_Info));
+
+   etk_object_data_set(ETK_OBJECT(window), "etk_engine_window_info", info);
+   etk_container_add(ETK_CONTAINER(_generic_mdi_area), widget);
+   etk_mdi_window_decorated_set(ETK_MDI_WINDOW(widget), ETK_TRUE);
+
+   ETK_TOPLEVEL(window)->evas = _generic_evas;
+}
+
+static void
+_generic_window_destructor(Etk_Window *window)
+{
+   Etk_Object   *obj;
+   void         *info;
+
+   obj = window->engine_data;
+
+   if (!obj)
+     return ;
+
+   info = etk_object_data_get(ETK_OBJECT(window), "etk_engine_window_info");
+   if (info)
+     free(info);
+   etk_object_data_set(ETK_OBJECT(window), "etk_engine_window_info", NULL);
+
+   etk_mdi_window_delete_request(ETK_MDI_WINDOW(obj));
+}
+
+static void
+_generic_window_show(Etk_Window *window)
+{
+   Etk_Widget   *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_show(widget);
+}
+
+static void
+_generic_window_hide(Etk_Window *window)
+{
+   Etk_Widget   *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_hide(widget);
+}
+
+static Evas*
+_generic_window_evas_get(Etk_Window *window)
+{
+   return _generic_evas;
+}
+
+static void
+_generic_window_title_set(Etk_Window *window, const char *title)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     etk_mdi_window_title_set(mdi, title);
+}
+
+static const char*
+_generic_window_title_get(Etk_Window *window)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     return etk_mdi_window_title_get(mdi);
+   else
+     return NULL;
+}
+
+static void
+_generic_window_move(Etk_Window *window, int x, int y)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     etk_mdi_window_move(mdi, x, y);
+}
+
+static void
+_generic_window_resize(Etk_Window *window, int w, int h)
+{
+   Etk_Engine_Window_Info       *info;
+   Etk_Widget                   *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     {
+        info = etk_object_data_get(ETK_OBJECT(window), "etk_engine_window_info");
+
+        info->current.w = ETK_MAX(info->min.w, w);
+        info->current.h = ETK_MAX(info->min.h, h);
+
+        fprintf(stderr, "[ %i, %i ] => [ %i, %i ]\n", info->min.w, info->min.h, w, h);
+
+        evas_object_resize(widget->smart_object, info->current.w, info->current.h);
+
+
+        etk_widget_size_request_set(widget, info->current.w, info->current.h);
+     }
+}
+
+static void
+_generic_window_size_min_set(Etk_Window *window, int w, int h)
+{
+   Etk_Engine_Window_Info       *info;
+   Etk_Widget                   *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     {
+        info = etk_object_data_get(ETK_OBJECT(window), "etk_engine_window_info");
+
+        if (info)
+          {
+             info->min.w = w;
+             info->min.h = h;
+          }
+        _generic_window_resize(window, info->current.w, info->current.h);
+     }
+}
+
+static void
+_generic_window_evas_position_get(Etk_Window *window, int *x, int *y)
+{
+   Etk_Widget           *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_geometry_get(widget, x, y, NULL, NULL);
+}
+
+static void
+_generic_window_screen_position_get(Etk_Window *window, int *x, int *y)
+{
+   Etk_Widget           *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_geometry_get(widget, x, y, NULL, NULL);
+   else
+     {
+        if (x) *x = 0;
+        if (y) *y = 0;
+     }
+}
+
+static void
+_generic_window_size_get(Etk_Window *window, int *w, int *h)
+{
+   Etk_Engine_Window_Info       *info;
+   Etk_Widget                   *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     {
+        info = etk_object_data_get(ETK_OBJECT(window), "etk_engine_window_info");
+
+        if (info)
+          {
+             if (w) *w = info->current.w;
+             if (h) *h = info->current.h;
+          }
+     }
+   else
+     {
+        Ecore_Evas_Etk_Windows_Engine *engine_data = engine_info.engine_data;
+
+        if (w) *w = engine_data->w;
+        if (h) *h = engine_data->h;
+     }
+}
+
+static void
+_generic_window_screen_geometry_get(Etk_Window *window, int *x, int *y, int *w, int *h)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data = engine_info.engine_data;
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = engine_data->w;
+   if (h) *h = engine_data->h;
+}
+
+static void
+_generic_window_maximized_set(Etk_Window *window, Etk_Bool maximized)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     etk_mdi_window_maximized_set(mdi, maximized);
+}
+
+static Etk_Bool
+_generic_window_maximized_get(Etk_Window *window)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     return etk_mdi_window_maximized_get(mdi);
+   return ETK_FALSE;
+}
+
+static void
+_generic_window_raise(Etk_Window *window)
+{
+   Etk_Widget           *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_raise(widget);
+}
+
+static void
+_generic_window_lower(Etk_Window *window)
+{
+   Etk_Widget           *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_lower(widget);
+}
+
+static void
+_generic_window_focused_set(Etk_Window *window, Etk_Bool focused)
+{
+   Etk_Widget           *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     etk_widget_focus(widget);
+}
+
+static Etk_Bool
+_generic_window_focused_get(Etk_Window *window)
+{
+   Etk_Widget           *widget;
+
+   widget = window->engine_data;
+
+   if (widget)
+     return etk_widget_is_focused(widget);
+   return ETK_FALSE;
+}
+
+static void
+_generic_window_decorated_set(Etk_Window *window, Etk_Bool decorated)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     etk_mdi_window_decorated_set(mdi, decorated);
+}
+
+static Etk_Bool
+_generic_window_decorated_get(Etk_Window *window)
+{
+   Etk_Mdi_Window       *mdi;
+
+   mdi = window->engine_data;
+
+   if (mdi)
+     return etk_mdi_window_decorated_get(mdi);
+   return ETK_FALSE;
+}
+
+static void
+_generic_window_pointer_set(Etk_Window *window, Etk_Pointer_Type pointer_type)
+{
+   const char   *group;
+   int           w, h;
+
+   if (_generic_mouse_pointer)
+     evas_object_del(_generic_mouse_pointer);
+
+   fprintf(stderr, "pointer_type: %i\n", pointer_type);
+
+   switch (pointer_type)
+   {
+      case ETK_POINTER_DND_DROP:
+         group = "etk/wm_pointer_dnd_drop";
+         break;
+      case ETK_POINTER_MOVE:
+         group = "etk/wm_pointer_dnd_move";
+         break;
+      case ETK_POINTER_H_DOUBLE_ARROW:
+         group = "etk/wm_pointer_h_double_arrow";
+         break;
+      case ETK_POINTER_V_DOUBLE_ARROW:
+         group = "etk/wm_pointer_v_double_arrow";
+         break;
+      case ETK_POINTER_RESIZE:
+         group = "etk/wm_pointer_resize";
+         break;
+      case ETK_POINTER_RESIZE_TL:
+         group = "etk/wm_pointer_resize_tl";
+         break;
+      case ETK_POINTER_RESIZE_T:
+         group = "etk/wm_pointer_resize_t";
+         break;
+      case ETK_POINTER_RESIZE_TR:
+         group = "etk/wm_pointer_resize_tr";
+         break;
+      case ETK_POINTER_RESIZE_R:
+         group = "etk/wm_pointer_resize_r";
+         break;
+      case ETK_POINTER_RESIZE_BR:
+         group = "etk/wm_pointer_resize_br";
+         break;
+      case ETK_POINTER_RESIZE_B:
+         group = "etk/wm_pointer_resize_b";
+         break;
+      case ETK_POINTER_RESIZE_BL:
+         group = "etk/wm_pointer_resize_bl";
+         break;
+      case ETK_POINTER_RESIZE_L:
+         group = "etk/wm_pointer_resize_l";
+         break;
+      case ETK_POINTER_TEXT_EDIT:
+         group = "etk/wm_pointer_text_edit";
+         break;
+      case ETK_POINTER_DEFAULT:
+      default:
+         group = "etk/wm_pointer_default";
+         break;
+   }
+
+   _generic_mouse_pointer = edje_object_add(_generic_evas);
+   if (edje_file_group_exists(_wm_theme_file, group))
+     edje_object_file_set(_generic_mouse_pointer, _wm_theme_file, group);
+   else
+     edje_object_file_set(_generic_mouse_pointer, _wm_theme_file, "etk/wm_pointer_default");
+
+   evas_object_pass_events_set(_generic_mouse_pointer, 1);
+   edje_object_size_min_get(_generic_mouse_pointer, &w, &h);
+   evas_object_resize(_generic_mouse_pointer, w, h);
+
+   fprintf(stderr, "cursor: %s\n", group);
+
+   ecore_evas_object_cursor_set(_generic_ecore_evas, _generic_mouse_pointer, 10000, 0, 0);
+}
+
+static void
+_generic_event_callback_set(void (*callback)(Etk_Event_Type event, Etk_Event_Global event_info))
+{
+   _event_callback = callback;
+}
+
+static void
+_generic_mouse_position_get(int *x, int *y)
+{
+   evas_object_geometry_get(_generic_mouse_pointer, x, y, NULL, NULL);
+}
+
+static void
+_generic_mouse_screen_geometry_get(int *x, int *y, int *w, int *h)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data = engine_info.engine_data;
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = engine_data->w;
+   if (h) *h = engine_data->h;
+}
+
+/* Finds the theme called "theme_name" in the subdir wm and returns its path, or NULL on failure */
+static char
+*_theme_find(const char *theme_name)
+{
+   char *home;
+   char  path[PATH_MAX];
+
+   if (!theme_name)
+      return NULL;
+
+   if ((home = getenv("HOME")))
+   {
+      snprintf(path, PATH_MAX, "%s/.e/etk/wm/%s.edj", home, theme_name);
+      if (ecore_file_exists(path))
+         return strdup(path);
+   }
+
+   snprintf(path, PATH_MAX, PACKAGE_DATA_DIR "/wm/%s.edj", theme_name);
+   if (ecore_file_exists(path))
+      return strdup(path);
+
+   return NULL;
+}
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_etk_windows/Ecore_Evas_Etk_Windows.h e17-dev/libs/etk/src/engines/ecore_evas_etk_windows/Ecore_Evas_Etk_Windows.h
--- e17-clean/libs/etk/src/engines/ecore_evas_etk_windows/Ecore_Evas_Etk_Windows.h	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_etk_windows/Ecore_Evas_Etk_Windows.h	2007-10-19 15:49:03.000000000 +0200
@@ -0,0 +1,12 @@
+#ifndef         _ECORE_EVAS_ETK_WINDOWS_H
+# define        _ECORE_EVAS_ETK_WINDOWS_H
+
+struct _Ecore_Evas_Etk_Windows_Engine
+{
+  Ecore_Evas    *ee;
+  int            w;
+  int            h;
+};
+typedef struct _Ecore_Evas_Etk_Windows_Engine   Ecore_Evas_Etk_Windows_Engine;
+
+#endif          /*_ECORE_EVAS_ETK_WINDOWS_H */
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_etk_windows/Makefile.am e17-dev/libs/etk/src/engines/ecore_evas_etk_windows/Makefile.am
--- e17-clean/libs/etk/src/engines/ecore_evas_etk_windows/Makefile.am	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_etk_windows/Makefile.am	2007-10-19 12:02:20.000000000 +0200
@@ -0,0 +1,25 @@
+MAINTAINERCLEANFILES = Makefile Makefile.in
+
+AUTOMAKE_OPTIONS = 1.4 foreign
+
+INCLUDES = -I$(top_srcdir)/src/lib \
+	   -I$(top_srcdir)/src/engines/ecore_evas \
+	   -I$(top_srcdir)/src/engines/ecore_evas_etk_windows \
+	   @EVAS_CFLAGS@ @ECORE_CFLAGS@ -g -Wall
+
+pkgdir = $(libdir)/etk/engines
+
+if BUILD_ENGINE_EE_ETK_WINDOWS
+
+pkg_LTLIBRARIES = ecore_evas_etk_windows.la
+
+ecore_evas_etk_windows_la_SOURCES = \
+	ecore_evas_etk_windows.c
+
+ecore_evas_etk_windows_la_LIBADD = $(top_builddir)/src/lib/libetk.la
+ecore_evas_etk_windows_la_LDFLAGS = -module -avoid-version \
+				     -L$(top_builddir)/src/lib \
+		                     -L$(top_builddir)/src/lib/.libs
+ecore_evas_etk_windows_la_DEPENDENCIES =
+
+endif
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_software_fb/ecore_evas_software_fb.c e17-dev/libs/etk/src/engines/ecore_evas_software_fb/ecore_evas_software_fb.c
--- e17-clean/libs/etk/src/engines/ecore_evas_software_fb/ecore_evas_software_fb.c	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_software_fb/ecore_evas_software_fb.c	2007-10-19 17:00:47.000000000 +0200
@@ -0,0 +1,240 @@
+#include <assert.h>
+#include <sys/param.h>
+#include <string.h>
+#include <stdlib.h>
+#include <Evas.h>
+#include <Ecore_Evas.h>
+#include <Ecore_File.h>
+#include <Edje.h>
+#include <Etk.h>
+#include <Ecore_Fb.h>
+#include <Ecore_File.h>
+#if ENGINE_E_FB_X11_SUPPORT
+#include <Ecore_X.h>
+#endif
+#include <Etk.h>
+
+#include "config.h"
+
+#include "Ecore_Evas_Etk_Windows.h"
+
+static Etk_Bool _use_x11 = ETK_FALSE;
+
+static Etk_Bool          _engine_init(void);
+static void              _engine_shutdown(void);
+
+static Etk_Engine engine_info = {
+  NULL, /* engine specific data */
+  NULL, /* engine name */
+  NULL, /* super (parent) engine */
+  NULL, /* DL handle */
+
+  _engine_init,
+  _engine_shutdown,
+
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+
+  NULL, /* window_wmclass_set */
+
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+
+  NULL, /* window_modal_for_window */
+  NULL, /* window_iconified_set */
+  NULL, /* window_iconified_get */
+
+  NULL,
+  NULL,
+
+  NULL, /* window_fullscreen_set */
+  NULL, /* window_fullscreen_get */
+
+  NULL,
+  NULL,
+
+  NULL, /* window_stacking_set */
+  NULL, /* window_stacking_get */
+  NULL, /* window_sticky_set */
+  NULL, /* window_sticky_get */
+
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+
+  NULL, /* window_shaped_set */
+  NULL, /* window_shaped_get */
+  NULL, /* window_has_alpha_set */
+  NULL, /* window_has_alpha_get */     
+  NULL, /* window_skip_taskbar_hint_set */
+  NULL, /* window_skip_taskbar_hint_get */
+  NULL, /* window_skip_pager_hint_set */
+  NULL, /* window_skip_pager_hint_get */
+
+  NULL,
+
+  NULL, /* popup_window_constructor */
+  NULL, /* popup_window_popup */
+  NULL, /* popup_window_popdown */
+
+  NULL,
+
+  NULL, /* event_timestamp_get */
+
+  NULL,
+  NULL,
+
+  NULL, /* selection_text_set */
+  NULL, /* selection_text_request */
+  NULL, /* selection_clear */
+
+  NULL, /* drag_constructor */
+  NULL, /* drag_begin */
+};
+
+static char     *_x11_engine = NULL;
+
+/* Called when the engine is loaded */
+Etk_Engine*
+engine_open(void)
+{
+   char *use_x11_arg = NULL;
+
+   engine_info.engine_data = NULL;
+   engine_info.engine_name = strdup("ecore_software_fb");
+   if (etk_engine_inherit_from(&engine_info, "ecore_evas_etk_windows") == ETK_FALSE)
+     return NULL;
+
+#if ENGINE_E_FB_X11_SUPPORT
+   etk_argument_value_get("ecore-evas-software-fb-x11-engine", 0, ETK_TRUE, &_x11_engine);
+   if (!_x11_engine)
+     _x11_engine = strdup("ecore_evas_software_x11");
+
+   etk_argument_value_get("ecore-evas-software-fb-use-x11", 0, ETK_TRUE, &use_x11_arg);
+   if (use_x11_arg)
+     _use_x11 = ETK_TRUE;
+#endif
+
+   return &engine_info;
+}
+
+/* Called when the engine is unloaded */
+void
+engine_close(void)
+{
+   free(engine_info.engine_name);
+}
+
+/* Initializes the engine */
+static Etk_Bool
+_engine_init(void)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data;
+
+#if ENGINE_E_FB_X11_SUPPORT
+   if (_use_x11)
+     {
+        if (!ecore_x_init(NULL))
+          {
+             ETK_WARNING("Ecore_X initialization failed!");
+             return ETK_FALSE;
+          }
+     }
+   else
+#endif
+     {
+        if (!ecore_fb_init(NULL))
+          {
+             ETK_WARNING("Ecore_FB initialization failed!");
+             return ETK_FALSE;
+          }
+     }
+
+   if (!ecore_evas_init())
+     {
+        ETK_WARNING("Ecore_Evas initialization failed!");
+        return ETK_FALSE;
+     }
+
+   engine_data = engine_info.super->engine_data;
+   assert(engine_data != NULL);
+
+   /* Create the evas where all the windows will be drawn */
+#if ENGINE_E_FB_X11_SUPPORT
+   if (_use_x11)
+     {
+        static const struct {
+          const char    *name;
+          Ecore_Evas    *(*func)(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
+        } x11_engines_list[] = {
+          { "ecore_evas_software_x11", ecore_evas_software_x11_new },
+          { "ecore_evas_gl_x11", ecore_evas_gl_x11_new },
+          { "ecore_evas_xrender_x11", ecore_evas_xrender_x11_new },
+          { "ecore_evas_software_x11_16", ecore_evas_software_x11_16_new },
+          { NULL, ecore_evas_software_x11_16_new },
+        };
+        unsigned int    i;
+
+        for (i = 0; x11_engines_list[i].name != NULL; ++i)
+          if (strcmp(x11_engines_list[i].name, _x11_engine) == 0)
+            {
+               engine_data->ee = x11_engines_list[i].func(NULL, 0, 0, 0, engine_data->w, engine_data->h);
+               break ;
+            }
+
+        if (engine_data->ee == NULL)
+          engine_data->ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, engine_data->w, engine_data->h);
+     }
+   else
+#endif
+     {
+        ecore_fb_size_get(&engine_data->w, &engine_data->h);
+
+        /* Create the evas where all the windows will be drawn */
+        engine_data->ee = ecore_evas_fb_new(NULL, 0, engine_data->w, engine_data->h);
+     }
+
+   if (engine_data->ee == NULL)
+     {
+        ETK_WARNING("Unable to create an Ecore_Evas");
+        return ETK_FALSE;
+     }
+
+   return engine_info.super->engine_init();
+}
+
+/* Shutdowns the engine */
+static void
+_engine_shutdown(void)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data;
+
+   engine_info.super->engine_shutdown();
+
+   engine_data = engine_info.super->engine_data;
+   ecore_evas_free(engine_data->ee);
+   engine_info.super->engine_data = NULL;
+
+   ecore_evas_shutdown();
+#if ENGINE_E_FB_X11_SUPPORT
+   if (_use_x11)
+     {
+        ecore_x_shutdown();
+     }
+   else
+#endif
+     {
+        ecore_fb_shutdown();
+     }
+}
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_software_fb/Makefile.am e17-dev/libs/etk/src/engines/ecore_evas_software_fb/Makefile.am
--- e17-clean/libs/etk/src/engines/ecore_evas_software_fb/Makefile.am	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_software_fb/Makefile.am	2007-10-19 16:24:38.000000000 +0200
@@ -0,0 +1,25 @@
+MAINTAINERCLEANFILES = Makefile Makefile.in
+
+AUTOMAKE_OPTIONS = 1.4 foreign
+
+INCLUDES = -I$(top_srcdir)/src/lib \
+	   -I$(top_srcdir)/src/engines/ecore_evas_etk_windows \
+	   -I$(top_srcdir)/src/engines/ecore_evas_software_fb \
+	   @EVAS_CFLAGS@ @ECORE_CFLAGS@ @ECORE_FB_CFLAGS@ -g -Wall
+
+pkgdir = $(libdir)/etk/engines
+
+if BUILD_ENGINE_EE_S_FB
+
+pkg_LTLIBRARIES = ecore_evas_software_fb.la
+
+ecore_evas_software_fb_la_SOURCES = \
+	ecore_evas_software_fb.c
+
+ecore_evas_software_fb_la_LIBADD = $(top_builddir)/src/lib/libetk.la
+ecore_evas_software_fb_la_LDFLAGS = -module -avoid-version \
+				     -L$(top_builddir)/src/lib \
+		                     -L$(top_builddir)/src/lib/.libs
+ecore_evas_software_fb_la_DEPENDENCIES =
+
+endif
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_software_sdl/ecore_evas_software_sdl.c e17-dev/libs/etk/src/engines/ecore_evas_software_sdl/ecore_evas_software_sdl.c
--- e17-clean/libs/etk/src/engines/ecore_evas_software_sdl/ecore_evas_software_sdl.c	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_software_sdl/ecore_evas_software_sdl.c	2007-10-19 16:41:59.000000000 +0200
@@ -0,0 +1,161 @@
+#include <assert.h>
+#include <sys/param.h>
+#include <string.h>
+#include <stdlib.h>
+#include <Ecore_Evas.h>
+#include <Ecore_Sdl.h>
+#include <Ecore_File.h>
+#include <Edje.h>
+#include <Etk.h>
+
+#include "config.h"
+
+#include "Ecore_Evas_Etk_Windows.h"
+
+static Etk_Bool          _engine_init(void);
+static void              _engine_shutdown(void);
+
+static Etk_Engine engine_info = {
+  NULL, /* engine specific data */
+  NULL, /* engine name */
+  NULL, /* super (parent) engine */
+  NULL, /* DL handle */
+
+  _engine_init,
+  _engine_shutdown,
+
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+
+  NULL, /* window_wmclass_set */
+
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+
+  NULL, /* window_modal_for_window */
+  NULL, /* window_iconified_set */
+  NULL, /* window_iconified_get */
+
+  NULL,
+  NULL,
+
+  NULL, /* window_fullscreen_set */
+  NULL, /* window_fullscreen_get */
+
+  NULL,
+  NULL,
+
+  NULL, /* window_stacking_set */
+  NULL, /* window_stacking_get */
+  NULL, /* window_sticky_set */
+  NULL, /* window_sticky_get */
+
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+
+  NULL, /* window_shaped_set */
+  NULL, /* window_shaped_get */
+  NULL, /* window_has_alpha_set */
+  NULL, /* window_has_alpha_get */     
+  NULL, /* window_skip_taskbar_hint_set */
+  NULL, /* window_skip_taskbar_hint_get */
+  NULL, /* window_skip_pager_hint_set */
+  NULL, /* window_skip_pager_hint_get */
+
+  NULL,
+
+  NULL, /* popup_window_constructor */
+  NULL, /* popup_window_popup */
+  NULL, /* popup_window_popdown */
+
+  NULL,
+
+  NULL, /* event_timestamp_get */
+
+  NULL,
+  NULL,
+
+  NULL, /* selection_text_set */
+  NULL, /* selection_text_request */
+  NULL, /* selection_clear */
+
+  NULL, /* drag_constructor */
+  NULL, /* drag_begin */
+};
+
+/* Called when the engine is loaded */
+Etk_Engine*
+engine_open(void)
+{
+   engine_info.engine_data = NULL;
+   engine_info.engine_name = strdup("ecore_software_sdl");
+   if (etk_engine_inherit_from(&engine_info, "ecore_evas_etk_windows") == ETK_FALSE)
+     return NULL;
+   return &engine_info;
+}
+
+/* Called when the engine is unloaded */
+void
+engine_close(void)
+{
+   free(engine_info.engine_name);
+}
+
+/* Initializes the engine */
+static Etk_Bool
+_engine_init(void)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data;
+
+   if (!ecore_sdl_init(NULL))
+     {
+        ETK_WARNING("Ecore_SDL initialization failed!");
+        return ETK_FALSE;
+     }
+   if (!ecore_evas_init())
+     {
+        ETK_WARNING("Ecore_Evas initialization failed!");
+        return ETK_FALSE;
+     }
+
+   engine_data = engine_info.super->engine_data;
+
+   assert(engine_data != NULL);
+
+   engine_data->ee = ecore_evas_sdl_new(NULL, engine_data->w, engine_data->h, 0, 1, 0, 1);
+   if (engine_data->ee == NULL)
+     {
+        ETK_WARNING("Unable to create a SDL Ecore_Evas");
+        return ETK_FALSE;
+     }
+
+   return engine_info.super->engine_init();
+}
+
+/* Shutdowns the engine */
+static void
+_engine_shutdown(void)
+{
+   Ecore_Evas_Etk_Windows_Engine *engine_data;
+
+   engine_info.super->engine_shutdown();
+
+   engine_data = engine_info.super->engine_data;
+   ecore_evas_free(engine_data->ee);
+   engine_info.super->engine_data = NULL;
+
+   ecore_evas_shutdown();
+   ecore_sdl_shutdown();
+}
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/ecore_evas_software_sdl/Makefile.am e17-dev/libs/etk/src/engines/ecore_evas_software_sdl/Makefile.am
--- e17-clean/libs/etk/src/engines/ecore_evas_software_sdl/Makefile.am	1970-01-01 01:00:00.000000000 +0100
+++ e17-dev/libs/etk/src/engines/ecore_evas_software_sdl/Makefile.am	2007-10-19 15:59:25.000000000 +0200
@@ -0,0 +1,25 @@
+MAINTAINERCLEANFILES = Makefile Makefile.in
+
+AUTOMAKE_OPTIONS = 1.4 foreign
+
+INCLUDES = -I$(top_srcdir)/src/lib \
+	   -I$(top_srcdir)/src/engines/ecore_evas_etk_windows \
+	   -I$(top_srcdir)/src/engines/ecore_evas_software_sdl \
+	   @EVAS_CFLAGS@ @ECORE_CFLAGS@ @ECORE_SDL_CFLAGS@ -g -Wall
+
+pkgdir = $(libdir)/etk/engines
+
+if BUILD_ENGINE_EE_S_SDL
+
+pkg_LTLIBRARIES = ecore_evas_software_sdl.la
+
+ecore_evas_software_sdl_la_SOURCES = \
+	ecore_evas_software_sdl.c
+
+ecore_evas_software_sdl_la_LIBADD = $(top_builddir)/src/lib/libetk.la
+ecore_evas_software_sdl_la_LDFLAGS = -module -avoid-version \
+				     -L$(top_builddir)/src/lib \
+		                     -L$(top_builddir)/src/lib/.libs
+ecore_evas_software_sdl_la_DEPENDENCIES =
+
+endif
diff -Nrua -X exclude.cvs e17-clean/libs/etk/src/engines/Makefile.am e17-dev/libs/etk/src/engines/Makefile.am
--- e17-clean/libs/etk/src/engines/Makefile.am	2007-07-04 15:00:23.000000000 +0200
+++ e17-dev/libs/etk/src/engines/Makefile.am	2007-10-19 16:49:25.000000000 +0200
@@ -1,8 +1,11 @@
 MAINTAINERCLEANFILES = Makefile Makefile.in
 
 SUBDIRS = ecore_evas \
+	  ecore_evas_etk_windows \
           ecore_evas_x11 \
 	  ecore_evas_software_x11 \
 	  ecore_evas_software_x11_16 \
 	  ecore_evas_gl_x11 \
+	  ecore_evas_software_sdl \
+	  ecore_evas_software_fb \
           ecore_fb
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to