mirror of
https://github.com/genodelabs/genode.git
synced 2025-03-14 16:26:30 +00:00
nitpicker: no absolute motion without hover
This patch enforces the invariant that absolute motion events are delivered to the hovered client only. If no client is hovered, the event is discarded. Otherwise, in a situation where no client is hovered (i.e., due to a background that does not cover the entire screen) but a focus is defined, absolute motion events would be delivered to the focused session. From a client's perspective, when moving the pointer from the client to emptiness, the client would observe a leave event followed by absolute motion. This, in turn, confuses the window manager, which expects that the receiver of an absolute motion event is hovered. Fixes #5375
This commit is contained in:
parent
ab736c04f6
commit
3600705a2f
@ -256,16 +256,20 @@ void User_state::_handle_input_event(Input::Event ev)
|
||||
|
||||
View_owner *receiver = _input_receiver;
|
||||
|
||||
if (_key_cnt == 0 && _hovered) {
|
||||
if (_key_cnt == 0) {
|
||||
|
||||
auto abs_motion_receiver = [&] () -> View_owner *
|
||||
{
|
||||
if (!_hovered)
|
||||
return nullptr;
|
||||
|
||||
bool const permitted = _hovered->hover_always()
|
||||
|| _hovered->has_same_domain(_focused);
|
||||
return permitted ? _hovered : nullptr;
|
||||
};
|
||||
|
||||
if (ev.absolute_motion())
|
||||
receiver = nullptr;
|
||||
/*
|
||||
* Unless the domain of the pointed session is configured to
|
||||
* always receive hover events, we deliver motion events only
|
||||
* to the focused domain.
|
||||
*/
|
||||
if (_hovered->hover_always() || _hovered->has_same_domain(_focused))
|
||||
receiver = _hovered;
|
||||
receiver = abs_motion_receiver();
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user