[Pkg-e-commits] [SCM] Core abstraction layer for enlightenment DR 0.17 branch, upstream-vcs, updated. fbccf3b6cae3945e0db311041de91f346fccbae1

doursse doursse at alioth.debian.org
Mon Jun 9 12:44:09 UTC 2008


The following commit has been merged in the upstream-vcs branch:
commit 761abae5f765028c915d180d1ffed221b878165d
Author: doursse <doursse>
Date:   Sat May 31 05:05:00 2008 +0000

    add Ecore Windows CE module

diff --git a/configure.in b/configure.in
index d24db48..c5b5693 100644
--- a/configure.in
+++ b/configure.in
@@ -48,6 +48,7 @@ requirements_ecore_job=""
 requirements_ecore_txt=""
 requirements_ecore_x=""
 requirements_ecore_win32=""
+requirements_ecore_wince=""
 requirements_ecore_sdl=""
 
 dnl The first call to PKG_CHECK_MODULES is done conditionally,
@@ -76,8 +77,9 @@ case "$host_os" in
 		AC_DEFINE(HAVE_SYS_MMAN_H, 1, [Define to 1 if you have the <sys/mman.h> header file.])
 		AC_DEFINE(HAVE_SYS_TIME_H, 1, [Define to 1 if you have the <sys/time.h> header file.])
                 if test "$host_os" = "cegcc" ; then
+			AC_DEFINE(EFL_ECORE_WINCE_BUILD, 1, [Define to mention that ecore WinCE is built.])
                         WIN32_CFLAGS="-mwin32"
-                        WIN32_LIBS="-lws2"
+                        WIN32_LIBS="-lws2 -laygshell"
 			lt_enable_auto_import="-Wl,--enable-auto-import"
                 else
                         WIN32_LIBS="-lws2_32"
@@ -555,6 +557,40 @@ if test "x${have_ecore_win32}" = "xyes" -a "x${have_direct3d}" = "xyes"; then
   AC_DEFINE(BUILD_ECORE_EVAS_DIRECT3D, 1, [Support for Direct3D Engine in Ecore_Evas])
 fi
 
+ECORE_CHECK_MODULE([WinCE], [no])
+
+if test "x$have_ecore_wince" = "xyes"; then
+  requirements_ecore_evas="$requirements_ecore_evas ecore-wince"
+fi
+
+dnl ecore_evas_wince
+have_ecore_evas_software_16_wince="no"
+if test "x$have_ecore_software_16_wince" = "xyes" -a "x$have_ecore_evas" = "xyes"; then
+  want_ecore_evas_wince=yes
+  AC_ARG_ENABLE(ecore-evas-software-16-wince,
+    AC_HELP_STRING(
+      [--enable-ecore-evas-software-16-wince],
+      [enable WinCE support in the ecore_evas module.]
+    ),
+    [ want_ecore_evas_wince=$enableval ]
+  )
+  AC_MSG_CHECKING(whether ecore_evas WinCE support is to be built)
+  AC_MSG_RESULT($want_ecore_evas_wince)
+
+  if test "x$want_ecore_evas_wince" = "xyes"; then
+    PKG_CHECK_MODULES(EVAS_SOFTWARE_16_WINCE, evas-software-16-wince, [
+        AC_DEFINE(BUILD_ECORE_EVAS_SOFTWARE_16_WINCE, 1, [Support for WinCE Engine in Ecore_Evas])
+        have_ecore_evas_software_16_wince="yes";
+    ], [
+        have_ecore_evas_software_16_wince="no";
+    ])
+  fi
+
+  if test "x$have_ecore_evas_software_16_wince" = "xyes"; then
+    requirements_ecore_evas="$requirements_ecore_evas ecore-wince"
+  fi
+fi
+
 dnl ecore_dfb
 PKG_CHECK_MODULES(DIRECTFB, directfb >= 0.9.16,
   [ have_directfb="yes" ],
@@ -818,6 +854,7 @@ ecore-txt.pc
 ecore-x.pc
 ecore-win32.pc
 ecore-sdl.pc
+ecore-wince.pc
 ecore.pc
 src/Makefile
 src/bin/Makefile
@@ -838,6 +875,7 @@ src/lib/ecore_file/Makefile
 src/lib/ecore_desktop/Makefile
 src/lib/ecore_directfb/Makefile
 src/lib/ecore_win32/Makefile
+src/lib/ecore_wince/Makefile
 README
 ecore.spec
 ])
@@ -865,6 +903,7 @@ echo "  Ecore_Evas XRender Support...: $have_ecore_evas_xrender"
 echo "  Ecore_Evas X11 16bpp Support.: $have_ecore_evas_x11_16"
 
 echo "  Ecore_Win32..................: $have_ecore_win32 (DirectDraw: ${have_ddraw}) (16bpp DirectDraw: ${have_ddraw_16}) (Direct3D: ${have_direct3d}) (OpenGL Glew: ${have_opengl_glew})"
