Skip to content
  • Martin Flöser's avatar
    Implement support for pointer constraints · 0c5ca405
    Martin Flöser authored
    Summary:
    There are two types of constraints supported:
    1. Pointer confinement
    2. Pointer locking
    
    In the case of confinement the pointer is confined to a given region of
    the surface. This is comparable to general operation where the pointer
    is confined to the screen region.
    
    In the second case the pointer gets locked. That means it cannot move at
    all. No further position updates are provided, only relative motion
    events can go to the application. There is a hint about cursor position
    update on unlock which is not yet implemented in KWayland::Server, thus
    also not in this change.
    
    The implementation in KWin grants the requests for pointer constraints
    when the pointer enters the constrained region, either by pointer
    movement or by e.g. stacking order changes. There is no confirmation
    from user required to enter that mode. But we want to show an OSD when
    the pointer gets constrained, this is not yet implemented, though.
    
    Breaking an active constraint is relatively easy. E.g. changing the
    stacking order will break the constraint if another surface is under the
    cursor. Also (in case of confinement) moving the pointer to an
    overlapping window breaks the confinement. But as soon as one moves the
    pointer back to the window a constraint might get honoured again.
    
    To properly break there is a dedicated event filter. It listens for a
    long press of the Escape key. If hold for 3sec the pointer constraint is
    broken and not activated again till the pointer got moved out of the
    window. Afterward when moving in the pointer might activate again.
    
    The escape filter ensures that the key press is forwarded to the
    application if it's a short press or if another key gets pressed during
    the three seconds. If the three seconds way fires, the later escape
    release is not sent to the application.
    
    This basic interaction is also ensured through an added auto test.
    
    This change implements T4605.
    
    Test Plan: Added auto test and nested KWin Wayland with D3488
    
    Reviewers: #kwin, #plasma_on_wayland
    
    Subscribers: plasma-devel, kwin
    
    Tags: #plasma_on_wayland, #kwin
    
    Differential Revision: https://phabricator.kde.org/D3506
    0c5ca405