mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
internal/gamepads: refactoring: remove a struct member
This commit is contained in:
parent
96ddec1753
commit
a8576008f0
@ -47,10 +47,6 @@ type gamepads struct {
|
||||
|
||||
var theGamepads gamepads
|
||||
|
||||
func init() {
|
||||
theGamepads.nativeGamepads.gamepads = &theGamepads
|
||||
}
|
||||
|
||||
// AppendGamepadIDs is concurrent-safe.
|
||||
func AppendGamepadIDs(ids []driver.GamepadID) []driver.GamepadID {
|
||||
return theGamepads.appendGamepadIDs(ids)
|
||||
@ -83,13 +79,13 @@ func (g *gamepads) update() error {
|
||||
defer g.m.Unlock()
|
||||
|
||||
if !g.inited {
|
||||
if err := g.nativeGamepads.init(); err != nil {
|
||||
if err := g.nativeGamepads.init(g); err != nil {
|
||||
return err
|
||||
}
|
||||
g.inited = true
|
||||
}
|
||||
|
||||
if err := g.nativeGamepads.update(); err != nil {
|
||||
if err := g.nativeGamepads.update(g); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -60,15 +60,13 @@ import (
|
||||
import "C"
|
||||
|
||||
type nativeGamepads struct {
|
||||
gamepads *gamepads
|
||||
|
||||
hidManager C.IOHIDManagerRef
|
||||
devicesToAdd []C.IOHIDDeviceRef
|
||||
devicesToRemove []C.IOHIDDeviceRef
|
||||
devicesM sync.Mutex
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) init() error {
|
||||
func (g *nativeGamepads) init(gamepads *gamepads) error {
|
||||
var dicts []C.CFDictionaryRef
|
||||
|
||||
page := C.kHIDPage_GenericDesktop
|
||||
@ -149,15 +147,15 @@ func ebitenGamepadRemovalCallback(ctx unsafe.Pointer, res C.IOReturn, sender uns
|
||||
theGamepads.devicesToRemove = append(theGamepads.devicesToRemove, device)
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) update() error {
|
||||
func (g *nativeGamepads) update(gamepads *gamepads) error {
|
||||
theGamepads.devicesM.Lock()
|
||||
defer theGamepads.devicesM.Unlock()
|
||||
|
||||
for _, device := range g.devicesToAdd {
|
||||
g.addDevice(device)
|
||||
g.addDevice(device, gamepads)
|
||||
}
|
||||
for _, device := range g.devicesToRemove {
|
||||
g.gamepads.remove(func(g *Gamepad) bool {
|
||||
gamepads.remove(func(g *Gamepad) bool {
|
||||
return g.device == device
|
||||
})
|
||||
}
|
||||
@ -166,8 +164,8 @@ func (g *nativeGamepads) update() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) addDevice(device C.IOHIDDeviceRef) {
|
||||
if g.gamepads.find(func(g *Gamepad) bool {
|
||||
func (g *nativeGamepads) addDevice(device C.IOHIDDeviceRef, gamepads *gamepads) {
|
||||
if gamepads.find(func(g *Gamepad) bool {
|
||||
return g.device == device
|
||||
}) != nil {
|
||||
return
|
||||
@ -213,7 +211,7 @@ func (g *nativeGamepads) addDevice(device C.IOHIDDeviceRef) {
|
||||
elements := C.IOHIDDeviceCopyMatchingElements(device, 0, C.kIOHIDOptionsTypeNone)
|
||||
defer C.CFRelease(C.CFTypeRef(elements))
|
||||
|
||||
gp := g.gamepads.add(name, sdlID)
|
||||
gp := gamepads.add(name, sdlID)
|
||||
gp.device = device
|
||||
|
||||
for i := C.CFIndex(0); i < C.CFArrayGetCount(elements); i++ {
|
||||
|
@ -26,16 +26,14 @@ var (
|
||||
)
|
||||
|
||||
type nativeGamepads struct {
|
||||
gamepads *gamepads
|
||||
|
||||
indices map[int]struct{}
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) init() error {
|
||||
func (g *nativeGamepads) init(gamepads *gamepads) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) update() error {
|
||||
func (g *nativeGamepads) update(gamepads *gamepads) error {
|
||||
// TODO: Use the gamepad events instead of navigator.getGamepads after go2cpp is removed.
|
||||
|
||||
defer func() {
|
||||
@ -68,7 +66,7 @@ func (g *nativeGamepads) update() error {
|
||||
g.indices[index] = struct{}{}
|
||||
|
||||
// The gamepad is not registered yet, register this.
|
||||
gamepad := g.gamepads.find(func(gamepad *Gamepad) bool {
|
||||
gamepad := gamepads.find(func(gamepad *Gamepad) bool {
|
||||
return index == gamepad.index
|
||||
})
|
||||
if gamepad == nil {
|
||||
@ -79,7 +77,7 @@ func (g *nativeGamepads) update() error {
|
||||
var sdlID [16]byte
|
||||
copy(sdlID[:], []byte(name))
|
||||
|
||||
gamepad = g.gamepads.add(name, hex.EncodeToString(sdlID[:]))
|
||||
gamepad = gamepads.add(name, hex.EncodeToString(sdlID[:]))
|
||||
gamepad.index = index
|
||||
gamepad.mapping = gp.Get("mapping").String()
|
||||
}
|
||||
@ -87,7 +85,7 @@ func (g *nativeGamepads) update() error {
|
||||
}
|
||||
|
||||
// Remove an unused gamepads.
|
||||
g.gamepads.remove(func(gamepad *Gamepad) bool {
|
||||
gamepads.remove(func(gamepad *Gamepad) bool {
|
||||
_, ok := g.indices[gamepad.index]
|
||||
return !ok
|
||||
})
|
||||
|
@ -97,8 +97,6 @@ var xinputButtons = []uint16{
|
||||
}
|
||||
|
||||
type nativeGamepads struct {
|
||||
gamepads *gamepads
|
||||
|
||||
dinput8 windows.Handle
|
||||
dinput8API *iDirectInput8W
|
||||
xinput windows.Handle
|
||||
@ -130,7 +128,7 @@ type enumObjectsContext struct {
|
||||
povCount int
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) init() error {
|
||||
func (g *nativeGamepads) init(gamepads *gamepads) error {
|
||||
// As there is no guarantee that the DLL exists, NewLazySystemDLL is not available.
|
||||
// TODO: Is there a 'system' version of LoadLibrary?
|
||||
if h, err := windows.LoadLibrary("dinput8.dll"); err == nil {
|
||||
@ -184,7 +182,7 @@ func (g *nativeGamepads) init() error {
|
||||
}
|
||||
g.dinput8API = api
|
||||
|
||||
if err := g.detectConnection(); err != nil {
|
||||
if err := g.detectConnection(gamepads); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -220,12 +218,12 @@ func (g *nativeGamepads) xinputGetState(dwUserIndex uint32, pState *xinputState)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) detectConnection() error {
|
||||
func (g *nativeGamepads) detectConnection(gamepads *gamepads) error {
|
||||
if g.dinput8 != 0 {
|
||||
if g.enumDevicesCallback == 0 {
|
||||
g.enumDevicesCallback = windows.NewCallback(g.dinput8EnumDevicesCallback)
|
||||
}
|
||||
if err := g.dinput8API.EnumDevices(_DI8DEVCLASS_GAMECTRL, g.enumDevicesCallback, nil, _DIEDFL_ALLDEVICES); err != nil {
|
||||
if err := g.dinput8API.EnumDevices(_DI8DEVCLASS_GAMECTRL, g.enumDevicesCallback, unsafe.Pointer(gamepads), _DIEDFL_ALLDEVICES); err != nil {
|
||||
return err
|
||||
}
|
||||
if g.err != nil {
|
||||
@ -236,7 +234,7 @@ func (g *nativeGamepads) detectConnection() error {
|
||||
const xuserMaxCount = 4
|
||||
|
||||
for i := 0; i < xuserMaxCount; i++ {
|
||||
if g.gamepads.find(func(g *Gamepad) bool {
|
||||
if gamepads.find(func(g *Gamepad) bool {
|
||||
return g.dinputDevice == nil && g.xinputIndex == i
|
||||
}) != nil {
|
||||
continue
|
||||
@ -273,7 +271,7 @@ func (g *nativeGamepads) detectConnection() error {
|
||||
name = "XInput Drum Kit"
|
||||
}
|
||||
|
||||
gp := g.gamepads.add(name, sdlID)
|
||||
gp := gamepads.add(name, sdlID)
|
||||
gp.xinputIndex = i
|
||||
}
|
||||
}
|
||||
@ -281,11 +279,13 @@ func (g *nativeGamepads) detectConnection() error {
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) dinput8EnumDevicesCallback(lpddi *diDeviceInstanceW, pvRef unsafe.Pointer) uintptr {
|
||||
gamepads := (*gamepads)(pvRef)
|
||||
|
||||
if g.err != nil {
|
||||
return _DIENUM_STOP
|
||||
}
|
||||
|
||||
if g.gamepads.find(func(g *Gamepad) bool {
|
||||
if gamepads.find(func(g *Gamepad) bool {
|
||||
return g.dinputGUID == lpddi.guidInstance
|
||||
}) != nil {
|
||||
return _DIENUM_CONTINUE
|
||||
@ -382,7 +382,7 @@ func (g *nativeGamepads) dinput8EnumDevicesCallback(lpddi *diDeviceInstanceW, pv
|
||||
bs[0], bs[1], bs[2], bs[3], bs[4], bs[5], bs[6], bs[7], bs[8], bs[9], bs[10], bs[11])
|
||||
}
|
||||
|
||||
gp := g.gamepads.add(name, sdlID)
|
||||
gp := gamepads.add(name, sdlID)
|
||||
gp.dinputDevice = device
|
||||
gp.dinputObjects = ctx.objects
|
||||
gp.dinputGUID = lpddi.guidInstance
|
||||
@ -505,7 +505,7 @@ func (g *nativeGamepads) dinputDevice8EnumObjectsCallback(lpddoi *diDeviceObject
|
||||
return _DIENUM_CONTINUE
|
||||
}
|
||||
|
||||
func (g *nativeGamepads) update() error {
|
||||
func (g *nativeGamepads) update(gamepads *gamepads) error {
|
||||
if g.err != nil {
|
||||
return g.err
|
||||
}
|
||||
@ -521,7 +521,7 @@ func (g *nativeGamepads) update() error {
|
||||
}
|
||||
|
||||
if atomic.LoadInt32(&g.deviceChanged) != 0 {
|
||||
if err := g.detectConnection(); err != nil {
|
||||
if err := g.detectConnection(gamepads); err != nil {
|
||||
g.err = err
|
||||
}
|
||||
atomic.StoreInt32(&g.deviceChanged, 0)
|
||||
|
Loading…
Reference in New Issue
Block a user