【问题标题】:Linux/X11 input library without creating a windowLinux/X11 输入库,无需创建窗口
【发布时间】:2008-09-08 17:09:40
【问题描述】:

是否有一个好的库可用于在 Linux 中从鼠标/键盘/操纵杆收集用户输入,而不会强制您创建可见窗口来执行此操作? SDL 可以让您以合理的方式获取用户输入,但似乎强制您创建一个窗口,如果您有抽象控制,这很麻烦,因此控制机器不必与渲染机器相同。但是,如果控制和渲染机器是相同的,这会导致在您的显示器顶部出现一个丑陋的小 SDL 窗口。

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

【问题讨论】:

  • 我删除了导致上述澄清的“答案”......我认为澄清需要保留,但它涵盖的内容足以让我的伪答案(可能是评论)可以完全删除。

标签: linux user-input sdl


【解决方案1】:

好的,如果您在 X11 下并且想要获取 kbd,则需要进行抓取。 如果你不是,我唯一的好答案是来自终端的 ncurses。

以下是您从键盘上抓取所有内容并再次释放的方法:

/* 演示代码,需要更多的错误检查,编译 * 使用“gcc nameofthisfile.c -lX11”。 /* 奇怪的降价格式如下。啊! */

#include <X11/Xlib.h>

int main(int argc, char **argv) { 显示 *dpy; XEvent EV; 字符 *s; 无符号整数 kc; 诠释退出= 0; if (NULL==(dpy=XOpenDisplay(NULL))) { 错误(argv[0]); 退出(1); } /* * 您可能希望将指针扭曲到您知道的某个地方 * 与任何会耗尽事件的东西无关。 * (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y); */ XGrabKeyboard(dpy, DefaultRootWindow(dpy), 真,GrabModeAsync,GrabModeAsync,当前时间); printf("键盘被抓!按 'q' 退出!\n" "如果这个工作被杀死或者你卡住了,使用 Ctrl-Alt-F1\n" “切换到控制台(如果可能)并运行\n” "松开键盘。\n"); /* 一个非常简单的事件循环:从“man XEvent”开始了解更多信息。 */ /* 另请参阅“apropos XGrab”,了解锁定访问权限的各种方法 *某些类型的信息。出入服务器 */ 对于 (;!quit;) { XNextEvent(dpy, &ev); 开关(ev.type){ 案例按键: kc = ((XKeyPressedEvent*)&ev)->keycode; s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0)); /* s 为 NULL 或静态无接触返回字符串。 */ if (s) printf("KEY:%s\n", s); if (!strcmp(s, "q")) quit=~0; 休息; 案例曝光: /* 通常,最好将剩余的暴露暴露在 * 避免访问 Blinky's Fun Club。 */ while (XCheckTypedEvent(dpy, Expose, &ev)) /* 空体 */ ; 休息; 案例按钮按下: 案例按钮释放: 案例密钥发布: 案例 MotionNotify: 案例配置通知: 默认: 休息; } } XUngrabKeyboard(dpy, CurrentTime); 如果(XCloseDisplay(dpy)){ 错误(argv[0]); 退出(1); } 返回0; }

从终端运行它,所有 kbd 事件都应该命中它。我在 Xorg 下测试 但它使用古老而稳定的 Xlib 机制。

希望这会有所帮助。

小心 X 下的抓取。当您不熟悉它们时,有时这很好 开始一个时间延迟过程的想法,当你在 测试代码,让它坐下来运行,每隔几分钟就取消抓取。 它省去了杀死服务器或从服务器切换到外部重置状态的麻烦。

从这里开始,我将由您来决定如何复用渲染。读 XGrabKeyboard 文档和 XEvent 文档开始。 如果您在屏幕角落暴露了小窗口,则可能会卡住 将指针移到一个角落以选择控制器。 XWarpPointer 可以 将指针也从代码中推到其中之一。

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

【讨论】:

  • 这个答案 + Brian 的 GPM 答案回答了我的问题,但我只能选择 1 个答案。
  • 请注意,GPM 可能无法在同一个终端上与 X active 进行舒适的交互...仔细阅读手册页“BUGS”部分的末尾。即使它看起来可行,我也会去 X 服务器参加这两种活动。
【解决方案2】:

鼠标可以使用GPM

我不确定键盘或操纵杆的想法。

如果需要,直接从那里读取/dev 文件可能不会太糟糕。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2016-11-19
    • 2021-02-03
    相关资源
    最近更新 更多