Move and split macros, rename client_window

This commit is contained in:
Armin Friedl 2022-05-22 17:30:31 +02:00
parent 4d18bf5994
commit 35a91427fd
7 changed files with 346 additions and 342 deletions

View file

@ -2,7 +2,9 @@
//!
//! see: <https://specifications.freedesktop.org/wm-spec/wm-spec-1.5.html#idm45446104426048>
use xcb::{Xid, XidNew};
#![allow(dead_code)]
use xcb::Xid;
use crate::ewmh::proto::util::{strings_to_x_buffer, x_buffer_to_strings};
use crate::ewmh::traits::*;
@ -40,7 +42,7 @@ pub struct SetWmName {
}
impl SetWmName {
pub fn new(connection: &Connection, window: xcb::x::Window, name: &str) -> SetWmName {
pub fn new(window: xcb::x::Window, name: &str) -> SetWmName {
SetWmName {
window: window,
data: strings_to_x_buffer(vec![name]),
@ -50,7 +52,7 @@ impl SetWmName {
ewmh_set_property! {
request=SetWmName{
window: client_window,
window: client,
property: _NET_WM_NAME,
xtype: UTF8_STRING
}
@ -173,7 +175,7 @@ impl SetWmDesktop {
ewmh_set_property! {
request=SetWmDesktop {
window: client_window,
window: client,
property: _NET_WM_DESKTOP,
xtype: ATOM_CARDINAL
}
@ -196,7 +198,7 @@ impl SendWmDesktop {
}
ewmh_client_message! {
request=SendWmDesktop{destination: root_window}
request=SendWmDesktop{destination: root}
}
// }}}
@ -240,7 +242,7 @@ impl SetWmWindowType {
ewmh_set_property! {
request=SetWmWindowType{
window: client_window,
window: client,
property: _NET_WM_WINDOW_TYPE,
xtype: ATOM_ATOM
}
@ -303,6 +305,6 @@ impl SetWmState {
}
ewmh_client_message! {
request=SetWmState{destination: root_window}
request=SetWmState{destination: root}
}
// }}}

View file

@ -1,320 +0,0 @@
macro_rules! _set_property_base {
(root_window, $property:ident, UTF8_STRING) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u8> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
data: &self.data,
}
}
};
(root_window, $property:ident, $xtype:ident) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u32> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: xcb::x::$xtype,
data: &self.data,
}
}
};
(client_window, $property:ident, UTF8_STRING) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u8> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: self.window,
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
data: &self.data,
}
}
};
(client_window, $property:ident, ATOM_CARDINAL) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u32> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: self.window,
property: con.atoms.$property,
r#type: xcb::x::ATOM_CARDINAL,
data: &self.data,
}
}
};
(client_window, $property:ident, ATOM_ATOM) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, xcb::x::Atom> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: self.window,
property: con.atoms.$property,
r#type: xcb::x::ATOM_ATOM,
data: &self.data,
}
}
};
}
macro_rules! ewmh_set_property {
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: UTF8_STRING
}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u8>;
type EwmhCookie = xcb::VoidCookie;
_set_property_base! {$window, $property, UTF8_STRING}
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u8>;
_set_property_base! {$window, $property, UTF8_STRING}
}
};
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: ATOM_CARDINAL
}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u32>;
type EwmhCookie = xcb::VoidCookie;
_set_property_base! {$window, $property, ATOM_CARDINAL}
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u32>;
_set_property_base! {$window, $property, ATOM_CARDINAL}
}
};
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: ATOM_ATOM
}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, xcb::x::Atom>;
type EwmhCookie = xcb::VoidCookie;
_set_property_base! {$window, $property, ATOM_ATOM }
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, xcb::x::Atom>;
_set_property_base! {$window, $property, ATOM_ATOM }
}
};
}
macro_rules! _client_message_base {
(root_window) => {
fn xcb_request(&'a self, con: &Connection) -> Self::XcbRequest {
xcb::x::SendEvent {
propagate: false,
destination: xcb::x::SendEventDest::Window(
con.con.get_setup().roots().next().unwrap().root(),
),
event_mask: xcb::x::EventMask::SUBSTRUCTURE_NOTIFY
| xcb::x::EventMask::SUBSTRUCTURE_REDIRECT,
event: &self.client_message,
}
}
};
($destination: ident) => {
fn xcb_request(&'a self, con: &Connection) -> Self::XcbRequest {
xcb::x::SendEvent {
propagate: false,
destination: xcb::x::SendEventDest::Window($destination),
event_mask: xcb::x::EventMask::SUBSTRUCTURE_NOTIFY
| xcb::x::EventMask::SUBSTRUCTURE_REDIRECT,
event: &self.client_message,
}
}
};
}
macro_rules! ewmh_client_message {
(request=$request:ident{destination: $destination:ident}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::SendEvent<'a, xcb::x::ClientMessageEvent>;
type EwmhCookie = xcb::VoidCookie;
_client_message_base! {$destination}
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::SendEvent<'a, xcb::x::ClientMessageEvent>;
_client_message_base! {$destination}
}
};
}
macro_rules! _get_property_cookies {
(@private $request:ident, $reply:ident) => {
paste! {
impl EwmhCookie for [<$request Cookie>] {
type XcbCookie = xcb::x::GetPropertyCookie;
}
impl EwmhPropertyCookieChecked for [<$request Cookie>] {
type Reply = $reply;
fn inner(self) -> xcb::x::GetPropertyCookie {
self.0
}
}
impl EwmhPropertyCookieUnchecked for [<$request CookieUnchecked>] {
type Reply = $reply;
fn inner(self) -> xcb::x::GetPropertyCookieUnchecked {
self.0
}
}
}
};
}
macro_rules! _get_property_request {
(@private root, $property:ident, UTF8_STRING) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
long_offset: 0,
long_length: u32::MAX,
}
}
};
(@private root, $property:ident, $xtype:ident) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: xcb::x::$xtype,
long_offset: 0,
long_length: u32::MAX,
}
}
};
(@private client, $property:ident, UTF8_STRING) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: self.0,
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
long_offset: 0,
long_length: u32::MAX,
}
}
};
(@private client, $property:ident, $xtype:ident) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: self.0,
property: con.atoms.$property,
r#type: xcb::x::$xtype,
long_offset: 0,
long_length: u32::MAX,
}
}
};
}
macro_rules! _get_property_structs {
(@private $request:ident, root) => {
paste! {
pub struct $request;
pub struct [<$request Cookie>](xcb::x::GetPropertyCookie);
pub struct [<$request CookieUnchecked>](xcb::x::GetPropertyCookieUnchecked);
}
};
(@private $request:ident, client) => {
paste! {
pub struct $request(xcb::x::Window);
pub struct [<$request Cookie>](xcb::x::GetPropertyCookie);
pub struct [<$request CookieUnchecked>](xcb::x::GetPropertyCookieUnchecked);
impl $request {
fn new(window: xcb::x::Window) -> $request {
$request(window)
}
}
}
};
}
macro_rules! ewmh_get_property {
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: $xtype: ident
},
reply=$reply:ident) => {
paste!{
_get_property_structs! {@private $request, $window}
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::GetProperty;
type EwmhCookie = [<$request Cookie>];
_get_property_request! {@private $window, $property, $xtype}
fn convert_cookie(&'a self, xcb_cookie: xcb::x::GetPropertyCookie) -> Self::EwmhCookie {
[<$request Cookie>](xcb_cookie)
}
}
impl EwmhPropertyRequestUnchecked for $request {
paste!{type EwmhCookie = [<$request CookieUnchecked>];}
#[rustfmt::skip]
fn convert_cookie(&self, xcb_cookie: xcb::x::GetPropertyCookieUnchecked) -> Self::EwmhCookie {
[<$request CookieUnchecked>](xcb_cookie)
}
_get_property_request! {@private $window, $property, $xtype}
}
_get_property_cookies! {@private $request, $reply}
}
};
}

