Skip to content

fix(sdl3): track mouse button state from events, not polling#13

Merged
pdfinn merged 1 commit intomasterfrom
claude/fix-middle-click-tags-0hhPP
Feb 13, 2026
Merged

fix(sdl3): track mouse button state from events, not polling#13
pdfinn merged 1 commit intomasterfrom
claude/fix-middle-click-tags-0hhPP

Conversation

@pdfinn
Copy link

@pdfinn pdfinn commented Feb 13, 2026

SDL_GetMouseState() returns the instantaneous button state at the time
of the call, not the state when an event was queued. When a fast click
produces both BUTTON_DOWN and BUTTON_UP events before the event loop
polls them, SDL_GetMouseState() during BUTTON_DOWN processing already
shows the button released — the entire click is silently lost.

This is the root cause of middle-click on Xenith tags intermittently
failing to execute: middle-clicks tend to be quick taps, so both events
queue before the poll loop runs, and the button-down is reported as
buttons=0. Left-clicking first appeared to "fix" it because the user
would then click more deliberately, giving the event loop time to
process the down event before the up arrived.

Replace SDL_GetMouseState() polling with event-based button tracking:
BUTTON_DOWN sets the bit, BUTTON_UP clears it. This mirrors how the
X11 backend (win-x11a.c) derives state from the event structure.

Also fixes: the sdl3_mainloop event handler used event.button.x/y for
MOUSE_MOTION events, reading from the wrong union member. Now motion
events correctly use event.motion.x/y.

https://claude.ai/code/session_01W4LrxzkC8jGBN1xi177Wvg

SDL_GetMouseState() returns the instantaneous button state at the time
of the call, not the state when an event was queued. When a fast click
produces both BUTTON_DOWN and BUTTON_UP events before the event loop
polls them, SDL_GetMouseState() during BUTTON_DOWN processing already
shows the button released — the entire click is silently lost.

This is the root cause of middle-click on Xenith tags intermittently
failing to execute: middle-clicks tend to be quick taps, so both events
queue before the poll loop runs, and the button-down is reported as
buttons=0. Left-clicking first appeared to "fix" it because the user
would then click more deliberately, giving the event loop time to
process the down event before the up arrived.

Replace SDL_GetMouseState() polling with event-based button tracking:
BUTTON_DOWN sets the bit, BUTTON_UP clears it. This mirrors how the
X11 backend (win-x11a.c) derives state from the event structure.

Also fixes: the sdl3_mainloop event handler used event.button.x/y for
MOUSE_MOTION events, reading from the wrong union member. Now motion
events correctly use event.motion.x/y.

https://claude.ai/code/session_01W4LrxzkC8jGBN1xi177Wvg
@pdfinn pdfinn merged commit d5b5b62 into master Feb 13, 2026
6 checks passed
@pdfinn pdfinn deleted the claude/fix-middle-click-tags-0hhPP branch February 13, 2026 22:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants