Mercurial > games > semicongine
comparison src/zamikongine/platform/windows/win32.nim @ 38:c3c963e7c1a6
did: tons of stuff, input, refactoring, fix some errors, some template improvment, sorry for super-commit
| author | Sam <sam@basx.dev> |
|---|---|
| date | Wed, 18 Jan 2023 09:52:03 +0700 |
| parents | a3d46f434616 |
| children |
comparison
equal
deleted
inserted
replaced
| 37:6859bcfabc62 | 38:c3c963e7c1a6 |
|---|---|
| 1 import winim | 1 import winim |
| 2 | 2 |
| 3 import ./virtualkey_map | |
| 3 import ../../events | 4 import ../../events |
| 4 | 5 |
| 5 type | 6 type |
| 6 NativeWindow* = object | 7 NativeWindow* = object |
| 7 hinstance*: HINSTANCE | 8 hinstance*: HINSTANCE |
| 8 hwnd*: HWND | 9 hwnd*: HWND |
| 9 | 10 |
| 11 # sorry, have to use module-global variable to capture windows events | |
| 10 var currentEvents: seq[Event] | 12 var currentEvents: seq[Event] |
| 11 | 13 |
| 12 template checkWin32Result*(call: untyped) = | 14 template checkWin32Result*(call: untyped) = |
| 13 let value = call | 15 let value = call |
| 14 if value != 0: | 16 if value != 0: |
| 15 raise newException(Exception, "Win32 error: " & astToStr(call) & " returned " & $value) | 17 raise newException(Exception, "Win32 error: " & astToStr(call) & " returned " & $value) |
| 16 | 18 |
| 19 | |
| 20 proc MapLeftRightKeys(key: INT, lparam: LPARAM): INT = | |
| 21 case key | |
| 22 of VK_SHIFT: | |
| 23 MapVirtualKey(UINT((lParam and 0x00ff0000) shr 16), MAPVK_VSC_TO_VK_EX) | |
| 24 of VK_CONTROL: | |
| 25 if (lParam and 0x01000000) == 0: VK_LCONTROL else: VK_RCONTROL | |
| 26 of VK_MENU: | |
| 27 if (lParam and 0x01000000) == 0: VK_LMENU else: VK_RMENU | |
| 28 else: | |
| 29 key | |
| 30 | |
| 17 proc WindowHandler(hwnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM): LRESULT {.stdcall.} = | 31 proc WindowHandler(hwnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM): LRESULT {.stdcall.} = |
| 18 case uMsg | 32 case uMsg |
| 19 of WM_DESTROY: | 33 of WM_DESTROY: |
| 20 currentEvents.add(Event(eventType: events.EventType.Quit)) | 34 currentEvents.add(Event(eventType: events.EventType.Quit)) |
| 35 of WM_KEYDOWN, WM_SYSKEYDOWN: | |
| 36 let key = MapLeftRightKeys(INT(wParam), lParam) | |
| 37 currentEvents.add(Event(eventType: KeyPressed, key: KeyTypeMap.getOrDefault(key, Key.UNKNOWN))) | |
| 38 of WM_KEYUP, WM_SYSKEYUP: | |
| 39 let key = MapLeftRightKeys(INT(wParam), lParam) | |
| 40 currentEvents.add(Event(eventType: KeyReleased, key: KeyTypeMap.getOrDefault(key, Key.UNKNOWN))) | |
| 41 of WM_LBUTTONDOWN: | |
| 42 currentEvents.add(Event(eventType: MousePressed, button: MouseButton.Mouse1)) | |
| 43 of WM_LBUTTONUP: | |
| 44 currentEvents.add(Event(eventType: MouseReleased, button: MouseButton.Mouse1)) | |
| 45 of WM_MBUTTONDOWN: | |
| 46 currentEvents.add(Event(eventType: MousePressed, button: MouseButton.Mouse2)) | |
| 47 of WM_MBUTTONUP: | |
| 48 currentEvents.add(Event(eventType: MouseReleased, button: MouseButton.Mouse2)) | |
| 49 of WM_RBUTTONDOWN: | |
| 50 currentEvents.add(Event(eventType: MousePressed, button: MouseButton.Mouse3)) | |
| 51 of WM_RBUTTONUP: | |
| 52 currentEvents.add(Event(eventType: MouseReleased, button: MouseButton.Mouse3)) | |
| 53 of WM_MOUSEMOVE: | |
| 54 currentEvents.add(Event(eventType: events.MouseMoved, x: GET_X_LPARAM(lParam), y: GET_Y_LPARAM(lParam))) | |
| 21 else: | 55 else: |
| 22 return DefWindowProc(hwnd, uMsg, wParam, lParam) | 56 return DefWindowProc(hwnd, uMsg, wParam, lParam) |
| 23 | 57 |
| 24 | 58 |
| 25 proc createWindow*(title: string): NativeWindow = | 59 proc createWindow*(title: string): NativeWindow = |
| 47 HINSTANCE(0), | 81 HINSTANCE(0), |
| 48 result.hInstance, | 82 result.hInstance, |
| 49 nil | 83 nil |
| 50 ) | 84 ) |
| 51 | 85 |
| 52 discard ShowWindow(result.hwnd, 1) | 86 discard ShowWindow(result.hwnd, SW_SHOW) |
| 87 discard ShowCursor(false) | |
| 53 | 88 |
| 54 proc trash*(window: NativeWindow) = | 89 proc trash*(window: NativeWindow) = |
| 55 discard | 90 discard |
| 56 | 91 |
| 57 proc size*(window: NativeWindow): (int, int) = | 92 proc size*(window: NativeWindow): (int, int) = |
| 58 var rect: RECT | 93 var rect: RECT |
| 59 checkWin32Result GetWindowRect(window.hwnd, addr(rect)) | 94 checkWin32Result GetWindowRect(window.hwnd, addr(rect)) |
| 60 (int(rect.right - rect.left), int(rect.bottom - rect.top)) | 95 (int(rect.right - rect.left), int(rect.bottom - rect.top)) |
| 61 | 96 |
| 62 proc pendingEvents*(window: NativeWindow): seq[Event] = | 97 proc pendingEvents*(window: NativeWindow): seq[Event] = |
| 98 # empty queue | |
| 63 currentEvents = newSeq[Event]() | 99 currentEvents = newSeq[Event]() |
| 64 var msg: MSG | 100 var msg: MSG |
| 101 # fill queue | |
| 65 while PeekMessage(addr(msg), window.hwnd, 0, 0, PM_REMOVE): | 102 while PeekMessage(addr(msg), window.hwnd, 0, 0, PM_REMOVE): |
| 66 DispatchMessage(addr(msg)) | 103 DispatchMessage(addr(msg)) |
| 67 return currentEvents | 104 return currentEvents |
