diff --git a/repos/gems/src/app/decorator/main.cc b/repos/gems/src/app/decorator/main.cc index cde5e547a4..bcb9c1ed76 100644 --- a/repos/gems/src/app/decorator/main.cc +++ b/repos/gems/src/app/decorator/main.cc @@ -296,31 +296,16 @@ void Decorator::Main::_handle_gui_sync() if (_window_layout_update_needed && _window_layout.valid()) { - try { - Xml_node xml(_window_layout.local_addr(), - _window_layout.size()); + _window_stack.update_model(_window_layout.xml(), flush_window_stack_changes); - _window_stack.update_model(xml, flush_window_stack_changes); + model_updated = true; - model_updated = true; - - /* - * A decorator element might have appeared or disappeared under - * the pointer. - */ - if (_pointer.valid()) - update_hover_report(Xml_node(_pointer.local_addr()), - _window_stack, _hover, _hover_reporter); - - } catch (Xml_node::Invalid_syntax) { - - /* - * An error occured with processing the XML model. Flush the - * internal representation with an empty window layout. - */ - _window_stack.update_model(Xml_node(""), - flush_window_stack_changes); - } + /* + * A decorator element might have appeared or disappeared under + * the pointer. + */ + update_hover_report(_pointer.xml(), + _window_stack, _hover, _hover_reporter); _window_layout_update_needed = false; } @@ -359,9 +344,7 @@ void Decorator::Main::_handle_pointer_update() { _pointer.update(); - if (_pointer.valid()) - update_hover_report(Xml_node(_pointer.local_addr()), - _window_stack, _hover, _hover_reporter); + update_hover_report(_pointer.xml(), _window_stack, _hover, _hover_reporter); } diff --git a/repos/gems/src/app/window_layouter/main.cc b/repos/gems/src/app/window_layouter/main.cc index f908a7af51..d0b7e505f7 100644 --- a/repos/gems/src/app/window_layouter/main.cc +++ b/repos/gems/src/app/window_layouter/main.cc @@ -259,8 +259,10 @@ struct Window_layouter::Main : Operations, * Update window layout because highlighting may have changed after the * drag operation. E.g., if the window has not kept up with the * dragging of a resize handle, the resize handle is no longer hovered. + * + * The call of '_handle_hover' implicitly triggers '_gen_window_layout'. */ - _gen_window_layout(); + _handle_hover(); _drag_state = Drag_state::SETTLING; @@ -308,10 +310,6 @@ struct Window_layouter::Main : Operations, Signal_handler
_decorator_margins_handler { _env.ep(), *this, &Main::_handle_decorator_margins}; - - /** - * Install handler for responding to user input - */ void _handle_input() { while (_input.pending()) @@ -601,10 +599,11 @@ void Window_layouter::Main::_handle_hover() /* * An exception may occur during the 'Xml_node' construction if the hover - * model is malformed. Under this condition, we invalidate the hover state. + * model lacks a window. Under this condition, we invalidate the hover + * state. */ catch (...) { - + _user_state.reset_hover(); /* diff --git a/repos/gems/src/app/window_layouter/user_state.h b/repos/gems/src/app/window_layouter/user_state.h index e2967c5a40..255b17dca8 100644 --- a/repos/gems/src/app/window_layouter/user_state.h +++ b/repos/gems/src/app/window_layouter/user_state.h @@ -282,21 +282,22 @@ void Window_layouter::User_state::_handle_event(Input::Event const &e, } /* detect end of drag operation */ - if (e.release() && _key_cnt == 0 && _dragged_window_id.valid()) { + if (e.release() && _key_cnt == 0) { _drag_state = false; - /* - * Issue resize to 0x0 when releasing the the window closer - */ - if (_dragged_element == Window::Element::CLOSER) { + if (_dragged_window_id.valid()) { - if (_dragged_element == _hovered_element) - _operations.close(_dragged_window_id); + /* + * Issue resize to 0x0 when releasing the the window closer + */ + if (_dragged_element == Window::Element::CLOSER) + if (_dragged_element == _hovered_element) + _operations.close(_dragged_window_id); + + _operations.finalize_drag(_dragged_window_id, _dragged_element, + _pointer_clicked, _pointer_curr); } - - _operations.finalize_drag(_dragged_window_id, _dragged_element, - _pointer_clicked, _pointer_curr); } /* handle key sequences */