summaryrefslogtreecommitdiff
path: root/src/nigui
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2019-09-24 23:16:30 +0200
committertrustable-code <krauter.simon@arcor.de>2019-09-24 23:16:30 +0200
commitf2b9ff937dc95590823e604b293240a0f8caefd3 (patch)
tree398226d73cda0dd5e56b32716dba99b418625ace /src/nigui
parenta6fddee74829556453b7df6a47ae50a18ac7c368 (diff)
downloadNiGui-f2b9ff937dc95590823e604b293240a0f8caefd3.tar.gz
NiGui-f2b9ff937dc95590823e604b293240a0f8caefd3.zip
Windows: Use more Unicode functions instead ANSI functions
Probably fixes #59
Diffstat (limited to 'src/nigui')
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim31
-rwxr-xr-xsrc/nigui/private/windows/windows.nim23
2 files changed, 23 insertions, 31 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index 3fcfc0e..1d1173d 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -118,8 +118,8 @@ proc pGetClientRect(wnd: pointer): Rect =
proc pGetWindowRect(wnd: pointer): Rect =
if not GetWindowRect(wnd, result): pRaiseLastOSError()
-proc pCreateWindowEx(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer =
- result = CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
+proc pCreateWindowEx(dwExStyle: int32, lpClassName: string, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer =
+ result = CreateWindowExW(dwExStyle, lpClassName.pUtf8ToUtf16, nil, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
if result == nil: pRaiseLastOSError()
proc pGetWindowLongPtr(hWnd: pointer, nIndex: int32): pointer =
@@ -138,8 +138,8 @@ proc pSetWindowLongPtr(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointe
# result = GetStockObject(fnObject)
# if result == nil: pRaiseLastOSError()
-proc pCreateWindowExWithUserdata(lpClassName: cstring, dwStyle, dwExStyle: int32, hWndParent, userdata: pointer = nil): pointer =
- result = pCreateWindowEx(dwExStyle, lpClassName, nil, dwStyle, 0, 0, 0, 0, hWndParent, nil, nil, nil)
+proc pCreateWindowExWithUserdata(lpClassName: string, dwStyle, dwExStyle: int32, hWndParent, userdata: pointer = nil): pointer =
+ result = pCreateWindowEx(dwExStyle, lpClassName, dwStyle, 0, 0, 0, 0, hWndParent, nil, nil, nil)
if userdata != nil:
discard pSetWindowLongPtr(result, GWLP_USERDATA, userdata)
# Set default font:
@@ -164,15 +164,15 @@ proc pEnableVisualStyles() =
# var ulpActivationCookie = false
# if not ActivateActCtx(context, ulpActivationCookie.addr): pRaiseLastOSError()
-proc pRegisterWindowClass(className: cstring, wndProc: pointer, style: int32 = 0) =
+proc pRegisterWindowClass(className: string, wndProc: pointer, style: int32 = 0) =
var class: WndClassEx
class.cbSize = WndClassEx.sizeof.int32
- class.lpszClassName = className
+ class.lpszClassName = className.pUtf8ToUtf16
class.lpfnWndProc = wndProc
class.style = style
class.hCursor = LoadCursorA(nil, cast[cstring](IDC_ARROW))
class.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)) # default background
- if RegisterClassExA(class) == 0: pRaiseLastOSError()
+ if RegisterClassExW(class) == 0: pRaiseLastOSError()
proc pCommonWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.} =
case uMsg
@@ -189,7 +189,7 @@ proc pCommonWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe
return CreateSolidBrush(control.backgroundColor.pColorToRGB32)
else:
discard
- result = DefWindowProcA(hWnd, uMsg, wParam, lParam)
+ result = DefWindowProcW(hWnd, uMsg, wParam, lParam)
proc pWMParamsToKey(wParam, lParam: pointer): Key =
case cast[int32](wParam)
@@ -406,7 +406,7 @@ proc init(app: App) =
pRegisterWindowClass(pTopLevelWindowClass, pWindowWndProc)
pRegisterWindowClass(pCustomControlWindowClass, pCustomControlWndProc, CS_HREDRAW or CS_VREDRAW)
pRegisterWindowClass(pContainerWindowClass, pContainerWndProc)
- pDefaultParentWindow = pCreateWindowEx(0, pTopLevelWindowClass, nil, 0, 0, 0, 0, 0, nil, nil, nil, nil)
+ pDefaultParentWindow = pCreateWindowEx(0, pTopLevelWindowClass, 0, 0, 0, 0, 0, nil, nil, nil, nil)
app.defaultTextColor = GetSysColor(COLOR_WINDOWTEXT).pRgb32ToColor()
app.defaultBackgroundColor = GetSysColor(COLOR_BTNFACE).pRgb32ToColor()
app.defaultFontFamily = "Arial"
@@ -415,15 +415,15 @@ proc init(app: App) =
proc runMainLoop() =
var msg: Msg
- while GetMessageA(msg.addr, nil, 0, 0):
+ while GetMessageW(msg.addr, nil, 0, 0):
discard TranslateMessage(msg.addr)
- discard DispatchMessageA(msg.addr)
+ discard DispatchMessageW(msg.addr)
proc processEvents(app: App) =
var msg: Msg
- while PeekMessageA(msg.addr, nil, 0, 0, PM_REMOVE):
+ while PeekMessageW(msg.addr, nil, 0, 0, PM_REMOVE):
discard TranslateMessage(msg.addr)
- discard DispatchMessageA(msg.addr)
+ discard DispatchMessageW(msg.addr)
proc clipboardText(app: App): string =
if not OpenClipboard(nil):
@@ -892,7 +892,7 @@ method `y=`(window: WindowImpl, y: int) =
method centerOnScreen(window: WindowImpl) =
let desktop = GetDesktopWindow()
var rect: Rect
- discard SystemParametersInfoA(SPI_GETWORKAREA, 0, rect.addr, 0)
+ 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()
@@ -1054,7 +1054,7 @@ proc pUpdateFont(control: ControlImpl) =
700
else:
400
- control.fFont = CreateFontA(control.fontSize.int32, 0, 0, 0, fontWeight, 0, 0, 0, 0, 0, 0, 0, 0, control.fontFamily)
+ control.fFont = CreateFontW(control.fontSize.int32, 0, 0, 0, fontWeight, 0, 0, 0, 0, 0, 0, 0, 0, control.fontFamily.pUtf8ToUtf16)
discard SendMessageA(control.fHandle, WM_SETFONT, control.fFont, cast[pointer](true))
method setFontFamily(control: ControlImpl, fontFamily: string) =
@@ -1449,7 +1449,6 @@ method `checked=`(checkbox: NativeCheckbox, checked: bool) =
discard SendMessageA(checkbox.fHandle, BM_SETCHECK, cast[pointer](BST_CHECKED), nil)
else:
discard SendMessageA(checkbox.fHandle, BM_SETCHECK, cast[pointer](BST_UNCHECKED), nil)
- # app.processEvents
# ----------------------------------------------------------------------------------------
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index df9e75a..7c2a76a 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -383,26 +383,22 @@ proc GlobalAlloc*(uFlags, dwBytes: int32): pointer {.importc: "GlobalAlloc", lib
# User32 Procs
# ----------------------------------------------------------------------------------------
-proc MessageBoxA*(hWnd: pointer, lpText, lpCaption: cstring, uType: int) {.importc: "MessageBoxA", libUser32.}
proc MessageBoxW*(hWnd: pointer, lpText, lpCaption: cstring, uType: int) {.importc: "MessageBoxW", libUser32.}
-proc RegisterClassExA*(lpwcx: var WndClassEx): int16 {.importc: "RegisterClassExA", libUser32.}
-proc CreateWindowExA*(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer {.importc: "CreateWindowExA", libUser32.}
+proc RegisterClassExW*(lpwcx: var WndClassEx): int16 {.importc: "RegisterClassExW", libUser32.}
+proc CreateWindowExW*(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer {.importc: "CreateWindowExW", libUser32.}
proc DestroyWindow*(hWnd: pointer): bool {.importc: "DestroyWindow", libUser32.}
proc ShowWindow*(hWnd: pointer, nCmdShow: int32): bool {.importc: "ShowWindow", libUser32.}
proc EnableWindow*(hWnd: pointer, bEnable: bool): bool {.importc: "EnableWindow", libUser32.}
-proc DefWindowProcA*(hWnd: pointer, uMsg: int, wParam, lParam: pointer): pointer {.importc: "DefWindowProcA", libUser32.}
-proc GetMessageA*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax: int32): bool {.importc: "GetMessageA", libUser32.}
-proc PeekMessageA*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax, wRemoveMsg: int32): bool {.importc: "PeekMessageA", libUser32.}
+proc DefWindowProcW*(hWnd: pointer, uMsg: int, wParam, lParam: pointer): pointer {.importc: "DefWindowProcW", libUser32.}
+proc GetMessageW*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax: int32): bool {.importc: "GetMessageW", libUser32.}
+proc PeekMessageW*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax, wRemoveMsg: int32): bool {.importc: "PeekMessageW", libUser32.}
proc TranslateMessage*(lpMsg: pointer): bool {.importc: "TranslateMessage", libUser32.}
-proc DispatchMessageA*(lpMsg: pointer): pointer {.importc: "DispatchMessageA", libUser32.}
+proc DispatchMessageW*(lpMsg: pointer): pointer {.importc: "DispatchMessageW", libUser32.}
proc SetParent*(hWndChild, hWndNewParent: pointer): pointer {.importc: "SetParent", libUser32.}
proc SetWindowLongA*(hWnd: pointer, nIndex, dwNewLong: int32): int32 {.importc: "SetWindowLongA", libUser32.}
proc GetWindowLongA*(hWnd: pointer, nIndex: int32): int32 {.importc: "GetWindowLongA", libUser32.}
-proc SetWindowTextA*(hWnd: pointer, lpString: cstring): bool {.importc: "SetWindowTextA", libUser32.}
proc SetWindowTextW*(hWnd: pointer, lpString: cstring): bool {.importc: "SetWindowTextW", libUser32.}
-# proc GetWindowTextA*(hWnd: pointer, lpString: cstring, nMaxCount: int32): int32 {.importc: "GetWindowTextA", libUser32.}
proc GetWindowTextW*(hWnd: pointer, lpString: cstring, nMaxCount: int32): int32 {.importc: "GetWindowTextW", libUser32.}
-# proc GetWindowTextLengthA*(hWnd: pointer): int32 {.importc: "GetWindowTextLengthA", libUser32.}
proc GetWindowTextLengthW*(hWnd: pointer): int32 {.importc: "GetWindowTextLengthW", libUser32.}
proc UpdateWindow*(hWnd: pointer): bool {.importc: "UpdateWindow", libUser32.}
proc SetWindowPos*(wnd, hWndInsertAfter: pointer, x, y, cx, cy: int32, uFlags: int): bool {.importc: "SetWindowPos", libUser32.}
@@ -413,13 +409,12 @@ proc GetClientRect*(wnd: pointer, lpRect: var Rect): bool {.importc: "GetClientR
proc BeginPaint*(hWnd: pointer, lpPaint: var PaintStruct): pointer {.importc: "BeginPaint", libUser32.}
proc EndPaint*(hWnd: pointer, lpPaint: var PaintStruct): bool {.importc: "EndPaint", libUser32.}
proc SendMessageA*(hWnd: pointer, msg: int32, wParam, lParam: pointer): pointer {.importc: "SendMessageA", libUser32.}
-# proc SendMessageW*(hWnd: pointer, msg: int32, wParam, lParam: pointer): pointer {.importc: "SendMessageW", libUser32.}
proc PostMessageA*(hWnd: pointer, msg: int32, wParam, lParam: pointer): pointer {.importc: "PostMessageA", libUser32.}
proc GetSysColor*(nIndex: int32): RGB32 {.importc: "GetSysColor", libUser32.}
proc InvalidateRect*(hWnd: pointer, lpRect: ref Rect, bErase: bool): bool {.importc: "InvalidateRect", libUser32.}
proc PostQuitMessage*(nExitCode: int32) {.importc: "PostQuitMessage", libUser32.}
proc GetDesktopWindow*(): pointer {.importc: "GetDesktopWindow", libUser32.}
-proc SystemParametersInfoA*(uiAction, uiParam: int32, pvParam: pointer, fWinIni: int32): bool {.importc: "SystemParametersInfoA", libUser32.}
+proc SystemParametersInfoW*(uiAction, uiParam: int32, pvParam: pointer, fWinIni: int32): bool {.importc: "SystemParametersInfoW", libUser32.}
proc ClientToScreen*(hWnd: pointer, lpPoint: var Point): bool {.importc: "ClientToScreen", libUser32.}
proc AdjustWindowRect*(lpRect: var Rect, dwStyle: int32, bMenu: bool): bool {.importc: "AdjustWindowRect", libUser32.}
proc LoadCursorA*(hInstance: pointer, lpCursorName: cstring): pointer {.importc: "LoadCursorA", libUser32.}
@@ -455,12 +450,10 @@ when defined(cpu64):
# Only available on 64-bit Windows:
proc GetWindowLongPtrW*(hWnd: pointer, nIndex: int32): pointer {.importc: "GetWindowLongPtrW", libUser32.}
proc SetWindowLongPtrW*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetWindowLongPtrW", libUser32.}
- # proc SetClassLongPtrA*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetClassLongPtrA", libUser32.}
else:
# Should only be used on 32-bit Windows:
proc GetWindowLongW*(hWnd: pointer, nIndex: int32): pointer {.importc: "GetWindowLongW", libUser32.}
proc SetWindowLongW*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetWindowLongW", libUser32.}
- # proc SetClassLongA*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetClassLongA", libUser32.}
# ----------------------------------------------------------------------------------------
@@ -475,7 +468,7 @@ proc TextOutW*(hdc: pointer, nXStart, nYStart: int32, lpString: cstring, cchStri
proc CreateSolidBrush*(crColor: RGB32): pointer {.importc: "CreateSolidBrush", libGdi32.}
proc CreatePen*(fnPenStyle, nWidth: int32, crColor: RGB32): pointer {.importc: "CreatePen", libGdi32.}
# proc GetStockObject*(fnObject: int32): pointer {.importc: "GetStockObject", libGdi32.}
-proc CreateFontA*(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily: int32, lpszFace: cstring): pointer {.importc: "CreateFontA", libGdi32.}
+proc CreateFontW*(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily: int32, lpszFace: cstring): pointer {.importc: "CreateFontW", libGdi32.}
proc GetTextExtentPoint32W*(hdc: pointer, lpString: cstring, c: int32, lpSize: var Size): bool {.importc: "GetTextExtentPoint32W", libGdi32.}
proc SetBkMode*(hdc: pointer, iBkMode: int32): int32 {.importc: "SetBkMode", libGdi32.}
proc SetTextColor*(hdc: pointer, crColor: RGB32): RGB32 {.importc: "SetTextColor", libGdi32.}