View file

@ -0,0 +1,47 @@
macro_rules! _client_message_base {
(root) => {
fn xcb_request(&'a self, con: &Connection) -> Self::XcbRequest {
xcb::x::SendEvent {
propagate: false,
destination: xcb::x::SendEventDest::Window(
con.con.get_setup().roots().next().unwrap().root(),
),
event_mask: xcb::x::EventMask::SUBSTRUCTURE_NOTIFY
| xcb::x::EventMask::SUBSTRUCTURE_REDIRECT,
event: &self.client_message,
}
}
};
($destination: ident) => {
fn xcb_request(&'a self, con: &Connection) -> Self::XcbRequest {
xcb::x::SendEvent {
propagate: false,
destination: xcb::x::SendEventDest::Window($destination),
event_mask: xcb::x::EventMask::SUBSTRUCTURE_NOTIFY
| xcb::x::EventMask::SUBSTRUCTURE_REDIRECT,
event: &self.client_message,
}
}
};
}
macro_rules! ewmh_client_message {
(request=$request:ident{destination: $destination:ident}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::SendEvent<'a, xcb::x::ClientMessageEvent>;
type EwmhCookie = xcb::VoidCookie;
_client_message_base! {$destination}
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::SendEvent<'a, xcb::x::ClientMessageEvent>;
_client_message_base! {$destination}
}
};
}

