<div dir="ltr"><div>Thanks, it looks exactly like it. Now just have to see how to make it work with Qt but that's another question :)</div><div><br></div><div>Kind regards,</div><div>Jean-Michaël<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 26, 2021 at 5:08 PM Jonas Ådahl <<a href="mailto:jadahl@gmail.com" target="_blank">jadahl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Mon, Apr 26, 2021 at 04:57:01PM +0200, Jean-Michaël Celerier wrote:<br>
> Hello,<br>
> I am working on the multimedia sequencer ossia score (<a href="https://ossia.io" rel="noreferrer" target="_blank">https://ossia.io</a>).<br>
> <br>
> I am trying to make sure that it works fine for Linux users under wayland.<br>
> <br>
> For audio (and in general multimedia) apps, there is a very common family<br>
> of GUI widget which allows to scroll a value "infinitely" (or at least much<br>
> more than the height of the screen) - the usual user interaction is :<br>
> * User clicks on the widget : the mouse cursor disappears (some apps will<br>
> give a kind of highlight to the widget to indicate that it is being acted<br>
> upon)<br>
> * User moves their mouse upwards or downwards to increase the value<br>
> * At some point they reach the top or the bottom of the screen : to<br>
> continue scrolling transparently, the app translates the mouse cursor to<br>
> the top of the screen<br>
> * When the user releases the mouse the cursor reappears at the position<br>
> where it was clicked.<br>
> <br>
> This is needed in two case :<br>
> - To make sliders / knobs with easily adjustable values<br>
> - To implement infinite- or at least very long scrolling in minimaps.<br>
> <br>
> I made a few videos:<br>
> - Video 1: example of slider with the feature in Ableton Live (one of the<br>
> most used music making app) : <a href="https://streamable.com/ecepvc" rel="noreferrer" target="_blank">https://streamable.com/ecepvc</a><br>
> <br>
> - Video 2 : example of minimap in Ableton Live :<br>
> <a href="https://streamable.com/epc7r1" rel="noreferrer" target="_blank">https://streamable.com/epc7r1</a><br>
> <br>
> - Video 3 : Example of the pain induced by software that do not support the<br>
> feature: here I want to change the tempo but cannot because the mouse hits<br>
> the top of the screen. Thus I have to release and go click on it again :<br>
> <a href="https://streamable.com/bniht5" rel="noreferrer" target="_blank">https://streamable.com/bniht5</a><br>
> <br>
> Thus, my question is : what must I do as the developer of such an app to<br>
> make sure that my users will have widgets that will work "as expected" for<br>
> people in the media creation field, whatever the wayland compositor my<br>
> users are using (KDE Plasma, GNOME, sway...). I don't want them to have an<br>
> inferior user experience on Linux when compared to other operating systems.<br>
> <br>
> The googling I've done so far seems to say that there is no way to position<br>
> the cursor absolutely directly through wayland, but the only other way<br>
> seems to be through /dev/uinput which needs root permissions to write to<br>
> (and my userbase are artists who generally don't have the technical<br>
> skillset to know that they must mark things as root; I could always check<br>
> and show a popup that requests the user to do chmod u+rwx on /dev/uinput on<br>
> startup but that would be my last resort...)<br>
<br>
To implement the behavior shown in video 1 and 2, the "Wayland" way is<br>
depends on two protocols extension:<br>
<br>
 * Pointer locking extension[0]<br>
 * Relative pointer motions extension[1]<br>
<br>
With the core wl_pointer protocol object, you can control when the<br>
pointer cursor sprite is showing or not; with the pointer locking<br>
extension, you can effectively lock the pointer position to its<br>
position, meaning it will stay put and won't "escape" your application<br>
window; and lastly, with the relative pointer motions extension, you can<br>
receive pointer motions that are not affected by actual movement of the<br>
pointer cursor sprite, i.e. even if the pointer hit an edge or doesn't<br>
move, you'll still receive the motions as sent from the device.<br>
<br>
I think most compositors support these two protocol extensions as they<br>
are a corner stone in how e.g. 3D FPS games work.<br>
<br>
<br>
Jonas<br>
<br>
[0] <a href="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml</a><br>
[1] <a href="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/relative-pointer/relative-pointer-unstable-v1.xml" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/relative-pointer/relative-pointer-unstable-v1.xml</a><br>
<br>
> <br>
> Thanks !<br>
> Jean-Michaël<br>
<br>
> _______________________________________________<br>
> wayland-devel mailing list<br>
> <a href="mailto:wayland-devel@lists.freedesktop.org" target="_blank">wayland-devel@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/wayland-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
<br>
</blockquote></div>