#linux #rust #mouse #x11
Вопрос:
Как я могу определить положение мыши относительно терминала в 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,
amp;mut root_return,
amp;mut child_return,
amp;mut root_x_return,
amp;mut root_y_return,
amp;mut win_x_return,
amp;mut win_y_return,
amp;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,);
}
}
Это дает мне положение глобальной мыши на всем экране. Что мне нужно сделать, чтобы получить вывод только относительно окна текущего терминала? Так что 0, 0 начинается с первого пикселя конечной ячейки.
Ответ №1:
Похоже, вы получаете корневое окно с помощью XRootWindow (), а затем передаете его XQueryPointer() в качестве окна для получения относительных координат мыши. В этом случае можно было бы ожидать, что значения root_return и win_return будут одинаковыми.
Если вы создали новое окно X и вместо этого передали его в XQueryPointer (), то для значений win_*_return вы должны получить координаты относительно этого нового окна, а не корневого окна.
Получить текущее окно терминала немного сложно, так как оно фактически принадлежит другому процессу (терминальному процессу, в котором запущена оболочка). Процесс, который вы запускаете из окна терминала, отправляет и получает текст через операционную систему и не имеет прямого доступа к процессу терминала или его окнам. Возможно, вы могли бы найти идентификатор процесса терминала, а затем найти идентификатор окна X, который принадлежит этому процессу, но это ни в коем случае не тривиально