저는 아치 리눅스와 기본 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
대답은 다음에서 비롯됩니다.이 질문의 스택 오버플로 버전:
클라이언트 창에 입력이 있는지 확인해야 합니다. 클릭한 항목(프레임, 제목 표시줄 또는 클라이언트)에 대한 입력을 설정했습니다. 일반 입력에 관한 한 제대로 작동하기 때문입니다. 그러나 상황에 맞는 메뉴는 입력이 클라이언트 창에 직접 설정되어 있는지 확인한 경우에만 작동합니다.