Add IsFingerDown boolean to the Event object
IsFingerDown will be true as long as at least one finger has registered a TouchDown event but not yet a TouchUp. The calling program can check this boolean to distinguish a mouse movement from a physical mouse to a probable touch based swipe.
This commit is contained in:
parent
a8da853de0
commit
9d436db917
|
@ -34,13 +34,19 @@ type State struct {
|
||||||
WindowResized bool
|
WindowResized bool
|
||||||
|
|
||||||
// Touch state
|
// Touch state
|
||||||
Touching bool
|
Touching bool // A touch event this tick
|
||||||
TouchNumFingers int
|
TouchNumFingers int
|
||||||
TouchCenterX int
|
TouchCenterX int
|
||||||
TouchCenterY int
|
TouchCenterY int
|
||||||
GestureRotated float64
|
GestureRotated float64
|
||||||
GesturePinched float64
|
GesturePinched float64
|
||||||
|
|
||||||
|
// Will be true if at least one finger is currently still held down on
|
||||||
|
// a touch screen. Meaning a FingerDown event happened in the past, but
|
||||||
|
// not yet a FingerUp event. If IsFingerDown, you can extrapolate that
|
||||||
|
// mouse movement events were actually touch swipes and not a mouse.
|
||||||
|
IsFingerDown bool
|
||||||
|
|
||||||
// Game controller events.
|
// Game controller events.
|
||||||
// NOTE: for SDL2 you will need to call GameControllerEventState(1)
|
// NOTE: for SDL2 you will need to call GameControllerEventState(1)
|
||||||
// from veandco/go-sdl2/sdl for events to be read by SDL2.
|
// from veandco/go-sdl2/sdl for events to be read by SDL2.
|
||||||
|
|
|
@ -24,7 +24,7 @@ func (r *Renderer) Poll() (*event.State, error) {
|
||||||
|
|
||||||
// Reset some events.
|
// Reset some events.
|
||||||
s.WindowResized = false
|
s.WindowResized = false
|
||||||
// s.Touching = false
|
s.Touching = false
|
||||||
|
|
||||||
// helper function to push keyboard key names on keyDown events only.
|
// helper function to push keyboard key names on keyDown events only.
|
||||||
pushKey := func(name string, state uint8) {
|
pushKey := func(name string, state uint8) {
|
||||||
|
@ -108,6 +108,25 @@ func (r *Renderer) Poll() (*event.State, error) {
|
||||||
t.Timestamp, sdl.GetTicks(), t.Type, t.Which, t.X, t.Y,
|
t.Timestamp, sdl.GetTicks(), t.Type, t.Which, t.X, t.Y,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
case *sdl.TouchFingerEvent:
|
||||||
|
if DebugTouchEvents {
|
||||||
|
fmt.Printf("[%d ms] tick:%d TouchFinger type:%d Finger=%d TouchID=%+v Pressure=%f XY=%f,%f\n",
|
||||||
|
t.Timestamp, sdl.GetTicks(), t.Type, t.FingerID, t.TouchID, t.Pressure, t.X, t.Y,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
s.Touching = true
|
||||||
|
s.TouchNumFingers = 1
|
||||||
|
s.TouchCenterX = int(t.X)
|
||||||
|
s.TouchCenterY = int(t.Y)
|
||||||
|
|
||||||
|
// Track which finger(s) are down or up.
|
||||||
|
if t.Type == sdl.FINGERDOWN {
|
||||||
|
r.fingersDown[t.FingerID] = nil
|
||||||
|
} else if t.Type == sdl.FINGERUP {
|
||||||
|
delete(r.fingersDown, t.FingerID)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.IsFingerDown = len(r.fingersDown) > 0
|
||||||
case *sdl.MultiGestureEvent:
|
case *sdl.MultiGestureEvent:
|
||||||
if DebugTouchEvents {
|
if DebugTouchEvents {
|
||||||
fmt.Printf("[%d ms] tick:%d MultiGesture type:%d Num=%d TouchID=%+v Dt=%f Dd=%f XY=%f,%f\n",
|
fmt.Printf("[%d ms] tick:%d MultiGesture type:%d Num=%d TouchID=%+v Dt=%f Dd=%f XY=%f,%f\n",
|
||||||
|
|
17
sdl/sdl.go
17
sdl/sdl.go
|
@ -28,6 +28,12 @@ type Renderer struct {
|
||||||
textures map[string]*Texture // cached textures
|
textures map[string]*Texture // cached textures
|
||||||
textureMu sync.RWMutex
|
textureMu sync.RWMutex
|
||||||
|
|
||||||
|
// Touch screens: track which finger(s) are currently down, if one finger is
|
||||||
|
// down then the events.IsFingerDown will be true. The calling program can
|
||||||
|
// tell whether a MouseMove event is a mouse or a finger swipe if it happens
|
||||||
|
// while IsFingerDown is set.
|
||||||
|
fingersDown map[sdl.FingerID]interface{}
|
||||||
|
|
||||||
// Optimizations to minimize SDL calls.
|
// Optimizations to minimize SDL calls.
|
||||||
lastColor render.Color
|
lastColor render.Color
|
||||||
}
|
}
|
||||||
|
@ -35,11 +41,12 @@ type Renderer struct {
|
||||||
// New creates the SDL renderer.
|
// New creates the SDL renderer.
|
||||||
func New(title string, width, height int) *Renderer {
|
func New(title string, width, height int) *Renderer {
|
||||||
return &Renderer{
|
return &Renderer{
|
||||||
events: event.NewState(),
|
events: event.NewState(),
|
||||||
title: title,
|
title: title,
|
||||||
width: int32(width),
|
width: int32(width),
|
||||||
height: int32(height),
|
height: int32(height),
|
||||||
textures: map[string]*Texture{},
|
textures: map[string]*Texture{},
|
||||||
|
fingersDown: map[sdl.FingerID]interface{}{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user