forked from g3n/engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
window.go
332 lines (305 loc) · 9.76 KB
/
window.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
// Copyright 2016 The G3N Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package window abstracts the OpenGL Window manager
// Currently only "glfw" is supported
package window
import (
"github.com/g3n/engine/core"
"github.com/go-gl/glfw/v3.2/glfw"
)
// IWindowManager is the interface for all window managers
type IWindowManager interface {
ScreenResolution(interface{}) (width, height int)
CreateWindow(width, height int, title string, full bool) (IWindow, error)
CreateCursor(imgFile string, xhot, yhot int) (int, error)
DisposeCursor(key int)
DisposeAllCursors()
SetSwapInterval(interval int)
PollEvents()
Terminate()
}
// IWindow is the interface for all windows
type IWindow interface {
core.IDispatcher
Manager() IWindowManager
MakeContextCurrent()
FramebufferSize() (width int, height int)
Scale() (x float64, y float64)
Size() (width int, height int)
SetSize(width int, height int)
Pos() (xpos, ypos int)
SetPos(xpos, ypos int)
SetTitle(title string)
SetStandardCursor(cursor StandardCursor)
SetCustomCursor(int)
SetInputMode(mode InputMode, state int)
SetCursorPos(xpos, ypos float64)
ShouldClose() bool
SetShouldClose(bool)
FullScreen() bool
SetFullScreen(bool)
SwapBuffers()
Destroy()
}
// Key corresponds to a keyboard key.
type Key int
// Keycodes (from glfw)
const (
KeyUnknown = Key(glfw.KeyUnknown)
KeySpace = Key(glfw.KeySpace)
KeyApostrophe = Key(glfw.KeyApostrophe)
KeyComma = Key(glfw.KeyComma)
KeyMinus = Key(glfw.KeyMinus)
KeyPeriod = Key(glfw.KeyPeriod)
KeySlash = Key(glfw.KeySlash)
Key0 = Key(glfw.Key0)
Key1 = Key(glfw.Key1)
Key2 = Key(glfw.Key2)
Key3 = Key(glfw.Key3)
Key4 = Key(glfw.Key4)
Key5 = Key(glfw.Key5)
Key6 = Key(glfw.Key6)
Key7 = Key(glfw.Key7)
Key8 = Key(glfw.Key8)
Key9 = Key(glfw.Key9)
KeySemicolon = Key(glfw.KeySemicolon)
KeyEqual = Key(glfw.KeyEqual)
KeyA = Key(glfw.KeyA)
KeyB = Key(glfw.KeyB)
KeyC = Key(glfw.KeyC)
KeyD = Key(glfw.KeyD)
KeyE = Key(glfw.KeyE)
KeyF = Key(glfw.KeyF)
KeyG = Key(glfw.KeyG)
KeyH = Key(glfw.KeyH)
KeyI = Key(glfw.KeyI)
KeyJ = Key(glfw.KeyJ)
KeyK = Key(glfw.KeyK)
KeyL = Key(glfw.KeyL)
KeyM = Key(glfw.KeyM)
KeyN = Key(glfw.KeyN)
KeyO = Key(glfw.KeyO)
KeyP = Key(glfw.KeyP)
KeyQ = Key(glfw.KeyQ)
KeyR = Key(glfw.KeyR)
KeyS = Key(glfw.KeyS)
KeyT = Key(glfw.KeyT)
KeyU = Key(glfw.KeyU)
KeyV = Key(glfw.KeyV)
KeyW = Key(glfw.KeyW)
KeyX = Key(glfw.KeyX)
KeyY = Key(glfw.KeyY)
KeyZ = Key(glfw.KeyZ)
KeyLeftBracket = Key(glfw.KeyLeftBracket)
KeyBackslash = Key(glfw.KeyBackslash)
KeyRightBracket = Key(glfw.KeyRightBracket)
KeyGraveAccent = Key(glfw.KeyGraveAccent)
KeyWorld1 = Key(glfw.KeyWorld1)
KeyWorld2 = Key(glfw.KeyWorld2)
KeyEscape = Key(glfw.KeyEscape)
KeyEnter = Key(glfw.KeyEnter)
KeyTab = Key(glfw.KeyTab)
KeyBackspace = Key(glfw.KeyBackspace)
KeyInsert = Key(glfw.KeyInsert)
KeyDelete = Key(glfw.KeyDelete)
KeyRight = Key(glfw.KeyRight)
KeyLeft = Key(glfw.KeyLeft)
KeyDown = Key(glfw.KeyDown)
KeyUp = Key(glfw.KeyUp)
KeyPageUp = Key(glfw.KeyPageUp)
KeyPageDown = Key(glfw.KeyPageDown)
KeyHome = Key(glfw.KeyHome)
KeyEnd = Key(glfw.KeyEnd)
KeyCapsLock = Key(glfw.KeyCapsLock)
KeyScrollLock = Key(glfw.KeyScrollLock)
KeyNumLock = Key(glfw.KeyNumLock)
KeyPrintScreen = Key(glfw.KeyPrintScreen)
KeyPause = Key(glfw.KeyPause)
KeyF1 = Key(glfw.KeyF1)
KeyF2 = Key(glfw.KeyF2)
KeyF3 = Key(glfw.KeyF3)
KeyF4 = Key(glfw.KeyF4)
KeyF5 = Key(glfw.KeyF5)
KeyF6 = Key(glfw.KeyF6)
KeyF7 = Key(glfw.KeyF7)
KeyF8 = Key(glfw.KeyF8)
KeyF9 = Key(glfw.KeyF9)
KeyF10 = Key(glfw.KeyF10)
KeyF11 = Key(glfw.KeyF11)
KeyF12 = Key(glfw.KeyF12)
KeyF13 = Key(glfw.KeyF13)
KeyF14 = Key(glfw.KeyF14)
KeyF15 = Key(glfw.KeyF15)
KeyF16 = Key(glfw.KeyF16)
KeyF17 = Key(glfw.KeyF17)
KeyF18 = Key(glfw.KeyF18)
KeyF19 = Key(glfw.KeyF19)
KeyF20 = Key(glfw.KeyF20)
KeyF21 = Key(glfw.KeyF21)
KeyF22 = Key(glfw.KeyF22)
KeyF23 = Key(glfw.KeyF23)
KeyF24 = Key(glfw.KeyF24)
KeyF25 = Key(glfw.KeyF25)
KeyKP0 = Key(glfw.KeyKP0)
KeyKP1 = Key(glfw.KeyKP1)
KeyKP2 = Key(glfw.KeyKP2)
KeyKP3 = Key(glfw.KeyKP3)
KeyKP4 = Key(glfw.KeyKP4)
KeyKP5 = Key(glfw.KeyKP5)
KeyKP6 = Key(glfw.KeyKP6)
KeyKP7 = Key(glfw.KeyKP7)
KeyKP8 = Key(glfw.KeyKP8)
KeyKP9 = Key(glfw.KeyKP9)
KeyKPDecimal = Key(glfw.KeyKPDecimal)
KeyKPDivide = Key(glfw.KeyKPDivide)
KeyKPMultiply = Key(glfw.KeyKPMultiply)
KeyKPSubtract = Key(glfw.KeyKPSubtract)
KeyKPAdd = Key(glfw.KeyKPAdd)
KeyKPEnter = Key(glfw.KeyKPEnter)
KeyKPEqual = Key(glfw.KeyKPEqual)
KeyLeftShift = Key(glfw.KeyLeftShift)
KeyLeftControl = Key(glfw.KeyLeftControl)
KeyLeftAlt = Key(glfw.KeyLeftAlt)
KeyLeftSuper = Key(glfw.KeyLeftSuper)
KeyRightShift = Key(glfw.KeyRightShift)
KeyRightControl = Key(glfw.KeyRightControl)
KeyRightAlt = Key(glfw.KeyRightAlt)
KeyRightSuper = Key(glfw.KeyRightSuper)
KeyMenu = Key(glfw.KeyMenu)
KeyLast = Key(glfw.KeyLast)
)
// ModifierKey corresponds to a modifier key.
type ModifierKey int
// Modifier keys
const (
ModShift = ModifierKey(glfw.ModShift)
ModControl = ModifierKey(glfw.ModControl)
ModAlt = ModifierKey(glfw.ModAlt)
ModSuper = ModifierKey(glfw.ModSuper)
)
// MouseButton corresponds to a mouse button.
type MouseButton int
// Mouse buttons
const (
MouseButton1 = MouseButton(glfw.MouseButton1)
MouseButton2 = MouseButton(glfw.MouseButton2)
MouseButton3 = MouseButton(glfw.MouseButton3)
MouseButton4 = MouseButton(glfw.MouseButton4)
MouseButton5 = MouseButton(glfw.MouseButton5)
MouseButton6 = MouseButton(glfw.MouseButton6)
MouseButton7 = MouseButton(glfw.MouseButton7)
MouseButton8 = MouseButton(glfw.MouseButton8)
MouseButtonLast = MouseButton(glfw.MouseButtonLast)
MouseButtonLeft = MouseButton(glfw.MouseButtonLeft)
MouseButtonRight = MouseButton(glfw.MouseButtonRight)
MouseButtonMiddle = MouseButton(glfw.MouseButtonMiddle)
)
// StandardCursor corresponds to a g3n standard cursor icon.
type StandardCursor int
// Standard cursors for g3n. The diagonal cursors are not standard for GLFW.
const (
ArrowCursor = StandardCursor(glfw.ArrowCursor)
IBeamCursor = StandardCursor(glfw.IBeamCursor)
CrosshairCursor = StandardCursor(glfw.CrosshairCursor)
HandCursor = StandardCursor(glfw.HandCursor)
HResizeCursor = StandardCursor(glfw.HResizeCursor)
VResizeCursor = StandardCursor(glfw.VResizeCursor)
DiagResize1Cursor = StandardCursor(VResizeCursor + 1)
DiagResize2Cursor = StandardCursor(VResizeCursor + 2)
)
// Action corresponds to a key or button action.
type Action int
const (
// Release indicates that key or mouse button was released
Release = Action(glfw.Release)
// Press indicates that key or mouse button was pressed
Press = Action(glfw.Press)
// Repeat indicates that key was held down until it repeated
Repeat = Action(glfw.Repeat)
)
// InputMode corresponds to an input mode.
type InputMode int
// Input modes
const (
CursorMode = InputMode(glfw.CursorMode) // See Cursor mode values
StickyKeysMode = InputMode(glfw.StickyKeysMode) // Value can be either 1 or 0
StickyMouseButtonsMode = InputMode(glfw.StickyMouseButtonsMode) // Value can be either 1 or 0
)
// Cursor mode values
const (
CursorNormal = glfw.CursorNormal
CursorHidden = glfw.CursorHidden
CursorDisabled = glfw.CursorDisabled
)
//
// Window event names using for dispatch and subscribe
//
const (
OnWindowPos = "win.OnWindowPos"
OnWindowSize = "win.OnWindowSize"
OnKeyUp = "win.OnKeyUp"
OnKeyDown = "win.OnKeyDown"
OnKeyRepeat = "win.OnKeyRepeat"
OnChar = "win.OnChar"
OnCursor = "win.OnCursor"
OnMouseUp = "win.OnMouseUp"
OnMouseDown = "win.OnMouseDown"
OnScroll = "win.OnScroll"
OnFrame = "win.OnFrame"
)
// PosEvent describes a windows position changed event
type PosEvent struct {
W IWindow
Xpos int
Ypos int
}
// SizeEvent describers a window size changed event
type SizeEvent struct {
W IWindow
Width int
Height int
}
// KeyEvent describes a window key event
type KeyEvent struct {
W IWindow
Keycode Key
Scancode int
Action Action
Mods ModifierKey
}
// CharEvent describes a window char event
type CharEvent struct {
W IWindow
Char rune
Mods ModifierKey
}
// MouseEvent describes a mouse event over the window
type MouseEvent struct {
W IWindow
Xpos float32
Ypos float32
Button MouseButton
Action Action
Mods ModifierKey
}
// CursorEvent describes a cursor position changed event
type CursorEvent struct {
W IWindow
Xpos float32
Ypos float32
}
// ScrollEvent describes a scroll event
type ScrollEvent struct {
W IWindow
Xoffset float32
Yoffset float32
}
// Manager returns the window manager for the specified type.
// Currently only "glfw" type is supported.
func Manager(wtype string) (IWindowManager, error) {
if wtype != "glfw" {
panic("Unsupported window manager")
}
return Glfw()
}