Skip to content

Conversation

@jtollet
Copy link
Contributor

@jtollet jtollet commented Dec 14, 2025

Pull Request: Fix SGR and PIXEL mouse modes blocked by mouse_event check

Summary

This PR fixes a bug where SGR (mode 1006) and PIXEL (mode 1016) mouse modes were not working in applications like less and vim due to an incorrect condition check.

The Bug

In src/tsm/tsm-vte.c, the SGR and PIXEL mode handlers check both the mouse mode AND the mouse_event flag:

} else if (vte->mouse_mode == TSM_VTE_MOUSE_MODE_SGR && vte->mouse_event) {
    // SGR handling code
}
} else if (vte->mouse_mode == TSM_VTE_MOUSE_MODE_PIXEL && vte->mouse_event) {
    // PIXEL handling code
}

Problem: When applications like less or vim activate SGR mouse mode, they don't always set vte->mouse_event first. The value remains 0, causing the condition && vte->mouse_event to evaluate to false, and the SGR/PIXEL handler never executes.

The Fix

Remove the && vte->mouse_event condition from both checks:

} else if (vte->mouse_mode == TSM_VTE_MOUSE_MODE_SGR) {
    // SGR handling code
}
} else if (vte->mouse_mode == TSM_VTE_MOUSE_MODE_PIXEL) {
    // PIXEL handling code
}

Rationale: The mouse_mode check alone is sufficient. If the mode is set to SGR or PIXEL, the handler should execute. The mouse_event flag is used internally to filter event types (press/release/motion), but shouldn't prevent the mode handler from running.

Test Cases

Before the fix:

  • Run less --mouse in kmscon → mouse wheel does NOT work
  • Run vim with :set mouse=a ttymouse=sgr → mouse wheel does NOT work (in some cases)

After the fix:

  • Run less --mouse in kmscon → mouse wheel WORKS correctly
  • Run vim with :set mouse=a ttymouse=sgr → mouse wheel WORKS correctly

Impact

This bug affects any application using libtsm that:

  1. Activates SGR or PIXEL mouse modes
  2. Doesn't explicitly set mouse_event before sending mouse events
  3. Common examples: less, vim, emacs, nano with mouse support

Related Information

  • SGR mode (1006) is the modern standard for mouse reporting in terminals
  • It's supported by all major terminal emulators (xterm, gnome-terminal, etc.)
  • This bug makes libtsm incompatible with standard terminal behavior

Compatibility

This change has no negative impact:

  • Applications that DO set mouse_event will continue to work
  • Applications that DON'T set mouse_event will now work correctly
  • No API changes
  • Purely a bug fix

The SGR (mode 1006) and PIXEL (mode 1016) mouse mode handlers
were incorrectly checking the vte->mouse_event flag, which prevented
these modes from working when mouse_event was 0.

This bug affected applications like less and vim that activate SGR
mouse mode without setting a specific mouse_event value. The condition
"&& vte->mouse_event" was preventing the mode handlers from executing
even when the mouse mode was correctly set to SGR or PIXEL.

The mouse_event flag is used to filter which types of events to report
(button press/release, motion, etc.), but it should not prevent the
mode handler from executing when the mode is active. The mode check
alone (vte->mouse_mode == TSM_VTE_MOUSE_MODE_SGR) is sufficient.

Test case:
  - Run 'less --mouse' in kmscon
  - Before fix: mouse wheel does not work
  - After fix: mouse wheel works correctly
  - Same behavior applies to vim with 'set ttymouse=sgr'
@kdj0c
Copy link
Contributor

kdj0c commented Dec 16, 2025

It looks good to me, if no other comment, I'll merge it soon.

@kdj0c kdj0c merged commit b0df3c6 into kmscon:main Dec 17, 2025
2 checks passed
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