diff --git a/repos/os/src/server/nitpicker/main.cc b/repos/os/src/server/nitpicker/main.cc index 0fb4465cd6..f1a24ad859 100644 --- a/repos/os/src/server/nitpicker/main.cc +++ b/repos/os/src/server/nitpicker/main.cc @@ -717,22 +717,26 @@ struct Nitpicker::Main : Focus_updater, Hover_updater, if (size_changed) { _view_stack.bounding_box(new_bb); - if (!_user_state.pointer().ok()) - _user_state.pointer(_capture_root.any_visible_pointer_position()); - - _update_pointer_position(); _capture_root.screen_size_changed(); /* redraw */ _view_stack.update_all_views(); } + /* re-evaluate current pointer position */ + _user_state.pointer(_user_state.pointer().convert( + [&] (Point p) { return p; }, + [&] (Nowhere) { return _capture_root.any_visible_pointer_position(); })); + + _update_pointer_position(); + /* notify GUI clients about the mode-info change */ for (Gui_session *s = _session_list.first(); s; s = s->next()) s->notify_mode_change(); _report_panorama(); _update_input_connection(); + update_hover(); } /** diff --git a/repos/os/src/server/nitpicker/user_state.h b/repos/os/src/server/nitpicker/user_state.h index 7a852d4f07..5e688b849f 100644 --- a/repos/os/src/server/nitpicker/user_state.h +++ b/repos/os/src/server/nitpicker/user_state.h @@ -228,7 +228,11 @@ class Nitpicker::User_state _view_stack(view_stack) { } - void pointer(Pointer p) { _pointer = p; } + void pointer(Pointer p) + { + p.with_result([&] (Point pos) { _try_move_pointer(pos); }, + [&] (Nowhere) { _pointer = Nowhere { }; }); + } Pointer pointer() const { return _pointer; }