This commit is contained in:
LordCarve 2026-06-05 14:01:23 -06:00 committed by GitHub
commit eb347d4ec0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 32 additions and 27 deletions

View file

@ -562,14 +562,14 @@ void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *wind
}
}
void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, Uint8 button, bool down)
void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, Uint8 pen_button, Uint8 mouse_button, bool down)
{
bool send_event = false;
SDL_PenInputFlags input_state = 0;
float x = 0.0f;
float y = 0.0f;
if ((button < 1) || (button > 5)) {
if ((pen_button < 1) || (pen_button > 5)) {
return; // clamp for now.
}
@ -583,7 +583,7 @@ void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *wind
EnsurePenProximity(timestamp, pen, window);
input_state = pen->input_state;
const Uint32 flag = (Uint32) (1u << button);
const Uint32 flag = (Uint32) (1u << pen_button);
const bool current = ((input_state & flag) != 0);
x = pen->x;
y = pen->y;
@ -610,23 +610,14 @@ void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *wind
event.pbutton.pen_state = input_state;
event.pbutton.x = x;
event.pbutton.y = y;
event.pbutton.button = button;
event.pbutton.button = pen_button;
event.pbutton.down = down;
SDL_PushEvent(&event);
if (window && (!pen_touching || (pen_touching == instance_id))) {
if (window && (!pen_touching || (pen_touching == instance_id)) && mouse_button > 0) {
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse && mouse->pen_mouse_events) {
static const Uint8 mouse_buttons[] = {
SDL_BUTTON_LEFT,
SDL_BUTTON_RIGHT,
SDL_BUTTON_MIDDLE,
SDL_BUTTON_X1,
SDL_BUTTON_X2
};
if (button < SDL_arraysize(mouse_buttons)) {
SDL_SendMouseButton(timestamp, window, SDL_PEN_MOUSEID, mouse_buttons[button], down);
}
SDL_SendMouseButton(timestamp, window, SDL_PEN_MOUSEID, mouse_button, down);
}
}
}

View file

@ -78,8 +78,8 @@ extern void SDL_SendPenMotion(Uint64 timestamp, SDL_PenID instance_id, SDL_Windo
// Backend calls this when a pen's axis changes, to generate events and update state.
extern void SDL_SendPenAxis(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, SDL_PenAxis axis, float value);
// Backend calls this when a pen's button changes, to generate events and update state.
extern void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, Uint8 button, bool down);
// Backend calls this when a pen's button changes, to generate events and update state. Mouse button is passed explicitly because which pen button corresponds to which mouse button is backend-dependent.
extern void SDL_SendPenButton(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, Uint8 pen_button, Uint8 mouse_button, bool down);
// Backend calls this when a pen's proximity changes, to generate events and update state.
extern void SDL_SendPenProximity(Uint64 timestamp, SDL_PenID instance_id, SDL_Window *window, bool in, bool immediate);

View file

@ -34,6 +34,20 @@
#define ACTION_HOVER_ENTER 9
#define ACTION_HOVER_EXIT 10
/*
* Helper function to map android pen buttons to SDL mouse buttons
*/
static inline Uint8 Android_PenToMouseButton(Uint8 pen_button)
{
switch (pen_button)
{
case 1: return SDL_BUTTON_RIGHT;
case 2: return SDL_BUTTON_MIDDLE;
case 5: return 0;
default: return pen_button + 1;
}
}
void Android_OnPen(SDL_Window *window, int pen_id_in, SDL_PenDeviceType device_type, int button, int action, float x, float y, float p)
{
if (!window) {
@ -69,7 +83,7 @@ void Android_OnPen(SDL_Window *window, int pen_id_in, SDL_PenDeviceType device_t
for (Uint8 i = 1; i <= 5; ++i) {
Uint8 mask = (1 << i);
if (diff & mask) {
SDL_SendPenButton(0, pen, window, i, (button & mask) != 0);
SDL_SendPenButton(0, pen, window, i, Android_PenToMouseButton(i), (button & mask) != 0);
}
}
}
@ -101,4 +115,4 @@ void Android_OnPen(SDL_Window *window, int pen_id_in, SDL_PenDeviceType device_t
}
}
#endif // SDL_VIDEO_DRIVER_ANDROID
#endif // SDL_VIDEO_DRIVER_ANDROID

View file

@ -138,8 +138,8 @@ static void Cocoa_HandlePenPointEvent(SDL_CocoaWindowData *_data, NSEvent *event
SDL_SendPenTouch(timestamp, pen, window, handle->is_eraser, is_touching);
SDL_SendPenMotion(timestamp, pen, window, (float) point.x, (float) (window->h - point.y));
SDL_SendPenButton(timestamp, pen, window, 1, ((buttons & NSEventButtonMaskPenLowerSide) != 0));
SDL_SendPenButton(timestamp, pen, window, 2, ((buttons & NSEventButtonMaskPenUpperSide) != 0));
SDL_SendPenButton(timestamp, pen, window, 1, SDL_BUTTON_RIGHT, ((buttons & NSEventButtonMaskPenLowerSide) != 0));
SDL_SendPenButton(timestamp, pen, window, 2, SDL_BUTTON_MIDDLE, ((buttons & NSEventButtonMaskPenUpperSide) != 0));
SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_PRESSURE, [event pressure]);
SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_ROTATION, [event rotation]);
SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_XTILT, ((float) tilt.x) * 90.0f);

