fpusrscr.pas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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. video,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. private
  83. IDE_screen: pvideobuf;
  84. end;
  85. {$endif}
  86. {$ifdef win32}
  87. PWin32Screen = ^TWin32Screen;
  88. TWin32Screen = object(TScreen)
  89. constructor Init;
  90. destructor Done; virtual;
  91. public
  92. function GetWidth: integer; virtual;
  93. function GetHeight: integer; virtual;
  94. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  95. procedure GetCursorPos(var P: TPoint); virtual;
  96. procedure Capture; virtual;
  97. procedure SwitchTo; virtual;
  98. procedure SwitchBack; virtual;
  99. private
  100. DosScreenBufferHandle,
  101. IDEScreenBufferHandle : THandle;
  102. IDEActive : boolean;
  103. procedure BufferCopy(src,dest : THandle);
  104. end;
  105. {$endif}
  106. procedure InitUserScreen;
  107. procedure DoneUserScreen;
  108. const UserScreen : PScreen = nil;
  109. implementation
  110. uses
  111. Dos
  112. (* {$ifdef TP}
  113. {$ifdef DPMI}
  114. ,WinAPI
  115. {$endif}
  116. {$endif}*)
  117. {$ifdef FPC}
  118. {$ifdef GO32V2}
  119. ,Go32
  120. {$endif}
  121. {$endif}
  122. {$ifdef VESA}
  123. ,VESA
  124. {$endif}
  125. ;
  126. function TScreen.GetWidth: integer;
  127. begin
  128. Getwidth:=0;
  129. Abstract;
  130. end;
  131. function TScreen.GetHeight: integer;
  132. begin
  133. Getheight:=0;
  134. Abstract;
  135. end;
  136. procedure TScreen.GetLine(Line: integer; var Text, Attr: string);
  137. begin
  138. Abstract;
  139. end;
  140. procedure TScreen.GetCursorPos(var P: TPoint);
  141. begin
  142. Abstract;
  143. end;
  144. procedure TScreen.Capture;
  145. begin
  146. Abstract;
  147. end;
  148. procedure TScreen.SwitchTo;
  149. begin
  150. Abstract;
  151. end;
  152. procedure TScreen.SwitchBack;
  153. begin
  154. Abstract;
  155. end;
  156. {****************************************************************************
  157. TDOSScreen
  158. ****************************************************************************}
  159. {$ifdef DOS}
  160. constructor TDOSScreen.Init;
  161. begin
  162. inherited Init;
  163. Capture;
  164. end;
  165. destructor TDOSScreen.Done;
  166. begin
  167. inherited Done;
  168. FreeBuffer;
  169. end;
  170. function TDOSScreen.GetWidth: integer;
  171. begin
  172. GetWidth:=VideoInfo.Cols;
  173. end;
  174. function TDOSScreen.GetHeight: integer;
  175. begin
  176. GetHeight:=VideoInfo.Rows;
  177. end;
  178. procedure TDOSScreen.GetLine(Line: integer; var Text, Attr: string);
  179. var X: integer;
  180. W: word;
  181. begin
  182. Text:=''; Attr:='';
  183. if Line<GetHeight then
  184. begin
  185. W:=GetLineStartOfs(Line);
  186. for X:=0 to GetWidth-1 do
  187. begin
  188. Text:=Text+chr(VBuffer^[W+X*2]);
  189. Attr:=Attr+chr(VBuffer^[W+X*2+1]);
  190. end;
  191. end;
  192. end;
  193. procedure TDOSScreen.GetCursorPos(var P: TPoint);
  194. begin
  195. P:=VideoInfo.CurPos;
  196. end;
  197. procedure TDOSScreen.Capture;
  198. var
  199. VSeg,SOfs: word;
  200. begin
  201. GetVideoMode(VideoInfo);
  202. GetBuffer(VideoInfo.ScreenSize);
  203. if VideoInfo.Mode=7 then
  204. VSeg:=SegB000
  205. else
  206. VSeg:=SegB800;
  207. SOfs:=MemW[Seg0040:$4e];
  208. {$ifdef FPC}
  209. DosmemGet(VSeg,SOfs,VBuffer^,VideoInfo.ScreenSize);
  210. {$else}
  211. Move(ptr(VSeg,SOfs)^,VBuffer^,VideoInfo.ScreenSize);
  212. {$endif}
  213. end;
  214. procedure TDOSScreen.SwitchTo;
  215. var
  216. VSeg,SOfs: word;
  217. begin
  218. GetVideoMode(TM);
  219. { First keep a copy of IDE screen }
  220. if VideoInfo.Mode=7 then
  221. VSeg:=SegB000
  222. else
  223. VSeg:=SegB800;
  224. SOfs:=MemW[Seg0040:$4e];
  225. if not assigned(VIDEBuffer) or (VIDEBufferSize<>TM.ScreenSize) then
  226. begin
  227. if assigned(VIDEBuffer) then
  228. FreeMem(VIDEBuffer,VIDEBufferSize);
  229. GetMem(VIDEBuffer,TM.ScreenSize);
  230. VIDEBufferSize:=TM.ScreenSize;
  231. end;
  232. {$ifdef FPC}
  233. DosmemGet(VSeg,SOfs,VIDEBuffer^,TM.ScreenSize);
  234. {$else}
  235. Move(ptr(VSeg,SOfs)^,VIDEBuffer^,TM.ScreenSize);
  236. {$endif}
  237. SetVideoMode(VideoInfo);
  238. if VideoInfo.Mode=7 then
  239. VSeg:=SegB000
  240. else
  241. VSeg:=SegB800;
  242. SOfs:=MemW[Seg0040:$4e];
  243. {$ifdef FPC}
  244. DosmemPut(VSeg,SOfs,VBuffer^,VideoInfo.ScreenSize);
  245. {$else}
  246. Move(VBuffer^,ptr(VSeg,SOfs)^,VideoInfo.ScreenSize);
  247. {$endif}
  248. end;
  249. procedure TDOSScreen.SwitchBack;
  250. var
  251. VSeg,SOfs: word;
  252. begin
  253. Capture;
  254. SetVideoMode(TM);
  255. if VideoInfo.Mode=7 then
  256. VSeg:=SegB000
  257. else
  258. VSeg:=SegB800;
  259. SOfs:=MemW[Seg0040:$4e];
  260. if assigned(VIDEBuffer) then
  261. {$ifdef FPC}
  262. DosmemPut(VSeg,SOfs,VIDEBuffer^,TM.ScreenSize);
  263. {$else}
  264. Move(VIDEBuffer^,ptr(VSeg,SOfs)^,TM.ScreenSize);
  265. {$endif}
  266. end;
  267. function TDOSScreen.GetLineStartOfs(Line: integer): word;
  268. begin
  269. GetLineStartOfs:=(VideoInfo.Cols*Line)*2;
  270. end;
  271. procedure TDOSScreen.GetBuffer(Size: word);
  272. begin
  273. if (VBuffer<>nil) and (VBufferSize=Size) then Exit;
  274. if VBuffer<>nil then FreeBuffer;
  275. VBufferSize:=Size;
  276. GetMem(VBuffer,VBufferSize);
  277. end;
  278. procedure TDOSScreen.FreeBuffer;
  279. begin
  280. if (VBuffer<>nil) and (VBufferSize>0) then FreeMem(VBuffer,VBufferSize);
  281. VBuffer:=nil;
  282. end;
  283. procedure TDOSScreen.GetVideoMode(var MI: TDOSVideoInfo);
  284. var
  285. r: registers;
  286. {$ifdef TP}
  287. P: pointer;
  288. Sel: longint;
  289. (* {$I realintr.inc} *)
  290. {$endif}
  291. begin
  292. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  293. begin FreeMem(MI.StateBuf,MI.StateSize); MI.StateBuf:=nil; end;
  294. MI.ScreenSize:=MemW[Seg0040:$4c];
  295. r.ah:=$0f;
  296. intr($10,r);
  297. MI.Mode:=r.al;
  298. MI.Page:=r.bh;
  299. MI.Cols:=r.ah;
  300. {$ifdef VESA}
  301. VESAGetMode(MI.Mode);
  302. {$endif}
  303. MI.Rows:=MI.ScreenSize div (MI.Cols*2);
  304. if MI.Rows=51 then MI.Rows:=50;
  305. r.ah:=$03;
  306. r.bh:=MI.Page;
  307. intr($10,r);
  308. with MI do
  309. begin
  310. CurPos.X:=r.dl; CurPos.Y:=r.dh;
  311. CurShapeT:=r.ch; CurShapeB:=r.cl;
  312. end;
  313. (*
  314. {$ifdef TP}
  315. { check VGA functions }
  316. MI.StateSize:=0;
  317. r.ah:=$1c; r.al:=0; r.cx:=7; intr($10,r);
  318. if (r.al=$1c) and ((r.flags and fCarry)=0) and (r.bx>0) then
  319. begin
  320. MI.StateSize:=r.bx;
  321. GetMem(MI.StateBuf,MI.StateSize); FillChar(MI.StateBuf^,MI.StateSize,0);
  322. P:=MI.StateBuf;
  323. {$ifdef DPMI}
  324. Sel:=GlobalDosAlloc(MI.StateSize);
  325. P:=Ptr(Sel shr 16,0);
  326. {$endif}
  327. r.ah:=$1c; r.al:=1; r.cx:=7;
  328. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  329. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  330. {$ifdef DPMI}
  331. Move(Ptr(Sel and $ffff,0)^,MI.StateBuf^,MI.StateSize);
  332. GlobalDosFree(Sel and $ffff);
  333. {$endif}
  334. end;
  335. {$endif}
  336. *)
  337. end;
  338. procedure TDOSScreen.SetVideoMode(MI: TDOSVideoInfo);
  339. var r: registers;
  340. CM: TDOSVideoInfo;
  341. {$ifdef TP}
  342. P: pointer;
  343. Sel: longint;
  344. {$I realintr.inc}
  345. {$endif}
  346. begin
  347. FillChar(CM,sizeof(CM),0);
  348. GetVideoMode(CM);
  349. if (CM.Mode<>MI.Mode) or (CM.Cols<>MI.Cols) or (CM.Rows<>MI.Rows) then
  350. begin
  351. {$ifdef VESA}
  352. if MI.Mode>=$100 then
  353. VESASetMode(MI.Mode)
  354. else
  355. {$endif}
  356. begin
  357. r.ah:=$00; r.al:=MI.Mode; intr($10,r);
  358. end;
  359. if (MI.Mode=3) and (MI.Cols=80) and (MI.Rows=50) then
  360. begin
  361. r.ax:=$1112; r.bx:=$0;
  362. intr($10,r);
  363. end;
  364. end;
  365. r.ah:=$05; r.al:=MI.Page; intr($10,r);
  366. r.ah:=$02; r.bh:=MI.Page; r.dl:=MI.CurPos.X; r.dh:=MI.CurPos.Y; intr($10,r);
  367. r.ah:=$01; r.ch:=MI.CurShapeT; r.cl:=MI.CurShapeB; intr($10,r);
  368. (*
  369. {$ifdef TP}
  370. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  371. begin
  372. P:=MI.StateBuf;
  373. {$ifdef DPMI}
  374. Sel:=GlobalDosAlloc(MI.StateSize);
  375. Move(MI.StateBuf^,ptr(Sel and $ffff,0)^,MI.StateSize);
  376. P:=Ptr(Sel shr 16,0);
  377. {$endif}
  378. r.ah:=$1c; r.al:=2; r.cx:=7;
  379. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  380. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  381. {$ifdef DPMI}
  382. GlobalDosFree(Sel and $ffff);
  383. {$endif}
  384. end;
  385. {$endif}
  386. *)
  387. end;
  388. {$endif}
  389. {****************************************************************************
  390. TLinuxScreen
  391. ****************************************************************************}
  392. {$ifdef Linux}
  393. constructor TLinuxScreen.Init;
  394. begin
  395. inherited Init;
  396. IDE_screen := nil;
  397. end;
  398. destructor TLinuxScreen.Done;
  399. begin
  400. inherited Done;
  401. end;
  402. function TLinuxScreen.GetWidth: integer;
  403. begin
  404. GetWidth:=ScreenWidth;
  405. end;
  406. function TLinuxScreen.GetHeight: integer;
  407. begin
  408. GetHeight:=ScreenHeight;
  409. end;
  410. procedure TLinuxScreen.GetLine(Line: integer; var Text, Attr: string);
  411. begin
  412. Text:='';
  413. Attr:='';
  414. end;
  415. procedure TLinuxScreen.GetCursorPos(var P: TPoint);
  416. begin
  417. P.X:=0;
  418. P.Y:=0;
  419. end;
  420. procedure TLinuxScreen.Capture;
  421. begin
  422. if assigned(IDE_screen) then
  423. dispose(IDE_screen);
  424. new(IDE_screen);
  425. move(videobuf^,IDE_screen^,videobufsize);
  426. end;
  427. procedure TLinuxScreen.SwitchTo;
  428. begin
  429. end;
  430. procedure TLinuxScreen.SwitchBack;
  431. begin
  432. if IDE_screen = nil then
  433. exit;
  434. move(IDE_screen^,videobuf^,videobufsize);
  435. dispose(IDE_screen);
  436. IDE_screen := nil;
  437. end;
  438. {$endif}
  439. {****************************************************************************
  440. TWin32Screen
  441. ****************************************************************************}
  442. {$ifdef win32}
  443. constructor TWin32Screen.Init;
  444. var
  445. SecurityAttr : Security_attributes;
  446. BigWin : Coord;
  447. res : boolean;
  448. Error : dword;
  449. begin
  450. inherited Init;
  451. SecurityAttr.nLength:=SizeOf(Security_attributes);
  452. SecurityAttr.lpSecurityDescriptor:=nil;
  453. SecurityAttr.bInheritHandle:=false;
  454. DosScreenBufferHandle:=CreateConsoleScreenBuffer(
  455. GENERIC_READ or GENERIC_WRITE,
  456. 0,SecurityAttr,
  457. CONSOLE_TEXTMODE_BUFFER,nil);
  458. IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
  459. {$ifdef win32bigwin}
  460. BigWin.X:=80;
  461. BigWin.Y:=50;
  462. SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
  463. SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin);
  464. BigWin.X:=80;
  465. BigWin.Y:=50;
  466. { Try to allow to store more info }
  467. res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
  468. if not res then
  469. error:=GetLastError;
  470. {$endif win32bigwin}
  471. Capture;
  472. SwitchBack;
  473. end;
  474. destructor TWin32Screen.Done;
  475. begin
  476. { copy the Dos buffer content into the original ScreenBuffer
  477. which remains the startup std_output_handle PM }
  478. BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
  479. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  480. SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
  481. CloseHandle(DosScreenBufferHandle);
  482. inherited Done;
  483. end;
  484. function TWin32Screen.GetWidth: integer;
  485. var
  486. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  487. begin
  488. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  489. @ConsoleScreenBufferInfo);
  490. GetWidth:=ConsoleScreenBufferInfo.dwSize.X;
  491. {GetWidth:=ScreenWidth;}
  492. end;
  493. function TWin32Screen.GetHeight: integer;
  494. var
  495. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  496. begin
  497. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  498. @ConsoleScreenBufferInfo);
  499. GetHeight:=ConsoleScreenBufferInfo.dwSize.Y;
  500. {GetHeight:=ScreenHeight;}
  501. end;
  502. procedure TWin32Screen.GetLine(Line: integer; var Text, Attr: string);
  503. type
  504. CharInfoArray = Array [0..255] of Char_Info;
  505. var
  506. LineBuf : ^CharInfoArray;
  507. BufSize,BufCoord : Coord;
  508. i,LineSize : longint;
  509. WriteRegion : SMALL_RECT;
  510. begin
  511. GetMem(LineBuf,SizeOf(CharInfoArray));
  512. LineSize:=ScreenWidth;
  513. If LineSize>256 then
  514. LineSize:=256;
  515. BufSize.X:=LineSize;
  516. BufSize.Y:=1;
  517. BufCoord.X:=0;
  518. BufCoord.Y:=0;
  519. with WriteRegion do
  520. begin
  521. Top :=Line;
  522. Left :=0;
  523. Bottom := Line+1;
  524. Right := LineSize-1;
  525. end;
  526. ReadConsoleOutput(DosScreenBufferHandle, PChar_info(LineBuf),
  527. BufSize, BufCoord, @WriteRegion);
  528. for i:=1 to LineSize do
  529. begin
  530. Text[i]:=LineBuf^[i-1].AsciiChar;
  531. Attr[i]:=char(byte(LineBuf^[i-1].Attributes));
  532. end;
  533. FreeMem(LineBuf,SizeOf(CharInfoArray));
  534. Text[0]:=char(byte(LineSize));
  535. Attr[0]:=char(byte(LineSize));
  536. end;
  537. procedure TWin32Screen.GetCursorPos(var P: TPoint);
  538. var
  539. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  540. begin
  541. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  542. @ConsoleScreenBufferInfo);
  543. P.X:=ConsoleScreenBufferInfo.dwCursorPosition.X;
  544. P.Y:=ConsoleScreenBufferInfo.dwCursorPosition.Y;
  545. end;
  546. procedure TWin32Screen.BufferCopy(Src, Dest : THandle);
  547. type
  548. CharInfoArray = Array [0..256*255-1] of Char_Info;
  549. var
  550. LineBuf : ^CharInfoArray;
  551. BufSize,BufCoord : Coord;
  552. LineSize : longint;
  553. WriteRegion : SMALL_RECT;
  554. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  555. begin
  556. GetMem(LineBuf,SizeOf(CharInfoArray));
  557. LineSize:=ScreenWidth;
  558. If LineSize>256 then
  559. LineSize:=256;
  560. BufSize.X:=LineSize;
  561. BufSize.Y:=ScreenHeight;
  562. BufCoord.X:=0;
  563. BufCoord.Y:=0;
  564. with WriteRegion do
  565. begin
  566. Top :=0;
  567. Left :=0;
  568. Bottom := ScreenHeight-1;
  569. Right := LineSize-1;
  570. end;
  571. ReadConsoleOutput(Src, PChar_info(LineBuf),
  572. BufSize, BufCoord, @WriteRegion);
  573. WriteConsoleOutput(Dest, PChar_info(LineBuf),
  574. BufSize, BufCoord, @WriteRegion);
  575. FreeMem(LineBuf,SizeOf(CharInfoArray));
  576. GetConsoleScreenBufferInfo(Src,
  577. @ConsoleScreenBufferInfo);
  578. SetConsoleCursorPosition(Dest, ConsoleScreenBufferInfo.dwCursorPosition);
  579. end;
  580. procedure TWin32Screen.Capture;
  581. begin
  582. BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle);
  583. end;
  584. procedure TWin32Screen.SwitchTo;
  585. begin
  586. SetConsoleActiveScreenBuffer(DosScreenBufferHandle);
  587. SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
  588. IDEActive:=false;
  589. end;
  590. procedure TWin32Screen.SwitchBack;
  591. begin
  592. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  593. SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
  594. IDEActive:=true;
  595. end;
  596. {$endif}
  597. {****************************************************************************
  598. Initialize
  599. ****************************************************************************}
  600. procedure InitUserScreen;
  601. begin
  602. {$ifdef DOS}
  603. UserScreen:=New(PDOSScreen, Init);
  604. {$else}
  605. {$ifdef LINUX}
  606. UserScreen:=New(PLinuxScreen, Init);
  607. {$else}
  608. {$ifdef Win32}
  609. UserScreen:=New(PWin32Screen, Init);
  610. {$else}
  611. UserScreen:=New(PScreen, Init);
  612. {$endif Win32}
  613. {$endif Linux}
  614. {$endif Dos}
  615. end;
  616. procedure DoneUserScreen;
  617. begin
  618. if UserScreen<>nil then
  619. begin
  620. UserScreen^.SwitchTo;
  621. Dispose(UserScreen, Done);
  622. UserScreen:=nil;
  623. end;
  624. end;
  625. end.
  626. {
  627. $Log$
  628. Revision 1.4 2000-09-18 16:42:56 jonas
  629. * for some reason, tlinuxscreen.switchto() contained some saving code
  630. while it should've been empty (like in the fixes branch)
  631. Revision 1.3 2000/08/22 09:41:40 pierre
  632. * first big merge from fixes branch
  633. Revision 1.2 2000/08/21 10:57:01 jonas
  634. * IDE screen saving/restoring implemented for Linux (merged from fixes
  635. branch)
  636. Revision 1.1 2000/07/13 09:48:36 michael
  637. + Initial import
  638. }