Xorg

GUI 工具包和視窗管理器如何使用顯示伺服器?

  • July 25, 2020

我試圖了解 Linux 系統的不同組件如何與顯示伺服器提供的服務互動。在使用基於 Wayland 的顯示伺服器使問題複雜化之前,讓我首先關注 X11:

  1. 我知道,為了為基於 X11 的系統實現一個非常基本的 GUI 應用程序,理論上可以針對X11 的 C 庫綁定進行程式並使用低級原語,例如XMapWindow創建XDrawString特定的 X 客戶端。這也是通用 GUI 工具包(例如 GTK 或 Qt)在其 Linux 實現的最低級別使用的 API 嗎?還是他們以不同的方式繪製按鈕和文本欄位?
  2. 根據這篇文章,視窗管理器的工作之一是控制視窗的位置。這究竟是如何發生的?顯示伺服器是否知道視窗管理器想要顯示的每個單獨的視窗,並且對於這些視窗中的每一個,是否期望視窗管理器為其提供位置和所需的尺寸?例如,當視窗調整大小時,視窗管理器有責任更新這些尺寸嗎?
  3. 再次考慮上面的文章,視窗管理器的另一項工作是裝飾視窗,即繪製應用程序的邊框和控制項。視窗管理器如何做到這一點?它是否再次使用上述 X11 原語在實際 X 客戶端周圍繪製對象?如果確實如此:它如何知道 X 客戶端的開發人員將哪些菜單程式到其 GUI 中?
  4. 如果我們不僅執行一個視窗管理器,而且還執行一個完整的桌面環境,例如 GNOME:如何繪製特定於環境的組件,例如面板和視窗切換器?它們是否作為單獨的 X 客戶端執行?

最後,考慮使用 Wayland 而不是 X11。如果我正確理解這篇文章,基於 Wayland 的顯示伺服器被稱為“Wayland 合成器”,並集成了合成視窗管理器的功能。這是否意味著像 Mutter 這樣的 Wayland 合成器與像 Compiz 這樣的傳統視窗管理器完全不兼容?

  1. 工具包最初使用 X11 低級原語在螢幕上繪製內容。如今,字型處理和文本渲染是在客戶端完成的,並且可以使用 GLX(基於 X 協議的 OpenGL)和直接渲染 (DRI) 等 X 協議擴展。
  2. X 伺服器知道所有視窗及其大小和位置。視窗是 X11 中的伺服器端對象。客戶端可以向 X 伺服器發送一個視窗創建請求,伺服器以創建視窗的 id 響應。當使用者與視窗管理器互動時,視窗通常會調整大小,然後視窗管理器會向伺服器發送請求以使用 X11 API 呼叫調整視窗大小。
  3. 視窗管理器是一個普通的 X11 客戶端應用程序,雖然是一個特殊的應用程序。視窗管理器確實使用相同的 X 呼叫並處理與普通 X 客戶端應用程序相同的事件,例如繪製圖元和指針事件。應用程序菜單不是視窗管理器繪製的裝飾的一部分,而是由應用程序本身處理的。
  4. 桌面環境的“面板”和“視窗切換器”可以是單獨的 X 客戶端,也可以是視窗管理器的一部分,尤其是在它們執行諸如切換視窗之類的任務時。

Wayland 視窗管理器處於與 X11 對應物非常不同的最低級別,因為 Wayland 架構與 X11 有很大不同。如果您正在執行 Wayland,則需要一個 Wayland 視窗管理器/合成器。另一方面,一些 Wayland 視窗管理器,如 KWin,是以原始 X11 版本為起點編寫的,目的是提供幾乎相同的使用者體驗,因此從使用者的角度來看,這兩個變體 (KWin/ X11 和 KWin/Wayland) 是兼容的。

請參閱Linux 的顯示如何工作?

引用自:https://unix.stackexchange.com/questions/600323