如何直接从xcb获取Unicode输入

3
在开发跨平台游戏时,如何在游戏内聊天中支持完整的Unicode输入是一个问题。在Windows上使用WinAPI,在Linux上使用xcb进行一般按键输入时,分别有WM_KEY_*消息和xcb_key_*事件。如果您想要被通知键盘上的按下的按键,这很好。
现在这并不能给你完整的文本输入。例如,在Windows上,还有一个名为WM_CHAR的额外消息专门用于文本输入。键码被转换为Unicode代码点,包括处理修饰键(如shift)。甚至可以输入中文。
那么xcb怎么办呢?根据该主题,我所能找到的所有内容都已过时至少四年了。是否已经取得了一些进展?现在是否可以获得至少从死字符到KeySyms(如XFilterEvent)的翻译?我不需要完整的Unicode输入,例如按住alt键并在数字键盘上键入数字以在屏幕上获取相应的代码点。我也不想链接像GTK这样的大型库,只是为了将键盘输入转换为Unicode。
我知道这是一个重复的问题,但所有问题都已过时,因此我再次询问xcb文本输入的当前状态。
谢谢!

你找到解决办法了吗? - Pythagoras of Samos
不,还没有。如果您得到了答案,请在此处发布。 - Lars M.
1个回答

3

我不确定这是否有帮助,但是...

您可能正在寻找一组X * LookupString函数:

http://www.xfree86.org/current/Xutf8LookupString.3.html

现在,我有和你一样的问题,需要将使用WinAPI的WM_CHAR的应用程序移植到使用xcbX11耦合(因为这种耦合对于OpenGL窗口是必要的)。虽然我并不需要Unicode,但我还是迷惑了,因为没有什么可以让我从按键中获得组合输入(例如,按下shift7应该产生&)。
不幸的是,引用xcb的待办事项清单

当前状态

目前,XCB只实现了X Window系统协议中提供的位,而且即使与Xlib相比,这种支持也不完整(字符编码,无XLookupString()...)。

因此,如果您必须使用xcb,那么事情就会变得更加困难,因为没有与xcb_key_press_event_t返回的按键事件等效的X*LookupString函数。你需要做的是将它转换为XKeyEvent,例如XLookupString可以理解的格式。

现在,查看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 还会通过其输入输出参数 KeySym *keysym_return 输出与组合字符对应的键符。由于您也需要键符,所以您可能想使用它。

我没有在做专业应用,所以这就是我需要的全部,而且我不太确定如何完全支持 Unicode,但如果我完成了,我会告诉您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接