【问题标题】:xevent.xkey.keycode not working for me (X11)xevent.xkey.keycode 对我不起作用(X11)
【发布时间】:2022-01-09 07:42:21
【问题描述】:

所以我有这段运行良好的代码

while(1) {
    XNextEvent(dpy,&e);
    paint(cs,g);
    if(e.xbutton.button == 1) {
        evolue(g,gc,cycleG);
        paint(cs,g);
        printf("test");
    }else if(e.xbutton.button==3) break ;
}

这里 xbutton.button == 1 是左键。

我想更改代码,以便通过将其更改为通过键盘按下来执行该功能

while(1) {
    XNextEvent(dpy,&e);
    paint(cs,g);
    if(e.xkey.keycode == 54) {
        evolue(g,gc,cycleG);
        paint(cs,g);
        printf("test");
    }else if(e.xbutton.button==3) break ;
}

我通过在终端上运行 xev 得到了 keycode 54

所以无论如何,从逻辑上讲,第二段代码应该可以工作,但它只是不会在 if 语句中运行代码,这与使用鼠标输入时不同。所以..什么给了?以及如何通过键盘输入修复它?

编辑: 为了进一步测试,我写了这段代码

while(1) {
    XNextEvent(dpy,&e);
    
    if(e.type == KeyPress){
        paint(cs,g);
        evolue(g,gc,cycleG);
    }
    
    if(e.type == ButtonPress){
        paint(cs,g);
        evolue(g,gc,cycleG);
    }
}

这样无论按下哪个鼠标按钮和按下哪个键盘键,它都会执行程序,但同样,只有鼠标按钮执行程序,而键盘键不执行。

【问题讨论】:

  • 除此之外,您永远不会检查由XNextEvent 处理的type of event
  • @G.M.但 Xevent 不是适用于所有事件类型吗?
  • XEvent 是结构体的联合体,每个结构体都以字段int type 开头。 type 字段用于区分联合。参见例如this example.
  • @G.M.我修改了我的帖子以显示我所做的进一步测试,以便它检查它是什么 Xevent 类型并且它仍然无法正常工作

标签: c input x11


【解决方案1】:

问题出在上面的函数中,它选择了输入类型

XSelectInput(dpy, win, ExposureMask|ButtonPressMask);

我改成这个了

XSelectInput(dpy, win, ExposureMask|ButtonPressMask|KeyPressMask);

这解决了它。

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2017-09-29
    • 2015-03-05
    • 2018-06-14
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多