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

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).

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.

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.

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.