diff --git a/src/window.rs b/src/window.rs index ee43cc8f..fb7ec907 100644 --- a/src/window.rs +++ b/src/window.rs @@ -27,11 +27,7 @@ pub fn window(monitor: gdk::Monitor) -> gtk4::Window { let window = cascade! { gtk4::Window::new(); ..set_decorated(false); - //..set_keep_above(true); - //..stick(); ..set_child(Some(&box_)); - ..connect_realize(|window| { - }); ..show(); }; @@ -44,8 +40,6 @@ pub fn window(monitor: gdk::Monitor) -> gtk4::Window { let top_start_x = geometry.x as x::c_ulong; let top_end_x = top_start_x + geometry.width as x::c_ulong - 1; - println!("{} {}", top_start_x, top_end_x); - unsafe { x::set_position(&display, &surface, top_start_x as _, 0); @@ -64,16 +58,8 @@ pub fn window(monitor: gdk::Monitor) -> gtk4::Window { unsafe { surface.set_skip_pager_hint(true); surface.set_skip_taskbar_hint(true); - x::change_property( - &display, - &surface, - "_NET_WM_STATE", - x::PropMode::Append, - &[ - x::Atom::new(&display, "_NET_WM_STATE_ABOVE").unwrap(), - x::Atom::new(&display, "_NET_WM_STATE_STICKY").unwrap(), - ], - ); // XXX not working? + x::wm_state_add(&display, &surface, "_NET_WM_STATE_ABOVE"); + x::wm_state_add(&display, &surface, "_NET_WM_STATE_STICKY"); x::change_property( &display, &surface, diff --git a/src/x.rs b/src/x.rs index 8d4a679d..41c51315 100644 --- a/src/x.rs +++ b/src/x.rs @@ -1,9 +1,11 @@ +use cascade::cascade; use gdk4_x11::x11::xlib; use glib::translate::ToGlibPtr; use gtk4::{glib, prelude::*}; use std::{ ffi::{CString, NulError}, os::raw::{c_int, c_long}, + ptr, }; pub use std::os::raw::{c_uchar, c_ulong, c_ushort}; @@ -145,3 +147,38 @@ pub unsafe fn set_position( // XXX check error return value xlib::XMoveWindow(display.xdisplay(), surface.xid(), x, y); } + +pub unsafe fn wm_state_add( + display: &gdk4_x11::X11Display, + surface: &gdk4_x11::X11Surface, + state: &str, +) { + const _NET_WM_STATE_ADD: c_long = 1; + // XXX check error return value + let mut event = xlib::XEvent { + client_message: xlib::XClientMessageEvent { + type_: xlib::ClientMessage, + serial: 0, + send_event: 0, + display: ptr::null_mut(), + window: surface.xid(), + message_type: Atom::new(display, "_NET_WM_STATE").unwrap().0, + format: 32, + data: cascade! { + xlib::ClientMessageData::new(); + ..set_long(0, _NET_WM_STATE_ADD); + ..set_long(1, Atom::new(display, state).unwrap().0 as _); + ..set_long(2, Atom::new(display, "").unwrap().0 as _); + ..set_long(3, 1); + ..set_long(3, 0); + }, + }, + }; + xlib::XSendEvent( + display.xdisplay(), + display.xrootwindow(), + 0, + xlib::SubstructureRedirectMask | xlib::SubstructureNotifyMask, + &mut event, + ); +}