저는 최근에 C 코드를 가지고 놀았고, 일부 기능, 특히 창 생성이 어떻게 구현되는지 알고 싶습니다.
한동안 SDL을 사용해왔지만 X11(또는 Wayland)에 의존하는 것 같습니다. 그런데 X11 자체는 C로 작성되어 있는데 어떻게 창을 만드는 걸까요? 더 낮은 곳으로 갈 수 있나요?
예를 들어, 나는 이 작업을 수행하는 시스템 호출을 모릅니다.
이는 교육 목적으로만 사용되며 프로덕션 용도로는 사용되지 않습니다.
답변1
X11은 클라이언트가 창을 요청할 수 있는 클라이언트-서버 아키텍처입니다. 서버는 실제로 물건을 표시하는 것이고 클라이언트는 응용 프로그램입니다.
클라이언트 소프트웨어로서 일반적으로 libX11을 사용하여 이러한 요청을 수행합니다.
더 이상 X11에서 직접 GUI 애플리케이션을 개발하는 사람은 없으며, 그럴 만한 이유가 있습니다. X11 디자인의 대부분은 더 이상 그러한 애플리케이션을 작성하려는 방식을 반영하지 않습니다. 예를 들어 X11에는 선이나 상자와 같은 기본 그리기 루틴이 있습니다. 그러나 그리는 모든 라인에 대해 프로토콜을 통해 요청하는 오버헤드는 매우 높습니다. 따라서 현명한 클라이언트는 이를 표면(원하는 경우 비트맵)에 간단히 그리고 변경된 영역을 블록의 서버로 보냅니다.
게다가 특히 SDL을 사용할 때 OpenGL과 같은 기능을 활성화하거나 X11을 통한 비트맵 복사를 방지하려면 클라이언트와 서버 간의 엄격한 분리를 깨뜨려야 한다는 점을 깨달아야 합니다. 대신 애플리케이션이 SDL에 직접 쓸 수 있도록 허용됩니다. GPU 버퍼.
게다가 지난 10년 동안 기능 개발에 적극적으로 참여한 거의 모든 X.org 개발자가 Wayland에서 그렇게 했다고 말하는 것이 타당하다고 생각합니다. 따라서 2023년에 저수준 X11을 수행하는 방법을 배우는 것이 가장 현명한 선택이 아닐 수도 있습니다. Wayland는 아직 이를 달성하지 못했지만 X의 시대가 얼마 남지 않았다는 것은 분명합니다.
이것이 더 이상 낮은 수준의 X11 호출을 하지 않는 또 다른 좋은 이유입니다. 점점 더 많은 플랫폼에서 자신을 제외하고 있습니다(또는 또 다른 간접 계층을 추가합니다. xwayland 서버는 Wayland의 단일 창 X11 서버를 에뮬레이션합니다. 그러면 어느 정도 작동합니다. 예를 들어 XWayland는 기본 작업을 전혀 수행할 수 없습니다. hidpi 지원 작업).
따라서 "코드의 양은 얼마입니까?"라는 질문에 답하려면 유용한 작업을 수행하려는 경우가 아니면 많지 않습니다. 스레딩 지원으로 libX11을 초기화하고, 핸들러를 설정하고, 입력 처리를 초기화하고, 최소한 xdamage를 초기화하고, 창을 설정하고, 표면을 가져와서 그리기를 시작해야 합니다. 이 모든 일은 1980년대 C-duct에서 일어났습니다. 솔직히 더 좋은 시절도 있었어요. SDL, GTK4, FLTK와 같은 프레임워크 사용... 저는 개인적으로 DearImgui가 그래픽 시스템과 대화하는 다양한 방법을 기반으로 따라하기 쉬운 예제를 제공한다는 것을 알았습니다. 비록 이러한 방법이 X11 창을 얻는 데 대한 구체적인 세부 사항을 추상화하지만, 4MB의 RAM이 너무 큰 데스크톱 아이디어가 아닌 최신 GPU 인터페이스를 기반으로 GUI를 구축하면 GUI가 어떻게 상호 작용하는지 더 깊이 이해할 수 있기 때문에 기분이 좋습니다.