Skip to content

Commit

Permalink
[Xwayland] improve handling of CLion subsidiary windows (#3145)
Browse files Browse the repository at this point in the history
* When trees are "collected", indirect children should be included

* Better handling of CLion's first level of menus

* Fix #3107 too
  • Loading branch information
AlanGriffiths committed Nov 21, 2023
1 parent b8750ce commit 037ef68
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 16 deletions.
15 changes: 6 additions & 9 deletions src/miral/basic_window_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -942,29 +942,26 @@ auto miral::BasicWindowManager::active_application_zone() -> Zone
return active_display_area()->application_zone;
}

auto miral::BasicWindowManager::for_each_window_in_info(
WindowInfo const& info,
std::function<void(const Window&)> func
) -> void
void miral::BasicWindowManager::for_each_descendent_in(WindowInfo const& info, std::function<void(const Window&)> func)
{
std::function<void(WindowInfo const& info)> const iterate_children =
std::function<void(WindowInfo const& info)> const iterate_descendents =
[&](WindowInfo const& info)
{
for (auto const& child : info.children())
{
func(child);
for_each_descendent_in(info_for(child), func);
}
};

func(info.window());
iterate_children(info);
iterate_descendents(info);
}

auto miral::BasicWindowManager::collect_windows(const miral::WindowInfo &info) -> SurfaceSet
{
SurfaceSet windows;

for_each_window_in_info(info, [&](Window const& window)
for_each_descendent_in(info, [&](Window const& window)
{
windows.insert(window);
});
Expand All @@ -980,7 +977,7 @@ void miral::BasicWindowManager::raise_tree(Window const& root)
raise_tree(parent);

std::vector<Window> raised_windows;
for_each_window_in_info(info, [&](Window const& window)
for_each_descendent_in(info, [&](Window const& window)
{
raised_windows.push_back(window);
});
Expand Down
4 changes: 2 additions & 2 deletions src/miral/basic_window_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,8 @@ class BasicWindowManager : public virtual mir::shell::WindowManager,
/// Updates the application zones of all display areas and moves attached windows as needed
void update_application_zones_and_attached_windows();

/// Iterates each child window of the provided WindowInfo
void for_each_window_in_info(WindowInfo const& info, std::function<void(const Window&)> func);
/// Iterates each descendent window (including current) of the provided WindowInfo
void for_each_descendent_in(WindowInfo const& info, std::function<void(const Window&)> func);
/// Gathers windows provided WindowInfo
auto collect_windows(WindowInfo const& info) -> SurfaceSet;
};
Expand Down
16 changes: 11 additions & 5 deletions src/server/frontend_xwayland/xwayland_surface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,11 +210,17 @@ auto wm_window_type_to_mir_window_type(
}
else if (wm_type == connection->_NET_WM_WINDOW_TYPE_POPUP_MENU ||
wm_type == connection->_NET_WM_WINDOW_TYPE_DROPDOWN_MENU ||
wm_type == connection->_NET_WM_WINDOW_TYPE_COMBO ||
wm_type == connection->_NET_WM_WINDOW_TYPE_TOOLTIP ||
wm_type == connection->_NET_WM_WINDOW_TYPE_COMBO)
{
return mir_window_type_menu;
}
else if (wm_type == connection->_NET_WM_WINDOW_TYPE_DIALOG)
{
return override_redirect ? mir_window_type_menu : mir_window_type_dialog;
}
else if (wm_type == connection->_NET_WM_WINDOW_TYPE_TOOLTIP ||
wm_type == connection->_NET_WM_WINDOW_TYPE_NOTIFICATION ||
wm_type == connection->_NET_WM_WINDOW_TYPE_DND ||
wm_type == connection->_NET_WM_WINDOW_TYPE_DIALOG)
wm_type == connection->_NET_WM_WINDOW_TYPE_DND)
{
return mir_window_type_tip;
}
Expand All @@ -231,7 +237,7 @@ auto wm_window_type_to_mir_window_type(
// be taken as _NET_WM_WINDOW_TYPE_NORMAL."
if (is_transient_for && !override_redirect)
{
return mir_window_type_tip;
return mir_window_type_menu;
}
else
{
Expand Down

0 comments on commit 037ef68

Please sign in to comment.