summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Krauter <trustablecode@gmail.com>2019-11-28 14:08:31 +0100
committerSimon Krauter <trustablecode@gmail.com>2019-11-28 14:08:31 +0100
commit3841f1770ba68c7f1fea5960b5a812ac00f7e513 (patch)
tree9edc9063e7eb8cddbc4241f2529008e6b95226d0
parente2b8ffbecf2edf004049757850c9cb79450fdd91 (diff)
downloadNiGui-3841f1770ba68c7f1fea5960b5a812ac00f7e513.tar.gz
NiGui-3841f1770ba68c7f1fea5960b5a812ac00f7e513.zip
Windows: Center window on the screen which has the mouse cursor
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim22
-rwxr-xr-xsrc/nigui/private/windows/windows.nim4
2 files changed, 13 insertions, 13 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index 28759ca..80368c6 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -892,18 +892,16 @@ method `y=`(window: WindowImpl, y: int) =
window.pUpdatePosition()
method centerOnScreen(window: WindowImpl) =
- var rect: Rect
- discard SystemParametersInfoW(SPI_GETWORKAREA, 0, rect.addr, 0)
- window.fX = rect.left + (rect.right - window.width) div 2
- window.fY = rect.top + (rect.bottom - window.height) div 2
- window.pUpdatePosition()
-
- # TODO: regard multiple monitors
- # var m = MonitorFromRect(rect, 0)
- # var mi: MonitorInfo
- # discard GetMonitorInfoA(m, mi)
- # echo "GetMonitorInfoA: " & $mi.rcMonitor.left
- # echo "GetMonitorInfoA: " & $mi.rcWork.left
+ # center on the screen which has the mouse cursor
+ var cursorPos: Point
+ discard GetCursorPos(cursorPos)
+ var monitorHandle = MonitorFromPoint(cursorPos, 0)
+ var mi: MonitorInfo
+ mi.cbSize = MonitorInfo.sizeOf.int32
+ if GetMonitorInfoA(monitorHandle, mi):
+ window.fX = mi.rcWork.left + (mi.rcWork.right - mi.rcWork.left - window.width) div 2
+ window.fY = mi.rcWork.top + (mi.rcWork.bottom - mi.rcWork.top - window.height) div 2
+ window.pUpdatePosition()
method `width=`*(window: WindowImpl, width: int) =
procCall window.Window.`width=`(width)
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index cc0ad71..634af9c 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -429,7 +429,7 @@ proc GetSysColor*(nIndex: int32): RGB32 {.importc, libUser32.}
proc InvalidateRect*(hWnd: pointer, lpRect: ref Rect, bErase: bool): bool {.importc, libUser32.}
proc PostQuitMessage*(nExitCode: int32) {.importc, libUser32.}
proc GetDesktopWindow*(): pointer {.importc, libUser32.}
-proc SystemParametersInfoW*(uiAction, uiParam: int32, pvParam: pointer, fWinIni: int32): bool {.importc, libUser32.}
+# proc SystemParametersInfoW*(uiAction, uiParam: int32, pvParam: pointer, fWinIni: int32): bool {.importc, libUser32.}
proc ClientToScreen*(hWnd: pointer, lpPoint: var Point): bool {.importc, libUser32.}
proc AdjustWindowRect*(lpRect: var Rect, dwStyle: int32, bMenu: bool): bool {.importc, libUser32.}
proc LoadCursorA*(hInstance: pointer, lpCursorName: cstring): pointer {.importc, libUser32.}
@@ -458,6 +458,8 @@ proc GetClipboardData*(uFormat: int32): pointer {.importc, libUser32.}
proc SetClipboardData*(uFormat: int32, hMem: pointer): pointer {.importc, libUser32.}
proc EmptyClipboard*(): bool {.importc, libUser32.}
proc MapVirtualKeyW*(uCode, uMapType: int32): int32 {.importc, libUser32.}
+proc GetCursorPos*(lpPoint: var Point): bool {.importc, libUser32.}
+proc MonitorFromPoint*(pt: Point, dwFlags: int32): pointer {.importc, libUser32.}
type GetDpiForWindowType* = proc(hWnd: pointer): int32 {.gcsafe, stdcall.} # not available on Windows 7