summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-28 00:12:09 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-28 00:12:09 +0200
commit46326d57e0c912f265595ffed375d211bbe23f44 (patch)
treee9233699ebd9ba9a213933e2ba1700e32e00acef
parent17709f1fc7979b9b37f03963770b175b7c32a62c (diff)
minor rotations on window initialization, ALF_EnsureWindowBigEnough
-rw-r--r--alf/alf.h3
-rw-r--r--alf/alfwindow.cpp83
-rw-r--r--widgetfactory.cpp3
3 files changed, 57 insertions, 32 deletions
diff --git a/alf/alf.h b/alf/alf.h
index e1ad26e..391f62a 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -174,6 +174,9 @@ ALF_GetDpi(HWND hwnd);
LRESULT
ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
+void
+ALF_EnsureWindowBigEnough(HWND toplevel);
+
HWND
ALF_AddLabel(HWND win, WORD id, int x, int y, const TCHAR *text);
diff --git a/alf/alfwindow.cpp b/alf/alfwindow.cpp
index 15b635b..3434cf5 100644
--- a/alf/alfwindow.cpp
+++ b/alf/alfwindow.cpp
@@ -7,7 +7,6 @@ typedef struct {
ALFLayout layout;
HWND hwndFocus;
HFONT hMessageFont;
- WORD defid;
} ALFWindowPriv;
struct ALFWindow_CreateParams{
@@ -18,21 +17,18 @@ struct ALFWindow_CreateParams{
TCHAR _alf_windowClass[28] = {0};
static void
-ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv, struct ALFWindow_CreateParams *params)
+ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv)
{
(void)hwnd;
- priv->vtbl = params->vtbl;
- priv->closure = params->closure;
ALF_Layout_Init(&priv->layout);
priv->layout.bgcolor = ALF_COLOR_SYS(COLOR_BTNFACE);
- priv->defid = IDOK;
}
static void
ALF_DestroyWindowPriv(ALFWindowPriv *priv)
{
- if (priv->vtbl->postdestroy)
+ if (priv->vtbl && priv->vtbl->postdestroy)
priv->vtbl->postdestroy(priv->closure);
ALF_Layout_Clear(&priv->layout);
@@ -92,6 +88,30 @@ ALF_PreTranslateMessagePriv(HWND win, ALFWindowPriv *priv, MSG *message)
return ret;
}*/
+void
+ALF_EnsureWindowBigEnough(HWND toplevel)
+{
+ MINMAXINFO i;
+ ZeroMemory(&i, sizeof(i));
+ SendMessage(toplevel, WM_GETMINMAXINFO, 0, (LPARAM)&i);
+
+ WINDOWPLACEMENT wp;
+ ZeroMemory(&wp, sizeof(wp));
+ wp.length = sizeof(wp);
+
+ GetWindowPlacement(toplevel, &wp);
+
+ if (wp.rcNormalPosition.right - wp.rcNormalPosition.left < i.ptMinTrackSize.x ||
+ wp.rcNormalPosition.bottom - wp.rcNormalPosition.top < i.ptMinTrackSize.y) {
+ if (wp.rcNormalPosition.right - wp.rcNormalPosition.left < i.ptMinTrackSize.x)
+ wp.rcNormalPosition.right = wp.rcNormalPosition.left + i.ptMinTrackSize.x;
+ if (wp.rcNormalPosition.bottom - wp.rcNormalPosition.top < i.ptMinTrackSize.y)
+ wp.rcNormalPosition.bottom = wp.rcNormalPosition.top + i.ptMinTrackSize.y;
+
+ SetWindowPlacement(toplevel, &wp);
+ }
+}
+
static INT_PTR CALLBACK
ALF_Window_DlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
@@ -107,27 +127,18 @@ ALF_Window_DlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
static LRESULT CALLBACK
ALF_WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
- if (msg == WM_INITDIALOG) {
- struct ALFWindow_CreateParams *params = (struct ALFWindow_CreateParams *)lparam;
-
+ if (msg == WM_CREATE) {
ALFWindowPriv *priv = ALF_New(ALFWindowPriv, 1);
SetWindowLongPtr(hwnd, DLGWINDOWEXTRA, (LONG_PTR)priv);
- ALF_InitializeWindowPriv(hwnd, priv, params);
+ ALF_InitializeWindowPriv(hwnd, priv);
int dpi = (int)ALF_Compat_GetDpiForWindow(hwnd);
SendMessage(hwnd, ALF_WM_DPICHANGE, 0, (LPARAM)dpi); // will also update fonts
-
- // TODO: after initializing, update window size and layout
- if (priv->vtbl && priv->vtbl->initialize) {
- return priv->vtbl->initialize(priv->closure, hwnd);
- } else {
- return TRUE;
- }
}
ALFWindowPriv *priv = (ALFWindowPriv*)(void*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA);
if (priv != NULL) {
- if (priv->vtbl->message) {
+ if (priv->vtbl && priv->vtbl->message) {
return priv->vtbl->message(priv->closure, hwnd, msg, wparam, lparam);
} else {
return ALF_DefWindowProc(hwnd, msg, wparam, lparam);
@@ -152,6 +163,22 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
ALFWindowPriv *priv = (ALFWindowPriv*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA);
+ if (msg == WM_INITDIALOG) {
+ struct ALFWindow_CreateParams *params = (struct ALFWindow_CreateParams *)lparam;
+
+ priv->vtbl = params->vtbl;
+ priv->closure = params->closure;
+
+ BOOL retval = TRUE;
+ if (priv->vtbl && priv->vtbl->initialize) {
+ retval = priv->vtbl->initialize(priv->closure, hwnd);
+ }
+
+ ALF_EnsureWindowBigEnough(hwnd);
+
+ return retval;
+ }
+
if (msg == ALF_WM_GETMODALRESULT) {
return (LRESULT)priv->modalResult;
}
@@ -200,7 +227,7 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
if (source != 0)
ret = SendMessage(source, 0x2000 + WM_COMMAND, wparam, lparam);
- if (ret == 0 && priv->vtbl->command)
+ if (ret == 0 && priv->vtbl && priv->vtbl->command)
ret = priv->vtbl->command(priv->closure, hwnd, code, id, source);
return ret;
@@ -213,7 +240,7 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
if (nmhdr->hwndFrom)
ret = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam);
- if (ret == 0 && priv->vtbl->notify)
+ if (ret == 0 && priv->vtbl && priv->vtbl->notify)
ret = priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr);
return ret;
@@ -287,12 +314,12 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
}
}
- if (msg == WM_DESTROY && priv->vtbl->destroy) {
+ if (msg == WM_DESTROY && priv->vtbl && priv->vtbl->destroy) {
priv->vtbl->destroy(priv->closure, hwnd);
}
if (msg == WM_CLOSE) {
- if (!priv->vtbl->close || !priv->vtbl->close(priv->closure, hwnd)) {
+ if (!priv->vtbl || !priv->vtbl->close || !priv->vtbl->close(priv->closure, hwnd)) {
priv->modalResult = 2;
ShowWindow(hwnd, FALSE);
}
@@ -328,12 +355,8 @@ ALF_DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
LRESULT ret = 0;
if (ALF_Layout_HandleMessage(&priv->layout, hwnd, msg, wparam, lparam, &ret)) {
// if the layout was changed, our current size might be too small
- // windows will call WM_GETMINMAXINFO and fix it
if (msg == ALF_WM_VALIDATELAYOUT) {
- RECT r;
- if (GetWindowRect(hwnd, &r)) {
- SetWindowPos(hwnd, NULL, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER);
- }
+ ALF_EnsureWindowBigEnough(hwnd);
}
if (msg == ALF_WM_DPICHANGE) {
@@ -379,12 +402,12 @@ ALF_CreateToplevelWindow(HWND hwndParent, ALFWindowVTable *vtbl, void *closure)
} t;
#pragma pack(pop)
ZeroMemory(&t, sizeof(t));
- t.t.style = WS_OVERLAPPEDWINDOW | DS_CENTER;
+ t.t.style = WS_OVERLAPPEDWINDOW;
t.t.dwExtendedStyle = 0;
t.t.x = 0;
t.t.y = 0;
- t.t.cx = 200;
- t.t.cy = 80;
+ t.t.cx = 10;
+ t.t.cy = 10;
t.t.cdit = 0;
// NOTE: this only works because we know the window class name is all ascii
diff --git a/widgetfactory.cpp b/widgetfactory.cpp
index db720ac..69d0c48 100644
--- a/widgetfactory.cpp
+++ b/widgetfactory.cpp
@@ -867,8 +867,6 @@ WinMain
ALF_SetDefaultButton(win, ID_HELLO);
ALF_SetFocus(GetNextDlgTabItem(win, win, FALSE));
- ALF_ResizeWindow(win, 1, 1);
-
HMENU mainmenu = CreateMenu();
HMENU filemenu = CreateMenu();
HMENU newtabmn = CreateMenu();
@@ -898,6 +896,7 @@ WinMain
SetMenu(win, mainmenu);
+ ALF_EnsureWindowBigEnough(win);
ALF_ShowModal(win);
ALF_DestroyWindow(win);