Bug 237287 - moused(8) ignores button release events in virtual scroll mode
Summary: moused(8) ignores button release events in virtual scroll mode
Status: Open
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: CURRENT
Hardware: Any Any
: --- Affects Some People
Assignee: freebsd-bugs (Nobody)
URL:
Keywords: needs-qa
Depends on:
Blocks:
 
Reported: 2019-04-14 20:57 UTC by Bojan Petrovic
Modified: 2019-04-15 05:43 UTC (History)
2 users (show)

See Also:
koobs: mfc-stable12?
koobs: mfc-stable11?


Attachments
moused.c.diff (597 bytes, patch)
2019-04-14 20:57 UTC, Bojan Petrovic
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Bojan Petrovic 2019-04-14 20:57:50 UTC
Created attachment 203676 [details]
moused.c.diff

Sometimes when I double-click a word in an X terminal to select it and then immediately click the middle button to paste it, the terminal is left in drag selection mode as if the left button was not released on the second click.

This behavior can be reproduced by the following sequence when running "moused" with "-V" option:

1. press and hold left button
2. press and hold middle button
3. release left button
4. release middle button

The X terminal will be in drag selection mode.

The debug output (grepped for "moused: button.*count") for the sequence of events above when I run moused with virtual scrolling OFF is:

moused: button 1  count 1
moused: button 2  count 1
moused: button 1  count 0
moused: button 2  count 0

The debug output with virtual scrolling ON:

moused: button 1  count 1
moused: button 2  count 1
moused: button 2  count 1
moused: button 2  count 0

In virtual scrolling case the button 1 count never drops to 0.

In current code, the SCROLL_PREPARE mode can be entered when multiple buttons are held pressed, and then all of them released except for the middle button:

  if (action0.button == MOUSE_BUTTON2DOWN)

In this mode button events are not emmited:

  /* Defer clicks until we aren't VirtualScroll'ing. */
  if (scroll_state == SCROLL_NOTSCROLLING)
      r_click(&action2);


Because of this, the left button release is not registered.

I've attached a patch which fixes this issue for me. It allows the virtual scroll mode to be entered only if no other button was held before pressing middle button.
Comment 1 Kubilay Kocak freebsd_committer freebsd_triage 2019-04-15 05:43:26 UTC
Thank you for the analysis and patch Bojan

CC Philip and Jordan who added virtual scrolling support a while back :)