mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-11 11:51:46 +00:00
wm: hide child views if top-level view vanishes
This patch handles the corner case of switching virtual desktops while child views are visible. Examples of such child views are tool tips, pull-down menus, or the graph of the top-view utility. The switch to another virtual desktop would implicitely turn the child views into top-level views of the root nitpicker GUI server until switching back to the original virtual desktop. The patch implements the expected behavior of hiding all child views that belong to a disappearing top-level view.
This commit is contained in:
parent
d21464399f
commit
78d7a08618
@ -54,6 +54,8 @@ struct Wm::Decorator_content_callback : Interface
|
|||||||
virtual Gui::View_capability content_view(Window_registry::Id win_id) = 0;
|
virtual Gui::View_capability content_view(Window_registry::Id win_id) = 0;
|
||||||
|
|
||||||
virtual void update_content_child_views(Window_registry::Id win_id) = 0;
|
virtual void update_content_child_views(Window_registry::Id win_id) = 0;
|
||||||
|
|
||||||
|
virtual void hide_content_child_views(Window_registry::Id win_id) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -369,6 +371,9 @@ struct Wm::Decorator_gui_session : Genode::Rpc_object<Gui::Session>,
|
|||||||
Gui::Rect rect(Gui::Point(0, 0), Gui::Area(0, 0));
|
Gui::Rect rect(Gui::Point(0, 0), Gui::Area(0, 0));
|
||||||
_gui_session.enqueue<Gui::Session::Command::Geometry>(view, rect);
|
_gui_session.enqueue<Gui::Session::Command::Geometry>(view, rect);
|
||||||
_gui_session.execute();
|
_gui_session.execute();
|
||||||
|
|
||||||
|
Window_registry::Id win_id = _content_registry.lookup(view);
|
||||||
|
_content_callback.hide_content_child_views(win_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
_gui_session.destroy_view(view);
|
_gui_session.destroy_view(view);
|
||||||
|
@ -451,6 +451,15 @@ class Wm::Gui::Child_view : public View, private List<Child_view>::Element
|
|||||||
{
|
{
|
||||||
_apply_view_config();
|
_apply_view_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hide()
|
||||||
|
{
|
||||||
|
if (!_real_handle.valid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
_real_gui.destroy_view(_real_handle);
|
||||||
|
_real_handle = { };
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -829,6 +838,13 @@ class Wm::Gui::Session_component : public Rpc_object<Gui::Session>,
|
|||||||
v->update_child_stacking();
|
v->update_child_stacking();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hide_content_child_views(Window_registry::Id id)
|
||||||
|
{
|
||||||
|
for (Child_view *v = _child_views.first(); v; v = v->next())
|
||||||
|
if (v->belongs_to_win_id(id))
|
||||||
|
v->hide();
|
||||||
|
}
|
||||||
|
|
||||||
void content_geometry(Window_registry::Id id, Rect rect)
|
void content_geometry(Window_registry::Id id, Rect rect)
|
||||||
{
|
{
|
||||||
for (Top_level_view *v = _top_level_views.first(); v; v = v->next()) {
|
for (Top_level_view *v = _top_level_views.first(); v; v = v->next()) {
|
||||||
@ -1419,6 +1435,16 @@ class Wm::Gui::Root : public Genode::Rpc_object<Genode::Typed_root<Session> >,
|
|||||||
s->update_stacking_order_of_children(id);
|
s->update_stacking_order_of_children(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hide_content_child_views(Window_registry::Id id) override
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Destroy physical views for the child views belonging to the
|
||||||
|
* specified id.
|
||||||
|
*/
|
||||||
|
for (Session_component *s = _sessions.first(); s; s = s->next())
|
||||||
|
s->hide_content_child_views(id);
|
||||||
|
}
|
||||||
|
|
||||||
void content_geometry(Window_registry::Id id, Rect rect) override
|
void content_geometry(Window_registry::Id id, Rect rect) override
|
||||||
{
|
{
|
||||||
for (Session_component *s = _sessions.first(); s; s = s->next())
|
for (Session_component *s = _sessions.first(); s; s = s->next())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user