Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Клиентская библиотека для X Window System
Client library for the X Window System
Xlib (также известная как libX11) — это клиентская библиотека протокола X Window System, написанная на языке программирования C. Она содержит функции для взаимодействия с X-сервером. Эти функции позволяют программистам создавать программы, не вдаваясь в детали протокола X. Лишь немногие приложения используют Xlib напрямую; чаще они используют другие библиотеки, которые, в свою очередь, используют функции Xlib для предоставления наборов виджетов:
X Toolkit Intrinsics (Xt)
Набор виджетов Athena (Xaw)
Motif
FLTK
GTK
Qt (X11 версия)
Tk
SDL (Simple DirectMedia Layer)
SFML (Simple and Fast Multimedia Library)
Xlib (also known as libX11) is an X Window System protocol client library written in the C programming language. It contains functions for interacting with an X server. These functions allow programmers to write programs without knowing the details of the X protocol. Few applications use Xlib directly; rather, they employ other libraries that use Xlib functions to provide widget toolkits:
X Toolkit Intrinsics (Xt)
Athena widget set (Xaw)
Motif
FLTK
GTK
Qt (X11 version)
Tk
SDL (Simple DirectMedia Layer)
SFML (Simple and Fast Multimedia Library)
Xlib появилась примерно в 1985 году и используется в графических интерфейсах многих Unix-подобных операционных систем. В 2007 году была представлена переработка Xlib с использованием XCB.
Xlib appeared around 1985, and is used in GUIs for many Unix like operating systems. A re implementation of Xlib was introduced in 2007 using XCB.
Типы данных
Основными типами данных в Xlib являются структура Display и типы идентификаторов. В общем смысле, Display – это физическое или виртуальное устройство, на котором выполняются графические операции. Структура Display библиотеки Xlib содержит информацию об устройстве отображения, но, что более важно, содержит информацию об канале связи между клиентом и сервером. Например, в Unix-подобной операционной системе структура Display содержит файловый дескриптор сокета этого канала (получить который можно с помощью макроса ConnectionNumber). Большинство функций Xlib принимают структуру Display в качестве аргумента, поскольку они либо работают с каналом, либо относятся к конкретному каналу. В частности, всем функциям Xlib, взаимодействующим с сервером, требуется эта структура для доступа к каналу. Некоторые другие функции также нуждаются в этой структуре, даже если они выполняются локально, поскольку они оперируют данными, относящимися к определенному каналу. К таким операциям относятся, например, операции с очередью событий, которая описана ниже. Окна, цветовые карты и т.д. управляются сервером, что означает, что данные об их фактической реализации хранятся на сервере. Клиент оперирует этими объектами, используя их идентификаторы. Клиент не может напрямую оперировать объектом, а может только запросить сервер выполнить операцию, указав идентификатор объекта. Типы Window, Pixmap, Font, Colormap и т.д. – это все идентификаторы, представляющие собой 32-битные целые числа (как и в самом протоколе X11). Клиент "создает" окно, отправляя серверу запрос на его создание. Это делается посредством вызова функции Xlib, которая возвращает идентификатор окна, то есть число. Этот идентификатор затем может быть использован клиентом для запроса других операций над этим же окном у сервера. Идентификаторы уникальны для сервера. Большинство из них могут использоваться разными приложениями для ссылки на одни и те же объекты. Например, два приложения, подключенные к одному и тому же серверу, используют один и тот же идентификатор для ссылки на одно и то же окно. Эти два приложения используют разные каналы и, следовательно, имеют разные структуры Display; однако, когда они запрашивают операции над одним и тем же идентификатором, эти операции будут выполняться над одним и тем же объектом.
The main types of data in Xlib are the Display structure and the types of the identifiers. Informally, a display is a physical or virtual device where graphical operations are done. The Display structure of the Xlib library contains information about the display, but more importantly it contains information relative to the channel between the client and the server. For example, in a Unix like operating system, the Display structure contains the file handle of the socket of this channel (this can be retrieved using the ConnectionNumber macro.) Most Xlib functions have a Display structure as an argument because they either operate on the channel or are relative to a specific channel. In particular, all Xlib functions that interact with the server need this structure for accessing the channel. Some other functions need this structure, even if they operate locally, because they operate on data relative to a specific channel. Operations of this kind include for example operations on the event queue, which is described below. Windows, colormaps, etc. are managed by the server, which means that the data about their actual implementation is all stored in the server. The client operates on these objects by using their identifiers. The client cannot directly operate on an object, but can only request the server to perform the operation specifying the identifier of the object. The types Windows, Pixmap, Font, Colormap, etc. are all identifiers, which are 32 bit integers (just as in the X11 protocol itself). A client 'creates' a window by requesting that the server create a window. This is done via a call to an Xlib function that returns an identifier for the window, that is, a number. This identifier can then be used by the client for requesting other operations on the same window to the server. The identifiers are unique to the server. Most of them can be used by different applications to refer to the same objects. For example, two applications connecting with the same server use the same identifier to refer to the same window. These two applications use two different channels, and therefore have two different structures; however, when they request operations on the same identifier, these operations will be done on the same object.
Протокол и события
Функции Xlib, отправляющие запросы на сервер, обычно не отправляют их немедленно, а сохраняют в буфере, называемом буфером запросов. Термин "запрос" в данном случае относится к запросу от клиента, направленному на сервер: буфер запросов может содержать любые запросы к серверу, а не только те, которые оказывают видимое воздействие на экран. Буфер запросов гарантированно будет сброшен (то есть все сделанные до этого запросы будут отправлены на сервер) после вызова функций XSync или XFlush, после вызова функции, возвращающей значение от сервера (эти функции блокируются до получения ответа), а также в некоторых других случаях. Xlib сохраняет полученные события в очереди. Клиентское приложение может просматривать и извлекать события из очереди. Хотя X-сервер отправляет события асинхронно, приложения, использующие библиотеку Xlib, должны явно вызывать функции Xlib для доступа к событиям в очереди. Некоторые из этих функций могут блокироваться; в этом случае они также сбрасывают буфер запросов. Ошибки, напротив, принимаются и обрабатываются асинхронно: приложение может предоставить обработчик ошибок, который будет вызываться при получении сообщения об ошибке от сервера. Содержимое окна не гарантируется сохраненным, если окно или его часть становятся невидимыми. В этом случае приложению отправляется событие Expose, когда окно или его часть снова становятся видимыми. После этого приложение должно перерисовать содержимое окна.
The Xlib functions that send requests to the server usually do not send these requests immediately but store them in a buffer, called the request buffer. The term request in this case refers to the request from the client that is directed to the server: the request buffer can contain all kinds of requests to the server, not only those having a visible effect on the screen. The request buffer is guaranteed to be flushed (i. e., all requests done so far are sent to the server) after a call to the functions XSync or XFlush, after a call to a function that returns a value from the server (these functions block until the answer is received), and in some other conditions. Xlib stores the received events in a queue. The client application can inspect and retrieve events from the queue. While the X server sends events asynchronously, applications using the Xlib library are required to explicitly call Xlib functions for accessing the events in the queue. Some of these functions may block; in this case, they also flush the request buffer. Errors are instead received and treated asynchronously: the application can provide an error handler that will be called whenever an error message from the server is received. The content of a window is not guaranteed to be preserved if the window or one of its parts are made not visible. In this case, the application is sent an Expose event when the window or one part of it is made visible again. The application is then supposed to draw the window content again.