View file

@ -815,10 +815,10 @@ static void Emscripten_UpdatePenFromEvent(SDL_WindowData *window_data, const Ems
SDL_SendPenTouch(0, pen, window_data->window, true, down);
} else if (event->button == 1) {
bool down = ((event->buttons & 4) != 0);
SDL_SendPenButton(0, pen, window_data->window, 2, down);
SDL_SendPenButton(0, pen, window_data->window, 2, SDL_BUTTON_MIDDLE, down);
} else if (event->button == 2) {
bool down = ((event->buttons & 2) != 0);
SDL_SendPenButton(0, pen, window_data->window, 1, down);
SDL_SendPenButton(0, pen, window_data->window, 1, SDL_BUTTON_RIGHT, down);
}
SDL_SendPenAxis(0, pen, window_data->window, SDL_PEN_AXIS_PRESSURE, event->pressure);

View file

@ -3560,7 +3560,7 @@ static void tablet_tool_handle_frame(void *data, struct zwp_tablet_tool_v2 *tool
for (int i = 0; i < SDL_arraysize(sdltool->frame.buttons); i++) {
const int state = sdltool->frame.buttons[i];
if (state) {
SDL_SendPenButton(timestamp, instance_id, window, (Uint8)(i + 1), state == WAYLAND_TABLET_TOOL_BUTTON_DOWN);
SDL_SendPenButton(timestamp, instance_id, window, (Uint8)(i + 1), (Uint8)(i + 2), state == WAYLAND_TABLET_TOOL_BUTTON_DOWN);
}
}

View file

@ -1403,8 +1403,8 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
}
SDL_SendPenMotion(timestamp, pen, window, fx, fy);
SDL_SendPenButton(timestamp, pen, window, 1, (pen_info.penFlags & PEN_FLAG_BARREL) != 0);
SDL_SendPenButton(timestamp, pen, window, 2, (pen_info.penFlags & PEN_FLAG_ERASER) != 0);
SDL_SendPenButton(timestamp, pen, window, 1, SDL_BUTTON_RIGHT, (pen_info.penFlags & PEN_FLAG_BARREL) != 0);
SDL_SendPenButton(timestamp, pen, window, 2, SDL_BUTTON_MIDDLE, (pen_info.penFlags & PEN_FLAG_ERASER) != 0);
if (pen_info.penMask & PEN_MASK_PRESSURE) {
SDL_SendPenAxis(timestamp, pen, window, SDL_PEN_AXIS_PRESSURE, ((float) pen_info.pressure) / 1024.0f); // pen_info.pressure is in the range 0..1024.

View file

@ -618,7 +618,7 @@ void X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie)
if (button == 1) { // button 1 is the pen tip
SDL_SendPenTouch(0, pen->pen, window, pen->is_eraser, down);
} else {
SDL_SendPenButton(0, pen->pen, window, button - 1, down);
SDL_SendPenButton(0, pen->pen, window, button - 1, button, down);
}
} else if (!pointer_emulated) {
// Otherwise assume a regular mouse