summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2018-09-24 20:22:14 +0200
committertrustable-code <krauter.simon@arcor.de>2018-09-24 20:22:14 +0200
commit38137043869f21d188fc42851d71aa1af005ac9e (patch)
treecbb0d5c2e592288217067a302396ff45325bfbb2 /src
parent89a4ecc77c7833671913dbc7923db5329f22c447 (diff)
downloadNiGui-38137043869f21d188fc42851d71aa1af005ac9e.tar.gz
NiGui-38137043869f21d188fc42851d71aa1af005ac9e.zip
Improve control focus under Windows
- Focused buttons are now highlighted - A windows saves its focused control and restores it when the window is focused
Diffstat (limited to 'src')
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim30
-rwxr-xr-xsrc/nigui/private/windows/platform_types1.nim1
-rwxr-xr-xsrc/nigui/private/windows/windows.nim2
3 files changed, 22 insertions, 11 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index 1b36d10..b7954f3 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -307,9 +307,10 @@ proc pWindowWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe
window.fY = rect.top
# echo "WM_MOVE: " & $rect.left & ", " & $rect.top
of WM_SETFOCUS:
- discard
- #echo "window WM_SETFOCUS"
- # not called?
+ # Re-focus last focused control
+ let window = cast[WindowImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
+ if window.fFocusedControl != nil:
+ window.fFocusedControl.focus()
of WM_KILLFOCUS:
internalAllKeysUp()
of WM_DROPFILES:
@@ -1105,6 +1106,12 @@ proc pCommonControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer):
control.handleClickEvent(clickEvent)
of WM_HSCROLL, WM_VSCROLL:
pCommonControlWndProc_Scroll(hWnd, uMsg, wParam, lParam)
+
+ of WM_SETFOCUS:
+ # Save focused control
+ let control = cast[ControlImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
+ control.parentWindow().fFocusedControl = control
+
else:
discard
@@ -1172,9 +1179,6 @@ proc pCustomControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer):
echo "wheel: " & $scrolled
of WM_ERASEBKGND:
return cast[pointer](true) # Allow flicker-free drawing
- of WM_SETFOCUS:
- # echo "control WM_SETFOCUS"
- discard
else:
discard
let comProcRes = pCommonControlWndProc(hWnd, uMsg, wParam, lParam)
@@ -1280,11 +1284,15 @@ method getPadding(frame: NativeFrame): Spacing =
var pButtonOrigWndProc: pointer
proc pButtonWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.} =
- # case uMsg
- # of WM_KEYDOWN:
- # let button = cast[Button](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
- # else:
- # discard
+ case uMsg
+ of WM_SETFOCUS:
+ let button = cast[Button](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
+ discard SendMessageA(button.fHandle, BM_SETSTYLE, cast[pointer](BS_DEFPUSHBUTTON), nil)
+ of WM_KILLFOCUS:
+ let button = cast[Button](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
+ discard SendMessageA(button.fHandle, BM_SETSTYLE, cast[pointer](0), nil)
+ else:
+ discard
let comProcRes = pCommonControlWndProc(hWnd, uMsg, wParam, lParam)
if comProcRes == PWndProcResult_False:
return cast[pointer](false)
diff --git a/src/nigui/private/windows/platform_types1.nim b/src/nigui/private/windows/platform_types1.nim
index 52470d4..9b99df8 100755
--- a/src/nigui/private/windows/platform_types1.nim
+++ b/src/nigui/private/windows/platform_types1.nim
@@ -8,6 +8,7 @@ type
WindowImpl* = ref object of Window
fHandle: pointer
fModalParent: WindowImpl
+ fFocusedControl: ControlImpl
ControlImpl* = ref object of Control
fHandle: pointer
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index f88c510..70f3153 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -35,7 +35,9 @@ const
ACTCTX_FLAG_RESOURCE_NAME_VALID* = 8
ACTCTX_FLAG_SET_PROCESS_DEFAULT* = 16
BN_CLICKED* = 0
+ BM_SETSTYLE* = 244
BM_SETIMAGE* = 247
+ BS_DEFPUSHBUTTON* = 0x00000001
BS_GROUPBOX* = 0x00000007
CF_TEXT* = 1
COLOR_BTNFACE* = 15