我找到了 UTF-8 输入的 example (已接受的答案),但我想知道该示例是否正确。
XGetICValues
的结果可以传递给XSelectInput
:
unsigned long mask = 0;
if (!XGetICValues(ic, XNFilterEvents, &mask, NULL))
{
XSelectInput(dpy, win, other_masks | mask);
}
您能解释一下上述代码的含义吗?是否必须获得正确的 UTF-8 输入?执行上面的代码后我还应该调用
XFilterEvent
吗?
执行上述代码后是否还应该调用 XFilterEvent ?
我怀疑你应该:为了正确的 UTF-8 输入处理,它不仅涉及获取事件掩码和选择输入事件,而且还可能过滤这些事件以正确处理多字节或特殊输入序列。
XFilterEvent
应在事件循环中使用。它将有助于管理输入法以正确解释多字节或特殊按键序列。XNextEvent()
之后调用的。
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>
#include <X11/Xlocale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv)
{
// Your initialization code
while(1) {
XNextEvent(dpy, &ev);
if (XFilterEvent(&ev, win)) // Filter the event through the input method
continue;
switch(ev.type){
case MappingNotify:
XRefreshKeyboardMapping(&ev.xmapping);
break;
case KeyPress:
{
int count = 0;
KeySym keysym = 0;
char buf[20];
Status status = 0;
count = Xutf8LookupString(ic, (XKeyPressedEvent*)&ev, buf, 20, &keysym, &status);
printf("count: %d\n", count);
if (status == XBufferOverflow)
printf("BufferOverflow\n");
if (count)
printf("buffer: %.*s\n", count, buf);
if (status == XLookupKeySym || status == XLookupBoth) {
printf("status: %d\n", status);
}
printf("pressed KEY: %d\n", (int)keysym);
}
break;
case KeyRelease:
// Rest of your code for other cases
}
fflush(stdout);
}
}
如果
XFilterEvent
返回 True
,表明该事件已被输入法过滤并处理,则执行 continue
语句以跳过剩余的循环并处理下一个事件。
+--------------------+ XNFilterEvents +--------------+
| Input Context (IC) |------------------------->| Event Mask |
+--------------------+ +--------------+
| |
XGetICValues Retrieved Mask
| |
V V
+--------------------+ other_masks | mask +--------------+
| XSelectInput |------------------------->| Event Input |
+--------------------+ +--------------+
| |
| +--------------+
| | X Event |
| +--------------+
| |
V V
+--------------------+ XFilterEvent +--------------+
| Event Loop |------------------------->| Event Filter |
+--------------------+ (optional) +--------------+
XSelectInput
需要该事件掩码来了解要侦听哪些事件。XSelectInput
与其他掩码和检索到的掩码的组合一起调用,以指定应为指定窗口报告的事件。XFilterEvent
来过滤事件队列中的相关输入事件,在处理多字节或特殊输入序列时特别有用。此步骤被标记为可选,因为它基于处理特殊输入序列的要求。