fpusrscr.pas 18 KB

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