diff --git a/lcl/interfaces/gtk2/gtk2def.pp b/lcl/interfaces/gtk2/gtk2def.pp index 656e46c729..6197be1565 100644 --- a/lcl/interfaces/gtk2/gtk2def.pp +++ b/lcl/interfaces/gtk2/gtk2def.pp @@ -451,10 +451,14 @@ type wwiInvalidEvent, // special mark for widgetinfo // see gtkchanged_editbox and // gtkchanged_editbox_backspace in gtkcallback.inc - wwiTabWidgetFocusCheck // TabWidget have nasty behaviour when clicked + wwiTabWidgetFocusCheck, // TabWidget have nasty behaviour when clicked // by mouse: switches focus here and there, so // focused control triggers OnExit and it looks // like it triggered OnEnter.issue #20493 + wwiClientRectWhilePendingSize // A wrong clientrect may have been returned. + // The LCL asks for clientrect, while a resize + // request was pending. The LCL would have + // expected a value for the new size; ); TWidgetInfoFlags = set of TWidgetInfoFlag; tGtkStateEnumRange = 0..31; diff --git a/lcl/interfaces/gtk2/gtk2proc.inc b/lcl/interfaces/gtk2/gtk2proc.inc index 4dc113c784..bab92d65c6 100644 --- a/lcl/interfaces/gtk2/gtk2proc.inc +++ b/lcl/interfaces/gtk2/gtk2proc.inc @@ -4670,6 +4670,7 @@ function GetWidgetClientRect(TheWidget: PGtkWidget): TRect; var Widget, ClientWidget: PGtkWidget; AChild: PGtkWidget; + WidgetInfo: PWidgetInfo; procedure GetNoteBookClientRect(NBWidget: PGtkNotebook); var @@ -4707,6 +4708,12 @@ begin Result := Rect(0, 0, 0, 0); Widget := TheWidget; ClientWidget := GetFixedWidget(Widget); + + if FWidgetsWithResizeRequest.Contains(Widget) then begin + WidgetInfo := GetWidgetInfo(Widget); + if WidgetInfo <> nil then include(WidgetInfo^.Flags, wwiClientRectWhilePendingSize); + end; + if (ClientWidget <> nil) then Widget := ClientWidget; if (Widget <> nil) then @@ -6643,6 +6650,8 @@ var end; procedure UpdateLCLSize; + var + WidgetInfo: PWidgetInfo; begin LCLWidth:=LCLControl.Width; LCLHeight:=LCLControl.Height; @@ -6651,6 +6660,11 @@ var WidthHeightChanged:=true; //DebugLn(['UpdateLCLSize InvalidateClientRectCache ',DbgSName(LCLControl)]); LCLControl.InvalidateClientRectCache(false); + end + else begin + WidgetInfo := GetWidgetInfo(aWidget); + if (WidgetInfo <> nil) and (wwiClientRectWhilePendingSize in WidgetInfo^.Flags) then + LCLControl.InvalidateClientRectCache(false); end; end; diff --git a/lcl/interfaces/gtk2/gtk2widgetset.inc b/lcl/interfaces/gtk2/gtk2widgetset.inc index 44e6fac178..0c3df25736 100644 --- a/lcl/interfaces/gtk2/gtk2widgetset.inc +++ b/lcl/interfaces/gtk2/gtk2widgetset.inc @@ -2277,6 +2277,7 @@ procedure TGtk2WidgetSet.SendCachedLCLMessages; IsTopLevelWidget: boolean; TopologicalList: TFPList; // list of PGtkWidget; i: integer; + WidgetInfo: PWidgetInfo; procedure RaiseWidgetWithoutControl; begin @@ -2322,6 +2323,8 @@ procedure TGtk2WidgetSet.SendCachedLCLMessages; SetWindowSizeAndPosition(PgtkWindow(Widget),TWinControl(LCLControl)); end; + WidgetInfo := GetWidgetInfo(Widget); + if WidgetInfo <> nil then exclude(WidgetInfo^.Flags, wwiClientRectWhilePendingSize); end; TopologicalList.Free; FWidgetsWithResizeRequest.Clear;