fixed get_atom_property()

This commit is contained in:
Janis 2022-05-07 12:55:19 +02:00
parent e49fdfa5be
commit b1895bdd07
2 changed files with 46 additions and 35 deletions

View file

@ -1,10 +1,10 @@
use log::{error, warn}; use log::{debug, error, warn};
use num_traits::Zero; use num_traits::Zero;
use std::{ffi::CString, rc::Rc}; use std::{ffi::CString, rc::Rc};
use thiserror::Error; use thiserror::Error;
use x11::xlib::{self, Atom, Window, XEvent, XInternAtom, XKeyEvent}; use x11::xlib::{self, Atom, Success, Window, XEvent, XInternAtom, XKeyEvent};
use crate::backends::{ use crate::backends::{
keycodes::KeyOrButton, xlib::keysym::mouse_button_to_xbutton, keycodes::KeyOrButton, xlib::keysym::mouse_button_to_xbutton,
@ -290,9 +290,9 @@ impl XLib {
xlib::PropertyNotify => { xlib::PropertyNotify => {
let ev = unsafe { &event.property }; let ev = unsafe { &event.property };
(ev.atom == self.atoms.net_wm_window_type) match ev.atom {
.then(|| { atom if atom == self.atoms.net_wm_window_type => {
(self if self
.get_atom_property( .get_atom_property(
ev.window, ev.window,
self.atoms.net_wm_state, self.atoms.net_wm_state,
@ -300,44 +300,52 @@ impl XLib {
.map(|atom| { .map(|atom| {
*atom == self.atoms.net_wm_state_fullscreen *atom == self.atoms.net_wm_state_fullscreen
}) })
== Some(true)) .unwrap_or(false)
.then(|| { {
XLibWindowEvent::FullscreenEvent( debug!("fullscreen event");
Some(XLibWindowEvent::FullscreenEvent(
FullscreenEvent::new( FullscreenEvent::new(
ev.window, ev.window,
FullscreenState::On, FullscreenState::On,
), ),
) ))
}) } else {
}) None
.flatten() }
}
_ => None,
}
} }
xlib::ClientMessage => { xlib::ClientMessage => {
let ev = unsafe { &event.client_message }; let ev = unsafe { &event.client_message };
(ev.message_type == self.atoms.net_wm_state) match ev.message_type {
.then(|| { message_type if message_type == self.atoms.net_wm_state => {
let data = ev.data.as_longs(); let data = ev.data.as_longs();
(data[1] as u64 == self.atoms.net_wm_state_fullscreen if data[1] as u64 == self.atoms.net_wm_state_fullscreen
|| data[2] as u64 || data[2] as u64
== self.atoms.net_wm_state_fullscreen) == self.atoms.net_wm_state_fullscreen
.then(|| { {
XLibWindowEvent::FullscreenEvent( debug!("fullscreen event");
FullscreenEvent::new( Some(XLibWindowEvent::FullscreenEvent(
ev.window, FullscreenEvent::new(
match data[0] /* as u64 */ { ev.window,
0 => FullscreenState::Off, match data[0] /* as u64 */ {
1 => FullscreenState::On, 0 => FullscreenState::Off,
2 => FullscreenState::Toggle, 1 => FullscreenState::On,
_ => { 2 => FullscreenState::Toggle,
unreachable!() _ => {
} unreachable!()
}, }
), },
) ),
}) ))
}) } else {
.flatten() None
}
}
_ => None,
}
} }
_ => None, _ => None,
} }
@ -387,9 +395,11 @@ impl XLib {
&mut dl0, &mut dl0,
&mut dl1, &mut dl1,
ptr as *mut _ as *mut _, ptr as *mut _ as *mut _,
) != 0 ) == Success.into()
}); });
debug!("get_atom_property: {} {:?}", success, atom_out);
success.then(|| atom_out).flatten() success.then(|| atom_out).flatten()
} }
@ -1071,6 +1081,7 @@ pub mod xpointer {
use x11::xlib::XFree; use x11::xlib::XFree;
#[repr(C)] #[repr(C)]
#[derive(Debug)]
pub struct XPointer<T>(NonNull<T>); pub struct XPointer<T>(NonNull<T>);
impl<T> XPointer<T> { impl<T> XPointer<T> {

View file

@ -31,7 +31,7 @@ fn init_logger() {
Root::builder() Root::builder()
.appender("stdout") .appender("stdout")
//.appender("logfile") //.appender("logfile")
.build(log::LevelFilter::Info), .build(log::LevelFilter::Debug),
) )
.unwrap(); .unwrap();