From 1d15ef633617ee0005bd56aad87078c52db19b6c Mon Sep 17 00:00:00 2001 From: Janis Date: Tue, 17 May 2022 16:46:40 +0200 Subject: [PATCH] fullscreen fix? --- src/backends/traits.rs | 5 ++++ src/backends/xlib/mod.rs | 59 +++++++++++++++++++++++++++++----------- src/lib.rs | 2 ++ src/state.rs | 15 ++++------ 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/backends/traits.rs b/src/backends/traits.rs index 7928a57..70019be 100644 --- a/src/backends/traits.rs +++ b/src/backends/traits.rs @@ -21,6 +21,11 @@ pub trait WindowServerBackend { fn focus_window(&self, window: Self::Window); fn unfocus_window(&self, window: Self::Window); fn raise_window(&self, window: Self::Window); + fn set_window_fullscreen_state( + &self, + window: Self::Window, + fullscreen: bool, + ); fn hide_window(&self, window: Self::Window); fn kill_window(&self, window: Self::Window); fn get_parent_window(&self, window: Self::Window) -> Option; diff --git a/src/backends/xlib/mod.rs b/src/backends/xlib/mod.rs index bf18dea..e849337 100644 --- a/src/backends/xlib/mod.rs +++ b/src/backends/xlib/mod.rs @@ -818,9 +818,10 @@ impl XLib { } unsafe fn init_as_wm(&self) { - let mut window_attributes = + let mut window_attributes = unsafe { std::mem::MaybeUninit::::zeroed() - .assume_init(); + .assume_init() + }; window_attributes.event_mask = xlib::SubstructureRedirectMask | xlib::StructureNotifyMask @@ -829,21 +830,23 @@ impl XLib { | xlib::PointerMotionMask | xlib::ButtonPressMask; - xlib::XChangeWindowAttributes( - self.connection.dpy(), - self.connection.root(), - xlib::CWEventMask, - &mut window_attributes, - ); + unsafe { + xlib::XChangeWindowAttributes( + self.connection.dpy(), + self.connection.root(), + xlib::CWEventMask, + &mut window_attributes, + ); - xlib::XSelectInput( - self.dpy(), - self.connection.root(), - window_attributes.event_mask, - ); + xlib::XSelectInput( + self.dpy(), + self.connection.root(), + window_attributes.event_mask, + ); - xlib::XSetErrorHandler(Some(xlib_error_handler)); - xlib::XSync(self.dpy(), 0); + xlib::XSetErrorHandler(Some(xlib_error_handler)); + xlib::XSync(self.dpy(), 0); + } self.ewmh_atoms.set_supported_atoms(self.connection.clone()); self.connection.delete_property( @@ -1723,6 +1726,30 @@ impl WindowServerBackend for XLib { }, } } + + fn set_window_fullscreen_state( + &self, + window: Self::Window, + fullscreen: bool, + ) { + if fullscreen { + self.connection.change_property_long( + window, + self.ewmh_atoms[EWMHAtom::NetWmState], + XA_WINDOW, + PropMode::Replace, + &[self.ewmh_atoms[EWMHAtom::NetWmStateFullscreen] as _], + ); + } else { + self.connection.change_property_long( + window, + self.ewmh_atoms[EWMHAtom::NetWmState], + XA_WINDOW, + PropMode::Replace, + &[0 as _], + ); + } + } } impl TryFrom for WindowType { @@ -1748,7 +1775,7 @@ unsafe extern "C" fn xlib_error_handler( _dpy: *mut x11::xlib::Display, ee: *mut x11::xlib::XErrorEvent, ) -> std::os::raw::c_int { - let err_event = ee.as_ref().unwrap(); + let err_event = unsafe { ee.as_ref().unwrap() }; let err = XlibError::from(err_event.error_code); match err { diff --git a/src/lib.rs b/src/lib.rs index 2d197ac..3246cf5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +#![deny(unsafe_op_in_unsafe_fn)] + pub mod backends; pub mod clients; pub mod state; diff --git a/src/state.rs b/src/state.rs index 142e2b2..e49257f 100644 --- a/src/state.rs +++ b/src/state.rs @@ -203,16 +203,6 @@ where }, )); - // self.add_keybind(KeyBinding::new( - // KeyBind::new(VirtualKeyCode::Print), - // |wm, _| wm.spawn("screenshot.sh", &[]), - // )); - - // self.add_keybind(KeyBinding::new( - // KeyBind::new(VirtualKeyCode::Print).with_mod(ModifierKey::Shift), - // |wm, _| wm.spawn("screenshot.sh", &["-edit"]), - // )); - self.add_keybind(KeyBinding::new( KeyBind::new(VirtualKeyCode::M).with_mod(self.config.mod_key), |wm, _| wm.handle_switch_stack(), @@ -488,6 +478,11 @@ where Some(self.clients.get_border()) }, ); + + self.backend.set_window_fullscreen_state( + client.window, + client.is_fullscreen(), + ); }; self.arrange_clients();