Giao thức và kiến trúc của Hệ thống X Window

Trong vi tính, **[[Hệ thống X Window]]** (thường được gọi tắt là **X11** hoặc **X**) là một hệ thống cửa sổ xuyên dụng mạng dùng để hiển thị đồ họa bitmap. Bài viết này nhằm liệt kê chi tiết các giao thức và cấu trúc kỹ thuật trong hệ thống X11.

## Mô hình khách-chủ và tính năng xuyên dụng mạng

X được xây dựng trên mô hình khách-chủ. *Trình chủ X* là một chương trình hoạt động trên một máy tính có bộ hiển thị đồ họa, giao thông với nhiều *trình khách* khác nhau. Trình chủ chấp nhận những yêu cầu về xuất dữ liệu đồ họa (*graphical output*) (như các cửa sổ) và hồi âm những dữ liệu nhập vào từ người dùng (như bàn phím, chuột) (*sends back user input (keyboard, mouse)*).

Trong hệ thống X Window, trình chủ chạy trên máy tính của người dùng, trong khi các trình khách có thể lại chạy trên các máy tính khác. Quan điểm này ngược với những cấu hình khách-chủ thông dụng trong các hệ thống thường thấy. Thông thường, *trình khách* chạy trên máy tính của người dùng, trong khi *trình chủ* lại chạy trên một máy tính ở xa. Sự đảo lộn này thường gây ra sự lúng túng cho những người mới dùng X. Thuật ngữ mà "X Window" dùng được lấy ra từ quan điểm của chương trình ứng dụng, hơn là từ góc độ của người dùng, hay từ phần cứng: trình ứng dụng ở xa kết nối với bộ hiển thị của trình chủ X đang chạy trên máy tại địa phương, và do đó nó hoạt động như những trình khách. Bộ hiển thị X tại máy địa phương chấp nhận giao thông dữ liệu hướng về mình, cho nên nó hoạt động như một trình chủ.

Giao thức giao thông giữa trình chủ và trình khách hoạt động theo tính cách xuyên dụng mạng: trình khách và trình chủ có thể được chạy trên cùng một máy, hay trên nhiều máy khác nhau. Chúng có thể không có cùng một cấu trúc máy tính hoặc có thể không có cùng một hệ điều hành. Trình khách và trình chủ có thể giao thông với nhau một cách bí mật thông qua Internet bằng cách dùng kết nối ngầm (*tunneling*) thông qua một kết nối đã được mã hóa (*encrypted connection*).

## Nguyên lý thiết kế
Bob Scheifler và Jim Gettys đặt ra các nguyên lý ban sơ của X như sau (liệt kê trong Scheifler/Gettys năm 1996):

**Không nên thêm tính năng mới vào, trừ phi người thực hiện không thể hoàn tất một ứng dụng nào đấy nếu không có tính năng đó.*
**Việc quyết định hệ thống là gì, và sẽ hoạt động như thế nào, cũng quan trọng như việc quyết định hệ thống không phải như thế này, hoặc thế kia. Chớ có tham vọng phục vụ cho toàn bộ tất cả những nhu cầu ở trên thế giới, song nên tạo cho hệ thống có khả năng khuếch trương, hầu cho những nhu cầu mới cũng có thể được thỏa mãn, thích ứng theo chiều hướng tăng trưởng.*
**Việc tổng quát hóa từ chỉ một ví dụ đã là rất tồi tệ rồi, nhưng tổng quá hóa trong khi không có một ví dụ nào để dựa vào còn tồi tệ hơn thế nữa.*
**Nếu không thể thâu tóm được vấn đề một cách trọn vẹn, thì tốt nhất đừng nên đưa ra một giải pháp nào hết."
**Nếu mình có một giải pháp có thể đạt được 90% kết quả mong muốn mà chỉ mất có 10% sức lực, thì mình nên dùng phương pháp đơn giản đó." (Xin xem thêm Tồi tệ hơn nhưng lại tốt hơn)
**Cô lập những phức tạp rối rắm, càng nhiều càng tốt"
**Việc đưa ra một cơ chế giải pháp, tốt hơn là việc đưa ra một qui chế. Cụ thể, chúng ta nên đặt các qui chế về giao diện người dùng, trong tay của trình ứng dụng."

