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. Рейтинг@Mail.ru