Progulki-po-reke-moskwa.ru

прогулки на теплоходе по Москве реке

Xlib

14-10-2023

Xlib (X library, рус. библиотека «икс») — библиотека функций клиента системы X Window, написанная на языке Си.

Содержит функции для взаимодействия с т. н. X-сервером. Библиотека позволяет использовать более высокий уровень абстракции, без знания деталей работы основного протокола системы X Window.

Некоторые пользовательские приложения используют Xlib напрямую (например, Opera), другие используют специальные инструментарии «виджетов» - «надстройки» над базовой библиотекой Xlib.

Xlib и другие библиотеки её использующие

Библиотека Xlib появилась около 1985 года и на настоящее время используется как основа и как основной графический интерфейс пользователя во многих Юникс-подобных операционных системах.

Библиотека XCB - попытка разработки замены Xlib.

Функции XLib

Функции XLib могут быть сгруппированы в несколько категорий:

  1. Операции управления соединением с X сервером, такие как XOpenDisplay, XCloseDisplay
  2. Запросы X серверу, такие как XCreateWindow, XCreateSimpleWindow, XCreateGC, XCreateColomap
  3. Операции клиентской части, такие как управления событиями: 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;
   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 = DefaultScreen(d);
 
   /* Создать окно */
   w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1,
                           BlackPixel(d, s), WhitePixel(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!". При нажатии клавиши на клавиатуре программа завершает работу.

Ссылки

  •  (англ.) Руководство по программированию с использованием библиотеки Xlib
  •  (англ.) Список функций библиотеки Xlib
  •  (англ.) Kenton Lee's pages on X Window and Motif
  •  (англ.) Учебник по Xlib
  •  (англ.) Подробный обучающий курс Xlib
  •  (англ.) Использование Xlib для создания скринсейвера
  •  (рус.) Xlib - интерфейс с X Window на языке C
  •  (рус.) Программирование с Xlib на C++
  •  (рус.) Программирование в среде X Window на основе библиотеки Xlib

Xlib.

© 2021–2023 progulki-po-reke-moskwa.ru, Россия, Нальчик, ул. Терская 11, +7 (8662) 65-82-84