Trong thời gian thiết kế X, nguyên lý đầu tiên được điều chỉnh, và trở nên: *Không nên bổ sung tính năng mới, trừ phi mình biết cụ thể một ứng dụng nào đó đòi hỏi tính năng mới này*. Từ đó trở đi, X giữ vững các nguyên lý của mình, hầu như không thay đổi. Việc thực thi có tính tham khảo được phát triển với một tầm nhìn hướng tới sự mở rộng và cải thiện những thực thi đã được hoàn thành, trong khi gìn giữ nguyên vẹn tính tương thích đối với giao thức nguyên thủy từ năm 1987.

## Giao thức trung tâm của X Window

Giao thông giữa trình chủ và các trình khách được thực hiện thông qua việc trao đổi những gói dữ kiện trên một kênh tuyến của mạng lưới truyền thông. Trình khách thiết lập kết nối và gửi gói dữ kiện đầu tiên sang cho trình chủ. Trình chủ hồi âm bằng một gói dữ kiện, thông báo cho trình khách biết hoặc là nó chấp nhận hay từ chối yêu cầu kết nối của trình khách, hoặc nó yêu cầu trình khách phải xác minh và chứng thực thêm. Nếu kết nối được chấp thuận, gói dữ kiện thông báo việc chấp thuận được sẽ được gắn những dữ liệu mà trình khách cần có cho những lần giao lưu tiếp theo với trình chủ.

Sau khi kết nối đã được thành lập, có bốn loại gói dữ liệu được trao đổi qua lại giữa trình khách và trình chủ, thông qua kênh truyền thông:

#**Yêu cầu:** (*Request*) Trình khách yêu cầu tin tức từ trình chủ, hoặc yêu cầu trình chủ thao tác một chức năng nào đó.
#**Trả lời:** (*Reply*) Trình chủ hồi âm yêu cầu của trình khách. Không phải yêu cầu nào của trình khách cũng được trình chủ hồi âm.
#**Sự kiện:** (*Event*) Trình chủ gửi một "sự kiện" hay một "tác động" nào đấy đến cho trình khách, chẳng hạn như: tác động của bàn phím, của chuột, hoặc do một cửa sổ bị di chuyển, thay đổi cỡ, hoặc bị phô trương ra (không bị che lấp nữa).
#**Báo lỗi:** (*Error*) Trình chủ gửi một gói dữ liệu báo lỗi. Do các gói dữ liệu yêu cầu của trình khách gửi sang phải xếp hàng, đợi trình chủ đối phó với từng yêu cầu lần lượt, các gói dữ kiện báo lỗi được tạo nên bởi một yêu cầu nào đó không phải bao giờ cũng được gửi về cho trình khách ngay tức khắc.

Trình chủ X cung ứng một số dịch vụ căn bản. Trình khách nhận biết được những tính năng phức tạp khác, mà trình chủ có thể làm, thông qua sự tương giao với trình chủ.

### Cửa sổ

Khung hình được gọi là cửa sổ trong các hệ thống giao diện đồ họa người dùng (*graphical user interface*) khác, được gọi là cửa sổ ở "tầng cao nhất" (hay tầng trên cùng) (*top-level window*) trong Hệ thống X Window. Từ *cửa sổ* còn được dùng cho những cửa sổ nằm bên trong một cửa sổ khác, có nghĩa nó là "cửa sổ con" của một "cửa sổ mẹ". (*subwindows of a parent window*). Những phần tử đồ họa như các nút  bấm (*buttons*), trình đơn (*menus*), hình biểu trưng (*icons*) v.v đều được thể hiện bằng cửa sổ.

Một cửa sổ con chỉ có thể được tạo nên do một cửa sổ mẹ nào đó. Điều này có nghĩa là tất cả các cửa sổ đều được bố trí theo dạng thức phả hệ, có nghĩa là chúng được bố trí theo một hệ thống cấp bậc. Gốc của hệ thống cấp bậc này được gọi là cửa sổ gốc (*root window*), và được trình chủ tự động tạo nên. Những cửa sổ ở tầng trên cùng (*top-level windows*) chính là những cửa sổ con trực tiếp của cửa sổ gốc. Hiển nhiên, cửa sổ gốc chiếm diện tích bằng diện tích của màn hình, và nằm ở phía sau cùng, sau các cửa sổ khác.

### Định danh

Tất cả dữ liệu về các cửa sổ, phông chữ v.v. đều được lưu trữ trong trình chủ. Trình khách biết định danh (*identifiers*) của các đối tượng (*objects*) này. Những định danh đều là những số nguyên. Trình khách dùng những con số này để điểm chỉ một đối tượng cụ thể nào đấy khi trình khách tương tác với trình chủ. Chẳng hạn, khi trình khách muốn tạo một cửa sổ mới, trình khách yêu cầu trình chủ tạo cho nó một cửa sổ với định danh mà nó đưa cho. Trình chủ, sau khi tạo nên cửa sổ mới rồi, liên kết cửa sổ ấy với định danh mà nó nhận được. Trình khách dùng định danh ấy để đề bạt các yêu cầu, chẳng hạn như vẽ một chuỗi các ký tự (a string) vào cửa sổ với định danh mà nó đã gửi sang cho trình chủ.

Các định danh mà trình chủ giữ đều là những định danh độc nhất vô nhị, không có định danh nào bị lặp lại. Tính độc nhất của các định danh không chỉ dành riêng cho một trình khách nào đó mà thôi, song nó bao trùm tất cả, và không có hai cửa sổ nào có cùng một định danh giống nhau, cho dù chúng được tạo nên bởi hai trình khách khác nhau. Một trình khách có thể truy cập một đối tượng nào đó bằng định danh của đối tượng ấy, cho dù đối tượng ấy được tạo nên bởi yêu cầu của một trình khách khác.

### Đặc tính và sở hữu

Cửa sổ nào cũng có một loạt những đặc tính đã được xác định trước, cùng một loạt các sở hữu. Tất cả những dữ liệu và đặc tính này đều được lưu trữ bên trình chủ. Trình khách nào cũng có thể truy cập được những dữ liệu và đặc tính của các cửa sổ bằng cách gửi những yêu cầu thích hợp sang cho nó. Đặc tính là những dữ liệu về cửa sổ, như cỡ của nó, vị trí tọa độ trên màn hình, màu nền v.v. Sở hữu dữ liệu bao gồm những mảng dữ liệu gắn kèm theo cửa sổ. Ngược lại với các đặc tính, các sở hữu không có tác động hoặc ý nghĩa gì ở tầng giao thức trung tâm của X Window (*X Window core protocol*). Trình khách có thể lưu trữ bất cứ dữ liệu nào trong phần sở hữu của một cửa sổ.

Đặc điểm của sở hữu là mỗi sở hữu có một cái tên, kiểu dữ liệu, và một giá trị được gán cho. Sở hữu giống như biến số (*variables*) trong các ngôn ngữ lập trình mệnh lệnh (*imperative programming language*) ở chỗ chương trình ứng dụng có thể tạo nên một sở hữu mới, cho nó một cái tên, một kiểu dữ liệu, rồi lưu trữ một giá trị ở trong đó. Sở hữu được liên kết với cửa sổ: hai sở hữu có cùng một tên, có thể tồn tại trên hai cửa sổ khác nhau, với kiểu dữ liệu và giá trị khác nhau.

Sở hữu thường được dùng trong giao thông liên trình khách   (*inter-client communication*). Chẳng hạn, sở hữu với cái tên `WM_NAME` được dùng để lưu trữ tên của cửa sổ; chương trình quản lý cửa sổ thường đọc sở hữu này và hiển thị tên của cửa sổ ở trên đầu nó.

Sở hữu của sổ có thể được biểu hiện dùng trình ứng dụng `xprop`. Cụ thể, `xprop -root` sẽ hiển thị các sở hữu của cửa sổ gốc cùng với tài nguyên của X  (thông số cho trình ứng dụng).

### Sự kiện hoặc tác động

Những sự kiện hoặc những tác động xảy ra bên trình chủ sẽ được thông báo cho trình khách qua những gói dữ liệu, để cho trình khách biết và xử lý, đặc biệt là những sự kiện hoặc tác động mà trình khách quan tâm đến. Trình khách còn có thể yêu cầu trình chủ gửi tác động sang cho trình khách khác; đây chính là phương pháp mà các trình khách giao thông với nhau. Chẳng hạn, khi một trình khách yêu cầu lấy đoạn văn bản đang được chọn, yêu cầu này được biến thành một sự kiện, gói trong một gói dữ liệu, và gửi sang cho trình khách hiện đang xử lý cửa sổ có đoạn văn bản được chọn đó.

Dưới những điều kiện nhất định nào đó, nội dung của một cửa sổ có thể sẽ bị xóa đi (ví dụ nếu cửa sổ bị che lấp). Khi khu vực, nơi nội dung đã bị xóa đi, lại được phô ra, trình khách tạo một sự kiện `Expose`, thông báo cho trình khách, báo với nó rằng phần cửa sổ đó phải được vẽ ra.

Những sự kiện khác thường được dùng để thông báo cho trình khách các dữ liệu nhập vào do bàn phím và chuột gây ra, hoặc do những yêu cầu tạo cửa sổ mới v.v.
 
