只要我理解它,每当窗口进入焦点时就会触发x11 focusin事件。它是键盘输入被发送到的窗口。触发此事件时遇到问题。我已经确保在创建窗口时为它提供FocusChangeMask。我已经在我的事件处理程序中创建了一个断点,在这里focusin事件应该发生并且不会停止。
我有两个独立的窗口,一个透明的,一个不透明的。目前我有它,所以透明窗口总是在非透明窗口的顶部。每当我切换焦点然后切换回透明窗口时,非透明窗口就在正下方。这会导致其他窗口卡在透明和非透明窗口之间。
我注意到每当我聚焦于下面触发focusin事件的不透明窗口时。我不能让透明窗口触发事件。这和窗户是32位颜色有关系吗?
我错过了什么?

while(!renderer->stop)
    {
        XNextEvent(renderer->x_display, &event);
        switch(event.type)
        {
            case Expose:
            if (event.xexpose.window == gstreamer_window)
            {
                XRaiseWindow(renderer->x_display, renderer->opengl_window);
            }
            break;

            case FocusIn:
            if (event.xfocus.window == renderer->opengl_window)
            {
                XRaiseWindow(renderer->x_display, gstreamer_window);
            }
            break;

            case ConfigureNotify:
            if (event.xconfigure.window == renderer->opengl_window)
            {
                XMoveWindow(renderer->x_display, gstreamer_window,
                            event.xconfigure.x, event.xconfigure.y - top_border_offset);
            }
            break;
        }
    }

这是我创建窗口的方式。
XSetWindowAttributes  swa;
    swa.event_mask = ExposureMask | PointerMotionMask | KeyPressMask | FocusChangeMask;
    swa.colormap = XCreateColormap(x_display, XDefaultRootWindow(x_display), visual, AllocNone);
    swa.background_pixel = 0;
    swa.border_pixel = 0;

    /* Create a window */
    opengl_window = XCreateWindow (
              x_display, parent,
              0, 0, m_plane_width, m_plane_height, 0,
              depth, InputOutput,
              visual, CWEventMask | CWBackPixel | CWColormap | CWBorderPixel,
              &swa );

最佳答案

好像我把调焦面罩放错地方了。通过添加行XSelectInput(x_display, opengl_window, FocusChangeMask)
,它现在触发focusin事件。它触发了另一个显示,因为它有面具,但这个没有。

关于linux - X11 FocusIn无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32319257/

10-11 16:43