LCL: TCustomForm.WMWindowPosChanged, gtk intf: do not send WMWindowPosChanged because of strange side effects

git-svn-id: trunk@24979 -
This commit is contained in:
mattias 2010-04-26 18:12:48 +00:00
parent 4111aa2aef
commit af904f7c5a
4 changed files with 38 additions and 18 deletions

View File

@ -480,6 +480,7 @@ type
procedure WMPaint(var message: TLMPaint); message LM_PAINT;
procedure WMShowWindow(var message: TLMShowWindow); message LM_SHOWWINDOW;
procedure WMSize(var message: TLMSize); message LM_Size;
procedure WMWindowPosChanged(var Message: TLMWindowPosChanged); message LM_WINDOWPOSCHANGED;
procedure CMBiDiModeChanged(var Message: TLMessage); message CM_BIDIMODECHANGED;
procedure CMParentBiDiModeChanged(var Message: TLMessage); message CM_PARENTBIDIMODECHANGED;
procedure CMAppShowBtnGlyphChanged(var Message: TLMessage); message CM_APPSHOWBTNGLYPHCHANGED;

View File

@ -656,7 +656,7 @@ begin
inherited WMSize(Message);
if (Message.SizeType and not Size_SourceIsInterface) = Size_Restored then
if (Message.SizeType and Size_Restored)>0 then
begin
FRestoredLeft := Left;
FRestoredTop := Top;
@ -666,6 +666,23 @@ begin
end;
end;
procedure TCustomForm.WMWindowPosChanged(var Message: TLMWindowPosChanged);
begin
if (Parent=nil) and (Message.WindowPos<>nil)
and ((Message.WindowPos^.flags and SWP_SourceIsInterface)>0)
then begin
// this is a top level form (constraints depend on window manager)
// and the widgetset set a size
if (Message.WindowPos^.cx<>Width) or (Message.WindowPos^.cy<>Height) then
begin
// the window manager sets another size => disable autosize to prevent endless loop
Include(FFormState,fsDisableAutoSize);
end;
end;
inherited WMWindowPosChanged(Message);
end;
procedure TCustomForm.CMBiDiModeChanged(var Message: TLMessage);
var
i: Integer;
@ -680,9 +697,11 @@ begin
lMessage.Result := 0;
DisableAlign;
try
{$IFDEF OldAutoSize}
if Parent<>nil then
Parent.ReAlign
else
{$ENDIF}
AdjustSize;
for i := 0 to ComponentCount - 1 do
begin

View File

@ -6871,7 +6871,8 @@ begin
' BoundsRealized=',dbgs(FBoundsRealized),' FromIntf=',(Message.WindowPos^.flags and SWP_SourceIsInterface)>0,' ClientRectInvalid=',ClientRectNeedsInterfaceUpdate]);
{$ENDIF}
if ((Message.WindowPos^.flags and SWP_SourceIsInterface) = 0) then begin
if (Message.WindowPos=nil)
or ((Message.WindowPos^.flags and SWP_SourceIsInterface) = 0) then begin
inherited WMWindowPosChanged(Message);
exit;
end;
@ -6889,11 +6890,11 @@ begin
and (not (wcfClientRectNeedsUpdate in FWinControlFlags)) then
exit;
{$IFDEF VerboseAllAutoSize}
{ $IFDEF VerboseAllAutoSize}
DebugLn(['TWinControl.WMWindowPosChanged CHANGED BY INTF ',dbgsname(Self),' Message=',NewLeft,',',NewTop,',',NewWidth,'x',NewHeight,
' BoundsRealized=',dbgs(FBoundsRealized),
' wcfClientRectNeedsUpdate=',wcfClientRectNeedsUpdate in FWinControlFlags]);
{$ENDIF}
{ $ENDIF}
FBoundsRealized := NewBoundsRealized;
{$IFNDEF OldAutoSize}
//DebugLn(['TWinControl.WMSize ',DbgSName(Self),' phases=',dbgs(AutoSizePhases)]);
@ -8173,13 +8174,13 @@ begin
' -> NewBounds=',dbgs(NewBounds),
' ClientRect=',dbgs(ClientRect));
{$ENDIF}
{$IFDEF VerboseBug16184}
{ $IFDEF VerboseBug16184}
if (Parent=nil) and (Visible) then begin
DebugLn('[TWinControl.DoSendBoundsToInterface] A ',DbgSName(Self),
' OldRelBounds=',dbgs(FBoundsRealized),
' -> NewBounds=',dbgs(NewBounds));
end;
{$ENDIF}
{ $ENDIF}
FBoundsRealized:=NewBounds;
Include(FWinControlFlags,wcfBoundsRealized); // Note: set before calling widgetset, because used in WMSize
//if Parent=nil then DebugLn(['TWinControl.DoSendBoundsToInterface ',DbgSName(Self),' ',dbgs(BoundsRect)]);

View File

@ -6617,10 +6617,10 @@ var
GtkLeft, GtkTop, GtkWidth, GtkHeight: integer;
TopLeftChanged, WidthHeightChanged, IsTopLevelWidget: boolean;
MessageDelivered: boolean;
{$IFDEF OldAutoSize}
{ $IFDEF OldAutoSize}
SizeMsg: TLMSize;
MoveMsg: TLMMove;
{$ENDIF}
{ $ENDIF}
PosMsg : TLMWindowPosChanged;
MainWidget: PGtkWidget;
FixedWidget: PGtkWidget;
@ -6730,10 +6730,9 @@ begin
y := GtkTop;
cx := GtkWidth;
cy := GtkHeight;
{$IFDEF OldAutoSize}
flags := 0;
{$ELSE}
flags := SWP_SourceIsInterface;
flags:=0;
{$IFNDEF OldAutoSize}
// flags := SWP_SourceIsInterface;
{$ENDIF}
end;
MessageDelivered := DeliverMessage(LCLControl, PosMsg) = 0;
@ -6746,12 +6745,12 @@ begin
UpdateLCLSize;
end;
{$IFDEF OldAutoSize}
{ $IFDEF OldAutoSize}
// then send a LM_SIZE message
if WidthHeightChanged then begin
{$IFDEF VerboseSizeMsg}
{ $IFDEF VerboseSizeMsg}
DebugLn('Send LM_SIZE To LCL ',LCLControl.Name,':',LCLControl.ClassName);
{$ENDIF}
{ $ENDIF}
with SizeMsg do
begin
Result := 0;
@ -6786,9 +6785,9 @@ begin
// then send a LM_MOVE message
if TopLeftChanged then begin
{$IFDEF VerboseSizeMsg}
{ $IFDEF VerboseSizeMsg}
DebugLn('Send LM_MOVE To LCL ',LCLControl.Name,':',LCLControl.ClassName);
{$ENDIF}
{ $ENDIF}
with MoveMsg do
begin
Result := 0;
@ -6800,7 +6799,7 @@ begin
MessageDelivered := (DeliverMessage(LCLControl, MoveMsg) = 0);
if not MessageDelivered then exit;
end;
{$ENDIF}
{ $ENDIF}
{$ifndef gtk1}
if GtkWidgetIsA(aWidget, GTKAPIWidget_Type) and