繁体   English   中英

上下文菜单不能始终在 arch linux 上工作?

[英]Context menu does not consistently work on arch linux?

我正在使用 arch linux 和一个基本的 cpp xlib 自定义 window 管理器。 但是,每次我右键单击打开上下文菜单时,它都会闪烁并消失。 我根本无法使用它。 我也不能在任何应用程序上使用顶部下拉菜单(文件、编辑、关于等)。 Xlib 中有什么我必须注意的,以确保我可以正常使用上下文菜单吗?

我尝试过的每个应用程序都是这种情况。 我唯一的线索是勇敢它偶尔会显示以下消息:

XGetWindowAttributes failed for window [WINDOW_ID]

以下简化示例也存在此问题:

int main()
{
    display = XOpenDisplay(nullptr);
    root = DefaultRootWindow(display);
    XSelectInput(display, root, SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask);
 
    XGrabServer(display);
    Window returned_root;
    Window returned_parent;
    Window* top_level_windows;
    unsigned int num_top_level_windows;
    XQueryTree(display, root, &returned_root, &returned_parent, &top_level_windows, &num_top_level_windows);
 
    for(unsigned int i = 0; i < num_top_level_windows; ++i)
    {
        Frame(top_level_windows[i], true);
    }
 
    XFree(top_level_windows);
    XUngrabServer(display);
 
    for(;;)
    {
        XEvent event;
        XNextEvent(display, &event);
 
        switch (event.type)
        {
        case MapRequest:
        {
            Frame(event.xmaprequest.window, false);
            XMapWindow(display, event.xmaprequest.window);
            break;
        }
        case ButtonPress:
            XRaiseWindow(display, event.xbutton.window);
            break;
        }
    }
 
    return true;
}

void Frame(Window window, bool created_before_manager)
{
    //Retrieve attributes of window to frame
    XWindowAttributes attr = {0};
    XGetWindowAttributes(display, window, &attr);
 
    //If window was created before window manager started, we should frame it only if it is visible and does not set override_redirect
    if(created_before_manager && (attr.override_redirect || attr.map_state != IsViewable))
    {
        return;
    }
 
    //Create frame
    Window frame = XCreateSimpleWindow(display, root, attr.x, attr.y, attr.width, attr.height, 5, 0xff0000, 0xffffff);
    XReparentWindow(display, window, frame, 0, 0);
    XMapWindow(display, frame);
 
    XGrabButton(display, Button1Mask, Mod1Mask, window, None, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
}

需要说明的是,它也适用于一个超级简单的示例,例如:

int main()
{
    Display* display = XOpenDisplay(nullptr);
    for(;;) {}
    return true;
}

我认为 window 管理器有问题的原因是因为此问题仅在我运行 window 管理器后出现。

我希望这能开箱即用。 我还没有找到任何关于需要特殊处理的上下文菜单的信息。 他们确实将 override_redirect 标志设置为 true,因此我不会将它们框起来。 我找不到任何其他需要特殊处理的信息。

需要确保客户端window有输入。 我将输入设置为单击的任何内容(框架、标题栏或客户端),因为就正常输入而言它工作正常。 但是,上下文菜单只有在您确保将输入直接设置为客户端 window 时才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM