fpusrscr.pas 39 KB

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