fpusrscr.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. User screen support routines
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit FPUsrScr;
  13. interface
  14. {$ifdef TP}
  15. {$define DOS}
  16. {$else}
  17. {$ifdef GO32V2}
  18. {$define DOS}
  19. {$endif}
  20. {$endif}
  21. uses
  22. {$ifdef win32}
  23. windows,
  24. {$endif win32}
  25. Objects;
  26. type
  27. PScreen = ^TScreen;
  28. TScreen = object(TObject)
  29. function GetWidth: integer; virtual;
  30. function GetHeight: integer; virtual;
  31. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  32. procedure GetCursorPos(var P: TPoint); virtual;
  33. procedure Capture; virtual;
  34. procedure SwitchTo; virtual;
  35. procedure SwitchBack; virtual;
  36. end;
  37. {$ifdef DOS}
  38. TDOSVideoInfo = record
  39. Mode : word;
  40. ScreenSize: word;
  41. Page : byte;
  42. Rows,Cols : integer;
  43. CurPos : TPoint;
  44. CurShapeT : integer;
  45. CurShapeB : integer;
  46. StateSize : word;
  47. StateBuf : pointer;
  48. end;
  49. PDOSScreen = ^TDOSScreen;
  50. TDOSScreen = object(TScreen)
  51. constructor Init;
  52. destructor Done; virtual;
  53. public
  54. function GetWidth: integer; virtual;
  55. function GetHeight: integer; virtual;
  56. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  57. procedure GetCursorPos(var P: TPoint); virtual;
  58. procedure Capture; virtual;
  59. procedure SwitchTo; virtual;
  60. procedure SwitchBack; virtual;
  61. private
  62. VideoInfo : TDOSVideoInfo;
  63. VBufferSize : longint;
  64. VIDEBufferSize : longint;
  65. VBuffer : PByteArray;
  66. VIDEBuffer : PByteArray;
  67. TM : TDOSVideoInfo;
  68. function GetLineStartOfs(Line: integer): word;
  69. procedure GetBuffer(Size: word);
  70. procedure FreeBuffer;
  71. procedure GetVideoMode(var MI: TDOSVideoInfo);
  72. procedure SetVideoMode(MI: TDOSVideoInfo);
  73. end;
  74. {$endif}
  75. {$ifdef Linux}
  76. PLinuxScreen = ^TLinuxScreen;
  77. TLinuxScreen = object(TScreen)
  78. constructor Init;
  79. destructor Done; virtual;
  80. public
  81. function GetWidth: integer; virtual;
  82. function GetHeight: integer; virtual;
  83. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  84. procedure GetCursorPos(var P: TPoint); virtual;
  85. procedure Capture; virtual;
  86. procedure SwitchTo; virtual;
  87. procedure SwitchBack; virtual;
  88. end;
  89. {$endif}
  90. {$ifdef win32}
  91. PWin32Screen = ^TWin32Screen;
  92. TWin32Screen = object(TScreen)
  93. constructor Init;
  94. destructor Done; virtual;
  95. public
  96. function GetWidth: integer; virtual;
  97. function GetHeight: integer; virtual;
  98. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  99. procedure GetCursorPos(var P: TPoint); virtual;
  100. procedure Capture; virtual;
  101. procedure SwitchTo; virtual;
  102. procedure SwitchBack; virtual;
  103. private
  104. DosScreenBufferHandle,
  105. IDEScreenBufferHandle : THandle;
  106. IDEActive : boolean;
  107. procedure BufferCopy(src,dest : THandle);
  108. end;
  109. {$endif}
  110. procedure InitUserScreen;
  111. procedure DoneUserScreen;
  112. const UserScreen : PScreen = nil;
  113. implementation
  114. uses
  115. Dos,Video
  116. (* {$ifdef TP}
  117. {$ifdef DPMI}
  118. ,WinAPI
  119. {$endif}
  120. {$endif}*)
  121. {$ifdef FPC}
  122. {$ifdef GO32V2}
  123. ,Go32
  124. {$endif}
  125. {$endif}
  126. ;
  127. function TScreen.GetWidth: integer;
  128. begin
  129. Getwidth:=0;
  130. Abstract;
  131. end;
  132. function TScreen.GetHeight: integer;
  133. begin
  134. Getheight:=0;
  135. Abstract;
  136. end;
  137. procedure TScreen.GetLine(Line: integer; var Text, Attr: string);
  138. begin
  139. Abstract;
  140. end;
  141. procedure TScreen.GetCursorPos(var P: TPoint);
  142. begin
  143. Abstract;
  144. end;
  145. procedure TScreen.Capture;
  146. begin
  147. Abstract;
  148. end;
  149. procedure TScreen.SwitchTo;
  150. begin
  151. Abstract;
  152. end;
  153. procedure TScreen.SwitchBack;
  154. begin
  155. Abstract;
  156. end;
  157. {****************************************************************************
  158. TDOSScreen
  159. ****************************************************************************}
  160. {$ifdef DOS}
  161. constructor TDOSScreen.Init;
  162. begin
  163. inherited Init;
  164. Capture;
  165. end;
  166. destructor TDOSScreen.Done;
  167. begin
  168. inherited Done;
  169. FreeBuffer;
  170. end;
  171. function TDOSScreen.GetWidth: integer;
  172. begin
  173. GetWidth:=VideoInfo.Cols;
  174. end;
  175. function TDOSScreen.GetHeight: integer;
  176. begin
  177. GetHeight:=VideoInfo.Rows;
  178. end;
  179. procedure TDOSScreen.GetLine(Line: integer; var Text, Attr: string);
  180. var X: integer;
  181. W: word;
  182. begin
  183. Text:=''; Attr:='';
  184. if Line<GetHeight then
  185. begin
  186. W:=GetLineStartOfs(Line);
  187. for X:=0 to GetWidth-1 do
  188. begin
  189. Text:=Text+chr(VBuffer^[W+X*2]);
  190. Attr:=Attr+chr(VBuffer^[W+X*2+1]);
  191. end;
  192. end;
  193. end;
  194. procedure TDOSScreen.GetCursorPos(var P: TPoint);
  195. begin
  196. P:=VideoInfo.CurPos;
  197. end;
  198. procedure TDOSScreen.Capture;
  199. var
  200. VSeg,SOfs: word;
  201. begin
  202. GetVideoMode(VideoInfo);
  203. GetBuffer(VideoInfo.ScreenSize);
  204. if VideoInfo.Mode=7 then
  205. VSeg:=SegB000
  206. else
  207. VSeg:=SegB800;
  208. SOfs:=MemW[Seg0040:$4e];
  209. {$ifdef FPC}
  210. DosmemGet(VSeg,SOfs,VBuffer^,VideoInfo.ScreenSize);
  211. {$else}
  212. Move(ptr(VSeg,SOfs)^,VBuffer^,VideoInfo.ScreenSize);
  213. {$endif}
  214. end;
  215. procedure TDOSScreen.SwitchTo;
  216. var
  217. VSeg,SOfs: word;
  218. begin
  219. GetVideoMode(TM);
  220. { First keep a copy of IDE screen }
  221. if VideoInfo.Mode=7 then
  222. VSeg:=SegB000
  223. else
  224. VSeg:=SegB800;
  225. SOfs:=MemW[Seg0040:$4e];
  226. if not assigned(VIDEBuffer) or (VIDEBufferSize<>TM.ScreenSize) then
  227. begin
  228. if assigned(VIDEBuffer) then
  229. FreeMem(VIDEBuffer,VIDEBufferSize);
  230. GetMem(VIDEBuffer,TM.ScreenSize);
  231. VIDEBufferSize:=TM.ScreenSize;
  232. end;
  233. {$ifdef FPC}
  234. DosmemGet(VSeg,SOfs,VIDEBuffer^,TM.ScreenSize);
  235. {$else}
  236. Move(ptr(VSeg,SOfs)^,VIDEBuffer^,TM.ScreenSize);
  237. {$endif}
  238. SetVideoMode(VideoInfo);
  239. if VideoInfo.Mode=7 then
  240. VSeg:=SegB000
  241. else
  242. VSeg:=SegB800;
  243. SOfs:=MemW[Seg0040:$4e];
  244. {$ifdef FPC}
  245. DosmemPut(VSeg,SOfs,VBuffer^,VideoInfo.ScreenSize);
  246. {$else}
  247. Move(VBuffer^,ptr(VSeg,SOfs)^,VideoInfo.ScreenSize);
  248. {$endif}
  249. end;
  250. procedure TDOSScreen.SwitchBack;
  251. var
  252. VSeg,SOfs: word;
  253. begin
  254. Capture;
  255. SetVideoMode(TM);
  256. if VideoInfo.Mode=7 then
  257. VSeg:=SegB000
  258. else
  259. VSeg:=SegB800;
  260. SOfs:=MemW[Seg0040:$4e];
  261. if assigned(VIDEBuffer) then
  262. {$ifdef FPC}
  263. DosmemPut(VSeg,SOfs,VIDEBuffer^,TM.ScreenSize);
  264. {$else}
  265. Move(VIDEBuffer^,ptr(VSeg,SOfs)^,TM.ScreenSize);
  266. {$endif}
  267. end;
  268. function TDOSScreen.GetLineStartOfs(Line: integer): word;
  269. begin
  270. GetLineStartOfs:=(VideoInfo.Cols*Line)*2;
  271. end;
  272. procedure TDOSScreen.GetBuffer(Size: word);
  273. begin
  274. if (VBuffer<>nil) and (VBufferSize=Size) then Exit;
  275. if VBuffer<>nil then FreeBuffer;
  276. VBufferSize:=Size;
  277. GetMem(VBuffer,VBufferSize);
  278. end;
  279. procedure TDOSScreen.FreeBuffer;
  280. begin
  281. if (VBuffer<>nil) and (VBufferSize>0) then FreeMem(VBuffer,VBufferSize);
  282. VBuffer:=nil;
  283. end;
  284. procedure TDOSScreen.GetVideoMode(var MI: TDOSVideoInfo);
  285. var
  286. r: registers;
  287. {$ifdef TP}
  288. P: pointer;
  289. Sel: longint;
  290. (* {$I realintr.inc} *)
  291. {$endif}
  292. begin
  293. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  294. begin FreeMem(MI.StateBuf,MI.StateSize); MI.StateBuf:=nil; end;
  295. MI.ScreenSize:=MemW[Seg0040:$4c];
  296. r.ah:=$0f;
  297. intr($10,r);
  298. MI.Mode:=r.al;
  299. MI.Page:=r.bh;
  300. MI.Cols:=r.ah;
  301. MI.Rows:=MI.ScreenSize div (MI.Cols*2);
  302. r.ah:=$03;
  303. r.bh:=MI.Page;
  304. intr($10,r);
  305. with MI do
  306. begin
  307. CurPos.X:=r.dl; CurPos.Y:=r.dh;
  308. CurShapeT:=r.ch; CurShapeB:=r.cl;
  309. end;
  310. (*
  311. {$ifdef TP}
  312. { check VGA functions }
  313. MI.StateSize:=0;
  314. r.ah:=$1c; r.al:=0; r.cx:=7; intr($10,r);
  315. if (r.al=$1c) and ((r.flags and fCarry)=0) and (r.bx>0) then
  316. begin
  317. MI.StateSize:=r.bx;
  318. GetMem(MI.StateBuf,MI.StateSize); FillChar(MI.StateBuf^,MI.StateSize,0);
  319. P:=MI.StateBuf;
  320. {$ifdef DPMI}
  321. Sel:=GlobalDosAlloc(MI.StateSize);
  322. P:=Ptr(Sel shr 16,0);
  323. {$endif}
  324. r.ah:=$1c; r.al:=1; r.cx:=7;
  325. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  326. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  327. {$ifdef DPMI}
  328. Move(Ptr(Sel and $ffff,0)^,MI.StateBuf^,MI.StateSize);
  329. GlobalDosFree(Sel and $ffff);
  330. {$endif}
  331. end;
  332. {$endif}
  333. *)
  334. end;
  335. procedure TDOSScreen.SetVideoMode(MI: TDOSVideoInfo);
  336. var r: registers;
  337. {$ifdef TP}
  338. P: pointer;
  339. Sel: longint;
  340. {$I realintr.inc}
  341. {$endif}
  342. begin
  343. r.ah:=$0f;
  344. intr($10,r);
  345. if r.al<>MI.Mode then
  346. begin
  347. r.ah:=$00; r.al:=MI.Mode; intr($10,r);
  348. end;
  349. r.ah:=$05; r.al:=MI.Page; intr($10,r);
  350. r.ah:=$02; r.bh:=MI.Page; r.dl:=MI.CurPos.X; r.dh:=MI.CurPos.Y; intr($10,r);
  351. r.ah:=$01; r.ch:=MI.CurShapeT; r.cl:=MI.CurShapeB; intr($10,r);
  352. (*
  353. {$ifdef TP}
  354. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  355. begin
  356. P:=MI.StateBuf;
  357. {$ifdef DPMI}
  358. Sel:=GlobalDosAlloc(MI.StateSize);
  359. Move(MI.StateBuf^,ptr(Sel and $ffff,0)^,MI.StateSize);
  360. P:=Ptr(Sel shr 16,0);
  361. {$endif}
  362. r.ah:=$1c; r.al:=2; r.cx:=7;
  363. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  364. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  365. {$ifdef DPMI}
  366. GlobalDosFree(Sel and $ffff);
  367. {$endif}
  368. end;
  369. {$endif}
  370. *)
  371. end;
  372. {$endif}
  373. {****************************************************************************
  374. TLinuxScreen
  375. ****************************************************************************}
  376. {$ifdef Linux}
  377. constructor TLinuxScreen.Init;
  378. begin
  379. inherited Init;
  380. end;
  381. destructor TLinuxScreen.Done;
  382. begin
  383. inherited Done;
  384. end;
  385. function TLinuxScreen.GetWidth: integer;
  386. begin
  387. GetWidth:=ScreenWidth;
  388. end;
  389. function TLinuxScreen.GetHeight: integer;
  390. begin
  391. GetHeight:=ScreenHeight;
  392. end;
  393. procedure TLinuxScreen.GetLine(Line: integer; var Text, Attr: string);
  394. begin
  395. Text:='';
  396. Attr:='';
  397. end;
  398. procedure TLinuxScreen.GetCursorPos(var P: TPoint);
  399. begin
  400. P.X:=0;
  401. P.Y:=0;
  402. end;
  403. procedure TLinuxScreen.Capture;
  404. begin
  405. end;
  406. procedure TLinuxScreen.SwitchTo;
  407. begin
  408. end;
  409. procedure TLinuxScreen.SwitchBack;
  410. begin
  411. end;
  412. {$endif}
  413. {****************************************************************************
  414. TWin32Screen
  415. ****************************************************************************}
  416. {$ifdef win32}
  417. constructor TWin32Screen.Init;
  418. var
  419. SecurityAttr : Security_attributes;
  420. BigWin : Coord;
  421. res : boolean;
  422. Error : dword;
  423. begin
  424. inherited Init;
  425. SecurityAttr.nLength:=SizeOf(Security_attributes);
  426. SecurityAttr.lpSecurityDescriptor:=nil;
  427. SecurityAttr.bInheritHandle:=false;
  428. DosScreenBufferHandle:=CreateConsoleScreenBuffer(
  429. GENERIC_READ or GENERIC_WRITE,
  430. 0,SecurityAttr,
  431. CONSOLE_TEXTMODE_BUFFER,nil);
  432. IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
  433. {$ifdef win32bigwin}
  434. BigWin.X:=80;
  435. BigWin.Y:=50;
  436. SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
  437. SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin);
  438. BigWin.X:=80;
  439. BigWin.Y:=50;
  440. { Try to allow to store more info }
  441. res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
  442. if not res then
  443. error:=GetLastError;
  444. {$endif win32bigwin}
  445. Capture;
  446. SwitchBack;
  447. end;
  448. destructor TWin32Screen.Done;
  449. begin
  450. { copy the Dos buffer content into the original ScreenBuffer
  451. which remains the startup std_output_handle PM }
  452. BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
  453. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  454. SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
  455. CloseHandle(DosScreenBufferHandle);
  456. inherited Done;
  457. end;
  458. function TWin32Screen.GetWidth: integer;
  459. var
  460. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  461. begin
  462. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  463. @ConsoleScreenBufferInfo);
  464. GetWidth:=ConsoleScreenBufferInfo.dwSize.X;
  465. {GetWidth:=ScreenWidth;}
  466. end;
  467. function TWin32Screen.GetHeight: integer;
  468. var
  469. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  470. begin
  471. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  472. @ConsoleScreenBufferInfo);
  473. GetHeight:=ConsoleScreenBufferInfo.dwSize.Y;
  474. {GetHeight:=ScreenHeight;}
  475. end;
  476. procedure TWin32Screen.GetLine(Line: integer; var Text, Attr: string);
  477. type
  478. CharInfoArray = Array [0..255] of Char_Info;
  479. var
  480. LineBuf : ^CharInfoArray;
  481. BufSize,BufCoord : Coord;
  482. i,LineSize : longint;
  483. WriteRegion : SMALL_RECT;
  484. begin
  485. GetMem(LineBuf,SizeOf(CharInfoArray));
  486. LineSize:=ScreenWidth;
  487. If LineSize>256 then
  488. LineSize:=256;
  489. BufSize.X:=LineSize;
  490. BufSize.Y:=1;
  491. BufCoord.X:=0;
  492. BufCoord.Y:=0;
  493. with WriteRegion do
  494. begin
  495. Top :=Line;
  496. Left :=0;
  497. Bottom := Line+1;
  498. Right := LineSize-1;
  499. end;
  500. ReadConsoleOutput(DosScreenBufferHandle, PChar_info(LineBuf),
  501. BufSize, BufCoord, @WriteRegion);
  502. for i:=1 to LineSize do
  503. begin
  504. Text[i]:=LineBuf^[i-1].AsciiChar;
  505. Attr[i]:=char(byte(LineBuf^[i-1].Attributes));
  506. end;
  507. FreeMem(LineBuf,SizeOf(CharInfoArray));
  508. Text[0]:=char(byte(LineSize));
  509. Attr[0]:=char(byte(LineSize));
  510. end;
  511. procedure TWin32Screen.GetCursorPos(var P: TPoint);
  512. var
  513. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  514. begin
  515. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  516. @ConsoleScreenBufferInfo);
  517. P.X:=ConsoleScreenBufferInfo.dwCursorPosition.X;
  518. P.Y:=ConsoleScreenBufferInfo.dwCursorPosition.Y;
  519. end;
  520. procedure TWin32Screen.BufferCopy(Src, Dest : THandle);
  521. type
  522. CharInfoArray = Array [0..256*255-1] of Char_Info;
  523. var
  524. LineBuf : ^CharInfoArray;
  525. BufSize,BufCoord : Coord;
  526. LineSize : longint;
  527. WriteRegion : SMALL_RECT;
  528. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  529. begin
  530. GetMem(LineBuf,SizeOf(CharInfoArray));
  531. LineSize:=ScreenWidth;
  532. If LineSize>256 then
  533. LineSize:=256;
  534. BufSize.X:=LineSize;
  535. BufSize.Y:=ScreenHeight;
  536. BufCoord.X:=0;
  537. BufCoord.Y:=0;
  538. with WriteRegion do
  539. begin
  540. Top :=0;
  541. Left :=0;
  542. Bottom := ScreenHeight-1;
  543. Right := LineSize-1;
  544. end;
  545. ReadConsoleOutput(Src, PChar_info(LineBuf),
  546. BufSize, BufCoord, @WriteRegion);
  547. WriteConsoleOutput(Dest, PChar_info(LineBuf)^,
  548. BufSize, BufCoord, @WriteRegion);
  549. FreeMem(LineBuf,SizeOf(CharInfoArray));
  550. GetConsoleScreenBufferInfo(Src,
  551. @ConsoleScreenBufferInfo);
  552. SetConsoleCursorPosition(Dest, ConsoleScreenBufferInfo.dwCursorPosition);
  553. end;
  554. procedure TWin32Screen.Capture;
  555. begin
  556. BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle);
  557. end;
  558. procedure TWin32Screen.SwitchTo;
  559. begin
  560. SetConsoleActiveScreenBuffer(DosScreenBufferHandle);
  561. SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
  562. IDEActive:=false;
  563. end;
  564. procedure TWin32Screen.SwitchBack;
  565. begin
  566. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  567. SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
  568. IDEActive:=true;
  569. end;
  570. {$endif}
  571. {****************************************************************************
  572. Initialize
  573. ****************************************************************************}
  574. procedure InitUserScreen;
  575. begin
  576. {$ifdef DOS}
  577. UserScreen:=New(PDOSScreen, Init);
  578. {$else}
  579. {$ifdef LINUX}
  580. UserScreen:=New(PLinuxScreen, Init);
  581. {$else}
  582. {$ifdef Win32}
  583. UserScreen:=New(PWin32Screen, Init);
  584. {$else}
  585. UserScreen:=New(PScreen, Init);
  586. {$endif Win32}
  587. {$endif Linux}
  588. {$endif Dos}
  589. end;
  590. procedure DoneUserScreen;
  591. begin
  592. if UserScreen<>nil then
  593. begin
  594. UserScreen^.SwitchTo;
  595. Dispose(UserScreen, Done);
  596. UserScreen:=nil;
  597. end;
  598. end;
  599. end.
  600. {
  601. $Log$
  602. Revision 1.10 2000-03-13 20:30:37 pierre
  603. + stores IDE screen before Switching for DOS
  604. Revision 1.9 2000/02/04 23:17:25 pierre
  605. * Keep the entry ScreenBuffer at exit
  606. Revision 1.8 1999/12/01 16:17:18 pierre
  607. * Restore std_output_handle correctly at exit for GDB
  608. Revision 1.7 1999/11/10 17:12:00 pierre
  609. * Win32 screen problems solved
  610. Revision 1.6 1999/09/22 13:02:00 pierre
  611. + Twin32Screen added
  612. Revision 1.5 1999/08/16 18:25:24 peter
  613. * Adjusting the selection when the editor didn't contain any line.
  614. * Reserved word recognition redesigned, but this didn't affect the overall
  615. syntax highlight speed remarkably (at least not on my Amd-K6/350).
  616. The syntax scanner loop is a bit slow but the main problem is the
  617. recognition of special symbols. Switching off symbol processing boosts
  618. the performance up to ca. 200%...
  619. * The editor didn't allow copying (for ex to clipboard) of a single character
  620. * 'File|Save as' caused permanently run-time error 3. Not any more now...
  621. * Compiler Messages window (actually the whole desktop) did not act on any
  622. keypress when compilation failed and thus the window remained visible
  623. + Message windows are now closed upon pressing Esc
  624. + At 'Run' the IDE checks whether any sources are modified, and recompiles
  625. only when neccessary
  626. + BlockRead and BlockWrite (Ctrl+K+R/W) implemented in TCodeEditor
  627. + LineSelect (Ctrl+K+L) implemented
  628. * The IDE had problems closing help windows before saving the desktop
  629. Revision 1.4 1999/06/28 19:32:25 peter
  630. * fixes from gabor
  631. Revision 1.3 1999/02/02 16:41:42 peter
  632. + automatic .pas/.pp adding by opening of file
  633. * better debuggerscreen changes
  634. Revision 1.2 1999/01/04 11:49:51 peter
  635. * 'Use tab characters' now works correctly
  636. + Syntax highlight now acts on File|Save As...
  637. + Added a new class to syntax highlight: 'hex numbers'.
  638. * There was something very wrong with the palette managment. Now fixed.
  639. + Added output directory (-FE<xxx>) support to 'Directories' dialog...
  640. * Fixed some possible bugs in Running/Compiling, and the compilation/run
  641. process revised
  642. Revision 1.1 1998/12/28 15:47:53 peter
  643. + Added user screen support, display & window
  644. + Implemented Editor,Mouse Options dialog
  645. + Added location of .INI and .CFG file
  646. + Option (INI) file managment implemented (see bottom of Options Menu)
  647. + Switches updated
  648. + Run program
  649. Revision 1.0 1998/12/24 09:55:49 gabor
  650. Original implementation
  651. }