From c3b415ffe80ca6f76edc0985ae829effccc5ac35 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 4 Dec 2015 16:16:40 +0100 Subject: [PATCH] wm: omit superfluous window-list updates --- repos/gems/src/server/wm/nitpicker.h | 5 ++ repos/gems/src/server/wm/window_registry.h | 90 ++++++++++++++++------ 2 files changed, 70 insertions(+), 25 deletions(-) diff --git a/repos/gems/src/server/wm/nitpicker.h b/repos/gems/src/server/wm/nitpicker.h index c1acf2ad7..07efec35d 100644 --- a/repos/gems/src/server/wm/nitpicker.h +++ b/repos/gems/src/server/wm/nitpicker.h @@ -895,6 +895,9 @@ class Wm::Nitpicker::Session_component : public Rpc_object, catch (View_handle_registry::Lookup_failed) { PWRN("view lookup failed during command execution"); } } + + /* propagate window-list changes to the layouter */ + _window_registry.flush(); } Framebuffer::Mode mode() override @@ -1297,6 +1300,8 @@ class Wm::Nitpicker::Root : public Genode::Rpc_objectnext()) + result &= w->is_flushed(); + + return result; + } + private: Allocator &_alloc; @@ -149,8 +181,10 @@ class Wm::Window_registry { Reporter::Xml_generator xml(_window_list_reporter, [&] () { - for (Window const *w = _windows.first(); w; w = w->next()) + for (Window const *w = _windows.first(); w; w = w->next()) { w->generate_window_list_entry_xml(xml); + w->mark_as_flushed(); + } }); } @@ -165,8 +199,6 @@ class Wm::Window_registry } win->attr(value); - - _report_updated_window_list_model(); } public: @@ -230,6 +262,14 @@ class Wm::Window_registry { _set_attr(id, resizeable ? Window::RESIZEABLE : Window::NOT_RESIZEABLE); } + + void flush() + { + if (_is_flushed()) + return; + + _report_updated_window_list_model(); + } }; #endif /* _WINDOW_REGISTRY_H_ */