View file

@ -0,0 +1,139 @@
macro_rules! _get_property_cookies {
(@ewmh_priv $request:ident, $reply:ident) => {
paste! {
impl EwmhCookie for [<$request Cookie>] {
type XcbCookie = xcb::x::GetPropertyCookie;
}
impl EwmhPropertyCookieChecked for [<$request Cookie>] {
type Reply = $reply;
fn inner(self) -> xcb::x::GetPropertyCookie {
self.0
}
}
impl EwmhPropertyCookieUnchecked for [<$request CookieUnchecked>] {
type Reply = $reply;
fn inner(self) -> xcb::x::GetPropertyCookieUnchecked {
self.0
}
}
}
};
}
macro_rules! _get_property_request {
(@ewmh_priv root, $property:ident, UTF8_STRING) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
long_offset: 0,
long_length: u32::MAX,
}
}
};
(@ewmh_priv root, $property:ident, $xtype:ident) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: xcb::x::$xtype,
long_offset: 0,
long_length: u32::MAX,
}
}
};
(@ewmh_priv client, $property:ident, UTF8_STRING) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: self.0,
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
long_offset: 0,
long_length: u32::MAX,
}
}
};
(@ewmh_priv client, $property:ident, $xtype:ident) => {
fn xcb_request(&self, con: &Connection) -> xcb::x::GetProperty {
xcb::x::GetProperty {
delete: false,
window: self.0,
property: con.atoms.$property,
r#type: xcb::x::$xtype,
long_offset: 0,
long_length: u32::MAX,
}
}
};
}
macro_rules! _get_property_structs {
(@ewmh_priv $request:ident, root) => {
paste! {
pub struct $request;
pub struct [<$request Cookie>](xcb::x::GetPropertyCookie);
pub struct [<$request CookieUnchecked>](xcb::x::GetPropertyCookieUnchecked);
}
};
(@ewmh_priv $request:ident, client) => {
paste! {
pub struct $request(xcb::x::Window);
pub struct [<$request Cookie>](xcb::x::GetPropertyCookie);
pub struct [<$request CookieUnchecked>](xcb::x::GetPropertyCookieUnchecked);
impl $request {
fn new(window: xcb::x::Window) -> $request {
$request(window)
}
}
}
};
}
macro_rules! ewmh_get_property {
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: $xtype: ident
},
reply=$reply:ident) => {
paste!{
_get_property_structs! {@ewmh_priv $request, $window}
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::GetProperty;
type EwmhCookie = [<$request Cookie>];
_get_property_request! {@ewmh_priv $window, $property, $xtype}
fn convert_cookie(&'a self, xcb_cookie: xcb::x::GetPropertyCookie) -> Self::EwmhCookie {
[<$request Cookie>](xcb_cookie)
}
}
impl EwmhPropertyRequestUnchecked for $request {
paste!{type EwmhCookie = [<$request CookieUnchecked>];}
#[rustfmt::skip]
fn convert_cookie(&self, xcb_cookie: xcb::x::GetPropertyCookieUnchecked) -> Self::EwmhCookie {
[<$request CookieUnchecked>](xcb_cookie)
}
_get_property_request! {@ewmh_priv $window, $property, $xtype}
}
_get_property_cookies! {@ewmh_priv $request, $reply}
}
};
}

View file

@ -0,0 +1,8 @@
#[macro_use]
mod get_property;
#[macro_use]
mod set_property;
#[macro_use]
mod client_message;

View file

