lcl: gtk3: fixed gtk warnings with docked forms

This commit is contained in:
mattias 2023-07-22 13:00:33 +02:00
parent 7d429b8940
commit 7eb893ea23
3 changed files with 205 additions and 184 deletions

View File

@ -278,6 +278,9 @@ function Gtk3IsGdkWindow(AWidget: PGObject): GBoolean;
function Gtk3IsGdkPixbuf(AWidget: PGObject): GBoolean; function Gtk3IsGdkPixbuf(AWidget: PGObject): GBoolean;
function Gtk3IsGdkVisual(AVisual: PGObject): GBoolean; function Gtk3IsGdkVisual(AVisual: PGObject): GBoolean;
function Gtk3WidgetIsA(AWidget: PGtkWidget; AType: TGType): boolean;
function Get3WidgetClassName(AWidget: PGtkWidget): string;
function Gtk3IsPangoContext(APangoContext: PGObject): GBoolean; function Gtk3IsPangoContext(APangoContext: PGObject): GBoolean;
function Gtk3IsPangoFontMetrics(APangoFontMetrics: PGObject): GBoolean; function Gtk3IsPangoFontMetrics(APangoFontMetrics: PGObject): GBoolean;
@ -556,6 +559,32 @@ begin
Result := (AVisual <> nil) and g_type_check_instance_is_a(PGTypeInstance(AVisual), gdk_visual_get_type); Result := (AVisual <> nil) and g_type_check_instance_is_a(PGTypeInstance(AVisual), gdk_visual_get_type);
end; end;
function Gtk3WidgetIsA(AWidget: PGtkWidget; AType: TGType): boolean;
begin
Result := (AWidget <> nil) and g_type_check_instance_is_a(PGTypeInstance(AWidget), AType);
end;
function Get3WidgetClassName(AWidget: PGtkWidget): string;
var
ClassPGChar: Pgchar;
ClassLen: Integer;
begin
Result:='';
if AWidget=nil then begin
Result:='nil';
exit;
end;
ClassPGChar:=g_type_name_from_instance(PGTypeInstance(AWidget));
if ClassPGChar=nil then begin
Result:='<Widget without classname>';
exit;
end;
ClassLen:=strlen(ClassPGChar);
SetLength(Result,ClassLen);
if ClassLen>0 then
Move(ClassPGChar[0],Result[1],ClassLen);
end;
function Gtk3IsPangoContext(APangoContext: PGObject): GBoolean; function Gtk3IsPangoContext(APangoContext: PGObject): GBoolean;
begin begin
Result := (APangoContext <> nil) and g_type_check_instance_is_a(PGTypeInstance(APangoContext), pango_context_get_type); Result := (APangoContext <> nil) and g_type_check_instance_is_a(PGTypeInstance(APangoContext), pango_context_get_type);

View File

