* try to fix win32 problem with Dos program ouptut in command shell

Warning, to debug under win32 with GDB you must use "set new-console on"
This commit is contained in:
pierre 2002-01-22 16:29:52 +00:00
parent 6769598ff4
commit 969167ccf5

View File

@ -128,7 +128,9 @@ type
procedure SwitchBackToIDEScreen; virtual;
private
DosScreenBufferHandle,
IDEScreenBufferHandle : THandle;
IDEScreenBufferHandle,
StartScreenBufferHandle,
NewScreenBufferHandle : THandle;
IDEActive : boolean;
ConsoleMode,IdeMode : Dword;
procedure BufferCopy(src,dest : THandle);
@ -583,6 +585,16 @@ end;
{$ifdef win32}
procedure UpdateFileHandles;
begin
{StdInputHandle:=longint(GetStdHandle(STD_INPUT_HANDLE));}
StdOutputHandle:=longint(GetStdHandle(STD_OUTPUT_HANDLE));
{StdErrorHandle:=longint(GetStdHandle(STD_ERROR_HANDLE));}
TextRec(Output).Handle:=StdOutputHandle;
TextRec(StdOut).Handle:=StdOutputHandle;
{TextRec(StdErr).Handle:=StdErrorHandle;}
end;
constructor TWin32Screen.Init;
var
SecurityAttr : Security_attributes;
@ -597,36 +609,38 @@ begin
SecurityAttr.nLength:=SizeOf(Security_attributes);
SecurityAttr.lpSecurityDescriptor:=nil;
SecurityAttr.bInheritHandle:=true;
DosScreenBufferHandle:=CreateConsoleScreenBuffer(
NewScreenBufferHandle:=CreateConsoleScreenBuffer(
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr,
CONSOLE_TEXTMODE_BUFFER,nil);
IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
StartScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
IdeMode:=ConsoleMode;
{$ifdef debug}
{define win32bigwin}
{$endif debug}
{$ifdef win32bigwin}
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
GetConsoleScreenBufferInfo(StartScreenBufferHandle,
@ConsoleScreenBufferInfo);
BigWin.X:=ConsoleScreenBufferInfo.dwSize.X;
BigWin.Y:=200;
{ Try to allow to store more info }
res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,BigWin);
if not res then
error:=GetLastError;
res:=SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin);
res:=SetConsoleScreenBufferSize(StartScreenBufferHandle,BigWin);
if not res then
error:=GetLastError;
{$endif win32bigwin}
{ make sure that both Screen Handle have the sme buffer }
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
GetConsoleScreenBufferInfo(StartScreenBufferHandle,
@ConsoleScreenBufferInfo);
res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,
res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,
ConsoleScreenBufferInfo.dwSize);
if not res then
error:=GetLastError;
IDEScreenBufferHandle:=NewScreenBufferHandle;
DosScreenBufferHandle:=StartScreenBufferHandle;
Capture;
SwitchBackToIDEScreen;
end;
@ -635,10 +649,12 @@ destructor TWin32Screen.Done;
begin
{ copy the Dos buffer content into the original ScreenBuffer
which remains the startup std_output_handle PM }
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
CloseHandle(DosScreenBufferHandle);
{if StartScreenBufferHandle=IDEScreenBufferHandle then}
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
SetConsoleActiveScreenBuffer(StartScreenBufferHandle);
SetStdHandle(Std_Output_Handle,StartScreenBufferHandle);
UpdateFileHandles;
CloseHandle(NewScreenBufferHandle);
inherited Done;
end;
@ -813,7 +829,11 @@ end;
procedure TWin32Screen.Capture;
begin
BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle);
{if StartScreenBufferHandle=IdeScreenBufferHandle then
BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle)
else
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);}
SaveConsoleScreen;
end;
{ dummy for win32 as the Buffer screen
@ -828,6 +848,9 @@ end;
procedure TWin32Screen.SaveConsoleScreen;
begin
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
{ set the IDE buffer as active already now PM }
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
UpdateFileHandles;
end;
procedure TWin32Screen.SwitchToConsoleScreen;
@ -836,6 +859,7 @@ begin
SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
IDEActive:=false;
SetConsoleMode(GetStdHandle(Std_Input_Handle), ConsoleMode);
UpdateFileHandles;
end;
procedure TWin32Screen.SwitchBackToIDEScreen;
@ -848,7 +872,6 @@ begin
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
@ConsoleScreenBufferInfo);
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
IdeMode:=(IdeMode or ENABLE_MOUSE_INPUT) and not ENABLE_PROCESSED_INPUT;
SetConsoleMode(GetStdHandle(Std_Input_Handle), IdeMode);
WindowPos.left:=0;
@ -909,7 +932,11 @@ end;
end.
{
$Log$
Revision 1.7 2001-11-08 17:06:22 pierre
Revision 1.8 2002-01-22 16:29:52 pierre
* try to fix win32 problem with Dos program ouptut in command shell
Warning, to debug under win32 with GDB you must use "set new-console on"
Revision 1.7 2001/11/08 17:06:22 pierre
* impose the correct size for win32 console window
Revision 1.6 2001/11/08 16:38:25 pierre