summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-06-19 16:48:18 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-06-19 16:48:18 +0200
commitcdc67e80ac78d08aee04bbc55ece650579beba6c (patch)
tree13089be9354afbd6573ed001403dbdcf3423054e
parent253b9857e7b4317275b50795ddc53508e1cbd181 (diff)
add functions for centering a toplevel window on the monitor
-rw-r--r--alf/alf.h12
-rw-r--r--alf/alfcompat.cpp37
-rw-r--r--alf/alfcompat.h4
-rw-r--r--alf/alftoplevel.cpp63
-rw-r--r--widgetfactory.cpp7
5 files changed, 122 insertions, 1 deletions
diff --git a/alf/alf.h b/alf/alf.h
index db0481f..6140e60 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -470,6 +470,18 @@ ALF_Toplevel_SetDefaultButton(HWND win, WORD id);
void
ALF_Toplevel_SetDefaultFont(HWND toplevel);
+void
+ALF_Toplevel_CenterOnMonitor(HWND toplevel, HMONITOR monitor);
+
+void
+ALF_Toplevel_CenterOnCurrentMonitor(HWND toplevel);
+
+void
+ALF_Toplevel_CenterOnOwnerMonitor(HWND toplevel);
+
+void
+ALF_Toplevel_CenterOnPrimaryMonitor(HWND toplevel);
+
// label
HWND
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp
index 7b30eac..45f5f4a 100644
--- a/alf/alfcompat.cpp
+++ b/alf/alfcompat.cpp
@@ -492,6 +492,37 @@ ALF_Compat_fallbackLoadIconWithScaleDown(HINSTANCE hinst,
return E_NOTIMPL;
}
+static BOOL WINAPI
+ALF_Compat_fallbackGetMonitorInfoA(HMONITOR monitor, MONITORINFO *lpmi)
+{
+ if (monitor != (HMONITOR)0x12340042 || !lpmi || lpmi->cbSize != sizeof(MONITORINFO))
+ return FALSE;
+
+ lpmi->rcMonitor.left = 0;
+ lpmi->rcMonitor.top = 0;
+ lpmi->rcMonitor.right = GetSystemMetrics(SM_CXSCREEN);
+ lpmi->rcMonitor.bottom = GetSystemMetrics(SM_CYSCREEN);
+ SystemParametersInfoA(SPI_GETWORKAREA, 0, &lpmi->rcWork, 0);
+ lpmi->dwFlags = MONITORINFOF_PRIMARY;
+ return TRUE;
+}
+
+static HMONITOR WINAPI ALF_Compat_fallbackMonitorFromPoint(POINT pt, DWORD flags)
+{
+ (void)pt;
+ (void)flags;
+
+ return (HMONITOR)0x12340042; // like multimon.h
+}
+
+static HMONITOR WINAPI ALF_Compat_fallbackMonitorFromWindow(HWND window, DWORD flags)
+{
+ (void)window;
+ (void)flags;
+
+ return (HMONITOR)0x12340042; // like multimon.h
+}
+
static BOOL CALLBACK
ALF_Compat_DrawDisabledText_DrawStateProc(HDC hdc,
@@ -603,6 +634,9 @@ void ALF_LoadCompatFunctions(void)
LOAD_FUNC(user32, AdjustWindowRectExForDpi);
LOAD_FUNC(user32, GetSystemMetricsForDpi);
LOAD_FUNC(user32, SystemParametersInfoForDpi);
+ LOAD_FUNC(user32, GetMonitorInfoA);
+ LOAD_FUNC(user32, MonitorFromPoint);
+ LOAD_FUNC(user32, MonitorFromWindow);
*((FARPROC*)&ALF_Compat_TrackMouseEvent) = GetProcAddress(_alf_dll_comctl32, "_TrackMouseEvent");
if (!ALF_Compat_TrackMouseEvent)
@@ -761,3 +795,6 @@ HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,D
HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*) = NULL;
HRESULT (WINAPI *ALF_Compat_GetThemeMargins)(HTHEME,HDC,int,int,int,const RECT *,MARGINS *) = NULL;
HRESULT (WINAPI *ALF_Compat_LoadIconWithScaleDown)(HINSTANCE,PCWSTR,int,int,HICON *) = NULL;
+BOOL (WINAPI *ALF_Compat_GetMonitorInfoA)(HMONITOR,MONITORINFO *) = NULL;
+HMONITOR (WINAPI *ALF_Compat_MonitorFromPoint)(POINT,DWORD) = NULL;
+HMONITOR (WINAPI *ALF_Compat_MonitorFromWindow)(HWND,DWORD) = NULL;
diff --git a/alf/alfcompat.h b/alf/alfcompat.h
index e839df4..8acdbc6 100644
--- a/alf/alfcompat.h
+++ b/alf/alfcompat.h
@@ -138,7 +138,9 @@ extern HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,in
extern HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*);
extern HRESULT (WINAPI *ALF_Compat_GetThemeMargins)(HTHEME,HDC,int,int,int,const RECT *,MARGINS *);
extern HRESULT (WINAPI *ALF_Compat_LoadIconWithScaleDown)(HINSTANCE,PCWSTR,int,int,HICON *);
-
+extern BOOL (WINAPI *ALF_Compat_GetMonitorInfoA)(HMONITOR,MONITORINFO *);
+extern HMONITOR (WINAPI *ALF_Compat_MonitorFromPoint)(POINT,DWORD);
+extern HMONITOR (WINAPI *ALF_Compat_MonitorFromWindow)(HWND,DWORD);
// compatibility bits
diff --git a/alf/alftoplevel.cpp b/alf/alftoplevel.cpp
index 11e8599..0747ea2 100644
--- a/alf/alftoplevel.cpp
+++ b/alf/alftoplevel.cpp
@@ -594,6 +594,69 @@ ALF_Toplevel_SetDefaultFont(HWND toplevel)
SendMessage(toplevel, ALF_WM_TPLVL_SETDEFFONT, 0, 0);
}
+void
+ALF_Toplevel_CenterOnMonitor(HWND toplevel, HMONITOR monitor)
+{
+ MONITORINFO mi;
+ ZeroMemory(&mi, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+
+ if (ALF_Compat_GetMonitorInfoA(monitor, &mi)) {
+ MINMAXINFO i;
+ ZeroMemory(&i, sizeof(i));
+ SendMessage(toplevel, WM_GETMINMAXINFO, 0, (LPARAM)&i);
+
+ RECT rcWindow = {0,0,0,0};
+ GetWindowRect(toplevel, &rcWindow);
+
+ int width = rcWindow.right - rcWindow.left;
+ if (width < i.ptMinTrackSize.x)
+ width = i.ptMinTrackSize.x;
+
+ int height = rcWindow.bottom - rcWindow.top;
+ if (height < i.ptMinTrackSize.y)
+ height = i.ptMinTrackSize.y;
+
+ RECT rcTarget;
+ rcTarget.left = (mi.rcWork.left + mi.rcWork.right - width) / 2;
+ rcTarget.top = (mi.rcWork.top + mi.rcWork.bottom - height) / 2;
+ rcTarget.right = rcTarget.left + width;
+ rcTarget.bottom = rcTarget.top + height;
+
+ OffsetRect(&rcTarget, mi.rcMonitor.left - mi.rcWork.left, mi.rcMonitor.top - mi.rcWork.top);
+
+ WINDOWPLACEMENT wp;
+ ZeroMemory(&wp, sizeof(wp));
+ wp.length = sizeof(wp);
+
+ GetWindowPlacement(toplevel, &wp);
+
+ wp.rcNormalPosition = rcTarget;
+
+ SetWindowPlacement(toplevel, &wp);
+ }
+}
+
+void
+ALF_Toplevel_CenterOnCurrentMonitor(HWND toplevel)
+{
+ ALF_Toplevel_CenterOnMonitor(toplevel, ALF_Compat_MonitorFromWindow(toplevel, MONITOR_DEFAULTTONEAREST));
+}
+
+void
+ALF_Toplevel_CenterOnOwnerMonitor(HWND toplevel)
+{
+ HWND hwndOwner = GetParent(toplevel);
+ ALF_Toplevel_CenterOnMonitor(toplevel, ALF_Compat_MonitorFromWindow(hwndOwner, MONITOR_DEFAULTTONEAREST));
+}
+
+void
+ALF_Toplevel_CenterOnPrimaryMonitor(HWND toplevel)
+{
+ POINT ptZero = { 0, 0 };
+ ALF_Toplevel_CenterOnMonitor(toplevel, ALF_Compat_MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY));
+}
+
ALFApplication *
ALF_CreateApplication(void)
{
diff --git a/widgetfactory.cpp b/widgetfactory.cpp
index ab362f1..cc3ede9 100644
--- a/widgetfactory.cpp
+++ b/widgetfactory.cpp
@@ -39,6 +39,7 @@ enum {
IDM_BACKGROUND_GRADIENT,
IDM_BACKGROUND_GREEN,
IDM_BACKGROUND_BLUE,
+ IDM_CENTER_ON_MONITOR,
IDM_PANES,
IDM_PANES__MAX = IDM_PANES + PANE__MAX,
IDM_MODALDIALOG_PANES,
@@ -893,6 +894,10 @@ handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid,
wfModelessDialogStart(paneId);
}
+ if (sourceid == IDM_CENTER_ON_MONITOR) {
+ ALF_Toplevel_CenterOnCurrentMonitor(window);
+ }
+
return 0;
}
@@ -1083,6 +1088,8 @@ WinMain
AppendMenu(filemenu, MF_SEPARATOR, 0, 0);
AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4"));
+ AppendMenu(helpmenu, MF_STRING, IDM_CENTER_ON_MONITOR, TEXT("Center Window"));
+ AppendMenu(helpmenu, MF_SEPARATOR, 0, 0);
AppendMenu(helpmenu, MF_STRING, IDM_HELP_ABOUT, TEXT("&About"));
AppendMenu(bgmenu, MF_STRING, IDM_BACKGROUND_INHERIT, TEXT("(Default)"));