This should fix https://github.com/pop-os/cosmic-comp/issues/494, and
make clipboard and primary focus consistently correct.
Changing the active element of a stack needs to change the clipboard
focus, but it wasn't being changed since the `KeyboardFocusTarget` was
unchanged. The `CosmicStack` methods that change the active stack
element also have no obvious way to change the keyboard focus. So we can
set this in `refresh_focus`, which should be correct.
If the new focus `WlSurface` is `None`, this clears the focus instead of
leaving it as the previous code did. I believe that is desirable.
Requires https://github.com/Smithay/smithay/pull/1442 to avoid repeated
`offer`s, instead of only when focus changed.
(Perhaps this could better be solved by having a `WlSurface` variant of
`KeyboardFocusTarget`, like pointer focus, or some mechanism for a stack
of focus, which could help other things. But it's also unclear exactly
how that would work with the code for setting the active stack element,
among other questions.)
This should now match the protocol specification, and how Sway behaves.
If a surface in the `Top` or `Overlay` has
`KeyboardInteractivity::Exclusive`, only that surface can have keyboard
focus. If multiple surfaces do, focus can be changed between those with
keyboard exclusivity on the highest layer.
This is similar to session lock surfaces, except a session lock takes
precedence.
This fixes the behavior of keyboard focus in `cosmic-greeter`, with the
current layer-shell based implementation.