You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reported in version: HG 2.0 Reported for operating system, platform: All, All
Comments on the original bug report:
On 2020-03-13 18:53:15 +0000, David Ludwig wrote:
Created attachment 4254
patch # 1, based against SDL 2.0.12
I have created a new driver for SDL's Joystick and Game-Controller subsystem: a Virtual driver. This driver allows one to create a software-based joystick, which to SDL applications will look and react like a real joystick, but whose state can be set programmatically. A primary use case for this is to help enable developers to add touch-screen joysticks to their apps.
The driver comes with a set of new, public APIs, with functions to attach and detach joysticks, set virtual-joystick state, and to determine if a joystick is a virtual-one.
Use of virtual joysticks goes as such:
Attach one or more virtual joysticks by calling SDL_JoystickAttachVirtual. If successful, this returns the virtual-device's joystick-index.
Open the virtual joysticks (using indicies returned by SDL_JoystickAttachVirtual).
Call any of the SDL_JoystickSetVirtual* functions when joystick-state changes. Please note that virtual-joystick state will only get applied on the next call to SDL_JoystickUpdate, or when pumping or polling for SDL events (via SDL_PumpEvents or SDL_PollEvent).
Here is a listing of the new, public APIs, at present and subject to change:
/**
Attaches a new virtual joystick.
Returns the joystick's device index, or -1 if an error occurred.
*/
extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type, int naxes, int nballs, int nbuttons, int nhats);
/**
Detaches a virtual joystick
Returns 0 on success, or -1 if an error occurred.
*/
extern DECLSPEC int SDLCALL SDL_JoystickDetachVirtual(int device_index);
/**
Indicates whether or not a virtual-joystick is at a given device index.
*/
extern DECLSPEC SDL_bool SDLCALL SDL_JoystickIsVirtual(int device_index);
/**
Set values on an opened, virtual-joystick's controls.
Returns 0 on success, -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualAxis(SDL_Joystick * joystick, int axis, Sint16 value);
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualBall(SDL_Joystick * joystick, int ball, Sint16 xrel, Sint16 yrel);
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualButton(SDL_Joystick * joystick, int button, Uint8 value);
extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualHat(SDL_Joystick * joystick, int hat, Uint8 value);
Miscellaneous notes on the initial patch, which are also subject to change:
no test code is present in SDL, yet. This should, perhaps, change. Initial development was done with an ImGui-based app, which potentially is too thick for use in SDL-official. If tests are to be added, what kind of tests? Automated? Graphical?
virtual game controllers can be created by calling SDL_JoystickAttachVirtual with a joystick-type of SDL_JOYSTICK_TYPE_GAME_CONTROLLER, with naxes (num axes) set to SDL_CONTROLLER_AXIS_MAX, and with nbuttons (num buttons) set to SDL_CONTROLLER_BUTTON_MAX. When updating their state, values of type SDL_GameControllerAxis or SDL_GameControllerButton can be casted to an int and used for the control-index (in calls to SDL_JoystickSetVirtual* functions).
virtual joysticks' guids are mostly all-zeros with the exception of the last two bytes, the first of which is a 'v', to indicate that the guid is a virtual one, and the second of which is a SDL_JoystickType that has been converted into a Uint8.
virtual joysticks are ONLY turned into virtual game-controllers if and when their joystick-type is set to SDL_JOYSTICK_TYPE_GAMECONTROLLER. This is controlled by having SDL's default list of game-controllers have a single entry for a virtual game controller (of guid, "00000000000000000000000000007601", which is subject to the guid-encoding described above).
regarding having to call SDL_JoystickUpdate, either directly or indirectly via SDL_PumpEvents or SDL_PollEvents, before new virtual-joystick state becomes active (as specified via SDL_JoystickSetVirtual* function-calls), this was done to match behavior found in SDL's other joystick drivers, almost all of which will only update SDL-state during SDL_JoystickUpdate.
the initial patch is based off of SDL 2.0.12
the virtual joystick subsystem is disabled by default. It should be possible to enable it by building with SDL_JOYSTICK_VIRTUAL=1
Questions, comments, suggestions, or bug reports very welcome!
My hg repo on osdn.net is, as of this writing, having some issues when pushing, so it is a few commits behind. The patch attached to this bugzilla case is, however, up to date.
On 2020-03-13 19:30:00 +0000, David Ludwig wrote:
Ok, my repo's back up, and the latest changes are now there.
On 2020-03-14 20:01:35 +0000, Malte Kießling wrote:
Created attachment 4255
patch for the build error in SDL_sysjoystick.c
I get a build error in SDL_sysjoystick.c:74 for the merged patch, but its nothing to sweat about, just -Werror=declaration-after-statement doing its usual stuff.
Have a nice weekend folks :) And don't overstock on toilet paper, it tastes horrible!
We're running low though, and the local stores are all out...
On 2020-03-15 17:39:17 +0000, David Ludwig wrote:
I removed ball support, and will try to work on additional build system support, within the next few days.
Good luck wherever y'all are at. It does look like Amazon, at least, still has toilet paper in stock, though I've yet to try it myself (and might be, soon enough!)
I also added a bit more documentation to SDL_joystick.h, regarding SDL_JoystickSetVirtual* calls and the need to invoke SDL_JoystickUpdate: https://hg.libsdl.org/SDL/rev/c88387a1e0e2
On 2020-03-16 04:29:38 +0000, David Ludwig wrote:
More commits to this are in SDL hg's default branch:
This bug report was migrated from our old Bugzilla tracker.
These attachments are available in the static archive:
Reported in version: HG 2.0
Reported for operating system, platform: All, All
Comments on the original bug report:
On 2020-03-13 18:53:15 +0000, David Ludwig wrote:
On 2020-03-13 19:05:16 +0000, David Ludwig wrote:
On 2020-03-13 19:16:43 +0000, David Ludwig wrote:
On 2020-03-13 19:30:00 +0000, David Ludwig wrote:
On 2020-03-14 02:11:06 +0000, Sam Lantinga wrote:
On 2020-03-14 20:01:35 +0000, Malte Kießling wrote:
On 2020-03-15 00:45:33 +0000, Sam Lantinga wrote:
On 2020-03-15 17:39:17 +0000, David Ludwig wrote:
On 2020-03-15 17:42:13 +0000, David Ludwig wrote:
On 2020-03-16 04:29:38 +0000, David Ludwig wrote:
On 2020-04-10 19:35:05 +0000, David Ludwig wrote:
On 2020-04-13 15:19:40 +0000, Sam Lantinga wrote:
On 2020-04-13 23:09:08 +0000, David Ludwig wrote:
The text was updated successfully, but these errors were encountered: