Subversion Repositories Kolibri OS

Rev

Rev 9898 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016, 2019, 2021, 2022 Anton Krotov
  3.  
  4.     This file is part of fb2read.
  5.  
  6.     fb2read is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     fb2read is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with fb2read. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE SysUtils;
  21.  
  22. IMPORT K := KOSAPI, sys := SYSTEM, S := Strings;
  23.  
  24.  
  25. CONST
  26.  
  27.   L_BUTTON* = 0;
  28.  
  29.   FontH* = 16;
  30.   FontW* =  8;
  31.  
  32.  
  33. TYPE
  34.  
  35.   ENTRY* = PROCEDURE;
  36.  
  37.  
  38. VAR
  39.         (*darkColor*,*) lightColor*,
  40.     winColor*, textColor*, btnColor*, btnTextColor*,
  41.     borderColor*: INTEGER;
  42.  
  43.  
  44. PROCEDURE GetParam*(VAR Param: S.STRING);
  45. VAR
  46.   adr    : INTEGER;
  47.   c      : CHAR;
  48.   i, max : INTEGER;
  49. BEGIN
  50.   adr := K.GetCommandLine();
  51.   i := 0;
  52.   max := LEN(Param) - 1;
  53.   REPEAT
  54.     sys.GET(adr, c);
  55.     INC(adr);
  56.     Param[i] := c;
  57.     INC(i)
  58.   UNTIL (c = 0X) OR (i = max);
  59.   Param[i] := 0X;
  60.   S.Trim(Param, 20X);
  61.   S.Trim(Param, 22X)
  62. END GetParam;
  63.  
  64.  
  65. PROCEDURE Halt*;
  66. BEGIN
  67.     K.sysfunc1(-1)
  68. END Halt;
  69.  
  70.  
  71. PROCEDURE Run*(program: S.STRING; param: INTEGER);
  72. TYPE
  73.  
  74.   info_struct = RECORD
  75.     subfunc : INTEGER;
  76.     flags   : INTEGER;
  77.     param   : INTEGER;
  78.     rsrvd1  : INTEGER;
  79.     rsrvd2  : INTEGER;
  80.     fname   : ARRAY 1024 OF CHAR
  81.   END;
  82.  
  83. VAR
  84.   info: info_struct;
  85.  
  86. BEGIN
  87.   info.subfunc := 7;
  88.   info.flags   := 0;
  89.   info.param   := param;
  90.   info.rsrvd1  := 0;
  91.   info.rsrvd2  := 0;
  92.   COPY(program, info.fname);
  93.   K.sysfunc2(70, sys.ADR(info))
  94. END Run;
  95.  
  96.  
  97. PROCEDURE ErrorIf*(condition: BOOLEAN; code: INTEGER);
  98. VAR str, str2: S.STRING;
  99. BEGIN
  100.   IF condition THEN
  101.     str := "'FB2 ERROR: ";
  102.     S.IntToString(code, str2);
  103.     S.Append(str, str2);
  104.     S.Append(str, "' -E");
  105.     Run("/sys/@notify", sys.ADR(str[0]));
  106.     Halt
  107.   END
  108. END ErrorIf;
  109.  
  110.  
  111. PROCEDURE MemError*(err: BOOLEAN);
  112. BEGIN
  113.   ErrorIf(err, 13)
  114. END MemError;
  115.  
  116.  
  117. PROCEDURE MinMax*(VAR value: INTEGER; min, max: INTEGER);
  118. BEGIN
  119.   value := MIN(MAX(value, min), max)
  120. END MinMax;
  121.  
  122.  
  123. PROCEDURE MousePos*(VAR X, Y: INTEGER);
  124. VAR res: INTEGER;
  125. BEGIN
  126.   res := K.sysfunc2(37, 0);
  127.   X := LSR(res, 16);
  128.   Y := ORD(BITS(res) * {0..15});
  129. END MousePos;
  130.  
  131.  
  132. PROCEDURE MouseVScroll*(): INTEGER;
  133.         RETURN ASR(LSL(K.sysfunc2(37, 7), 16), 16)
  134. END MouseVScroll;
  135.  
  136.  
  137. PROCEDURE MouseStatus*(): SET;
  138.   RETURN BITS(K.sysfunc2(37, 2))
  139. END MouseStatus;
  140.  
  141.  
  142. PROCEDURE WindowRedrawStatus*(status: INTEGER);
  143. BEGIN
  144.     K.sysfunc2(12, status)
  145. END WindowRedrawStatus;
  146.  
  147.  
  148. PROCEDURE DefineAndDrawWindow*(Left, Top, Width, Height, Color, Style: INTEGER; Caption: ARRAY OF CHAR);
  149. BEGIN
  150.     K.sysfunc6(0, LSL(Left, 16) + Width, LSL(Top, 16) + Height, Color + LSL(Style, 24), 0, sys.ADR(Caption[0]))
  151. END DefineAndDrawWindow;
  152.  
  153.  
  154. PROCEDURE WaitForEvent*(): INTEGER;
  155.   RETURN K.sysfunc1(10)
  156. END WaitForEvent;
  157.  
  158.  
  159. PROCEDURE CheckEvent*(): INTEGER;
  160.   RETURN K.sysfunc1(11)
  161. END CheckEvent;
  162.  
  163.  
  164. PROCEDURE SetEventsMask*(mask: SET);
  165. BEGIN
  166.     K.sysfunc2(40, ORD(mask))
  167. END SetEventsMask;
  168.  
  169.  
  170. PROCEDURE GetKeyCode*(): INTEGER;
  171.   RETURN LSR(LSL(K.sysfunc1(2), 16), 24)
  172. END GetKeyCode;
  173.  
  174.  
  175. PROCEDURE GetButtonCode*(): INTEGER;
  176. VAR res, button_code: INTEGER;
  177. BEGIN
  178.   res := K.sysfunc1(17);
  179.   IF ORD(BITS(res) * {0..7}) = 0 THEN
  180.     button_code := LSR(res, 8)
  181.   ELSE
  182.     button_code := 0
  183.   END
  184.   RETURN button_code
  185. END GetButtonCode;
  186.  
  187.  
  188. PROCEDURE OutText*(X, Y: INTEGER; Text: ARRAY OF CHAR; length: INTEGER; color: INTEGER);
  189. BEGIN
  190.     K.sysfunc6(4, LSL(X, 16) + Y, LSL(3 * 16, 24) + color, sys.ADR(Text[0]), length, 0)
  191. END OutText;
  192.  
  193.  
  194. PROCEDURE GetWindowPos*(VAR Left, Top: INTEGER);
  195. VAR info: ARRAY 1024 OF CHAR;
  196. BEGIN
  197.   K.sysfunc3(9, sys.ADR(info[0]), -1);
  198.   sys.GET(sys.ADR(info[34]), Left);
  199.   sys.GET(sys.ADR(info[38]), Top)
  200. END GetWindowPos;
  201.  
  202.  
  203. PROCEDURE GetWindowSize*(VAR Width, Height: INTEGER);
  204. VAR info: ARRAY 1024 OF CHAR;
  205. BEGIN
  206.   K.sysfunc3(9, sys.ADR(info[0]), -1);
  207.   sys.GET(sys.ADR(info[42]), Width);
  208.   sys.GET(sys.ADR(info[46]), Height)
  209. END GetWindowSize;
  210.  
  211.  
  212. PROCEDURE SetWindowSize*(Width, Height: INTEGER);
  213. BEGIN
  214.     K.sysfunc5(67, -1, -1, Width, Height)
  215. END SetWindowSize;
  216.  
  217.  
  218. PROCEDURE GetScreenSize*(VAR Width, Height: INTEGER);
  219. VAR res: INTEGER;
  220. BEGIN
  221.   res := K.sysfunc1(14);
  222.   Width := LSR(res, 16) + 1;
  223.   Height := ORD(BITS(res) * {0..15}) + 1
  224. END GetScreenSize;
  225.  
  226.  
  227. PROCEDURE GetScreenArea*(VAR X1, Y1, X2, Y2: INTEGER);
  228. VAR eax, ebx: INTEGER;
  229. BEGIN
  230.   eax := K.sysfunc22(48, 5, ebx);
  231.   X1 := LSR(eax, 16);
  232.   Y1 := LSR(ebx, 16);
  233.   X2 := ORD(BITS(eax) * {0..15});
  234.   Y2 := ORD(BITS(ebx) * {0..15})
  235. END GetScreenArea;
  236.  
  237.  
  238. PROCEDURE SkinHeight*(): INTEGER;
  239.   RETURN K.sysfunc2(48, 4)
  240. END SkinHeight;
  241.  
  242.  
  243. PROCEDURE DrawRect*(Left, Top, Width, Height, Color: INTEGER);
  244. BEGIN
  245.     K.sysfunc4(13, LSL(Left, 16) + Width, LSL(Top, 16) + Height, Color)
  246. END DrawRect;
  247.  
  248.  
  249. PROCEDURE NewThread*(eip: ENTRY; stack: ARRAY OF CHAR): INTEGER;
  250. VAR entry: INTEGER;
  251. BEGIN
  252.   sys.GET(sys.ADR(eip), entry)
  253.   RETURN K.sysfunc4(51, 1, entry, sys.ADR(stack[0]) + LEN(stack))
  254. END NewThread;
  255.  
  256.  
  257. PROCEDURE Pause*(time: INTEGER);
  258. BEGIN
  259.     K.sysfunc2(5, time)
  260. END Pause;
  261.  
  262.  
  263. PROCEDURE GetThreadSlot*(PID: INTEGER): INTEGER;
  264.   RETURN K.sysfunc3(18, 21, PID)
  265. END GetThreadSlot;
  266.  
  267.  
  268. PROCEDURE TerminateThreadId*(PID: INTEGER);
  269. BEGIN
  270.     K.sysfunc3(18, 18, PID)
  271. END TerminateThreadId;
  272.  
  273.  
  274. PROCEDURE IsTerminated*(PID: INTEGER): BOOLEAN;
  275.   RETURN GetThreadSlot(PID) = 0
  276. END IsTerminated;
  277.  
  278.  
  279. PROCEDURE FocusWindow*(Slot: INTEGER);
  280. BEGIN
  281.     K.sysfunc3(18, 3, Slot)
  282. END FocusWindow;
  283.  
  284.  
  285. PROCEDURE CreateButton*(id, Left, Top, Width, Height, Color: INTEGER; Caption: ARRAY OF CHAR);
  286. VAR
  287.   X, Y, len: INTEGER;
  288.  
  289. BEGIN
  290.   len := LENGTH(Caption);
  291.   K.sysfunc5(8, LSL(Left, 16) + Width, LSL(Top, 16) + Height, id, btnColor);
  292.   X := Left + (Width - FontW * len) DIV 2;
  293.   Y := Top + (Height - FontH) DIV 2 + 1;
  294.   OutText(X, Y, Caption, len, btnTextColor)
  295. END CreateButton;
  296.  
  297.  
  298. PROCEDURE DrawLine* (x1, y1, x2, y2: INTEGER; color: INTEGER);
  299. BEGIN
  300.         K.sysfunc4(38, x1*65536 + x2, y1*65536 + y2, color)
  301. END DrawLine;
  302.  
  303.  
  304. PROCEDURE Box*(Left, Top, Width, Height, BrushColor, PenColor: INTEGER);
  305. BEGIN
  306.   K.sysfunc4(13, LSL(Left, 16) + Width, LSL(Top, 16) + Height, BrushColor);
  307.   DrawLine(Left, Top, Left + Width, Top, PenColor);
  308.   DrawLine(Left + Width, Top, Left + Width, Top + Height, PenColor);
  309.   DrawLine(Left + Width, Top + Height, Left, Top + Height, PenColor);
  310.   DrawLine(Left, Top + Height, Left, Top, PenColor);
  311. END Box;
  312.  
  313.  
  314. PROCEDURE LoadCursor*(cursor: INTEGER): INTEGER;
  315.   RETURN K.sysfunc4(37, 4, cursor, 1)
  316. END LoadCursor;
  317.  
  318.  
  319. PROCEDURE SetCursor*(handle: INTEGER);
  320. BEGIN
  321.     K.sysfunc3(37, 5, handle)
  322. END SetCursor;
  323.  
  324.  
  325. PROCEDURE DelCursor*(handle: INTEGER);
  326. BEGIN
  327.     K.sysfunc3(37, 6, handle)
  328. END DelCursor;
  329.  
  330.  
  331. PROCEDURE DrawImage* (data, sizeX, sizeY, x, y: INTEGER);
  332. BEGIN
  333.     K.sysfunc4(7, data, sizeX*65536 + sizeY, x*65536 + y)
  334. END DrawImage;
  335.  
  336.  
  337. PROCEDURE DrawText69* (x, y, color: INTEGER; text: ARRAY OF CHAR);
  338. BEGIN
  339.     K.sysfunc6(4, x*65536 + y, color + LSL(080H, 24), sys.ADR(text[0]), 0, 0)
  340. END DrawText69;
  341.  
  342.  
  343. PROCEDURE PutPixel* (x, y, color: INTEGER);
  344. BEGIN
  345.         K.sysfunc5(1, x, y, color, 0)
  346. END PutPixel;
  347.  
  348.  
  349. PROCEDURE GetSystemColors*;
  350. VAR
  351.     buf: ARRAY 10 OF INTEGER;
  352. BEGIN
  353.     ASSERT(LEN(buf) >= 10);
  354.     K.sysfunc4(48, 3, sys.ADR(buf[0]), 40);
  355.         (*darkColor := buf[2];*)
  356.         lightColor := buf[3];
  357.     winColor := buf[5];
  358.     textColor := buf[8];
  359.     btnColor := buf[6];
  360.     btnTextColor := buf[7];
  361.     borderColor := buf[9];
  362. END GetSystemColors;
  363.  
  364.  
  365. END SysUtils.
  366.