added test to EWMH atoms

This commit is contained in:
Janis 2022-05-07 14:37:17 +02:00 committed by Gitea
parent 56fff2698b
commit 2f805dab21

View file

@ -1,6 +1,10 @@
use log::{debug, error, warn}; use log::{debug, error, warn};
use num_traits::Zero; use num_traits::Zero;
use std::{ffi::CString, mem::MaybeUninit, ptr::NonNull, rc::Rc};
use std::{ffi::CString, rc::Rc}; use std::{ffi::CString, rc::Rc};
>>>>>>> variant B
use std::{ffi::CString, mem::MaybeUninit, ptr::NonNull, rc::Rc};
======= end
use thiserror::Error; use thiserror::Error;
@ -32,7 +36,7 @@ pub mod keysym;
pub type XLibWindowEvent = WindowEvent<xlib::Window>; pub type XLibWindowEvent = WindowEvent<xlib::Window>;
#[derive(Clone)] #[derive(Clone)]
pub struct Display(Rc<*mut x11::xlib::Display>); pub struct Display(Rc<NonNull<x11::xlib::Display>>);
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum XlibError { pub enum XlibError {
@ -108,7 +112,7 @@ pub mod ewmh {
use super::Display; use super::Display;
#[derive(Debug, PartialEq, Eq, EnumIter, EnumCount, Clone, Copy)] #[derive(Debug, PartialEq, Eq, EnumIter, EnumCount, Clone, Copy)]
pub enum EWMHAtom { pub enum EWMHAtoms {
NetSupported, NetSupported,
NetClientList, NetClientList,
NetNumberOfDesktops, NetNumberOfDesktops,
@ -179,7 +183,7 @@ pub mod ewmh {
NetWmActionClose, NetWmActionClose,
} }
impl EWMHAtom { impl EWMHAtoms {
pub fn try_get_atoms(display: Display) -> Option<Vec<Atom>> { pub fn try_get_atoms(display: Display) -> Option<Vec<Atom>> {
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
Self::iter() Self::iter()
@ -202,115 +206,139 @@ pub mod ewmh {
} }
} }
impl From<EWMHAtom> for u8 { impl From<EWMHAtoms> for u8 {
fn from(atom: EWMHAtom) -> Self { fn from(atom: EWMHAtoms) -> Self {
atom as u8 atom as u8
} }
} }
impl From<EWMHAtom> for &str { impl From<EWMHAtoms> for &str {
fn from(atom: EWMHAtom) -> Self { fn from(atom: EWMHAtoms) -> Self {
match atom { match atom {
EWMHAtom::NetSupported => "_NET_SUPPORTED", EWMHAtoms::NetSupported => "_NET_SUPPORTED",
EWMHAtom::NetClientList => "_NET_CLIENT_LIST", EWMHAtoms::NetClientList => "_NET_CLIENT_LIST",
EWMHAtom::NetNumberOfDesktops => "_NET_NUMBER_OF_DESKTOPS", EWMHAtoms::NetNumberOfDesktops => "_NET_NUMBER_OF_DESKTOPS",
EWMHAtom::NetDesktopGeometry => "_NET_DESKTOP_GEOMETRY", EWMHAtoms::NetDesktopGeometry => "_NET_DESKTOP_GEOMETRY",
EWMHAtom::NetDesktopViewport => "_NET_DESKTOP_VIEWPORT", EWMHAtoms::NetDesktopViewport => "_NET_DESKTOP_VIEWPORT",
EWMHAtom::NetCurrentDesktop => "_NET_CURRENT_DESKTOP", EWMHAtoms::NetCurrentDesktop => "_NET_CURRENT_DESKTOP",
EWMHAtom::NetDesktopNames => "_NET_DESKTOP_NAMES", EWMHAtoms::NetDesktopNames => "_NET_DESKTOP_NAMES",
EWMHAtom::NetActiveWindow => "_NET_ACTIVE_WINDOW", EWMHAtoms::NetActiveWindow => "_NET_ACTIVE_WINDOW",
EWMHAtom::NetWorkarea => "_NET_WORKAREA", EWMHAtoms::NetWorkarea => "_NET_WORKAREA",
EWMHAtom::NetSupportingWmCheck => "_NET_SUPPORTING_WM_CHECK", EWMHAtoms::NetSupportingWmCheck => "_NET_SUPPORTING_WM_CHECK",
EWMHAtom::NetVirtualRoots => "_NET_VIRTUAL_ROOTS", EWMHAtoms::NetVirtualRoots => "_NET_VIRTUAL_ROOTS",
EWMHAtom::NetDesktopLayout => "_NET_DESKTOP_LAYOUT", EWMHAtoms::NetDesktopLayout => "_NET_DESKTOP_LAYOUT",
EWMHAtom::NetShowingDesktop => "_NET_SHOWING_DESKTOP", EWMHAtoms::NetShowingDesktop => "_NET_SHOWING_DESKTOP",
EWMHAtom::NetCloseWindow => "_NET_CLOSE_WINDOW", EWMHAtoms::NetCloseWindow => "_NET_CLOSE_WINDOW",
EWMHAtom::NetMoveresizeWindow => "_NET_MOVERESIZE_WINDOW", EWMHAtoms::NetMoveresizeWindow => "_NET_MOVERESIZE_WINDOW",
EWMHAtom::NetWmMoveresize => "_NET_WM_MOVERESIZE", EWMHAtoms::NetWmMoveresize => "_NET_WM_MOVERESIZE",
EWMHAtom::NetRestackWindow => "_NET_RESTACK_WINDOW", EWMHAtoms::NetRestackWindow => "_NET_RESTACK_WINDOW",
EWMHAtom::NetRequestFrameExtents => { EWMHAtoms::NetRequestFrameExtents => {
"_NET_REQUEST_FRAME_EXTENTS" "_NET_REQUEST_FRAME_EXTENTS"
} }
EWMHAtom::NetWmName => "_NET_WM_NAME", EWMHAtoms::NetWmName => "_NET_WM_NAME",
EWMHAtom::NetWmVisibleName => "_NET_WM_VISIBLE_NAME", EWMHAtoms::NetWmVisibleName => "_NET_WM_VISIBLE_NAME",
EWMHAtom::NetWmIconName => "_NET_WM_ICON_NAME", EWMHAtoms::NetWmIconName => "_NET_WM_ICON_NAME",
EWMHAtom::NetWmVisibleIconName => "_NET_WM_VISIBLE_ICON_NAME", EWMHAtoms::NetWmVisibleIconName => "_NET_WM_VISIBLE_ICON_NAME",
EWMHAtom::NetWmDesktop => "_NET_WM_DESKTOP", EWMHAtoms::NetWmDesktop => "_NET_WM_DESKTOP",
EWMHAtom::NetWmWindowType => "_NET_WM_WINDOW_TYPE", EWMHAtoms::NetWmWindowType => "_NET_WM_WINDOW_TYPE",
EWMHAtom::NetWmState => "_NET_WM_STATE", EWMHAtoms::NetWmState => "_NET_WM_STATE",
EWMHAtom::NetWmAllowedActions => "_NET_WM_ALLOWED_ACTIONS", EWMHAtoms::NetWmAllowedActions => "_NET_WM_ALLOWED_ACTIONS",
EWMHAtom::NetWmStrut => "_NET_WM_STRUT", EWMHAtoms::NetWmStrut => "_NET_WM_STRUT",
EWMHAtom::NetWmStrutPartial => "_NET_WM_STRUT_PARTIAL", EWMHAtoms::NetWmStrutPartial => "_NET_WM_STRUT_PARTIAL",
EWMHAtom::NetWmIconGeometry => "_NET_WM_ICON_GEOMETRY", EWMHAtoms::NetWmIconGeometry => "_NET_WM_ICON_GEOMETRY",
EWMHAtom::NetWmIcon => "_NET_WM_ICON", EWMHAtoms::NetWmIcon => "_NET_WM_ICON",
EWMHAtom::NetWmPid => "_NET_WM_PID", EWMHAtoms::NetWmPid => "_NET_WM_PID",
EWMHAtom::NetWmHandledIcons => "_NET_WM_HANDLED_ICONS", EWMHAtoms::NetWmHandledIcons => "_NET_WM_HANDLED_ICONS",
EWMHAtom::NetWmUserTime => "_NET_WM_USER_TIME", EWMHAtoms::NetWmUserTime => "_NET_WM_USER_TIME",
EWMHAtom::NetFrameExtents => "_NET_FRAME_EXTENTS", EWMHAtoms::NetFrameExtents => "_NET_FRAME_EXTENTS",
EWMHAtom::NetWmPing => "_NET_WM_PING", EWMHAtoms::NetWmPing => "_NET_WM_PING",
EWMHAtom::NetWmSyncRequest => "_NET_WM_SYNC_REQUEST", EWMHAtoms::NetWmSyncRequest => "_NET_WM_SYNC_REQUEST",
EWMHAtom::NetWmWindowTypeDesktop => { EWMHAtoms::NetWmWindowTypeDesktop => {
"_NET_WM_WINDOW_TYPE_DESKTOP" "_NET_WM_WINDOW_TYPE_DESKTOP"
} }
EWMHAtom::NetWmWindowTypeDock => "_NET_WM_WINDOW_TYPE_DOCK", EWMHAtoms::NetWmWindowTypeDock => "_NET_WM_WINDOW_TYPE_DOCK",
EWMHAtom::NetWmWindowTypeToolbar => { EWMHAtoms::NetWmWindowTypeToolbar => {
"_NET_WM_WINDOW_TYPE_TOOLBAR" "_NET_WM_WINDOW_TYPE_TOOLBAR"
} }
EWMHAtom::NetWmWindowTypeMenu => "_NET_WM_WINDOW_TYPE_MENU", EWMHAtoms::NetWmWindowTypeMenu => "_NET_WM_WINDOW_TYPE_MENU",
EWMHAtom::NetWmWindowTypeUtility => { EWMHAtoms::NetWmWindowTypeUtility => {
"_NET_WM_WINDOW_TYPE_UTILITY" "_NET_WM_WINDOW_TYPE_UTILITY"
} }
EWMHAtom::NetWmWindowTypeSplash => "_NET_WM_WINDOW_TYPE_SPLASH", EWMHAtoms::NetWmWindowTypeSplash => {
EWMHAtom::NetWmWindowTypeDialog => "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_WINDOW_TYPE_SPLASH"
EWMHAtom::NetWmWindowTypeNormal => "_NET_WM_WINDOW_TYPE_NORMAL", }
EWMHAtom::NetWmStateModal => "_NET_WM_STATE_MODAL", EWMHAtoms::NetWmWindowTypeDialog => {
EWMHAtom::NetWmStateSticky => "_NET_WM_STATE_STICKY", "_NET_WM_WINDOW_TYPE_DIALOG"
EWMHAtom::NetWmStateMaximizedVert => { }
EWMHAtoms::NetWmWindowTypeNormal => {
"_NET_WM_WINDOW_TYPE_NORMAL"
}
EWMHAtoms::NetWmStateModal => "_NET_WM_STATE_MODAL",
EWMHAtoms::NetWmStateSticky => "_NET_WM_STATE_STICKY",
EWMHAtoms::NetWmStateMaximizedVert => {
"_NET_WM_STATE_MAXIMIZED_VERT" "_NET_WM_STATE_MAXIMIZED_VERT"
} }
EWMHAtom::NetWmStateMaximizedHorz => { EWMHAtoms::NetWmStateMaximizedHorz => {
"_NET_WM_STATE_MAXIMIZED_HORZ" "_NET_WM_STATE_MAXIMIZED_HORZ"
} }
EWMHAtom::NetWmStateShaded => "_NET_WM_STATE_SHADED", EWMHAtoms::NetWmStateShaded => "_NET_WM_STATE_SHADED",
EWMHAtom::NetWmStateSkipTaskbar => "_NET_WM_STATE_SKIP_TASKBAR", EWMHAtoms::NetWmStateSkipTaskbar => {
EWMHAtom::NetWmStateSkipPager => "_NET_WM_STATE_SKIP_PAGER", "_NET_WM_STATE_SKIP_TASKBAR"
EWMHAtom::NetWmStateHidden => "_NET_WM_STATE_HIDDEN", }
EWMHAtom::NetWmStateFullscreen => "_NET_WM_STATE_FULLSCREEN", EWMHAtoms::NetWmStateSkipPager => "_NET_WM_STATE_SKIP_PAGER",
EWMHAtom::NetWmStateAbove => "_NET_WM_STATE_ABOVE", EWMHAtoms::NetWmStateHidden => "_NET_WM_STATE_HIDDEN",
EWMHAtom::NetWmStateBelow => "_NET_WM_STATE_BELOW", EWMHAtoms::NetWmStateFullscreen => "_NET_WM_STATE_FULLSCREEN",
EWMHAtom::NetWmStateDemandsAttention => { EWMHAtoms::NetWmStateAbove => "_NET_WM_STATE_ABOVE",
EWMHAtoms::NetWmStateBelow => "_NET_WM_STATE_BELOW",
EWMHAtoms::NetWmStateDemandsAttention => {
"_NET_WM_STATE_DEMANDS_ATTENTION" "_NET_WM_STATE_DEMANDS_ATTENTION"
} }
EWMHAtom::NetWmActionMove => "_NET_WM_ACTION_MOVE", EWMHAtoms::NetWmActionMove => "_NET_WM_ACTION_MOVE",
EWMHAtom::NetWmActionResize => "_NET_WM_ACTION_RESIZE", EWMHAtoms::NetWmActionResize => "_NET_WM_ACTION_RESIZE",
EWMHAtom::NetWmActionMinimize => "_NET_WM_ACTION_MINIMIZE", EWMHAtoms::NetWmActionMinimize => "_NET_WM_ACTION_MINIMIZE",
EWMHAtom::NetWmActionShade => "_NET_WM_ACTION_SHADE", EWMHAtoms::NetWmActionShade => "_NET_WM_ACTION_SHADE",
EWMHAtom::NetWmActionStick => "_NET_WM_ACTION_STICK", EWMHAtoms::NetWmActionStick => "_NET_WM_ACTION_STICK",
EWMHAtom::NetWmActionMaximizeHorz => { EWMHAtoms::NetWmActionMaximizeHorz => {
"_NET_WM_ACTION_MAXIMIZE_HORZ" "_NET_WM_ACTION_MAXIMIZE_HORZ"
} }
EWMHAtom::NetWmActionMaximizeVert => { EWMHAtoms::NetWmActionMaximizeVert => {
"_NET_WM_ACTION_MAXIMIZE_VERT" "_NET_WM_ACTION_MAXIMIZE_VERT"
} }
EWMHAtom::NetWmActionFullscreen => "_NET_WM_ACTION_FULLSCREEN", EWMHAtoms::NetWmActionFullscreen => "_NET_WM_ACTION_FULLSCREEN",
EWMHAtom::NetWmActionChangeDesktop => { EWMHAtoms::NetWmActionChangeDesktop => {
"_NET_WM_ACTION_CHANGE_DESKTOP" "_NET_WM_ACTION_CHANGE_DESKTOP"
} }
EWMHAtom::NetWmActionClose => "_NET_WM_ACTION_CLOSE", EWMHAtoms::NetWmActionClose => "_NET_WM_ACTION_CLOSE",
} }
} }
} }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_atoms() {
let display = Display::open().unwrap();
let atoms = EWMHAtoms::try_get_atoms(display).expect("atoms");
println!("{:?}", atoms);
}
}
} }
impl Display { impl Display {
pub fn new(display: *mut x11::xlib::Display) -> Self { pub fn new(display: *mut x11::xlib::Display) -> Option<Self> {
Self { NonNull::new(display).map(|ptr| Self(Rc::new(ptr)))
0: Rc::new(display),
}
} }
// TODO: error communication
pub fn open() -> Option<Self> {
Self::new(unsafe { xlib::XOpenDisplay(std::ptr::null()) })
}
/// this should definitely be unsafe lmao
pub fn get(&self) -> *mut x11::xlib::Display { pub fn get(&self) -> *mut x11::xlib::Display {
*self.0 self.0.as_ptr()
} }
} }
@ -333,12 +361,9 @@ impl Drop for XLib {
impl XLib { impl XLib {
fn new() -> Self { fn new() -> Self {
let (display, screen, root) = { let (display, screen, root) = {
let display = unsafe { xlib::XOpenDisplay(std::ptr::null()) }; let display = Display::open().expect("failed to open x display");
assert_ne!(display, std::ptr::null_mut()); let screen = unsafe { xlib::XDefaultScreen(display.get()) };
let screen = unsafe { xlib::XDefaultScreen(display) }; let root = unsafe { xlib::XRootWindow(display.get(), screen) };
let root = unsafe { xlib::XRootWindow(display, screen) };
let display = Display::new(display);
(display, screen, root) (display, screen, root)
}; };