首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在X11应用程序中忽略自动重复

在X11应用程序中忽略自动重复
EN

Stack Overflow用户
提问于 2010-01-20 18:34:47
回答 6查看 10.8K关注 0票数 24

如果在启用AutoRepeat的同时按住X11中的某个键,则会连续收到KeyPressKeyRelease事件。我知道可以使用函数XAutoRepeatOff(),禁用AutoRepeat,但这会更改整个X服务器的设置。有没有办法禁用单个应用程序的AutoRepeat,或者忽略重复的击键?

我正在寻找的是当一个键被按下时的单个KeyPress事件和当一个键被释放时的单个KeyRelease事件,而不会干扰X服务器的AutoRepeat设置。

下面是一个简单的示例(主要来自Beginner Xlib Tutorial):

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>

Display *dis;
Window win;
XEvent report;

int main ()
{
  dis = XOpenDisplay (NULL);
  // XAutoRepeatOn(dis);
  win = XCreateSimpleWindow (dis, RootWindow (dis, 0), 1, 1, 500, 500,
        0, BlackPixel (dis, 0), BlackPixel (dis, 0));
  XSelectInput (dis, win, KeyPressMask | KeyReleaseMask);
  XMapWindow (dis, win);
  XFlush (dis);

  while (1)
    {
      XNextEvent (dis, &report);
      switch (report.type)
 {
 case KeyPress:
   fprintf (stdout, "key #%ld was pressed.\n",
     (long) XLookupKeysym (&report.xkey, 0));
   break;
 case KeyRelease:
   fprintf (stdout, "key #%ld was released.\n",
     (long) XLookupKeysym (&report.xkey, 0));
   break;
 }
    }

  return (0);
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-11 05:02:30

当你收到一个按键释放,并且下一个事件是按下相同的组合键时,它会自动重复,并且该键并没有实际释放。您可以使用这样的代码来查看下一个事件

代码语言:javascript
复制
if (event->type == KeyRelease && XEventsQueued(disp, QueuedAfterReading))
{
  XEvent nev;
  XPeekEvent(disp, &nev);
    
  if (nev.type == KeyPress && nev.xkey.time == event->xkey.time &&
      nev.xkey.keycode == event->xkey.keycode)
  {
    /* Key wasn’t actually released */
  }
}
票数 24
EN

Stack Overflow用户

发布于 2010-01-20 23:51:43

您可以使用XkbSetDetectableAutorepeat函数告诉X服务器仅在用户实际释放键时发送KeyRelease事件-当您不想要自动重复事件时,则丢弃任何不匹配KeyRelease的KeyPress。

票数 14
EN

Stack Overflow用户

发布于 2010-07-11 17:37:51

作为参考,这里有一个删除自动重复的KeyPress事件的工作最小示例。谢谢,kralyk!

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>

Display *dis;
Window win;
XEvent report;

int main ()
{
  dis = XOpenDisplay (NULL);
  // XAutoRepeatOn(dis);
  win = XCreateSimpleWindow (dis, RootWindow (dis, 0), 1, 1, 500, 500,
        0, BlackPixel (dis, 0), BlackPixel (dis, 0));
  XSelectInput (dis, win, KeyPressMask | KeyReleaseMask);
  XMapWindow (dis, win);
  XFlush (dis);

  while (1)
    {
      XNextEvent (dis, &report);
      switch (report.type)
 {
 case KeyPress:
   fprintf (stdout, "key #%ld was pressed.\n",
     (long) XLookupKeysym (&report.xkey, 0));
   break;
 case KeyRelease:
   {
     unsigned short is_retriggered = 0;

     if (XEventsQueued(dis, QueuedAfterReading))
       {
         XEvent nev;
         XPeekEvent(dis, &nev);

         if (nev.type == KeyPress && nev.xkey.time == report.xkey.time &&
             nev.xkey.keycode == report.xkey.keycode)
           {
             fprintf (stdout, "key #%ld was retriggered.\n",
               (long) XLookupKeysym (&nev.xkey, 0));

             // delete retriggered KeyPress event
             XNextEvent (dis, &report);
             is_retriggered = 1;
           }
       }

     if (!is_retriggered)
       fprintf (stdout, "key #%ld was released.\n",
         (long) XLookupKeysym (&report.xkey, 0));
   }
   break;
 }
    }

  return (0);
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2100654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档