* fix a bug in the key up event ('space' key was not handled)
authorcaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 20 Feb 2011 08:37:43 +0000 (08:37 +0000)
committercaro <caro@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 20 Feb 2011 08:37:43 +0000 (08:37 +0000)
 * Greatly improve the resize. Plain, without flickering, etc...

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@57182 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
src/lib/ecore_win32/ecore_win32.c
src/lib/ecore_win32/ecore_win32_event.c
src/lib/ecore_win32/ecore_win32_private.h
src/lib/ecore_win32/ecore_win32_window.c

index 37a6b3c..198e233 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -43,3 +43,7 @@
 
        * Added ecore_file_download_full API.
 
+2011-02-20 Vincent Torri
+
+       * Ecore_Win32: improve resize of windows and fix key up event for
+       the 'space' key.
index a44a52b..e95ca73 100644 (file)
@@ -38,6 +38,24 @@ DEFINE_OLEGUID(IID_IUnknown,       0x00000000L, 0, 0);
 
 static int       _ecore_win32_init_count = 0;
 
+static void
+_ecore_win32_size_check(Ecore_Win32_Window *win, int w, int h, int *dx, int *dy)
+{
+   int minimal_width;
+   int minimal_height;
+
+   minimal_width = GetSystemMetrics(SM_CXMIN);
+   minimal_height = GetSystemMetrics(SM_CYMIN);
+   if ((w) < MAX(minimal_width, (int)win->min_width))
+     *dx = 0;
+   if ((w) > (int)win->max_width)
+     *dx = 0;
+   if ((h) < MAX(minimal_height, (int)win->min_height))
+     *dy = 0;
+   if ((h) > (int)win->max_height)
+     *dy = 0;
+}
+
 LRESULT CALLBACK
 _ecore_win32_window_procedure(HWND   window,
                               UINT   message,
@@ -45,7 +63,7 @@ _ecore_win32_window_procedure(HWND   window,
                               LPARAM data_param)
 {
    Ecore_Win32_Callback_Data *data;
-   POINTS                     pt;
+   POINTS                     point;
    DWORD                      coord;
 
    data = (Ecore_Win32_Callback_Data *)malloc(sizeof(Ecore_Win32_Callback_Data));
@@ -57,9 +75,9 @@ _ecore_win32_window_procedure(HWND   window,
    data->data_param = data_param;
    data->time = GetMessageTime();
    coord = GetMessagePos();
-   pt = MAKEPOINTS(coord);
-   data->x = pt.x;
-   data->y = pt.y;
+   point = MAKEPOINTS(coord);
+   data->x = point.x;
+   data->y = point.y;
 
    switch (data->message)
      {
@@ -68,10 +86,10 @@ _ecore_win32_window_procedure(HWND   window,
        INF("keydown message");
        _ecore_win32_event_handle_key_press(data, 1);
        return 0;
-     case WM_CHAR:
-       INF("char message");
-       _ecore_win32_event_handle_key_press(data, 0);
-       return 0;
+     /* case WM_CHAR: */
+     /*   INF("char message"); */
+     /*   _ecore_win32_event_handle_key_press(data, 0); */
+     /*   return 0; */
      case WM_KEYUP:
        INF("keyup message");
        _ecore_win32_event_handle_key_release(data, 1);
@@ -98,9 +116,22 @@ _ecore_win32_window_procedure(HWND   window,
        _ecore_win32_event_handle_button_press(data, 3);
        return 0;
      case WM_LBUTTONUP:
-       INF("left button up message");
-       _ecore_win32_event_handle_button_release(data, 1);
-       return 0;
+       {
+          struct _Ecore_Win32_Window *w = NULL;
+
+          INF("left button up message");
+
+          w = (struct _Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
+          if (w->drag.dragging)
+            {
+               ReleaseCapture();
+               w->drag.dragging = 0;
+               return 0;
+            }
+
+          _ecore_win32_event_handle_button_release(data, 1);
+          return 0;
+       }
      case WM_MBUTTONUP:
        INF("middle button up message");
        _ecore_win32_event_handle_button_release(data, 2);
@@ -118,6 +149,159 @@ _ecore_win32_window_procedure(HWND   window,
 
           w = (struct _Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
 
+          if (w->drag.dragging)
+            {
+               POINT pt;
+
+               pt.x = GET_X_LPARAM(data_param);
+               pt.y = GET_Y_LPARAM(data_param);
+               if (ClientToScreen(window, &pt))
+                 {
+                    if (w->drag.type == HTCAPTION)
+                      {
+                         int dx;
+                         int dy;
+
+                         dx = pt.x - w->drag.px;
+                         dy = pt.y - w->drag.py;
+                         ecore_win32_window_move(w, w->drag.x + dx, w->drag.y + dy);
+                         w->drag.x += dx;
+                         w->drag.y += dy;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTLEFT)
+                      {
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y, w->drag.w - dw, w->drag.h);
+                         w->drag.x += dw;
+                         w->drag.w -= dw;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTRIGHT)
+                      {
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h);
+                         w->drag.w += dw;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTTOP)
+                      {
+                         int dh;
+
+                         dh = pt.y - w->drag.py;
+                         ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dh, w->drag.w, w->drag.h - dh);
+                         w->drag.y += dh;
+                         w->drag.h -= dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTBOTTOM)
+                      {
+                         int dh;
+
+                         dh = pt.y - w->drag.py;
+                         ecore_win32_window_resize(w, w->drag.w, w->drag.h + dh);
+                         w->drag.h += dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTTOPLEFT)
+                      {
+                         int dx;
+                         int dy;
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         dx = dw;
+                         dy = dh;
+                         _ecore_win32_size_check(w,
+                                                 w->drag.w - dw, w->drag.h - dh,
+                                                 &dx, &dy);
+
+                         ecore_win32_window_move_resize(w, w->drag.x + dx, w->drag.y + dy, w->drag.w - dw, w->drag.h - dh);
+                         w->drag.x += dx;
+                         w->drag.y += dy;
+                         w->drag.w -= dw;
+                         w->drag.h -= dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTTOPRIGHT)
+                      {
+                         int dx;
+                         int dy;
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         dx = dw;
+                         dy = dh;
+                         _ecore_win32_size_check(w,
+                                                 w->drag.w, w->drag.h - dh,
+                                                 &dx, &dy);
+                         ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dy, w->drag.w, w->drag.h - dh);
+                         w->drag.y += dy;
+                         w->drag.w += dw;
+                         w->drag.h -= dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTBOTTOMLEFT)
+                      {
+                         int dx;
+                         int dy;
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         dx = dw;
+                         dy = dh;
+                         _ecore_win32_size_check(w,
+                                                 w->drag.w - dw, w->drag.h + dh,
+                                                 &dx, &dy);
+                         ecore_win32_window_move_resize(w, w->drag.x + dx, w->drag.y, w->drag.w - dw, w->drag.h + dh);
+                         w->drag.x += dx;
+                         w->drag.w -= dw;
+                         w->drag.h += dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTBOTTOMRIGHT)
+                      {
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h + dh);
+                         w->drag.w += dw;
+                         w->drag.h += dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                 }
+            }
+
           if (GetClientRect(window, &rect))
             {
                POINT pt;
@@ -219,6 +403,7 @@ _ecore_win32_window_procedure(HWND   window,
        return 0;
      case WM_NCLBUTTONDOWN:
        INF("non client left button down window message");
+
        if (((DWORD)window_param == HTCAPTION) ||
            ((DWORD)window_param == HTBOTTOM) ||
            ((DWORD)window_param == HTBOTTOMLEFT) ||
@@ -233,8 +418,10 @@ _ecore_win32_window_procedure(HWND   window,
 
            w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
            ecore_win32_window_geometry_get(w,
-                                           &w->drag.x, &w->drag.y,
+                                           NULL, NULL,
                                            &w->drag.w, &w->drag.h);
+           SetCapture(window);
+           w->drag.type = (DWORD)window_param;
            w->drag.px = GET_X_LPARAM(data_param);
            w->drag.py = GET_Y_LPARAM(data_param);
            w->drag.dragging = 1;
@@ -242,7 +429,8 @@ _ecore_win32_window_procedure(HWND   window,
          }
        return DefWindowProc(window, message, window_param, data_param);
      case WM_SYSCOMMAND:
-       INF("sys command window message", (int)window_param);
+       INF("sys command window message %d", (int)window_param);
+
        if ((((DWORD)window_param & 0xfff0) == SC_MOVE) ||
            (((DWORD)window_param & 0xfff0) == SC_SIZE))
          {
@@ -255,118 +443,9 @@ _ecore_win32_window_procedure(HWND   window,
            return 0;
          }
        return DefWindowProc(window, message, window_param, data_param);
-     case WM_NCMOUSEMOVE:
-       INF("non client mouse move window message");
-       if ((DWORD)window_param == HTCAPTION)
-         {
-           Ecore_Win32_Window *w;
-
-           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
-           if (w->drag.dragging)
-             {
-               int dx;
-               int dy;
-
-               dx = GET_X_LPARAM(data_param) - w->drag.px;
-               dy = GET_Y_LPARAM(data_param) - w->drag.py;
-               ecore_win32_window_move(w, w->drag.x + dx, w->drag.y + dy);
-               w->drag.x += dx;
-               w->drag.y += dy;
-               w->drag.px = GET_X_LPARAM(data_param);
-               w->drag.py = GET_Y_LPARAM(data_param);
-               return 0;
-             }
-         }
-       if ((DWORD)window_param == HTLEFT)
-         {
-           Ecore_Win32_Window *w;
-
-           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
-           if (w->drag.dragging)
-             {
-               int dw;
-               dw = GET_X_LPARAM(data_param) - w->drag.px;
-               ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y, w->drag.w - dw, w->drag.h);
-               w->drag.x += dw;
-               w->drag.w -= dw;
-               w->drag.px = GET_X_LPARAM(data_param);
-               w->drag.py = GET_Y_LPARAM(data_param);
-               return 0;
-             }
-         }
-       if ((DWORD)window_param == HTRIGHT)
-         {
-           Ecore_Win32_Window *w;
-
-           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
-           if (w->drag.dragging)
-             {
-               int dw;
-               dw = GET_X_LPARAM(data_param) - w->drag.px;
-               ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h);
-               w->drag.w += dw;
-               w->drag.px = GET_X_LPARAM(data_param);
-               w->drag.py = GET_Y_LPARAM(data_param);
-               return 0;
-             }
-         }
-       if ((DWORD)window_param == HTTOP)
-         {
-           Ecore_Win32_Window *w;
-
-           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
-           if (w->drag.dragging)
-             {
-               int dh;
-               dh = GET_Y_LPARAM(data_param) - w->drag.py;
-               ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dh, w->drag.w, w->drag.h - dh);
-               w->drag.y += dh;
-               w->drag.h -= dh;
-               w->drag.px = GET_X_LPARAM(data_param);
-               w->drag.py = GET_Y_LPARAM(data_param);
-               return 0;
-             }
-         }
-       if ((DWORD)window_param == HTBOTTOM)
-         {
-           Ecore_Win32_Window *w;
-
-           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
-           if (w->drag.dragging)
-             {
-               int dh;
-               dh = GET_Y_LPARAM(data_param) - w->drag.py;
-               ecore_win32_window_resize(w, w->drag.w, w->drag.h + dh);
-               w->drag.h += dh;
-               w->drag.px = GET_X_LPARAM(data_param);
-               w->drag.py = GET_Y_LPARAM(data_param);
-               return 0;
-             }
-         }
-       return DefWindowProc(window, message, window_param, data_param);
-     case WM_NCLBUTTONUP:
-       INF("non client left button up window message");
-       if (((DWORD)window_param == HTCAPTION) ||
-           ((DWORD)window_param == HTBOTTOM) ||
-           ((DWORD)window_param == HTBOTTOMLEFT) ||
-           ((DWORD)window_param == HTBOTTOMRIGHT) ||
-           ((DWORD)window_param == HTLEFT) ||
-           ((DWORD)window_param == HTRIGHT) ||
-           ((DWORD)window_param == HTTOP) ||
-           ((DWORD)window_param == HTTOPLEFT) ||
-           ((DWORD)window_param == HTTOPRIGHT))
-         {
-           Ecore_Win32_Window *w;
-
-           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWL_USERDATA);
-           if (w->drag.dragging)
-             {
-               w->drag.dragging = 0;
-               return 0;
-             }
-         }
-       return DefWindowProc(window, message, window_param, data_param);
        /* GDI notifications */
+     case WM_ERASEBKGND:
+       return 1;
      case WM_PAINT:
        {
          RECT rect;
index ed467d3..4d69654 100644 (file)
@@ -802,6 +802,7 @@ _ecore_win32_event_keystroke_get(int    key,
        kn = "space";
        ks = "space";
        kc = "space";
+       break;
      case VK_F1:
        kn = "F1";
        ks = "F1";
index 41b07ca..1b609e5 100644 (file)
@@ -6,6 +6,15 @@
 extern "C" {
 #endif
 
+#ifdef MIN
+# undef MIN
+#endif
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+#ifdef MAX
+# undef MAX
+#endif
+#define MAX(a,b) (((a) < (b)) ? (b) : (a))
 
 /* logging messages macros */
 extern int _ecore_win32_log_dom_global;
@@ -29,6 +38,11 @@ extern int _ecore_win32_log_dom_global;
 #endif
 #define INF(...) EINA_LOG_DOM_INFO(_ecore_win32_log_dom_global , __VA_ARGS__)
 
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_win32_log_dom_global, __VA_ARGS__)
+
 #define ECORE_WIN32_WINDOW_CLASS "Ecore_Win32_Window_Class"
 
 typedef struct _Ecore_Win32_Callback_Data Ecore_Win32_Callback_Data;
@@ -100,13 +114,14 @@ struct _Ecore_Win32_Window
    } shape;
 
    struct {
-     unsigned int x;
-     unsigned int y;
-     unsigned int w;
-     unsigned int h;
-     unsigned int px;
-     unsigned int py;
-     unsigned int dragging : 1;
+      DWORD        type;
+      int x;
+      int y;
+      int w;
+      int h;
+      int px;
+      int py;
+      unsigned int dragging : 1;
    } drag;
 
    void *dnd_drop_target;
index 6a655fa..bcd216d 100644 (file)
@@ -56,7 +56,7 @@ ecore_win32_window_internal_new(Ecore_Win32_Window *parent,
    rect.top = 0;
    rect.right = width;
    rect.bottom = height;
-   if (!AdjustWindowRect(&rect, style, FALSE))
+   if (!AdjustWindowRectEx(&rect, style, FALSE, 0))
      {
         ERR("AdjustWindowRect() failed");
         free(w);
@@ -352,6 +352,8 @@ ecore_win32_window_resize(Ecore_Win32_Window *window,
    DWORD                       style;
    int                         x;
    int                         y;
+   int                         minimal_width;
+   int                         minimal_height;
 
    /* FIXME: on fullscreen, should not resize it */
    if (!window) return;
@@ -359,6 +361,10 @@ ecore_win32_window_resize(Ecore_Win32_Window *window,
    INF("resizing window (%dx%d)", width, height);
 
    w = (struct _Ecore_Win32_Window *)window;
+
+   minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)w->min_width);
+   minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)w->min_height);
+
    if (!GetWindowRect(w->window, &rect))
      {
         ERR("GetWindowRect() failed");
@@ -369,13 +375,10 @@ ecore_win32_window_resize(Ecore_Win32_Window *window,
    y = rect.top;
    rect.left = 0;
    rect.top = 0;
-/*    if (width < w->min_width) width = w->min_width; */
-/*    if (width > w->max_width) width = w->max_width; */
-/*    printf ("ecore_win32_window_resize 1 : %d %d %d\n", w->min_height, w->max_height, height); */
-/*    if (height < w->min_height) height = w->min_height; */
-/*    printf ("ecore_win32_window_resize 2 : %d %d\n", w->max_height, height); */
-/*    if (height > w->max_height) height = w->max_height; */
-/*    printf ("ecore_win32_window_resize 3 : %d %d\n", w->max_height, height); */
+   if (width < minimal_width) width = minimal_width;
+   if (width > (int)w->max_width) width = w->max_width;
+   if (height < minimal_height) height = minimal_height;
+   if (height > (int)w->max_height) height = w->max_height;
    rect.right = width;
    rect.bottom = height;
    if (!(style = GetWindowLong(w->window, GWL_STYLE)))
@@ -421,6 +424,8 @@ ecore_win32_window_move_resize(Ecore_Win32_Window *window,
    RECT                        rect;
    struct _Ecore_Win32_Window *w;
    DWORD                       style;
+   int                         minimal_width;
+   int                         minimal_height;
 
    /* FIXME: on fullscreen, should not move/resize it */
    if (!window) return;
@@ -428,12 +433,16 @@ ecore_win32_window_move_resize(Ecore_Win32_Window *window,
    INF("moving and resizing window (%dx%d %dx%d)", x, y, width, height);
 
    w = ((struct _Ecore_Win32_Window *)window);
+
+   minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)w->min_width);
+   minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)w->min_height);
+
    rect.left = 0;
    rect.top = 0;
-   if ((unsigned int)width < w->min_width) width = w->min_width;
-   if ((unsigned int)width > w->max_width) width = w->max_width;
-   if ((unsigned int)height < w->min_height) height = w->min_height;
-   if ((unsigned int)height > w->max_height) height = w->max_height;
+   if (width < minimal_width) width = minimal_width;
+   if (width > (int)w->max_width) width = w->max_width;
+   if (height < minimal_height) height = minimal_height;
+   if (height > (int)w->max_height) height = w->max_height;
    rect.right = width;
    rect.bottom = height;
    if (!(style = GetWindowLong(w->window, GWL_STYLE)))