fpusrscr.pas 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  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. {$ifdef Unix}
  20. {$ifdef VER1_0}
  21. linux,
  22. {$else}
  23. unix,
  24. {$endif}
  25. {$endif}
  26. video,Objects;
  27. type
  28. PScreen = ^TScreen;
  29. TScreen = object(TObject)
  30. function GetWidth: integer; virtual;
  31. function GetHeight: integer; virtual;
  32. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  33. procedure GetCursorPos(var P: TPoint); virtual;
  34. { copy the initial video screen in the ide screen }
  35. procedure Capture; virtual;
  36. { move up or down if supported by OS }
  37. function Scroll(i : integer) : integer; virtual;
  38. { saves the current IDE screen }
  39. procedure SaveIDEScreen; virtual;
  40. { saves the current console screen }
  41. procedure SaveConsoleScreen; virtual;
  42. { restores the saved console screen }
  43. procedure SwitchToConsoleScreen; virtual;
  44. { restores the saved IDE screen }
  45. procedure SwitchBackToIDEScreen; virtual;
  46. end;
  47. {$ifdef DOS}
  48. TDOSVideoInfo = record
  49. Mode : word;
  50. ScreenSize: word;
  51. Page : byte;
  52. Rows,Cols : integer;
  53. CurPos : TPoint;
  54. CurShapeT : integer;
  55. CurShapeB : integer;
  56. StateSize : word;
  57. StateBuf : pointer;
  58. end;
  59. PDOSScreen = ^TDOSScreen;
  60. TDOSScreen = object(TScreen)
  61. constructor Init;
  62. destructor Done; virtual;
  63. public
  64. function GetWidth: integer; virtual;
  65. function GetHeight: integer; virtual;
  66. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  67. procedure GetCursorPos(var P: TPoint); virtual;
  68. procedure Capture; virtual;
  69. procedure SaveIDEScreen; virtual;
  70. procedure SaveConsoleScreen; virtual;
  71. procedure SwitchToConsoleScreen; virtual;
  72. procedure SwitchBackToIDEScreen; virtual;
  73. private
  74. ConsoleVideoInfo : TDOSVideoInfo;
  75. VBufferSize : longint;
  76. VIDEBufferSize : longint;
  77. VBuffer : PByteArray;
  78. VIDEBuffer : PByteArray;
  79. IDEVideoInfo : TDOSVideoInfo;
  80. ctrl_c_state : boolean;
  81. {$ifdef USE_GRAPH_SWITCH}
  82. GraphImageSize : longint;
  83. GraphBuffer : pointer;
  84. ConsoleGraphDriver, ConsoleGraphMode : word;
  85. {$endif USE_GRAPH_SWITCH}
  86. function GetLineStartOfs(Line: integer): word;
  87. procedure GetBuffer(Size: word);
  88. procedure FreeBuffer;
  89. procedure GetVideoMode(var MI: TDOSVideoInfo);
  90. procedure SetVideoMode(MI: TDOSVideoInfo);
  91. end;
  92. {$endif}
  93. {$ifdef Unix}
  94. TConsoleType = (ttyNetwork,ttyLinux,ttyFreeBSD,ttyNetBSD);
  95. PLinuxScreen = ^TLinuxScreen;
  96. TLinuxScreen = object(TScreen)
  97. constructor Init;
  98. destructor Done; virtual;
  99. public
  100. function GetWidth: integer; virtual;
  101. function GetHeight: integer; virtual;
  102. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  103. procedure GetCursorPos(var P: TPoint); virtual;
  104. procedure Capture; virtual;
  105. procedure SaveIDEScreen; virtual;
  106. procedure SaveConsoleScreen; virtual;
  107. procedure SwitchToConsoleScreen; virtual;
  108. procedure SwitchBackToIDEScreen; virtual;
  109. private
  110. IdeScreen: PByteArray;
  111. IdeSize : longint;
  112. IsXterm : boolean;
  113. Console : TConsoleType;
  114. TTyfd : longint;
  115. ConsVideoBuf : PByteArray;
  116. ConsHeight, ConsWidth,
  117. ConsCursorX, ConsCursorY : byte;
  118. ConsVideoBufSize : longint;
  119. ConsTio : termios;
  120. ConsTioValid : boolean;
  121. end;
  122. {$endif}
  123. {$ifdef win32}
  124. PWin32Screen = ^TWin32Screen;
  125. TWin32Screen = object(TScreen)
  126. constructor Init;
  127. destructor Done; virtual;
  128. public
  129. function GetWidth: integer; virtual;
  130. function GetHeight: integer; virtual;
  131. procedure GetLine(Line: integer; var Text, Attr: string); virtual;
  132. procedure GetCursorPos(var P: TPoint); virtual;
  133. function Scroll(i : integer) : integer; virtual;
  134. procedure Capture; virtual;
  135. procedure SaveIDEScreen; virtual;
  136. procedure SaveConsoleScreen; virtual;
  137. procedure SwitchToConsoleScreen; virtual;
  138. procedure SwitchBackToIDEScreen; virtual;
  139. private
  140. DosScreenBufferHandle,
  141. IDEScreenBufferHandle,
  142. StartScreenBufferHandle,
  143. DummyScreenBufferHandle,
  144. NewScreenBufferHandle : THandle;
  145. IDEActive : boolean;
  146. ConsoleMode,IdeMode : Dword;
  147. IdeScreenMode : TVideoMode;
  148. procedure BufferCopy(src,dest : THandle);
  149. end;
  150. {$endif}
  151. procedure InitUserScreen;
  152. procedure DoneUserScreen;
  153. const UserScreen : PScreen = nil;
  154. implementation
  155. uses
  156. Dos
  157. (* {$ifdef TP}
  158. {$ifdef DPMI}
  159. ,WinAPI
  160. {$endif}
  161. {$endif}*)
  162. {$ifdef FPC}
  163. {$ifdef GO32V2}
  164. ,Dpmiexcp, Go32
  165. {$endif}
  166. {$endif}
  167. ,Drivers,App
  168. {$ifdef USE_GRAPH_SWITCH}
  169. ,Graph,VESA
  170. {$else not USE_GRAPH_SWITCH}
  171. {$ifdef VESA}
  172. ,VESA
  173. {$endif VESA}
  174. {$endif not USE_GRAPH_SWITCH}
  175. ;
  176. function TScreen.GetWidth: integer;
  177. begin
  178. Getwidth:=0;
  179. Abstract;
  180. end;
  181. function TScreen.GetHeight: integer;
  182. begin
  183. Getheight:=0;
  184. Abstract;
  185. end;
  186. procedure TScreen.GetLine(Line: integer; var Text, Attr: string);
  187. begin
  188. Abstract;
  189. end;
  190. procedure TScreen.GetCursorPos(var P: TPoint);
  191. begin
  192. Abstract;
  193. end;
  194. procedure TScreen.Capture;
  195. begin
  196. Abstract;
  197. end;
  198. procedure TScreen.SwitchToConsoleScreen;
  199. begin
  200. Abstract;
  201. end;
  202. procedure TScreen.SwitchBackToIDEScreen;
  203. begin
  204. Abstract;
  205. end;
  206. procedure TScreen.SaveIDEScreen;
  207. begin
  208. Abstract;
  209. end;
  210. function TScreen.Scroll(i : integer) : integer;
  211. begin
  212. Scroll:=0;
  213. end;
  214. procedure TScreen.SaveConsoleScreen;
  215. begin
  216. Abstract;
  217. end;
  218. {****************************************************************************
  219. TDOSScreen
  220. ****************************************************************************}
  221. {$ifdef DOS}
  222. constructor TDOSScreen.Init;
  223. begin
  224. inherited Init;
  225. Capture;
  226. { get the current ctrl-C state }
  227. Ctrl_c_state:=djgpp_set_ctrl_c(false);
  228. djgpp_set_ctrl_c(Ctrl_c_state);
  229. end;
  230. destructor TDOSScreen.Done;
  231. begin
  232. FreeBuffer;
  233. if assigned(VIDEBuffer) then
  234. FreeMem(VIDEBuffer,VIDEBufferSize);
  235. inherited Done;
  236. end;
  237. function TDOSScreen.GetWidth: integer;
  238. begin
  239. GetWidth:=ConsoleVideoInfo.Cols;
  240. end;
  241. function TDOSScreen.GetHeight: integer;
  242. begin
  243. GetHeight:=ConsoleVideoInfo.Rows;
  244. end;
  245. procedure TDOSScreen.GetLine(Line: integer; var Text, Attr: string);
  246. var
  247. X: integer;
  248. W: word;
  249. begin
  250. Text:=''; Attr:='';
  251. { VBuffer remains empty if in graph mode ... PM }
  252. if (Line<GetHeight) and assigned(VBuffer) then
  253. begin
  254. W:=GetLineStartOfs(Line);
  255. for X:=0 to GetWidth-1 do
  256. begin
  257. {Text:=Text+chr(VBuffer^[W+X*2]);
  258. Attr:=Attr+chr(VBuffer^[W+X*2+1]);}
  259. System.Insert(chr(VBuffer^[W+X*2]),Text,Length(Text)+1);
  260. System.Insert(chr(VBuffer^[W+X*2+1]),Attr,Length(Attr)+1);
  261. end;
  262. {$ifdef USE_GRAPH_SWITCH}
  263. end
  264. else if assigned(GraphBuffer) and (Line=0) then
  265. Text:='Console in graph mode, use Alt+F5';
  266. {$else not USE_GRAPH_SWITCH}
  267. end;
  268. {$endif USE_GRAPH_SWITCH}
  269. end;
  270. procedure TDOSScreen.GetCursorPos(var P: TPoint);
  271. begin
  272. P:=ConsoleVideoInfo.CurPos;
  273. end;
  274. procedure TDOSScreen.Capture;
  275. begin
  276. SaveConsoleScreen;
  277. end;
  278. procedure TDosScreen.SaveIDEScreen;
  279. var
  280. VSeg,SOfs: word;
  281. begin
  282. GetVideoMode(IDEVideoInfo);
  283. { First keep a copy of IDE screen }
  284. if ConsoleVideoInfo.Mode=7 then
  285. VSeg:=SegB000
  286. else
  287. VSeg:=SegB800;
  288. SOfs:=MemW[Seg0040:$4e];
  289. if not assigned(VIDEBuffer) or (VIDEBufferSize<>IDEVideoInfo.ScreenSize) then
  290. begin
  291. if assigned(VIDEBuffer) then
  292. FreeMem(VIDEBuffer,VIDEBufferSize);
  293. GetMem(VIDEBuffer,IDEVideoInfo.ScreenSize);
  294. VIDEBufferSize:=IDEVideoInfo.ScreenSize;
  295. end;
  296. {$ifdef FPC}
  297. DosmemGet(VSeg,SOfs,VIDEBuffer^,IDEVideoInfo.ScreenSize);
  298. {$else}
  299. Move(ptr(VSeg,SOfs)^,VIDEBuffer^,IDEVideoInfo.ScreenSize);
  300. {$endif}
  301. end;
  302. procedure TDosScreen.SaveConsoleScreen;
  303. var
  304. VSeg,SOfs: word;
  305. {$ifdef USE_GRAPH_SWITCH}
  306. saved : boolean;
  307. GraphDriver,GraphMode : integer;
  308. {$endif USE_GRAPH_SWITCH}
  309. begin
  310. GetVideoMode(ConsoleVideoInfo);
  311. {$ifdef USE_GRAPH_SWITCH}
  312. saved:=false;
  313. if assigned(GraphBuffer) then
  314. begin
  315. FreeMem(GraphBuffer,GraphImageSize);
  316. GraphBuffer:=nil;
  317. GraphImageSize:=0;
  318. end;
  319. if (ConsoleVideoInfo.Mode>= $100) or
  320. (ConsoleVideoInfo.Mode=$13) or
  321. (ConsoleVideoInfo.Mode=$12) or
  322. (ConsoleVideoInfo.Mode=$10) or
  323. (ConsoleVideoInfo.Mode=$E) then
  324. begin
  325. if VesaSetMode(ConsoleVideoInfo.Mode or $8000) then
  326. begin
  327. Graph.DontClearGraphMemory:=true;
  328. if ConsoleVideoInfo.Mode>=$100 then
  329. begin
  330. GraphDriver:=Graph.Vesa;
  331. GraphMode:=ConsoleVideoInfo.Mode and $fff;
  332. end
  333. else
  334. begin
  335. GraphDriver:=Graph.VGA;
  336. case ConsoleVideoInfo.Mode of
  337. $E : GraphMode:=VGALo;
  338. $10 : GraphMode:=VGAMed;
  339. $12 : GraphMode:=VGAHi;
  340. $13 : begin
  341. GraphDriver:=Graph.LowRes;
  342. GraphMode:=0;
  343. end;
  344. end;
  345. end;
  346. Graph.InitGraph(GraphDriver,GraphMode,'');
  347. if graphresult=grOk then
  348. begin
  349. ConsoleGraphDriver:=GraphDriver;
  350. ConsoleGraphMode:=GraphMode;
  351. Graph.DontClearGraphMemory:=false;
  352. GraphImageSize:=ImageSize(0,0,Graph.GetmaxX,Graph.GetMaxY);
  353. GetMem(GraphBuffer,GraphImageSize);
  354. FillChar(GraphBuffer^,GraphImageSize,#0);
  355. GetImage(0,0,Graph.GetmaxX,Graph.GetMaxY,GraphBuffer^);
  356. ConsoleVideoInfo.Rows:=Graph.GetMaxY div 8;
  357. ConsoleVideoInfo.Cols:=Graph.GetMaxX div 8;
  358. FreeBuffer;
  359. saved:=true;
  360. end
  361. {$ifdef DEBUG}
  362. else
  363. Writeln(stderr,'Error in InitGraph ',Graphdriver, ' ',Graphmode)
  364. {$endif DEBUG}
  365. ;
  366. end;
  367. end;
  368. { mode < $100 so use standard Save code }
  369. if not saved then
  370. {$endif USE_GRAPH_SWITCH}
  371. begin
  372. GetBuffer(ConsoleVideoInfo.ScreenSize);
  373. if ConsoleVideoInfo.Mode=7 then
  374. VSeg:=SegB000
  375. else
  376. VSeg:=SegB800;
  377. SOfs:=MemW[Seg0040:$4e];
  378. {$ifdef FPC}
  379. DosmemGet(VSeg,SOfs,VBuffer^,ConsoleVideoInfo.ScreenSize);
  380. {$else}
  381. Move(ptr(VSeg,SOfs)^,VBuffer^,ConsoleVideoInfo.ScreenSize);
  382. {$endif}
  383. end;
  384. end;
  385. procedure TDOSScreen.SwitchToConsoleScreen;
  386. var
  387. VSeg,SOfs: word;
  388. {$ifdef USE_GRAPH_SWITCH}
  389. restored : boolean;
  390. GraphDriver,GraphMode : integer;
  391. {$endif USE_GRAPH_SWITCH}
  392. begin
  393. SetVideoMode(ConsoleVideoInfo);
  394. {$ifdef USE_GRAPH_SWITCH}
  395. restored:=false;
  396. if assigned(GraphBuffer) then
  397. begin
  398. if VesaSetMode(ConsoleVideoInfo.Mode) then
  399. begin
  400. if ConsoleVideoInfo.Mode>=$100 then
  401. begin
  402. GraphDriver:=Graph.Vesa;
  403. GraphMode:=ConsoleVideoInfo.Mode and $fff;
  404. end
  405. else
  406. begin
  407. GraphDriver:=Graph.VGA;
  408. case ConsoleVideoInfo.Mode of
  409. $E : GraphMode:=VGALo;
  410. $10 : GraphMode:=VGAMed;
  411. $12 : GraphMode:=VGAHi;
  412. $13 : begin
  413. GraphDriver:=Graph.LowRes;
  414. GraphMode:=0;
  415. end;
  416. end;
  417. end;
  418. if (ConsoleGraphDriver<>GraphDriver) or
  419. (ConsoleGraphMode<>GraphMode) then
  420. Graph.InitGraph(GraphDriver,GraphMode,'');
  421. if graphresult=grOk then
  422. begin
  423. PutImage(0,0,GraphBuffer^,CopyPut);
  424. FreeMem(GraphBuffer,GraphImageSize);
  425. GraphBuffer:=nil;
  426. GraphImageSize:=0;
  427. restored:=true;
  428. end;
  429. end;
  430. end;
  431. { mode < $100 so use standard Save code }
  432. if not restored then
  433. {$endif USE_GRAPH_SWITCH}
  434. begin
  435. if ConsoleVideoInfo.Mode=7 then
  436. VSeg:=SegB000
  437. else
  438. VSeg:=SegB800;
  439. SOfs:=MemW[Seg0040:$4e];
  440. {$ifdef FPC}
  441. DosmemPut(VSeg,SOfs,VBuffer^,ConsoleVideoInfo.ScreenSize);
  442. djgpp_set_ctrl_c(Ctrl_c_state);
  443. {$else}
  444. Move(VBuffer^,ptr(VSeg,SOfs)^,ConsoleVideoInfo.ScreenSize);
  445. {$endif}
  446. end;
  447. end;
  448. procedure TDOSScreen.SwitchBackToIDEScreen;
  449. var
  450. VSeg,SOfs: word;
  451. begin
  452. SetVideoMode(IDEVideoInfo);
  453. if ConsoleVideoInfo.Mode=7 then
  454. VSeg:=SegB000
  455. else
  456. VSeg:=SegB800;
  457. SOfs:=MemW[Seg0040:$4e];
  458. if assigned(VIDEBuffer) then
  459. {$ifdef FPC}
  460. DosmemPut(VSeg,SOfs,VIDEBuffer^,IDEVideoInfo.ScreenSize);
  461. Ctrl_c_state := djgpp_set_ctrl_c(false);
  462. {$else}
  463. Move(VIDEBuffer^,ptr(VSeg,SOfs)^,IDEVideoInfo.ScreenSize);
  464. {$endif}
  465. end;
  466. function TDOSScreen.GetLineStartOfs(Line: integer): word;
  467. begin
  468. GetLineStartOfs:=(ConsoleVideoInfo.Cols*Line)*2;
  469. end;
  470. procedure TDOSScreen.GetBuffer(Size: word);
  471. begin
  472. if (VBuffer<>nil) and (VBufferSize=Size) then Exit;
  473. if VBuffer<>nil then FreeBuffer;
  474. VBufferSize:=Size;
  475. GetMem(VBuffer,VBufferSize);
  476. end;
  477. procedure TDOSScreen.FreeBuffer;
  478. begin
  479. if (VBuffer<>nil) and (VBufferSize>0) then FreeMem(VBuffer,VBufferSize);
  480. VBuffer:=nil;
  481. end;
  482. procedure TDOSScreen.GetVideoMode(var MI: TDOSVideoInfo);
  483. var
  484. r: registers;
  485. {$ifdef TP}
  486. P: pointer;
  487. Sel: longint;
  488. (* {$I realintr.inc} *)
  489. {$endif}
  490. begin
  491. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  492. begin FreeMem(MI.StateBuf,MI.StateSize); MI.StateBuf:=nil; end;
  493. MI.ScreenSize:=MemW[Seg0040:$4c];
  494. r.ah:=$0f;
  495. intr($10,r);
  496. MI.Mode:=r.al;
  497. MI.Page:=r.bh;
  498. MI.Cols:=r.ah;
  499. {$ifdef VESA}
  500. VESAGetMode(MI.Mode);
  501. MI.Mode:=MI.Mode and $fff;
  502. {$endif}
  503. MI.Rows:=MI.ScreenSize div (MI.Cols*2);
  504. if MI.Rows=51 then MI.Rows:=50;
  505. r.ah:=$03;
  506. r.bh:=MI.Page;
  507. intr($10,r);
  508. with MI do
  509. begin
  510. CurPos.X:=r.dl; CurPos.Y:=r.dh;
  511. CurShapeT:=r.ch; CurShapeB:=r.cl;
  512. end;
  513. (*
  514. {$ifdef TP}
  515. { check VGA functions }
  516. MI.StateSize:=0;
  517. r.ah:=$1c; r.al:=0; r.cx:=7; intr($10,r);
  518. if (r.al=$1c) and ((r.flags and fCarry)=0) and (r.bx>0) then
  519. begin
  520. MI.StateSize:=r.bx;
  521. GetMem(MI.StateBuf,MI.StateSize); FillChar(MI.StateBuf^,MI.StateSize,0);
  522. P:=MI.StateBuf;
  523. {$ifdef DPMI}
  524. Sel:=GlobalDosAlloc(MI.StateSize);
  525. P:=Ptr(Sel shr 16,0);
  526. {$endif}
  527. r.ah:=$1c; r.al:=1; r.cx:=7;
  528. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  529. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  530. {$ifdef DPMI}
  531. Move(Ptr(Sel and $ffff,0)^,MI.StateBuf^,MI.StateSize);
  532. GlobalDosFree(Sel and $ffff);
  533. {$endif}
  534. end;
  535. {$endif}
  536. *)
  537. end;
  538. procedure TDOSScreen.SetVideoMode(MI: TDOSVideoInfo);
  539. var r: registers;
  540. CM: TDOSVideoInfo;
  541. {$ifdef TP}
  542. P: pointer;
  543. Sel: longint;
  544. {$I realintr.inc}
  545. {$endif}
  546. begin
  547. FillChar(CM,sizeof(CM),0);
  548. GetVideoMode(CM);
  549. if (CM.Mode<>MI.Mode) or (CM.Cols<>MI.Cols) or (CM.Rows<>MI.Rows) then
  550. begin
  551. {$ifdef VESA}
  552. if MI.Mode>=$100 then
  553. VESASetMode(MI.Mode)
  554. else
  555. {$endif}
  556. begin
  557. r.ah:=$00; r.al:=MI.Mode; intr($10,r);
  558. end;
  559. if (MI.Mode=3) and (MI.Cols=80) and (MI.Rows=50) then
  560. begin
  561. r.ax:=$1112; r.bx:=$0;
  562. intr($10,r);
  563. end;
  564. end;
  565. r.ah:=$05; r.al:=MI.Page; intr($10,r);
  566. r.ah:=$02; r.bh:=MI.Page; r.dl:=MI.CurPos.X; r.dh:=MI.CurPos.Y; intr($10,r);
  567. r.ah:=$01; r.ch:=MI.CurShapeT; r.cl:=MI.CurShapeB; intr($10,r);
  568. (*
  569. {$ifdef TP}
  570. if (MI.StateSize>0) and (MI.StateBuf<>nil) then
  571. begin
  572. P:=MI.StateBuf;
  573. {$ifdef DPMI}
  574. Sel:=GlobalDosAlloc(MI.StateSize);
  575. Move(MI.StateBuf^,ptr(Sel and $ffff,0)^,MI.StateSize);
  576. P:=Ptr(Sel shr 16,0);
  577. {$endif}
  578. r.ah:=$1c; r.al:=2; r.cx:=7;
  579. r.es:=PtrRec(P).Seg; r.bx:=PtrRec(P).Ofs;
  580. {$ifdef DPMI}realintr($10,r);{$else}intr($10,r);{$endif}
  581. {$ifdef DPMI}
  582. GlobalDosFree(Sel and $ffff);
  583. {$endif}
  584. end;
  585. {$endif}
  586. *)
  587. end;
  588. {$endif}
  589. {****************************************************************************
  590. TLinuxScreen
  591. ****************************************************************************}
  592. {$ifdef Unix}
  593. constructor TLinuxScreen.Init;
  594. var
  595. ThisTTY: string[30];
  596. FName: string;
  597. WS: packed record
  598. ws_row, ws_col, ws_xpixel, ws_ypixel: Word;
  599. end;
  600. begin
  601. inherited Init;
  602. IdeScreen := nil;
  603. IsXterm:=getenv('TERM')='xterm';
  604. ThisTTY:=TTYName(stdinputhandle);
  605. if Not IsXterm and IsATTY(stdinputhandle) then
  606. begin
  607. Console:=TTyNetwork; {Default: Network or other vtxxx tty}
  608. if (Copy(ThisTTY, 1, 8) = '/dev/tty') and (ThisTTY[9]<>'p') Then
  609. begin
  610. Case ThisTTY[9] of
  611. '0'..'9' :
  612. begin { running Linux on native console or native-emulation }
  613. FName:='/dev/vcsa' + ThisTTY[9];
  614. TTYFd:=fdOpen(FName, Octal(666), Open_RdWr); { open console }
  615. If TTYFd <>-1 Then
  616. Console:=ttyLinux;
  617. end;
  618. 'v' : { check for (Free?)BSD native}
  619. If (ThisTTY[10]>='0') and (ThisTTY[10]<='9') Then
  620. Console:=ttyFreeBSD; {TTYFd ?}
  621. end;
  622. end;
  623. If Copy(GetEnv('TERM'),1,6)='cons25' Then
  624. Console:=ttyFreeBSD;
  625. ioctl(stdinputhandle, TIOCGWINSZ, @WS);
  626. if WS.ws_Col=0 then
  627. WS.ws_Col:=80;
  628. if WS.ws_Row=0 then
  629. WS.ws_Row:=25;
  630. ConsWidth:=WS.ws_Col;
  631. ConsHeight:=WS.ws_row;
  632. end;
  633. Capture;
  634. end;
  635. destructor TLinuxScreen.Done;
  636. begin
  637. if assigned(IdeScreen) then
  638. freemem(IdeScreen,IdeSize);
  639. if assigned(ConsVideoBuf) then
  640. freemem(ConsVideoBuf,ConsVideoBufSize);
  641. inherited Done;
  642. end;
  643. function TLinuxScreen.GetWidth: integer;
  644. begin
  645. GetWidth:=ConsWidth;
  646. end;
  647. function TLinuxScreen.GetHeight: integer;
  648. begin
  649. GetHeight:=ConsHeight;
  650. end;
  651. procedure TLinuxScreen.GetLine(Line: integer; var Text, Attr: string);
  652. var
  653. X, W : longint;
  654. begin
  655. Text:='';
  656. Attr:='';
  657. if (TtyFd<>-1) and assigned(ConsVideoBuf) then
  658. begin
  659. if Line<GetHeight then
  660. begin
  661. W:=(ConsWidth*Line)*Sizeof(word);
  662. for X:=0 to GetWidth-1 do
  663. begin
  664. {Text:=Text+chr(VBuffer^[W+X*2]);
  665. Attr:=Attr+chr(VBuffer^[W+X*2+1]);}
  666. System.Insert(chr(ConsVideoBuf^[W+X*2]),Text,Length(Text)+1);
  667. System.Insert(chr(ConsVideoBuf^[W+X*2+1]),Attr,Length(Attr)+1);
  668. end;
  669. end;
  670. end;
  671. end;
  672. procedure TLinuxScreen.GetCursorPos(var P: TPoint);
  673. begin
  674. P.X:=ConsCursorX+1;
  675. P.Y:=ConsCursorY+1;
  676. end;
  677. procedure TLinuxScreen.Capture;
  678. begin
  679. SaveConsoleScreen;
  680. end;
  681. procedure TLinuxScreen.SaveIDEScreen;
  682. begin
  683. if assigned(IdeScreen) then
  684. freemem(IdeScreen,IdeSize);
  685. getmem(IdeScreen,videobufsize);
  686. IdeSize:=videobufsize;
  687. move(videobuf^,IdeScreen^,videobufsize);
  688. end;
  689. procedure TLinuxScreen.SaveConsoleScreen;
  690. var
  691. NewSize : longint;
  692. begin
  693. if IsXTerm then
  694. write(#27'7'#27'[?47h')
  695. else if (TTYfd<>-1) then
  696. begin
  697. fdSeek(TTYFd, 0, Seek_Set);
  698. fdRead(TTYFd,ConsHeight,sizeof(byte));
  699. fdRead(TTYFd,ConsWidth,sizeof(byte));
  700. fdRead(TTYFd,ConsCursorX,sizeof(byte));
  701. fdRead(TTYFd,ConsCursorY,sizeof(byte));
  702. NewSize:=ConsWidth*ConsHeight*sizeof(word);
  703. if (NewSize<>ConsVideoBufSize) and
  704. assigned(ConsVideoBuf) then
  705. Begin
  706. FreeMem(ConsVideoBuf,ConsVideoBufSize);
  707. ConsVideoBuf:=nil;
  708. End;
  709. If not assigned(ConsVideoBuf) then
  710. GetMem(ConsVideoBuf,NewSize);
  711. ConsVideoBufSize:=NewSize;
  712. fdRead(TTYFd,ConsVideoBuf^,ConsVideoBufSize);
  713. end
  714. else
  715. begin
  716. ConsWidth:=80;
  717. ConsHeight:=25;
  718. ConsCursorX:=0;
  719. ConsCursorY:=0;
  720. ConsVideoBuf:=nil;
  721. end;
  722. ConsTioValid:=TCGetAttr(1,ConsTio);
  723. end;
  724. procedure TLinuxScreen.SwitchToConsoleScreen;
  725. begin
  726. if IsXterm then
  727. begin
  728. write(#27'[0m');
  729. write(#27'[?47l'#27'8'#27'[m');
  730. end
  731. else if (TTyfd<>-1) then
  732. begin
  733. fdSeek(TTYFd, 2, Seek_Set);
  734. fdWrite(TTYFd, ConsCursorX, sizeof(byte));
  735. fdWrite(TTYFd, ConsCursorY, sizeof(byte));
  736. fdWrite(TTYFd, ConsVideoBuf^,ConsVideoBufSize);
  737. { FreeMem(ConsVideoBuf,ConsVideoBufSize);
  738. ConsVideoBuf:=nil; }
  739. end;
  740. If ConsTioValid then
  741. TCSetAttr(1,TCSANOW,ConsTio);
  742. end;
  743. procedure TLinuxScreen.SwitchBackToIDEScreen;
  744. begin
  745. if IdeScreen = nil then
  746. exit;
  747. move(IdeScreen^,videobuf^,videobufsize);
  748. freemem(IdeScreen,IdeSize);
  749. IdeScreen := nil;
  750. end;
  751. {$endif}
  752. {****************************************************************************
  753. TWin32Screen
  754. ****************************************************************************}
  755. {$ifdef win32}
  756. procedure UpdateFileHandles;
  757. begin
  758. {StdInputHandle:=longint(GetStdHandle(STD_INPUT_HANDLE));}
  759. StdOutputHandle:=longint(GetStdHandle(cardinal(STD_OUTPUT_HANDLE)));
  760. {StdErrorHandle:=longint(GetStdHandle(STD_ERROR_HANDLE));}
  761. TextRec(Output).Handle:=StdOutputHandle;
  762. TextRec(StdOut).Handle:=StdOutputHandle;
  763. {TextRec(StdErr).Handle:=StdErrorHandle;}
  764. end;
  765. constructor TWin32Screen.Init;
  766. var
  767. SecurityAttr : Security_attributes;
  768. BigWin : Coord;
  769. res : longbool;
  770. Error : dword;
  771. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  772. begin
  773. inherited Init;
  774. {if GetConsoleOutputCP<>437 then
  775. res:=SetConsoleOutputCP(437);}
  776. SecurityAttr.nLength:=SizeOf(Security_attributes);
  777. SecurityAttr.lpSecurityDescriptor:=nil;
  778. SecurityAttr.bInheritHandle:=true;
  779. NewScreenBufferHandle:=CreateConsoleScreenBuffer(
  780. GENERIC_READ or GENERIC_WRITE,
  781. FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr,
  782. CONSOLE_TEXTMODE_BUFFER,nil);
  783. DummyScreenBufferHandle:=CreateConsoleScreenBuffer(
  784. GENERIC_READ or GENERIC_WRITE,
  785. FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr,
  786. CONSOLE_TEXTMODE_BUFFER,nil);
  787. StartScreenBufferHandle:=GetStdHandle(cardinal(STD_OUTPUT_HANDLE));
  788. GetConsoleMode(GetStdHandle(cardinal(Std_Input_Handle)), @ConsoleMode);
  789. IdeMode:=ConsoleMode;
  790. {$ifdef debug}
  791. {define win32bigwin}
  792. {$endif debug}
  793. {$ifdef win32bigwin}
  794. GetConsoleScreenBufferInfo(StartScreenBufferHandle,
  795. @ConsoleScreenBufferInfo);
  796. BigWin.X:=ConsoleScreenBufferInfo.dwSize.X;
  797. BigWin.Y:=200;
  798. { Try to allow to store more info }
  799. res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,BigWin);
  800. if not res then
  801. error:=GetLastError;
  802. res:=SetConsoleScreenBufferSize(StartScreenBufferHandle,BigWin);
  803. if not res then
  804. error:=GetLastError;
  805. {$endif win32bigwin}
  806. GetConsoleScreenBufferInfo(StartScreenBufferHandle,
  807. @ConsoleScreenBufferInfo);
  808. { make sure that the IDE Screen Handle has the maximum display size
  809. this removes the scroll bars if it is maximized }
  810. res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,
  811. ConsoleScreenBufferInfo.dwMaximumWindowSize);
  812. if not res then
  813. error:=GetLastError;
  814. IDEScreenBufferHandle:=NewScreenBufferHandle;
  815. DosScreenBufferHandle:=StartScreenBufferHandle;
  816. Capture;
  817. {$ifdef fvision}
  818. if TextModeGFV then
  819. {$endif fvision}
  820. IdeScreenMode.row:=0;
  821. SwitchBackToIDEScreen;
  822. end;
  823. destructor TWin32Screen.Done;
  824. begin
  825. { copy the Dos buffer content into the original ScreenBuffer
  826. which remains the startup std_output_handle PM }
  827. {if StartScreenBufferHandle=IDEScreenBufferHandle then}
  828. BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
  829. SetConsoleActiveScreenBuffer(StartScreenBufferHandle);
  830. SetStdHandle(cardinal(Std_Output_Handle),StartScreenBufferHandle);
  831. UpdateFileHandles;
  832. CloseHandle(NewScreenBufferHandle);
  833. CloseHandle(DummyScreenBufferHandle);
  834. inherited Done;
  835. end;
  836. function TWin32Screen.GetWidth: integer;
  837. var
  838. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  839. begin
  840. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  841. @ConsoleScreenBufferInfo);
  842. GetWidth:=ConsoleScreenBufferInfo.dwSize.X;
  843. end;
  844. function TWin32Screen.GetHeight: integer;
  845. var
  846. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  847. begin
  848. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  849. @ConsoleScreenBufferInfo);
  850. GetHeight:=ConsoleScreenBufferInfo.dwSize.Y;
  851. end;
  852. function TWin32Screen.Scroll(i : integer) : integer;
  853. var
  854. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  855. ConsoleWindow : Small_rect;
  856. begin
  857. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  858. @ConsoleScreenBufferInfo);
  859. if (ConsoleScreenBufferInfo.srWindow.Top + i < 0) then
  860. i:= -ConsoleScreenBufferInfo.srWindow.Top;
  861. if (ConsoleScreenBufferInfo.srWindow.Bottom + i > ConsoleScreenBufferInfo.dwSize.Y) then
  862. i:= ConsoleScreenBufferInfo.dwSize.Y - ConsoleScreenBufferInfo.srWindow.Bottom;
  863. if i<>0 then
  864. begin
  865. ConsoleWindow.Left:=ConsoleScreenBufferInfo.srWindow.Left;
  866. ConsoleWindow.Right:=ConsoleScreenBufferInfo.srWindow.Right;
  867. ConsoleWindow.Top:=ConsoleScreenBufferInfo.srWindow.Top+i;
  868. ConsoleWindow.Bottom:=ConsoleScreenBufferInfo.srWindow.Bottom+i;
  869. SetConsoleWindowInfo(DosScreenBufferHandle,true,ConsoleWindow);
  870. Scroll:=i;
  871. end
  872. else
  873. Scroll:=0;
  874. end;
  875. procedure TWin32Screen.GetLine(Line: integer; var Text, Attr: string);
  876. type
  877. CharInfoArray = Array [0..255] of Char_Info;
  878. var
  879. LineBuf : ^CharInfoArray;
  880. BufSize,BufCoord : Coord;
  881. i,LineSize : longint;
  882. WriteRegion : SMALL_RECT;
  883. begin
  884. GetMem(LineBuf,SizeOf(CharInfoArray));
  885. LineSize:=ScreenWidth;
  886. If LineSize>256 then
  887. LineSize:=256;
  888. BufSize.X:=LineSize;
  889. BufSize.Y:=1;
  890. BufCoord.X:=0;
  891. BufCoord.Y:=0;
  892. with WriteRegion do
  893. begin
  894. Top :=Line;
  895. Left :=0;
  896. Bottom := Line+1;
  897. Right := LineSize-1;
  898. end;
  899. ReadConsoleOutput(DosScreenBufferHandle, PChar_info(LineBuf),
  900. BufSize, BufCoord, @WriteRegion);
  901. for i:=1 to LineSize do
  902. begin
  903. Text[i]:=LineBuf^[i-1].AsciiChar;
  904. Attr[i]:=char(byte(LineBuf^[i-1].Attributes));
  905. end;
  906. FreeMem(LineBuf,SizeOf(CharInfoArray));
  907. Text[0]:=char(byte(LineSize));
  908. Attr[0]:=char(byte(LineSize));
  909. end;
  910. procedure TWin32Screen.GetCursorPos(var P: TPoint);
  911. var
  912. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  913. begin
  914. GetConsoleScreenBufferInfo(DosScreenBufferHandle,
  915. @ConsoleScreenBufferInfo);
  916. P.X:=ConsoleScreenBufferInfo.dwCursorPosition.X;
  917. P.Y:=ConsoleScreenBufferInfo.dwCursorPosition.Y;
  918. end;
  919. procedure TWin32Screen.BufferCopy(Src, Dest : THandle);
  920. type
  921. CharInfoArray = Array [0..256*255-1] of Char_Info;
  922. var
  923. LineBuf : ^CharInfoArray;
  924. BufSize,BufCoord : Coord;
  925. Error, LineSize,
  926. Part, OnePartY: longint;
  927. res : boolean;
  928. WriteRegion : SMALL_RECT;
  929. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  930. DestConsoleScreenBufferInfo : Console_screen_buffer_info;
  931. begin
  932. GetConsoleScreenBufferInfo(Src,
  933. @ConsoleScreenBufferInfo);
  934. GetConsoleScreenBufferInfo(Dest,
  935. @DestConsoleScreenBufferInfo);
  936. GetMem(LineBuf,SizeOf(CharInfoArray));
  937. FillChar(LineBuf^,SizeOf(CharInfoArray),#0);
  938. LineSize:=ConsoleScreenBufferInfo.dwSize.X;
  939. If LineSize>256 then
  940. LineSize:=256;
  941. BufSize.X:=LineSize;
  942. BufSize.Y:=ConsoleScreenBufferInfo.dwSize.Y;
  943. BufCoord.X:=0;
  944. BufCoord.Y:=0;
  945. with WriteRegion do
  946. begin
  947. Top :=0;
  948. Left :=0;
  949. Bottom := ConsoleScreenBufferInfo.dwSize.Y-1;
  950. Right := LineSize-1;
  951. end;
  952. if BufSize.X*BufSize.Y*Sizeof(CHAR_INFO) >= $8000 then
  953. begin
  954. OnePartY := ($8000 -1) div (BufSize.X * SizeOf(Char_Info) );
  955. BufSize.Y:=OnePartY;
  956. Part:=0;
  957. while ((Part+1)*OnePartY < ConsoleScreenBufferInfo.dwSize.Y) do
  958. begin
  959. WriteRegion.Top := Part*OnePartY;
  960. WriteRegion.Bottom := (Part+1)*OnePartY-1;
  961. res:=ReadConsoleOutput(Src, PChar_info(LineBuf),
  962. BufSize, BufCoord, @WriteRegion);
  963. if not res then
  964. Error:=GetLastError;
  965. res:=WriteConsoleOutput(Dest, PChar_info(LineBuf),
  966. BufSize, BufCoord, @WriteRegion);
  967. if not res then
  968. Error:=GetLastError;
  969. Inc(Part);
  970. end;
  971. BufSize.Y:=ConsoleScreenBufferInfo.dwSize.Y - Part*OnePartY;
  972. WriteRegion.Top := Part*OnePartY;
  973. WriteRegion.Bottom := ConsoleScreenBufferInfo.dwSize.Y-1;
  974. res:=ReadConsoleOutput(Src, PChar_info(LineBuf),
  975. BufSize, BufCoord, @WriteRegion);
  976. if not res then
  977. Error:=GetLastError;
  978. res:=WriteConsoleOutput(Dest, PChar_info(LineBuf),
  979. BufSize, BufCoord, @WriteRegion);
  980. if not res then
  981. Error:=GetLastError;
  982. end
  983. else
  984. begin
  985. res:=ReadConsoleOutput(Src, PChar_info(LineBuf),
  986. BufSize, BufCoord, @WriteRegion);
  987. if not res then
  988. Error:=GetLastError;
  989. res:=WriteConsoleOutput(Dest, PChar_info(LineBuf),
  990. BufSize, BufCoord, @WriteRegion);
  991. if not res then
  992. Error:=GetLastError;
  993. end;
  994. FreeMem(LineBuf,SizeOf(CharInfoArray));
  995. SetConsoleCursorPosition(Dest, ConsoleScreenBufferInfo.dwCursorPosition);
  996. end;
  997. procedure TWin32Screen.Capture;
  998. begin
  999. {if StartScreenBufferHandle=IdeScreenBufferHandle then
  1000. BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle)
  1001. else
  1002. BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);}
  1003. SaveConsoleScreen;
  1004. end;
  1005. { dummy for win32 as the Buffer screen
  1006. do hold all the info }
  1007. procedure TWin32Screen.SaveIDEScreen;
  1008. begin
  1009. {$ifdef fvision}
  1010. if TextModeGFV then
  1011. {$endif fvision}
  1012. begin
  1013. IdeScreenMode:=ScreenMode;
  1014. GetConsoleMode(GetStdHandle(cardinal(Std_Input_Handle)), @IdeMode);
  1015. { set the dummy buffer as active already now PM }
  1016. SetStdHandle(cardinal(Std_Output_Handle),DummyScreenBufferHandle);
  1017. UpdateFileHandles;
  1018. end;
  1019. end;
  1020. { dummy for win32 as the Buffer screen
  1021. do hold all the info }
  1022. procedure TWin32Screen.SaveConsoleScreen;
  1023. begin
  1024. {$ifdef fvision}
  1025. if TextModeGFV then
  1026. {$endif fvision}
  1027. begin
  1028. GetConsoleMode(GetStdHandle(cardinal(Std_Input_Handle)), @ConsoleMode);
  1029. { set the dummy buffer as active already now PM }
  1030. SetStdHandle(cardinal(Std_Output_Handle),DummyScreenBufferHandle);
  1031. UpdateFileHandles;
  1032. end;
  1033. end;
  1034. procedure TWin32Screen.SwitchToConsoleScreen;
  1035. begin
  1036. {$ifdef fvision}
  1037. if TextModeGFV then
  1038. {$endif fvision}
  1039. begin
  1040. SetConsoleActiveScreenBuffer(DosScreenBufferHandle);
  1041. SetStdHandle(cardinal(Std_Output_Handle),DosScreenBufferHandle);
  1042. SetConsoleMode(GetStdHandle(cardinal(Std_Input_Handle)), ConsoleMode);
  1043. UpdateFileHandles;
  1044. end;
  1045. IDEActive:=false;
  1046. end;
  1047. procedure TWin32Screen.SwitchBackToIDEScreen;
  1048. var
  1049. ConsoleScreenBufferInfo : Console_screen_buffer_info;
  1050. WindowPos : Small_rect;
  1051. res : boolean;
  1052. error : longint;
  1053. begin
  1054. {$ifdef fvision}
  1055. if TextModeGFV then
  1056. {$endif fvision}
  1057. begin
  1058. SetStdHandle(cardinal(Std_Output_Handle),IDEScreenBufferHandle);
  1059. UpdateFileHandles;
  1060. GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
  1061. @ConsoleScreenBufferInfo);
  1062. SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
  1063. {$ifdef fvision}
  1064. { Needed to force InitSystemMsg to use the right console handle }
  1065. DoneEvents;
  1066. InitEvents;
  1067. {$endif fvision}
  1068. IdeMode:=(IdeMode or ENABLE_MOUSE_INPUT or ENABLE_WINDOW_INPUT) and not ENABLE_PROCESSED_INPUT;
  1069. SetConsoleMode(GetStdHandle(cardinal(Std_Input_Handle)), IdeMode);
  1070. WindowPos.left:=0;
  1071. WindowPos.right:=ConsoleScreenBufferInfo.srWindow.right
  1072. -ConsoleScreenBufferInfo.srWindow.left;
  1073. WindowPos.top:=0;
  1074. WindowPos.bottom:=ConsoleScreenBufferInfo.srWindow.bottom
  1075. -ConsoleScreenBufferInfo.srWindow.top;
  1076. with ConsoleScreenBufferInfo.dwMaximumWindowSize do
  1077. begin
  1078. if WindowPos.Right<X-1 then
  1079. WindowPos.right:=X-1;
  1080. if WindowPos.Bottom<Y-1 then
  1081. WindowPos.Bottom:=Y-1;
  1082. end;
  1083. res:=SetConsoleWindowInfo(IDEScreenBufferHandle,true,WindowPos);
  1084. if not res then
  1085. error:=GetLastError;
  1086. {$ifdef DEBUG}
  1087. IdeScreenMode.row:=WindowPos.bottom+1;
  1088. IdeScreenMode.col:=WindowPos.right+1;
  1089. {$endif DEBUG}
  1090. { needed to force the correct size for videobuf }
  1091. if Assigned(Application) and (IdeScreenMode.row<>0)then
  1092. Application^.SetScreenVideoMode(IdeScreenMode);
  1093. end;
  1094. IDEActive:=true;
  1095. end;
  1096. {$endif}
  1097. {****************************************************************************
  1098. Initialize
  1099. ****************************************************************************}
  1100. procedure InitUserScreen;
  1101. begin
  1102. {$ifdef DOS}
  1103. UserScreen:=New(PDOSScreen, Init);
  1104. {$else}
  1105. {$ifdef Unix}
  1106. UserScreen:=New(PLinuxScreen, Init);
  1107. {$else}
  1108. {$ifdef Win32}
  1109. UserScreen:=New(PWin32Screen, Init);
  1110. {$else}
  1111. UserScreen:=New(PScreen, Init);
  1112. {$endif Win32}
  1113. {$endif Unix}
  1114. {$endif Dos}
  1115. end;
  1116. procedure DoneUserScreen;
  1117. begin
  1118. if UserScreen<>nil then
  1119. begin
  1120. UserScreen^.SwitchToConsoleScreen;
  1121. Dispose(UserScreen, Done);
  1122. UserScreen:=nil;
  1123. end;
  1124. end;
  1125. end.
  1126. {
  1127. $Log$
  1128. Revision 1.21 2002-09-13 22:27:07 pierre
  1129. * fix several problems with go32v2 graphic support
  1130. Revision 1.20 2002/09/13 08:15:06 pierre
  1131. * fix cursor position for linux vcsa support
  1132. Revision 1.19 2002/09/13 07:17:33 pierre
  1133. + use vcsa for linux console
  1134. Revision 1.18 2002/09/07 21:04:42 carl
  1135. * fix range check errors for version 1.1 compilation
  1136. Revision 1.17 2002/09/07 15:40:46 peter
  1137. * old logs removed and tabs fixed
  1138. Revision 1.16 2002/09/04 08:35:31 pierre
  1139. * remember IDE screen mode for win32
  1140. to avoid videobuf writes after allocated size.
  1141. Revision 1.15 2002/09/03 05:45:39 pierre
  1142. * fix compilation without DEBUG conditional
  1143. Revision 1.14 2002/09/02 09:29:55 pierre
  1144. + new test code for go32v2 graphic screen saves (only with -dDEBUG)
  1145. Revision 1.13 2002/06/13 11:18:32 pierre
  1146. + xterm window switching support
  1147. Revision 1.12 2002/06/07 14:10:24 pierre
  1148. * try to get resizing to work
  1149. Revision 1.11 2002/06/06 14:10:34 pierre
  1150. * allow window input for fvsion system messages
  1151. Revision 1.10 2002/06/06 06:46:28 pierre
  1152. * No videobuffer switch necessary for fvision win32 graphic version
  1153. Revision 1.9 2002/04/25 13:34:17 pierre
  1154. * fix the disappearing desktop for win32
  1155. Revision 1.8 2002/01/22 16:29:52 pierre
  1156. * try to fix win32 problem with Dos program ouptut in command shell
  1157. Warning, to debug under win32 with GDB you must use "set new-console on"
  1158. }