Một số những sự kiện sẽ luôn luôn được gửi cho các trình khách, còn lại hầu hết các sự kiện khác chỉ được gửi cho trình khách nếu trình khách biểu lộ ý kiến trước đó, rằng nó quan tâm đến những sự kiện đã xảy ra, bởi vì các trình khách có khi chỉ quan tâm đến một số những sự kiện nào đó mà thôi. Lấy ví dụ, một trình khách có thể chỉ quan tâm đến các tác động của bàn phím, mà không để ý gì đến các tác động của chuột.

### Chế độ màu sắc
Phương pháp mà hệ thống X Window dùng để xử lý màu sắc đôi khi làm cho người dùng lúng túng. Trong quá khứ, X có hỗ trợ vài chế độ màu sắc khác nhau. Đa số các trình ứng dụng hiện đại dùng Màu thật (*Truecolour*) (màu 24-bit, 8 bit một màu, với ba màu cơ bản, đỏ,lục và lam (red, green and blue)), song những trình ứng dụng cũ, hoặc những trình ứng dụng chuyên môn có thể lại phải dùng một chế độ màu khác. Rất nhiều chương trình ứng dụng chuyên môn được bán trên thị trường dùng "màu nhân tạo" (*PseudoColor*).

Giao thức X11 dùng một số nguyên 32-bit không dấu (*32-bit unsigned integer*) để biểu thị giá trị của một màu trong hầu hết các thao tác đồ họa, và gọi nó là *"giá trị của điểm ảnh"* (*pixelvalue*). Khi phải chuyển đổi cường độ của các màu cơ bản, người ta dùng một đơn vị số nguyên 16 bit cho mỗi màu. Những phương thức biểu hiện màu liệt kê dưới đây là những cái hiện được hỗ trợ. Trên một thiết bị cụ thể nào đấy, không phải phương thức nào cũng dùng được:

***Màu trực tiếp:** (*DirectColor*) Một điểm ảnh được phân tách ra làm ba phần riêng biệt: đỏ, lục và xanh. Mỗi phần là một mục lục chỉ thị vào một bảng màu riêng. Các giá trị trong bảng màu không cố định và có thể thay đổi được.
****Màu thật:** (*TrueColor*) Tương tự như *màu trực tiếp* ở trên, ngoại trừ một điểm, các giá trị trong bảng màu được phần cứng định trước và không thể thay đổi được. Thông thường thì mỗi một bảng màu của đỏ, lục và lam chứa các giá trị tăng dần theo cường độ của màu, gần như những giá trị trên một đường tuyến tính.
***Gam màu ghi:** (*GrayScale*) Giá trị của một điểm ảnh trên màn hình (pixel) là mục lục chỉ thị của một bảng màu duy nhất, trong đó chứa các giá trị cường độ của màu ghi. Các giá trị trong bảng màu có thể thay đổi được.
****Màu ghi cố định:** (*StaticGray*) Tương tự như *Gam màu ghi* ở trên, ngoại trừ, các giá trị trong bảng màu được phần cứng cố định từ trước, và không thể thay đổi được.
***Màu nhân tạo/màu giả** (*PseudoColor*) (Nén ảnh điểm - tiếng Anh là *Chunky*): Giá trị của một điểm ảnh trên màn hình (pixel) là mục lục chỉ thị của một bảng màu, trong đó chứa các giá trị cường độ của các màu. Các giá trị trong bảng màu có thể thay đổi được.
****Màu cố định:** (*StaticColor*) Tương tự như *Màu nhân tạo* ở trên, ngoại trừ, các giá trị trong bảng màu được phần cứng cố định từ trước, và không thể thay đổi được.

## Xlib và các thư viện khác của trình khách

Phần lớn các trình khách giao thông với trình chủ thông qua thư viện Xlib của trình khách. Cụ thể, hầu hết các trình khách dùng các thư viện như Xaw, Motif), GTK+, hay Qt, là những thư viện dùng Xlib để tương tác với trình chủ.

## Sự Liên thông giữa các trình khách

Giao thức trung tâm của X Window (*The X Window core protocol*) cung cấp một cơ chế cho phép các trình khách giao thông với nhau bằng cách sử dụng các sở hữu của cửa sổ (*window properties*) và bằng các sự kiện (*events*), cụ thể là các sự kiện *thông điệp giữa trình khách-tới-trình khách*. Tuy vậy nhưng nó lại không đặc tả một giao thức cụ thể nào cho sự tương tác ấy. Các giao thức này lại do một loạt các quy ước giao thông liên trình khách riêng biệt chi phối.

