mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-24 02:26:26 +02:00
gtk: fix resetting color property of some controls (issue #0007555, using Zeljan patch but with many modifications)
git-svn-id: trunk@20441 -
This commit is contained in:
parent
b3dfa327cd
commit
cbea652f5f
@ -4534,7 +4534,7 @@ var
|
||||
ClientWidget: PGtkWidget;
|
||||
ClientWindow: PGdkWindow;
|
||||
begin
|
||||
ClientWidget:=GetFixedWidget(TheWidget);
|
||||
ClientWidget := GetFixedWidget(TheWidget);
|
||||
if ClientWidget <> TheWidget then
|
||||
begin
|
||||
ClientWindow := GetControlWindow(ClientWidget);
|
||||
|
@ -1022,69 +1022,93 @@ procedure TGtkWidgetSet.SetWidgetColor(const AWidget: PGtkWidget;
|
||||
const FGColor, BGColor: TColor; const Mask: TGtkStateEnum);
|
||||
var
|
||||
i: integer;
|
||||
xfg,xbg: TGDKColor;
|
||||
xfg, xbg: TGdkColor;
|
||||
ChangeFGColor: Boolean;
|
||||
ChangeBGColor: Boolean;
|
||||
{$IFDEF Gtk1}
|
||||
WindowStyle: PGtkStyle;
|
||||
WindowStyle, RCStyle: PGtkStyle;
|
||||
begin
|
||||
ChangeFGColor := (FGColor and SYS_COLOR_BASE = 0) and (FGColor<>clNone);
|
||||
ChangeBGColor := (BGColor and SYS_COLOR_BASE = 0) and (BGColor<>clNone);
|
||||
if (not ChangeFGColor) and (not ChangeBGColor) then exit;
|
||||
ChangeFGColor := (FGColor <> clNone);
|
||||
ChangeBGColor := (BGColor <> clNone);
|
||||
if (not ChangeFGColor) and (not ChangeBGColor) then Exit;
|
||||
|
||||
// the GTKAPIWidget is self drawn, so no use to change the widget style.
|
||||
if GtkWidgetIsA(AWidget,GTKAPIWidget_GetType) then exit;
|
||||
if GtkWidgetIsA(AWidget, GTKAPIWidget_GetType) then Exit;
|
||||
|
||||
{$IFDEF DisableWidgetColor}
|
||||
exit;
|
||||
{$ENDIF}
|
||||
|
||||
if (GTK_WIDGET_REALIZED(AWidget)) then begin
|
||||
WindowStyle := gtk_style_copy(gtk_widget_get_style (AWidget));
|
||||
end else begin
|
||||
WindowStyle := gtk_style_copy(gtk_rc_get_style (AWidget));
|
||||
end;
|
||||
if (Windowstyle = nil) then begin
|
||||
if (GTK_WIDGET_REALIZED(AWidget)) then
|
||||
WindowStyle := gtk_style_copy(gtk_widget_get_style(AWidget))
|
||||
else
|
||||
WindowStyle := gtk_style_copy(gtk_rc_get_style(AWidget));
|
||||
|
||||
if (Windowstyle = nil) then
|
||||
Windowstyle := gtk_style_new;
|
||||
end;
|
||||
|
||||
//DebugLn('TGtkWidgetSet.SetWidgetColor ',GetWidgetDebugReport(AWidget),' ',hexstr(FGColor,8),' ',hexstr(BGColor,8));
|
||||
//RaiseGDBException('');
|
||||
if ChangeFGColor then begin
|
||||
xfg:=AllocGDKColor(colorToRGB(FGColor));
|
||||
for i := GTK_STATE_NORMAL to GTK_STATE_INSENSITIVE do begin
|
||||
if i in mask then begin
|
||||
if GTK_STYLE_TEXT in mask then begin
|
||||
windowStyle^.text[i]:=xfg;
|
||||
end else begin
|
||||
windowStyle^.fg[i]:=xfg;
|
||||
end;
|
||||
if ChangeFGColor then
|
||||
begin
|
||||
xfg := AllocGDKColor(colorToRGB(FGColor));
|
||||
for i := GTK_STATE_NORMAL to GTK_STATE_INSENSITIVE do
|
||||
begin
|
||||
if i in mask then
|
||||
begin
|
||||
if GTK_STYLE_TEXT in mask then
|
||||
windowStyle^.text[i] := xfg
|
||||
else
|
||||
windowStyle^.fg[i] := xfg;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if ChangeBGColor then begin
|
||||
xbg:=AllocGDKColor(colorToRGB(BGColor));
|
||||
for i := GTK_STATE_NORMAL to GTK_STATE_INSENSITIVE do begin
|
||||
if i in mask then begin
|
||||
if GTK_STYLE_BASE in mask then begin
|
||||
windowStyle^.base[i]:=xbg;
|
||||
end else begin
|
||||
windowStyle^.bg[i]:=xbg;
|
||||
|
||||
if ChangeBGColor then
|
||||
begin
|
||||
if BGColor = clBackground then
|
||||
begin
|
||||
RCStyle := gtk_rc_get_style(AWidget);
|
||||
if RCStyle <> nil then
|
||||
for i := GTK_STATE_NORMAL to GTK_STATE_INSENSITIVE do
|
||||
begin
|
||||
if i in mask then
|
||||
begin
|
||||
if GTK_STYLE_BASE in mask then
|
||||
windowStyle^.base[i] := RCStyle^.base[i]
|
||||
else
|
||||
windowStyle^.bg[i] := RCStyle^.bg[i];
|
||||
end;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
xbg := AllocGDKColor(colorToRGB(BGColor));
|
||||
for i := GTK_STATE_NORMAL to GTK_STATE_INSENSITIVE do
|
||||
begin
|
||||
if i in mask then
|
||||
begin
|
||||
if GTK_STYLE_BASE in mask then
|
||||
windowStyle^.base[i] := xbg
|
||||
else
|
||||
windowStyle^.bg[i] := xbg;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
gtk_widget_set_style(aWidget,windowStyle);
|
||||
gtk_widget_set_style(aWidget, windowStyle);
|
||||
end;
|
||||
{$ELSE}
|
||||
NewColor: PGdkColor;
|
||||
begin
|
||||
ChangeFGColor := (FGColor<>clNone) and (BGColor<>clBtnFace);
|
||||
ChangeBGColor := (BGColor<>clNone) and (BGColor<>clBtnFace);
|
||||
if (not ChangeFGColor) and (not ChangeBGColor) then exit;
|
||||
ChangeFGColor := (FGColor <> clNone);
|
||||
ChangeBGColor := (BGColor <> clNone);
|
||||
|
||||
if (not ChangeFGColor) and (not ChangeBGColor) then Exit;
|
||||
|
||||
// the GTKAPIWidget is self drawn, so no use to change the widget style.
|
||||
if GtkWidgetIsA(AWidget,GTKAPIWidget_GetType) then exit;
|
||||
if GtkWidgetIsA(AWidget, GTKAPIWidget_GetType) then Exit;
|
||||
|
||||
{$IFDEF DisableWidgetColor}
|
||||
exit;
|
||||
@ -1100,23 +1124,30 @@ begin
|
||||
if i in mask then
|
||||
begin
|
||||
if GTK_STYLE_TEXT in mask then
|
||||
gtk_widget_modify_text(AWidget, i ,@xfg)
|
||||
gtk_widget_modify_text(AWidget, i, @xfg)
|
||||
else
|
||||
gtk_widget_modify_fg(AWidget, i ,@xfg);
|
||||
gtk_widget_modify_fg(AWidget, i, @xfg);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
if ChangeBGColor then
|
||||
begin
|
||||
xbg := AllocGDKColor(ColorToRGB(BGColor));
|
||||
if BGColor = clBackground then
|
||||
NewColor := nil
|
||||
else
|
||||
begin
|
||||
xbg := AllocGDKColor(ColorToRGB(BGColor));
|
||||
NewColor := @xbg;
|
||||
end;
|
||||
for i := GTK_STATE_NORMAL to GTK_STATE_INSENSITIVE do
|
||||
begin
|
||||
if i in mask then
|
||||
begin
|
||||
if GTK_STYLE_BASE in mask then
|
||||
gtk_widget_modify_base(AWidget, i ,@xbg)
|
||||
gtk_widget_modify_base(AWidget, i, NewColor)
|
||||
else
|
||||
gtk_widget_modify_bg(AWidget, i ,@xbg);
|
||||
gtk_widget_modify_bg(AWidget, i, NewColor);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
@ -1279,7 +1279,7 @@ begin
|
||||
AWidget := PGtkWidget(AWinControl.Handle);
|
||||
// don't change selected state
|
||||
GtkWidgetSet.SetWidgetColor(AWidget, clNone, AWinControl.Color,
|
||||
[GTK_STATE_NORMAL, GTK_STATE_ACTIVE, GTK_STATE_PRELIGHT, GTK_STYLE_BASE]);
|
||||
[GTK_STATE_NORMAL, GTK_STYLE_BASE]);
|
||||
end;
|
||||
|
||||
{ TGtkWSCustomStaticText }
|
||||
|
Loading…
Reference in New Issue
Block a user