Add callback functionality for input events
This commit is contained in:
parent
b61f150701
commit
c9959f764f
|
@ -71,6 +71,46 @@ func (w *Window) Typed() string {
|
||||||
return w.currInp.typed
|
return w.currInp.typed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register button callback
|
||||||
|
func (w *Window) RegisterButtonCallback(cbfun ButtonCallback) {
|
||||||
|
w.callbacks.buttonCallbacks = append(w.callbacks.buttonCallbacks, cbfun)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register cursor enter callback
|
||||||
|
func (w *Window) RegisterCursorEnterCallback(cbfun CursorEnterCallback) {
|
||||||
|
w.callbacks.cursorEnterCallbacks = append(w.callbacks.cursorEnterCallbacks, cbfun)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register cursor pos callback
|
||||||
|
func (w *Window) RegisterCursorPosCallback(cbfun CursorPosCallback) {
|
||||||
|
w.callbacks.cursorPosCallbacks = append(w.callbacks.cursorPosCallbacks, cbfun)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register scroll callback
|
||||||
|
func (w *Window) RegisterScrollCallback(cbfun ScrollCallback) {
|
||||||
|
w.callbacks.scrollCallbacks = append(w.callbacks.scrollCallbacks, cbfun)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register char callback
|
||||||
|
func (w *Window) RegisterCharCallback(cbfun CharCallback) {
|
||||||
|
w.callbacks.charCallbacks = append(w.callbacks.charCallbacks, cbfun)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ButtonCallback func(key Button, action ButtonAction)
|
||||||
|
type CursorEnterCallback func()
|
||||||
|
type CursorPosCallback func(x, y float64)
|
||||||
|
type ScrollCallback func(xoff, yoff float64)
|
||||||
|
type CharCallback func(r rune)
|
||||||
|
|
||||||
|
type ButtonAction int
|
||||||
|
|
||||||
|
// List of all button actions.
|
||||||
|
const (
|
||||||
|
Press = ButtonAction(glfw.Press)
|
||||||
|
Release = ButtonAction(glfw.Release)
|
||||||
|
Repeat = ButtonAction(glfw.Repeat)
|
||||||
|
)
|
||||||
|
|
||||||
// Button is a keyboard or mouse button. Why distinguish?
|
// Button is a keyboard or mouse button. Why distinguish?
|
||||||
type Button int
|
type Button int
|
||||||
|
|
||||||
|
@ -368,6 +408,10 @@ func (w *Window) initInput() {
|
||||||
w.tempReleaseEvents[Button(button)] = true
|
w.tempReleaseEvents[Button(button)] = true
|
||||||
w.tempInp.buttons[Button(button)] = false
|
w.tempInp.buttons[Button(button)] = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, cbfun := range w.callbacks.buttonCallbacks {
|
||||||
|
go cbfun(Button(button), ButtonAction(action))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
w.window.SetKeyCallback(func(_ *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) {
|
w.window.SetKeyCallback(func(_ *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) {
|
||||||
|
@ -384,10 +428,18 @@ func (w *Window) initInput() {
|
||||||
case glfw.Repeat:
|
case glfw.Repeat:
|
||||||
w.tempInp.repeat[Button(key)] = true
|
w.tempInp.repeat[Button(key)] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, cbfun := range w.callbacks.buttonCallbacks {
|
||||||
|
go cbfun(Button(key), ButtonAction(action))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
w.window.SetCursorEnterCallback(func(_ *glfw.Window, entered bool) {
|
w.window.SetCursorEnterCallback(func(_ *glfw.Window, entered bool) {
|
||||||
w.cursorInsideWindow = entered
|
w.cursorInsideWindow = entered
|
||||||
|
|
||||||
|
for _, cbfun := range w.callbacks.cursorEnterCallbacks {
|
||||||
|
go cbfun()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
w.window.SetCursorPosCallback(func(_ *glfw.Window, x, y float64) {
|
w.window.SetCursorPosCallback(func(_ *glfw.Window, x, y float64) {
|
||||||
|
@ -395,15 +447,26 @@ func (w *Window) initInput() {
|
||||||
x+w.bounds.Min.X,
|
x+w.bounds.Min.X,
|
||||||
(w.bounds.H()-y)+w.bounds.Min.Y,
|
(w.bounds.H()-y)+w.bounds.Min.Y,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for _, cbfun := range w.callbacks.cursorPosCallbacks {
|
||||||
|
go cbfun(x, y)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
w.window.SetScrollCallback(func(_ *glfw.Window, xoff, yoff float64) {
|
w.window.SetScrollCallback(func(_ *glfw.Window, xoff, yoff float64) {
|
||||||
w.tempInp.scroll.X += xoff
|
w.tempInp.scroll.X += xoff
|
||||||
w.tempInp.scroll.Y += yoff
|
w.tempInp.scroll.Y += yoff
|
||||||
|
|
||||||
|
for _, cbfun := range w.callbacks.scrollCallbacks {
|
||||||
|
go cbfun(xoff, yoff)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
w.window.SetCharCallback(func(_ *glfw.Window, r rune) {
|
w.window.SetCharCallback(func(_ *glfw.Window, r rune) {
|
||||||
w.tempInp.typed += string(r)
|
w.tempInp.typed += string(r)
|
||||||
|
for _, cbfun := range w.callbacks.charCallbacks {
|
||||||
|
go cbfun(r)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,6 +97,14 @@ type Window struct {
|
||||||
xpos, ypos, width, height int
|
xpos, ypos, width, height int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
callbacks struct {
|
||||||
|
buttonCallbacks []ButtonCallback
|
||||||
|
cursorEnterCallbacks []CursorEnterCallback
|
||||||
|
cursorPosCallbacks []CursorPosCallback
|
||||||
|
scrollCallbacks []ScrollCallback
|
||||||
|
charCallbacks []CharCallback
|
||||||
|
}
|
||||||
|
|
||||||
prevInp, currInp, tempInp struct {
|
prevInp, currInp, tempInp struct {
|
||||||
mouse pixel.Vec
|
mouse pixel.Vec
|
||||||
buttons [KeyLast + 1]bool
|
buttons [KeyLast + 1]bool
|
||||||
|
|
Loading…
Reference in New Issue