http://www.asvcorp.ru/tech/linux/xwinprg/functions/index.html - Функции библиотеки Xlib
https://coderoad.ru/13351297/%D0%9A%D0%B0%D0%BA%D0%BE%D0%B2%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%B0-XInitThreads
https://www.x.org/releases/X11R7.5/doc/man/man3/XInitThreads.3.html
https://jeka.by/ask/141/ubuntu-autoload-rc.local/
Можно скопировать приложение из /usr/share/applications/AppName.desktop в /etc/xdg/autostart
https://coderoad.ru/49491918/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8-%D0%BA%D0%BB%D1%8E%D1%87%D0%B0-%D0%B8%D0%B7-keycode-X11-XGrabKey
https://github.com/skeeto/pure-linux-threads-demo
https://nullprogram.com/blog/2015/05/15/
https://evileg.com/ru/post/170/
{{ :pro_pol:xlib.odt |xlib.odt}}
{{ :pro_pol:xlib.pdf |xlib.pdf}}
https://tldp.org/HOWTO/XWindow-User-HOWTO/runningx.html
http://dfe.petrsu.ru/koi/posob/X/index.html
https://specifications.freedesktop.org/shared-mime-info-spec/latest/
https://www.linux.org.ru/forum/development/578330?cid=578951
====== Исправление в коде статьи Программирование в X Window средствами Free Pascal. Полищук А. П., Семериков С. А. ======
http://litresp.ru/chitat/ru/%D0%9F/polischuk-a-p/programmirovanie-v-x-window-sredstvami-free-pascal#sec_2
Такой код компилируестя и работает под современной версией FreePascal:
{$MODE OBJFPC}
uses x,xlib,xutil,strings;
const
WND_X=0;
WND_Y=0;
WND_WDT=100;
WND_HGH=100;
WND_MIN_WDT=50;
WND_MIN_HGH=50;
WND_BORDER_WDT=5;
WND_TITLE='Hello!';
WND_ICON_TITLE='Hello!';
PRG_CLASS='Hello!';
(* SetWindowManagerHints - процедура передает информацию о свойствах программы менеджеру окон. *)
procedure SetWindowManagerHints(
prDisplay: PDisplay; (*Указатель на структуру TDisplay *)
psPrgClass: PChar; (*Класс программы *)
argv: PPChar; (*Аргументы программы *)
argc: integer; (*Число аргументов *)
nWnd: TWindow; (*Идентификатор окна *)
x, (*Координаты левого верхнего *)
y, (*угла окна *)
nWidth,
nHeight, (*Ширина и высота окна *)
nMinWidth,
nMinHeight:integer; (*Минимальные ширина и высота окна *)
psTitle: PChar; (*Заголовок окна *)
psIconTitle: PChar; (*Заголовок пиктограммы окна *)
nIconPixmap: TPixmap (*Рисунок пиктограммы *)
);
var
rSizeHints: TXSizeHints; (*Рекомендации о размерах окна*)
rWMHints: TXWMHints;
rClassHint: TXClassHint;
prWindowName, prIconName: TXTextProperty;
begin
if (XStringListToTextProperty(@psTitle, 1, @prWindowName)=0) or
(XStringListToTextProperty(@psIconTitle, 1, @prIconName)=0) then
begin
writeln('No memory!');
halt(1);
end;
rSizeHints.flags:= PPosition OR PSize OR PMinSize;
rSizeHints.min_width:= nMinWidth;
rSizeHints.min_height:= nMinHeight;
rWMHints.flags:= StateHint OR IconPixmapHint OR InputHint;
rWMHints.initial_state:= NormalState;
rWMHints.input:= 1; // True;
rWMHints.icon_pixmap:= nIconPixmap;
rClassHint.res_name:= argv[0];
rClassHint.res_class:= psPrgClass;
XSetWMProperties(prDisplay, nWnd, @prWindowName, @prIconName, argv, argc, @rSizeHints, @rWMHints, @rClassHint);
end;
(* main - основная процедура программы *)
//void main(int argc, char *argv[])
var
prDisplay: PDisplay; (* Указатель на структуру Display *)
nScreenNum: integer; (* Номер экрана *)
prGC: TGC;
rEvent: TXEvent;
nWnd: TWindow;
atom1, atom2 : TAtom;
begin
(* Устанавливаем связь с сервером *)
prDisplay:= XOpenDisplay(nil);
if prDisplay = nil then begin
writeln('Can not connect to the X server!');
halt (1);
end;
(* Получаем номер основного экрана *)
nScreenNum:= XDefaultScreen(prDisplay);
(* Создаем окно *)
nWnd:= XCreateSimpleWindow(prDisplay, XRootWindow (prDisplay, nScreenNum), WND_X, WND_Y, WND_WDT, WND_HGH, WND_BORDER_WDT, XBlackPixel (prDisplay, nScreenNum),
XWhitePixel (prDisplay, nScreenNum));
(* Задаем рекомендации для менеджера окон *)
SetWindowManagerHints(prDisplay, PRG_CLASS, argv, argc, nWnd, WND_X, WND_Y, WND_WDT, WND_HGH, WND_MIN_WDT, WND_MIN_HGH, WND_TITLE, WND_ICON_TITLE, 0);
(* Выбираем события, обрабатываемые программой *)
XSelectInput(prDisplay, nWnd, ExposureMask OR KeyPressMask OR StructureNotifyMask OR ButtonPressMask);
(* Показываем окно *)
XMapWindow(prDisplay, nWnd);
(* Добавляем возможность корректного закрытия окна *)
atom1 := XInternAtom(prdisplay, 'WM_PROTOCOLS', 0);
atom2 := XInternAtom(prdisplay, 'WM_DELETE_WINDOW', 0);
XSetWMProtocols(prdisplay, nwnd, @atom2, 1);
(* Цикл получения и обработки событий *)
while (true) do begin
XNextEvent(prDisplay, @rEvent);
// case (rEvent.eventtype) of
case (rEvent._type) of
Expose:
begin
(* Запрос на перерисовку *)
if (rEvent.xexpose.count <> 0) then continue;
prGC:= XCreateGC (prDisplay, nWnd, 0, nil );
XSetForeground(prDisplay, prGC, XBlackPixel (prDisplay, 0));
XDrawString(prDisplay, nWnd, prGC, 10, 50, 'Hello, world!', strlen ('Hello, world!'));
XFreeGC (prDisplay, prGC);
end;
DestroyNotify,
KeyPress:
begin
(* Нажатие клавиши клавиатуры *)
XCloseDisplay(prDisplay);
halt(0);
end;
ClientMessage: begin
if((revent.xclient.message_type = atom1) and (revent.xclient.data.l[0] = atom2))
then begin
XDestroyWindow(prdisplay, nwnd);
end;
break;
end;
end;
end;
end.