Skip to content

Commit d423915

Browse files
committed
gamepad support using glfw
1 parent 45cc724 commit d423915

File tree

3 files changed

+106
-20
lines changed

3 files changed

+106
-20
lines changed

cmake/sokol.cmake

+11-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
if(BUILD_SOKOL)
66

7-
if(NOT EMSCRIPTEN)
7+
if(LINUX)
88
set(GLFW_BUILD_WAYLAND OFF)
99
add_subdirectory(${THIRDPARTY_DIR}/glfw)
1010
endif()
@@ -18,7 +18,7 @@ if(APPLE)
1818
elseif(LINUX)
1919
target_compile_definitions(sokol PUBLIC SOKOL_GLCORE)
2020
elseif(WIN32)
21-
target_compile_definitions(sokol PUBLIC SOKOL_D3D11)
21+
target_compile_definitions(sokol PUBLIC SOKOL_D3D11 UNICODE)
2222
elseif(EMSCRIPTEN)
2323
target_compile_definitions(sokol PUBLIC SOKOL_WGPU)
2424
endif()
@@ -36,14 +36,18 @@ if(APPLE)
3636
"-framework AudioToolbox"
3737
)
3838

39-
target_include_directories(sokol PRIVATE
40-
${THIRDPARTY_DIR}/glfw/src
41-
${THIRDPARTY_DIR}/glfw/include)
42-
4339
elseif(LINUX)
4440
target_link_libraries(sokol PRIVATE X11 GL Xi Xcursor m dl asound glfw)
4541
elseif(WIN32)
46-
target_link_libraries(sokol PRIVATE D3D11 glfw)
42+
target_link_libraries(sokol PRIVATE D3D11)
43+
endif()
44+
45+
if(APPLE OR WIN32)
46+
add_subdirectory(${THIRDPARTY_DIR}/glfw)
47+
48+
target_include_directories(sokol PRIVATE
49+
${THIRDPARTY_DIR}/glfw/src
50+
${THIRDPARTY_DIR}/glfw/include)
4751
endif()
4852

4953
target_include_directories(sokol PRIVATE ${THIRDPARTY_DIR}/sokol)

src/system/sokol/sokol.c

+13
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,18 @@
2222

2323
#define SOKOL_IMPL
2424

25+
#if defined(_WIN32)
26+
27+
#define _GLFW_WIN32
28+
29+
#include "win32_joystick.c"
30+
#include "win32_time.c"
31+
#include "input.c"
32+
#define GLFW_BUILD_WIN32_MODULE
33+
#include "win32_module.c"
34+
#define DPI_ENUMS_DECLARED
35+
36+
#endif
37+
2538
#include "sokol.h"
2639

src/system/sokol/sokol_gamepad.h

+82-13
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,7 @@ extern "C" {
112112
#ifndef SOKOL_UNREACHABLE
113113
#define SOKOL_UNREACHABLE SOKOL_ASSERT(false)
114114
#endif
115-
#if !defined(SOKOL_CALLOC) || !defined(SOKOL_FREE)
116-
#include <stdlib.h>
117-
#endif
118-
#if !defined(SOKOL_CALLOC)
119-
#define SOKOL_CALLOC(n,s) calloc(n,s)
120-
#endif
121-
#if !defined(SOKOL_FREE)
122-
#define SOKOL_FREE(p) free(p)
123-
#endif
115+
124116
#ifndef SOKOL_LOG
125117
#ifdef SOKOL_DEBUG
126118
#if defined(__ANDROID__)
@@ -253,12 +245,84 @@ _SOKOL_PRIVATE void _sgamepad_record_state() {
253245

254246
#endif
255247

256-
/*=== PUBLIC API FUNCTIONS ===================================================*/
257-
SOKOL_API_IMPL unsigned int sgamepad_get_max_supported_gamepads() {
258-
return SGAMEPAD_MAX_SUPPORTED_GAMEPADS;
248+
#if defined (_SAPP_WIN32)
249+
250+
void* _glfw_calloc(size_t count, size_t size)
251+
{
252+
return calloc(count, size);
253+
}
254+
255+
void* _glfw_realloc(void* block, size_t size)
256+
{
257+
return realloc(block, size);
259258
}
260259

261-
#if defined (_SAPP_WIN32) || defined(_SAPP_LINUX)
260+
void _glfw_free(void* block)
261+
{
262+
free(block);
263+
}
264+
265+
_GLFWlibrary _glfw = { GLFW_TRUE };
266+
267+
void _glfwInputError(int code, const char* format, ...)
268+
{}
269+
270+
SOKOL_API_IMPL void sgamepad_init() {
271+
272+
_glfw.win32.instance = GetModuleHandle(NULL);
273+
274+
_glfw.win32.dinput8.instance = _glfwPlatformLoadModule("dinput8.dll");
275+
if (_glfw.win32.dinput8.instance)
276+
{
277+
_glfw.win32.dinput8.Create = (PFN_DirectInput8Create)
278+
_glfwPlatformGetModuleSymbol(_glfw.win32.dinput8.instance, "DirectInput8Create");
279+
}
280+
281+
{
282+
int i;
283+
const char* names[] =
284+
{
285+
"xinput1_4.dll",
286+
"xinput1_3.dll",
287+
"xinput9_1_0.dll",
288+
"xinput1_2.dll",
289+
"xinput1_1.dll",
290+
NULL
291+
};
292+
293+
for (i = 0; names[i]; i++)
294+
{
295+
_glfw.win32.xinput.instance = _glfwPlatformLoadModule(names[i]);
296+
if (_glfw.win32.xinput.instance)
297+
{
298+
_glfw.win32.xinput.GetCapabilities = (PFN_XInputGetCapabilities)
299+
_glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetCapabilities");
300+
_glfw.win32.xinput.GetState = (PFN_XInputGetState)
301+
_glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetState");
302+
303+
break;
304+
}
305+
}
306+
}
307+
308+
_glfw.platform = (_GLFWplatform)
309+
{
310+
.initJoysticks = _glfwInitJoysticksWin32,
311+
.terminateJoysticks = _glfwTerminateJoysticksWin32,
312+
.pollJoystick = _glfwPollJoystickWin32,
313+
.getMappingName = _glfwGetMappingNameWin32,
314+
.updateGamepadGUID = _glfwUpdateGamepadGUIDWin32,
315+
};
316+
317+
_glfwInitGamepadMappings();
318+
}
319+
320+
SOKOL_API_IMPL void sgamepad_shutdown() {
321+
322+
_glfwTerminateJoysticksWin32();
323+
}
324+
325+
#elif defined(_SAPP_LINUX)
262326

263327
SOKOL_API_IMPL void sgamepad_init() {
264328
glfwInit();
@@ -317,6 +381,11 @@ SOKOL_API_IMPL void sgamepad_shutdown() {
317381

318382
#endif
319383

384+
/*=== PUBLIC API FUNCTIONS ===================================================*/
385+
SOKOL_API_IMPL unsigned int sgamepad_get_max_supported_gamepads() {
386+
return SGAMEPAD_MAX_SUPPORTED_GAMEPADS;
387+
}
388+
320389
SOKOL_API_IMPL void sgamepad_record_state() {
321390
memset(_sgamepad.gamepad_states, 0, sizeof(_sgamepad.gamepad_states));
322391
_sgamepad_record_state();

0 commit comments

Comments
 (0)