Bản Hướng dẫn về quy ước giao thông liên trình khách (*Inter-Client Communication Conventions Manual*) đặc tả giao thức dùng để trao đổi dữ liệu thông qua sự lựa chọn và tương tác của các trình ứng dụng với chương trình quản lý cửa sổ. Bản đặc tả này đã từng được cân nhắc là một bản đặc tả khó thực hiện và rối ren. Sự nhất quán trong diện mạo và cử chỉ (*look and feel*) của trình ứng dụng, cũng như trong giao thông thường được giải quyết bằng cách tiến hành lập trình cho một môi trường mặt bàn cụ thể nào đấy mà thôi.

Giao thức trao đổi liên trình khách (*Inter-Client Exchange protocol - viết tắt là ICE*) đặc tả một cơ cấu tổ chức để xây dựng các giao thức về sự tương tác giữa các trình khách, hầu cho một giao thức cụ thể nào đấy có thể lấy nó làm nền tảng để xây dựng nên một giao thức mới. Trên thực tế, giao thức quản lý phiên giao dịch của X (*X Session Management protocol - viết tắt là XSMP*) là một giao thức dựa trên ICE. Giao thức này là giao thức chỉ thị sự tương tác giữa các trình ứng dụng, là những trình ứng dụng có phần quản lý phiên giao dịch (*Session management*), một phần mềm quản lý việc lưu trữ tình trạng làm việc của mặt bàn đồ họa ở các đầu tương tác trong phiên giao dịch, khôi phục lại mặt bàn đồ họa khi một phiên giao dịch của cùng một người dùng bắt đầu trở lại.

Những quy ước mới được ghi trong các bản đặc tả của freedesktop, bao gồm quy ước về "kéo-và-thả" (*drag-and-drop*) mà Xdnd (*Drag-and-Drop protocol for the X window system*) sử dụng để truyền tải dữ liệu. Xdnd cho phép việc truyền tải dữ liệu bằng cách lựa chọn chúng trong một cửa sổ rồi kéo chúng sang một cửa sổ khác. Bên cạnh đó chúng ta còn có quy ước nhúng chương trình ứng dụng (*embedded application convention*) Xembed là bản quy ước liệt kê chi tiết phương pháp cho phép một trình ứng dụng chạy trên cửa sổ con của một trình ứng dụng khác.

### Bộ đệm dùng cho việc chọn, cắt, cùng với tính năng "kéo-và-thả"

Bộ đệm (*buffer*) dùng để lưu trữ những phần dữ liệu được lựa chọn, những phần dữ liệu được cắt ra, cùng với tính năng "kéo-và-thả" (*drag-and-drop*) là những cơ chế sử dụng trong Hệ thống X Window cho phép người dùng truyền tải dữ liệu từ cửa sổ này sang cửa sổ khác. Bộ đệm lưu trữ những phần chọn lựa (*selections*), những phần được cắt ra (*cut*), đại đa số được dùng khi người dùng lựa chọn một đoạn văn bản (*text*), hay một những dữ liệu khác, trong một cửa sổ và dán (*paste*) nó vào một cửa sổ khác. Tính năng "kéo-và-thả" được dùng khi người dùng lựa chọn cái gì đó trong một cửa sổ, bấm xuống phần lựa chọn và kéo nó sang một cửa sổ khác.

Trong khi hai cửa sổ có thể do hai chương trình ứng dụng khác nhau xử lý, truyền tải dữ liệu giữa chúng đòi hỏi phải có hai trình khách khác nhau thông nối với cùng một trình chủ X để chúng có thể tương tác. Giao thức trung tâm của X Window có bao gồm một số loại yêu cầu (*requests*) và sự kiện (*events*) dành riêng cho việc trao đổi những dữ liệu đã được lựa chọn (*selection exchange*), song phần lớn việc truyền tải dữ liệu được giải quyết bằng cách dùng phương thức gửi sự kiện trình khách-tới-trình khách chung (*general client-to-client event sending*) cùng với các sở hữu của cửa sổ (*window properties*). Những sở hữu này không chỉ được dùng nguyên cho việc truyền tải dữ liệu đã được lựa chọn không mà thôi.

Dữ liệu được truyền tải giữa các trình khách có thể có kiểu dữ liệu khác nhau: thường thì chúng chỉ là văn bản, song chúng còn có thể là đồ họa pixmap (hay đồ họa bitmap), một con số, một danh sách các đối tượng (*objects*) v.v.

