sculpt: use nitpicker's clicked report for popup

By using the clicked report instead of the hover report, we prevent the
misinterpretation of a regular hover update as an overly delayed hover
report matching a previous click (inside the popup). With this patch, the
popup stays open when the pointer leaves the popup after the click.

Issue #5496
Issue #5485
This commit is contained in:
Norman Feske 2025-04-11 19:22:02 +02:00
parent c0dfa3983c
commit f357c4923a
2 changed files with 15 additions and 15 deletions

View File

@ -87,7 +87,7 @@
<service name="Gui"/> <service name="Capture"/> <service name="Event"/>
</provides>
<config focus="rom" request_input="yes" request_framebuffer="yes">
<report hover="yes" touch="yes"/>
<report clicked="yes" touch="yes"/>
<background color="#272f45"/>
<domain name="default" layer="1" content="client" label="no" hover="always" focus="click"/>
<default-policy domain="default"/>
@ -117,7 +117,7 @@
<policy label="manager -> decorator_margins" report="decorator -> decorator_margins"/>
<policy label="nitpicker -> focus" report="manager -> focus"/>
<policy label="gui_fb -> config" report="manager -> gui_fb_config"/>
<policy label="manager -> hover" report="nitpicker -> hover"/>
<policy label="manager -> clicked" report="nitpicker -> clicked"/>
<policy label="manager -> touch" report="nitpicker -> touch"/>
<policy label="runtime -> leitzentrale -> diag_dialog"
@ -242,7 +242,7 @@
<service name="ROM" label_prefix="report ->"> <parent/> </service>
<service name="ROM" label="nitpicker_focus"> <parent/> </service>
<service name="ROM" label="nitpicker_hover"> <parent/> </service>
<service name="ROM" label="hover"> <child name="report_rom"/> </service>
<service name="ROM" label="clicked"> <child name="report_rom"/> </service>
<service name="ROM" label="touch"> <child name="report_rom"/> </service>
<service name="ROM" label="menu_hover"> <child name="report_rom"/> </service>
<service name="ROM" label="window_list"> <child name="report_rom"/> </service>

View File

@ -762,11 +762,11 @@ struct Sculpt::Main : Input_event_handler,
Rom_handler<Main> _nitpicker_hover_handler {
_env, "nitpicker_hover", *this, &Main::_handle_nitpicker_hover };
Rom_handler<Main> _hover_handler {
_env, "hover", *this, &Main::_handle_hover };
Rom_handler<Main> _clicked_handler {
_env, "clicked", *this, &Main::_handle_click_report };
Rom_handler<Main> _touch_handler {
_env, "touch", *this, &Main::_handle_touch };
_env, "touch", *this, &Main::_handle_touch_report };
Expanding_reporter _gui_fb_config { _env, "config", "gui_fb_config" };
@ -789,17 +789,17 @@ struct Sculpt::Main : Input_event_handler,
return false;
}
void _handle_touch(Xml_node const &touch)
void _handle_touch_report(Xml_node const &touch)
{
_popup_touched = _matches_popup_dialog(touch);
_observed_touch_seq_number = { touch.attribute_value("seq_number", 0U) };
_try_handle_popup_close();
}
void _handle_hover(Xml_node const &hover)
void _handle_click_report(Xml_node const &click)
{
_popup_hovered = _matches_popup_dialog(hover);
_observed_hover_seq_number = { hover.attribute_value("seq_number", 0U) };
_popup_clicked = _matches_popup_dialog(click);
_observed_click_seq_number = { click.attribute_value("seq_number", 0U) };
_try_handle_popup_close();
}
@ -981,14 +981,14 @@ struct Sculpt::Main : Input_event_handler,
/* used to correlate clicks with the matching hover report */
Input::Seq_number _emitted_click_seq_number { };
Input::Seq_number _observed_touch_seq_number { };
Input::Seq_number _observed_click_seq_number { };
/* used to correlate touch event with touched-session info from nitpicker */
Input::Seq_number _emitted_touch_seq_number { };
Input::Seq_number _observed_hover_seq_number { };
Input::Seq_number _observed_touch_seq_number { };
bool _popup_touched { };
bool _popup_hovered { };
bool _popup_clicked { };
/**
* Input_event_handler interface
@ -1220,8 +1220,8 @@ struct Sculpt::Main : Input_event_handler,
if (!_popup_touched)
popup_close = true;
if (_emitted_click_seq_number.value == _observed_touch_seq_number.value)
if (!_popup_hovered)
if (_emitted_click_seq_number.value == _observed_click_seq_number.value)
if (!_popup_clicked)
popup_close = true;
if (popup_close) {