fpusrscr.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  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 Unix}
  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. IDE_size : longint;
  85. end;
  86. {$endif}
  87. {$ifdef win32}
  88. PWin32Screen = ^TWin32Screen;
  89. TWin32Screen = object(TScreen)
  90. constructor Init;
  91. destructor Done; virtual;
  92. public
  93. function GetWidth: integer; virtual;
  94. function GetHeight: integer; virtual;
  95. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  96. procedure GetCursorPos(var P: TPoint); virtual;
  97. procedure Capture; virtual;
  98. procedure SwitchTo; virtual;
  99. procedure SwitchBack; virtual;
  100. private
  101. DosScreenBufferHandle,
  102. IDEScreenBufferHandle : THandle;
  103. IDEActive : boolean;
  104. procedure BufferCopy(src,dest : THandle);
  105. end;
  106. {$endif}
  107. procedure InitUserScreen;
  108. procedure DoneUserScreen;
  109. const UserScreen : PScreen = nil;
  110. implementation
  111. uses
  112. Dos
  113. (* {$ifdef TP}
  114. {$ifdef DPMI}
  115. ,WinAPI
  116. {$endif}
  117. {$endif}*)
  118. {$ifdef FPC}
  119. {$ifdef GO32V2}
  120. ,Go32
  121. {$endif}
  122. {$endif}
  123. {$ifdef VESA}
  124. ,VESA
  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. {$ifdef VESA}
  302. VESAGetMode(MI.Mode);
  303. {$endif}
  304. MI.Rows:=MI.ScreenSize div (MI.Cols*2);
  305. if MI.Rows=51 then MI.Rows:=50;
  306. r.ah:=$03;
  307. r.bh:=MI.Page;
  308. intr($10,r);
  309. with MI do
  310. begin
  311. CurPos.X:=r.dl; CurPos.Y:=r.dh;
  312. CurShapeT:=r.ch; CurShapeB:=r.cl;
  313. end;
  314. (*
  315. {$ifdef TP}
  316. { check VGA functions }
  317. MI.StateSize:=0;
  318. r.ah:=$1c; r.al:=0; r.cx:=7; intr($10,r);
  319. if (r.al=$1c) and ((r.flags and fCarry)=0) and (r.bx>0) then
  320. begin
  321. MI.StateSize:=r.bx;
  322. GetMem(MI.StateBuf,MI.StateSize); FillChar(MI.StateBuf^,MI.StateSize,0);
  323. P:=MI.StateBuf;
  324. {$ifdef DPMI}
  325. Sel:=GlobalDosAlloc(MI.StateSize);
  326. P:=Ptr(Sel shr 16,0);
  327. {$endif}
  328. r.ah:=$1c; r.al:=1; r.cx:=7;
  329. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  330. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  331. {$ifdef DPMI}
  332. Move(Ptr(Sel and $ffff,0)^,MI.StateBuf^,MI.StateSize);
  333. GlobalDosFree(Sel and $ffff);
  334. {$endif}
  335. end;
  336. {$endif}
  337. *)
  338. end;
  339. procedure TDOSScreen.SetVideoMode(MI: TDOSVideoInfo);
  340. var r: registers;
  341. CM: TDOSVideoInfo;
  342. {$ifdef TP}
  343. P: pointer;
  344. Sel: longint;
  345. {$I realintr.inc}
  346. {$endif}
  347. begin
  348. FillChar(CM,sizeof(CM),0);
  349. GetVideoMode(CM);
  350. if (CM.Mode<>MI.Mode) or (CM.Cols<>MI.Cols) or (CM.Rows<>MI.Rows) then
  351. begin
  352. {$ifdef VESA}
  353. if MI.Mode>=$100 then
  354. VESASetMode(MI.Mode)
  355. else
  356. {$endif}
  357. begin
  358. r.ah:=$00; r.al:=MI.Mode; intr($10,r);
  359. end;
  360. if (MI.Mode=3) and (MI.Cols=80) and (MI.Rows=50) then
  361. begin
  362. r.ax:=$1112; r.bx:=$0;
  363. intr($10,r);
  364. end;
  365. end;
  366. r.ah:=$05; r.al:=MI.Page; intr($10,r);
  367. r.ah:=$02; r.bh:=MI.Page; r.dl:=MI.CurPos.X; r.dh:=MI.CurPos.Y; intr($10,r);
  368. r.ah:=$01; r.ch:=MI.CurShapeT; r.cl:=MI.CurShapeB; intr($10,r);
  369. (*
  370. {$ifdef TP}
  371. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  372. begin
  373. P:=MI.StateBuf;
  374. {$ifdef DPMI}
  375. Sel:=GlobalDosAlloc(MI.StateSize);
  376. Move(MI.StateBuf^,ptr(Sel and $ffff,0)^,MI.StateSize);
  377. P:=Ptr(Sel shr 16,0);
  378. {$endif}
  379. r.ah:=$1c; r.al:=2; r.cx:=7;
  380. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  381. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  382. {$ifdef DPMI}
  383. GlobalDosFree(Sel and $ffff);
  384. {$endif}
  385. end;
  386. {$endif}
  387. *)
  388. end;
  389. {$endif}
  390. {****************************************************************************
  391. TLinuxScreen
  392. ****************************************************************************}
  393. {$ifdef Unix}
  394. constructor TLinuxScreen.Init;
  395. begin
  396. inherited Init;
  397. IDE_screen := nil;
  398. end;
  399. destructor TLinuxScreen.Done;
  400. begin
  401. inherited Done;
  402. end;
  403. function TLinuxScreen.GetWidth: integer;
  404. begin
  405. GetWidth:=ScreenWidth;
  406. end;
  407. function TLinuxScreen.GetHeight: integer;
  408. begin
  409. GetHeight:=ScreenHeight;
  410. end;
  411. procedure TLinuxScreen.GetLine(Line: integer; var Text, Attr: string);
  412. begin
  413. Text:='';
  414. Attr:='';
  415. end;
  416. procedure TLinuxScreen.GetCursorPos(var P: TPoint);
  417. begin
  418. P.X:=0;
  419. P.Y:=0;
  420. end;
  421. procedure TLinuxScreen.Capture;
  422. begin
  423. if assigned(IDE_screen) then
  424. dispose(IDE_screen);
  425. getmem(IDE_screen,videobufsize);
  426. Ide_size:=videobufsize;
  427. move(videobuf^,IDE_screen^,videobufsize);
  428. end;
  429. procedure TLinuxScreen.SwitchTo;
  430. begin
  431. end;
  432. procedure TLinuxScreen.SwitchBack;
  433. begin
  434. if IDE_screen = nil then
  435. exit;
  436. move(IDE_screen^,videobuf^,videobufsize);
  437. freemem(IDE_screen,Ide_size);
  438. IDE_screen := nil;
  439. end;
  440. {$endif}
  441. {****************************************************************************
  442. TWin32Screen
  443. ****************************************************************************}
  444. {$ifdef win32}
  445. constructor TWin32Screen.Init;
  446. var
  447. SecurityAttr : Security_attributes;
  448. BigWin : Coord;
  449. res : boolean;
  450. Error : dword;
  451. begin
  452. inherited Init;
  453. SecurityAttr.nLength:=SizeOf(Security_attributes);
  454. SecurityAttr.lpSecurityDescriptor:=nil;
  455. SecurityAttr.bInheritHandle:=false;
  456. DosScreenBufferHandle:=CreateConsoleScreenBuffer(
  457. GENERIC_READ or GENERIC_WRITE,
  458. 0,SecurityAttr,
  459. CONSOLE_TEXTMODE_BUFFER,nil);
  460. IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
  461. {$ifdef win32bigwin}
  462. BigWin.X:=80;
  463. BigWin.Y:=50;
  464. SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
  465. SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin);
  466. BigWin.X:=80;
  467. BigWin.Y:=50;
  468. { Try to allow to store more info }
  469. res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
  470. if not res then
  471. error:=GetLastError;
  472. {$endif win32bigwin}
  473. Capture;
  474. SwitchBack;
  475. end;
  476. destructor TWin32Screen.Done;
  477. begin
  478. { copy the Dos buffer content into the original ScreenBuffer
  479. which remains the startup std_output_handle PM }
  480. BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
  481. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  482. SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
  483. CloseHandle(DosScreenBufferHandle);
  484. inherited Done;
  485. end;
  486. function TWin32Screen.GetWidth: integer;
  487. var
  488. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  489. begin
  490. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  491. @ConsoleScreenBufferInfo);
  492. GetWidth:=ConsoleScreenBufferInfo.dwSize.X;
  493. {GetWidth:=ScreenWidth;}
  494. end;
  495. function TWin32Screen.GetHeight: integer;
  496. var
  497. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  498. begin
  499. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  500. @ConsoleScreenBufferInfo);
  501. GetHeight:=ConsoleScreenBufferInfo.dwSize.Y;
  502. {GetHeight:=ScreenHeight;}
  503. end;
  504. procedure TWin32Screen.GetLine(Line: integer; var Text, Attr: string);
  505. type
  506. CharInfoArray = Array [0..255] of Char_Info;
  507. var
  508. LineBuf : ^CharInfoArray;
  509. BufSize,BufCoord : Coord;
  510. i,LineSize : longint;
  511. WriteRegion : SMALL_RECT;
  512. begin
  513. GetMem(LineBuf,SizeOf(CharInfoArray));
  514. LineSize:=ScreenWidth;
  515. If LineSize>256 then
  516. LineSize:=256;
  517. BufSize.X:=LineSize;
  518. BufSize.Y:=1;
  519. BufCoord.X:=0;
  520. BufCoord.Y:=0;
  521. with WriteRegion do
  522. begin
  523. Top :=Line;
  524. Left :=0;
  525. Bottom := Line+1;
  526. Right := LineSize-1;
  527. end;
  528. ReadConsoleOutput(DosScreenBufferHandle, PChar_info(LineBuf),
  529. BufSize, BufCoord, @WriteRegion);
  530. for i:=1 to LineSize do
  531. begin
  532. Text[i]:=LineBuf^[i-1].AsciiChar;
  533. Attr[i]:=char(byte(LineBuf^[i-1].Attributes));
  534. end;
  535. FreeMem(LineBuf,SizeOf(CharInfoArray));
  536. Text[0]:=char(byte(LineSize));
  537. Attr[0]:=char(byte(LineSize));
  538. end;
  539. procedure TWin32Screen.GetCursorPos(var P: TPoint);
  540. var
  541. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  542. begin
  543. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  544. @ConsoleScreenBufferInfo);
  545. P.X:=ConsoleScreenBufferInfo.dwCursorPosition.X;
  546. P.Y:=ConsoleScreenBufferInfo.dwCursorPosition.Y;
  547. end;
  548. procedure TWin32Screen.BufferCopy(Src, Dest : THandle);
  549. type
  550. CharInfoArray = Array [0..256*255-1] of Char_Info;
  551. var
  552. LineBuf : ^CharInfoArray;
  553. BufSize,BufCoord : Coord;
  554. LineSize : longint;
  555. WriteRegion : SMALL_RECT;
  556. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  557. begin
  558. GetMem(LineBuf,SizeOf(CharInfoArray));
  559. LineSize:=ScreenWidth;
  560. If LineSize>256 then
  561. LineSize:=256;
  562. BufSize.X:=LineSize;
  563. BufSize.Y:=ScreenHeight;
  564. BufCoord.X:=0;
  565. BufCoord.Y:=0;
  566. with WriteRegion do
  567. begin
  568. Top :=0;
  569. Left :=0;
  570. Bottom := ScreenHeight-1;
  571. Right := LineSize-1;
  572. end;
  573. ReadConsoleOutput(Src, PChar_info(LineBuf),
  574. BufSize, BufCoord, @WriteRegion);
  575. WriteConsoleOutput(Dest, PChar_info(LineBuf),
  576. BufSize, BufCoord, @WriteRegion);
  577. FreeMem(LineBuf,SizeOf(CharInfoArray));
  578. GetConsoleScreenBufferInfo(Src,
  579. @ConsoleScreenBufferInfo);
  580. SetConsoleCursorPosition(Dest, ConsoleScreenBufferInfo.dwCursorPosition);
  581. end;
  582. procedure TWin32Screen.Capture;
  583. begin
  584. BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle);
  585. end;
  586. procedure TWin32Screen.SwitchTo;
  587. begin
  588. SetConsoleActiveScreenBuffer(DosScreenBufferHandle);
  589. SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
  590. IDEActive:=false;
  591. end;
  592. procedure TWin32Screen.SwitchBack;
  593. begin
  594. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  595. SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
  596. IDEActive:=true;
  597. end;
  598. {$endif}
  599. {****************************************************************************
  600. Initialize
  601. ****************************************************************************}
  602. procedure InitUserScreen;
  603. begin
  604. {$ifdef DOS}
  605. UserScreen:=New(PDOSScreen, Init);
  606. {$else}
  607. {$ifdef Unix}
  608. UserScreen:=New(PLinuxScreen, Init);
  609. {$else}
  610. {$ifdef Win32}
  611. UserScreen:=New(PWin32Screen, Init);
  612. {$else}
  613. UserScreen:=New(PScreen, Init);
  614. {$endif Win32}
  615. {$endif Unix}
  616. {$endif Dos}
  617. end;
  618. procedure DoneUserScreen;
  619. begin
  620. if UserScreen<>nil then
  621. begin
  622. UserScreen^.SwitchTo;
  623. Dispose(UserScreen, Done);
  624. UserScreen:=nil;
  625. end;
  626. end;
  627. end.
  628. {
  629. $Log$
  630. Revision 1.6 2000-11-15 00:14:10 pierre
  631. new merge
  632. Revision 1.1.2.4 2000/11/14 09:23:56 marco
  633. * Second batch
  634. Revision 1.5 2000/10/31 22:35:55 pierre
  635. * New big merge from fixes branch
  636. Revision 1.1.2.3 2000/10/10 21:24:56 pierre
  637. * avoid writing past IDE_screen buffer length
  638. Revision 1.4 2000/09/18 16:42:56 jonas
  639. * for some reason, tlinuxscreen.switchto() contained some saving code
  640. while it should've been empty (like in the fixes branch)
  641. Revision 1.3 2000/08/22 09:41:40 pierre
  642. * first big merge from fixes branch
  643. Revision 1.2 2000/08/21 10:57:01 jonas
  644. * IDE screen saving/restoring implemented for Linux (merged from fixes
  645. branch)
  646. Revision 1.1.2.2 2000/08/21 12:10:19 jonas
  647. * fixed errors in my previous commit, it now works properly
  648. Revision 1.1.2.1 2000/08/21 10:51:13 jonas
  649. * IDE screen saving/restoring implemented for Linux
  650. Revision 1.1 2000/07/13 09:48:36 michael
  651. + Initial import
  652. }