我正在尝试使用 x11rb 移动窗口(GNOME 终端)。我遵循了this教程。但是
move_window
函数不会移动窗口。
use x11rb::connection::Connection;
use x11rb::protocol::xproto::*;
use x11rb::rust_connection::ReplyError;
fn move_window<C: Connection>(conn: &C, win: Window) -> Result<(), ReplyError> {
// Changing the size doesn't work either
// let values = ConfigureWindowAux::default().width(100).height(100);
let values = ConfigureWindowAux::default().x(100).y(100);
println!("values: {:?}", values);
conn.configure_window(win, &values)?;
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let (conn, screen_num) = x11rb::connect(None)?;
let screen = &conn.setup().roots[screen_num];
// `move_window` doesn't reposition the window even if I hardcode the id.
// I also tried 0x4000006. It doesn't work either.
// let win_id = 67108871;
// Get the root window ID
let root_win = screen.root;
println!("root_win: {}", root_win);
// Query the X11 server for the window ID of the active window
let active_win = conn.get_input_focus()?.reply()?.focus;
println!("active_win: {}", active_win);
// Move the active window to position (100, 100)
move_window(&conn, active_win)?;
Ok(())
}
我确定它是正确的窗口:
xwininfo: Window id: 0x4000006 "alex@alex-M52AD-M12AD-A-F-K31AD: ~/rust/x11rb-tutorial"
所有的值似乎都是正确的:
root_win: 661
active_win: 67108871 // 67108871 equals to 0x4000006
values: ConfigureWindowAux { x: Some(100), y: Some(100), width: None, height: None, border_width: None, sibling: None, stack_mode: None }
可能是什么问题?
注意:我也试过调整窗口大小。什么都没发生。如果我在终端中运行这个
xdotool windowmove 0x4000006 100 100
,终端会移动。
X11 是异步的。
发送请求后,我们必须刷新命令流以确保服务器考虑它。
当使用传统的事件循环(使用
XNextEvent()
、XPending()
...)时,刷新是隐式的。
这里我们必须明确地刷新,因为没有这样的循环;发送请求后程序立即退出。
conn.configure_window(win, &values)?;
conn.flush()?;
请注意,在我的平台上,我必须将窗口 ID 更改为父级(我的窗口管理器可能与您的不同)。