http://www.asvcorp.ru/tech/linux/xwinprg/functions/index.html - Функции библиотеки Xlib
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://github.com/skeeto/pure-linux-threads-demo https://nullprogram.com/blog/2015/05/15/
https://evileg.com/ru/post/170/
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. Полищук А. П., Семериков С. А.
Такой код компилируестя и работает под современной версией 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.
<html> <!– Rating@Mail.ru counter –> <script> var _tmr = window._tmr || (window._tmr = []); _tmr.push({id: «2958242», type: «pageView», start: (new Date()).getTime()}); (function (d, w, id) {
if (d.getElementById(id)) return; var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id; ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js"; var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);}; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
})(document, window, «topmailru-code»); </script><noscript><div> <img src=«top-fwz1.mail.ru/counter?id=2958242;js=na» style=«border:0;position:absolute;left:-9999px;» alt=«counter» /> </div></noscript> <!– Rating@Mail.ru counter –> <!– Rating@Mail.ru logo –> <a class=«footerlink» href=«https://top.mail.ru/jump?from=2958242»> <img src=«top-fwz1.mail.ru/counter?id=2958242;t=479;l=1» style=«border:0;» height=«31» width=«88» alt=«Рейтинг@Mail.ru» /></a> <!– Rating@Mail.ru logo –> </html>