mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-24 14:09:17 +02:00
* 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:
parent
6769598ff4
commit
969167ccf5
@ -128,7 +128,9 @@ type
|
|||||||
procedure SwitchBackToIDEScreen; virtual;
|
procedure SwitchBackToIDEScreen; virtual;
|
||||||
private
|
private
|
||||||
DosScreenBufferHandle,
|
DosScreenBufferHandle,
|
||||||
IDEScreenBufferHandle : THandle;
|
IDEScreenBufferHandle,
|
||||||
|
StartScreenBufferHandle,
|
||||||
|
NewScreenBufferHandle : THandle;
|
||||||
IDEActive : boolean;
|
IDEActive : boolean;
|
||||||
ConsoleMode,IdeMode : Dword;
|
ConsoleMode,IdeMode : Dword;
|
||||||
procedure BufferCopy(src,dest : THandle);
|
procedure BufferCopy(src,dest : THandle);
|
||||||
@ -583,6 +585,16 @@ end;
|
|||||||
|
|
||||||
{$ifdef win32}
|
{$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;
|
constructor TWin32Screen.Init;
|
||||||
var
|
var
|
||||||
SecurityAttr : Security_attributes;
|
SecurityAttr : Security_attributes;
|
||||||
@ -597,36 +609,38 @@ begin
|
|||||||
SecurityAttr.nLength:=SizeOf(Security_attributes);
|
SecurityAttr.nLength:=SizeOf(Security_attributes);
|
||||||
SecurityAttr.lpSecurityDescriptor:=nil;
|
SecurityAttr.lpSecurityDescriptor:=nil;
|
||||||
SecurityAttr.bInheritHandle:=true;
|
SecurityAttr.bInheritHandle:=true;
|
||||||
DosScreenBufferHandle:=CreateConsoleScreenBuffer(
|
NewScreenBufferHandle:=CreateConsoleScreenBuffer(
|
||||||
GENERIC_READ or GENERIC_WRITE,
|
GENERIC_READ or GENERIC_WRITE,
|
||||||
FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr,
|
FILE_SHARE_READ or FILE_SHARE_WRITE,SecurityAttr,
|
||||||
CONSOLE_TEXTMODE_BUFFER,nil);
|
CONSOLE_TEXTMODE_BUFFER,nil);
|
||||||
IDEScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
|
StartScreenBufferHandle:=GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
|
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
|
||||||
IdeMode:=ConsoleMode;
|
IdeMode:=ConsoleMode;
|
||||||
{$ifdef debug}
|
{$ifdef debug}
|
||||||
{define win32bigwin}
|
{define win32bigwin}
|
||||||
{$endif debug}
|
{$endif debug}
|
||||||
{$ifdef win32bigwin}
|
{$ifdef win32bigwin}
|
||||||
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
|
GetConsoleScreenBufferInfo(StartScreenBufferHandle,
|
||||||
@ConsoleScreenBufferInfo);
|
@ConsoleScreenBufferInfo);
|
||||||
BigWin.X:=ConsoleScreenBufferInfo.dwSize.X;
|
BigWin.X:=ConsoleScreenBufferInfo.dwSize.X;
|
||||||
BigWin.Y:=200;
|
BigWin.Y:=200;
|
||||||
{ Try to allow to store more info }
|
{ Try to allow to store more info }
|
||||||
res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,BigWin);
|
res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,BigWin);
|
||||||
if not res then
|
if not res then
|
||||||
error:=GetLastError;
|
error:=GetLastError;
|
||||||
res:=SetConsoleScreenBufferSize(IDEScreenBufferHandle,BigWin);
|
res:=SetConsoleScreenBufferSize(StartScreenBufferHandle,BigWin);
|
||||||
if not res then
|
if not res then
|
||||||
error:=GetLastError;
|
error:=GetLastError;
|
||||||
{$endif win32bigwin}
|
{$endif win32bigwin}
|
||||||
{ make sure that both Screen Handle have the sme buffer }
|
{ make sure that both Screen Handle have the sme buffer }
|
||||||
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
|
GetConsoleScreenBufferInfo(StartScreenBufferHandle,
|
||||||
@ConsoleScreenBufferInfo);
|
@ConsoleScreenBufferInfo);
|
||||||
res:=SetConsoleScreenBufferSize(DosScreenBufferHandle,
|
res:=SetConsoleScreenBufferSize(NewScreenBufferHandle,
|
||||||
ConsoleScreenBufferInfo.dwSize);
|
ConsoleScreenBufferInfo.dwSize);
|
||||||
if not res then
|
if not res then
|
||||||
error:=GetLastError;
|
error:=GetLastError;
|
||||||
|
IDEScreenBufferHandle:=NewScreenBufferHandle;
|
||||||
|
DosScreenBufferHandle:=StartScreenBufferHandle;
|
||||||
Capture;
|
Capture;
|
||||||
SwitchBackToIDEScreen;
|
SwitchBackToIDEScreen;
|
||||||
end;
|
end;
|
||||||
@ -635,10 +649,12 @@ destructor TWin32Screen.Done;
|
|||||||
begin
|
begin
|
||||||
{ copy the Dos buffer content into the original ScreenBuffer
|
{ copy the Dos buffer content into the original ScreenBuffer
|
||||||
which remains the startup std_output_handle PM }
|
which remains the startup std_output_handle PM }
|
||||||
|
{if StartScreenBufferHandle=IDEScreenBufferHandle then}
|
||||||
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
|
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);
|
||||||
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
|
SetConsoleActiveScreenBuffer(StartScreenBufferHandle);
|
||||||
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
|
SetStdHandle(Std_Output_Handle,StartScreenBufferHandle);
|
||||||
CloseHandle(DosScreenBufferHandle);
|
UpdateFileHandles;
|
||||||
|
CloseHandle(NewScreenBufferHandle);
|
||||||
inherited Done;
|
inherited Done;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -813,7 +829,11 @@ end;
|
|||||||
|
|
||||||
procedure TWin32Screen.Capture;
|
procedure TWin32Screen.Capture;
|
||||||
begin
|
begin
|
||||||
BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle);
|
{if StartScreenBufferHandle=IdeScreenBufferHandle then
|
||||||
|
BufferCopy(IDEScreenBufferHandle,DosScreenBufferHandle)
|
||||||
|
else
|
||||||
|
BufferCopy(DosScreenBufferHandle,IDEScreenBufferHandle);}
|
||||||
|
SaveConsoleScreen;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ dummy for win32 as the Buffer screen
|
{ dummy for win32 as the Buffer screen
|
||||||
@ -828,6 +848,9 @@ end;
|
|||||||
procedure TWin32Screen.SaveConsoleScreen;
|
procedure TWin32Screen.SaveConsoleScreen;
|
||||||
begin
|
begin
|
||||||
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
|
GetConsoleMode(GetStdHandle(Std_Input_Handle), @ConsoleMode);
|
||||||
|
{ set the IDE buffer as active already now PM }
|
||||||
|
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
|
||||||
|
UpdateFileHandles;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TWin32Screen.SwitchToConsoleScreen;
|
procedure TWin32Screen.SwitchToConsoleScreen;
|
||||||
@ -836,6 +859,7 @@ begin
|
|||||||
SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
|
SetStdHandle(Std_Output_Handle,DosScreenBufferHandle);
|
||||||
IDEActive:=false;
|
IDEActive:=false;
|
||||||
SetConsoleMode(GetStdHandle(Std_Input_Handle), ConsoleMode);
|
SetConsoleMode(GetStdHandle(Std_Input_Handle), ConsoleMode);
|
||||||
|
UpdateFileHandles;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TWin32Screen.SwitchBackToIDEScreen;
|
procedure TWin32Screen.SwitchBackToIDEScreen;
|
||||||
@ -848,7 +872,6 @@ begin
|
|||||||
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
|
GetConsoleScreenBufferInfo(IDEScreenBufferHandle,
|
||||||
@ConsoleScreenBufferInfo);
|
@ConsoleScreenBufferInfo);
|
||||||
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
|
SetConsoleActiveScreenBuffer(IDEScreenBufferHandle);
|
||||||
SetStdHandle(Std_Output_Handle,IDEScreenBufferHandle);
|
|
||||||
IdeMode:=(IdeMode or ENABLE_MOUSE_INPUT) and not ENABLE_PROCESSED_INPUT;
|
IdeMode:=(IdeMode or ENABLE_MOUSE_INPUT) and not ENABLE_PROCESSED_INPUT;
|
||||||
SetConsoleMode(GetStdHandle(Std_Input_Handle), IdeMode);
|
SetConsoleMode(GetStdHandle(Std_Input_Handle), IdeMode);
|
||||||
WindowPos.left:=0;
|
WindowPos.left:=0;
|
||||||
@ -909,7 +932,11 @@ end;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* impose the correct size for win32 console window
|
||||||
|
|
||||||
Revision 1.6 2001/11/08 16:38:25 pierre
|
Revision 1.6 2001/11/08 16:38:25 pierre
|
||||||
|
Loading…
Reference in New Issue
Block a user