+echo "  Ecore_WinCE..................: $have_ecore_wince"
 echo "  Ecore_DFB....................: $have_ecore_directfb"
 echo "  Ecore_Evas DFB Support.......: $have_ecore_evas_dfb"
 echo "  Ecore_FB.....................: $have_ecore_fb"
@@ -872,6 +911,7 @@ echo "  Ecore_Evas FB Support........: $have_ecore_evas_fb"
 echo "  Ecore_SDL....................: $have_ecore_sdl"
 echo "  Ecore_Evas SDL Support.......: $have_ecore_evas_sdl"
 echo "  Ecore_Evas Buffer Support....: $have_ecore_evas_buffer"
+echo "  Ecore_Evas WinCE Support.....: $have_ecore_evas_wince"
 
 echo "  Ecore_File...................: $have_ecore_file (Inotify: $have_inotify) (Poll: $have_poll) (CURL: $have_curl)"
 echo "  Ecore_Desktop................: $have_ecore_desktop"
diff --git a/ecore-imf.pc.in b/ecore-wince.pc.in
similarity index 51%
copy from ecore-imf.pc.in
copy to ecore-wince.pc.in
index 7a98b8c..a8275f8 100644
--- a/ecore-imf.pc.in
+++ b/ecore-wince.pc.in
@@ -3,9 +3,9 @@ exec_prefix=@exec_prefix@
 libdir=@libdir@
 includedir=@includedir@
 
-Name: ecore-imf
-Description: E core library, IMF module
-Requires: ecore
+Name: ecore-wince
+Description: E core library, WinCE module
 Version: @VERSION@
-Libs: -L${libdir} -lecore_imf
+Libs: -L${libdir} -lecore_wince
+Libs.private: @WIN32_LIBS@
 Cflags: -I${includedir}
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 61dfbef..67efd6c 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -8,6 +8,7 @@ ecore_directfb \
 ecore_con \
 ecore_x \
 ecore_win32 \
+ecore_wince \
 ecore_sdl \
 ecore_ipc \
 ecore_evas \
