From 2d23168aca461537dc9c05e69929bee2428866e0 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 25 Jun 2022 00:02:11 +0900 Subject: [PATCH] iinternal/gamepad: start implementation for Xbox Updates #2084 --- ...{api_windows.go => api_desktop_windows.go} | 0 internal/gamepad/api_xbox_windows.go | 50 +++++++++++++++++++ internal/gamepad/gamepad_xbox_windows.go | 9 +++- 3 files changed, 58 insertions(+), 1 deletion(-) rename internal/gamepad/{api_windows.go => api_desktop_windows.go} (100%) create mode 100644 internal/gamepad/api_xbox_windows.go 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 }