Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2016, 2019, 2021-2023 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, 3))
  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 GetKey* (): INTEGER;
  171.     RETURN K.sysfunc1(2)
  172. END GetKey;
  173.  
  174.  
  175. PROCEDURE GetControlKeys* (): SET;
  176.     RETURN BITS(K.sysfunc2(66, 3))
  177. END GetControlKeys;
  178.  
  179.  
  180. PROCEDURE getKBState* (VAR shift, ctrl: BOOLEAN);
  181. VAR
  182.     kbState: SET;
  183. BEGIN
  184.     kbState := GetControlKeys();
  185.     shift := {0, 1} * kbState # {};
  186.     ctrl := {2, 3} * kbState # {};
  187. END getKBState;
  188.  
  189.  
  190. PROCEDURE GetButtonCode*(): INTEGER;
  191. VAR res, button_code: INTEGER;
  192. BEGIN
  193.   res := K.sysfunc1(17);
  194.   IF ORD(BITS(res) * {0..7}) = 0 THEN
  195.     button_code := LSR(res, 8)
  196.   ELSE
  197.     button_code := 0
  198.   END
  199.   RETURN button_code
  200. END GetButtonCode;
  201.  
  202.  
  203. PROCEDURE OutText*(X, Y: INTEGER; Text: ARRAY OF CHAR; length: INTEGER; color: INTEGER);
  204. BEGIN
  205.     K.sysfunc6(4, LSL(X, 16) + Y, LSL(3 * 16, 24) + color, sys.ADR(Text[0]), length, 0)
  206. END OutText;
  207.  
  208.  
  209. PROCEDURE GetWindowPos*(VAR Left, Top: INTEGER);
  210. VAR info: ARRAY 1024 OF CHAR;
  211. BEGIN
  212.   K.sysfunc3(9, sys.ADR(info[0]), -1);
  213.   sys.GET(sys.ADR(info[34]), Left);
  214.   sys.GET(sys.ADR(info[38]), Top)
  215. END GetWindowPos;
  216.  
  217.  
  218. PROCEDURE GetWindowSize*(VAR Width, Height: INTEGER);
  219. VAR info: ARRAY 1024 OF CHAR;
  220. BEGIN
  221.   K.sysfunc3(9, sys.ADR(info[0]), -1);
  222.   sys.GET(sys.ADR(info[42]), Width);
  223.   sys.GET(sys.ADR(info[46]), Height)
  224. END GetWindowSize;
  225.  
  226.  
  227. PROCEDURE SetWindowSize*(Width, Height: INTEGER);
  228. BEGIN
  229.     K.sysfunc5(67, -1, -1, Width, Height)
  230. END SetWindowSize;
  231.  
  232.  
  233. PROCEDURE GetScreenSize*(VAR Width, Height: INTEGER);
  234. VAR res: INTEGER;
  235. BEGIN
  236.   res := K.sysfunc1(14);
  237.   Width := LSR(res, 16) + 1;
  238.   Height := ORD(BITS(res) * {0..15}) + 1
  239. END GetScreenSize;
  240.  
  241.  
  242. PROCEDURE GetScreenArea*(VAR X1, Y1, X2, Y2: INTEGER);
  243. VAR eax, ebx: INTEGER;
  244. BEGIN
  245.   eax := K.sysfunc22(48, 5, ebx);
  246.   X1 := LSR(eax, 16);
  247.   Y1 := LSR(ebx, 16);
  248.   X2 := ORD(BITS(eax) * {0..15});
  249.   Y2 := ORD(BITS(ebx) * {0..15})
  250. END GetScreenArea;
  251.  
  252.  
  253. PROCEDURE SkinHeight*(): INTEGER;
  254.   RETURN K.sysfunc2(48, 4)
  255. END SkinHeight;
  256.  
  257.  
  258. PROCEDURE DrawRect*(Left, Top, Width, Height, Color: INTEGER);
  259. BEGIN
  260.     K.sysfunc4(13, LSL(Left, 16) + Width, LSL(Top, 16) + Height, Color)
  261. END DrawRect;
  262.  
  263.  
  264. PROCEDURE NewThread*(eip: ENTRY; stack: ARRAY OF CHAR): INTEGER;
  265. VAR entry: INTEGER;
  266. BEGIN
  267.   sys.GET(sys.ADR(eip), entry)
  268.   RETURN K.sysfunc4(51, 1, entry, sys.ADR(stack[0]) + LEN(stack))
  269. END NewThread;
  270.  
  271.  
  272. PROCEDURE Pause*(time: INTEGER);
  273. BEGIN
  274.     K.sysfunc2(5, time)
  275. END Pause;
  276.  
  277.  
  278. PROCEDURE GetThreadSlot*(PID: INTEGER): INTEGER;
  279.   RETURN K.sysfunc3(18, 21, PID)
  280. END GetThreadSlot;
  281.  
  282.  
  283. PROCEDURE TerminateThreadId*(PID: INTEGER);
  284. BEGIN
  285.     K.sysfunc3(18, 18, PID)
  286. END TerminateThreadId;
  287.  
  288.  
  289. PROCEDURE IsTerminated*(PID: INTEGER): BOOLEAN;
  290.   RETURN GetThreadSlot(PID) = 0
  291. END IsTerminated;
  292.  
  293.  
  294. PROCEDURE FocusWindow*(Slot: INTEGER);
  295. BEGIN
  296.     K.sysfunc3(18, 3, Slot)
  297. END FocusWindow;
  298.  
  299.  
  300. PROCEDURE CreateButton*(id, Left, Top, Width, Height, Color: INTEGER; Caption: ARRAY OF CHAR);
  301. VAR
  302.   X, Y, len: INTEGER;
  303.  
  304. BEGIN
  305.   len := LENGTH(Caption);
  306.   K.sysfunc5(8, LSL(Left, 16) + Width, LSL(Top, 16) + Height, id, btnColor);
  307.   X := Left + (Width - FontW * len) DIV 2;
  308.   Y := Top + (Height - FontH) DIV 2 + 1;
  309.   OutText(X, Y, Caption, len, btnTextColor)
  310. END CreateButton;
  311.  
  312.  
  313. PROCEDURE DrawLine* (x1, y1, x2, y2: INTEGER; color: INTEGER);
  314. BEGIN
  315.         K.sysfunc4(38, x1*65536 + x2, y1*65536 + y2, color)
  316. END DrawLine;
  317.  
  318.  
  319. PROCEDURE Box*(Left, Top, Width, Height, BrushColor, PenColor: INTEGER);
  320. BEGIN
  321.   K.sysfunc4(13, LSL(Left, 16) + Width, LSL(Top, 16) + Height, BrushColor);
  322.   DrawLine(Left, Top, Left + Width, Top, PenColor);
  323.   DrawLine(Left + Width, Top, Left + Width, Top + Height, PenColor);
  324.   DrawLine(Left + Width, Top + Height, Left, Top + Height, PenColor);
  325.   DrawLine(Left, Top + Height, Left, Top, PenColor);
  326. END Box;
  327.  
  328.  
  329. PROCEDURE LoadCursor*(cursor: INTEGER): INTEGER;
  330.   RETURN K.sysfunc4(37, 4, cursor, 1)
  331. END LoadCursor;
  332.  
  333.  
  334. PROCEDURE SetCursor*(handle: INTEGER);
  335. BEGIN
  336.     K.sysfunc3(37, 5, handle)
  337. END SetCursor;
  338.  
  339.  
  340. PROCEDURE DelCursor*(handle: INTEGER);
  341. BEGIN
  342.     K.sysfunc3(37, 6, handle)
  343. END DelCursor;
  344.  
  345.  
  346. PROCEDURE DrawImage* (data, sizeX, sizeY, x, y: INTEGER);
  347. BEGIN
  348.     K.sysfunc4(7, data, sizeX*65536 + sizeY, x*65536 + y)
  349. END DrawImage;
  350.  
  351.  
  352. PROCEDURE DrawText69* (x, y, color: INTEGER; text: ARRAY OF CHAR);
  353. BEGIN
  354.     K.sysfunc6(4, x*65536 + y, color + LSL(080H, 24), sys.ADR(text[0]), 0, 0)
  355. END DrawText69;
  356.  
  357.  
  358. PROCEDURE PutPixel* (x, y, color: INTEGER);
  359. BEGIN
  360.         K.sysfunc5(1, x, y, color, 0)
  361. END PutPixel;
  362.  
  363.  
  364. PROCEDURE GetSystemColors*;
  365. VAR
  366.     buf: ARRAY 10 OF INTEGER;
  367. BEGIN
  368.     ASSERT(LEN(buf) >= 10);
  369.     K.sysfunc4(48, 3, sys.ADR(buf[0]), 40);
  370.         (*darkColor := buf[2];*)
  371.         lightColor := buf[3];
  372.     winColor := buf[5];
  373.     textColor := buf[8];
  374.     btnColor := buf[6];
  375.     btnTextColor := buf[7];
  376.     borderColor := buf[9];
  377. END GetSystemColors;
  378.  
  379.  
  380. END SysUtils.
  381.