wustho / baca

TUI Ebook Reader
GNU General Public License v3.0
363 stars 4 forks source link

Glitchy scrolling with (touchpad emulated) mouse wheel #10

Open xiota opened 1 year ago

xiota commented 1 year ago

Using (touchpad emulated) mouse wheel to scroll with current git checkout (6318c717cfc4c3d88ac34e1624fae48e8dfab584). Looks like the scroll overshoots a little then bounces back, on each line. Does not occur with epy.

wustho commented 1 year ago

That's weird, I cannot replicate it, is there anymore details to recreate it? Does it work on different terminals?

xiota commented 1 year ago

Arch Linux. Don't really know what's relevant. It's present in all combinations of the following that I've tried:

I'm scrolling with a touchpad. Maybe it's a hardware issue. I know some touchpads report scroll behavior differently from the wheel on a mouse. Sorry for inaccurate description. Have edited to clarify.

xiota commented 1 year ago

Tested with an external mouse. Same problem.

Tried compiling with nuitka, and the problem is absent/reduced, so scrolling may be affected by some processing. Does baca perform some calculations in a loop that epy doesn't?

Occasionally, the glitchy scrolling does not occur, but far more often it does. (Out of all testing so far, only 2-3 times it was not glitchy.)

xiota commented 1 year ago

I was poking around in the code and found this:

contents.py (L158-L162):

    def on_mouse_scroll_down(self, _: events.MouseScrollDown) -> None:
        self.screen.scroll_down()

    def on_mouse_scroll_up(self, _: events.MouseScrollUp) -> None:
        self.screen.scroll_up()

Changing it to the following (based on Textual: widget.py) corrects the scrolling behavior:

    def on_mouse_scroll_down(self, _: events.MouseScrollDown) -> None:
        if self._scroll_down_for_pointer(animate=False):
            event.stop()

    def on_mouse_scroll_up(self, _: events.MouseScrollUp) -> None:
        if self._scroll_up_for_pointer(animate=False):
            event.stop()
xiota commented 1 year ago

Switching to self.scroll_*() also seems to work. Glitchiness only occurs with self.screen.scroll_*().

xiota commented 1 year ago

Did some more testing.