summaryrefslogtreecommitdiff
path: root/alf/alftoplevel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alf/alftoplevel.cpp')
-rw-r--r--alf/alftoplevel.cpp63
1 files changed, 63 insertions, 0 deletions
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)
{