diff --git a/src/xstate/mod.rs b/src/xstate/mod.rs index 9bf72ae..32e90dd 100644 --- a/src/xstate/mod.rs +++ b/src/xstate/mod.rs @@ -614,12 +614,26 @@ impl XState { } }); + if log::log_enabled!(log::Level::Debug) { + let win_types = window_types + .iter() + .copied() + .map(|t| get_atom_name(&self.connection, t)) + .collect::>(); + + debug!("{window:?} window_types: {win_types:?}"); + } + debug!("{window:?} override_redirect: {override_redirect:?}"); + let mut known_window_type = false; for ty in window_types { match ty { x if x == self.window_atoms.normal || x == self.window_atoms.dialog => { is_popup = override_redirect; } + x if x == self.window_atoms.menu || x == self.window_atoms.tooltip => { + is_popup = true; + } _ => { continue; } @@ -903,6 +917,7 @@ xcb::atoms_struct! { splash => b"_NET_WM_WINDOW_TYPE_SPLASH" only_if_exists = false, menu => b"_NET_WM_WINDOW_TYPE_MENU" only_if_exists = false, utility => b"_NET_WM_WINDOW_TYPE_UTILITY" only_if_exists = false, + tooltip => b"_NET_WM_WINDOW_TYPE_TOOLTIP" only_if_exists = false, } } diff --git a/tests/integration.rs b/tests/integration.rs index 6224fdf..931520a 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -314,6 +314,8 @@ xcb::atoms_struct! { wm_check => b"_NET_SUPPORTING_WM_CHECK", win_type => b"_NET_WM_WINDOW_TYPE", win_type_normal => b"_NET_WM_WINDOW_TYPE_NORMAL", + win_type_menu => b"_NET_WM_WINDOW_TYPE_MENU", + win_type_tooltip => b"_NET_WM_WINDOW_TYPE_TOOLTIP", motif_wm_hints => b"_MOTIF_WM_HINTS" only_if_exists = false, mime1 => b"text/plain" only_if_exists = false, mime2 => b"blah/blah" only_if_exists = false, @@ -1702,6 +1704,24 @@ fn popup_heuristics() { &[0x2_u32, 0, 0x2a, 0, 0], ); f.map_as_toplevel(&mut connection, reaper_dialog); + + let chromium_menu = connection.new_window(connection.root, 10, 10, 50, 50, true); + connection.set_property( + chromium_menu, + x::ATOM_ATOM, + connection.atoms.win_type, + &[connection.atoms.win_type_menu], + ); + f.map_as_popup(&mut connection, chromium_menu); + + let chromium_tooltip = connection.new_window(connection.root, 10, 10, 50, 50, true); + connection.set_property( + chromium_tooltip, + x::ATOM_ATOM, + connection.atoms.win_type, + &[connection.atoms.win_type_tooltip], + ); + f.map_as_popup(&mut connection, chromium_tooltip); } #[test]