added WindowType enum
This commit is contained in:
parent
f9afdc990d
commit
4eb1cb4555
|
@ -4,3 +4,18 @@ pub mod window_event;
|
||||||
pub mod xlib;
|
pub mod xlib;
|
||||||
|
|
||||||
pub use traits::*;
|
pub use traits::*;
|
||||||
|
|
||||||
|
pub mod structs {
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
|
||||||
|
pub enum WindowType {
|
||||||
|
Splash,
|
||||||
|
Dialog,
|
||||||
|
Normal,
|
||||||
|
Utility,
|
||||||
|
Menu,
|
||||||
|
Toolbar,
|
||||||
|
Dock,
|
||||||
|
Desktop,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
use super::window_event::{self, KeyOrMouseBind};
|
use super::{
|
||||||
|
structs::WindowType,
|
||||||
|
window_event::{self, KeyOrMouseBind},
|
||||||
|
};
|
||||||
use crate::util::{Point, Size};
|
use crate::util::{Point, Size};
|
||||||
|
|
||||||
pub trait WindowServerBackend {
|
pub trait WindowServerBackend {
|
||||||
|
@ -32,6 +35,7 @@ pub trait WindowServerBackend {
|
||||||
fn screen_size(&self) -> Size<i32>;
|
fn screen_size(&self) -> Size<i32>;
|
||||||
fn get_window_size(&self, window: Self::Window) -> Option<Size<i32>>;
|
fn get_window_size(&self, window: Self::Window) -> Option<Size<i32>>;
|
||||||
fn get_window_name(&self, window: Self::Window) -> Option<String>;
|
fn get_window_name(&self, window: Self::Window) -> Option<String>;
|
||||||
|
fn get_window_type(&self, window: Self::Window) -> WindowType;
|
||||||
|
|
||||||
fn grab_cursor(&self);
|
fn grab_cursor(&self);
|
||||||
fn ungrab_cursor(&self);
|
fn ungrab_cursor(&self);
|
||||||
|
|
|
@ -22,6 +22,7 @@ use self::{
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
keycodes::VirtualKeyCode,
|
keycodes::VirtualKeyCode,
|
||||||
|
structs::WindowType,
|
||||||
window_event::{
|
window_event::{
|
||||||
ButtonEvent, ConfigureEvent, DestroyEvent, EnterEvent, FullscreenEvent,
|
ButtonEvent, ConfigureEvent, DestroyEvent, EnterEvent, FullscreenEvent,
|
||||||
FullscreenState, KeyEvent, KeyOrMouseBind, KeyState, MapEvent,
|
FullscreenState, KeyEvent, KeyOrMouseBind, KeyState, MapEvent,
|
||||||
|
@ -291,6 +292,14 @@ pub mod ewmh {
|
||||||
.map(|atoms| Self { inner: atoms })
|
.map(|atoms| Self { inner: atoms })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn reverse_lookup(&self, atom: Atom) -> Option<EWMHAtom> {
|
||||||
|
self.inner
|
||||||
|
.iter()
|
||||||
|
.position(|a| *a == atom)
|
||||||
|
.map(|position| EWMHAtom::from_repr(position))
|
||||||
|
.flatten()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_supported_atoms<C: Borrow<XLibConnection>>(&self, con: C) {
|
pub fn set_supported_atoms<C: Borrow<XLibConnection>>(&self, con: C) {
|
||||||
let supported_atoms = [
|
let supported_atoms = [
|
||||||
self[EWMHAtom::NetActiveWindow],
|
self[EWMHAtom::NetActiveWindow],
|
||||||
|
@ -1505,6 +1514,44 @@ impl WindowServerBackend for XLib {
|
||||||
.get_text_property(window, self.atoms[ICCCMAtom::WmName])
|
.get_text_property(window, self.atoms[ICCCMAtom::WmName])
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_window_type(
|
||||||
|
&self,
|
||||||
|
window: Self::Window,
|
||||||
|
) -> super::structs::WindowType {
|
||||||
|
match self
|
||||||
|
.get_atom_property(
|
||||||
|
window,
|
||||||
|
self.ewmh_atoms[EWMHAtom::NetWmWindowType],
|
||||||
|
)
|
||||||
|
.and_then(|atom| self.ewmh_atoms.reverse_lookup(*atom))
|
||||||
|
.and_then(|atom| WindowType::try_from(atom).ok())
|
||||||
|
{
|
||||||
|
Some(window_type) => window_type,
|
||||||
|
None => match self.get_parent_window(window) {
|
||||||
|
Some(_) => WindowType::Dialog,
|
||||||
|
None => WindowType::Normal,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<EWMHAtom> for WindowType {
|
||||||
|
type Error = ();
|
||||||
|
|
||||||
|
fn try_from(value: EWMHAtom) -> Result<Self, Self::Error> {
|
||||||
|
match value {
|
||||||
|
EWMHAtom::NetWmWindowTypeDesktop => Ok(Self::Desktop),
|
||||||
|
EWMHAtom::NetWmWindowTypeDock => Ok(Self::Dock),
|
||||||
|
EWMHAtom::NetWmWindowTypeUtility => Ok(Self::Utility),
|
||||||
|
EWMHAtom::NetWmWindowTypeMenu => Ok(Self::Menu),
|
||||||
|
EWMHAtom::NetWmWindowTypeToolbar => Ok(Self::Toolbar),
|
||||||
|
EWMHAtom::NetWmWindowTypeSplash => Ok(Self::Splash),
|
||||||
|
EWMHAtom::NetWmWindowTypeDialog => Ok(Self::Dialog),
|
||||||
|
EWMHAtom::NetWmWindowTypeNormal => Ok(Self::Normal),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
|
Loading…
Reference in a new issue