use std::str; use xcb::x; fn main() -> xcb::Result<()> { let (conn, _) = xcb::Connection::connect(None).unwrap(); let setup = conn.get_setup(); let wm_client_list = conn.send_request(&x::InternAtom { only_if_exists: true, name: "_NET_CLIENT_LIST".as_bytes(), }); let wm_client_list = conn.wait_for_reply(wm_client_list)?.atom(); assert!(wm_client_list != x::ATOM_NONE, "EWMH not supported"); for screen in setup.roots() { let window = screen.root(); let pointer = conn.send_request(&x::QueryPointer { window }); let pointer = conn.wait_for_reply(pointer)?; if pointer.same_screen() { let list = conn.send_request(&x::GetProperty { delete: false, window, property: wm_client_list, r#type: x::ATOM_NONE, long_offset: 0, long_length: 100, }); let list = conn.wait_for_reply(list)?; for client in list.value::() { let cookie = conn.send_request(&x::GetProperty { delete: false, window: *client, property: x::ATOM_WM_NAME, r#type: x::ATOM_STRING, long_offset: 0, long_length: 1024, }); let reply = conn.wait_for_reply(cookie)?; let title = reply.value(); let title = str::from_utf8(title).expect("invalid UTF-8"); println!("{}", title); } } } Ok(()) }