[ Назад ] [ Содержание ] [ Далее ]

Открываем простое окно

     Напишем прогамму, которая будет открывать окно на экране X-сервера.

     Цикл работы с окном в программе можно разделить на следующие этапы:

  1. Подготовка данных, описывающих создаваемое окно;
  2. Создание окна;
  3. Включение окна;
  4. Закрытие окна;

     Создать окно можно двумя функциями: XCreateWindow или XCreateSimpleWindow. Вторая функция сделана для того случая, когда нет необходмости детально описывать параметры окна и Вам надо просто и быстро открыть окно. Первая функция позволяет более детально описать параметры создаваемого окна.

     Посkt создания окно на экране не появится, оно останется невидимым. Для того, чтобы сделать окно видимым, необходимо включить окно функцией XMapWindow. Такое сделано прежде всего для того, чтобы программа после создания окна могла заполнить окно дочерними окнами, прежде, чем оно появится на экране. Если создается много дочерних окон, то при включении окна для появления дочерних окон достаточно будет выполнить функцию XMapSubwindows и все окна сразу появятся. Если же давать команду включения на каждое дочернее окно по-отдельности, то их появление на экране не будет одновременным, что будет выглядеть несколько неприглядно.

     Программа также может просто заранее подготовить несколько окон и затем лишь давать команды на включение и выключение окон вместо открытия и закрытия, что заметно увеличит скорость работы программы при удаленной работе.

     Подчастую, некоторые параметры, например первоначальная позиция на экране, могут принудительно переназначаться оконным менеджером. Поэтому, если для программы важно положение окна на экране, необходимо перед включением окна на экране переместить его в нужное место. Как это делается, мы рассмотрим позже.

    И наконец, закрытие окна происходит вызовом функции XDestroyWindow.

Пример ex001.c:
#include <stdio.h>
#include <X11/Xlib.h>

int main()
 {
  Display *ourDisplay;
  
  ourDisplay=XOpenDisplay(NULL);
  if (ourDisplay==NULL)
    {
      printf("Не удалось установить соединение с графическим терминалом.\n");
      return 1;
    };

  /* Получим предварительные сведения */
  ourScreen=DefaultScreen(ourDisplay);          // Экран по-умолчанию
  rootWindow=RootWindow(ourDisplay, ourScreen); // Корневое окно
  bgcolor=WhitePixel(ourDisplay, ourScreen);    // Белый цвет экрана

  /* Открываем окно */
  myWindow=XCreateSimpleWindow(ourDisplay,rootWindow,100, 100, 320, 200,
    0, 0, bgcolor);
    
  /* Делаем окно видимым */
  XMapWindow(ourDisplay, myWindow);
  
  /* Все сформированные команды принудительно сбрасываем на сервер */
  XFlush(ourDisplay);

  /* Спим 5 секунд */
  sleep(5);
  
  /* Уничтожаем окно */
  XDestroyWindow(ourDisplay, myWindow);

  /* Закрываем соединение с сервером */
  XCloseDisplay(ourDisplay);

  return 0;
 };

    При запуске программы обратите внимание, что если закрыть окно вручную, пока программа находится в режиме спячки, выполнение программы не будет прервано. Но как только будет произведен вызов какой-либо из функций Xlib, работающей с переменной ourDisplay, программа выполнит аварийное завершение.

    Ситуация будет другой, если закрыть программу - по ctrl+c или через команду kill. По-умолчанию все окна приложения сразу-же исчезнут с экрана. Иногда такое бывает неудобно при разработке, когда высока вероятность того, что программа из-за ошибки может быть аварийно закрыта операционной системой. Чтобы информация не исчезала с экрана X-сервера при закрытии программы, можно воспользоваться функцией XSetCloseDownMode.


[ Назад ] [ Содержание ] [ Далее ]