@ -61,24 +61,16 @@ type
{ TGtk3Widget } { TGtk3Widget }
TGtk3Widget = class(TGtk3Object, IUnknown) TGtk3Widget = class(TGtk3Object, IUnknown)
private strict private
FFocusableByMouse: Boolean; {shell we call SetFocus on mouse down. Default = False}
FEnterLeaveTime: Cardinal;
FHasPaint: Boolean;
FKeysToEat: TByteSet;
FPaintData: TPaintData;
FContext: HDC;
FCairoContext: Pcairo_t; FCairoContext: Pcairo_t;
FWidgetType: TGtk3WidgetTypes; FCentralWidgetRGBA: array [0{GTK_STATE_NORMAL}..4{GTK_STATE_INSENSITIVE}] of TDefaultRGBA;
FParams: TCreateParams; FContext: HDC;
FOwnWidget: Boolean; FEnterLeaveTime: Cardinal;
FFocusableByMouse: Boolean; {shell we call SetFocus on mouse down. Default = False}
FOwner: PGtkWidget; FOwner: PGtkWidget;
FCentralWidget: PGtkWidget; FPaintData: TPaintData;
FWidget: PGtkWidget;
FProps: TStringList; FProps: TStringList;
FWidgetRGBA: array [0{GTK_STATE_NORMAL}..4{GTK_STATE_INSENSITIVE}] of TDefaultRGBA; FWidgetRGBA: array [0{GTK_STATE_NORMAL}..4{GTK_STATE_INSENSITIVE}] of TDefaultRGBA;
FCentralWidgetRGBA: array [0{GTK_STATE_NORMAL}..4{GTK_STATE_INSENSITIVE}] of TDefaultRGBA;
fText:string;
function CanSendLCLMessage: Boolean; function CanSendLCLMessage: Boolean;
function GetCairoContext: Pcairo_t; function GetCairoContext: Pcairo_t;
function GetEnabled: Boolean; function GetEnabled: Boolean;
@ -91,6 +83,14 @@ type
procedure SetStyleContext(AValue: PGtkStyleContext); procedure SetStyleContext(AValue: PGtkStyleContext);
class procedure destroy_event(w:Tgtk3Widget;{%H-}data:gpointer);cdecl; class procedure destroy_event(w:Tgtk3Widget;{%H-}data:gpointer);cdecl;
protected protected
FCentralWidget: PGtkWidget;
FHasPaint: Boolean;
FKeysToEat: TByteSet;
FParams: TCreateParams;
fText: string;
FOwnWidget: Boolean;
FWidget: PGtkWidget;
FWidgetType: TGtk3WidgetTypes;
// IUnknown implementation // IUnknown implementation
function QueryInterface(constref iid: TGuid; out obj): LongInt; {$IFDEF WINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function QueryInterface(constref iid: TGuid; out obj): LongInt; {$IFDEF WINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
function _AddRef: LongInt; {$IFDEF WINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function _AddRef: LongInt; {$IFDEF WINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
@ -2978,30 +2978,32 @@ begin
dec(AHeight,4); dec(AHeight,4);
end; end;
ARect.x := ALeft;
ARect.y := ATop;
ARect.width := AWidth;
ARect.Height := AHeight;
with Alloc do
begin
x := ALeft;
y := ATop;
width := AWidth;
height := AHeight;
end;
BeginUpdate; BeginUpdate;
try try
{fixes gtk3 assertion} {fixes gtk3 assertion}
Widget^.get_preferred_width(@AMinSize, @ANaturalSize); Widget^.get_preferred_width(@AMinSize, @ANaturalSize);
AWidth:=Max(AWidth,AMinSize);
Widget^.get_preferred_height(@AMinSize, @ANaturalSize); Widget^.get_preferred_height(@AMinSize, @ANaturalSize);
AHeight:=Max(AHeight,AMinSize);
ARect.x := ALeft;
ARect.y := ATop;
ARect.width := AWidth;
ARect.Height := AHeight;
with Alloc do
begin
x := ALeft;
y := ATop;
width := AWidth;
height := AHeight;
end;
Widget^.set_size_request(AWidth,AHeight); Widget^.set_size_request(AWidth,AHeight);
Widget^.size_allocate(@ARect); Widget^.size_allocate(@ARect);
Widget^.set_allocation(@Alloc); Widget^.set_allocation(@Alloc);
if LCLObject.Parent <> nil then if LCLObject.Parent <> nil then
move(ALeft, ATop); Move(ALeft, ATop);
// we must trigger get_preferred_width after changing size // we must trigger get_preferred_width after changing size
{if wtProgressBar in WidgetType then {if wtProgressBar in WidgetType then
getContainerWidget^.set_size_request(AWidth, AHeight);} getContainerWidget^.set_size_request(AWidth, AHeight);}
@ -3292,7 +3294,7 @@ begin
// clDefault must be extracted from style // clDefault must be extracted from style
// nil resets color to gtk default // nil resets color to gtk default
FWidget^.override_background_color(GTK_STATE_FLAG_NORMAL, nil); Widget^.override_background_color(GTK_STATE_FLAG_NORMAL, nil);
StyleContext^.get_background_color(GTK_STATE_FLAG_NORMAL, @AGdkRGBA); StyleContext^.get_background_color(GTK_STATE_FLAG_NORMAL, @AGdkRGBA);
// writeln('ACOLOR R=',AColor.Red,' G=',AColor.green,' B=',AColor.blue); // writeln('ACOLOR R=',AColor.Red,' G=',AColor.green,' B=',AColor.blue);
@ -3301,11 +3303,11 @@ begin
AGdkRGBA.red := AColor.red / 65535.00; AGdkRGBA.red := AColor.red / 65535.00;
AGdkRGBA.blue := AColor.blue / 65535.00; AGdkRGBA.blue := AColor.blue / 65535.00;
AGdkRGBA.green := AColor.red / 65535.00;} AGdkRGBA.green := AColor.red / 65535.00;}
FWidget^.override_background_color(GTK_STATE_FLAG_NORMAL, @AGdkRGBA); Widget^.override_background_color(GTK_STATE_FLAG_NORMAL, @AGdkRGBA);
FWidget^.override_background_color([GTK_STATE_FLAG_ACTIVE], @AGdkRGBA); Widget^.override_background_color([GTK_STATE_FLAG_ACTIVE], @AGdkRGBA);
FWidget^.override_background_color([GTK_STATE_FLAG_FOCUSED], @AGdkRGBA); Widget^.override_background_color([GTK_STATE_FLAG_FOCUSED], @AGdkRGBA);
FWidget^.override_background_color([GTK_STATE_FLAG_PRELIGHT], @AGdkRGBA); Widget^.override_background_color([GTK_STATE_FLAG_PRELIGHT], @AGdkRGBA);
FWidget^.override_background_color([GTK_STATE_FLAG_SELECTED], @AGdkRGBA); Widget^.override_background_color([GTK_STATE_FLAG_SELECTED], @AGdkRGBA);
end else end else
begin begin
//AColor := TColorToTGDKColor(AValue); //AColor := TColorToTGDKColor(AValue);
@ -3358,7 +3360,7 @@ begin
if not Visible then if not Visible then
exit; exit;
DC := TGtk3DeviceContext(FContext); DC := TGtk3DeviceContext(Context);
NColor := LCLObject.Color; NColor := LCLObject.Color;
if (NColor <> clNone) and (NColor <> clDefault) then if (NColor <> clNone) and (NColor <> clDefault) then
@ -3380,7 +3382,7 @@ begin
exit; exit;
FText := AValue; FText := AValue;
if Self.Visible then if Self.Visible then
FWidget^.queue_draw; Widget^.queue_draw;
end; end;
procedure TGtk3Panel.UpdateWidgetConstraints; procedure TGtk3Panel.UpdateWidgetConstraints;
@ -3457,13 +3459,13 @@ function TGtk3Editable.GetReadOnly: Boolean;
begin begin
Result := False; Result := False;
if IsWidgetOK then if IsWidgetOK then
Result := not PGtkEditable(FWidget)^.get_editable; Result := not PGtkEditable(Widget)^.get_editable;
end; end;
procedure TGtk3Editable.SetReadOnly(AValue: Boolean); procedure TGtk3Editable.SetReadOnly(AValue: Boolean);
begin begin
if IsWidgetOK then if IsWidgetOK then
PGtkEditable(FWidget)^.set_editable(not AValue); PGtkEditable(Widget)^.set_editable(not AValue);
end; end;
function TGtk3Editable.getCaretPos: TPoint; function TGtk3Editable.getCaretPos: TPoint;
@ -3471,14 +3473,14 @@ begin
Result := Point(0, 0); Result := Point(0, 0);
if not IsWidgetOk then if not IsWidgetOk then
exit; exit;
Result.X := PGtkEditable(FWidget)^.get_position; Result.X := PGtkEditable(Widget)^.get_position;
end; end;
procedure TGtk3Editable.SetCaretPos(AValue: TPoint); procedure TGtk3Editable.SetCaretPos(AValue: TPoint);
begin begin
if not IsWidgetOk then if not IsWidgetOk then
exit; exit;
PGtkEditable(FWidget)^.set_position(AValue.X); PGtkEditable(Widget)^.set_position(AValue.X);
end; end;
function TGtk3Editable.getSelStart: Integer; function TGtk3Editable.getSelStart: Integer;
@ -3489,7 +3491,7 @@ begin
Result := 0; Result := 0;
if not IsWidgetOk then if not IsWidgetOk then
exit; exit;
if PGtkEditable(FWidget)^.get_selection_bounds(@AStart, @AStop) then if PGtkEditable(Widget)^.get_selection_bounds(@AStart, @AStop) then
begin begin
Result := AStart; Result := AStart;
end; end;
@ -3503,7 +3505,7 @@ begin
Result := 0; Result := 0;
if not IsWidgetOk then if not IsWidgetOk then
exit; exit;
if PGtkEditable(FWidget)^.get_selection_bounds(@AStart, @AStop) then if PGtkEditable(Widget)^.get_selection_bounds(@AStart, @AStop) then
begin begin
Result := AStop - AStart; Result := AStop - AStart;
end; end;
@ -3541,7 +3543,7 @@ var
begin begin
if not IsWidgetOk then if not IsWidgetOk then
exit; exit;
PGtkEditable(FWidget)^.get_selection_bounds(@AStart, @AStop); PGtkEditable(Widget)^.get_selection_bounds(@AStart, @AStop);
AStart := CaretPos.X; AStart := CaretPos.X;
// DebugLn('TGtk3Editable.SetSelLength ',dbgsName(LCLObject),' value=',dbgs(AValue),' AStart=',dbgs(AStart),' InUpdate ',dbgs(InUpdate)); // DebugLn('TGtk3Editable.SetSelLength ',dbgsName(LCLObject),' value=',dbgs(AValue),' AStart=',dbgs(AStart),' InUpdate ',dbgs(InUpdate));
if InUpdate then if InUpdate then
@ -3550,9 +3552,9 @@ begin
PrivateSelection := AValue; PrivateSelection := AValue;
// g_idle_add(@gtk3EditableDelayedSelStart, Self) // g_idle_add(@gtk3EditableDelayedSelStart, Self)
// setDelayed later // setDelayed later
PGtkEditable(FWidget)^.select_region(AStart, AStart + AValue) PGtkEditable(Widget)^.select_region(AStart, AStart + AValue)
end else end else
PGtkEditable(FWidget)^.select_region(AStart, AStart + AValue); PGtkEditable(Widget)^.select_region(AStart, AStart + AValue);
end; end;
{ TGtk3Entry } { TGtk3Entry }
@ -3591,7 +3593,7 @@ begin
Result := taLeftJustify; Result := taLeftJustify;
if not IsWidgetOk then if not IsWidgetOk then
exit; exit;
AFloat := PGtkEntry(FWidget)^.get_alignment; AFloat := PGtkEntry(Widget)^.get_alignment;
if AFloat = 1 then if AFloat = 1 then
Result := taRightJustify Result := taRightJustify
else else
@ -3610,7 +3612,7 @@ begin
taCenter: AFloat := 0.5; taCenter: AFloat := 0.5;
taRightJustify: AFloat := 1.0; taRightJustify: AFloat := 1.0;
end; end;
PGtkEntry(FWidget)^.set_alignment(AFloat); PGtkEntry(Widget)^.set_alignment(AFloat);
end; end;
function TGtk3Entry.EatArrowKeys(const AKey: Word): Boolean; function TGtk3Entry.EatArrowKeys(const AKey: Word): Boolean;
@ -3667,14 +3669,14 @@ procedure TGtk3Entry.InitializeWidget;
begin begin
inherited InitializeWidget; inherited InitializeWidget;
fWidget^.set_size_request(fParams.Width,fParams.Height); Widget^.set_size_request(fParams.Width,fParams.Height);
PgtkEntry(fWidget)^.set_text(PgChar(fParams.Caption)); PgtkEntry(Widget)^.set_text(PgChar(fParams.Caption));
Self.SetTextHint(TCustomEdit(Self.LCLObject).TextHint); Self.SetTextHint(TCustomEdit(Self.LCLObject).TextHint);
Self.SetNumbersOnly(TCustomEdit(Self.LCLObject).NumbersOnly); Self.SetNumbersOnly(TCustomEdit(Self.LCLObject).NumbersOnly);
g_signal_connect_data(FWidget, 'changed', TGCallback(@Gtk3EntryChanged), Self, nil, G_CONNECT_DEFAULT); g_signal_connect_data(Widget, 'changed', TGCallback(@Gtk3EntryChanged), Self, nil, G_CONNECT_DEFAULT);
g_signal_connect_data(FWidget, 'insert-text', TGCallback(@TGtk3Entry.InsertText), Self, nil, G_CONNECT_DEFAULT); g_signal_connect_data(Widget, 'insert-text', TGCallback(@TGtk3Entry.InsertText), Self, nil, G_CONNECT_DEFAULT);
//g_signal_connect_data(PGtkEntry(FWidget)^.get_buffer, 'deleted-text', TGCallback(@Gtk3EntryDeletedText), Self, nil, 0); //g_signal_connect_data(PGtkEntry(FWidget)^.get_buffer, 'deleted-text', TGCallback(@Gtk3EntryDeletedText), Self, nil, 0);
//g_signal_connect_data(PGtkEntry(FWidget)^.get_buffer, 'inserted-text', TGCallback(@Gtk3EntryInsertedText), Self, nil, 0); //g_signal_connect_data(PGtkEntry(FWidget)^.get_buffer, 'inserted-text', TGCallback(@Gtk3EntryInsertedText), Self, nil, 0);
@ -3684,8 +3686,8 @@ procedure TGtk3Entry.UpdateWidgetConstraints;
var mh,nh,mw,nw:gint; var mh,nh,mw,nw:gint;
begin begin
// GtkEntry have 152px minimal and natural width // GtkEntry have 152px minimal and natural width
fWidget^.get_preferred_height(@mh,@nh); Widget^.get_preferred_height(@mh,@nh);
fWidget^.get_preferred_width(@mw,@nw); Widget^.get_preferred_width(@mw,@nw);
if mh>LCLObject.Constraints.MinHeight then if mh>LCLObject.Constraints.MinHeight then
LCLObject.Constraints.MinHeight:=mh; LCLObject.Constraints.MinHeight:=mh;
@ -3702,7 +3704,7 @@ begin
PWChar := ord(APasswordChar); PWChar := ord(APasswordChar);
if (PWChar < 192) or (PWChar = ord('*')) then if (PWChar < 192) or (PWChar = ord('*')) then
PWChar := 9679; PWChar := 9679;
PGtkEntry(FWidget)^.set_invisible_char(PWChar); PGtkEntry(Widget)^.set_invisible_char(PWChar);
end; end;
end; end;
@ -3712,26 +3714,26 @@ const
begin begin
// this is not enough for numeric input - it is just a hint for GUI // this is not enough for numeric input - it is just a hint for GUI
if IsWidgetOK then if IsWidgetOK then
PGtkEntry(FWidget)^.set_input_purpose(ips[ANumbersOnly]); PGtkEntry(Widget)^.set_input_purpose(ips[ANumbersOnly]);
end; end;
procedure TGtk3Entry.SetTextHint(const AHint: string); procedure TGtk3Entry.SetTextHint(const AHint: string);
begin begin
if IsWidgetOK and (Ahint<>'') then if IsWidgetOK and (Ahint<>'') then
PGtkEntry(FWidget)^.set_placeholder_text(PgChar(AHint)); PGtkEntry(Widget)^.set_placeholder_text(PgChar(AHint));
end; end;
procedure TGtk3Entry.SetFrame(const aborder: boolean); procedure TGtk3Entry.SetFrame(const aborder: boolean);
begin begin
if IsWidgetOk then if IsWidgetOk then
PGtkEntry(FWidget)^.set_has_frame(aborder); PGtkEntry(Widget)^.set_has_frame(aborder);
end; end;
function TGtk3Entry.GetTextHint:string; function TGtk3Entry.GetTextHint:string;
begin begin
if IsWidgetOK then if IsWidgetOK then
Result:=PGtkEntry(FWidget)^.get_placeholder_text() Result:=PGtkEntry(Widget)^.get_placeholder_text()
else else
Result:=''; Result:='';
end; end;
@ -3739,22 +3741,22 @@ end;
procedure TGtk3Entry.SetEchoMode(AVisible: Boolean); procedure TGtk3Entry.SetEchoMode(AVisible: Boolean);
begin begin
if IsWidgetOK then if IsWidgetOK then
PGtkEntry(FWidget)^.set_visibility(AVisible); PGtkEntry(Widget)^.set_visibility(AVisible);
end; end;
procedure TGtk3Entry.SetMaxLength(AMaxLength: Integer); procedure TGtk3Entry.SetMaxLength(AMaxLength: Integer);
begin begin
if IsWidgetOK then if IsWidgetOK then
begin begin
PGtkEntry(FWidget)^.set_max_length(AMaxLength); PGtkEntry(Widget)^.set_max_length(AMaxLength);
PGtkEntry(FWidget)^.set_width_chars(AMaxLength); PGtkEntry(Widget)^.set_width_chars(AMaxLength);
end; end;
end; end;
function TGtk3Entry.IsWidgetOk: Boolean; function TGtk3Entry.IsWidgetOk: Boolean;
begin begin
Result := (FWidget <> nil) and Gtk3IsEntry(FWidget); Result := (Widget <> nil) and Gtk3IsEntry(Widget);
end; end;
{ TGtk3SpinEdit } { TGtk3SpinEdit }
@ -3765,7 +3767,7 @@ var
begin begin
Result := 0; Result := 0;
if IsWidgetOk then if IsWidgetOk then
PGtkSpinButton(FWidget)^.get_range(@AFloat ,@Result); PGtkSpinButton(Widget)^.get_range(@AFloat ,@Result);
end; end;
function TGtk3SpinEdit.GetMinimum: Double; function TGtk3SpinEdit.GetMinimum: Double;
@ -3774,21 +3776,21 @@ var
begin begin
Result := 0; Result := 0;
if IsWidgetOk then if IsWidgetOk then
PGtkSpinButton(FWidget)^.get_range(@Result ,@AFloat); PGtkSpinButton(Widget)^.get_range(@Result ,@AFloat);
end; end;
function TGtk3SpinEdit.GetNumDigits: Integer; function TGtk3SpinEdit.GetNumDigits: Integer;
begin begin
Result := 0; Result := 0;
if IsWidgetOk then if IsWidgetOk then
Result := Integer(PGtkSpinButton(FWidget)^.get_digits); Result := Integer(PGtkSpinButton(Widget)^.get_digits);
end; end;
function TGtk3SpinEdit.GetNumeric: Boolean; function TGtk3SpinEdit.GetNumeric: Boolean;
begin begin
Result := False; Result := False;
if IsWidgetOk then if IsWidgetOk then
Result := PGtkSpinButton(FWidget)^.get_numeric; Result := PGtkSpinButton(Widget)^.get_numeric;
end; end;
function TGtk3SpinEdit.GetStep: Double; function TGtk3SpinEdit.GetStep: Double;
@ -3797,26 +3799,26 @@ var
begin begin
Result := 0; Result := 0;
if IsWidgetOk then if IsWidgetOk then
PGtkSpinButton(FWidget)^.get_increments(@Result, @AFloat); PGtkSpinButton(Widget)^.get_increments(@Result, @AFloat);
end; end;
function TGtk3SpinEdit.GetValue: Double; function TGtk3SpinEdit.GetValue: Double;
begin begin
Result := 0; Result := 0;
if IsWidgetOk then if IsWidgetOk then
Result := PGtkSpinButton(FWidget)^.get_value; Result := PGtkSpinButton(Widget)^.get_value;
end; end;
procedure TGtk3SpinEdit.SetNumDigits(AValue: Integer); procedure TGtk3SpinEdit.SetNumDigits(AValue: Integer);
begin begin
if IsWidgetOk then if IsWidgetOk then
PGtkSpinButton(FWidget)^.set_digits(GUint(AValue)); PGtkSpinButton(Widget)^.set_digits(GUint(AValue));
end; end;
procedure TGtk3SpinEdit.SetNumeric(AValue: Boolean); procedure TGtk3SpinEdit.SetNumeric(AValue: Boolean);
begin begin
if IsWidgetOk then if IsWidgetOk then
PGtkSpinButton(FWidget)^.set_numeric(AValue); PGtkSpinButton(Widget)^.set_numeric(AValue);
end; end;
procedure TGtk3SpinEdit.SetStep(AValue: Double); procedure TGtk3SpinEdit.SetStep(AValue: Double);
@ -3826,8 +3828,8 @@ var
begin begin
if IsWidgetOk then if IsWidgetOk then
begin begin
PGtkSpinButton(FWidget)^.get_increments(@AStep, @APage); PGtkSpinButton(Widget)^.get_increments(@AStep, @APage);
PGtkSpinButton(FWidget)^.set_increments(AValue, APage); PGtkSpinButton(Widget)^.set_increments(AValue, APage);
end; end;
end; end;
@ -3835,7 +3837,7 @@ procedure TGtk3SpinEdit.SetValue(AValue: Double);
begin begin
if IsWidgetOk then if IsWidgetOk then
begin begin
PGtkSpinButton(FWidget)^.set_value(AValue); PGtkSpinButton(Widget)^.set_value(AValue);
end; end;
end; end;
@ -3859,13 +3861,13 @@ end;
function TGtk3SpinEdit.IsWidgetOk: Boolean; function TGtk3SpinEdit.IsWidgetOk: Boolean;
begin begin
Result := (FWidget <> nil) and Gtk3IsSpinButton(FWidget); Result := (Widget <> nil) and Gtk3IsSpinButton(Widget);
end; end;
procedure TGtk3SpinEdit.SetRange(AMin, AMax: Double); procedure TGtk3SpinEdit.SetRange(AMin, AMax: Double);
begin begin
if IsWidgetOk then if IsWidgetOk then
PGtkSpinButton(FWidget)^.set_range(AMin, AMax); PGtkSpinButton(Widget)^.set_range(AMin, AMax);
end; end;
{ TGtk3Range } { TGtk3Range }
@ -3888,20 +3890,20 @@ function TGtk3Range.GetPosition: Integer;
begin begin
Result := 0; Result := 0;
if IsWidgetOK then if IsWidgetOK then
Result := Round(PGtkRange(FWidget)^.get_value); Result := Round(PGtkRange(Widget)^.get_value);
end; end;
function TGtk3Range.GetRange: TPoint; function TGtk3Range.GetRange: TPoint;
begin begin
Result := Point(0, 0); Result := Point(0, 0);
if IsWidgetOK then if IsWidgetOK then
PGtkRange(FWidget)^.get_slider_range(@Result.X, @Result.Y); PGtkRange(Widget)^.get_slider_range(@Result.X, @Result.Y);
end; end;
procedure TGtk3Range.SetPosition(AValue: Integer); procedure TGtk3Range.SetPosition(AValue: Integer);
begin begin
if IsWidgetOK then if IsWidgetOK then
PGtkRange(FWidget)^.set_value(gDouble(AValue)); PGtkRange(Widget)^.set_value(gDouble(AValue));
end; end;
procedure TGtk3Range.SetRange(AValue: TPoint); procedure TGtk3Range.SetRange(AValue: TPoint);
@ -3912,7 +3914,7 @@ begin
begin begin
dx := AValue.X; dx := AValue.X;
dy := AValue.Y; dy := AValue.Y;
PGtkRange(FWidget)^.set_range(dx, dy); PGtkRange(Widget)^.set_range(dx, dy);
end; end;
end; end;
@ -3925,7 +3927,7 @@ end;
procedure TGtk3Range.SetStep(AStep: Integer; APageSize: Integer); procedure TGtk3Range.SetStep(AStep: Integer; APageSize: Integer);
begin begin
if IsWidgetOk then if IsWidgetOk then
PGtkRange(FWidget)^.set_increments(gDouble(AStep), gDouble(APageSize)); PGtkRange(Widget)^.set_increments(gDouble(AStep), gDouble(APageSize));
end; end;
{ TGtk3TrackBar } { TGtk3TrackBar }
@ -3934,13 +3936,13 @@ function TGtk3TrackBar.GetReversed: Boolean;
begin begin
Result := False; Result := False;
if IsWidgetOK then if IsWidgetOK then
Result := PGtkScale(FWidget)^.get_inverted; Result := PGtkScale(Widget)^.get_inverted;
end; end;
procedure TGtk3TrackBar.SetReversed(AValue: Boolean); procedure TGtk3TrackBar.SetReversed(AValue: Boolean);
begin begin
if IsWidgetOK then if IsWidgetOK then
PGtkScale(FWidget)^.set_inverted(AValue); PGtkScale(Widget)^.set_inverted(AValue);
end; end;
function TGtk3TrackBar.CreateWidget(const Params: TCreateParams): PGtkWidget; function TGtk3TrackBar.CreateWidget(const Params: TCreateParams): PGtkWidget;
@ -3976,7 +3978,7 @@ end;
procedure TGtk3TrackBar.SetScalePos(AValue: TTrackBarScalePos); procedure TGtk3TrackBar.SetScalePos(AValue: TTrackBarScalePos);
begin begin
if IsWidgetOK then if IsWidgetOK then
PGtkScale(FWidget)^.set_value_pos(TGtkPositionType(AValue)); PGtkScale(Widget)^.set_value_pos(TGtkPositionType(AValue));
end; end;
procedure TGtk3TrackBar.SetTickMarks(AValue: TTickMark; ATickStyle: TTickStyle); procedure TGtk3TrackBar.SetTickMarks(AValue: TTickMark; ATickStyle: TTickStyle);
@ -3991,12 +3993,12 @@ const
begin begin
if IsWidgetOK then if IsWidgetOK then
begin begin
PGtkScale(FWidget)^.set_draw_value(ATickStyle <> tsNone); PGtkScale(Widget)^.set_draw_value(ATickStyle <> tsNone);
if ATickStyle = tsNone then if ATickStyle = tsNone then
PGtkScale(FWidget)^.clear_marks PGtkScale(Widget)^.clear_marks
else else
begin begin
PGtkScale(FWidget)^.clear_marks; PGtkScale(Widget)^.clear_marks;
Track:=TCustomTrackbar(LCLObject); Track:=TCustomTrackbar(LCLObject);
cnt:=round(abs(Track.max-Track.min)/Track.LineSize); cnt:=round(abs(Track.max-Track.min)/Track.LineSize);
// highly-dense marks just enlarge GtkScale automatically // highly-dense marks just enlarge GtkScale automatically
@ -4009,9 +4011,9 @@ begin
for i := Track.Min to Track.Max do for i := Track.Min to Track.Max do
begin begin
if AValue in [tmBoth, tmTopLeft] then if AValue in [tmBoth, tmTopLeft] then
PGtkScale(FWidget)^.add_mark(gDouble(i), tick_map[Track.Orientation,0], nil); PGtkScale(Widget)^.add_mark(gDouble(i), tick_map[Track.Orientation,0], nil);
if AValue in [tmBoth, tmBottomRight] then if AValue in [tmBoth, tmBottomRight] then
PGtkScale(FWidget)^.add_mark(gDouble(i), tick_map[Track.Orientation,1], nil); PGtkScale(Widget)^.add_mark(gDouble(i), tick_map[Track.Orientation,1], nil);
end; end;
end; end;
end; end;
@ -4025,7 +4027,7 @@ var
ARange: PGtkRange; ARange: PGtkRange;
begin begin
scr:=TScrollbar(bar.LCLObject); scr:=TScrollbar(bar.LCLObject);
pgs:=PGtkScrollbar(bar.FWidget); pgs:=PGtkScrollbar(bar.Widget);
arange:=PGtkRange(pgs); arange:=PGtkRange(pgs);
scr.SetParams( scr.SetParams(
round(arange^.adjustment^.value), round(arange^.adjustment^.value),
@ -4375,7 +4377,7 @@ begin
if Assigned(FCentralWidget) then if Assigned(FCentralWidget) then
PGtkFixed(PGtkScrolledWindow(FCentralWidget)^.get_child)^.put(AWidget, ALeft, ATop) PGtkFixed(PGtkScrolledWindow(FCentralWidget)^.get_child)^.put(AWidget, ALeft, ATop)
else else
PGtkContainer(FWidget)^.add(AWidget); PGtkContainer(Widget)^.add(AWidget);
end; end;
{ TGtk3ToolBar } { TGtk3ToolBar }
@ -4554,7 +4556,7 @@ var
begin begin
if not getContainerWidget^.get_realized then if not getContainerWidget^.get_realized then
begin begin
AParent := FWidget^.get_parent; AParent := Widget^.get_parent;
AParentObject := TGtk3Widget(HwndFromGtkWidget(AParent)); AParentObject := TGtk3Widget(HwndFromGtkWidget(AParent));
if AParentObject <> nil then if AParentObject <> nil then
Result := AParentObject.getClientRect Result := AParentObject.getClientRect
@ -4777,15 +4779,20 @@ procedure TGtk3NoteBook.InsertPage(ACustomPage: TCustomPage; AIndex: Integer);
var var
Gtk3Page: TGtk3Page; Gtk3Page: TGtk3Page;
AMinSize, ANaturalSize: gint; AMinSize, ANaturalSize: gint;
NB: PGtkNotebook;
begin begin
if IsWidgetOK then if IsWidgetOK then
begin begin
Gtk3Page := TGtk3Page(ACustomPage.Handle); Gtk3Page := TGtk3Page(ACustomPage.Handle);
PGtkNoteBook(GetContainerWidget)^.insert_page(Gtk3Page.Widget, Gtk3Page.FPageLabel, AIndex); NB:=PGtkNoteBook(GetContainerWidget);
PGtkNoteBook(GetContainerWidget)^.get_preferred_width(@AMinSize, @ANaturalSize); NB^.insert_page(Gtk3Page.Widget, Gtk3Page.FPageLabel, AIndex);
PGtkNoteBook(GetContainerWidget)^.get_preferred_height(@AMinSize, @ANaturalSize); NB^.get_preferred_width(@AMinSize, @ANaturalSize);
if gtk_notebook_get_n_pages(PGtkNoteBook(GetContainerWidget)) > 1 then NB^.get_preferred_height(@AMinSize, @ANaturalSize);
PGtkNoteBook(GetContainerWidget)^.resize_children; if (gtk_notebook_get_n_pages(NB) > 1) then
begin
// Check why this give sometimes: Gtk-WARNING: Negative content width -1 (allocation 1, extents 1x1) while allocating gadget (node notebook, owner GtkNotebook)
//NB^.resize_children;
end;
end; end;
end; end;
@ -4798,13 +4805,15 @@ end;
procedure TGtk3NoteBook.RemovePage(AIndex: Integer); procedure TGtk3NoteBook.RemovePage(AIndex: Integer);
var var
AMinSizeW, AMinSizeH, ANaturalSizeW, ANaturalSizeH: gint; AMinSizeW, AMinSizeH, ANaturalSizeW, ANaturalSizeH: gint;
NB: PGtkNotebook;
begin begin
if IsWidgetOK then if IsWidgetOK then
begin begin
PGtkNotebook(GetContainerWidget)^.remove_page(AIndex); NB:=PGtkNotebook(GetContainerWidget);
PGtkNoteBook(GetContainerWidget)^.get_preferred_width(@AMinSizeW, @ANaturalSizeW); NB^.remove_page(AIndex);
PGtkNoteBook(GetContainerWidget)^.get_preferred_height(@AMinSizeH, @ANaturalSizeH); NB^.get_preferred_width(@AMinSizeW, @ANaturalSizeW);
PGtkNoteBook(GetContainerWidget)^.resize_children; NB^.get_preferred_height(@AMinSizeH, @ANaturalSizeH);
NB^.resize_children;
end; end;
end; end;
@ -4862,10 +4871,6 @@ constructor TGtk3MenuShell.Create(const AMenu: TMenu; AMenuBar: PGtkMenuBar);
begin begin
inherited Create; inherited Create;
MenuObject := AMenu; MenuObject := AMenu;
FContext := 0;
FHasPaint := False;
FWidget := nil;
FOwner := nil;
FCentralWidget := nil; FCentralWidget := nil;
if AMenuBar <> nil then if AMenuBar <> nil then
begin begin
@ -4874,8 +4879,6 @@ begin
end else end else
FOwnWidget := True; FOwnWidget := True;
// Initializes the properties // Initializes the properties
FProps := nil;
LCLObject := nil;
// FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE]; // FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE];
// FHasPaint := False; // FHasPaint := False;
@ -4885,10 +4888,6 @@ end;
procedure TGtk3MenuShell.InitializeWidget; procedure TGtk3MenuShell.InitializeWidget;
begin begin
FCentralWidget := nil;
FCairoContext := nil;
FContext := 0;
FEnterLeaveTime := 0;
if FOwnWidget then if FOwnWidget then
FWidget := CreateWidget(FParams); FWidget := CreateWidget(FParams);
@ -4999,15 +4998,8 @@ constructor TGtk3MenuItem.Create(const AMenuItem: TMenuItem);
begin begin
inherited Create; inherited Create;
MenuItem := AMenuItem; MenuItem := AMenuItem;
FContext := 0;
FHasPaint := False;
FWidget := nil;
FOwner := nil;
FCentralWidget := nil;
FOwnWidget := True; FOwnWidget := True;
// Initializes the properties // Initializes the properties
FProps := nil;
LCLObject := nil;
// FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE]; // FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE];
// FHasPaint := False; // FHasPaint := False;
@ -5035,11 +5027,6 @@ end;
procedure TGtk3MenuItem.InitializeWidget; procedure TGtk3MenuItem.InitializeWidget;
begin begin
FCentralWidget := nil;
FCairoContext := nil;
FContext := 0;
FEnterLeaveTime := 0;
FWidget := CreateWidget(FParams); FWidget := CreateWidget(FParams);
LCLIntf.SetProp(HWND(Self),'lclwidget',Self); LCLIntf.SetProp(HWND(Self),'lclwidget',Self);
@ -7386,19 +7373,20 @@ begin
else else
FIcon := nil; FIcon := nil;
// DebugLn('Setting icon ',dbgHex(PtrUInt(FIcon)),' AppIcon ',dbgHex(PtrUInt(GTK3WidgetSet.AppIcon))); // DebugLn('Setting icon ',dbgHex(PtrUInt(FIcon)),' AppIcon ',dbgHex(PtrUInt(GTK3WidgetSet.AppIcon)));
PGtkWindow(Widget)^.set_icon(FIcon); if Gtk3IsGtkWindow(fWidget) then
PGtkWindow(Widget)^.set_icon(FIcon);
end; end;
function TGtk3Window.GetSkipTaskBarHint: Boolean; function TGtk3Window.GetSkipTaskBarHint: Boolean;
begin begin
Result := False; Result := False;
if IsWidgetOK then if Gtk3IsGtkWindow(fWidget) then
Result := PGtkWindow(Widget)^.get_skip_taskbar_hint; Result := PGtkWindow(Widget)^.get_skip_taskbar_hint;
end; end;
procedure TGtk3Window.SetSkipTaskBarHint(AValue: Boolean); procedure TGtk3Window.SetSkipTaskBarHint(AValue: Boolean);
begin begin
if IsWidgetOK then if Gtk3IsGtkWindow(fWidget) then
PGtkWindow(Widget)^.set_skip_taskbar_hint(AValue); PGtkWindow(Widget)^.set_skip_taskbar_hint(AValue);
end; end;
@ -7519,6 +7507,8 @@ function TGtk3Window.ShowState(nstate:integer):boolean; // winapi ShowWindow
var var
AState: TGdkWindowState; AState: TGdkWindowState;
begin begin
if not Gtk3IsGtkWindow(fWidget) then
exit(false);
case nstate of case nstate of
SW_SHOWNORMAL: SW_SHOWNORMAL:
begin begin
@ -7577,7 +7567,7 @@ begin
end else end else
begin begin
Result := PGtkScrolledWindow(TGtkScrolledWindow.new(nil, nil)); Result := PGtkScrolledWindow(TGtkScrolledWindow.new(nil, nil));
gtk_widget_realize(Result); // cannot gtk_widget_realize(Result), because that needs a valid widget parent
FWidgetType := [wtWidget, wtLayout, wtScrollingWin, wtCustomControl] FWidgetType := [wtWidget, wtLayout, wtScrollingWin, wtCustomControl]
end; end;
@ -7618,7 +7608,6 @@ begin
PGtkContainer(Result)^.add(FBox); PGtkContainer(Result)^.add(FBox);
g_signal_connect_data(Result,'window-state-event', TGCallback(@Gtk3WindowState), Self, nil, G_CONNECT_DEFAULT); g_signal_connect_data(Result,'window-state-event', TGCallback(@Gtk3WindowState), Self, nil, G_CONNECT_DEFAULT);
if not (csDesigning in AForm.ComponentState) then if not (csDesigning in AForm.ComponentState) then
UpdateWindowState; UpdateWindowState;
@ -7696,7 +7685,8 @@ begin
Widget^.get_preferred_height(@AMinSize, @ANaturalSize); Widget^.get_preferred_height(@AMinSize, @ANaturalSize);
Widget^.size_allocate(@ARect); Widget^.size_allocate(@ARect);
if not (csDesigning in AForm.ComponentState) {and (AForm.Parent = nil) and (AForm.ParentWindow = 0)} then if Gtk3IsGtkWindow(fWidget)
and not (csDesigning in AForm.ComponentState) {and (AForm.Parent = nil) and (AForm.ParentWindow = 0)} then
begin begin
AFixedWidthHeight := AForm.BorderStyle in [bsDialog, bsSingle, bsToolWindow]; AFixedWidthHeight := AForm.BorderStyle in [bsDialog, bsSingle, bsToolWindow];
with Geometry do with Geometry do
@ -7724,7 +7714,7 @@ begin
height_inc := 1; height_inc := 1;
min_aspect := 0; min_aspect := 0;
max_aspect := 1; max_aspect := 1;
win_gravity := PGtkWindow(Widget)^.get_gravity; win_gravity := PGtkWindow(Widget)^.get_gravity
end; end;
if AFixedWidthHeight then if AFixedWidthHeight then
@ -7744,9 +7734,13 @@ begin
end; end;
end; end;
end; end;
PGtkWindow(Widget)^.set_resizable(true);
PGtkWindow(Widget)^.resize(AWidth, AHeight); if Gtk3IsGtkWindow(fWidget) then
PGtkWindow(Widget)^.move(ALeft, ATop); begin
PGtkWindow(Widget)^.set_resizable(true);
PGtkWindow(Widget)^.resize(AWidth, AHeight);
PGtkWindow(Widget)^.move(ALeft, ATop);
end;
finally finally
EndUpdate; EndUpdate;
end; end;
@ -7790,7 +7784,7 @@ end;
procedure TGtk3Window.Activate; procedure TGtk3Window.Activate;
begin begin
if IsWidgetOk then if Gtk3IsGtkWindow(fWidget) then
begin begin
if Gtk3IsGdkWindow(PGtkWindow(FWidget)^.window) then if Gtk3IsGdkWindow(PGtkWindow(FWidget)^.window) then
begin begin
@ -7806,6 +7800,8 @@ var
MsgActivate: TLMActivate; MsgActivate: TLMActivate;
FIsActivated: Boolean; FIsActivated: Boolean;
begin begin
if not Gtk3IsGtkWindow(fWidget) then exit;
//gtk3 does not handle activate/deactivate at all //gtk3 does not handle activate/deactivate at all
//even cannot catch it via GDK_FOCUS event ?!? //even cannot catch it via GDK_FOCUS event ?!?
FillChar(MsgActivate{%H-}, SizeOf(MsgActivate), #0); FillChar(MsgActivate{%H-}, SizeOf(MsgActivate), #0);
@ -7894,7 +7890,6 @@ begin
fBox^.pack_start(fCentralWidget, true, true, 0); fBox^.pack_start(fCentralWidget, true, true, 0);
PGtkWindow(Result)^.set_can_focus(false); PGtkWindow(Result)^.set_can_focus(false);
end; end;
procedure TGtk3HintWindow.InitializeWidget; procedure TGtk3HintWindow.InitializeWidget;
@ -8091,15 +8086,8 @@ var
AFileDialog: PGtkFileChooserDialog; AFileDialog: PGtkFileChooserDialog;
begin begin
inherited Create; inherited Create;
FContext := 0;
FHasPaint := False;
FWidget := nil;
FOwner := nil;
FCentralWidget := nil;
FOwnWidget := True; FOwnWidget := True;
// Initializes the properties // Initializes the properties
FProps := nil;
LCLObject := nil;
FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE]; FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE];
FWidgetType := [wtWidget, wtDialog]; FWidgetType := [wtWidget, wtDialog];
@ -8187,15 +8175,8 @@ end;
constructor TGtk3FontSelectionDialog.Create(const ACommonDialog: TCommonDialog); constructor TGtk3FontSelectionDialog.Create(const ACommonDialog: TCommonDialog);
begin begin
inherited Create; inherited Create;
FContext := 0;
FHasPaint := False;
FWidget := nil;
FOwner := nil;
FCentralWidget := nil;
FOwnWidget := True; FOwnWidget := True;
// Initializes the properties // Initializes the properties
FProps := nil;
LCLObject := nil;
FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE]; FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE];
FWidgetType := [wtWidget, wtDialog]; FWidgetType := [wtWidget, wtDialog];
@ -8227,15 +8208,8 @@ constructor TGtk3ColorSelectionDialog.Create(const ACommonDialog: TCommonDialog
); );
begin begin
inherited Create; inherited Create;
FContext := 0;
FHasPaint := False;
FWidget := nil;
FOwner := nil;
FCentralWidget := nil;
FOwnWidget := True; FOwnWidget := True;
// Initializes the properties // Initializes the properties
FProps := nil;
LCLObject := nil;
FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE]; FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE];
FWidgetType := [wtWidget, wtDialog]; FWidgetType := [wtWidget, wtDialog];
@ -8277,14 +8251,8 @@ constructor TGtk3newColorSelectionDialog.Create(const ACommonDialog: TCommonDial
); );
begin begin
inherited Create; inherited Create;
FContext := 0;
FHasPaint := False;
FWidget := nil;
FOwner := nil;
FCentralWidget := nil;
FOwnWidget := True; FOwnWidget := True;
// Initializes the properties // Initializes the properties
FProps := nil;
LCLObject := nil; LCLObject := nil;
FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE]; FKeysToEat := [VK_TAB, VK_RETURN, VK_ESCAPE];
FWidgetType := [wtWidget, wtDialog]; FWidgetType := [wtWidget, wtDialog];

