diff --git a/internal/gamepad/api_windows.go b/internal/gamepad/api_desktop_windows.go similarity index 100% rename from internal/gamepad/api_windows.go rename to internal/gamepad/api_desktop_windows.go diff --git a/internal/gamepad/api_xbox_windows.go b/internal/gamepad/api_xbox_windows.go new file mode 100644 index 000000000..477535971 --- /dev/null +++ b/internal/gamepad/api_xbox_windows.go @@ -0,0 +1,50 @@ +// Copyright 2022 The Ebitengine Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !ebitencbackend +// +build !ebitencbackend + +package gamepad + +import ( + "fmt" + "unsafe" + + "golang.org/x/sys/windows" +) + +var ( + gameInput = windows.NewLazySystemDLL("GameInput.dll") + + procGameInputCreate = gameInput.NewProc("GameInputCreate") +) + +func _GameInputCreate() (*_IGameInput, error) { + var gameInput *_IGameInput + r, _, _ := procGameInputCreate.Call(uintptr(unsafe.Pointer(&gameInput))) + if uint32(r) != uint32(windows.S_OK) { + return nil, fmt.Errorf("gamepad: GameInputCreate failed: HRESULT(%d)", uint32(r)) + } + return gameInput, nil +} + +type _IGameInput struct { + vtbl *_IGameInput_Vtbl +} + +type _IGameInput_Vtbl struct { + QueryInterface uintptr + AddRef uintptr + Release uintptr +} diff --git a/internal/gamepad/gamepad_xbox_windows.go b/internal/gamepad/gamepad_xbox_windows.go index d6b3c09b2..0e1bf249b 100644 --- a/internal/gamepad/gamepad_xbox_windows.go +++ b/internal/gamepad/gamepad_xbox_windows.go @@ -17,9 +17,16 @@ package gamepad -type nativeGamepadsXbox struct{} +type nativeGamepadsXbox struct { + gameInput *_IGameInput +} func (n *nativeGamepadsXbox) init(gamepads *gamepads) error { + g, err := _GameInputCreate() + if err != nil { + return err + } + n.gameInput = g return nil }