...
代码块 | ||
---|---|---|
| ||
#include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window window; XEvent event; int screen; // 打开与X服务器的连接 display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Cannot open display\n"); exit(1); } screen = DefaultScreen(display); // 创建一个窗口 window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 640, 480, 1, BlackPixel(display, screen), WhitePixel(display, screen)); // 选择感兴趣的事件类型 XSelectInput(display, window, ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask); // 显示窗口 XMapWindow(display, window); // 事件循环 while (1) { XNextEvent(display, &event); // 处理暴露事件(窗口需要重新绘制) if (event.type == Expose) { XFillRectangle(display, window, DefaultGC(display, screen), 20, 20, 10, 10); } // 处理键盘按键按下事件 else if (event.type == KeyPress) { printf("Key pressed: %x\n", event.xkey.keycode); } // 处理键盘按键抬起事件 else if (event.type == KeyRelease) { printf("Key released: %x\n", event.xkey.keycode); } // 处理鼠标按键按下事件 else if (event.type == ButtonPress) { printf("Mouse button pressed: %x at (%d, %d)\n", event.xbutton.button, event.xbutton.x, event.xbutton.y); } // 处理鼠标按键抬起事件 else if (event.type == ButtonRelease) { printf("Mouse button released: %x at (%d, %d)\n", event.xbutton.button, event.xbutton.x, event.xbutton.y); } } // 关闭与X服务器的连接 XCloseDisplay(display); return 0; } |
...
综上两点进一步确认了,不是weston的问题,其他x11client端确实都有收到Ctrl按键up事件,怀疑Xorg server端的问题。
5、排查Xorg端:初步使用gdb调试,发现麒麟桌面的Xorg没有开启debug。下一步只能自行编译xserver项目源码,编译调试版本并安装。具体编译安装步骤已在另外一篇文档单独记录,地址:5、排查Xorg端:初步使用gdb调试,发现麒麟桌面的Xorg没有开启debug。下一步只能自行编译xserver项目源码,编译调试版本并安装。具体编译安装步骤已在另外一篇文档单独记录,请移步查阅。地址:h. xserver debug版本编译过程说明
经过编译安装后,注销重新登录。开始对Xorg进行gdb调试分析。
...
这里找到了Ctrl按键up伪事件的来源为imwheel程序。imwheel进程使用XTEST扩展Xorg发送模拟事件。包名为imwheel,程序路径/usr/bin/imwheel。将imwheel进程kill掉测试验证结果:按住Ctrl按键滚动鼠标滚轮x11窗口不再重复收到Ctrl按键抬起事件。测试weston应用方式启动的OpenFDE鼠标滚轮模拟双指触摸缩放功能恢复正常。
6、imwheel分析研究
关于imwheel的源码编译安装,已记录在另外一篇文档。请移步查阅,地址:i. imwheel debug版本编译安装说明
imwheel:是在Linux中支持鼠标非标准按钮的一个程序,用于Linux系统的鼠标滚轮增强工具,它可以重新映射滚轮事件,以提供更好的滚动控制和自定义功能,如缩放、翻页等。事件传递流程如下图所示。
...