#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <stdio.h>
#include <string.h>
#define X 0
#define Y 0
#define WIDTH 200
#define HEIGHT 200
#define WIDTH_MIN 50
#define HEIGHT_MIN 50
#define BORDER_WIDTH 5
#define TITLE "Example"
#define ICON_TITLE "Example"
#define PRG_CLASS "Example"
/*
* SetWindowManagerHints - функция, которая передает информацию о
* свойствах программы менеджеру окон.
*/
static void SetWindowManagerHints
(
Display * display,
/* указатель на структуру Display */
char *PClass,
/* класс программы */
char *argv[],
/* аргументы программы */
int argc,
/* число аргументов */
Window window,
/* идентификатор окна */
int x,
int y,
/* координаты левого верхнего угла окна*/
int win_wdt,
int win_hgt,
/* ширина и высота окна*/
int win_wdt_min,
int win_hgt_min,
char *ptrTitle,
/* заголовок окна */
char *ptrITitle,
/* заголовок пиктограммы окна */
Pixmap pixmap
/*Рисунок пиктограммы */
)
{
XSizeHints size_hints;
/*Рекомендации о размерах окна */
XWMHints wm_hints;
XClassHint class_hint;
XTextProperty windowname, iconname;
if (!XStringListToTextProperty(&ptrTitle, 1, &windowname) ||
!XStringListToTextProperty(&ptrITitle, 1, &iconname)) {
puts("No memory!\n");
exit(1);
}
size_hints.flags = PPosition | PSize | PMinSize;
size_hints.min_width = win_wdt_min;
size_hints.min_height = win_hgt_min;
wm_hints.flags = StateHint | IconPixmapHint | InputHint;
wm_hints.initial_state = NormalState;
wm_hints.input = True;
wm_hints.icon_pixmap = pixmap;
class_hint.res_name = argv[0];
class_hint.res_class = PClass;
XSetWMProperties(
display,
window,
&windowname,
&iconname,
argv, argc,
&size_hints,
&wm_hints,
&class_hint
);
}
/* main - основная функция программы */
void main(int argc, char *argv[])
{
Display *display;
/* Указатель на структуру Display */
int screen_number;
/* Номер экрана */
GC gc;
/* Графический контекст */
XEvent report;
Window window;
/* Устанавливаем связь с сервером */
if ((display = XOpenDisplay(NULL)) == NULL) {
puts("Can not connect to the X server!\n");
exit(1);
}
/* Получаем номер основного экрана */
screen_number = DefaultScreen(display);
/* Создаем окно */
window = XCreateSimpleWindow
(
display,
RootWindow(display, screen_number),
X, Y, WIDTH, HEIGHT, BORDER_WIDTH,
BlackPixel(display, screen_number),
WhitePixel(display, screen_number)
);
/* Задаем рекомендации для менеджера окон */
SetWindowManagerHints
(
display,
PRG_CLASS, argv, argc,
window, X, Y,
WIDTH, HEIGHT,
WIDTH_MIN, HEIGHT_MIN,
TITLE, ICON_TITLE, 0
);
/* Выбираем события, которые будет обрабатывать программа */
XSelectInput(display, window, ExposureMask | KeyPressMask);
/* Покажем окно */
XMapWindow(display, window);
/* Создадим цикл получения и обработки ошибок */
while (1) {
XNextEvent(display, &report);
switch (report.type) {
case Expose:
/* Запрос на перерисовку */
if (report.xexpose.count != 0)
break;
gc = XCreateGC
(
display,
window,
0,
NULL
);
XSetForeground
(
display,
gc,
BlackPixel
(
display,
0
)
);
XDrawString
(
display,
window,
gc,
20,
50,
"Hello, World!",
strlen("Hello, World!")
);
XFreeGC(display, gc);
XFlush(display);
break;
case KeyPress:
/* Выход нажатием клавиши клавиатуры */
XCloseDisplay(display);
exit(0);
}
}
}