Add joystick battery event
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
diff --git a/include/SDL_events.h b/include/SDL_events.h
index 7e46907..c0fc9bb 100644
--- a/include/SDL_events.h
+++ b/include/SDL_events.h
@@ -118,6 +118,7 @@ typedef enum
SDL_JOYBUTTONUP, /**< Joystick button released */
SDL_JOYDEVICEADDED, /**< A new joystick has been inserted into the system */
SDL_JOYDEVICEREMOVED, /**< An opened joystick has been removed */
+ SDL_JOYBATTERYUPDATED, /**< Joystick battery level change */
/* Game controller events */
SDL_CONTROLLERAXISMOTION = 0x650, /**< Game controller axis motion */
@@ -395,6 +396,16 @@ typedef struct SDL_JoyDeviceEvent
Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */
} SDL_JoyDeviceEvent;
+/**
+ * \brief Joysick battery level change event structure (event.jbattery.*)
+ */
+typedef struct SDL_JoyBatteryEvent
+{
+ Uint32 type; /**< ::SDL_JOYBATTERYUPDATED */
+ Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */
+ SDL_JoystickID which; /**< The joystick instance id */
+ SDL_JoystickPowerLevel level; /**< The joystick battery level */
+} SDL_JoyBatteryEvent;
/**
* \brief Game controller axis motion event structure (event.caxis.*)
@@ -625,6 +636,7 @@ typedef union SDL_Event
SDL_JoyHatEvent jhat; /**< Joystick hat event data */
SDL_JoyButtonEvent jbutton; /**< Joystick button event data */
SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */
+ SDL_JoyBatteryEvent jbattery; /**< Joystick battery event data */
SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */
SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */
SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index ae45912..65c8b77 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -386,6 +386,7 @@ SDL_JoystickOpen(int device_index)
SDL_Joystick *joystick;
SDL_Joystick *joysticklist;
const char *joystickname = NULL;
+ SDL_JoystickPowerLevel initial_power_level;
SDL_LockJoysticks();
@@ -478,6 +479,11 @@ SDL_JoystickOpen(int device_index)
SDL_UnlockJoysticks();
+ /* send initial battery event */
+ initial_power_level = joystick->epowerlevel;
+ joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN;
+ SDL_PrivateJoystickBatteryLevel(joystick, initial_power_level);
+
driver->Update(joystick);
return joystick;
@@ -2721,7 +2727,19 @@ SDL_JoystickGUID SDL_JoystickGetGUIDFromString(const char *pchGUID)
/* update the power level for this joystick */
void SDL_PrivateJoystickBatteryLevel(SDL_Joystick *joystick, SDL_JoystickPowerLevel ePowerLevel)
{
- joystick->epowerlevel = ePowerLevel;
+ SDL_assert(joystick->ref_count); /* make sure we are calling this only for update, not for initialisation */
+ if (ePowerLevel != joystick->epowerlevel) {
+#if !SDL_EVENTS_DISABLED
+ if (SDL_GetEventState(SDL_JOYBATTERYUPDATED) == SDL_ENABLE) {
+ SDL_Event event;
+ event.type = SDL_JOYBATTERYUPDATED;
+ event.jbattery.which = joystick->instance_id;
+ event.jbattery.level = ePowerLevel;
+ SDL_PushEvent(&event);
+ }
+#endif /* !SDL_EVENTS_DISABLED */
+ joystick->epowerlevel = ePowerLevel;
+ }
}
/* return its power level */