From b5fb37ddeec85ea19bfbd1749ba6befe1b21cba5 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Sun, 7 Feb 2021 12:51:05 +0100 Subject: [PATCH] nitpicker: invalidate dangling hovered ptr This patch adds the missing invalidation of the _hovered pointer to User_state::forget, which is required to cover the situation where the owner of the hovered view vanishes. Fixes #4011 --- repos/os/src/server/nitpicker/user_state.cc | 22 +++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/repos/os/src/server/nitpicker/user_state.cc b/repos/os/src/server/nitpicker/user_state.cc index 4e4e6145f4..1cd641d043 100644 --- a/repos/os/src/server/nitpicker/user_state.cc +++ b/repos/os/src/server/nitpicker/user_state.cc @@ -396,23 +396,29 @@ User_state::Handle_forget_result User_state::forget(View_owner const &owner) _focus.forget(owner); bool const need_to_update_all_views = (&owner == _focused); - bool const focus_changed = &owner == _focused; + bool const focus_vanished = (&owner == _focused); + bool const hover_vanished = (&owner == _hovered); - if (&owner == _focused) _focused = nullptr; - if (&owner == _next_focused) _next_focused = nullptr; - if (&owner == _last_clicked) _last_clicked = nullptr; + auto wipe_ptr = [&] (auto &ptr) { + if (&owner == ptr) + ptr = nullptr; }; + + wipe_ptr(_focused); + wipe_ptr(_next_focused); + wipe_ptr(_last_clicked); + wipe_ptr(_hovered); Update_hover_result const update_hover_result = update_hover(); - if (_input_receiver == &owner) - _input_receiver = nullptr; + wipe_ptr(_input_receiver); if (need_to_update_all_views) _view_stack.update_all_views(); return { - .hover_changed = update_hover_result.hover_changed, - .focus_changed = focus_changed, + .hover_changed = update_hover_result.hover_changed + | hover_vanished, + .focus_changed = focus_vanished, }; }