Инструменты пользователя

Инструменты сайта


pro_pol:исправление_в_коде_статьи_программирование_в_x_window_средствами_free_pascal._полищук_а._п._семериков_с._а

Исправление в коде статьи Программирование в 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;
 
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);
 (* Показываем окно *)
 XMapWindow(prDisplay, nWnd);
 
 (* Цикл получения и обработки событий *)
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;
 KeyPress:
   begin
    (* Нажатие клавиши клавиатуры *)
    XCloseDisplay(prDisplay);
    halt(0);
   end;
end;
 end;
end.

counter
Рейтинг@Mail.ru

pro_pol/исправление_в_коде_статьи_программирование_в_x_window_средствами_free_pascal._полищук_а._п._семериков_с._а.txt · Последние изменения: 2019/02/13 19:25 — dwadmin