diff --git a/ide/fpusrscr.pas b/ide/fpusrscr.pas index c48beda76b..32c70d849f 100644 --- a/ide/fpusrscr.pas +++ b/ide/fpusrscr.pas @@ -620,6 +620,13 @@ begin if not res then error:=GetLastError; {$endif win32bigwin} + { make sure that both Screen Handle have the sme buffer } + GetConsoleScreenBufferInfo(IDEScreenBufferHandle, + @ConsoleScreenBufferInfo); + res:=SetConsoleScreenBufferSize(DosScreenBufferHandle, + ConsoleScreenBufferInfo.dwSize); + if not res then + error:=GetLastError; Capture; SwitchBackToIDEScreen; end; @@ -730,13 +737,20 @@ type var LineBuf : ^CharInfoArray; BufSize,BufCoord : Coord; - LineSize : longint; + Error, LineSize, + Part, OnePartY: longint; + res : boolean; WriteRegion : SMALL_RECT; ConsoleScreenBufferInfo : Console_screen_buffer_info; + DestConsoleScreenBufferInfo : Console_screen_buffer_info; begin GetConsoleScreenBufferInfo(Src, @ConsoleScreenBufferInfo); + GetConsoleScreenBufferInfo(Dest, + @DestConsoleScreenBufferInfo); GetMem(LineBuf,SizeOf(CharInfoArray)); + FillChar(LineBuf^,SizeOf(CharInfoArray),#0); + LineSize:=ConsoleScreenBufferInfo.dwSize.X; If LineSize>256 then LineSize:=256; @@ -751,10 +765,48 @@ begin Bottom := ConsoleScreenBufferInfo.dwSize.Y-1; Right := LineSize-1; end; - ReadConsoleOutput(Src, PChar_info(LineBuf), - BufSize, BufCoord, @WriteRegion); - WriteConsoleOutput(Dest, PChar_info(LineBuf), - BufSize, BufCoord, @WriteRegion); + if BufSize.X*BufSize.Y*Sizeof(CHAR_INFO) >= $8000 then + begin + OnePartY := ($8000 -1) div (BufSize.X * SizeOf(Char_Info) ); + BufSize.Y:=OnePartY; + Part:=0; + while ((Part+1)*OnePartY < ConsoleScreenBufferInfo.dwSize.Y) do + begin + WriteRegion.Top := Part*OnePartY; + WriteRegion.Bottom := (Part+1)*OnePartY-1; + res:=ReadConsoleOutput(Src, PChar_info(LineBuf), + BufSize, BufCoord, @WriteRegion); + if not res then + Error:=GetLastError; + res:=WriteConsoleOutput(Dest, PChar_info(LineBuf), + BufSize, BufCoord, @WriteRegion); + if not res then + Error:=GetLastError; + Inc(Part); + end; + BufSize.Y:=ConsoleScreenBufferInfo.dwSize.Y - Part*OnePartY; + WriteRegion.Top := Part*OnePartY; + WriteRegion.Bottom := ConsoleScreenBufferInfo.dwSize.Y-1; + res:=ReadConsoleOutput(Src, PChar_info(LineBuf), + BufSize, BufCoord, @WriteRegion); + if not res then + Error:=GetLastError; + res:=WriteConsoleOutput(Dest, PChar_info(LineBuf), + BufSize, BufCoord, @WriteRegion); + if not res then + Error:=GetLastError; + end + else + begin + res:=ReadConsoleOutput(Src, PChar_info(LineBuf), + BufSize, BufCoord, @WriteRegion); + if not res then + Error:=GetLastError; + res:=WriteConsoleOutput(Dest, PChar_info(LineBuf), + BufSize, BufCoord, @WriteRegion); + if not res then + Error:=GetLastError; + end; FreeMem(LineBuf,SizeOf(CharInfoArray)); SetConsoleCursorPosition(Dest, ConsoleScreenBufferInfo.dwCursorPosition); end; @@ -834,7 +886,10 @@ end; end. { $Log$ - Revision 1.4 2001-10-24 14:17:27 pierre + Revision 1.5 2001-11-08 16:07:41 pierre + * overcome buffer win32 problem due to a bug in ReadConsoleOutput + + Revision 1.4 2001/10/24 14:17:27 pierre * try to fix the Win2000 mouse problem Revision 1.3 2001/09/09 20:44:53 carl