X11 이벤트 루프를 정상적으로 종료하려면 어떻게 해야 합니까?
찾은 거의 모든 튜토리얼에서 이벤트 루프에 대해 이 작업을 수행하도록 지시합니다.
XEvent event;
while (true)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
default:
break;
}
}
그러나 X를 클릭하여 프로그램을 닫으면 이 메시지가 표시됩니다.
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 10 requests (10 known processed) with 0 events remaining.
예들이 무한 루프를 사용하는 것을 제안하는 것은 정말 이상합니다.이는 자연스럽게 들리지 않으며, 다른 X11 프로그램은 그렇게 하지 않습니다.그래서 검색해봤습니다.나는 윈도우 클로즈 이벤트를 캡처하는 방법을 알아냈습니다.
Atom wmDeleteMessage = XInternAtom(mDisplay, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
XEvent event;
bool running = true;
while (running)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteMessage)
running = false;
break;
default:
break;
}
}
효과가 있습니다.오류 없이 종료됩니다.하지만 저는 이것이 일을 하는 정상적인 방법이라는 것을 믿기를 거부합니다.제 말은, 이것이 X11 앱을 제대로 종료하는 유일한 방법인가요?아슬아슬한 이벤트를 포착하는 것만으로도 많은 일이 있는 것 같습니다.'적절한' 이벤트 루프를 만들려면 어떻게 해야 합니까?아슬아슬한 사건이 왜 이렇게 깊이 묻혔을까요?제가 무엇을 빠뜨리고 있나요?
문제는 X Server와 Window Manager 간의 통신에 있습니다.
전화할 때XCreateWindow
또는XCreateSimpleWindow
X Server가 창을 만듭니다(화면에 명시적으로 매핑할 때까지 표시되지 않음).XMapWindow
그러면 창 관리자가 창 주위에 모든 장식과 단추 및 시스템 메뉴를 부착합니다.
전화할 수 있습니다.XDestroyWindow
창을 제거하기 위해 사용자가 직접 창을 제거하면 일반적으로 창이 화면에서 사라지지만 프로그램이 계속 실행 중이고 X Server에 대한 연결이 열려 있으므로 요청을 더 보낼 수 있습니다.
문제는 사용자가 창 관리자가 창에 부착한 작은 단추를 클릭할 때 시작됩니다. 창 관리자가 창 관리자를 사용하여 만든 것이 아니며 사용자가 무엇을 해야 할지 결정할 일이 아니기 때문입니다.이제 이 모든 것은 Window Manager의 손에 있습니다.
창 관리자가 단순히 다음을 호출한 경우XDestroyWindow
창이 파괴되기 전에 프로그램이 종료 이벤트를 캡처하여 무언가를 수행하려는 경우 창에서 문제가 발생합니다.따라서 이 프로세스를 처리하기 위해 X Server와 Window Manager 간에 협약이 설정되었습니다.
대부분의 창 관리자의 기본 동작은 창을 삭제하고 X 서버와의 연결을 닫는 것입니다. 대부분의 창 관리자 사용자는 창을 닫으면 프로그램이 종료되고 X 서버와의 연결도 닫힙니다.그리고 나서, 당신이 전화하려고 할 때.XCloseDisplay(display)
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "display
구조가 잘못되었습니다.
다음은 Xlib 설명서에서 발췌한 내용입니다.
하지
WM_DELETE_WINDOW
에 시대에WM_PROTOCOLS
사용자가 클라이언트의 최상위 창 중 하나를 삭제하도록 요청할 경우 서버에서 속성의 연결이 끊어질 수 있습니다.
네, 하지만 그들이 문서에 그렇게 깊이 숨기지 않았다면 좋을 것입니다. :-P 하지만 이미 발견했을 때, 다행히도 해결책에 대한 힌트도 얻을 수 있습니다.
을 .WM_DESTROY_WINDOW
의전
문서의 다른 발췌문:
으로 여러 개의 창 중 를 삭제하더라도 .
WM_DELETE_WINDOW
에 시대에WM_PROTOCOLS
각 창에 있는 속성입니다.그들은 다음을 받을 것입니다.ClientMessage
위에서 설명한 것과 같은 사건은 누구의 것입니까?data[0]
는 드는입니다.WM_DELETE_WINDOW
.
저도 같은 오류가 있었는데 정확하게 원인과 이유를 알고 싶었습니다.제가 그것을 파악하고 문서에서 적절한 설명을 찾는 데 시간이 좀 걸렸기 때문에, 저는 다른 사람들의 정보가 없는 시간을 절약하기 위해 제 설명을 여기에 넣었습니다.
X11에는 "종료 버튼", "애플리케이션" 또는 "닫기 이벤트"와 같은 것이 없습니다.이것은 의도적인 것입니다.
창 장식, 종료 버튼 및 기타 우리가 의존하는 많은 것들은 X11에 내장되어 있지 않습니다.대신 코어 X11 위에 구현됩니다.를 wmDeleteMessage
ICCM입니다. 찾아보세요.
Xlib는 코어 X11 프로토콜만 처리합니다.기본 제공 닫기 이벤트가 없습니다.
ICCCM 및 X11에 기본 제공되지 않는 모든 기능(GTK, wxWindows, Qt 등)을 보다 쉽게 처리할 수 있는 도구 키트가 있습니다.
언급URL : https://stackoverflow.com/questions/10792361/how-do-i-gracefully-exit-an-x11-event-loop
'programing' 카테고리의 다른 글
HTML에서 Excel로:Excel에 열을 숫자로 처리하도록 지시하는 방법은 무엇입니까? (0) | 2023.07.15 |
---|---|
INSERT INTO(SQL Server 2005)를 사용하여 여러 값 삽입 (0) | 2023.07.10 |
mongodb 셸에서 각에 대한 업데이트 인 (0) | 2023.07.10 |
csv 파일에서 데이터를 읽고 데이터베이스에 저장하는 방법 ? Spring Boot (0) | 2023.07.10 |
MongoDB 인덱스/RAM 관계 (0) | 2023.07.10 |