Subversion Repositories Kolibri OS

Rev

Rev 9730 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2021-2023 Anton Krotov
  3.  
  4.     This file is part of CEdit.
  5.  
  6.     CEdit 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.     CEdit 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 CEdit. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE KolibriOS;
  21.  
  22. IMPORT
  23.         KOSAPI, SYSTEM, U := Utils;
  24.  
  25. CONST
  26.         fontWidth* = 8;
  27.         fontHeight* = 16;
  28.  
  29. VAR
  30.  
  31.         colors*: RECORD
  32.                 rsrvd,
  33.                 taskbar,
  34.                 dark*,
  35.                 light*,
  36.                 window_title*,
  37.                 work*,
  38.                 button*,
  39.                 button_text*,
  40.                 work_text*,
  41.                 line*: INTEGER
  42.         END;
  43.  
  44.  
  45. PROCEDURE CreateWindow* (x, y, w, h, color, style, hcolor, hstyle: INTEGER; htext: ARRAY OF CHAR);
  46. BEGIN
  47.         KOSAPI.sysfunc6(0, x*65536 + w, y*65536 + h, color + LSL(style, 24), hcolor + LSL(hstyle, 24), SYSTEM.ADR(htext[0]))
  48. END CreateWindow;
  49.  
  50.  
  51. PROCEDURE BeginDraw*;
  52. BEGIN
  53.         KOSAPI.sysfunc2(12, 1)
  54. END BeginDraw;
  55.  
  56.  
  57. PROCEDURE EndDraw*;
  58. BEGIN
  59.         KOSAPI.sysfunc2(12, 2)
  60. END EndDraw;
  61.  
  62.  
  63. PROCEDURE EventTimeout* (t: INTEGER): INTEGER;
  64.         RETURN KOSAPI.sysfunc2(23, t)
  65. END EventTimeout;
  66.  
  67.  
  68. PROCEDURE ThreadInfo (offsa, offsb: INTEGER; VAR a, b: INTEGER);
  69. VAR
  70.         buffer: ARRAY 1024 OF BYTE;
  71. BEGIN
  72.         KOSAPI.sysfunc3(9, SYSTEM.ADR(buffer[0]), -1);
  73.         SYSTEM.GET32(SYSTEM.ADR(buffer[0]) + offsa, a);
  74.         SYSTEM.GET32(SYSTEM.ADR(buffer[0]) + offsb, b);
  75. END ThreadInfo;
  76.  
  77.  
  78. PROCEDURE WinSize* (VAR width, height: INTEGER);
  79. BEGIN
  80.         ThreadInfo(42, 46, width, height)
  81. END WinSize;
  82.  
  83.  
  84. PROCEDURE WinPos* (VAR x, y: INTEGER);
  85. BEGIN
  86.         ThreadInfo(34, 38, x, y)
  87. END WinPos;
  88.  
  89.  
  90. PROCEDURE ClientSize* (VAR width, height: INTEGER);
  91. BEGIN
  92.         ThreadInfo(62, 66, width, height)
  93. END ClientSize;
  94.  
  95.  
  96. PROCEDURE ClientPos* (VAR x, y: INTEGER);
  97. BEGIN
  98.         ThreadInfo(54, 58, x, y)
  99. END ClientPos;
  100.  
  101.  
  102. PROCEDURE ScreenSize* (VAR width, height: INTEGER);
  103. VAR
  104.         eax, ebx: INTEGER;
  105.         right, left, top, bottom: INTEGER;
  106. BEGIN
  107.         eax := KOSAPI.sysfunc22(48, 5, ebx);
  108.         left := LSR(eax, 16);
  109.         right := eax MOD 65536;
  110.         top := LSR(ebx, 16);
  111.         bottom := ebx MOD 65536;
  112.         width := right - left + 1;
  113.         height := bottom - top + 1
  114. END ScreenSize;
  115.  
  116.  
  117. PROCEDURE ThreadID* (): INTEGER;
  118. VAR
  119.         id: INTEGER;
  120. BEGIN
  121.         ThreadInfo(30, 30, id, id)
  122.         RETURN id
  123. END ThreadID;
  124.  
  125.  
  126. PROCEDURE RolledUp* (): BOOLEAN;
  127. VAR
  128.         buffer: ARRAY 1024 OF BYTE;
  129. BEGIN
  130.         KOSAPI.sysfunc3(9, SYSTEM.ADR(buffer[0]), -1)
  131.         RETURN ODD(LSR(buffer[70], 2))
  132. END RolledUp;
  133.  
  134.  
  135. PROCEDURE SetWinSize* (width, height: INTEGER);
  136. BEGIN
  137.         KOSAPI.sysfunc5(67, -1, -1, width, height)
  138. END SetWinSize;
  139.  
  140.  
  141. PROCEDURE DrawText* (x, y, color: INTEGER; text: ARRAY OF WCHAR);
  142. BEGIN
  143.         KOSAPI.sysfunc6(4, x*65536 + y, color + LSL(0A0H, 24), SYSTEM.ADR(text[0]), 0, 0)
  144. END DrawText;
  145.  
  146.  
  147. PROCEDURE DrawText69* (x, y, color: INTEGER; text: ARRAY OF CHAR);
  148. BEGIN
  149.         KOSAPI.sysfunc6(4, x*65536 + y, color + LSL(080H, 24), SYSTEM.ADR(text[0]), 0, 0)
  150. END DrawText69;
  151.  
  152.  
  153. PROCEDURE DrawText866* (x, y, color: INTEGER; text: ARRAY OF CHAR);
  154. BEGIN
  155.         KOSAPI.sysfunc6(4, x*65536 + y, color + LSL(0D0H, 24), SYSTEM.ADR(text[0]), 0, colors.work)
  156. END DrawText866;
  157.  
  158.  
  159. PROCEDURE DrawText866bk* (x, y, color, bkColor: INTEGER; text: ARRAY OF CHAR);
  160. BEGIN
  161.         KOSAPI.sysfunc6(4, x*65536 + y, color + LSL(0D0H, 24), SYSTEM.ADR(text[0]), 0, bkColor)
  162. END DrawText866bk;
  163.  
  164.  
  165. PROCEDURE MousePos* (VAR x, y: INTEGER);
  166. VAR
  167.         res: INTEGER;
  168. BEGIN
  169.         res := KOSAPI.sysfunc2(37, 0);
  170.         y := res MOD 65536;
  171.         x := res DIV 65536
  172. END MousePos;
  173.  
  174.  
  175. PROCEDURE CreateButton* (id, Left, Top, Width, Height, Color: INTEGER; Caption: ARRAY OF WCHAR);
  176. VAR
  177.         x, y: INTEGER;
  178. BEGIN
  179.         KOSAPI.sysfunc5(8, LSL(Left, 16) + Width, LSL(Top, 16) + Height, id, Color);
  180.         x := Left + (Width - fontWidth * LENGTH(Caption)) DIV 2;
  181.         y := Top + (Height - fontHeight) DIV 2 + 1;
  182.         DrawText(x, y, colors.button_text, Caption)
  183. END CreateButton;
  184.  
  185.  
  186. PROCEDURE DeleteButton* (id: INTEGER);
  187. BEGIN
  188.         KOSAPI.sysfunc5(8, 0, 0, id + 80000000H, 0)
  189. END DeleteButton;
  190.  
  191.  
  192. PROCEDURE GetTickCount* (): INTEGER;
  193.         RETURN KOSAPI.sysfunc2(26, 9)
  194. END GetTickCount;
  195.  
  196.  
  197. PROCEDURE Pause* (time: INTEGER);
  198. BEGIN
  199.         KOSAPI.sysfunc2(5, time)
  200. END Pause;
  201.  
  202.  
  203. PROCEDURE ButtonCode* (VAR middle: BOOLEAN): INTEGER;
  204. VAR
  205.         res: INTEGER;
  206. BEGIN
  207.         middle := FALSE;
  208.         res := KOSAPI.sysfunc1(17);
  209.         IF res MOD 256 = 0 THEN
  210.                 res := LSR(res, 8)
  211.         ELSIF res MOD 256 = 4 THEN
  212.                 res := LSR(res, 8);
  213.                 middle := TRUE
  214.         ELSE
  215.                 res := 0
  216.         END
  217.         RETURN res
  218. END ButtonCode;
  219.  
  220.  
  221. PROCEDURE Exit*;
  222. BEGIN
  223.         KOSAPI.sysfunc1(-1)
  224. END Exit;
  225.  
  226.  
  227. PROCEDURE ExitID* (tid: INTEGER);
  228. BEGIN
  229.         KOSAPI.sysfunc3(18, 18, tid)
  230. END ExitID;
  231.  
  232.  
  233. PROCEDURE CreateThread* (proc: INTEGER; stack: ARRAY OF INTEGER): INTEGER;
  234. VAR
  235.         tid: INTEGER;
  236. BEGIN
  237.         tid := KOSAPI.sysfunc4(51, 1, proc, SYSTEM.ADR(stack[LEN(stack) - 2]));
  238.         IF tid = -1 THEN
  239.                 tid := 0
  240.         END
  241.         RETURN tid
  242. END CreateThread;
  243.  
  244.  
  245. PROCEDURE Run* (program, param: ARRAY OF CHAR);
  246. TYPE
  247.  
  248.         info_struct = RECORD
  249.                 subfunc : INTEGER;
  250.                 flags   : INTEGER;
  251.                 param   : INTEGER;
  252.                 rsrvd1  : INTEGER;
  253.                 rsrvd2  : INTEGER;
  254.                 fname   : ARRAY 1024 OF CHAR
  255.         END;
  256.  
  257. VAR
  258.         info: info_struct;
  259.  
  260. BEGIN
  261.         info.subfunc := 7;
  262.         info.flags   := 0;
  263.         info.param   := SYSTEM.ADR(param[0]);
  264.         info.rsrvd1  := 0;
  265.         info.rsrvd2  := 0;
  266.         COPY(program, info.fname);
  267.         KOSAPI.sysfunc2(70, SYSTEM.ADR(info))
  268. END Run;
  269.  
  270.  
  271. PROCEDURE SetCurFolder* (folder: ARRAY OF CHAR);
  272. BEGIN
  273.         KOSAPI.sysfunc3(30, 1, SYSTEM.ADR(folder[0]));
  274. END SetCurFolder;
  275.  
  276.  
  277. PROCEDURE DrawRect* (x, y, width, height, color: INTEGER);
  278. BEGIN
  279.         KOSAPI.sysfunc4(13, x*65536 + width, y*65536 + height, color)
  280. END DrawRect;
  281.  
  282.  
  283. PROCEDURE DrawLine* (x1, y1, x2, y2: INTEGER; color: INTEGER);
  284. BEGIN
  285.         KOSAPI.sysfunc4(38, x1*65536 + x2, y1*65536 + y2, color)
  286. END DrawLine;
  287.  
  288.  
  289. PROCEDURE DrawImage* (data, sizeX, sizeY, x, y: INTEGER);
  290. BEGIN
  291.         KOSAPI.sysfunc4(7, data, sizeX*65536 + sizeY, x*65536 + y)
  292. END DrawImage;
  293.  
  294.  
  295. PROCEDURE SetEventsMask* (mask: SET);
  296. BEGIN
  297.         KOSAPI.sysfunc2(40, ORD(mask))
  298. END SetEventsMask;
  299.  
  300.  
  301. PROCEDURE SkinHeight* (): INTEGER;
  302.         RETURN KOSAPI.sysfunc2(48, 4)
  303. END SkinHeight;
  304.  
  305.  
  306. PROCEDURE GetKey* (): INTEGER;
  307.         RETURN KOSAPI.sysfunc1(2)
  308. END GetKey;
  309.  
  310.  
  311. PROCEDURE MouseState* (): SET;
  312.         RETURN BITS(KOSAPI.sysfunc2(37, 3))
  313. END MouseState;
  314.  
  315.  
  316. PROCEDURE Scroll* (): INTEGER;
  317.         RETURN ASR(LSL(KOSAPI.sysfunc2(37, 7), 16), 16)
  318. END Scroll;
  319.  
  320.  
  321. PROCEDURE GetControlKeys* (): SET;
  322.         RETURN BITS(KOSAPI.sysfunc2(66, 3))
  323. END GetControlKeys;
  324.  
  325.  
  326. PROCEDURE GetSystemColors*;
  327. BEGIN
  328.         KOSAPI.sysfunc4(48, 3, SYSTEM.ADR(colors), 40)
  329. END GetSystemColors;
  330.  
  331.  
  332. PROCEDURE getKBState* (VAR shift, ctrl: BOOLEAN);
  333. VAR
  334.         kbState: SET;
  335. BEGIN
  336.         kbState := GetControlKeys();
  337.         shift := {0, 1} * kbState # {};
  338.         ctrl := {2, 3} * kbState # {};
  339. END getKBState;
  340.  
  341.  
  342. PROCEDURE mouse* (VAR msState: SET; VAR x, y: INTEGER);
  343. VAR
  344.         mouseX, mouseY,
  345.         cliX, cliY,
  346.         winX, winY: INTEGER;
  347. BEGIN
  348.         msState := MouseState();
  349.         MousePos(mouseX, mouseY);
  350.         WinPos(winX, winY);
  351.         ClientPos(cliX, cliY);
  352.         x := mouseX - winX - cliX;
  353.         y := mouseY - winY - cliY
  354. END mouse;
  355.  
  356.  
  357. PROCEDURE SetCaption* (text: ARRAY OF CHAR);
  358. BEGIN
  359.         KOSAPI.sysfunc4(71, 2, SYSTEM.ADR(text[0]), 0)
  360. END SetCaption;
  361.  
  362.  
  363. PROCEDURE CBCount* (): INTEGER;
  364.         RETURN KOSAPI.sysfunc2(54, 0)
  365. END CBCount;
  366.  
  367.  
  368. PROCEDURE CBRead* (slot: INTEGER): INTEGER;
  369.         RETURN KOSAPI.sysfunc3(54, 1, slot)
  370. END CBRead;
  371.  
  372.  
  373. PROCEDURE CBWrite* (size, ptr: INTEGER);
  374. BEGIN
  375.         KOSAPI.sysfunc4(54, 2, size, ptr)
  376. END CBWrite;
  377.  
  378.  
  379. PROCEDURE CBDelSlot*;
  380. BEGIN
  381.         KOSAPI.sysfunc2(54, 3)
  382. END CBDelSlot;
  383.  
  384.  
  385. PROCEDURE GetThreadSlot* (tid: INTEGER): INTEGER;
  386.         RETURN KOSAPI.sysfunc3(18, 21, tid)
  387. END GetThreadSlot;
  388.  
  389.  
  390. PROCEDURE PutPixel* (x, y, color: INTEGER);
  391. BEGIN
  392.         KOSAPI.sysfunc5(1, x, y, color, 0)
  393. END PutPixel;
  394.  
  395.  
  396. PROCEDURE SetIPC* (buffer: ARRAY OF INTEGER);
  397. BEGIN
  398.         KOSAPI.sysfunc4(60, 1, SYSTEM.ADR(buffer[0]), LEN(buffer)*SYSTEM.SIZE(INTEGER))
  399. END SetIPC;
  400.  
  401.  
  402. PROCEDURE SendIPC* (pid, ptr, size: INTEGER);
  403. BEGIN
  404.         KOSAPI.sysfunc5(60, 2, pid, ptr, size)
  405. END SendIPC;
  406.  
  407.  
  408. PROCEDURE docpack* (VAR param: ARRAY OF CHAR; VAR text_ptr, text_size: INTEGER);
  409. VAR
  410.         i, size, ptr, ptr2: INTEGER;
  411.         s: ARRAY 32 OF WCHAR;
  412. BEGIN
  413.         ptr2 := 0;
  414.         U.reverse8(param);
  415.         param[LENGTH(param) - 1] := 0X;
  416.         U.reverse8(param);
  417.         i := 0;
  418.         WHILE param[i] # 0X DO
  419.                 s[i] := WCHR(ORD(param[i]));
  420.                 INC(i)
  421.         END;
  422.         IF U.str2int(s, size) THEN
  423.                 INC(size, 20);
  424.                 ptr := KOSAPI.malloc(size);
  425.                 IF ptr # 0 THEN
  426.                         SYSTEM.PUT32(ptr, 0);
  427.                         SYSTEM.PUT32(ptr + 4, 8);
  428.                         KOSAPI.sysfunc4(60, 1, ptr, size);
  429.                         SetEventsMask({6});
  430.                         IF EventTimeout(200) = 7 THEN
  431.                                 SYSTEM.PUT32(ptr, 1);
  432.                                 SYSTEM.GET(ptr + 12, size);
  433.                                 ptr2 := KOSAPI.malloc(size);
  434.                                 IF ptr2 # 0 THEN
  435.                                         SYSTEM.MOVE(ptr + 16, ptr2, size)
  436.                                 END
  437.                         END;
  438.                         ptr := KOSAPI.free(ptr)
  439.                 END
  440.         END;
  441.         text_ptr := ptr2;
  442.         text_size := size
  443. END docpack;
  444.  
  445.  
  446. BEGIN
  447.         GetSystemColors
  448. END KolibriOS.