如何获得鼠标相对于终端 window 的位置?

How do I get the mouse's position relative to the terminal's window?

如何在 Linux 上获取鼠标相对于终端的位置? 这是我目前所拥有的:

use std::ptr;
use x11::xlib;

fn main() {
    unsafe {
        let display = xlib::XOpenDisplay(ptr::null());

        if display.is_null() {
            panic!("XOpenDisplay failed");
        }

        let mut root_return = 0;
        let mut child_return = 0;
        let mut root_x_return = 0;
        let mut root_y_return = 0;
        let mut win_x_return = 0;
        let mut win_y_return = 0;
        let mut mask_return = 0;

        let screen = xlib::XDefaultScreen(display);
        let window = xlib::XRootWindow(display, screen);

        xlib::XQueryPointer(
            display,
            window,
            &mut root_return,
            &mut child_return,
            &mut root_x_return,
            &mut root_y_return,
            &mut win_x_return,
            &mut win_y_return,
            &mut mask_return,
        );
        // root_x_return and root_y_return are the same as win_x_return and win_y_return
        dbg!(root_x_return, root_y_return, win_x_return, win_y_return,);
    }
}

它为我提供了全局鼠标在整个屏幕上的位置。我需要做什么才能获得仅与当前终端的 window 相关的输出?所以0, 0从第一个终端单元格像素开始。

看起来您正在使用 XRootWindow() 获取根 window,然后将其作为 window 传递给 XQueryPointer() 以获取相对鼠标坐标。在那种情况下,您会期望 root_return 和 win_return 值相同。

如果您创建了一个新的 X window,并将其传递给 XQueryPointer(),那么对于 win_*_return 值,您应该获得相对于该新 window 而不是到根 window.

获取当前终端 window 有点棘手,因为它实际上属于另一个进程(运行 和 shell 的终端进程)。您从终端 window 启动的进程正在通过 OS 发送和接收文本,并且无法直接访问终端进程或者它是 windows。您可能会找到终端的进程 ID,然后找到属于该进程的 X window ID,但这绝不是微不足道的