diff -Naur a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt 2024-12-31 00:57:40.000000000 +0600 +++ b/CMakeLists.txt 2025-01-02 14:15:55.117335770 +0600 @@ -151,8 +151,8 @@ PURPOSE "Required for building Tablet input KCM" ) -find_package(SDL2 2.0.16) -set_package_properties(SDL2 PROPERTIES +find_package(SDL3 2.0.16) +set_package_properties(SDL3 PROPERTIES TYPE OPTIONAL PURPOSE "Required for building Game Controller KCM" ) diff -Naur a/kcms/CMakeLists.txt b/kcms/CMakeLists.txt --- a/kcms/CMakeLists.txt 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/CMakeLists.txt 2025-01-02 14:18:48.724966040 +0600 @@ -15,7 +15,7 @@ add_subdirectory( ksmserver ) add_subdirectory( desktoppaths ) -if (TARGET SDL2::SDL2) +if (TARGET SDL3::SDL3) add_subdirectory( gamecontroller ) endif() diff -Naur a/kcms/gamecontroller/axesmodel.cpp b/kcms/gamecontroller/axesmodel.cpp --- a/kcms/gamecontroller/axesmodel.cpp 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/axesmodel.cpp 2025-01-02 16:02:20.471505265 +0600 @@ -8,7 +8,7 @@ #include "axesmodel.h" -#include +#include AxesModel::AxesModel(QObject *parent) : QAbstractTableModel(parent) @@ -34,7 +34,7 @@ return 0; } - return SDL_JoystickNumAxes(m_device->joystick()); + return SDL_GetNumJoystickAxes(m_device->joystick()); } int AxesModel::columnCount(const QModelIndex &parent) const @@ -50,7 +50,7 @@ } if (index.column() == 0 && role == Qt::DisplayRole) { - return SDL_JoystickGetAxis(m_device->joystick(), index.row()); + return SDL_GetJoystickAxis(m_device->joystick(), index.row()); } return {}; diff -Naur a/kcms/gamecontroller/buttonmodel.cpp b/kcms/gamecontroller/buttonmodel.cpp --- a/kcms/gamecontroller/buttonmodel.cpp 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/buttonmodel.cpp 2025-01-02 16:28:11.340276986 +0600 @@ -9,7 +9,7 @@ #include "buttonmodel.h" #include "gamepad.h" -#include +#include #include @@ -29,10 +29,10 @@ return; } - const int numButtons = SDL_JoystickNumButtons(m_device->joystick()); - for (int i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++) { - const SDL_GameControllerButton button = static_cast(i); - if (SDL_GameControllerHasButton(m_device->gamecontroller(), button)) { + const int numButtons = SDL_GetNumJoystickButtons(m_device->joystick()); + for (int i = 0; i < SDL_GAMEPAD_BUTTON_COUNT; i++) { + const SDL_GamepadButton button = static_cast(i); + if (SDL_GamepadHasButton(m_device->gamecontroller(), button)) { m_buttons << button; if (m_buttons.count() == numButtons) { break; @@ -42,7 +42,7 @@ endResetModel(); - connect(m_device, &Gamepad::buttonStateChanged, this, [this](SDL_GameControllerButton button) { + connect(m_device, &Gamepad::buttonStateChanged, this, [this](SDL_GamepadButton button) { const int row = m_buttons.indexOf(button); if (row >= 0) { const QModelIndex changedIndex = index(row, 0); @@ -70,7 +70,7 @@ } if (index.column() == 0 && role == Qt::DisplayRole) { - const int pressed = SDL_GameControllerGetButton(m_device->gamecontroller(), m_buttons.at(index.row())); + const int pressed = SDL_GetGamepadButton(m_device->gamecontroller(), m_buttons.at(index.row())); return pressed ? i18nc("Status of a gamepad button", "PRESSED") : QStringLiteral("-"); } diff -Naur a/kcms/gamecontroller/buttonmodel.h b/kcms/gamecontroller/buttonmodel.h --- a/kcms/gamecontroller/buttonmodel.h 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/buttonmodel.h 2025-01-02 15:23:51.720545464 +0600 @@ -9,7 +9,7 @@ #pragma once #include -#include +#include class Gamepad; @@ -37,5 +37,5 @@ private: Gamepad *m_device = nullptr; - QList m_buttons; + QList m_buttons; }; diff -Naur a/kcms/gamecontroller/CMakeLists.txt b/kcms/gamecontroller/CMakeLists.txt --- a/kcms/gamecontroller/CMakeLists.txt 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/CMakeLists.txt 2025-01-02 14:18:25.805149400 +0600 @@ -40,5 +40,5 @@ KF6::I18n Qt6::Quick Qt6::QuickWidgets - SDL2::SDL2 + SDL3::SDL3 ) diff -Naur a/kcms/gamecontroller/devicemodel.cpp b/kcms/gamecontroller/devicemodel.cpp --- a/kcms/gamecontroller/devicemodel.cpp 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/devicemodel.cpp 2025-01-02 15:49:50.615986733 +0600 @@ -11,8 +11,8 @@ #include #include -#include -#include +#include +#include #include "gamepad.h" #include "logging.h" @@ -79,25 +79,25 @@ { if (!initialized) { qCDebug(KCM_GAMECONTROLLER) << "Calling SDL_Init"; - SDL_Init(SDL_INIT_GAMECONTROLLER); + SDL_Init(SDL_INIT_GAMEPAD); initialized = true; } SDL_Event event{}; while (SDL_PollEvent(&event)) { switch (event.type) { - case SDL_CONTROLLERDEVICEADDED: + case SDL_EVENT_GAMEPAD_ADDED: addDevice(event.cdevice.which); break; - case SDL_CONTROLLERDEVICEREMOVED: + case SDL_EVENT_GAMEPAD_REMOVED: removeDevice(event.cdevice.which); break; - case SDL_CONTROLLERBUTTONDOWN: - case SDL_CONTROLLERBUTTONUP: - m_devices.value(event.cbutton.which)->onButtonEvent(event.cbutton); + case SDL_EVENT_GAMEPAD_BUTTON_DOWN: + case SDL_EVENT_GAMEPAD_BUTTON_UP: + m_devices.value(event.gbutton.which)->onButtonEvent(event.gbutton); break; - case SDL_CONTROLLERAXISMOTION: - m_devices.value(event.caxis.which)->onAxisEvent(event.caxis); + case SDL_EVENT_GAMEPAD_AXIS_MOTION: + m_devices.value(event.gaxis.which)->onAxisEvent(event.gaxis); break; } } @@ -105,16 +105,16 @@ void DeviceModel::addDevice(const int deviceIndex) { - const auto joystick = SDL_JoystickOpen(deviceIndex); - const auto id = SDL_JoystickInstanceID(joystick); + const auto joystick = SDL_OpenJoystick(deviceIndex); + const auto id = SDL_GetJoystickID(joystick); if (m_devices.contains(id)) { qCWarning(KCM_GAMECONTROLLER) << "Got a duplicate add event, ignoring. Index: " << deviceIndex; return; } - const auto gamepad = SDL_GameControllerOpen(deviceIndex); - if (SDL_GameControllerTypeForIndex(deviceIndex) == SDL_CONTROLLER_TYPE_VIRTUAL) { + const auto gamepad = SDL_OpenGamepad(deviceIndex); + if (SDL_IsJoystickVirtual(deviceIndex)) { qCWarning(KCM_GAMECONTROLLER) << "Skipping gamepad since it is virtual. Index: " << deviceIndex; return; } diff -Naur a/kcms/gamecontroller/.directory b/kcms/gamecontroller/.directory --- a/kcms/gamecontroller/.directory 1970-01-01 06:00:00.000000000 +0600 +++ b/kcms/gamecontroller/.directory 2025-01-02 15:22:58.745886681 +0600 @@ -0,0 +1,6 @@ +[Dolphin] +Timestamp=2025,1,2,15,22,58.583 +Version=4 + +[Settings] +HiddenFilesShown=true diff -Naur a/kcms/gamecontroller/gamepad.cpp b/kcms/gamecontroller/gamepad.cpp --- a/kcms/gamecontroller/gamepad.cpp 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/gamepad.cpp 2025-01-02 15:56:23.652646967 +0600 @@ -9,16 +9,16 @@ #include "gamepad.h" #include -#include -#include +#include +#include -Gamepad::Gamepad(SDL_Joystick *joystick, SDL_GameController *controller, QObject *parent) +Gamepad::Gamepad(SDL_Joystick *joystick, SDL_Gamepad *controller, QObject *parent) : QObject(parent) , m_joystick(joystick) , m_gameController(controller) { - m_name = QString::fromLocal8Bit(SDL_JoystickName(m_joystick)); - m_path = QString::fromLocal8Bit(SDL_JoystickPath(m_joystick)); + m_name = QString::fromLocal8Bit(SDL_GetJoystickName(m_joystick)); + m_path = QString::fromLocal8Bit(SDL_GetJoystickPath(m_joystick)); } QString Gamepad::name() const @@ -31,18 +31,18 @@ return m_path; } -void Gamepad::onButtonEvent(const SDL_ControllerButtonEvent sdlEvent) +void Gamepad::onButtonEvent(const SDL_GamepadButtonEvent sdlEvent) { - Q_EMIT buttonStateChanged(static_cast(sdlEvent.button)); + Q_EMIT buttonStateChanged(static_cast(sdlEvent.button)); } -void Gamepad::onAxisEvent(const SDL_ControllerAxisEvent sdlEvent) +void Gamepad::onAxisEvent(const SDL_GamepadAxisEvent sdlEvent) { const float value = static_cast(sdlEvent.value) / std::numeric_limits::max(); - if (sdlEvent.axis == SDL_CONTROLLER_AXIS_LEFTX) { + if (sdlEvent.axis == SDL_GAMEPAD_AXIS_LEFTX) { m_axis.setX(value); Q_EMIT axisValueChanged(); - } else if (sdlEvent.axis == SDL_CONTROLLER_AXIS_LEFTY) { + } else if (sdlEvent.axis == SDL_GAMEPAD_AXIS_LEFTY) { m_axis.setY(value); Q_EMIT axisValueChanged(); } @@ -55,7 +55,7 @@ return m_joystick; } -SDL_GameController *Gamepad::gamecontroller() const +SDL_Gamepad *Gamepad::gamecontroller() const { return m_gameController; } diff -Naur a/kcms/gamecontroller/gamepad.h b/kcms/gamecontroller/gamepad.h --- a/kcms/gamecontroller/gamepad.h 2024-12-31 00:57:40.000000000 +0600 +++ b/kcms/gamecontroller/gamepad.h 2025-01-02 15:22:53.919917766 +0600 @@ -15,9 +15,9 @@ #include -#include -#include -#include +#include +#include +#include class Gamepad : public QObject { @@ -26,29 +26,29 @@ Q_PROPERTY(QVector2D axisValue READ axisValue NOTIFY axisValueChanged) public: - Gamepad(SDL_Joystick *joystick, SDL_GameController *controller, QObject *parent = nullptr); + Gamepad(SDL_Joystick *joystick, SDL_Gamepad *controller, QObject *parent = nullptr); QString name() const; QString path() const; SDL_Joystick *joystick() const; - SDL_GameController *gamecontroller() const; + SDL_Gamepad *gamecontroller() const; QVector2D axisValue() const; Q_SIGNALS: - void buttonStateChanged(SDL_GameControllerButton button); + void buttonStateChanged(SDL_GamepadButton button); void axisStateChanged(int index); void axisValueChanged(); private: friend class DeviceModel; - void onButtonEvent(SDL_ControllerButtonEvent sdlEvent); - void onAxisEvent(SDL_ControllerAxisEvent sdlEvent); + void onButtonEvent(SDL_GamepadButtonEvent sdlEvent); + void onAxisEvent(SDL_GamepadAxisEvent sdlEvent); SDL_Joystick *m_joystick = nullptr; - SDL_GameController *m_gameController = nullptr; + SDL_Gamepad *m_gameController = nullptr; QString m_name; QString m_path;