상황에 맞는 메뉴가 항상 작동하지 않나요?

상황에 맞는 메뉴가 항상 작동하지 않나요?

저는 아치 리눅스와 기본 cpp 사용자 정의 창 관리자를 사용하고 있습니다. 그런데 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴를 열 때마다 깜박이다가 사라집니다. 전혀 사용할 수 없습니다. 또한 어떤 앱에서도 상단 드롭다운 메뉴(파일, 편집, 정보 등)를 사용할 수 없습니다. 상황에 맞는 메뉴를 올바르게 사용할 수 있도록 Xlib에 주의해야 할 사항이 있습니까?

이것은 제가 사용해본 모든 앱의 경우입니다. 유일한 단서는 Brave가 때때로 다음 메시지를 표시한다는 것입니다.

XGetWindowAttributes failed for window [WINDOW_ID]

오류를 검색하면 일부 크롬 관련 결과가 표시되지만 일반적으로 Linux에서는 아무 것도 표시되지 않습니다. 이 문제를 해결하거나 디버깅하는 방법에 대한 단서를 제공해 주시면 감사하겠습니다!

다음의 간단한 예에서는 이 문제를 보여줍니다.

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 ConfigureRequest:
            OnConfigureRequest(event.xconfigurerequest);
            break;
        case ButtonPress:
            XRaiseWindow(display, event.xbutton.window);
            break;
        }
    }
 
    return true;
}
 
void OnConfigureRequest(const XConfigureRequestEvent& event)
{
    XWindowChanges changes;
    changes.x = event.x;
    changes.y = event.y;
    changes.width = event.width;
    changes.height = event.height;
    changes.border_width = event.border_width;
    changes.sibling = event.above;
    changes.stack_mode = event.detail;
 
    if(frame_list.count(event.window))
    {
        const Window frame = event.window;
        XConfigureWindow(display, frame, event.value_mask, &changes);
    }
 
    //Grant request
    XConfigureWindow(display, event.window, event.value_mask, &changes);
}
 
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;
}

제가 보기에 창 관리자에 문제가 있다고 생각하는 이유는 이 문제가 창 관리자를 실행한 후에만 발생하기 때문입니다.

답변1

대답은 다음에서 비롯됩니다.이 질문의 스택 오버플로 버전:

클라이언트 창에 입력이 있는지 확인해야 합니다. 클릭한 항목(프레임, 제목 표시줄 또는 클라이언트)에 대한 입력을 설정했습니다. 일반 입력에 관한 한 제대로 작동하기 때문입니다. 그러나 상황에 맞는 메뉴는 입력이 클라이언트 창에 직접 설정되어 있는지 확인한 경우에만 작동합니다.

관련 정보