Sự lựa chọn dữ liệu cùng với tính năng "kéo-và-thả" là những cơ chế năng động (*active mechanism*): sau khi một vài đoạn văn bản được lựa chọn trong một cửa sổ nào đó, trình khách xử lý cửa sổ phải năng động trong việc hỗ trợ một giao thức, cho phép việc truyền tải dữ liệu tới một trình ứng dụng đòi hỏi dữ liệu ấy, xảy ra. Ngược lại, bộ đệm (*buffer*) lưu trữ dữ liệu được cắt ra là một cơ chế bị động (*passive mechanism*): khi người dùng chọn một đoạn văn bản, nội dung của đoạn văn bản được cắt rời ra và được chuyển vào bộ đệm lưu trữ dữ liệu cắt. Dữ liệu đã cắt và lưu trữ được giữ nguyên trong bộ đệm ngay cả khi trình ứng dụng xử lý cửa sổ ấy kết thúc và cửa sổ bị xóa đi.

### Chương trình quản lý cửa sổ

Chương trình quản lý cửa sổ là một trình ứng dụng điều khiển diện mạo của cửa sổ, và những phần tử đồ họa khác, trong một môi trường giao diện đồ họa người dùng. Nguyên nhân gây ra sự khác nhau về diện mạo của các hệ thống X Window trong các cài đặt khác nhau là do người ta dùng những chương trình quản lý cửa sổ khác nhau, hoặc do sự khác nhau trong cấu hình của chương trình quản lý cửa sổ được dùng mà ra.

Chương trình quản lý cửa sổ quyết định vị trí tọa độ của các cửa sổ, cho chúng một bộ viền trang trí ở quanh mép, xử lý các hình biểu trưng (*icons*), xử lý chuỗi bấm của chuột ở bên ngoài cửa sổ (như bấm chuột trên nền đằng sau), xử lý chuỗi bấm của bàn phím (chẳng hạn, thu nhỏ cửa sổ lại thành hình biểu trưng (*iconify*) khi tổ hợp phím ALT-F4 được bấm) v.v.

Đứng trên phương diện của trình chủ X, chương trình quản lý cửa sổ không khác gì các trình khách khác. Chương trình quản lý cửa sổ quản lý vị trí tọa độ khởi đầu cùng với những khung trang trí chung quanh của các cửa sổ, thông qua những yêu cầu sau đây:

# Một trình ứng dụng có thể yêu cầu trình chủ dừng lại, không thi hành các yêu cầu để bài trí (hiển thị) các cửa sổ con của một cửa sổ mẹ nào đấy, song gửi một sự kiện thay thế;
# Một trình ứng dụng có thể yêu cầu thay nhánh mẹ của một cửa sổ.

Chương trình quản lý cửa sổ dùng yêu cầu đầu tiên để chặn các yêu cầu bài trí các cửa sổ ở tầng trên cùng (*top-level windows*) (những cửa sổ con của cửa sổ gốc). Bất cứ lúc nào một chương trình ứng dụng đòi hỏi sự bài trí của một cửa sổ ở tầng trên cùng, trình khách cũng sẽ không xử lý yêu cầu, thay vào đó, nó gửi một sự kiện cho chương trình quản lý cửa sổ. Hầu hết các chương trình quản lý cửa sổ thay nhánh mẹ của cửa sổ: chúng tạo nên một cửa sổ ở tầng trên cùng to hơn (gọi là cửa sổ khung (*frame window*)), rồi thay nhánh mẹ của cửa sổ vốn có một thành cửa sổ con của nó. Trong phương diện đồ họa mà nói, việc làm này tương đương với việc đặt cửa sổ vốn có vào bên trong một cửa sổ khung. Khoảng không gian của cửa sổ khung không bị cửa sổ này chiếm chỗ, sẽ là chỗ để dành cho cái khung trang trí ở chung quanh cửa sổ như "đường viền" và "thanh tiêu đề" (*the "border" and the "title bar"*).

Chương trình quản lý cửa sổ quản lý các chuỗi bấm của chuột trong cửa sổ khung. Nó xử lý những việc như dịch chuyển vị trí hay thay đổi cỡ của cửa sổ, khi người dùng bấm vào đường viền hay vào thanh tiêu đề và kéo.

