版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

代码块
languagec
#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系统的鼠标滚轮增强工具,它可以重新映射滚轮事件,以提供更好的滚动控制和自定义功能,如缩放、翻页等。事件传递流程如下图所示。

...