diff options
| -rw-r--r-- | alf/alf.h | 12 | ||||
| -rw-r--r-- | alf/alfcompat.cpp | 37 | ||||
| -rw-r--r-- | alf/alfcompat.h | 4 | ||||
| -rw-r--r-- | alf/alftoplevel.cpp | 63 | ||||
| -rw-r--r-- | widgetfactory.cpp | 7 |
5 files changed, 122 insertions, 1 deletions
@@ -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)")); |