Chương trình quản lý cửa sổ quản lý còn có trách nhiệm xử lý những hình biểu trưng, và những phần tử đồ họa liên quan trong giao diện đồ họa người dùng. Những hình biểu trưng không tồn tại ở tầng giao thức trung tâm của X Window (*X Window core protocol*). Chúng được thực hiện bởi chương trình quản lý cửa sổ. Chẳng hạn, khi một cửa sổ phải biểu trưng hóa (*iconified*) - cửa sổ bị thu nhỏ và chỉ được đại diện bằng một hình biểu trưng nhỏ -  chương trình quản lý cửa sổ FVWM xóa cửa sổ đó đi, làm cho nó vô hình, rồi tạo nên một cửa sổ con làm tên của hình biểu trưng, và có thể  một cửa sổ con nữa làm hình biểu trưng cho cửa sổ bị thu nhỏ. Vì vậy, ý nghĩa và phương pháp xử lý các hình biểu trưng hoàn toàn thuộc về trách nhiệm của chương trình quản lý cửa sổ: một số chương trình quản lý cửa sổ, như wm2, hoàn toàn không hỗ trợ và thực thi hình biểu trưng một tí nào hết.

### Phần mềm quản lý phiên giao dịch

 
Tại một thời điểm nhất định nào đó, tình trạng của một phiên giao dịch cũng hầu như tương tự với "tình trạng của mặt bàn" (*state of the desktop*), tức là nó bao gồm một số cửa sổ, và nội dung của những cửa sổ này. Chính xác hơn nữa, nó chính là tình trạng của những chương trình ứng dụng đang vận hành và xử lý những cửa sổ này, cùng với những thông số và dữ liệu cho phép chương trình ứng dụng khôi phục lại điều kiện hoạt động của những cửa sổ mà nó đang quản lý, nếu cần thiết. Quản lý phiên giao dịch là một chương trình ứng dụng dùng để lưu trữ và khôi phục lại tình trạng hoạt động của một phiên giao dịch.

Ảnh hưởng rõ nhất của việc dùng phần mềm quản lý phiên giao dịch là chúng ta có thể đăng xuất một phiên giao dịch tương tác, chấm dứt nó, song khi đăng nhập trở lại, tình trạng của các cửa sổ được khôi phục lại giống y nguyên như lúc trước khi chúng ta đăng xuất. Để có thể làm được như vậy, phần mềm quản lý phiên giao dịch lưu trữ tên của các chương trình ứng dụng đang chạy khi chúng ta đăng xuất, và khởi động chúng lại khi chúng ta đăng nhập. Nếu chúng ta muốn khôi phục lại tình trạng hoạt động của các trình ứng dụng (hòng khôi phục lại nội dung của các cửa sổ mà trình ứng dụng đã dùng), thì các chương trình ứng dụng phải có khả năng lưu trữ tình trạng hoạt động của nó khi phần mềm quản lý phiên giao dịch yêu cầu, và nhập các dữ liệu đã lưu trữ trở lại trong bộ nhớ, khôi phục lại điều kiện và tình trạng hoạt động của mình như trước đây, khi chương trình ứng dụng hoạt động trở lại.

Hệ thống X Window có kèm một phần mềm quản lý phiên giao dịch mặc định, gọi là `xsm`. Có nhiều phần mềm quản lý phiên giao dịch khác được phát triển cho một số hệ thống mặt bàn đặc thù, ví dụ `ksmserver` là phần mềm quản lý phiên giao dịch mặc định của KDE.

## Phần mềm quản lý việc hiển thị của X

Chương trình quản lý hiển thị X (*X display manager*) là một trình ứng dụng hiển thị giao diện đồ họa đăng nhập trong Hệ thống X Window. Nói một cách chung chung hơn nữa, một chương trình quản lý hiển thị vận hành một hoặc nhiều trình chủ X trên máy tính địa phương, và tiếp nhận kết nối từ những trình chủ X vận hành trên những máy tính ở xa. Các trình chủ địa phương được khởi động bởi chương trình quản lý hiển thị, sau đó kết nối với chúng (những trình chủ ở xa) để biểu hiện màn hình đăng nhập người dùng. Những trình chủ ở xa khởi động một cách riêng biệt, biệt lập với chương trình quản lý hiển thị, và kết nối với nó. Trong trường hợp này, chương trình quản lý hiển thị hoạt động như một trình chủ telnet đồ họa vậy: một trình chủ X kết nối với chương trình quản lý hiển thị và nó khởi đầu một phiên giao dịch; những trình ứng dụng được dùng trong phiên giao dịch được vận hành trên cùng một máy tính với chương trình quản lý hiển thị, song có thông tin nhập (*input*) và thông tin xuất (*output*) trên máy tính nơi trình chủ X đang chạy (tức là máy tính ở trước mặt người dùng).

XDM là chương trình quản lý hiển thị cơ bản được cung cấp cùng với Hệ thống X Window. Những chương trình quản lý hiển thị khác bao gồm GDM (GNOME), KDM (KDE), WDM (sử dụng bộ khí kiện WINGs được dùng trong Window Maker) và entrance (sử dụng kiến trúc được dùng trong Enlightenment v.17).

