- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在跨平台游戏的 GameDev 期间,出现了如何在游戏聊天中支持完整 Unicode 输入的问题。在 Windows 上使用 WinAPI 并在 Linux 上使用 xcb 进行常规键输入,分别有 WM_KEY_* 消息和 xcb_key_* 事件。如果您想收到有关键盘上按下的键的通知,这很好。
现在这不会为您提供全文输入。例如,在 Windows 上,有一个名为 WM_CHAR 的附加消息明确用于文本输入。键码被翻译成 Unicode 代码点,包括像 shift 这样的 ModifierKeys 的处理。甚至可以输入中文。
现在 xcb 呢?根据该主题我能找到的所有内容现在至少已经过时四年了。有没有取得一些进展?现在至少可以将死字符转换为 KeySyms(就像 XFilterEvent 那样)吗?我不需要完整的 Unicode 输入,例如按住 alt 键并在小键盘上键入数字来获取相应的信息。屏幕上的代码点。此外,我不想链接像 GTK 这样的大型库,只是为了将键盘输入转换为 Unicode。
我知道这是一个重复的问题,但都已过时,所以我再次询问 xcb 中文本输入的当前状态。
谢谢!
最佳答案
不确定是否有任何帮助,但是...
您可能正在寻找一系列 X*LookupString 函数:
http://www.xfree86.org/current/Xutf8LookupString.3.html
现在,我遇到了与您相同的问题,即我需要将使用 WinAPI 的 WM_CHAR
的应用程序移植到使用 xcb
和 X11 的应用程序
(因为这样的耦合对于 OpenGL 窗口是必需的)。我并不完全需要 Unicode,但我仍然迷路了,因为没有什么可以让我从击键中获得组合输入(例如,按 shift
和 7
应该导致 &
)
不幸的是,引用 xcb 的 to-do list :
Current status
Currently, XCB only implements the bits given in the X Window System Protocol, and even this support is not complete compared to Xlib (character encoding, no XLookupString()...).
因此,如果您必须使用 xcb
,这会使事情变得更加困难,因为 xcb 返回的按键事件没有等效的 X*LookupString
函数- xcb_key_press_event_t
。您需要做的是将其转换为可理解的XKeyEvent
,例如XLookupString
。
现在,查看 source of XLookupString
,我们可以看到它只使用了 XKeyEvent
的三个字段:
display
- 您的显示
keycode
- 按下的键state
- 修改键的状态,例如shift 或 caps lock 恰好 xcb_key_press_event_t
中有相应的字段,与我们需要的字段几乎相同。我为使我的特定应用程序正常工作所做的是:
// This is your generic event returned by, for example, xcb_poll_for_event
const xcb_generic_event_t* event = ...;
const auto* const press = reinterpret_cast<const xcb_key_press_event_t*>(event);
// Now we have to prepare input understandable by the lookup function
XKeyEvent keyev;
keyev.display = display; // here you'll need to supply your Display*
keyev.keycode = press->detail;
keyev.state = press->state;
std::array<char, 16> buf {};
if (XLookupString(&keyev, buf.data(), buf.size(), nullptr, nullptr)) {
// Now buf should contain a string with your characters;
// I just need ascii so I always take only buf[0] and it works fine
}
else {
// Something's wrong... report error or something
}
它看起来也像 XLookupString
通过其 in-out KeySym *keysym_return
参数输出对应于组合字符的 keysym。正如您所说,您还需要 keysyms,您可能想使用它。
我不是在做专业的应用程序,所以这就是我所需要的,我不太确定完整的 Unicode 支持的行动过程是什么,但如果我得到它,我会告诉你的.
关于linux - 如何毫不费力地从 xcb 获取 unicode 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004441/
在 Xlib 中,XWindowAttributes 结构包含一个指向窗口所在屏幕的指针。但是在XCB对应的结构体(xcb_get_window_attributes_reply_t)中,并没有这样的
官方 XCB 文档告诉我们 using OpenGL purely with XCB is impossible : 还必须使用 Xlib。 This post作者 Bart Massey(XCB 的
我正在尝试使用 Qt 和 opencv 运行创建 UI 的脚本。 但是,这是我得到的一个奇怪的错误 python3 dashboard.py QObject::moveToThread: Curren
我想用xcb来说明窗口的伪透明(在窗口背景上复制部分根窗口像素图) 为此,我使用: 根像素图用feh设置然后我启动我的程序(只是代码的一部分): ->初始化连接: xcb_connect() ->创建
我正在使用 rust-xcb 编写应用程序。但是,当我尝试将文件加载到像素图中时,我找不到任何方法来完成它。我还使用 image 库来加载图像文件 (jpg)。 但是我对xcb不熟悉,请问xcb有没有
我已经用 XCB 作为后端(当然是 GLX 的 xlib)编写了一些基本的 OpenGL 应用程序,并且在我编写的每个测试中,当我将鼠标移到窗口上时,它会导致所有输入都得到某种“缓冲”并且仅在一段时间
我一直在尝试弄清楚如何忽略 xcb 事件循环中的重复键,到目前为止我得到了这个: extern xcb_connection_t *connection; // looks like there's
XCB协议(protocol)拦截按键输入的代码是什么? 我在 XCB 文档中找不到任何用于该目的的内容(或者我看不到正确的文档/代码)。我使用 Python,但 C 示例可能有助于理解代码。谢谢。
使用 XCB,我需要将窗口的鼠标指针更改为标准的手形光标(无论这在 Linux 中意味着什么,我都需要一个独立于工具包的解决方案)。 注意:加载“光标”字体并将窗口属性 XCB_CW_CURSOR 更
我有一个用 C 编写的小示例程序,它使用 XCB API 打开一个窗口。 严格来说,之后我已经创建了并且显示了窗口,我想(稍后)隐藏窗口。 (显然,在这个特定示例中,我可以删除对 xcb_map_wi
我正在尝试研究如何在使用 xcb 进行输入时忽略重复的键。 我需要这样的成就: uint32_t mask = XCB_KB_AUTO_REPEAT_MODE; uint32_t values[] =
我正在尝试接收有关任何指针移动的通知。因为我不想作为窗口管理器运行,所以我需要设置 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTE
我正在尝试制作一个非常简单的窗口管理器以供学习之用。我正在使用 C 和 xcb 库。我正在尝试在启动新应用程序时引发事件。 现在,我创建了一个根窗口,我可以在其中接收鼠标和键盘事件。我还在窗口的顶部画
我试图通过一个使用 xcb 库的 C 程序获取已启动 X 应用程序的主窗口列表。根据这个问题,这些窗口似乎是“顶级窗口”:X11: list top level windows 所以我的程序要求 Op
我正在编写一个用于在 xcb 中创建窗口的简约库。 我希望能够创建一个不可调整大小的窗口。我发现,可以通过以下方式向窗口管理器提供提示: xcb_void_cookie_t xcb_change_pr
我正在为 Linux 创建一个屏幕键盘,集成在一个简单的窗口管理器中。我目前正在使用 XCB,现在我想制作假击键。使用 xtest 扩展一切工作正常,除了我无法从我想要放置的键符中获取真正的键码的细节
我使用 Qt 设计器创建了一个应用程序。当我启动我的应用程序时,它抛出此错误: This application failed to start because it could not find o
我正在使用 XCB 编写一个程序,需要检测窗口何时获得或失去焦点。到目前为止,我已经有了这个,但它只是卡在 xcb_wait_for_event 调用上,从未进入循环。我在这里缺少什么来获取根事件?或
有没有人知道如何让我的主线程事件循环看起来像这样: const int MY_CUST_MSG(877); xcb_generic_event_t *event; while (event =
我正在尝试做与 this question 中相同的事情. 到目前为止,我从official documentation了解到xcb_change_property函数。 . 但是下面的代码仍然没有给
我是一名优秀的程序员,十分优秀!