Mercurial > games > semicongine
comparison semiconginev2/rendering/platform/linux.nim @ 1256:bfb75c934f4e
add: window focus handling, improve window api a bit
author | sam <sam@basx.dev> |
---|---|
date | Sun, 28 Jul 2024 17:33:41 +0700 |
parents | b0f4c8ccd49a |
children |
comparison
equal
deleted
inserted
replaced
1255:2b5ca798f6d6 | 1256:bfb75c934f4e |
---|---|
79 0, # CWOverrideRedirect, | 79 0, # CWOverrideRedirect, |
80 addr attrs, | 80 addr attrs, |
81 # foregroundColor, backgroundColor | 81 # foregroundColor, backgroundColor |
82 ) | 82 ) |
83 checkXlibResult XSetStandardProperties(display, window, title, "window", 0, nil, 0, nil) | 83 checkXlibResult XSetStandardProperties(display, window, title, "window", 0, nil, 0, nil) |
84 checkXlibResult XSelectInput(display, window, PointerMotionMask or ButtonPressMask or ButtonReleaseMask or KeyPressMask or KeyReleaseMask or ExposureMask) | 84 checkXlibResult XSelectInput(display, window, PointerMotionMask or ButtonPressMask or ButtonReleaseMask or KeyPressMask or KeyReleaseMask or ExposureMask or FocusChangeMask) |
85 checkXlibResult XMapWindow(display, window) | 85 checkXlibResult XMapWindow(display, window) |
86 | 86 |
87 deleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", XBool(false)) | 87 deleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", XBool(false)) |
88 checkXlibResult XSetWMProtocols(display, window, addr(deleteMessage), 1) | 88 checkXlibResult XSetWMProtocols(display, window, addr(deleteMessage), 1) |
89 | 89 |
95 return NativeWindow(display: display, window: window, emptyCursor: empty_cursor) | 95 return NativeWindow(display: display, window: window, emptyCursor: empty_cursor) |
96 | 96 |
97 proc SetTitle*(window: NativeWindow, title: string) = | 97 proc SetTitle*(window: NativeWindow, title: string) = |
98 checkXlibResult XSetStandardProperties(window.display, window.window, title, "window", 0, nil, 0, nil) | 98 checkXlibResult XSetStandardProperties(window.display, window.window, title, "window", 0, nil, 0, nil) |
99 | 99 |
100 proc Fullscreen*(window: var NativeWindow, enable: bool) = | 100 proc SetFullscreen*(window: var NativeWindow, enable: bool) = |
101 var | 101 var |
102 wm_state = window.display.XInternAtom("_NET_WM_STATE", 0) | 102 wm_state = window.display.XInternAtom("_NET_WM_STATE", 0) |
103 wm_fullscreen = window.display.XInternAtom("_NET_WM_STATE_FULLSCREEN", 0) | 103 wm_fullscreen = window.display.XInternAtom("_NET_WM_STATE_FULLSCREEN", 0) |
104 var | 104 var |
105 xev: XEvent | 105 xev: XEvent |
125 SubstructureRedirectMask or SubstructureNotifyMask, | 125 SubstructureRedirectMask or SubstructureNotifyMask, |
126 addr xev | 126 addr xev |
127 ) | 127 ) |
128 checkXlibResult window.display.XFlush() | 128 checkXlibResult window.display.XFlush() |
129 | 129 |
130 proc HideSystemCursor*(window: NativeWindow) = | 130 proc ShowSystemCursor*(window: NativeWindow, value: bool) = |
131 checkXlibResult XDefineCursor(window.display, window.window, window.emptyCursor) | 131 if value == true: |
132 checkXlibResult window.display.XFlush() | 132 checkXlibResult XUndefineCursor(window.display, window.window) |
133 | 133 checkXlibResult window.display.XFlush() |
134 proc ShowSystemCursor*(window: NativeWindow) = | 134 else: |
135 checkXlibResult XUndefineCursor(window.display, window.window) | 135 checkXlibResult XDefineCursor(window.display, window.window, window.emptyCursor) |
136 checkXlibResult window.display.XFlush() | 136 checkXlibResult window.display.XFlush() |
137 | 137 |
138 proc Destroy*(window: NativeWindow) = | 138 proc Destroy*(window: NativeWindow) = |
139 checkXlibResult window.display.XFreeCursor(window.emptyCursor) | 139 checkXlibResult window.display.XFreeCursor(window.emptyCursor) |
140 checkXlibResult window.display.XDestroyWindow(window.window) | 140 checkXlibResult window.display.XDestroyWindow(window.window) |
141 discard window.display.XCloseDisplay() # always returns 0 | 141 discard window.display.XCloseDisplay() # always returns 0 |
173 let button = int(cast[PXButtonEvent](addr(event)).button) | 173 let button = int(cast[PXButtonEvent](addr(event)).button) |
174 result.add Event(eventType: MouseReleased, button: MouseButtonTypeMap.getOrDefault(button, MouseButton.UNKNOWN)) | 174 result.add Event(eventType: MouseReleased, button: MouseButtonTypeMap.getOrDefault(button, MouseButton.UNKNOWN)) |
175 of MotionNotify: | 175 of MotionNotify: |
176 let motion = cast[PXMotionEvent](addr(event)) | 176 let motion = cast[PXMotionEvent](addr(event)) |
177 result.add Event(eventType: MouseMoved, x: motion.x, y: motion.y) | 177 result.add Event(eventType: MouseMoved, x: motion.x, y: motion.y) |
178 of FocusIn: | |
179 result.add Event(eventType: GotFocus) | |
180 of FocusOut: | |
181 result.add Event(eventType: LostFocus) | |
178 of ConfigureNotify, Expose: | 182 of ConfigureNotify, Expose: |
179 result.add Event(eventType: ResizedWindow) | 183 result.add Event(eventType: ResizedWindow) |
180 else: | 184 else: |
181 discard | 185 discard |
182 | 186 |