使用 Rust X11 绑定移动窗口

问题描述 投票:0回答:1

我正在尝试使用 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
,终端会移动

铁锈游乐场

rust x11
1个回答
0
投票

X11 是异步的。

发送请求后,我们必须刷新命令流以确保服务器考虑它。

当使用传统的事件循环(使用

XNextEvent()
XPending()
...)时,刷新是隐式的。 这里我们必须明确地刷新,因为没有这样的循环;发送请求后程序立即退出。

    conn.configure_window(win, &values)?;
    conn.flush()?;

请注意,在我的平台上,我必须将窗口 ID 更改为父级(我的窗口管理器可能与您的不同)。

© www.soinside.com 2019 - 2024. All rights reserved.