cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d1cbf6d080424263a906d43b1bf35f3fb1815cb6
commit d1cbf6d080424263a906d43b1bf35f3fb1815cb6 Author: Vincent Torri <[email protected]> Date: Tue Jul 8 23:21:35 2014 +0200 Ecore_Win32: fix resize of windows when step and base sizes are set --- src/lib/ecore_win32/Ecore_Win32.h | 32 +- src/lib/ecore_win32/ecore_win32.c | 174 +--------- src/lib/ecore_win32/ecore_win32_private.h | 101 +++--- src/lib/ecore_win32/ecore_win32_window.c | 510 ++++++++++++++++++++++++------ 4 files changed, 486 insertions(+), 331 deletions(-) diff --git a/src/lib/ecore_win32/Ecore_Win32.h b/src/lib/ecore_win32/Ecore_Win32.h index 363fddb..ba0cc4d 100644 --- a/src/lib/ecore_win32/Ecore_Win32.h +++ b/src/lib/ecore_win32/Ecore_Win32.h @@ -421,36 +421,36 @@ EAPI void ecore_win32_window_size_get(Ecore_Win32_Window *window, int *height); EAPI void ecore_win32_window_size_min_set(Ecore_Win32_Window *window, - unsigned int min_width, - unsigned int min_height); + int min_width, + int min_height); EAPI void ecore_win32_window_size_min_get(Ecore_Win32_Window *window, - unsigned int *min_width, - unsigned int *min_height); + int *min_width, + int *min_height); EAPI void ecore_win32_window_size_max_set(Ecore_Win32_Window *window, - unsigned int max_width, - unsigned int max_height); + int max_width, + int max_height); EAPI void ecore_win32_window_size_max_get(Ecore_Win32_Window *window, - unsigned int *max_width, - unsigned int *max_height); + int *max_width, + int *max_height); EAPI void ecore_win32_window_size_base_set(Ecore_Win32_Window *window, - unsigned int base_width, - unsigned int base_height); + int base_width, + int base_height); EAPI void ecore_win32_window_size_base_get(Ecore_Win32_Window *window, - unsigned int *base_width, - unsigned int *base_height); + int *base_width, + int *base_height); EAPI void ecore_win32_window_size_step_set(Ecore_Win32_Window *window, - unsigned int step_width, - unsigned int step_height); + int step_width, + int step_height); EAPI void ecore_win32_window_size_step_get(Ecore_Win32_Window *window, - unsigned int *step_width, - unsigned int *step_height); + int *step_width, + int *step_height); EAPI void ecore_win32_window_show(Ecore_Win32_Window *window); diff --git a/src/lib/ecore_win32/ecore_win32.c b/src/lib/ecore_win32/ecore_win32.c index 2c20ae9..411c2f0 100644 --- a/src/lib/ecore_win32/ecore_win32.c +++ b/src/lib/ecore_win32/ecore_win32.c @@ -38,24 +38,6 @@ 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, @@ -124,7 +106,7 @@ _ecore_win32_window_procedure(HWND window, w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA); if (w->drag.dragging) { - w->drag.dragging = 0; + w->drag.dragging = EINA_FALSE; return 0; } @@ -155,11 +137,11 @@ _ecore_win32_window_procedure(HWND window, (w->drag.current_mouse_y == GET_Y_LPARAM(data_param))) return 0; + INF("mouse move message"); + w->drag.current_mouse_x = GET_X_LPARAM(data_param); w->drag.current_mouse_y = GET_Y_LPARAM(data_param); - INF("mouse move message"); - if (w->drag.dragging) { POINT pt; @@ -168,148 +150,8 @@ _ecore_win32_window_procedure(HWND window, 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 (ecore_win32_window_drag(w, pt.x, pt.y)) + return 0; } } @@ -430,13 +272,13 @@ _ecore_win32_window_procedure(HWND window, w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA); ecore_win32_window_geometry_get(w, - NULL, NULL, + &w->drag.x, &w->drag.y, &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; + w->drag.dragging = EINA_TRUE; if ((DWORD)window_param == HTCAPTION) ecore_win32_window_raise(w); return 0; @@ -453,7 +295,7 @@ _ecore_win32_window_procedure(HWND window, INF("sys command MOVE or SIZE window message : %dx%d", GET_X_LPARAM(data_param), GET_Y_LPARAM(data_param)); w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA); - w->drag.dragging = 1; + w->drag.dragging = EINA_TRUE; return 0; } return DefWindowProc(window, message, window_param, data_param); diff --git a/src/lib/ecore_win32/ecore_win32_private.h b/src/lib/ecore_win32/ecore_win32_private.h index af2d86a..1e2bb1b 100644 --- a/src/lib/ecore_win32/ecore_win32_private.h +++ b/src/lib/ecore_win32/ecore_win32_private.h @@ -45,6 +45,14 @@ extern int _ecore_win32_log_dom_global; #define ECORE_WIN32_WINDOW_CLASS "Ecore_Win32_Window_Class" +typedef enum +{ + ECORE_WIN32_POS_HINTS_MIN_SIZE = 1 << 0, + ECORE_WIN32_POS_HINTS_MAX_SIZE = 1 << 1, + ECORE_WIN32_POS_HINTS_BASE_SIZE = 1 << 2, + ECORE_WIN32_POS_HINTS_STEP_SIZE = 1 << 3 +} Ecore_Win32_Pos_Hints_Flags; + typedef struct _Ecore_Win32_Callback_Data Ecore_Win32_Callback_Data; struct _Ecore_Win32_Callback_Data @@ -61,49 +69,52 @@ struct _Ecore_Win32_Callback_Data struct _Ecore_Win32_Window { - HWND window; - - DWORD style; /* used to go fullscreen to normal */ - RECT rect; /* used to go fullscreen to normal */ + HWND window; + int mininal_window_width; + DWORD style; /* used to go fullscreen to normal */ + RECT rect; /* used to go fullscreen to normal */ - unsigned int min_width; - unsigned int min_height; - unsigned int max_width; - unsigned int max_height; - int base_width; - int base_height; - unsigned int step_width; - unsigned int step_height; + struct { + Ecore_Win32_Pos_Hints_Flags flags; + int min_width; + int min_height; + int max_width; + int max_height; + int base_width; + int base_height; + int step_width; + int step_height; + } pos_hints; struct { - unsigned int iconified : 1; - unsigned int modal : 1; - unsigned int sticky : 1; - unsigned int maximized_vert : 1; - unsigned int maximized_horz : 1; - unsigned int shaded : 1; - unsigned int hidden : 1; - unsigned int fullscreen : 1; - unsigned int above : 1; - unsigned int below : 1; - unsigned int demands_attention : 1; + unsigned int iconified : 1; + unsigned int modal : 1; + unsigned int sticky : 1; + unsigned int maximized_vert : 1; + unsigned int maximized_horz : 1; + unsigned int shaded : 1; + unsigned int hidden : 1; + unsigned int fullscreen : 1; + unsigned int above : 1; + unsigned int below : 1; + unsigned int demands_attention : 1; } state; struct { - unsigned int desktop : 1; - unsigned int dock : 1; - unsigned int toolbar : 1; - unsigned int menu : 1; - unsigned int utility : 1; - unsigned int splash : 1; - unsigned int dialog : 1; - unsigned int normal : 1; + unsigned int desktop : 1; + unsigned int dock : 1; + unsigned int toolbar : 1; + unsigned int menu : 1; + unsigned int utility : 1; + unsigned int splash : 1; + unsigned int dialog : 1; + unsigned int normal : 1; } type; - unsigned int pointer_is_in : 1; - unsigned int borderless : 1; - unsigned int iconified : 1; - unsigned int fullscreen : 1; + unsigned int pointer_is_in : 1; + unsigned int borderless : 1; + unsigned int iconified : 1; + unsigned int fullscreen : 1; struct { unsigned short width; @@ -114,15 +125,15 @@ struct _Ecore_Win32_Window } shape; struct { - DWORD type; - int x; - int y; - int w; - int h; - int px; - int py; - int current_mouse_x; - int current_mouse_y; + DWORD type; + int x; + int y; + int w; + int h; + int px; + int py; + int current_mouse_x; + int current_mouse_y; unsigned int dragging : 1; } drag; @@ -162,6 +173,8 @@ void *_ecore_win32_dnd_register_drop_window(HWND hwnd, Ecore_Win32_Dnd_DropTarget_Callback callback, void *ptr); void _ecore_win32_dnd_unregister_drop_window(HWND hwnd, void *drop_target); + Eina_Bool ecore_win32_window_drag(Ecore_Win32_Window *w, int ptx, int pty); + #ifdef __cplusplus } diff --git a/src/lib/ecore_win32/ecore_win32_window.c b/src/lib/ecore_win32/ecore_win32_window.c index 239fe9d..792fcb3 100644 --- a/src/lib/ecore_win32/ecore_win32_window.c +++ b/src/lib/ecore_win32/ecore_win32_window.c @@ -3,7 +3,6 @@ #endif #include <stdlib.h> -#include <stdio.h> /* for printf */ #define WIN32_LEAN_AND_MEAN #include <windows.h> @@ -33,7 +32,7 @@ enum _Ecore_Win32_Window_Z_Order }; static Ecore_Win32_Window * -ecore_win32_window_internal_new(Ecore_Win32_Window *parent, +_ecore_win32_window_internal_new(Ecore_Win32_Window *parent, int x, int y, int width, @@ -42,9 +41,6 @@ ecore_win32_window_internal_new(Ecore_Win32_Window *parent, { RECT rect; Ecore_Win32_Window *w; - int minimal_width; -#warning "We need to handle minimal_height for window like we do with width." - /* int minimal_height; */ w = (Ecore_Win32_Window *)calloc(1, sizeof(Ecore_Win32_Window)); if (!w) @@ -55,6 +51,19 @@ ecore_win32_window_internal_new(Ecore_Win32_Window *parent, rect.left = 0; rect.top = 0; + rect.right = 0; + rect.bottom = 0; + if (!AdjustWindowRectEx(&rect, style, FALSE, 0)) + { + ERR("AdjustWindowRect() failed"); + free(w); + return NULL; + } + + w->mininal_window_width = GetSystemMetrics(SM_CXMIN) - (rect.right - rect.left); + + rect.left = 0; + rect.top = 0; rect.right = width; rect.bottom = height; if (!AdjustWindowRectEx(&rect, style, FALSE, 0)) @@ -64,19 +73,18 @@ ecore_win32_window_internal_new(Ecore_Win32_Window *parent, return NULL; } - minimal_width = GetSystemMetrics(SM_CXMIN); - /* minimal_height = GetSystemMetrics(SM_CYMIN); */ -/* if (((rect.right - rect.left) < minimal_width) || */ -/* ((rect.bottom - rect.top) < minimal_height)) */ -/* { */ -/* fprintf (stderr, "[Ecore] [Win32] ERROR !!\n"); */ -/* fprintf (stderr, " Wrong size %ld\n", rect.right - rect.left); */ -/* free(w); */ -/* return NULL; */ -/* } */ - if ((rect.right - rect.left) < minimal_width) + if (width < w->mininal_window_width) + width = w->mininal_window_width; + + rect.left = 0; + rect.top = 0; + rect.right = width; + rect.bottom = height; + if (!AdjustWindowRectEx(&rect, style, FALSE, 0)) { - rect.right = rect.left + minimal_width; + ERR("AdjustWindowRect() failed"); + free(w); + return NULL; } w->window = CreateWindowEx(0, @@ -104,14 +112,15 @@ ecore_win32_window_internal_new(Ecore_Win32_Window *parent, return NULL; } - w->min_width = 0; - w->min_height = 0; - w->max_width = 32767; - w->max_height = 32767; - w->base_width = -1; - w->base_height = -1; - w->step_width = 1; - w->step_height = 1; + w->pos_hints.flags = 0; + w->pos_hints.min_width = w->mininal_window_width; + w->pos_hints.min_height = 0; + w->pos_hints.max_width = 32767; + w->pos_hints.max_height = 32767; + w->pos_hints.base_width = w->mininal_window_width; + w->pos_hints.base_height = 0; + w->pos_hints.step_width = 0; + w->pos_hints.step_height = 0; w->state.iconified = 0; w->state.modal = 0; @@ -158,6 +167,255 @@ ecore_win32_window_internal_new(Ecore_Win32_Window *parent, * Global * *============================================================================*/ +Eina_Bool +ecore_win32_window_drag(Ecore_Win32_Window *w, int ptx, int pty) +{ + if (w->drag.type == HTCAPTION) + { + int dx; + int dy; + + dx = ptx - w->drag.px; + dy = pty - w->drag.py; + if ((dx == 0) && (dy == 0)) + return EINA_TRUE; + + ecore_win32_window_move(w, w->drag.x + dx, w->drag.y + dy); + return EINA_TRUE; + } + if (w->drag.type == HTLEFT) + { + int dw; + + dw = ptx - w->drag.px; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_width; + + new_width = w->pos_hints.base_width + ((w->drag.w - w->pos_hints.base_width - dw) / w->pos_hints.step_width) * w->pos_hints.step_width; + if ((new_width != w->drag.w) && + (new_width >= w->pos_hints.base_width) && + (new_width <= w->pos_hints.max_width)) + ecore_win32_window_move_resize(w, w->drag.x - (new_width - w->drag.w), w->drag.y, new_width, w->drag.h); + } + else + { + if (((w->drag.w - dw) >= w->pos_hints.min_width) && + ((w->drag.w - dw) <= w->pos_hints.max_width)) + ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y, w->drag.w - dw, w->drag.h); + } + return EINA_TRUE; + } + if (w->drag.type == HTRIGHT) + { + int dw; + + dw = ptx - w->drag.px; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_width; + + new_width = w->pos_hints.base_width + ((w->drag.w - w->pos_hints.base_width + dw) / w->pos_hints.step_width) * w->pos_hints.step_width; + if ((new_width != w->drag.w) && + (new_width >= w->pos_hints.base_width) && + (new_width <= w->pos_hints.max_width)) + ecore_win32_window_resize(w, new_width, w->drag.h); + } + else + { + if (((w->drag.w + dw) >= w->pos_hints.min_width) && + ((w->drag.w + dw) <= w->pos_hints.max_width)) + ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h); + } + return EINA_TRUE; + } + if (w->drag.type == HTTOP) + { + int dh; + + dh = pty - w->drag.py; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_height; + + new_height = w->pos_hints.base_height + ((w->drag.h - w->pos_hints.base_height - dh) / w->pos_hints.step_height) * w->pos_hints.step_height; + if ((new_height != w->drag.h) && + (new_height >= w->pos_hints.base_height) && + (new_height <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x, w->drag.y - (new_height - w->drag.h), w->drag.w, new_height); + } + else + { + if ((dh != 0) && + ((w->drag.h - dh) >= w->pos_hints.min_height) && + ((w->drag.h - dh) <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dh, w->drag.w, w->drag.h - dh); + } + return EINA_TRUE; + } + if (w->drag.type == HTBOTTOM) + { + int dh; + + dh = pty - w->drag.py; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_height; + + new_height = w->pos_hints.base_height + ((w->drag.h - w->pos_hints.base_height + dh) / w->pos_hints.step_height) * w->pos_hints.step_height; + if ((new_height != w->drag.h) && + (new_height >= w->pos_hints.base_height) && + (new_height <= w->pos_hints.max_height)) + ecore_win32_window_resize(w, w->drag.w, new_height); + } + else + { + if (((w->drag.h + dh) >= w->pos_hints.min_height) && + ((w->drag.h + dh) <= w->pos_hints.max_height)) + ecore_win32_window_resize(w, w->drag.w, w->drag.h + dh); + } + return EINA_TRUE; + } + if (w->drag.type == HTTOPLEFT) + { + int dh; + int dw; + + dw = ptx - w->drag.px; + dh = pty - w->drag.py; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_width; + int new_height; + + new_width = w->pos_hints.base_width + ((w->drag.w - w->pos_hints.base_width - dw) / w->pos_hints.step_width) * w->pos_hints.step_width; + new_height = w->pos_hints.base_height + ((w->drag.h - w->pos_hints.base_height - dh) / w->pos_hints.step_height) * w->pos_hints.step_height; + if ((new_width != w->drag.w) && + (new_width >= w->pos_hints.base_width) && + (new_width <= w->pos_hints.max_width) && + (new_height != w->drag.h) && + (new_height >= w->pos_hints.base_height) && + (new_height <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x - (new_width - w->drag.w), w->drag.y - (new_height - w->drag.h), new_width, new_height); + } + else + { + if (((w->drag.w - dw) >= w->pos_hints.min_width) && + ((w->drag.w - dw) <= w->pos_hints.max_width) && + ((w->drag.h - dh) >= w->pos_hints.min_height) && + ((w->drag.h - dh) <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y + dh, w->drag.w - dw, w->drag.h - dh); + } + return EINA_TRUE; + } + if (w->drag.type == HTTOPRIGHT) + { + int dh; + int dw; + + dw = ptx - w->drag.px; + dh = pty - w->drag.py; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_width; + int new_height; + + new_width = w->pos_hints.base_width + ((w->drag.w - w->pos_hints.base_width + dw) / w->pos_hints.step_width) * w->pos_hints.step_width; + new_height = w->pos_hints.base_height + ((w->drag.h - w->pos_hints.base_height - dh) / w->pos_hints.step_height) * w->pos_hints.step_height; + if ((new_width != w->drag.w) && + (new_width >= w->pos_hints.base_width) && + (new_width <= w->pos_hints.max_width) && + (new_height != w->drag.h) && + (new_height >= w->pos_hints.base_height) && + (new_height <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x, w->drag.y - (new_height - w->drag.h), new_width, new_height); + } + else + { + if (((w->drag.w + dw) >= w->pos_hints.min_width) && + ((w->drag.w + dw) <= w->pos_hints.max_width) && + ((w->drag.h - dh) >= w->pos_hints.min_height) && + ((w->drag.h - dh) <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dh, w->drag.w + dw, w->drag.h - dh); + } + return EINA_TRUE; + } + if (w->drag.type == HTBOTTOMLEFT) + { + int dh; + int dw; + + dw = ptx - w->drag.px; + dh = pty - w->drag.py; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_width; + int new_height; + + new_width = w->pos_hints.base_width + ((w->drag.w - w->pos_hints.base_width - dw) / w->pos_hints.step_width) * w->pos_hints.step_width; + new_height = w->pos_hints.base_height + ((w->drag.h - w->pos_hints.base_height + dh) / w->pos_hints.step_height) * w->pos_hints.step_height; + if ((new_width != w->drag.w) && + (new_width >= w->pos_hints.base_width) && + (new_width <= w->pos_hints.max_width) && + (new_height != w->drag.h) && + (new_height >= w->pos_hints.base_height) && + (new_height <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x - (new_width - w->drag.w), w->drag.y, new_width, new_height); + } + else + { + if (((w->drag.w - dw) >= w->pos_hints.min_width) && + ((w->drag.w - dw) <= w->pos_hints.max_width) && + ((w->drag.h + dh) >= w->pos_hints.min_height) && + ((w->drag.h + dh) <= w->pos_hints.max_height)) + ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y, w->drag.w - dw, w->drag.h + dh); + } + return EINA_TRUE; + } + if (w->drag.type == HTBOTTOMRIGHT) + { + int dh; + int dw; + + dw = ptx - w->drag.px; + dh = pty - w->drag.py; + + if (w->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE) + { + int new_width; + int new_height; + + new_width = w->pos_hints.base_width + ((w->drag.w - w->pos_hints.base_width + dw) / w->pos_hints.step_width) * w->pos_hints.step_width; + new_height = w->pos_hints.base_height + ((w->drag.h - w->pos_hints.base_height + dh) / w->pos_hints.step_height) * w->pos_hints.step_height; + if ((new_width != w->drag.w) && + (new_width >= w->pos_hints.base_width) && + (new_width <= w->pos_hints.max_width) && + (new_height != w->drag.h) && + (new_height >= w->pos_hints.base_height) && + (new_height <= w->pos_hints.max_height)) + ecore_win32_window_resize(w, new_width, new_height); + } + else + { + if (((w->drag.w + dw) >= w->pos_hints.min_width) && + ((w->drag.w + dw) <= w->pos_hints.max_width) && + ((w->drag.h + dh) >= w->pos_hints.min_height) && + ((w->drag.h + dh) <= w->pos_hints.max_height)) + ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h + dh); + } + return EINA_TRUE; + } + + return EINA_FALSE; +} + /*============================================================================* * API * *============================================================================*/ @@ -194,10 +452,10 @@ ecore_win32_window_new(Ecore_Win32_Window *parent, { INF("creating window with border"); - return ecore_win32_window_internal_new(parent, - x, y, - width, height, - WS_OVERLAPPEDWINDOW | WS_SIZEBOX); + return _ecore_win32_window_internal_new(parent, + x, y, + width, height, + WS_OVERLAPPEDWINDOW | WS_SIZEBOX); } /** @@ -222,10 +480,10 @@ ecore_win32_window_override_new(Ecore_Win32_Window *parent, { INF("creating window without border"); - return ecore_win32_window_internal_new(parent, - x, y, - width, height, - WS_POPUP & ~(WS_CAPTION | WS_THICKFRAME)); + return _ecore_win32_window_internal_new(parent, + x, y, + width, height, + WS_POPUP & ~(WS_CAPTION | WS_THICKFRAME)); } /** @@ -354,21 +612,16 @@ ecore_win32_window_resize(Ecore_Win32_Window *window, int width, int height) { - RECT rect; - DWORD style; - int x; - int y; - int minimal_width; - int minimal_height; + RECT rect; + DWORD style; + int x; + int y; /* FIXME: on fullscreen, should not resize it */ if (!window) return; INF("resizing window (%dx%d)", width, height); - minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)window->min_width); - minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)window->min_height); - if (!GetWindowRect(window->window, &rect)) { ERR("GetWindowRect() failed"); @@ -379,10 +632,10 @@ ecore_win32_window_resize(Ecore_Win32_Window *window, y = rect.top; rect.left = 0; rect.top = 0; - if (width < minimal_width) width = minimal_width; - if (width > (int)window->max_width) width = window->max_width; - if (height < minimal_height) height = minimal_height; - if (height > (int)window->max_height) height = window->max_height; + if (width < window->pos_hints.min_width) width = window->pos_hints.min_width; + if (width > window->pos_hints.max_width) width = window->pos_hints.max_width; + if (height < window->pos_hints.min_height) height = window->pos_hints.min_height; + if (height > window->pos_hints.max_height) height = window->pos_hints.max_height; rect.right = width; rect.bottom = height; if (!(style = GetWindowLong(window->window, GWL_STYLE))) @@ -425,25 +678,20 @@ ecore_win32_window_move_resize(Ecore_Win32_Window *window, int width, int height) { - RECT rect; - DWORD style; - int minimal_width; - int minimal_height; + RECT rect; + DWORD style; /* FIXME: on fullscreen, should not move/resize it */ if (!window) return; INF("moving and resizing window (%dx%d %dx%d)", x, y, width, height); - minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)window->min_width); - minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)window->min_height); - rect.left = 0; rect.top = 0; - if (width < minimal_width) width = minimal_width; - if (width > (int)window->max_width) width = window->max_width; - if (height < minimal_height) height = minimal_height; - if (height > (int)window->max_height) height = window->max_height; + if (width < window->pos_hints.min_width) width = window->pos_hints.min_width; + if (width > window->pos_hints.max_width) width = window->pos_hints.max_width; + if (height < window->pos_hints.min_height) height = window->pos_hints.min_height; + if (height > window->pos_hints.max_height) height = window->pos_hints.max_height; rect.right = width; rect.bottom = height; if (!(style = GetWindowLong(window->window, GWL_STYLE))) @@ -499,8 +747,8 @@ ecore_win32_window_geometry_get(Ecore_Win32_Window *window, { if (x) *x = 0; if (y) *y = 0; - if (width) *width = GetSystemMetrics(SM_CXSCREEN); - if (height) *height = GetSystemMetrics(SM_CYSCREEN); + if (width) *width = 0; + if (height) *height = 0; return; } @@ -563,8 +811,8 @@ ecore_win32_window_size_get(Ecore_Win32_Window *window, if (!window) { - if (width) *width = GetSystemMetrics(SM_CXSCREEN); - if (height) *height = GetSystemMetrics(SM_CYSCREEN); + if (width) *width = 0; + if (height) *height = 0; return; } @@ -594,14 +842,27 @@ ecore_win32_window_size_get(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_min_set(Ecore_Win32_Window *window, - unsigned int min_width, - unsigned int min_height) + int min_width, + int min_height) { if (!window) return; - printf ("ecore_win32_window_size_min_set : %p %d %d\n", window, min_width, min_height); - window->min_width = min_width; - window->min_height = min_height; + INF("setting minimum window size to %dx%d", min_width, min_height); + + if ((min_width > 0) && (min_height > 0)) + { + if (min_width < window->mininal_window_width) + min_width = window->mininal_window_width; + + window->pos_hints.flags |= ECORE_WIN32_POS_HINTS_MIN_SIZE; + window->pos_hints.min_width = min_width; + window->pos_hints.min_height = min_height; + if (!(window->pos_hints.flags & ECORE_WIN32_POS_HINTS_BASE_SIZE)) + { + window->pos_hints.base_width = min_width; + window->pos_hints.base_height = min_height; + } + } } /** @@ -617,14 +878,20 @@ ecore_win32_window_size_min_set(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_min_get(Ecore_Win32_Window *window, - unsigned int *min_width, - unsigned int *min_height) + int *min_width, + int *min_height) { - if (!window) return; + if (!window || !(window->pos_hints.flags & ECORE_WIN32_POS_HINTS_MIN_SIZE)) + { + if (min_width) *min_width = 0; + if (min_height) *min_height = 0; + return; + } + + INF("getting minimum window size: %dx%d", window->pos_hints.min_width, window->pos_hints.min_height); - printf ("ecore_win32_window_size_min_get : %p %d %d\n", window, window->min_width, window->min_height); - if (min_width) *min_width = window->min_width; - if (min_height) *min_height = window->min_height; + if (min_width) *min_width = window->pos_hints.min_width; + if (min_height) *min_height = window->pos_hints.min_height; } /** @@ -640,14 +907,19 @@ ecore_win32_window_size_min_get(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_max_set(Ecore_Win32_Window *window, - unsigned int max_width, - unsigned int max_height) + int max_width, + int max_height) { if (!window) return; - printf ("ecore_win32_window_size_max_set : %p %d %d\n", window, max_width, max_height); - window->max_width = max_width; - window->max_height = max_height; + INF("setting maximum window size to %dx%d", max_width, max_height); + + if ((max_width > 0) && (max_height > 0)) + { + window->pos_hints.flags |= ECORE_WIN32_POS_HINTS_MAX_SIZE; + window->pos_hints.max_width = max_width; + window->pos_hints.max_height = max_height; + } } /** @@ -663,14 +935,20 @@ ecore_win32_window_size_max_set(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_max_get(Ecore_Win32_Window *window, - unsigned int *max_width, - unsigned int *max_height) + int *max_width, + int *max_height) { - if (!window) return; + if (!window || !(window->pos_hints.flags & ECORE_WIN32_POS_HINTS_MAX_SIZE)) + { + if (max_width) *max_width = 0; + if (max_height) *max_height = 0; + return; + } - printf ("ecore_win32_window_size_max_get : %p %d %d\n", window, window->max_width, window->max_height); - if (max_width) *max_width = window->max_width; - if (max_height) *max_height = window->max_height; + INF("getting maximum window size: %dx%d", window->pos_hints.max_width, window->pos_hints.max_height); + + if (max_width) *max_width = window->pos_hints.max_width; + if (max_height) *max_height = window->pos_hints.max_height; } /** @@ -686,14 +964,19 @@ ecore_win32_window_size_max_get(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_base_set(Ecore_Win32_Window *window, - unsigned int base_width, - unsigned int base_height) + int base_width, + int base_height) { - printf ("ecore_win32_window_size_base_set : %p %d %d\n", window, base_width, base_height); if (!window) return; - window->base_width = base_width; - window->base_height = base_height; + INF("setting base window size to %dx%d", base_width, base_height); + + if ((base_width > 0) && (base_height > 0)) + { + window->pos_hints.flags |= ECORE_WIN32_POS_HINTS_BASE_SIZE; + window->pos_hints.base_width = base_width; + window->pos_hints.base_height = base_height; + } } /** @@ -709,14 +992,20 @@ ecore_win32_window_size_base_set(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_base_get(Ecore_Win32_Window *window, - unsigned int *base_width, - unsigned int *base_height) + int *base_width, + int *base_height) { - if (!window) return; + if (!window || !(window->pos_hints.flags & ECORE_WIN32_POS_HINTS_BASE_SIZE)) + { + if (base_width) *base_width = 0; + if (base_height) *base_height = 0; + return; + } + + INF("getting base window size: %dx%d", window->pos_hints.base_width, window->pos_hints.base_height); - printf ("ecore_win32_window_size_base_get : %p %d %d\n", window, window->base_width, window->base_height); - if (base_width) *base_width = window->base_width; - if (base_height) *base_height = window->base_height; + if (base_width) *base_width = window->pos_hints.base_width; + if (base_height) *base_height = window->pos_hints.base_height; } /** @@ -732,14 +1021,19 @@ ecore_win32_window_size_base_get(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_step_set(Ecore_Win32_Window *window, - unsigned int step_width, - unsigned int step_height) + int step_width, + int step_height) { - printf ("ecore_win32_window_size_step_set : %p %d %d\n", window, step_width, step_height); if (!window) return; - window->step_width = step_width; - window->step_height = step_height; + INF("setting step window size to %dx%d", step_width, step_height); + + if ((step_width > 0) && (step_height > 0)) + { + window->pos_hints.flags |= ECORE_WIN32_POS_HINTS_STEP_SIZE; + window->pos_hints.step_width = step_width; + window->pos_hints.step_height = step_height; + } } /** @@ -755,14 +1049,20 @@ ecore_win32_window_size_step_set(Ecore_Win32_Window *window, */ EAPI void ecore_win32_window_size_step_get(Ecore_Win32_Window *window, - unsigned int *step_width, - unsigned int *step_height) + int *step_width, + int *step_height) { - if (!window) return; + if (!window || !(window->pos_hints.flags & ECORE_WIN32_POS_HINTS_STEP_SIZE)) + { + if (step_width) *step_width = 0; + if (step_height) *step_height = 0; + return; + } + + INF("getting step window size: %dx%d", window->pos_hints.step_width, window->pos_hints.step_height); - printf ("ecore_win32_window_size_step_get : %p %d %d\n", window, window->step_width, window->step_height); - if (step_width) *step_width = window->step_width; - if (step_height) *step_height = window->step_height; + if (step_width) *step_width = window->pos_hints.step_width; + if (step_height) *step_height = window->pos_hints.step_height; } /** --
