Tizen 2.0 Release
[profile/ivi/ecore.git] / src / lib / ecore_wince / ecore_wince.c
index 71ebf77..5638ad3 100644 (file)
@@ -1,6 +1,6 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 #include <stdlib.h>
 #include <stdio.h>   /* for printf */
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 
-#include "Ecore.h"
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+
 #include "Ecore_WinCE.h"
 #include "ecore_wince_private.h"
 
-
-/***** Global declarations *****/
-
-double              _ecore_wince_double_click_time = 0.25;
-double              _ecore_wince_event_last_time = 0.0;
-Ecore_WinCE_Window *_ecore_wince_event_last_window = NULL;
-HINSTANCE           _ecore_wince_instance = NULL;
-
-int ECORE_WINCE_EVENT_KEY_DOWN              = 0;
-int ECORE_WINCE_EVENT_KEY_UP                = 0;
-int ECORE_WINCE_EVENT_MOUSE_BUTTON_DOWN     = 0;
-int ECORE_WINCE_EVENT_MOUSE_BUTTON_UP       = 0;
-int ECORE_WINCE_EVENT_MOUSE_MOVE            = 0;
-int ECORE_WINCE_EVENT_MOUSE_IN              = 0;
-int ECORE_WINCE_EVENT_MOUSE_OUT             = 0;
-int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = 0;
-int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = 0;
-int ECORE_WINCE_EVENT_WINDOW_DAMAGE         = 0;
-int ECORE_WINCE_EVENT_WINDOW_CREATE         = 0;
-int ECORE_WINCE_EVENT_WINDOW_DESTROY        = 0;
-int ECORE_WINCE_EVENT_WINDOW_SHOW           = 0;
-int ECORE_WINCE_EVENT_WINDOW_HIDE           = 0;
-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_MOUSE_BUTTON_DOWN     = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_BUTTON_UP       = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_MOVE            = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_IN              = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_OUT             = 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++;
-
-   printf ("ecore_wince : instance + class bon\n");
-
-   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;
-}
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
 
 /**
- * Sets the timeout for a double and triple clicks to be flagged.
- *
- * This sets the time between clicks before the double_click flag is
- * set in a button down event. If 3 clicks occur within double this
- * time, the triple_click flag is also set.
- *
- * @param t The time in seconds
+ * @cond LOCAL
  */
-EAPI void
-ecore_wince_double_click_time_set(double t)
-{
-   if (t < 0.0) t = 0.0;
-   _ecore_wince_double_click_time = t;
-}
 
