summaryrefslogtreecommitdiff
path: root/alf/alfwindow.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-30 16:16:50 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-30 16:17:38 +0200
commit379e9fd3a72fbf5f136443284bc6a2d81bb828fa (patch)
tree74c0874be87dd342e7baf36a60b60b1c8f49f9ce /alf/alfwindow.cpp
parentf9cfbb8870a023478d52fd03c90abcbed9c49304 (diff)
toplevel: rename and reorganize functions
Diffstat (limited to 'alf/alfwindow.cpp')
-rw-r--r--alf/alfwindow.cpp424
1 files changed, 0 insertions, 424 deletions
diff --git a/alf/alfwindow.cpp b/alf/alfwindow.cpp
deleted file mode 100644
index f59e784..0000000
--- a/alf/alfwindow.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-#include "alfpriv.h"
-
-typedef struct {
- ALFWindowVTable *vtbl;
- void *closure;
- int modalResult;
- ALFLayout layout;
- HWND hwndFocus;
- HFONT hMessageFont;
-} ALFWindowPriv;
-
-struct ALFWindow_CreateParams{
- ALFWindowVTable *vtbl;
- void *closure;
-};
-
-TCHAR _alf_windowClass[28] = {0};
-
-static void
-ALF_InitializeWindowPriv(HWND hwnd, ALFWindowPriv *priv)
-{
- (void)hwnd;
-
- ALF_Layout_Init(&priv->layout);
- priv->layout.bgcolor = ALF_COLOR_SYS(COLOR_BTNFACE);
-}
-
-static void
-ALF_DestroyWindowPriv(ALFWindowPriv *priv)
-{
- if (priv->vtbl && priv->vtbl->postdestroy)
- priv->vtbl->postdestroy(priv->closure);
-
- ALF_Layout_Clear(&priv->layout);
-
- if (priv->hMessageFont)
- DeleteObject(priv->hMessageFont);
-
- ALF_Free(priv);
-}
-
-static void
-ALF_UpdateFontsPriv(HWND win, ALFWindowPriv *priv)
-{
- // XXX: SystemParametersInfoForDpi is Unicode-only and needs Vista+ NONCLIENTMETRICS,
- ALF_NONCLIENTMETRICSW_VISTA ncm;
- ZeroMemory(&ncm, sizeof(ncm));
- ncm.cbSize = sizeof(ncm);
-
- LOGFONT lfMessageFont;
- ZeroMemory(&lfMessageFont, sizeof(lfMessageFont));
-
- if (ALF_Compat_SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0, (UINT)priv->layout.dpi)) {
-#ifdef UNICODE
- lfMessageFont = ncm.lfMessageFont;
-#else
- ALF_Compat_LogFontWtoA(&ncm.lfMessageFont, &lfMessageFont);
-#endif
- } else {
- // FIXME! fallback to default font, 8pt MS Shell Dlg
- ZeroMemory(&lfMessageFont, sizeof(lfMessageFont));
-
- lfMessageFont.lfHeight = -MulDiv(8, priv->layout.dpi, 72);
- lstrcpy(lfMessageFont.lfFaceName, TEXT("MS Shell Dlg"));
- }
-
- if (priv->hMessageFont) {
- DeleteObject(priv->hMessageFont);
- }
-
- priv->hMessageFont = CreateFontIndirect(&lfMessageFont);
-
- SendMessage(win, WM_SETFONT, (WPARAM)priv->hMessageFont, (LPARAM)1);
-}
-
-
-/*static BOOL
-ALF_PreTranslateMessagePriv(HWND win, ALFWindowPriv *priv, MSG *message)
-{
- BOOL ret = FALSE;
-
- if (priv->vtbl->pretranslatemessage)
- ret = priv->vtbl->pretranslatemessage(priv->closure, win, message);
-
- if (!ret)
- ret = IsDialogMessage(win, 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)
-{
- (void)hwnd;
- (void)msg;
- (void)wparam;
- (void)lparam;
-
- return FALSE;
-}
-
-
-static LRESULT CALLBACK
-ALF_WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
-{
- if (msg == WM_CREATE) {
- ALFWindowPriv *priv = ALF_New(ALFWindowPriv, 1);
- SetWindowLongPtr(hwnd, DLGWINDOWEXTRA, (LONG_PTR)priv);
- ALF_InitializeWindowPriv(hwnd, priv);
-
- int dpi = (int)ALF_Compat_GetDpiForWindow(hwnd);
- SendMessage(hwnd, ALF_WM_DPICHANGE, 0, (LPARAM)dpi); // will also update fonts
- }
-
- ALFWindowPriv *priv = (ALFWindowPriv*)(void*)GetWindowLongPtr(hwnd, DLGWINDOWEXTRA);
- if (priv != NULL) {
- if (priv->vtbl && priv->vtbl->message) {
- return priv->vtbl->message(priv->closure, hwnd, msg, wparam, lparam);
- } else {
- return ALF_DefWindowProc(hwnd, msg, wparam, lparam);
- }
- } else {
- return DefDlgProc(hwnd, msg, wparam, lparam);
- }
-}
-
-static void
-ALF_Window_Paint(ALFWindowPriv *priv, HWND hwnd, HDC dc, RECT *r)
-{
- if (priv->vtbl && priv->vtbl->paint) {
- priv->vtbl->paint(priv->closure, hwnd, dc, r);
- } else {
- ALF_FillRect(dc, r, priv->layout.bgcolor);
- }
-}
-
-LRESULT
-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;
- }
- if (msg == ALF_WM_SETMODALRESULT) {
- priv->modalResult = (int)wparam;
- return 0;
- }
-
- if (msg == ALF_WM_GETDPI) {
- return (LRESULT)priv->layout.dpi;
- }
-
- if (msg == ALF_WM_UPDATEFONTS) {
- ALF_UpdateFontsPriv(hwnd, priv);
- return 0;
- }
-
- if (msg == WM_ERASEBKGND) {
- return TRUE; // handled in WM_PAINT
- }
-
- if (msg == WM_PRINTCLIENT) {
- RECT r = { 0, 0, 0, 0 };
- GetClientRect(hwnd, &r);
-
- ALF_Window_Paint(priv, hwnd, (HDC)wparam, &r);
- return TRUE;
- }
-
- if (msg == WM_PAINT) {
- PAINTSTRUCT ps;
- HDC dc = BeginPaint(hwnd, &ps);
-
- ALF_Window_Paint(priv, hwnd, dc, &ps.rcPaint);
-
- EndPaint(hwnd, &ps);
-
- return 0;
- }
-
- if (msg == WM_COMMAND) {
- HWND source = (HWND)lparam;
- WORD code = HIWORD(wparam);
- WORD id = LOWORD(wparam);
- LRESULT ret = 0;
- if (source != 0)
- ret = SendMessage(source, 0x2000 + WM_COMMAND, wparam, lparam);
-
- if (ret == 0 && priv->vtbl && priv->vtbl->command)
- ret = priv->vtbl->command(priv->closure, hwnd, code, id, source);
-
- return ret;
- }
-
- if (msg == WM_NOTIFY) {
- NMHDR *nmhdr = (NMHDR *)lparam;
- LRESULT ret = 0;
-
- if (nmhdr->hwndFrom)
- ret = SendMessage(nmhdr->hwndFrom, 0x2000 + WM_NOTIFY, wparam, lparam);
-
- if (ret == 0 && priv->vtbl && priv->vtbl->notify)
- ret = priv->vtbl->notify(priv->closure, hwnd, wparam, nmhdr);
-
- return ret;
- }
-
- if (msg == WM_DRAWITEM) {
- LPDRAWITEMSTRUCT dis = (DRAWITEMSTRUCT *)lparam;
- LRESULT ret = 0;
- if (wparam && dis->hwndItem) {
- ret = SendMessage(dis->hwndItem, 0x2000 + WM_DRAWITEM, wparam, lparam);
- }
-
- if (ret)
- return ret;
- }
-
- if (msg == WM_CTLCOLORSTATIC) {
- LRESULT ret = SendMessage((HWND)lparam, 0x2000 + WM_CTLCOLORSTATIC, wparam, lparam);
-
- if (ret) {
- return ret;
- } else {
- SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
- SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
- return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
- }
- }
-
- if (msg == WM_CTLCOLORBTN) {
- LRESULT ret = SendMessage((HWND)lparam, 0x2000 + WM_CTLCOLORBTN, wparam, lparam);
-
- if (ret) {
- return ret;
- } else {
- SetBkColor((HDC)wparam, GetSysColor(COLOR_BTNFACE));
- SetTextColor((HDC)wparam, GetSysColor(COLOR_BTNTEXT));
- return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
- }
- }
-
- if (msg == WM_SIZE) {
- ALF_Layout_Apply(&priv->layout, hwnd);
- }
-
- if (msg == WM_SHOWWINDOW) {
- if (wparam)
- ALF_Layout_Validate(&priv->layout, hwnd);
- }
-
- if (msg == WM_GETMINMAXINFO) {
- RECT tmp;
- ZeroMemory(&tmp, sizeof(tmp));
-
- SIZE s;
- ZeroMemory(&s, sizeof(s));
- ALF_Layout_GetMinSize(&priv->layout, hwnd, &s);
-
- tmp.right = s.cx;
- tmp.bottom = s.cy;
-
- if (ALF_Compat_AdjustWindowRectExForDpi(
- &tmp,
- (DWORD)GetWindowLong(hwnd, GWL_STYLE),
- GetMenu(hwnd) != NULL,
- (DWORD)GetWindowLong(hwnd, GWL_EXSTYLE),
- (UINT)priv->layout.dpi)) {
- MINMAXINFO *i = (MINMAXINFO *)lparam;
- i->ptMinTrackSize.x = tmp.right - tmp.left;
- i->ptMinTrackSize.y = tmp.bottom - tmp.top;
- return 0;
- }
- }
-
- if (msg == WM_DESTROY && priv->vtbl && priv->vtbl->destroy) {
- priv->vtbl->destroy(priv->closure, hwnd);
- }
-
- if (msg == WM_CLOSE) {
- if (!priv->vtbl || !priv->vtbl->close || !priv->vtbl->close(priv->closure, hwnd)) {
- priv->modalResult = 2;
- ShowWindow(hwnd, FALSE);
- }
- return TRUE;
- }
-
- if (msg == WM_NCDESTROY) {
- SetWindowLongPtr(hwnd, DLGWINDOWEXTRA, 0);
- ALF_DestroyWindowPriv(priv);
- }
-
- if (msg == WM_DPICHANGED) {
- int dpi = LOWORD(wparam);
- SendMessage(hwnd, ALF_WM_DPICHANGE, 0, (LPARAM)dpi); // will also update fonts and invalidate layout
-
- RECT *r = (RECT*)lparam;
- SetWindowPos(hwnd, NULL, r->left, r->top, r->right-r->left, r->bottom-r->top, SWP_NOACTIVATE|SWP_NOZORDER);
- }
-
- if (msg == WM_THEMECHANGED || msg == WM_SETTINGCHANGE) {
- ALF_UpdateFontsPriv(hwnd, priv);
- ALF_Layout_Invalidate(&priv->layout, hwnd);
- ALF_InvalidateBackground(hwnd);
- InvalidateRect(hwnd, NULL, TRUE);
- }
-
- if (msg == WM_WINDOWPOSCHANGED) {
- if (priv->vtbl->windowposchanged) {
- priv->vtbl->windowposchanged(priv->closure, hwnd, (WINDOWPOS *)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
- if (msg == ALF_WM_VALIDATELAYOUT) {
- ALF_EnsureWindowBigEnough(hwnd);
- }
-
- if (msg == ALF_WM_DPICHANGE) {
- ALF_UpdateFontsPriv(hwnd, priv);
- }
-
- return ret;
- }
-
- return DefDlgProc(hwnd, msg, wparam, lparam);
-}
-
-void
-ALF_RegisterWindowClass(void)
-{
- WNDCLASS cls;
- ZeroMemory(&cls, sizeof(cls));
-
- wsprintf(_alf_windowClass, TEXT("ALFWindow.%p"), (ULONG_PTR)&_alf_windowClass[0]);
-
- cls.style = 0;
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.hbrBackground = NULL;
- cls.lpszClassName = _alf_windowClass;
- cls.cbWndExtra = DLGWINDOWEXTRA + sizeof(void*);
- cls.cbClsExtra = 0;
- cls.lpfnWndProc = ALF_WindowProc;
-
- ATOM classatom = RegisterClass(&cls);
- if (!classatom) {
- MessageBox(NULL, TEXT("FATAL: Couldn't register toplevel window class"), TEXT("DEBUG"), MB_ICONHAND|MB_OK);
- }
-}
-
-HWND
-ALF_CreateToplevelWindow(HWND hwndParent, ALFWindowVTable *vtbl, void *closure)
-{
-#pragma pack(push, 1)
- struct {
- DLGTEMPLATE t;
- WCHAR s[32];
- } t;
-#pragma pack(pop)
- ZeroMemory(&t, sizeof(t));
- t.t.style = WS_OVERLAPPEDWINDOW;
- t.t.dwExtendedStyle = 0;
- t.t.x = 0;
- t.t.y = 0;
- 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
- for (int i = 0; _alf_windowClass[i]; ++i) {
- t.s[i+1] = _alf_windowClass[i];
- }
-
- struct ALFWindow_CreateParams params;
- params.vtbl = vtbl;
- params.closure = closure;
- return CreateDialogIndirectParam(ALF_HINSTANCE, &t.t, hwndParent, ALF_Window_DlgProc, (LPARAM)&params);
-}
-
-