如何毫不费力地从 xcb 获取 unicode 输入
How to get unicode input from xcb without further ado
在跨平台游戏的 GameDev 期间,出现了如何在游戏聊天中支持完整 Unicode 输入的问题。在 Windows 上使用 WinAPI 并在 Linux 上使用 xcb 进行常规键输入,分别有 WM_KEY_* 消息和 xcb_key_* 事件。如果您想收到有关键盘上按下的键的通知,这很好。
现在这不会为您提供全文输入。例如,在 Windows 上有一个名为 WM_CHAR 的附加消息,明确用于文本输入。键码被翻译成 Unicode 代码点,包括像 shift 这样的 ModifierKeys 的处理。甚至可以输入中文。
现在xcb呢?根据该主题我能找到的所有内容现在至少已经过时四年了。有没有取得一些进展?现在至少可以将死字符转换为 KeySyms(就像 XFilterEvent 那样)吗?我不需要完整的 Unicode 输入,例如按住 alt 键并在小键盘上键入数字来获取相应的信息。屏幕上的代码点。此外,我不想 link 像 GTK 这样的大型库只是为了将键盘输入转换为 Unicode。
我知道这是一个重复的问题,但都已过时,所以我再次询问 xcb 中文本输入的当前状态。
谢谢!
不确定是否有帮助,但是...
您可能正在寻找一系列 X*LookupString 函数:
http://www.xfree86.org/current/Xutf8LookupString.3.html
现在,我遇到了与您相同的问题,即我需要将使用 WinAPI WM_CHAR
的应用程序移植到使用 xcb
和 X11
的应用程序(因此耦合对于 OpenGL window 是必需的)。我并不完全需要 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
- 你的 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
参数输出对应于组合字符的键符号。正如您所说,您还需要 keysyms,您可能想使用它。
我不是在做专业的应用程序,所以这就是我所需要的,而且我不太确定完整的 Unicode 支持的行动过程是什么,但如果我得到它,我会让你知道的。
在跨平台游戏的 GameDev 期间,出现了如何在游戏聊天中支持完整 Unicode 输入的问题。在 Windows 上使用 WinAPI 并在 Linux 上使用 xcb 进行常规键输入,分别有 WM_KEY_* 消息和 xcb_key_* 事件。如果您想收到有关键盘上按下的键的通知,这很好。
现在这不会为您提供全文输入。例如,在 Windows 上有一个名为 WM_CHAR 的附加消息,明确用于文本输入。键码被翻译成 Unicode 代码点,包括像 shift 这样的 ModifierKeys 的处理。甚至可以输入中文。
现在xcb呢?根据该主题我能找到的所有内容现在至少已经过时四年了。有没有取得一些进展?现在至少可以将死字符转换为 KeySyms(就像 XFilterEvent 那样)吗?我不需要完整的 Unicode 输入,例如按住 alt 键并在小键盘上键入数字来获取相应的信息。屏幕上的代码点。此外,我不想 link 像 GTK 这样的大型库只是为了将键盘输入转换为 Unicode。
我知道这是一个重复的问题,但都已过时,所以我再次询问 xcb 中文本输入的当前状态。
谢谢!
不确定是否有帮助,但是...
您可能正在寻找一系列 X*LookupString 函数:
http://www.xfree86.org/current/Xutf8LookupString.3.html
现在,我遇到了与您相同的问题,即我需要将使用 WinAPI WM_CHAR
的应用程序移植到使用 xcb
和 X11
的应用程序(因此耦合对于 OpenGL window 是必需的)。我并不完全需要 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
- 你的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
参数输出对应于组合字符的键符号。正如您所说,您还需要 keysyms,您可能想使用它。
我不是在做专业的应用程序,所以这就是我所需要的,而且我不太确定完整的 Unicode 支持的行动过程是什么,但如果我得到它,我会让你知道的。