-/**
- * Retrieves the double and triple click flag timeout.
- *
- * See @ref ecore_wince_double_click_time_set for more information.
- *
- * @return The timeout for double clicks in seconds.
- */
-EAPI double
-ecore_wince_double_click_time_get(void)
-{
-   return _ecore_wince_double_click_time;
-}
-
-/**
- * Return the last event time
- */
-EAPI double
-ecore_wince_current_time_get(void)
-{
-   return _ecore_wince_event_last_time;
-}
-
-
-/***** Private functions definitions *****/
+static int       _ecore_wince_init_count = 0;
 
 LRESULT CALLBACK
 _ecore_wince_window_procedure(HWND   window,
@@ -193,53 +52,50 @@ _ecore_wince_window_procedure(HWND   window,
    switch (data->message)
      {
        /* Keyboard input notifications */
+     case WM_CHAR:
+       _ecore_wince_event_handle_key_press(data, 0);
+       break;
      case WM_HOTKEY:
-       printf (" * ecore message : keystroke down (hotkey)\n");
-       _ecore_wince_event_handle_key_press(data);
-       return 0;
+       _ecore_wince_event_handle_key_press(data, 1);
+       break;
      case WM_KEYDOWN:
-       printf (" * ecore message : keystroke down\n");
-       _ecore_wince_event_handle_key_press(data);
-       return 0;
+     case WM_SYSKEYDOWN:
+       _ecore_wince_event_handle_key_press(data, 1);
+       break;
      case WM_KEYUP:
-       printf (" * ecore message : keystroke up\n");
-       _ecore_wince_event_handle_key_release(data);
-       return 0;
+     case WM_SYSKEYUP:
+       _ecore_wince_event_handle_key_release(data, 1);
+       break;
      case WM_SETFOCUS:
-       printf (" * ecore message : focus in\n");
        _ecore_wince_event_handle_focus_in(data);
-       return 0;
+       break;
      case WM_KILLFOCUS:
-       printf (" * ecore message : focus out\n");
        _ecore_wince_event_handle_focus_out(data);
-       return 0;
+       break;
        /* Mouse input notifications */
      case WM_LBUTTONDOWN:
-       printf (" * ecore message : lbuttondown\n");
        _ecore_wince_event_handle_button_press(data, 1);
-       return 0;
+       break;
      case WM_LBUTTONUP:
-       printf (" * ecore message : lbuttonup\n");
        _ecore_wince_event_handle_button_release(data, 1);
-       return 0;
+       break;
      case WM_MOUSEMOVE:
        {
-          RECT                        rect;
-          struct _Ecore_WinCE_Window *w = NULL;
+          RECT                rect;
+          Ecore_WinCE_Window *w = NULL;
 
-          w = (struct _Ecore_WinCE_Window *)GetWindowLong(window, GWL_USERDATA);
-          printf (" * ecore message : mouse move\n");
+          w = (Ecore_WinCE_Window *)GetWindowLong(window, GWL_USERDATA);
 
           if (GetClientRect(window, &rect))
             {
                POINT pt;
 
-               printf ("GetClientRect !!\n");
+               INF("mouse in window");
+
                pt.x = LOWORD(data_param);
                pt.y = HIWORD(data_param);
                if (!PtInRect(&rect, pt))
                  {
-                    printf ("pas dans rect...\n");
                     if (w->pointer_is_in)
                       {
                          w->pointer_is_in = 0;
@@ -248,10 +104,8 @@ _ecore_wince_window_procedure(HWND   window,
                  }
                else
                  {
-                    printf ("dans rect... %d\n", w->pointer_is_in);
                     if (!w->pointer_is_in)
                       {
-                         printf ("w->pointer_is_in a 0\n");
                          w->pointer_is_in = 1;
                          _ecore_wince_event_handle_enter_notify(data);
                       }
@@ -259,65 +113,288 @@ _ecore_wince_window_procedure(HWND   window,
             }
           else
             {
-               printf ("pas de GetClientRect !!\n");
+               ERR("GetClientRect() failed");
             }
           _ecore_wince_event_handle_motion_notify(data);
 
-          return 0;
+          break;
        }
        /* 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;
+       break;
      case WM_DESTROY:
-       printf (" * ecore message : destroy\n");
        _ecore_wince_event_handle_destroy_notify(data);
-       return 0;
+       break;
      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;
+           (data->data_param == SW_OTHERZOOM))
+         break;
 
        if (data->window_param)
          _ecore_wince_event_handle_map_notify(data);
        else
          _ecore_wince_event_handle_unmap_notify(data);
 
-       return 0;
+       break;
      case WM_CLOSE:
-       printf (" * ecore message : close\n");
        _ecore_wince_event_handle_delete_request(data);
-       return 0;
+       break;
        /* GDI notifications */
+     case WM_ERASEBKGND:
+       return 1;
      case WM_PAINT:
        {
-          RECT rect;
           PAINTSTRUCT paint;
 
-          printf (" * ecore message : paint\n");
           if (BeginPaint(window, &paint))
             {
-               printf (" * ecore message : painting...\n");
                data->update = paint.rcPaint;
                _ecore_wince_event_handle_expose(data);
                EndPaint(window, &paint);
             }
-          return 0;
+          break;
        }
      default:
        return DefWindowProc(window, message, window_param, data_param);
      }
 
+   return 0;
+}
+
+static void
+_ecore_wince_error_print_cb(const Eina_Log_Domain *d __UNUSED__,
+                            Eina_Log_Level  level __UNUSED__,
+                            const char     *file __UNUSED__,
+                            const char     *fnc,
+                            int             line,
+                            const char     *fmt,
+                            void           *data __UNUSED__,
+                            va_list         args)
+{
+   fprintf(stderr, "[%s:%d] ", fnc, line);
+   vfprintf(stderr, fmt, args);
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+
+double              _ecore_wince_double_click_time = 0.25;
+long                _ecore_wince_event_last_time = 0;
+Ecore_WinCE_Window *_ecore_wince_event_last_window = NULL;
+HINSTANCE           _ecore_wince_instance = NULL;
+int                 _ecore_wince_log_dom_global = -1;
+
+int ECORE_WINCE_EVENT_MOUSE_IN              = 0;
+int ECORE_WINCE_EVENT_MOUSE_OUT             = 0;
+int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = 0;
+int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = 0;
+int ECORE_WINCE_EVENT_WINDOW_DAMAGE         = 0;
+int ECORE_WINCE_EVENT_WINDOW_CREATE         = 0;
+int ECORE_WINCE_EVENT_WINDOW_DESTROY        = 0;
+int ECORE_WINCE_EVENT_WINDOW_SHOW           = 0;
+int ECORE_WINCE_EVENT_WINDOW_HIDE           = 0;
+int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = 0;
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Ecore_WinCE_Group Ecore_WinCE library
+ *
+ * Ecore_WinCE is a library that wraps Windows CE graphic functions
+ * and integrate them nicely into the Ecore main loop.
+ *
+ * @{
+ */
+
+/**
+ * @brief Initialize the Ecore_WinCE library.
+ *
+ * @return 1 or greater on success, 0 on error.
+ *
+ * This function sets up the Windows CE graphic system. It returns 0 on
+ * failure, otherwise it returns the number of times it has already been
+ * called.
+ *
+ * When Ecore_WinCE is not used anymore, call ecore_wince_shutdown()
+ * to shut down the Ecore_WinCE library.
+ */
+EAPI int
+ecore_wince_init()
+{
+   WNDCLASS wc;
+
+   if (++_ecore_wince_init_count != 1)
+     return _ecore_wince_init_count;
+
+   if (!eina_init())
+     return --_ecore_wince_init_count;
+
+   eina_log_print_cb_set(_ecore_wince_error_print_cb, NULL);
+   _ecore_wince_log_dom_global = eina_log_domain_register
+     ("ecore_wince", ECORE_WINCE_DEFAULT_LOG_COLOR);
+   if (_ecore_wince_log_dom_global < 0)
+     {
+        EINA_LOG_ERR("Ecore_WinCE: Could not register log domain");
+        goto shutdown_eina;
+      }
+
+   if (!ecore_event_init())
+     {
+        ERR("Ecore_WinCE: Could not init ecore_event");
+        goto unregister_log_domain;
+     }
+
+   _ecore_wince_instance = GetModuleHandle(NULL);
+   if (!_ecore_wince_instance)
+     {
+        ERR("GetModuleHandle() failed");
+        goto shutdown_ecore_event;
+     }
+
+   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))
+     {
+        ERR("RegisterClass() failed");
+        goto free_library;
+     }
+
+   if (!ECORE_WINCE_EVENT_MOUSE_IN)
+     {
+        ECORE_WINCE_EVENT_MOUSE_IN              = ecore_event_type_new();
+        ECORE_WINCE_EVENT_MOUSE_OUT             = 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();
+     }
+
+   return _ecore_wince_init_count;
+
+ free_library:
+   FreeLibrary(_ecore_wince_instance);
+ shutdown_ecore_event:
+   ecore_event_shutdown();
+ unregister_log_domain:
+   eina_log_domain_unregister(_ecore_wince_log_dom_global);
+ shutdown_eina:
+   eina_shutdown();
+
+   return --_ecore_wince_init_count;
+}
+
+/**
+ * @brief Shut down the Ecore_WinCE library.
+ *
+ * @return 0 when the library is completely shut down, 1 or
+ * greater otherwise.
+ *
+ * This function shuts down the Ecore_WinCE library. It returns 0 when it has
+ * been called the same number of times than ecore_wince_init(). In that case
+ * it shuts down all the Windows CE graphic system.
+ */
+EAPI int
+ecore_wince_shutdown()
+{
+   HWND task_bar;
+
+   if (--_ecore_wince_init_count != 0)
+     return _ecore_wince_init_count;
+
+   /* force task bar to be shown (in case the application exits */
+   /* while being fullscreen) */
+   task_bar = FindWindow(L"HHTaskBar", NULL);
+   if (task_bar)
+     {
+        ShowWindow(task_bar, SW_SHOW);
+        EnableWindow(task_bar, TRUE);
+     }
+
+   if (!UnregisterClass(ECORE_WINCE_WINDOW_CLASS, _ecore_wince_instance))
+     ERR("UnregisterClass() failed");
+
+   if (!FreeLibrary(_ecore_wince_instance))
+     ERR("FreeLibrary() failed");
+
+   _ecore_wince_instance = NULL;
+
+   ecore_event_shutdown();
+   eina_log_domain_unregister(_ecore_wince_log_dom_global);
+   _ecore_wince_log_dom_global = -1;
+   eina_shutdown();
+
+   return _ecore_wince_init_count;
 }
+
+/**
+ * @brief Set the timeout for a double and triple clicks to be flagged.
+ *
+ * @param t The time in seconds.
+ *
+ * This function sets the time @p t between clicks before the
+ * double_click flag is set in a button down event. If 3 clicks occur
+ * within double this time, the triple_click flag is also set.
+ */
+EAPI void
+ecore_wince_double_click_time_set(double t)
+{
+   if (t < 0.0) t = 0.0;
+   _ecore_wince_double_click_time = t;
+}
+
+/**
+ * @brief Retrieve the double and triple click flag timeout.
+ *
+ * @return The timeout for double clicks in seconds.
+ *
+ * This function returns the double clicks in seconds. If
+ * ecore_wince_double_click_time_set() has not been called, the
+ * default value is returned. See ecore_wince_double_click_time_set()
+ * for more informations.
+ */
+EAPI double
+ecore_wince_double_click_time_get(void)
+{
+   return _ecore_wince_double_click_time;
+}
+
+/**
+ * @brief Return the last event time.
+ *
+ * @return The last envent time.
+ *
+ * This function returns the last event time.
+ */
+EAPI long
+ecore_wince_current_time_get(void)
+{
+   return _ecore_wince_event_last_time;
+}
+
+/**
+ * @}
+ */