Interested Article - Xlib
- 2021-07-06
- 2
Xlib ( X library , рус. библиотека «икс» ) — библиотека функций клиента системы X Window , написанная на языке Си .
Содержит функции для взаимодействия с т. н. X-сервером. Библиотека позволяет использовать более высокий уровень абстракции , без знания деталей работы основного протокола системы X Window .
Некоторые пользовательские приложения используют Xlib напрямую (например, Opera ), другие используют специальные инструментарии « виджетов » - «надстройки» над базовой библиотекой Xlib.
- Встроенные средства (Xt)
- Набор виджетов Athena (Xaw)
- Motif
- GTK+
- Qt (версия для X11)
- wxWidgets
- SDL
- SFML
Библиотека Xlib появилась около 1985 года и на настоящее время используется как основа и как основной графический интерфейс пользователя во многих Юникс -подобных операционных системах .
Библиотека XCB - попытка разработки замены Xlib.
Функции XLib
Функции XLib могут быть сгруппированы в несколько категорий:
-
Операции управления соединением с X сервером, такие как
XOpenDisplay
,XCloseDisplay
-
Запросы X серверу, такие как
XCreateWindow
,XCreateSimpleWindow
,XCreateGC
,XCreateColomap
-
Операции клиентской части, такие как управления событиями:
XNextEvent
, или операции с локальными даннымиXCreateImage
.
Пример программы
Следующий пример программы устанавливает соединение с X сервером и выводит на экран окно с приветствием:
/*
Компилируется след. строкой: cc test.c -o test -lX11
*/
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
extern int errno;
int main(void) {
Display *d;
Window w;
XEvent e;
const char *msg = "Hello, World!";
int s;
/* Соединиться с X сервером, если X сервер на удаленной машине
* следует разрешить на машине, где запущен X Server
* удаленные соединения командой xhost+ (см. man xhost)
*/
if ((d = XOpenDisplay(getenv("DISPLAY"))) == NULL) {
printf("Can't connect X server:%s\n", strerror(errno));
exit(1);
}
s = XDefaultScreen(d);
/* Создать окно */
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1,
XBlackPixel(d, s), XWhitePixel(d, s));
/* На какие события будем реагировать */
XSelectInput(d, w, ExposureMask | KeyPressMask);
/* Вывести окно на экран */
XMapWindow(d, w);
/* Бесконечный цикл обработки событий */
while (1) {
XNextEvent(d, &e);
/* Перерисовать окно */
if (e.type == Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
}
/* При нажатии кнопки-выход */
if (e.type == KeyPress)
break;
}
/* Закрыть соединение с X сервером */
XCloseDisplay(d);
return 0;
}
Клиент (программа) создает соединение с X сервером функцией
XOpenDisplay
, в которую передается указатель на DISPLAY, определенный через переменную среды исполнения. В
UNIX
это можно сделать командой export DISPLAY=":0.0". В качестве переменной DISPLAY можно указать и удаленную машину с запущенным X сервером. Функция (макрос)
DefaultScreen
выбирает текущий экран (в X Window может быть несколько экранов),
XCreateSimpleWindow
создает окно, а
XSelectInput
определяет события, на которые окно должно реагировать.
XMapWindow
выводит окно на экран, а
XNextEvent
выбирает из очереди событие, которое выше было определено. При событии
Expose
в окне рисуется прямоугольник и выводится строка "Hello World!". При нажатии клавиши на клавиатуре программа завершает работу.
Ссылки
- (англ.)
- (англ.)
- (англ.) от 20 мая 2013 на Wayback Machine
- (англ.)
- (англ.)
- (англ.)
- (рус.)
- (рус.) (недоступная ссылка с 14-05-2013 [3940 дней] — )
- (рус.)
- 2021-07-06
- 2