Add GameControllerDB support

This commit is contained in:
2025-08-09 13:53:37 -04:00
parent 62ba23a1a0
commit 4b901886a2
7 changed files with 2321 additions and 32 deletions

View File

@@ -193,3 +193,82 @@ ErrorContext *gamepad_handle_removed(void *appstate, SDL_Event *event)
SDL_Log("Gamepad #%u removed", (unsigned int) which);
SUCCEED_RETURN(errctx);
}
ErrorContext ERROR_NOIGNORE *SDL3G_controller_default(int controlmapid, char *actorname, int kbid, int jsid)
{
SDL3GControlMap *controlmap;
PREPARE_ERROR(errctx);
ATTEMPT {
// set up the control map
controlmap = &GAME_ControlMaps[0];
controlmap->kbid = kbid;
controlmap->jsid = jsid;
controlmap->target = SDL_GetPointerProperty(REGISTRY_ACTOR, actorname, NULL);
FAIL_ZERO_BREAK(errctx, controlmap->target, ERR_REGISTRY, "Actor %s not found in registry", actorname);
// ---- KEYBOARD CONTROLS ----
// Move down
controlmap->controls[0].key = SDLK_DOWN;
controlmap->controls[0].event_on = SDL_EVENT_KEY_DOWN;
controlmap->controls[0].event_off = SDL_EVENT_KEY_UP;
controlmap->controls[0].handler_on = &SDL3GActor_cmhf_down_on;
controlmap->controls[0].handler_off = &SDL3GActor_cmhf_down_off;
// Move up
controlmap->controls[1].key = SDLK_UP;
controlmap->controls[1].event_on = SDL_EVENT_KEY_DOWN;
controlmap->controls[1].event_off = SDL_EVENT_KEY_UP;
controlmap->controls[1].handler_on = &SDL3GActor_cmhf_up_on;
controlmap->controls[1].handler_off = &SDL3GActor_cmhf_up_off;
// Move left
controlmap->controls[2].key = SDLK_LEFT;
controlmap->controls[2].event_on = SDL_EVENT_KEY_DOWN;
controlmap->controls[2].event_off = SDL_EVENT_KEY_UP;
controlmap->controls[2].handler_on = &SDL3GActor_cmhf_left_on;
controlmap->controls[2].handler_off = &SDL3GActor_cmhf_left_off;
// Move right
controlmap->controls[3].key = SDLK_RIGHT;
controlmap->controls[3].event_on = SDL_EVENT_KEY_DOWN;
controlmap->controls[3].event_off = SDL_EVENT_KEY_UP;
controlmap->controls[3].handler_on = &SDL3GActor_cmhf_right_on;
controlmap->controls[3].handler_off = &SDL3GActor_cmhf_right_off;
// ----- GAMEPAD CONTROLS
// Move down
controlmap->controls[17].button = SDL_GAMEPAD_BUTTON_DPAD_DOWN;
controlmap->controls[17].event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
controlmap->controls[17].event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
controlmap->controls[17].handler_on = &SDL3GActor_cmhf_down_on;
controlmap->controls[17].handler_off = &SDL3GActor_cmhf_down_off;
// Move up
controlmap->controls[18].button = SDL_GAMEPAD_BUTTON_DPAD_UP;
controlmap->controls[18].event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
controlmap->controls[18].event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
controlmap->controls[18].handler_on = &SDL3GActor_cmhf_up_on;
controlmap->controls[18].handler_off = &SDL3GActor_cmhf_up_off;
// Move left
controlmap->controls[19].button = SDL_GAMEPAD_BUTTON_DPAD_LEFT;
controlmap->controls[19].event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
controlmap->controls[19].event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
controlmap->controls[19].handler_on = &SDL3GActor_cmhf_left_on;
controlmap->controls[19].handler_off = &SDL3GActor_cmhf_left_off;
// Move right
controlmap->controls[20].button = SDL_GAMEPAD_BUTTON_DPAD_RIGHT;
controlmap->controls[20].event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
controlmap->controls[20].event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
controlmap->controls[20].handler_on = &SDL3GActor_cmhf_right_on;
controlmap->controls[20].handler_off = &SDL3GActor_cmhf_right_off;
SUCCEED_RETURN(errctx);
} CLEANUP {
} PROCESS(errctx) {
} FINISH(errctx, true);
}