diff --git a/lcl/forms.pp b/lcl/forms.pp index fe816f6e37..0c6724f667 100644 --- a/lcl/forms.pp +++ b/lcl/forms.pp @@ -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; diff --git a/lcl/include/customform.inc b/lcl/include/customform.inc index 2fbb61a143..47a0b4adc4 100644 --- a/lcl/include/customform.inc +++ b/lcl/include/customform.inc @@ -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 diff --git a/lcl/include/wincontrol.inc b/lcl/include/wincontrol.inc index b7b1b25130..e276271c17 100644 --- a/lcl/include/wincontrol.inc +++ b/lcl/include/wincontrol.inc @@ -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)]); diff --git a/lcl/interfaces/gtk/gtkproc.inc b/lcl/interfaces/gtk/gtkproc.inc index 943dd47940..fe40eca8e6 100644 --- a/lcl/interfaces/gtk/gtkproc.inc +++ b/lcl/interfaces/gtk/gtkproc.inc @@ -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