gpt4 book ai didi

c - 使用 XLookupString 处理 C-q

转载 作者:行者123 更新时间:2023-11-30 16:48:05 27 4
gpt4 key购买 nike

这是处理 Ctrl-q 事件以退出应用程序的 X11 代码的工作示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

void exitOnCondition(char cond, const char *msg, int exitCode, Display *dpy, Window *w, GC *gc) {
if(cond) {
printf("%s\n", msg);
if(dpy && gc) XFreeGC(dpy, *gc);
if(dpy && w) XDestroyWindow(dpy, *w);
if(dpy) XCloseDisplay(dpy);
exit(exitCode);
}
}

int main(int argc, char **argv) {
Display *dpy = XOpenDisplay(0);
exitOnCondition(dpy == 0, "Error: XOpenDisplay failed", -1, dpy, 0, 0);

int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));

Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0,
200, 100, 0, blackColor, blackColor);

//Tell X Server to send MapNotify events
XSelectInput(dpy, w, StructureNotifyMask | KeyPressMask);

//Make window appear
XMapWindow(dpy, w);

//Graphics Context
GC gc = XCreateGC(dpy, w, 0, 0);

//Set white color for drawing
XSetForeground(dpy, gc, whiteColor);

//Wait for the MapNotify event
for(;;) {
XEvent e;
XNextEvent(dpy, &e);
if (e.type == MapNotify) {
break;
}
}

//Draw the line
XDrawLine(dpy, w, gc, 10, 60, 180, 20);

//Send the "DrawLine" request to the server
XFlush(dpy);

char text[255];
XEvent e;
KeySym key;
int numKeys = 0;
for(;;) {
XNextEvent(dpy, &e);
if(e.type == KeyPress) {
//With modifier XLookupString will return garbage(?) in text[0] and key as latin1
if((numKeys = XLookupString(&e.xkey, text, 255, &key, 0))) {
printf("lookup returned:\n");
for(int i = 0; i < numKeys; i++) {
printf("text[%d]=%x\n", i, text[i]);
}

if(e.xkey.state == ControlMask && key == XK_q) {
exitOnCondition(1, "C-Q pressed", 0, dpy, &w, &gc);
}
}
}
}

XFreeGC(dpy, gc);
XDestroyWindow(dpy,w);
XCloseDisplay(dpy);
}

此代码能否在任何系统上正确处理 Ctrl-q 事件?

我可以使用 e.xkey.state 在任何键盘布局的 XLookupString 之后检查 Ctrl 修饰符,即使 Ctrl 反弹到大写锁定(或其他任何位置)时也是如此?

为什么 XLookupString 对于 Ctrl-q 事件返回一个符号 text[0]==0x11 而不是 text[0]==CtrlModifierCode text[1]=='q'?

最佳答案

XLookupString 返回 ISO-8859-1 字符序列(至少根据我的手册;我不知道它是最新的)。 ISO-8859-1 中没有“ctrl”键本身的字符代码。严格来说,也没有 ctrl-q 组合,但是tradition dictates ctrl + (A...Z) 映射到 1...26 范围。

关于c - 使用 XLookupString 处理 C-q,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43113891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com