diff options
| author | trustable-code <krauter.simon@arcor.de> | 2019-12-26 15:21:18 +0100 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2019-12-26 15:21:18 +0100 |
| commit | 5bfc8dafab21e292723d19115aad0f304252959a (patch) | |
| tree | dca257e5a7ccb63f4e644c766eaf6575bb34bd26 /src | |
| parent | edcdbe648f2b795905832228b08df506fcd31847 (diff) | |
| download | NiGui-5bfc8dafab21e292723d19115aad0f304252959a.tar.gz NiGui-5bfc8dafab21e292723d19115aad0f304252959a.zip | |
Implement "always on top", fixes #80
Diffstat (limited to 'src')
| -rwxr-xr-x | src/nigui.nim | 10 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 1 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 4 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 11 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 2 |
5 files changed, 26 insertions, 2 deletions
diff --git a/src/nigui.nim b/src/nigui.nim index 525ad9e..199b8e4 100755 --- a/src/nigui.nim +++ b/src/nigui.nim @@ -217,6 +217,7 @@ type fTitle: string fVisible: bool fMinimized: bool + fAlwaysOnTop: bool fWidth, fHeight: int fClientWidth, fClientHeight: int fX, fY: int @@ -635,6 +636,9 @@ method `minimized=`*(window: Window, minimized: bool) {.base.} method minimize*(window: Window) {.base.} +method alwaysOnTop*(window: Window): bool {.base.} +method `alwaysOnTop=`*(window: Window, alwaysOnTop: bool) {.base.} + method control*(window: Window): Control {.base.} method `control=`*(window: Window, control: Control) {.base, locks: "unknown".} @@ -1424,6 +1428,12 @@ method minimize(window: Window) = window.fMinimized = true # should be extended by WindowImpl +method alwaysOnTop(window: Window): bool = window.fAlwaysOnTop + +method `alwaysOnTop=`(window: Window, alwaysOnTop: bool) = + window.fAlwaysOnTop = alwaysOnTop + # should be extended by WindowImpl + method x(window: Window): int = window.fX method `x=`(window: Window, x: int) = diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index 2f0e399..3627396 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -259,6 +259,7 @@ proc gtk_window_set_icon_from_file*(window: pointer, filename: cstring, err: poi proc gtk_window_iconify*(window: pointer) {.importc, libgtk3.} proc gtk_window_deiconify*(window: pointer) {.importc, libgtk3.} proc gtk_window_present*(window: pointer) {.importc, libgtk3.} +proc gtk_window_set_keep_above*(window: pointer, setting: bool) {.importc, libgtk3.} proc gdk_window_begin_paint_rect*(window: pointer, rectangle: var GdkRectangle) {.importc, libgtk3.} proc gdk_window_begin_paint_region*(window: pointer, region: pointer) {.importc, libgtk3.} diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index 3f6faa6..28f67f8 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -842,6 +842,10 @@ method minimize(window: WindowImpl) = procCall window.Window.minimize() gtk_window_iconify(window.fHandle) +method `alwaysOnTop=`(window: WindowImpl, alwaysOnTop: bool) = + procCall window.Window.`alwaysOnTop=`(alwaysOnTop) + gtk_window_set_keep_above(window.fHandle, alwaysOnTop) + method `width=`*(window: WindowImpl, width: int) = procCall window.Window.`width=`(width) gtk_window_resize(window.fHandle, window.width.cint, window.height.cint) diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index ab214b4..4fd2950 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -112,8 +112,8 @@ proc pGetWindowText(hWnd: pointer): string = if res != characters: pRaiseLastOSError() result = result.pUtf16ToUtf8 -proc pSetWindowPos(wnd: pointer, x, y, cx, cy: int, uFlags: int32 = 0) = - var result = SetWindowPos(wnd, nil, x.int32, y.int32, cx.int32, cy.int32, uFlags) +proc pSetWindowPos(wnd: pointer, x, y, cx, cy: int, uFlags: int32 = 0, hWndInsertAfter = 0) = + var result = SetWindowPos(wnd, cast[pointer](hWndInsertAfter), x.int32, y.int32, cx.int32, cy.int32, uFlags) if not result: pRaiseLastOSError() proc pGetClientRect(wnd: pointer): Rect = @@ -877,6 +877,13 @@ method minimize(window: WindowImpl) = procCall window.Window.minimize() pShowWindow(window.fHandle, SW_MINIMIZE) +method `alwaysOnTop=`(window: WindowImpl, alwaysOnTop: bool) = + procCall window.Window.`alwaysOnTop=`(alwaysOnTop) + if alwaysOnTop: + pSetWindowPos(window.fHandle, -1, -1, -1, -1, SWP_NOSIZE or SWP_NOMOVE, HWND_TOPMOST) + else: + pSetWindowPos(window.fHandle, -1, -1, -1, -1, SWP_NOSIZE or SWP_NOMOVE, HWND_NOTOPMOST) + proc pUpdatePosition(window: WindowImpl) = pSetWindowPos(window.fHandle, window.x, window.y, -1, -1, SWP_NOSIZE) # discard MoveWindow(window.fHandle, window.x.int32, window.y.int32, window.width.int32, window.height.int32, false) diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim index dab2d2d..349afaa 100755 --- a/src/nigui/private/windows/windows.nim +++ b/src/nigui/private/windows/windows.nim @@ -68,6 +68,8 @@ const GWL_STYLE* = -16 GWLP_USERDATA* = -21 GWLP_WNDPROC* = -4 + HWND_TOPMOST* = -1 + HWND_NOTOPMOST* = -2 ICON_SMALL* = 0 ICON_BIG* = 1 IDC_ARROW* = 32512 |
