mirror of
https://github.com/alacritty/alacritty.git
synced 2024-11-25 14:05:41 -05:00
Support setting _NET_WM_PID in X11 environments
Support is added for setting _NET_WM_PID automatically. This is to support scripting of the window environment. For example, this makes it possible to script opening a window with same CWD: 1. Retrieve the current window 2. (new) get PID of window 3. Check if it's Alacritty, find first child (presumably a shell), and get the child's cwd. 4. Spawn new instance of terminal with cwd. Unaddressed in this commit is how this will coexist on a Wayland system.
This commit is contained in:
parent
09031decc0
commit
574586045f
4 changed files with 57 additions and 2 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -24,6 +24,7 @@ dependencies = [
|
||||||
"serde_yaml 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_yaml 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"vte 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"vte 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"x11-dl 2.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,9 @@ unicode-width = "0.1.4"
|
||||||
|
|
||||||
clippy = { version = "0.0.104", optional = true }
|
clippy = { version = "0.0.104", optional = true }
|
||||||
|
|
||||||
|
[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="openbsd"))'.dependencies]
|
||||||
|
x11-dl = "2.12.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["err-println"]
|
default = ["err-println"]
|
||||||
# Enabling this feature makes shaders automatically reload when changed
|
# Enabling this feature makes shaders automatically reload when changed
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
#[macro_use] extern crate log;
|
#[macro_use] extern crate log;
|
||||||
#[macro_use] extern crate serde_derive;
|
#[macro_use] extern crate serde_derive;
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="openbsd"))]
|
||||||
|
extern crate x11_dl;
|
||||||
|
|
||||||
extern crate cgmath;
|
extern crate cgmath;
|
||||||
extern crate copypasta;
|
extern crate copypasta;
|
||||||
extern crate errno;
|
extern crate errno;
|
||||||
|
|
|
@ -217,10 +217,14 @@ impl Window {
|
||||||
window.make_current()?;
|
window.make_current()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Window {
|
let window = Window {
|
||||||
glutin_window: window,
|
glutin_window: window,
|
||||||
cursor_visible: true,
|
cursor_visible: true,
|
||||||
})
|
};
|
||||||
|
|
||||||
|
window.run_os_extensions();
|
||||||
|
|
||||||
|
Ok(window)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get some properties about the device
|
/// Get some properties about the device
|
||||||
|
@ -301,6 +305,50 @@ impl Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait OsExtensions {
|
||||||
|
fn run_os_extensions(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="openbsd")))]
|
||||||
|
impl OsExtensions for Window { }
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "linux", target_os = "freebsd", target_os="dragonfly", target_os="openbsd"))]
|
||||||
|
impl OsExtensions for Window {
|
||||||
|
fn run_os_extensions(&self) {
|
||||||
|
use ::glutin::os::unix::WindowExt;
|
||||||
|
use ::x11_dl::xlib::{self, XA_CARDINAL, PropModeReplace};
|
||||||
|
use ::std::ffi::{CStr};
|
||||||
|
use ::std::ptr;
|
||||||
|
use ::libc::getpid;
|
||||||
|
|
||||||
|
let xlib_display = self.glutin_window.get_xlib_display();
|
||||||
|
let xlib_window = self.glutin_window.get_xlib_window();
|
||||||
|
|
||||||
|
if let (Some(xlib_window), Some(xlib_display)) = (xlib_window, xlib_display) {
|
||||||
|
let xlib = xlib::Xlib::open().expect("get xlib");
|
||||||
|
|
||||||
|
// Set _NET_WM_PID to process pid
|
||||||
|
unsafe {
|
||||||
|
let _net_wm_pid = CStr::from_ptr(b"_NET_WM_PID\0".as_ptr() as *const _);
|
||||||
|
let atom = (xlib.XInternAtom)(xlib_display as *mut _, _net_wm_pid.as_ptr(), 0);
|
||||||
|
let pid = getpid();
|
||||||
|
|
||||||
|
(xlib.XChangeProperty)(xlib_display as _, xlib_window as _, atom,
|
||||||
|
XA_CARDINAL, 32, PropModeReplace, &pid as *const i32 as *const u8, 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
// Although this call doesn't actually pass any data, it does cause
|
||||||
|
// WM_CLIENT_MACHINE to be set. WM_CLIENT_MACHINE MUST be set if _NET_WM_PID is set
|
||||||
|
// (which we do above).
|
||||||
|
unsafe {
|
||||||
|
(xlib.XSetWMProperties)(xlib_display as _, xlib_window as _, ptr::null_mut(),
|
||||||
|
ptr::null_mut(), ptr::null_mut(), 0, ptr::null_mut(), ptr::null_mut(),
|
||||||
|
ptr::null_mut());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Proxy {
|
impl Proxy {
|
||||||
/// Wakes up the event loop of the window
|
/// Wakes up the event loop of the window
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in a new issue