我正在使用x11rb,X11 Rust Bindings。我修改了this教程中的一些代码,这样我就可以从parent_win
(screen.root
)而不是win
听到按键:
use std::error::Error;
use x11rb::connection::Connection;
use x11rb::protocol::xproto::*;
use x11rb::protocol::Event;
use x11rb::COPY_DEPTH_FROM_PARENT;
fn print_modifiers(mask: x11rb::protocol::xproto::KeyButMask) {
println!("Modifier mask: {:#?}", mask);
}
fn main() -> Result<(), Box<dyn Error>> {
// Open the connection to the X server. Use the DISPLAY environment variable.
let (conn, screen_num) = x11rb::connect(None)?;
// Get the screen #screen_num
let screen = &conn.setup().roots[screen_num];
// Ask for our window's Id
let win = conn.generate_id()?;
let parent_win = screen.root;
println!("win: {}", win);
println!("parentWin: {}", parent_win);
// NOTE: This window is not being used
let values = CreateWindowAux::default().background_pixel(screen.white_pixel);
conn.create_window(
COPY_DEPTH_FROM_PARENT, // depth
win, // window Id
screen.root, // parent window
0, // x
0, // y
150, // width
150, // height
10, // border_width
WindowClass::INPUT_OUTPUT, // class
screen.root_visual, // visual
&values,
)?;
let values = ChangeWindowAttributesAux::default().event_mask(EventMask::KEY_PRESS);
conn.change_window_attributes(screen.root, &values)?;
// Map the window on the screen
conn.map_window(win)?;
conn.flush()?;
loop {
let event = conn.wait_for_event()?;
match event {
Event::KeyPress(event) => {
print_modifiers(event.state);
println!("Key pressed in window {}", event.event);
}
_ => {
// Unknown event type, ignore it
println!("Unknown event: {:?}", event);
}
}
}
}
我想如果我在屏幕上的任何地方按下键,这将使println!("Key pressed in window {}", event.event);
在终端中记录一些东西。但没有记录任何东西。
正确的做法是什么?
Rust Playground
1条答案
按热度按时间webghufk1#
如果你想从一个窗口接收事件,你首先必须请求这样的愿望,当你创建一个新窗口或通过:XSelectInput(事实上,如果你只对根窗口事件感兴趣--比如窗口管理器--根本不需要创建窗口)。
现在,我没有任何经验,在生 rust 的所有,因此我不知道什么相关的生 rust 代码将是。
提示:
RootWindow(display, screen_number)
作为参数w
(ScreenCount(display)
将为您提供屏幕数)。