summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2020-05-02 19:31:43 +0200
committertrustable-code <krauter.simon@arcor.de>2020-05-02 19:31:43 +0200
commit3cd60917d261942dff845b3fd7c6fe81ccb82c48 (patch)
tree6f10927d4169e5dcfd8ecbecafa898ac7b79c400
parent4480cd6b13edd9fa6e8f270ebd2ffd6cab8296c7 (diff)
downloadNiGui-3cd60917d261942dff845b3fd7c6fe81ccb82c48.tar.gz
NiGui-3cd60917d261942dff845b3fd7c6fe81ccb82c48.zip
Add methods to get mouse position
-rwxr-xr-xsrc/nigui.nim6
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim1
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim12
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim27
-rwxr-xr-xsrc/nigui/private/windows/windows.nim1
5 files changed, 47 insertions, 0 deletions
diff --git a/src/nigui.nim b/src/nigui.nim
index 96af6f4..82e6282 100755
--- a/src/nigui.nim
+++ b/src/nigui.nim
@@ -689,6 +689,9 @@ method clientHeight*(window: Window): int {.base.}
method iconPath*(window: Window): string {.base.}
method `iconPath=`*(window: Window, iconPath: string) {.base, locks: "unknown".}
+method mousePosition*(window: Window): tuple[x, y: int]
+## Returns the mouse pointer position relative to the given window
+
method closeClick*(window: Window) {.base.}
method handleResizeEvent*(window: Window, event: ResizeEvent) {.base.}
@@ -778,6 +781,9 @@ method wantedWidth*(control: Control): int {.base.}
method wantedHeight*(control: Control): int {.base.}
+method mousePosition*(control: Control): tuple[x, y: int]
+## Returns the mouse pointer position relative to the given control
+
method focus*(control: Control) {.base.}
method getTextLineWidth*(control: Control, text: string): int {.base, locks: "unknown".}
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index 67a0e23..5db784b 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -294,6 +294,7 @@ proc gtk_widget_is_focus*(widget: pointer): bool {.importc, libgtk3.}
proc gtk_widget_realize*(widget: pointer) {.importc, libgtk3.}
proc gtk_widget_draw*(widget, cr: pointer) {.importc, libgtk3.}
proc gtk_widget_set_sensitive*(widget: pointer, sensitive: bool) {.importc, libgtk3.}
+proc gtk_widget_get_pointer*(widget: pointer, x, y: var cint) {.importc, libgtk3.}
proc gtk_container_add*(container, widget: pointer) {.importc, libgtk3.}
proc gtk_container_remove*(container, widget: pointer) {.importc, libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index e2e23d5..cb15f2f 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -889,6 +889,12 @@ method `control=`(window: WindowImpl, control: Control) =
procCall window.Window.`control=`(control)
gtk_container_add(window.fInnerHandle, cast[ControlImpl](control).fHandle)
+method mousePosition(window: Window): tuple[x, y: int] =
+ var x, y: cint
+ gtk_widget_get_pointer(cast[WindowImpl](window).fHandle, x, y)
+ result.x = x
+ result.y = y
+
method `iconPath=`(window: WindowImpl, iconPath: string) =
procCall window.Window.`iconPath=`(iconPath)
if not gtk_window_set_icon_from_file(window.fHandle, iconPath, nil):
@@ -1258,6 +1264,12 @@ method pUpdateScrollBar(container: ContainerImpl) =
yPolicy = GTK_POLICY_AUTOMATIC
gtk_scrolled_window_set_policy(container.fScrollWndHandle, xPolicy, yPolicy)
+method mousePosition(control: Control): tuple[x, y: int] =
+ var x, y: cint
+ gtk_widget_get_pointer(cast[ControlImpl](control).fHandle, x, y)
+ result.x = x
+ result.y = y
+
# ----------------------------------------------------------------------------------------
# Frame
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index b0e23c4..c52d908 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -947,6 +947,20 @@ method `control=`(window: WindowImpl, control: Control) =
procCall window.Window.`control=`(control)
pSetParent(cast[ControlImpl](control).fHandle, window.fHandle)
+method mousePosition(window: Window): tuple[x, y: int] =
+ var p: Point
+ if not GetCursorPos(p):
+ result.x = -1
+ result.y = -1
+ return
+ if not ScreenToClient(cast[WindowImpl](window).fHandle, p):
+ result.x = -1
+ result.y = -1
+ return
+ result.x = p.x
+ result.y = p.y
+
+
method `iconPath=`(window: WindowImpl, iconPath: string) =
procCall window.Window.`iconPath=`(iconPath)
var bitmap: pointer
@@ -1298,6 +1312,19 @@ proc pCustomControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer):
return cast[pointer](true)
result = CallWindowProcW(pCommonWndProc, hWnd, uMsg, wParam, lParam)
+method mousePosition(control: Control): tuple[x, y: int] =
+ var p: Point
+ if not GetCursorPos(p):
+ result.x = -1
+ result.y = -1
+ return
+ if not ScreenToClient(cast[ControlImpl](control).fHandle, p):
+ result.x = -1
+ result.y = -1
+ return
+ result.x = p.x
+ result.y = p.y
+
# ----------------------------------------------------------------------------------------
# Container
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index 26324f8..2c4e09c 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -467,6 +467,7 @@ proc SetClipboardData*(uFormat: int32, hMem: pointer): pointer {.importc, libUse
proc EmptyClipboard*(): bool {.importc, libUser32.}
proc MapVirtualKeyW*(uCode, uMapType: int32): int32 {.importc, libUser32.}
proc GetCursorPos*(lpPoint: var Point): bool {.importc, libUser32.}
+proc ScreenToClient*(hWnd: pointer, 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