Browse Source

* Win32 screen problems solved

pierre 26 years ago
parent
commit
9f5ab0d587
1 changed files with 45 additions and 25 deletions
  1. 45 25
      ide/text/fpusrscr.pas

+ 45 - 25
ide/text/fpusrscr.pas

@@ -110,11 +110,11 @@ type
       procedure   GetLine(Line: integer; var Text, Attr: string); virtual;
       procedure   GetCursorPos(var P: TPoint); virtual;
       procedure   Capture; virtual;
-      procedure   Restore; virtual;
       procedure   SwitchTo; virtual;
       procedure   SwitchBack; virtual;
     private
-      DosScreenBufferHandle : THandle;
+      DosScreenBufferHandle,
+      IDEScreenBufferHandle : THandle;
       IDEActive : boolean;
       procedure BufferCopy(src,dest : THandle);
     end;
@@ -468,6 +468,9 @@ end;
 constructor TWin32Screen.Init;
 var
   SecurityAttr : Security_attributes;
+  BigWin : Coord;
+  res : boolean;
+  Error : dword;
 begin
   inherited Init;
   SecurityAttr.nLength:=SizeOf(Security_attributes);
@@ -477,31 +480,49 @@ begin
     GENERIC_READ or GENERIC_WRITE,
     0,SecurityAttr,
     CONSOLE_TEXTMODE_BUFFER,nil);
+  IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
+{$ifdef win32bigwin}
+  BigWin.X:=80;
+  BigWin.Y:=50;
+  SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
+  SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin);
+{$endif win32bigwin}
   Capture;
-  { SetConsoleActiveScreenBuffer(DosScreenBufferHandle);}
-  IDEActive:=true;
+  BigWin.X:=80;
+  BigWin.Y:=50;
+  { Try to allow to store more info }
+  res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
+  if not res then
+    error:=GetLastError;
+  SwitchBack;
 end;
 
-
 destructor TWin32Screen.Done;
 begin
   if IDEActive then
-    SwitchBack;
-  Restore;
+    SwitchTo;
   CloseHandle(DosScreenBufferHandle);
   inherited Done;
 end;
 
-
 function TWin32Screen.GetWidth: integer;
+var
+  ConsoleScreenBufferInfo : Console_screen_buffer_info;
 begin
-  GetWidth:=ScreenWidth;
+  GetConsoleScreenBufferInfo(DosScreenBufferHandle,
+    @ConsoleScreenBufferInfo);
+  GetWidth:=ConsoleScreenBufferInfo.dwSize.X;
+  {GetWidth:=ScreenWidth;}
 end;
 
-
 function TWin32Screen.GetHeight: integer;
+var
+  ConsoleScreenBufferInfo : Console_screen_buffer_info;
 begin
-  GetHeight:=ScreenHeight;
+  GetConsoleScreenBufferInfo(DosScreenBufferHandle,
+    @ConsoleScreenBufferInfo);
+  GetHeight:=ConsoleScreenBufferInfo.dwSize.Y;
+  {GetHeight:=ScreenHeight;}
 end;
 
 
@@ -589,26 +610,21 @@ end;
 
 procedure TWin32Screen.Capture;
 begin
-  BufferCopy(GetStdHandle(STD_OUTPUT_HANDLE),DosScreenBufferHandle);
-end;
-
-procedure TWin32Screen.Restore;
-begin
-  BufferCopy(DosScreenBufferHandle,GetStdHandle(STD_OUTPUT_HANDLE));
+  BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle);
 end;
 
-
 procedure TWin32Screen.SwitchTo;
 begin
   SetConsoleActiveScreenBuffer(DosScreenBufferHandle);
-  IDEActive:=true;
+  SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
+  IDEActive:=false;
 end;
 
-
 procedure TWin32Screen.SwitchBack;
 begin
-  SetConsoleActiveScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE));
-  IDEActive:=false;
+  SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
+  SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
+  IDEActive:=true;
 end;
 
 {$endif}
@@ -642,14 +658,18 @@ begin
   if UserScreen<>nil then
    begin
      UserScreen^.SwitchTo;
-     Dispose(UserScreen, Done); UserScreen:=nil;
+     Dispose(UserScreen, Done);
+     UserScreen:=nil;
    end;
 end;
 
 end.
 {
   $Log$
-  Revision 1.6  1999-09-22 13:02:00  pierre
+  Revision 1.7  1999-11-10 17:12:00  pierre
+   * Win32 screen problems solved
+
+  Revision 1.6  1999/09/22 13:02:00  pierre
    + Twin32Screen added
 
   Revision 1.5  1999/08/16 18:25:24  peter
@@ -698,4 +718,4 @@ end.
     Original implementation
 
 }
-
+