From 6d586c8156c20b3dbf7e10e4dae5e14fd34618a5 Mon Sep 17 00:00:00 2001 From: tcmal Date: Fri, 5 Jul 2024 15:34:03 +0100 Subject: Set dialog windows to floating when first --- src/clients/client.rs | 9 ++++++++- src/clients/hints.rs | 21 ++++++++++++++++++++- src/clients/mod.rs | 3 +-- todos.org | 6 +++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/clients/client.rs b/src/clients/client.rs index d4e2e88..6845e4e 100644 --- a/src/clients/client.rs +++ b/src/clients/client.rs @@ -114,7 +114,7 @@ impl Client { /// Set the floating status. pub fn set_floating(&mut self, conn: &Connection<'_>, floating: bool) { - if floating != self.floating { + if floating && floating != self.floating { conn.send_request(&ConfigureWindow { window: self.window, value_list: &[ConfigWindow::StackMode(StackMode::Above)], @@ -177,6 +177,13 @@ impl Client { }) } + pub fn update_window_type(&mut self, conn: &Connection<'_>) { + // TODO: Fullscreen from net_wm_state + if hints::is_dialog(conn, self.window) { + self.set_floating(conn, true); + } + } + pub fn set_urgent(&mut self, urgent: bool) { self.urgent = urgent; } diff --git a/src/clients/hints.rs b/src/clients/hints.rs index f59794a..182c655 100644 --- a/src/clients/hints.rs +++ b/src/clients/hints.rs @@ -1,5 +1,5 @@ use xcb::{ - x::{self, ChangeProperty, GetProperty, Pixmap, PropMode, Window}, + x::{self, Atom, ChangeProperty, GetProperty, Gravity, Pixmap, PropMode, Window}, Xid, XidNew, }; @@ -122,3 +122,22 @@ pub fn transient_for(conn: &Connection, window: Window) -> Option { Some(hints.value::()[0]) } + +/// Check if the given window is flagged as a dialog with the `NET_WM_WINDOW_TYPE` property +pub fn is_dialog(conn: &Connection, window: Window) -> bool { + let Ok(hints) = conn.wait_for_reply(conn.send_request(&GetProperty { + window, + delete: false, + property: conn.atoms.net_wm_window_type, + r#type: x::ATOM_ATOM, + long_offset: 0, + long_length: 1, + })) else { + return false; + }; + + hints.r#type() == x::ATOM_ATOM + && hints.length() == 1 + && hints.format() == 32 + && hints.value::()[0] == conn.atoms.net_wm_window_type_dialog +} diff --git a/src/clients/mod.rs b/src/clients/mod.rs index 86b42f9..8efa5b1 100644 --- a/src/clients/mod.rs +++ b/src/clients/mod.rs @@ -211,10 +211,9 @@ impl ClientState { ); c.set_border(conn, conn.colours.border_normal()); c.set_floating(conn, floating); + c.update_window_type(conn); c.ensure_mapped(conn); - // TODO: updatewindowtype - // TODO: updatesizehints c.sync_properties(conn, true); c.set_event_mask( diff --git a/todos.org b/todos.org index 1ca7a14..3b4a9d8 100644 --- a/todos.org +++ b/todos.org @@ -1,4 +1,6 @@ -* Deal with size hints and window type +* Support fullscreen + +* Set fullscreen based on hint * Fix focus changing bug @@ -10,6 +12,8 @@ * Mouse support +* Support resizing + * Port over rest of keybinds * Port over rest of my own preferred patches -- cgit v1.2.3