## Những phần tử trong giao diện người dùng

Những công cụ khí kiện dành cho X bao gồm Xaw (Bộ khí kiện Athena), OLIT (Công cụ Intrinsics cho OPEN LOOK), XView, Motif và Tk. OLIT và XView được sử dụng như là những công cụ cơ bản cho OPEN LOOK GUI của AT&T và Sun.

Motif là công cụ cơ bản dùng cho Môi trường mặt bàn chung (*Common Desktop Environment - viết tắt là CDE*), môi trường mặt bàn tiêu chuẩn được dùng trong các hệ điều hành Unix được bán trên thị trường, như Solaris và HP-UX. (GNOME được kèm trong phiên bản Solaris 9  và sẽ là tiêu chuẩn trong những phiên bản sắp tới trong tương lai.

Các công cụ hiện đại khác bao gồm Qt (được dùng trong KDE), GTK+ (được dùng trong GNOME), wxWidgets, FLTK và FOX.

## Nhữmg mở rộng

Trình khách X được thiết kế với tính cách đơn giản và có thể mở rộng. Vì thế cho nên hiện nay có rất nhiều tính năng được cho thêm nằm trong các phần mở rộng của giao thức. Danh sách liệt kê sau đây là một danh sách không đầy đủ, liệt kê những phần mở rộng đã được thực hiện:

* Chuyên nhánh video trong X, còn gọi là Xv (chớ nhầm với chương trình ứng dụng xv)
* XRender
* Shape
* XTEST
* Chi nhánh mở rộng bàn phím trong X
* MIT-SHM
* XPRINT
* Hiệu lệnh quản lý điện lực dùng cho bộ hiển thị  (*Display Power Management Signaling - viết tắt là DPMS*)

Tại tầng giao thức, mỗi phần mở rộng được định dạng bằng những yêu cầu/sự kiện/loại gói báo lỗi mới. Truy cập tới trình khách ứng dụng, tới những tính năng mà những phần mở rộng cung cấp được thực hiện thông qua các thư viện của trình khách. Nhiều người cho rằng việc thiết lập mã hóa những mở rộng vào trong phần thực thi hiện tại của trình chủ X là một việc khó làm, do thực trạng bản thiết kế trình chủ thiếu sự phân tách chức năng thành các mô-đun.

## Ghi chú
* Cách dịch từ tiếng Anh "Red, Green, Blue" sang "Đỏ, Vàng, Xanh" trong tiếng Việt có thể gây cảm giác là dịch sai, song vì để phân biệt 3 màu, mỗi màu một tên riêng, nên dùng "vàng" thay cho "xanh lá cây" và "xanh" thay vì "xanh lam". 
* Trong vi tính, 32-bit số nguyên không dấu có nghĩa là một đơn vị bộ nhớ dùng để đại diện cho một số nguyên, gồm 4 byte, mỗi byte 8 bit, (4 x 8 = 32), và dung lượng này có thể biểu đạt được số không dấu, hay số dương, từ 0 đến 4.294.967.295 (232-1), hay 4.294.967.296 giá trị tất cả (kể cả số 0). Khi dùng ở chế độ có dấu, bit đầu tiên bên phải dùng để biểu đạt dấu của con số, 0 là số dương, 1 là số âm. Vì số bit còn lại để biểu đạt giá trị chỉ còn lại là 31 bit (32 - 1), nên những giá trị nó có thể biểu đạt được là từ -2.147.483.648 đến +2.147.483.647 (để ý dấu âm và dương dùng ở đây). 
* tương tự như trên, 16-bit số nguyên (có dấu) là một số dùng 2 byte, 8 bit một byte, để biểu đạt những giá trị từ −32768 đến 32767.

## Xem thêm
*Xlib
*Intrinsics
*Giao thức trung tâm của X Window (*X Window core protocol*)

## Tham chiếu
*Robert W. Scheifler and James Gettys: *X Window System: Core and extension protocols, X version 11, releases 6 and 6.1*, Digital Press 1996, ISBN 1-55558-148-X
*An Introduction to X11 User Interfaces 
*Introduction to X Windows  
*Open Source Desktop Technology Road Map  (Jim Gettys, 09 tháng 12 năm 2003)

## Tham khảo

## Liên kết ngoài
*X.Org Foundation (Trang chủ chính thức)
*X.Org Foundation wiki
*Kenton Lee's pages on X Window and Motif