@ -0,0 +1,132 @@
macro_rules! _set_property_base {
(root, $property:ident, UTF8_STRING) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u8> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
data: &self.data,
}
}
};
(root, $property:ident, $xtype:ident) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u32> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: con.con.get_setup().roots().next().unwrap().root(),
property: con.atoms.$property,
r#type: xcb::x::$xtype,
data: &self.data,
}
}
};
(client, $property:ident, UTF8_STRING) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u8> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: self.window,
property: con.atoms.$property,
r#type: con.atoms.UTF8_STRING,
data: &self.data,
}
}
};
(client, $property:ident, ATOM_CARDINAL) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, u32> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: self.window,
property: con.atoms.$property,
r#type: xcb::x::ATOM_CARDINAL,
data: &self.data,
}
}
};
(client, $property:ident, ATOM_ATOM) => {
fn xcb_request(&'a self, con: &Connection) -> xcb::x::ChangeProperty<'a, xcb::x::Atom> {
xcb::x::ChangeProperty {
mode: xcb::x::PropMode::Replace,
window: self.window,
property: con.atoms.$property,
r#type: xcb::x::ATOM_ATOM,
data: &self.data,
}
}
};
}
macro_rules! ewmh_set_property {
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: UTF8_STRING
}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u8>;
type EwmhCookie = xcb::VoidCookie;
_set_property_base! {$window, $property, UTF8_STRING}
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u8>;
_set_property_base! {$window, $property, UTF8_STRING}
}
};
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: ATOM_CARDINAL
}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u32>;
type EwmhCookie = xcb::VoidCookie;
_set_property_base! {$window, $property, ATOM_CARDINAL}
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, u32>;
_set_property_base! {$window, $property, ATOM_CARDINAL}
}
};
(request=$request:ident{
window: $window:ident,
property: $property:ident,
xtype: ATOM_ATOM
}) => {
impl<'a> EwmhRequest<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, xcb::x::Atom>;
type EwmhCookie = xcb::VoidCookie;
_set_property_base! {$window, $property, ATOM_ATOM }
fn convert_cookie(&'a self, xcb_cookie: xcb::VoidCookie) -> Self::EwmhCookie {
xcb_cookie
}
}
impl<'a> EwmhVoidRequestChecked<'a> for $request {
type XcbRequest = xcb::x::ChangeProperty<'a, xcb::x::Atom>;
_set_property_base! {$window, $property, ATOM_ATOM }
}
};
}

View file

@ -81,7 +81,7 @@ ewmh_get_property! {
property: _NET_CLIENT_LIST_STACKING,
xtype: ATOM_WINDOW
},
reply=GetClientListStackingReply,
reply=GetClientListStackingReply
}
// }}}
@ -126,7 +126,7 @@ impl SetNumberOfDesktops {
}
ewmh_client_message! {
request=SetNumberOfDesktops{destination: root_window}
request=SetNumberOfDesktops{destination: root}
}
// }}}
@ -173,7 +173,7 @@ impl SetDesktopGeometry {
}
ewmh_client_message! {
request=SetDesktopGeometry{destination: root_window}
request=SetDesktopGeometry{destination: root}
}
// }}}
@ -221,7 +221,7 @@ impl SetDesktopViewport {
}
ewmh_client_message! {
request=SetDesktopViewport{destination: root_window}
request=SetDesktopViewport{destination: root}
}
// }}}
@ -266,7 +266,7 @@ impl SetCurrentDesktop {
}
ewmh_client_message! {
request=SetCurrentDesktop{destination: root_window}
request=SetCurrentDesktop{destination: root}
}
// }}}
@ -308,7 +308,7 @@ impl SetDesktopNames {
ewmh_set_property! {
request=SetDesktopNames{
window: root_window,
window: root,
property: _NET_DESKTOP_NAMES,
xtype: UTF8_STRING
}
@ -368,7 +368,7 @@ impl SetActiveWindow {
}
ewmh_client_message! {
request=SetActiveWindow{destination: root_window}
request=SetActiveWindow{destination: root}
}
// }}}
@ -494,11 +494,7 @@ pub struct GetShowingDesktopReply {
impl From<xcb::x::GetPropertyReply> for GetShowingDesktopReply {
fn from(reply: xcb::x::GetPropertyReply) -> Self {
GetShowingDesktopReply {
is_showing_desktop: if reply.value::<u32>()[0] == 1 {
true
} else {
false
},
is_showing_desktop: { reply.value::<u32>()[0] == 1 },
}
}
}
@ -531,7 +527,7 @@ impl SetShowingDesktop {
}
ewmh_client_message! {
request=SetShowingDesktop{destination: root_window}
request=SetShowingDesktop{destination: root}
}
// }}}
@ -559,7 +555,7 @@ impl CloseWindow {
}
ewmh_client_message! {
request=CloseWindow{destination: root_window}
request=CloseWindow{destination: root}
}
// // _NET_MOVERESIZE_WINDOW
@ -602,6 +598,6 @@ impl RequestFrameExtents {
}
ewmh_client_message! {
request=RequestFrameExtents{destination: root_window}
request=RequestFrameExtents{destination: root}
}
// }}}