diff --git a/lcl/interfaces/carbon/carbonprivatewindow.inc b/lcl/interfaces/carbon/carbonprivatewindow.inc index fc00c0864f..edfaf087c0 100644 --- a/lcl/interfaces/carbon/carbonprivatewindow.inc +++ b/lcl/interfaces/carbon/carbonprivatewindow.inc @@ -264,6 +264,7 @@ var P, ClientPt, ControlPt: TPoint; DesignPt: HIPoint; ViewPart: HIViewPartCode; + lTmpWidget: TCarbonWidget; begin Result := EventNotHandledErr; Postpone := False; @@ -286,7 +287,13 @@ begin Widget := GetCarbonWidget(Control); while Assigned(Widget) and not Widget.IsEnabled do - Widget := TCarbonWidget(CarbonWidgetset.GetParent(HWND(Widget))); + begin + // Here we need to avoid an endless loop which might occur in case + // GetParent returns the same widget that we passed + lTmpWidget := TCarbonWidget(CarbonWidgetset.GetParent(HWND(Widget))); + if lTmpWidget = Widget then Break; + Widget := lTmpWidget; + end; if Widget = nil then Exit; FillChar(Msg, SizeOf(Msg), 0); diff --git a/lcl/interfaces/carbon/carbonwinapi.inc b/lcl/interfaces/carbon/carbonwinapi.inc index fe4bbe08c8..dada0225fa 100644 --- a/lcl/interfaces/carbon/carbonwinapi.inc +++ b/lcl/interfaces/carbon/carbonwinapi.inc @@ -1770,6 +1770,9 @@ begin if TCarbonWidget(Handle) is TCarbonControl then begin + {$IFDEF VerboseWinAPI} + DebugLn('TCarbonWidgetSet.GetParent Widget: ' + DbgS(TCarbonControl(Handle).Widget)); + {$ENDIF} Result := HWnd(GetCarbonWidget(HIViewGetSuperview(TCarbonControl(Handle).Widget))); if Result = 0 then // no parent control => then parent is a window? Result := HWnd(GetCarbonWidget(HIViewGetWindow(TCarbonControl(Handle).Widget)));