diff --git a/src/lib/ecore_wince/Ecore_WinCE.h b/src/lib/ecore_wince/Ecore_WinCE.h
new file mode 100644
index 0000000..87bdcae
--- /dev/null
+++ b/src/lib/ecore_wince/Ecore_WinCE.h
@@ -0,0 +1,169 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef __ECORE_WINCE_H__
+#define __ECORE_WINCE_H__
+
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WINCE
+# ifdef EFL_ECORE_WINCE_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_ECORE_WINCE_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WINCE */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef void Ecore_WinCE_Window;
+
+
+/* Events */
+
+typedef struct _Ecore_WinCE_Event_Key_Down              Ecore_WinCE_Event_Key_Down;
+typedef struct _Ecore_WinCE_Event_Key_Up                Ecore_WinCE_Event_Key_Up;
+typedef struct _Ecore_WinCE_Event_Window_Focus_In       Ecore_WinCE_Event_Window_Focus_In;
+typedef struct _Ecore_WinCE_Event_Window_Focus_Out      Ecore_WinCE_Event_Window_Focus_Out;
+typedef struct _Ecore_WinCE_Event_Window_Damage         Ecore_WinCE_Event_Window_Damage;
+typedef struct _Ecore_WinCE_Event_Window_Create         Ecore_WinCE_Event_Window_Create;
+typedef struct _Ecore_WinCE_Event_Window_Destroy        Ecore_WinCE_Event_Window_Destroy;
+typedef struct _Ecore_WinCE_Event_Window_Hide           Ecore_WinCE_Event_Window_Hide;
+typedef struct _Ecore_WinCE_Event_Window_Show           Ecore_WinCE_Event_Window_Show;
+typedef struct _Ecore_WinCE_Event_Window_Delete_Request Ecore_WinCE_Event_Window_Delete_Request;
+
+struct _Ecore_WinCE_Event_Key_Down
+{
+   Ecore_WinCE_Window *window;
+   char               *keyname;
+   char               *keysymbol;
+   char               *keycompose;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Key_Up
+{
+   Ecore_WinCE_Window *window;
+   char               *keyname;
+   char               *keysymbol;
+   char               *keycompose;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Focus_In
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Focus_Out
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Damage
+{
+   Ecore_WinCE_Window *window;
+   int                 x;
+   int                 y;
+   int                 width;
+   int                 height;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Create
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Destroy
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Hide
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Show
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+struct _Ecore_WinCE_Event_Window_Delete_Request
+{
+   Ecore_WinCE_Window *window;
+   double              time;
+};
+
+
+EAPI extern int ECORE_WINCE_EVENT_KEY_DOWN;
+EAPI extern int ECORE_WINCE_EVENT_KEY_UP;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_DAMAGE;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_CREATE;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_DESTROY;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_HIDE;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_SHOW;
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST;
+
+
+/* Core */
+
+EAPI int    ecore_wince_init();
+EAPI int    ecore_wince_shutdown();
+EAPI double ecore_wince_current_time_get(void);
+EAPI void   ecore_wince_message_loop_begin (void);
+
+/* Window */
+
+EAPI Ecore_WinCE_Window *ecore_wince_window_new(Ecore_WinCE_Window *parent,
+                                                int                 x,
+                                                int                 y,
+                                                int                 width,
+                                                int                 height);
+
+EAPI void ecore_wince_window_del(Ecore_WinCE_Window *window);
+
+EAPI void ecore_wince_window_show(Ecore_WinCE_Window *window);
+
+EAPI void ecore_wince_window_hide(Ecore_WinCE_Window *window);
+
+EAPI void ecore_wince_window_suspend_set(Ecore_WinCE_Window *window, int (*suspend)(void));
+
+EAPI void ecore_wince_window_resume_set(Ecore_WinCE_Window *window, int (*resume)(void));
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ECORE_WINCE_H__ */
diff --git a/src/lib/ecore_wince/Makefile.am b/src/lib/ecore_wince/Makefile.am
new file mode 100644
index 0000000..d5f3499
--- /dev/null
+++ b/src/lib/ecore_wince/Makefile.am
@@ -0,0 +1,31 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+
+if BUILD_ECORE_WINCE
+
+lib_LTLIBRARIES = libecore_wince.la
+
+include_HEADERS = \
+Ecore_WinCE.h
+
+libecore_wince_la_SOURCES = \
+ecore_wince.c \
+ecore_wince_event.c \
+ecore_wince_window.c
+
+libecore_wince_la_LIBADD = \
+ at WIN32_LIBS@ \
+$(top_builddir)/src/lib/ecore/libecore.la
+
+libecore_wince_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+
+endif
+
+EXTRA_DIST = \
+ecore_wince_private.h
diff --git a/src/lib/ecore_wince/ecore_wince.c b/src/lib/ecore_wince/ecore_wince.c
new file mode 100644
index 0000000..5b6dbb6
--- /dev/null
+++ b/src/lib/ecore_wince/ecore_wince.c
@@ -0,0 +1,217 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <stdlib.h>
+#include <stdio.h>   /* for printf */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+#include "Ecore.h"
+#include "Ecore_WinCE.h"
+#include "ecore_wince_private.h"
+
+
+/***** Global declarations *****/
+
+double              _ecore_wince_event_last_time = 0.0;
+
+HINSTANCE _ecore_wince_instance = NULL;
+
+EAPI int ECORE_WINCE_EVENT_KEY_DOWN              = 0;
+EAPI int ECORE_WINCE_EVENT_KEY_UP                = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_DAMAGE         = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_CREATE         = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_DESTROY        = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_SHOW           = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_HIDE           = 0;
+EAPI int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = 0;
+
+
+/***** Private declarations *****/
+
+static int       _ecore_wince_init_count = 0;
+
+
+LRESULT CALLBACK _ecore_wince_window_procedure(HWND   window,
+                                               UINT   message,
+                                               WPARAM window_param,
+                                               LPARAM data_param);
+
+
+/***** API *****/
+
+int
+ecore_wince_init()
+{
+   WNDCLASS wc;
+
+   if (_ecore_wince_init_count > 0)
+     {
+	_ecore_wince_init_count++;
+	return _ecore_wince_init_count;
+     }
+
+   _ecore_wince_instance = GetModuleHandle(NULL);
+   if (!_ecore_wince_instance)
+     return 0;
+
+   memset (&wc, 0, sizeof (wc));
+   wc.style = CS_HREDRAW | CS_VREDRAW;
+   wc.lpfnWndProc = _ecore_wince_window_procedure;
+   wc.cbClsExtra = 0;
+   wc.cbWndExtra = 0;
+   wc.hInstance = _ecore_wince_instance;
+   wc.hIcon = NULL;
+   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
+   wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
+   wc.lpszMenuName =  NULL;
+   wc.lpszClassName = ECORE_WINCE_WINDOW_CLASS;
+
+   if(!RegisterClass(&wc))
+     {
+        FreeLibrary(_ecore_wince_instance);
+        return 0;
+     }
+
+   if (!ECORE_WINCE_EVENT_KEY_DOWN)
+     {
+        ECORE_WINCE_EVENT_KEY_DOWN              = ecore_event_type_new();
+        ECORE_WINCE_EVENT_KEY_UP                = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_DAMAGE         = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_CREATE         = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_DESTROY        = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_SHOW           = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_HIDE           = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
+     }
+
+   _ecore_wince_init_count++;
+
+   return _ecore_wince_init_count;
+}
+
+int
+ecore_wince_shutdown()
+{
+   _ecore_wince_init_count++;
+   if (_ecore_wince_init_count > 0) return _ecore_wince_init_count;
+   if (!_ecore_wince_instance) return _ecore_wince_init_count;
+
+   UnregisterClass(ECORE_WINCE_WINDOW_CLASS, _ecore_wince_instance);
+   FreeLibrary(_ecore_wince_instance);
+   _ecore_wince_instance = NULL;
+
+   if (_ecore_wince_init_count < 0) _ecore_wince_init_count = 0;
+
+   return _ecore_wince_init_count;
+}
+
+
+/***** Private functions definitions *****/
+
+LRESULT CALLBACK
+_ecore_wince_window_procedure(HWND   window,
+                              UINT   message,
+                              WPARAM window_param,
+                              LPARAM data_param)
+{
+   Ecore_WinCE_Callback_Data *data;
+   POINTS                     pt;
+   DWORD                      coord;
+
+   data = (Ecore_WinCE_Callback_Data *)malloc(sizeof(Ecore_WinCE_Callback_Data));
+   if (!data) return DefWindowProc(window, message, window_param, data_param);
+
+   data->window = window;
+   data->message = message;
+   data->window_param = window_param;
+   data->data_param = data_param;
+   data->time = GetTickCount();
+   coord = GetMessagePos();
+   pt = MAKEPOINTS(coord);
+   data->x = pt.x;
+   data->y = pt.y;
+
+   switch (data->message)
+     {
+       /* Keyboard input notifications */
+     case WM_HOTKEY:
+       printf (" * ecore message : keystroke down (hotkey)\n");
+       _ecore_wince_event_handle_key_press(data);
+       return 0;
+     case WM_KEYDOWN:
+       printf (" * ecore message : keystroke down\n");
+       _ecore_wince_event_handle_key_press(data);
+       return 0;
+     case WM_KEYUP:
+       printf (" * ecore message : keystroke up\n");
+       _ecore_wince_event_handle_key_release(data);
+       return 0;
+     case WM_SETFOCUS:
+       printf (" * ecore message : focus in\n");
+       _ecore_wince_event_handle_focus_in(data);
+       return 0;
+     case WM_KILLFOCUS:
+       printf (" * ecore message : focus out\n");
+       _ecore_wince_event_handle_focus_out(data);
+       return 0;
+       /* Window notifications */
+     case WM_CREATE:
+       {
+         RECT rect;
+         GetClientRect(window, &rect);
+         printf (" *** ecore message : create %ld %ld\n",
+                 rect.right - rect.left, rect.bottom - rect.top);
+       }
+       _ecore_wince_event_handle_create_notify(data);
+       return 0;
+     case WM_DESTROY:
+       printf (" * ecore message : destroy\n");
+       _ecore_wince_event_handle_destroy_notify(data);
+       return 0;
+     case WM_SHOWWINDOW:
+       {
+         RECT rect;
+         GetClientRect(window, &rect);
+         printf (" *** ecore message : show %ld %ld\n",
+                 rect.right - rect.left, rect.bottom - rect.top);
+       }
+       if ((data->data_param == SW_OTHERUNZOOM) ||
+           (data->data_param == SW_OTHERUNZOOM))
+         return 0;
+
+       if (data->window_param)
+         _ecore_wince_event_handle_map_notify(data);
+       else
+         _ecore_wince_event_handle_unmap_notify(data);
+
+       return 0;
+     case WM_CLOSE:
+       printf (" * ecore message : close\n");
+       _ecore_wince_event_handle_delete_request(data);
+       return 0;
+       /* GDI notifications */
+     case WM_PAINT:
+       {
+          RECT rect;
+
+          ValidateRect(window, NULL);
+          if (GetUpdateRect(window, &rect, FALSE))
+            {
+               data->update = rect;
+               _ecore_wince_event_handle_expose(data);
+            }
+          return 0;
+       }
+     default:
+       return DefWindowProc(window, message, window_param, data_param);
+     }
+
+}
diff --git a/src/lib/ecore_wince/ecore_wince_event.c b/src/lib/ecore_wince/ecore_wince_event.c
new file mode 100644
index 0000000..bda26a3
--- /dev/null
+++ b/src/lib/ecore_wince/ecore_wince_event.c
@@ -0,0 +1,597 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <stdlib.h>
+#include <stdio.h>   /* for printf */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+#include "Ecore.h"
+#include "Ecore_WinCE.h"
+#include "ecore_wince_private.h"
+
+
+/***** Private declarations *****/
+
+static void _ecore_wince_event_free_key_down(void *data,
+                                             void *ev);
+
+static void _ecore_wince_event_free_key_up(void *data,
+                                           void *ev);
+
+static int  _ecore_wince_event_keystroke_get(int    key,
+                                             char **keyname,
+                                             char **keysymbol,
+                                             char **keycompose);
+
+static int  _ecore_wince_event_char_get(int    key,
+                                        char **keyname,
+                                        char **keysymbol,
+                                        char **keycompose);
+
+
+/***** Global functions *****/
+
+void
+_ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Key_Down *e;
+
+   e = (Ecore_WinCE_Event_Key_Down *)malloc(sizeof(Ecore_WinCE_Event_Key_Down));
+   if (!e) return;
+
+   if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
+                                         &e->keyname,
+                                         &e->keysymbol,
+                                         &e->keycompose))
+     {
+        free(e);
+        return;
+     }
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+   e->time = (double)msg->time / 1000.0;
+
+   _ecore_wince_event_last_time = e->time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL);
+}
+
+void
+_ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Key_Up *e;
+
+   e = (Ecore_WinCE_Event_Key_Up *)calloc(1, sizeof(Ecore_WinCE_Event_Key_Up));
+   if (!e) return;
+
+   if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
+                                         &e->keyname,
+                                         &e->keysymbol,
+                                         &e->keycompose))
+     {
+        free(e);
+        return;
+     }
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+   e->time = (double)msg->time / 1000.0;
+
+   _ecore_wince_event_last_time = e->time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL);
+}
+
+void
+_ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Focus_In *e;
+   struct _Ecore_WinCE_Window        *window;
+
+   e = (Ecore_WinCE_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_In));
+   if (!e) return;
+
+   window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   if (window->resume)
+     window->resume();
+
+   e->window = window;
+
+   e->time = _ecore_wince_event_last_time;
+   _ecore_wince_event_last_time = e->time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Focus_Out *e;
+   struct _Ecore_WinCE_Window         *window;
+
+   e = (Ecore_WinCE_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_Out));
+   if (!e) return;
+
+   window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+   if (window->suspend)
+     window->suspend();
+
+   e->window = window;
+
+   e->time = _ecore_wince_event_last_time;
+   _ecore_wince_event_last_time = e->time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Damage *e;
+
+   e = (Ecore_WinCE_Event_Window_Damage *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Damage));
+   if (!e) return;
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   e->x = msg->update.left;
+   e->y = msg->update.top;
+   e->width = msg->update.right - msg->update.left;
+   e->height = msg->update.bottom - msg->update.top;
+   printf (" * ecore : event expose %d %d\n", e->width, e->height);
+
+   e->time = _ecore_wince_event_last_time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Create *e;
+
+   e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Create));
+   if (!e) return;
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   e->time = _ecore_wince_event_last_time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_CREATE, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Destroy *e;
+
+   e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Destroy));
+   if (!e) return;
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   e->time = _ecore_wince_event_last_time;
+/*    if (e->window == _ecore_wince_event_last_window) _ecore_wince_event_last_window = NULL; */
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Show *e;
+
+   e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Show));
+   if (!e) return;
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   e->time = _ecore_wince_event_last_time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_SHOW, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Hide *e;
+
+   e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Hide));
+   if (!e) return;
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   e->time = _ecore_wince_event_last_time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_HIDE, e, NULL, NULL);
+}
+
+void
+_ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg)
+{
+   Ecore_WinCE_Event_Window_Delete_Request *e;
+
+   e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Delete_Request));
+   if (!e) return;
+
+   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+
+   e->time = _ecore_wince_event_last_time;
+
+   ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
+}
+
+
+/***** Private functions definitions *****/
+
+static void
+_ecore_wince_event_free_key_down(void *data,
+                                 void *ev)
+{
+   Ecore_WinCE_Event_Key_Down *e;
+
+   e = ev;
+   if (e->keyname) free(e->keyname);
+   if (e->keysymbol) free(e->keysymbol);
+   if (e->keycompose) free(e->keycompose);
+   free(e);
+}
+
+static void
+_ecore_wince_event_free_key_up(void *data,
+                               void *ev)
+{
+   Ecore_WinCE_Event_Key_Up *e;
+
+   e = ev;
+   if (e->keyname) free(e->keyname);
+   if (e->keysymbol) free(e->keysymbol);
+   if (e->keycompose) free(e->keycompose);
+   free(e);
+}
+
+static int
+_ecore_wince_event_keystroke_get(int    key,
+                                 char **keyname,
+                                 char **keysymbol,
+                                 char **keycompose)
+{
+  char *kn;
+  char *ks;
+  char *kc;
+
+  *keyname = NULL;
+  *keysymbol = NULL;
+  *keycompose = NULL;
+
+   switch (key)
+     {
+       /* Keystroke */
+     case VK_PRIOR:
+       kn = "KP_Prior";
+       ks = "KP_Prior";
+       kc = "";
+       break;
+     case VK_NEXT:
+       kn = "KP_Next";
+       ks = "KP_Next";
+       kc = "";
+       break;
+     case VK_END:
+       kn = "KP_End";
+       ks = "KP_End";
+       kc = "";
+       break;
+     case VK_HOME:
+       kn = "KP_Home";
+       ks = "KP_Home";
+       kc = "";
+       break;
+     case VK_LEFT:
+       kn = "KP_Left";
+       ks = "KP_Left";
+       kc = "";
+       break;
+     case VK_UP:
+       kn = "KP_Up";
+       ks = "KP_Up";
+       kc = "";
+       break;
+     case VK_RIGHT:
+       kn = "KP_Right";
+       ks = "KP_Right";
+       kc = "";
+       break;
+     case VK_DOWN:
+       kn = "KP_Down";
+       ks = "KP_Down";
+       kc = "";
+       break;
+     case VK_INSERT:
+       kn = "KP_Insert";
+       ks = "KP_Insert";
+       kc = "";
+       break;
+     case VK_DELETE:
+       kn = "KP_Delete";
+       ks = "KP_Delete";
+       kc = "";
+       break;
+     case VK_F1:
+       kn = "F1";
+       ks = "F1";
+       kc = "";
+       break;
+     case VK_F2:
+       kn = "F2";
+       ks = "F2";
+       kc = "";
+       break;
+     case VK_F3:
+       kn = "F3";
+       ks = "F3";
+       kc = "";
+       break;
+     case VK_F4:
+       kn = "F4";
+       ks = "F4";
+       kc = "";
+       break;
+     case VK_F5:
+       kn = "F5";
+       ks = "F5";
+       kc = "";
+       break;
+     case VK_F6:
+       kn = "F6";
+       ks = "F6";
+       kc = "";
+       break;
+     case VK_F7:
+       kn = "F7";
+       ks = "F7";
+       kc = "";
+       break;
+     case VK_F8:
+       kn = "F8";
+       ks = "F8";
+       kc = "";
+       break;
+     case VK_F9:
+       kn = "F9";
+       ks = "F9";
+       kc = "";
+       break;
+     case VK_F10:
+       kn = "F10";
+       ks = "F10";
+       kc = "";
+       break;
+     case VK_F11:
+       kn = "F11";
+       ks = "F11";
+       kc = "";
+       break;
+     case VK_F12:
+       kn = "F12";
+       ks = "F12";
+       kc = "";
+       break;
+     case VK_F13:
+       kn = "F13";
+       ks = "F13";
+       kc = "";
+       break;
+     case VK_F14:
+       kn = "F14";
+       ks = "F14";
+       kc = "";
+       break;
+     case VK_F15:
+       kn = "F15";
+       ks = "F15";
+       kc = "";
+       break;
+     case VK_F16:
+       kn = "F16";
+       ks = "F16";
+       kc = "";
+       break;
+     case VK_F17:
+       kn = "F17";
+       ks = "F17";
+       kc = "";
+       break;
+     case VK_F18:
+       kn = "F18";
+       ks = "F18";
+       kc = "";
+       break;
+     case VK_F19:
+       kn = "F19";
+       ks = "F19";
+       kc = "";
+       break;
+     case VK_F20:
+       kn = "F20";
+       ks = "F20";
+       kc = "";
+       break;
+     case VK_F21:
+       kn = "F21";
+       ks = "F21";
+       kc = "";
+       break;
+     case VK_F22:
+       kn = "F22";
+       ks = "F22";
+       kc = "";
+       break;
+     case VK_F23:
+       kn = "F23";
+       ks = "F23";
+       kc = "";
+       break;
+     case VK_F24:
+       kn = "F24";
+       ks = "F24";
+       kc = "";
+       break;
+     default:
+       /* other non keystroke characters */
+       return 0;
+     }
+   *keyname = strdup(kn);
+   if (!*keyname) return 0;
+   *keysymbol = strdup(ks);
+   if (!*keysymbol)
+     {
+        free(*keyname);
+        *keyname = NULL;
+        return 0;
+     }
+   *keycompose = strdup(kc);
+   if (!*keycompose)
+     {
+        free(*keyname);
+        free(*keysymbol);
+        *keyname = NULL;
+        *keysymbol = NULL;
+        return 0;
+     }
+
+   return 1;
+}
+
+static int
+_ecore_wince_event_char_get(int    key,
+                            char **keyname,
+                            char **keysymbol,
+                            char **keycompose)
+{
+  char kn[32];
+  char ks[32];
+  char *kc;
+
+  *keyname = NULL;
+  *keysymbol = NULL;
+  *keycompose = NULL;
+
+   switch (key)
+     {
+     case VK_APP3:
+     case VK_BACK:
+       strncpy(kn, "Backspace", 32);
+       strncpy(ks, "Backspace", 32);
+       kc = "";
+       break;
+     case VK_APP4:
+     case VK_TAB:
+       strncpy(kn, "Tab", 32);
+       strncpy(ks, "Tab", 32);
+       kc = "";
+       break;
+     case VK_APP5:
+     case 0x0a:
+       /* Line feed (Shift + Enter) */
+       strncpy(kn, "LineFeed", 32);
+       strncpy(ks, "LineFeed", 32);
+       kc = "";
+       break;
+     case VK_APP2:
+     case VK_RETURN:
+       strncpy(kn, "Return", 32);
+       strncpy(ks, "Return", 32);
+       kc = "";
+       break;
+     case VK_APP1:
+     case VK_ESCAPE:
+       strncpy(kn, "Escape", 32);
+       strncpy(ks, "Escape", 32);
+       kc = "";
+       break;
+     default:
+       /* displayable characters */
+       printf (" * key : %d\n", key);
+       kn[0] = (TCHAR)key;
+       kn[1] = '\0';
+       ks[0] = (TCHAR)key;
+       ks[1] = '\0';
+       kc = "";
+       break;
+     }
+   *keyname = strdup(kn);
+   if (!*keyname) return 0;
+   *keysymbol = strdup(ks);
+   if (!*keysymbol)
+     {
+        free(*keyname);
+        *keyname = NULL;
+        return 0;
+     }
+   *keycompose = strdup(kc);
+   if (!*keycompose)
+     {
+        free(*keyname);
+        free(*keysymbol);
+        *keyname = NULL;
+        *keysymbol = NULL;
+        return 0;
+     }
+
+   return 1;
+}
diff --git a/src/lib/ecore_wince/ecore_wince_private.h b/src/lib/ecore_wince/ecore_wince_private.h
new file mode 100644
index 0000000..2a2a156
--- /dev/null
+++ b/src/lib/ecore_wince/ecore_wince_private.h
@@ -0,0 +1,56 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifndef __ECORE_WINCE_PRIVATE_H__
+#define __ECORE_WINCE_PRIVATE_H__
+
+
+#define ECORE_WINCE_WINDOW_CLASS L"Ecore_WinCE_Window_Class"
+
+
+typedef struct _Ecore_WinCE_Callback_Data Ecore_WinCE_Callback_Data;
+
+struct _Ecore_WinCE_Callback_Data
+{
+   RECT         update;
+   HWND         window;
+   unsigned int message;
+   WPARAM       window_param;
+   LPARAM       data_param;
+   long         time;
+   int          x;
+   int          y;
+};
+
+
+typedef int (*ecore_wince_suspend) (void);
+typedef int (*ecore_wince_resume)  (void);
+
+
+struct _Ecore_WinCE_Window
+{
+   HWND                window;
+
+   ecore_wince_suspend suspend;
+   ecore_wince_resume  resume;
+};
+
+extern double              _ecore_wince_event_last_time;
+
+extern HINSTANCE _ecore_wince_instance;
+
+
+void  _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg);
+
+
+#endif /* __ECORE_WINCE_PRIVATE_H__ */
diff --git a/src/lib/ecore_wince/ecore_wince_window.c b/src/lib/ecore_wince/ecore_wince_window.c
new file mode 100644
index 0000000..83643f3
--- /dev/null
+++ b/src/lib/ecore_wince/ecore_wince_window.c
@@ -0,0 +1,189 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include <stdlib.h>
+#include <stdio.h>   /* for printf */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <aygshell.h>
+
+#include "Ecore_WinCE.h"
+#include "ecore_wince_private.h"
+
+char *
+_wchar_to_char(const wchar_t *text)
+{
+   char * atext;
+   int    size;
+   int    asize;
+
+   size = wcslen(text) + 1;
+
+   asize = WideCharToMultiByte(CP_ACP, 0, text, size, NULL, 0, NULL, NULL);
+   if (asize == 0)
+     return NULL;
+
+   atext = (char*)malloc((asize + 1) * sizeof(char));
+
+   if (atext)
+     if (!WideCharToMultiByte(CP_ACP, 0, text, size, atext, asize, NULL, NULL))
+       return NULL;
+   atext[asize] = '\0';
+
+   return atext;
+}
+
+/***** Private declarations *****/
+
+typedef BOOL (__stdcall *UnregisterFunc1Proc)(UINT, UINT);
+
+static int _ecore_wince_hardware_keys_register(HWND window);
+
+
+/***** API *****/
+
+Ecore_WinCE_Window *
+ecore_wince_window_new(Ecore_WinCE_Window *parent,
+                       int                 x,
+                       int                 y,
+                       int                 width,
+                       int                 height)
+{
+   struct _Ecore_WinCE_Window *w;
+   HWND                        window;
+   RECT                        rect;
+
+   w = (struct _Ecore_WinCE_Window *)calloc(1, sizeof(struct _Ecore_WinCE_Window));
+   if (!w)
+     return NULL;
+
+   SetRect(&rect, 0, 0,
+           GetSystemMetrics(SM_CXSCREEN),
+           GetSystemMetrics(SM_CYSCREEN));
+
+   window = CreateWindowEx(WS_EX_TOPMOST,
+                           ECORE_WINCE_WINDOW_CLASS,
+                           L"",
+                           WS_VISIBLE | WS_POPUP,
+                           rect.left, rect.top,
+                           rect.right - rect.left,
+                           rect.bottom - rect.top,
+                            parent ? ((struct _Ecore_WinCE_Window *)parent)->window : NULL,
+                           NULL, _ecore_wince_instance, NULL);
+   if (!window)
+     {
+        free(w);
+        return NULL;
+     }
+
+   SHFullScreen(window,
+                SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON);
+
+   if (!_ecore_wince_hardware_keys_register(window))
+     {
+        DestroyWindow(window);
+        free(w);
+        return NULL;
+     }
+
+   w->window = window;
+
+   if (!SetWindowLong(window, GWL_USERDATA, (LONG)w))
+     {
+        DestroyWindow(window);
+        free(w);
+        return NULL;
+     }
+
+   return w;
+}
+
+void
+ecore_wince_window_del(Ecore_WinCE_Window *window)
+{
+   Ecore_WinCE_Window *w;
+
+   if (!window) return;
+
+   DestroyWindow(((struct _Ecore_WinCE_Window *)window)->window);
+   free(window);
+   fprintf (stderr, "ecore_wince_window_del\n");
+}
+
+void
+ecore_wince_window_show(Ecore_WinCE_Window *window)
+{
+   if (!window) return;
+
+   fprintf (stderr, " ** ecore_wince_window_show  %p\n", window);
+   ShowWindow(((struct _Ecore_WinCE_Window *)window)->window, SW_SHOWNORMAL);
+   UpdateWindow(((struct _Ecore_WinCE_Window *)window)->window);
+}
+
+void
+ecore_wince_window_hide(Ecore_WinCE_Window *window)
+{
+   if (!window) return;
+
+   fprintf (stderr, " ** ecore_wince_window_hide  %p\n", window);
+   ShowWindow(((struct _Ecore_WinCE_Window *)window)->window, SW_HIDE);
+}
+
+void
+ecore_wince_window_suspend_set(Ecore_WinCE_Window *window, int (*suspend)(void))
+{
+   struct _Ecore_WinCE_Window *w;
+
+   if (!window)
+     return;
+
+   w = (struct _Ecore_WinCE_Window *)window;
+   w->suspend = suspend;
+}
+
+void
+ecore_wince_window_resume_set(Ecore_WinCE_Window *window, int (*resume)(void))
+{
+   struct _Ecore_WinCE_Window *w;
+
+   if (!window)
+     return;
+
+   w = (struct _Ecore_WinCE_Window *)window;
+   w->resume = resume;
+}
+
+
+/***** Private functions definitions *****/
+
+static int
+_ecore_wince_hardware_keys_register(HWND window)
+{
+   HINSTANCE           core_dll;
+   UnregisterFunc1Proc unregister_fct;
+   int                 i;
+
+   core_dll = LoadLibrary(L"coredll.dll");
+   if (!core_dll)
+     return 0;
+
+   unregister_fct = (UnregisterFunc1Proc)GetProcAddress(core_dll, L"UnregisterFunc1");
+   if (!unregister_fct)
+     {
+        FreeLibrary(core_dll);
+        return 0;
+     }
+
+   for (i = 0xc1; i <= 0xcf; i++)
+     {
+        unregister_fct(MOD_WIN, i);
+        RegisterHotKey(window, i, MOD_WIN, i);
+     }
+
+   FreeLibrary(core_dll);
+
+   return 1;
+}

-- 
Core abstraction layer for enlightenment DR 0.17



More information about the Pkg-e-commits mailing list