View File

@ -160,19 +160,27 @@ class function TGtk3WSCustomForm.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLHandle; const AParams: TCreateParams): TLCLHandle;
var var
AWindow: TGtk3Window; AWindow: TGtk3Window;
AWinPtr: PGtkWindow; AGtkWindow: PGtkWindow;
ARect: TGdkRectangle; ARect: TGdkRectangle;
AWidget: PGtkWidget;
begin begin
{$IFDEF GTK3DEBUGCORE} {$IFDEF GTK3DEBUGCORE}
DebugLn('TGtk3WSCustomForm.CreateHandle'); DebugLn('TGtk3WSCustomForm.CreateHandle');
{$ENDIF} {$ENDIF}
AWindow := TGtk3Window.Create(AWinControl, AParams); AWindow := TGtk3Window.Create(AWinControl, AParams);
AWinPtr := PGtkWindow(AWindow.Widget); //debugln(['TGtk3WSCustomForm.CreateHandle AWindow.Widget=',Get3WidgetClassName(AWindow.Widget)]);
AWindow.Title := AWinControl.Caption;
AWinPtr^.set_resizable(True); AWidget:=AWindow.Widget;
AWinPtr^.set_has_resize_grip(False); AGtkWindow:=nil;
if Gtk3IsGtkWindow(AWidget) then
begin
AGtkWindow := PGtkWindow(AWidget);
AWindow.Title := AWinControl.Caption;
AGtkWindow^.set_resizable(True);
AGtkWindow^.set_has_resize_grip(False);
end;
with ARect do with ARect do
begin begin
@ -181,8 +189,9 @@ begin
width := AWinControl.Width; width := AWinControl.Width;
height := AWinControl.Height; height := AWinControl.Height;
end; end;
AWinPtr^.set_allocation(@ARect); AWidget^.set_allocation(@ARect);
Gtk3WidgetSet.AddWindow(AWinPtr); if AGtkWindow<>nil then
Gtk3WidgetSet.AddWindow(AGtkWindow);
Result := TLCLHandle(AWindow); Result := TLCLHandle(AWindow);
@ -205,11 +214,14 @@ end;
class procedure TGtk3WSCustomForm.ShowHide(const AWinControl: TWinControl); class procedure TGtk3WSCustomForm.ShowHide(const AWinControl: TWinControl);
var var
AMask: TGdkEventMask; AMask: TGdkEventMask;
AForm: TCustomForm; AForm, OtherForm: TCustomForm;
AWindow: PGtkWindow; AWindow: PGtkWindow;
i: Integer; i: Integer;
AGeom: TGdkGeometry; AGeom: TGdkGeometry;
AGeomMask: TGdkWindowHints; AGeomMask: TGdkWindowHints;
ShouldBeVisible: Boolean;
AGtk3Widget: TGtk3Widget;
OtherGtk3Window: TGtk3Window;
begin begin
{$IFDEF GTK3DEBUGCORE} {$IFDEF GTK3DEBUGCORE}
DebugLn('TGtk3WSCustomForm.ShowHide handleAllocated=',dbgs(AWinControl.HandleAllocated)); DebugLn('TGtk3WSCustomForm.ShowHide handleAllocated=',dbgs(AWinControl.HandleAllocated));
@ -220,42 +232,54 @@ begin
{$IFDEF GTK3DEBUGCORE} {$IFDEF GTK3DEBUGCORE}
DebugLn('TGtk3WSCustomForm.ShowHide visible=',dbgs(AWinControl.HandleObjectShouldBeVisible)); DebugLn('TGtk3WSCustomForm.ShowHide visible=',dbgs(AWinControl.HandleObjectShouldBeVisible));
{$ENDIF} {$ENDIF}
AWindow := PGtkWindow(TGtk3Widget(AForm.Handle).Widget); AGtk3Widget:=TGtk3Widget(AForm.Handle);
if Gtk3IsGtkWindow(AGtk3Widget.Widget) then
AWindow := PGtkWindow(AGtk3Widget.Widget)
else
AWindow := nil;
if (fsModal in AForm.FormState) and AForm.HandleObjectShouldBeVisible then ShouldBeVisible:=AForm.HandleObjectShouldBeVisible;
if (fsModal in AForm.FormState) and ShouldBeVisible and (AWindow<>nil) then
begin begin
AWindow^.set_type_hint(GDK_WINDOW_TYPE_HINT_DIALOG); AWindow^.set_type_hint(GDK_WINDOW_TYPE_HINT_DIALOG);
AWindow^.set_modal(True); AWindow^.set_modal(True);
end; end;
TGtk3Widget(AWinControl.Handle).Visible := AWinControl.HandleObjectShouldBeVisible; AGtk3Widget.Visible := ShouldBeVisible;
if TGtk3Widget(AWinControl.Handle).Visible then if AGtk3Widget.Visible then
begin begin
if (fsModal in AForm.FormState) and (Application.ModalLevel > 0) then if (fsModal in AForm.FormState) and (Application.ModalLevel > 0) and (AWindow<>nil) then
begin begin
// DebugLn('TGtk3WSCustomForm.ShowHide ModalLevel=',dbgs(Application.ModalLevel),' Self=',dbgsName(AForm)); // DebugLn('TGtk3WSCustomForm.ShowHide ModalLevel=',dbgs(Application.ModalLevel),' Self=',dbgsName(AForm));
if Application.ModalLevel > 1 then if Application.ModalLevel > 1 then
begin begin
for i := 0 to Screen.CustomFormZOrderCount - 1 do for i := 0 to Screen.CustomFormZOrderCount - 1 do
begin begin
// DebugLn('CustomFormZOrder[',dbgs(i),'].',dbgsName(Screen.CustomFormsZOrdered[i]),' modal=', OtherForm:=Screen.CustomFormsZOrdered[i];
// dbgs(fsModal in Screen.CustomFormsZOrdered[i].FormState)); // DebugLn('CustomFormZOrder[',dbgs(i),'].',dbgsName(OtherForm),' modal=',dbgs(fsModal in OtherForm.FormState));
if (Screen.CustomFormsZOrdered[i] <> AForm) and if (OtherForm <> AForm) and
(fsModal in Screen.CustomFormsZOrdered[i].FormState) and (fsModal in OtherForm.FormState) and
Screen.CustomFormsZOrdered[i].HandleAllocated then OtherForm.HandleAllocated then
begin begin
// DebugLn('TGtk3WSCustomForm.ShowHide setTransient for ',dbgsName(Screen.CustomFormsZOrdered[i])); // DebugLn('TGtk3WSCustomForm.ShowHide setTransient for ',dbgsName(OtherForm));
AWindow^.set_transient_for(PGtkWindow(TGtk3Window(Screen.CustomFormsZOrdered[i].Handle).Widget)); OtherGtk3Window:=TGtk3Window(OtherForm.Handle);
break; if Gtk3IsGtkWindow(OtherGtk3Window.Widget) then
begin
AWindow^.set_transient_for(PGtkWindow(OtherGtk3Window.Widget));
break;
end;
end; end;
end; end;
end; end;
end; end;
AWindow^.show_all; if AWindow<>nil then
AMask := AWindow^.window^.get_events; begin
AWindow^.window^.set_events(GDK_ALL_EVENTS_MASK {AMask or GDK_POINTER_MOTION_MASK or GDK_POINTER_MOTION_HINT_MASK}); AWindow^.show_all;
AMask := AWindow^.window^.get_events;
AWindow^.window^.set_events(GDK_ALL_EVENTS_MASK {AMask or GDK_POINTER_MOTION_MASK or GDK_POINTER_MOTION_HINT_MASK});
end;
end else end else
begin begin
if fsModal in AForm.FormState then if (fsModal in AForm.FormState) and (AWindow<>nil) then
begin begin
if AWindow^.transient_for <> nil then if AWindow^.transient_for <> nil then
begin begin