https://bugs.kde.org/show_bug.cgi?id=454428
Bug ID: 454428
Summary: Touchpad based kinetic scrolling in gtk applications
does not work
Product: kwin
Version: 5.24.5
Platform: Manjaro
OS: Linux
Status: REPORTED
Severity: normal
Priority: NOR
Component: input
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: ---
SUMMARY
Touchpad based kinetic scrolling in gtk applications does not work when using
kwin (wayland). After doing some digging and testing I found that the reason is
the way wl_pointer.axis_stop events are sent to application windows. kwin
(actually kwayland-server before it was merged in kwin) currently sends the
stop event for each axis in its own frame:
```
[13: wl_pointer] frame
[13: wl_pointer] axis_source: 1 (finger)
[13: wl_pointer] axis_stop: time: 1054759; axis: 0 (vertical)
[13: wl_pointer] frame
[13: wl_pointer] axis_source: 1 (finger)
[13: wl_pointer] axis_stop: time: 1054759; axis: 1 (horizontal)
[13: wl_pointer] frame
```
In other compositors (weston, wlroots based like sway, mutter) the stop events
for both axes are bundled in a single frame:
```
[13: wl_pointer] frame
[13: wl_pointer] axis_source: 1 (finger)
[13: wl_pointer] axis_stop: time: 1054759; axis: 0 (vertical)
[13: wl_pointer] axis_stop: time: 1054759; axis: 1 (horizontal)
[13: wl_pointer] frame
```
After patching kwayland-server to behave like sway etc kinetic scrolling works.
The patch needs more work obviously and is only intended to show the bare
minimum of changes to "make it work":
```
diff --git a/src/server/pointer_interface.cpp
b/src/server/pointer_interface.cpp
index b552ac4..128c6d9 100644
--- a/src/server/pointer_interface.cpp
+++ b/src/server/pointer_interface.cpp
@@ -236,7 +236,11 @@ void PointerInterface::sendAxis(Qt::Orientation
orientation, qreal delta, qint32
}
d->send_axis(resource->handle, d->seat->timestamp(),
wlOrientation, wl_fixed_from_double(delta));
} else if (version >= WL_POINTER_AXIS_STOP_SINCE_VERSION) {
- d->send_axis_stop(resource->handle, d->seat->timestamp(),
wlOrientation);
+ if (wlOrientation == 0)
+ {
+ d->send_axis_stop(resource->handle, d->seat->timestamp(), 0);
+ d->send_axis_stop(resource->handle, d->seat->timestamp(), 1);
+ }
}
}
}
```
STEPS TO REPRODUCE
1. Open some gtk application, e.g. use gedit to display a large text file.
2. Scroll using touchpad and lift fingers while they are moving.
OBSERVED RESULT
The scrolling stops immediately after lifting the fingers.
EXPECTED RESULT
The scrolling goes on after lifting the fingers up.
SOFTWARE/OS VERSIONS
OS: Manjaro 21.2.6
uname -a: Linux marcus-surface 5.17.9-arch1-2-surface #1 SMP PREEMPT Wed, 25
May 2022 15:31:19 +0000 x86_64 GNU/Linux
KDE Plasma Version: KDE Plasma 5.24.5
KDE Frameworks Version: 5.94.0
Qt Version: 5.15.4
--
You are receiving this mail because:
You are watching all bug changes.