当前位置:  开发笔记 > 编程语言 > 正文

Linux/X11输入库无需创建窗口

如何解决《Linux/X11输入库无需创建窗口》经验,为你挑选了1个好方法。

是否有一个很好的库用于从鼠标/键盘/操纵杆收集Linux中的用户输入,这不会强制您创建可见窗口?SDL允许您以合理的方式获得用户输入,但似乎迫使您创建一个窗口,如果您具有抽象控制,这很麻烦,因此控制机器不必与渲染机器相同.但是,如果控制和渲染机器相同,则会在显示器顶部形成一个丑陋的小SDL窗口.

编辑澄清:
渲染器有一个输出窗口,在其正常使用情况下,该窗口是全屏的,除非它们都在同一台计算机上运行,​​只是因此可以给控制器焦点.实际上可以有多个渲染器在同一控制器控制的不同计算机上显示相同数据的不同视图,因此输入与输出完全解耦(利用内置的X11客户端/服务器的东西来显示更少另外,一个渲染器的多个控制器应用程序也是可能的.控制器和渲染器之间的通信是通过套接字进行的.



1> Thomas Kamme..:

好吧,如果你在X11之下并想要获得kbd,你需要抓住它.如果你不是,我唯一的好答案是来自终端的ncurses.

以下是您从键盘获取所有内容并再次发布的方法:

/* Demo code, needs more error checking, compile
 * with "gcc nameofthisfile.c -lX11".

/* weird formatting for markdown follows.  argh! */

#include

int main(int argc, char **argv)
{
   Display *dpy;
   XEvent ev;
   char *s;
   unsigned int kc;
   int quit = 0;

   if (NULL==(dpy=XOpenDisplay(NULL))) {
      perror(argv[0]);
      exit(1);
   }

   /*
    * You might want to warp the pointer to somewhere that you know
    * is not associated with anything that will drain events.
    *  (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
    */

   XGrabKeyboard(dpy, DefaultRootWindow(dpy),
                 True, GrabModeAsync, GrabModeAsync, CurrentTime);

   printf("KEYBOARD GRABBED!  Hit 'q' to quit!\n"
          "If this job is killed or you get stuck, use Ctrl-Alt-F1\n"
          "to switch to a console (if possible) and run something that\n"
          "ungrabs the keyboard.\n");


   /* A very simple event loop: start at "man XEvent" for more info. */
   /* Also see "apropos XGrab" for various ways to lock down access to
    * certain types of info. coming out of or going into the server */
   for (;!quit;) {
      XNextEvent(dpy, &ev);
      switch (ev.type) {
         case KeyPress:
            kc = ((XKeyPressedEvent*)&ev)->keycode;
            s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
            /* s is NULL or a static no-touchy return string. */
            if (s) printf("KEY:%s\n", s);
            if (!strcmp(s, "q")) quit=~0;
            break;
         case Expose:
               /* Often, it's a good idea to drain residual exposes to
                * avoid visiting Blinky's Fun Club. */
               while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ;
            break;
         case ButtonPress:
         case ButtonRelease:
         case KeyRelease:
         case MotionNotify:
         case ConfigureNotify:
         default:
            break;
      }
   }

   XUngrabKeyboard(dpy, CurrentTime);

   if (XCloseDisplay(dpy)) {
      perror(argv[0]);
      exit(1);
   }

   return 0;
}

从终端运行此命令,所有kbd事件都应该点击它.我在Xorg下测试它,但它使用了古老,稳定的Xlib机制.

希望这可以帮助.

小心翼翼地抓住X.当你刚接触它们时,有时候开始一个时间延迟的过程是个好主意,当你测试代码并让它静坐和运行时,每隔几分钟就会打开它.它节省了必须杀死或切换远离服务器到外部重置状态.

从这里开始,我将留给您决定如何复用渲染.阅读XGrabKeyboard文档和XEvent文档以开始使用.如果您在屏幕角落露出小窗口,则可能会将指针卡在一个角落以选择控制器.XWarpPointer也可以将指针从代码推送到其中一个指针.

还有一点:你也可以抓住指针和其他资源.如果您在前面的盒子上运行了一个控制器,则可以使用键盘和鼠标输入在具有不同渲染器的打开套接字之间切换.您不应该再使用这种方法将输出窗口的大小调整为小于全屏幕.通过更多工作,您可以使用SHAPE和COMPOSITE扩展将alpha混合叠加层放在顶部,以获得响应用户输入的漂亮叠加功能(这可能算作镀金百合).

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有