rust 聆听屏幕上任意位置的按键

yrdbyhpb  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(284)

我正在使用x11rb,X11 Rust Bindings。我修改了this教程中的一些代码,这样我就可以从parent_winscreen.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

webghufk

webghufk1#

如果你想从一个窗口接收事件,你首先必须请求这样的愿望,当你创建一个新窗口或通过:XSelectInput(事实上,如果你只对根窗口事件感兴趣--比如窗口管理器--根本不需要创建窗口)。

XSelectInput(
    Display *display, //display connection
    Window w,         //e.g. DefaultRootWindow(display)
    long event_mask   //KeyPressMask | KeyReleaseMask
);

现在,我没有任何经验,在生 rust 的所有,因此我不知道什么相关的生 rust 代码将是。

提示

  • 在多显示器设置中,有可能有多个根窗口,在这种情况下,您可以指定RootWindow(display, screen_number)作为参数wScreenCount(display)将为您提供屏幕数)。
  • 只有具有输入焦点的窗口才会接收按键事件,因此如果另一个窗口具有输入焦点,您可能不会接收到任何事件。为此,您可以执行键盘抓取,但这需要在之后将事件传递到适当的客户端。

相关问题