gtk2: use better system color map from http://www.endolith.com/wordpress/2008/08/03/wine-colors/, fix some issues with menu styles in GetStyle()

git-svn-id: trunk@19658 -
This commit is contained in:
paul 2009-04-28 07:08:50 +00:00
parent 2fc528a84f
commit 8103033b44
4 changed files with 97 additions and 53 deletions

View File

@ -137,6 +137,7 @@ type
public
procedure InitStockItems; virtual;
procedure FreeStockItems; virtual;
procedure InitSystemColors;
procedure PassCmdLineOptions; override;
{$ifdef Unix}

View File

@ -7095,7 +7095,7 @@ end;
Reads the system colors.
------------------------------------------------------------------------------}
procedure UpdateSysColorMap(Widget: PGtkWidget);
procedure UpdateSysColorMap(Widget: PGtkWidget; Lgs: TLazGtkStyle);
{$IFDEF VerboseUpdateSysColorMap}
function GdkColorAsString(c: TgdkColor): string;
begin
@ -7111,18 +7111,23 @@ var
MainStyle: PGtkStyle;
begin
if Widget=nil then exit;
if not (Lgs in [lgsButton, lgsWindow, lgsMenuBar, lgsMenuitem,
lgsVerticalScrollbar, lgsHorizontalScrollbar, lgsTooltip]) then exit;
{$IFDEF NoStyle}
exit;
{$ENDIF}
//debugln('UpdateSysColorMap ',GetWidgetDebugReport(Widget));
gtk_widget_set_rc_style(Widget);
MainStyle:=gtk_widget_get_style(Widget);
if MainStyle=nil then exit;
with MainStyle^ do begin
MainStyle := gtk_widget_get_style(Widget);
if MainStyle = nil then exit;
with MainStyle^ do
begin
{$IFDEF VerboseUpdateSysColorMap}
if rc_style<>nil then begin
with rc_style^ do begin
if rc_style<>nil then
begin
with rc_style^ do
begin
DebugLn('rc_style:');
DebugLn(' FG GTK_STATE_NORMAL ',GdkColorAsString(fg[GTK_STATE_NORMAL]));
DebugLn(' FG GTK_STATE_ACTIVE ',GdkColorAsString(fg[GTK_STATE_ACTIVE]));
@ -7193,36 +7198,63 @@ begin
{$ENDIF}
{$IFNDEF DisableGtkSysColors}
SysColorMap[COLOR_SCROLLBAR] := TGDKColorToTColor(bg[GTK_STATE_ACTIVE]);
SysColorMap[COLOR_BACKGROUND] := TGDKColorToTColor(bg[GTK_STATE_PRELIGHT]);
SysColorMap[COLOR_MENU] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_WINDOW] := TGDKColorToTColor(white);
SysColorMap[COLOR_WINDOWFRAME] := TGDKColorToTColor(black);
SysColorMap[COLOR_MENUTEXT] := TGDKColorToTColor(text[GTK_STATE_NORMAL]);
SysColorMap[COLOR_WINDOWTEXT] := TGDKColorToTColor(text[GTK_STATE_NORMAL]);
SysColorMap[COLOR_ACTIVEBORDER] := TGDKColorToTColor(bg[GTK_STATE_ACTIVE]);
SysColorMap[COLOR_INACTIVEBORDER] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_APPWORKSPACE] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_HIGHLIGHT] := TGDKColorToTColor(bg[GTK_STATE_SELECTED]);
SysColorMap[COLOR_HIGHLIGHTTEXT] := TGDKColorToTColor(text[GTK_STATE_SELECTED]);
SysColorMap[COLOR_BTNFACE] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_BTNSHADOW] := TGDKColorToTColor(fg[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_GRAYTEXT] := TGDKColorToTColor(text[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_BTNTEXT] := TGDKColorToTColor(text[GTK_STATE_NORMAL]);
SysColorMap[COLOR_BTNHIGHLIGHT] := TGDKColorToTColor(fg[GTK_STATE_SELECTED]);
SysColorMap[COLOR_3DDKSHADOW] := TGDKColorToTColor(black);
SysColorMap[COLOR_3DLIGHT] := TGDKColorToTColor(fg[GTK_STATE_SELECTED]);
SysColorMap[COLOR_INFOTEXT] := TGDKColorToTColor(text[GTK_STATE_NORMAL]);
SysColorMap[COLOR_INFOBK] := TGDKColorToTColor(bg[GTK_STATE_PRELIGHT]);
SysColorMap[COLOR_HOTLIGHT] := TGDKColorToTColor(fg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_FORM] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
// colors which can be only retrieved from the window manager (metacity)
SysColorMap[COLOR_ACTIVECAPTION] := TGDKColorToTColor(bg[GTK_STATE_SELECTED]);
SysColorMap[COLOR_INACTIVECAPTION] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_GRADIENTACTIVECAPTION] := TGDKColorToTColor(bg[GTK_STATE_SELECTED]);
SysColorMap[COLOR_GRADIENTINACTIVECAPTION] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_CAPTIONTEXT] := TGDKColorToTColor(text[GTK_STATE_SELECTED]);
SysColorMap[COLOR_INACTIVECAPTIONTEXT] := TGDKColorToTColor(text[GTK_STATE_NORMAL]);
// this map is taken from this research:
// http://www.endolith.com/wordpress/2008/08/03/wine-colors/
case Lgs of
lgsButton:
begin
SysColorMap[COLOR_ACTIVEBORDER] := TGDKColorToTColor(bg[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_INACTIVEBORDER] := TGDKColorToTColor(bg[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_WINDOWFRAME] := TGDKColorToTColor(mid[GTK_STATE_SELECTED]);
SysColorMap[COLOR_BTNFACE] := TGDKColorToTColor(bg[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_BTNSHADOW] := TGDKColorToTColor(dark[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_BTNTEXT] := TGDKColorToTColor(fg[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_BTNHIGHLIGHT] := TGDKColorToTColor(light[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_3DDKSHADOW] := TGDKColorToTColor(black);
SysColorMap[COLOR_3DLIGHT] := TGDKColorToTColor(bg[GTK_STATE_INSENSITIVE]);
end;
lgsWindow:
begin
// colors which can be only retrieved from the window manager (metacity)
SysColorMap[COLOR_ACTIVECAPTION] := TGDKColorToTColor(dark[GTK_STATE_SELECTED]);
SysColorMap[COLOR_INACTIVECAPTION] := TGDKColorToTColor(dark[GTK_STATE_NORMAL]);
SysColorMap[COLOR_GRADIENTACTIVECAPTION] := TGDKColorToTColor(light[GTK_STATE_SELECTED]);
SysColorMap[COLOR_GRADIENTINACTIVECAPTION] := TGDKColorToTColor(base[GTK_STATE_NORMAL]);
SysColorMap[COLOR_CAPTIONTEXT] := TGDKColorToTColor(white);
SysColorMap[COLOR_INACTIVECAPTIONTEXT] := TGDKColorToTColor(white);
// others
SysColorMap[COLOR_APPWORKSPACE] := TGDKColorToTColor(base[GTK_STATE_NORMAL]);
SysColorMap[COLOR_GRAYTEXT] := TGDKColorToTColor(fg[GTK_STATE_INSENSITIVE]);
SysColorMap[COLOR_HIGHLIGHT] := TGDKColorToTColor(base[GTK_STATE_SELECTED]);
SysColorMap[COLOR_HIGHLIGHTTEXT] := TGDKColorToTColor(fg[GTK_STATE_SELECTED]);
SysColorMap[COLOR_WINDOW] := TGDKColorToTColor(base[GTK_STATE_NORMAL]);
SysColorMap[COLOR_WINDOWTEXT] := TGDKColorToTColor(text[GTK_STATE_NORMAL]);
SysColorMap[COLOR_HOTLIGHT] := TGDKColorToTColor(light[GTK_STATE_NORMAL]);
SysColorMap[COLOR_BACKGROUND] := TGDKColorToTColor(bg[GTK_STATE_PRELIGHT]);
SysColorMap[COLOR_FORM] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
end;
lgsMenuBar:
begin
SysColorMap[COLOR_MENUBAR] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
end;
lgsMenuitem:
begin
SysColorMap[COLOR_MENU] := TGDKColorToTColor(light[GTK_STATE_ACTIVE]);
SysColorMap[COLOR_MENUTEXT] := TGDKColorToTColor(fg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_MENUHILIGHT] := TGDKColorToTColor(bg[GTK_STATE_PRELIGHT]);
end;
lgsVerticalScrollbar,
lgsHorizontalScrollbar:
begin
SysColorMap[COLOR_SCROLLBAR] := TGDKColorToTColor(bg[GTK_STATE_ACTIVE]);
end;
lgsTooltip:
begin
SysColorMap[COLOR_INFOTEXT] := TGDKColorToTColor(fg[GTK_STATE_NORMAL]);
SysColorMap[COLOR_INFOBK] := TGDKColorToTColor(bg[GTK_STATE_NORMAL]);
end;
end;
{$ENDIF}
end;
end;
@ -7913,18 +7945,18 @@ begin
gtk_widget_show_all(StyleObject^.Widget);
if GtkWidgetIsA(StyleObject^.Widget,GTK_TYPE_MENU) then
begin
StyleWindowWidget:=GetStyleWidget(lgsWindow);
// add menu above the forms client area (fixed widget)
VBox:=PGTKWidget(
gtk_object_get_data(PGtkObject(StyleWindowWidget),'vbox'));
DebugLn(['GetStyleWithName adding menu to form']);
gtk_box_pack_start(PGTKBox(VBox), StyleObject^.Widget, false, True, 0);
// attach menu to window
gtk_menu_attach_to_widget(PGtkMenu(StyleObject^.Widget),
GetStyleWidget(lgsWindow), nil);
end
else
if GtkWidgetIsA(StyleObject^.Widget,GTK_TYPE_MENU_BAR) then
begin
DebugLn(['GetStyleWithName adding menubar to menu']);
gtk_menu_append(GetStyleWidget(lgsMenu),StyleObject^.Widget);
StyleWindowWidget:=GetStyleWidget(lgsWindow);
// add menu above the forms client area (fixed widget)
VBox:=PGTKWidget(
gtk_object_get_data(PGtkObject(StyleWindowWidget),'vbox'));
gtk_box_pack_start(PGTKBox(VBox), StyleObject^.Widget, False, False, 0);
end
else
if GtkWidgetIsA(StyleObject^.Widget,GTK_TYPE_MENU_ITEM) then
@ -7995,14 +8027,13 @@ begin
StyleObject^.Style := GTK_Style_Ref(StyleObject^.Style);
// if successful add to style objects list
if StyleObject^.Style <> nil then begin
if StyleObject^.Style <> nil then
begin
Styles.AddObject(WName, TObject(StyleObject));
if lgs<>lgsUserDefined then
StandardStyles[lgs]:=StyleObject;
Result:=StyleObject^.Style;
If (StyleObject^.Widget <> nil)
and (CompareText(WName,LazGtkStyleNames[lgsWindow])=0) then
UpdateSysColorMap(StyleObject^.Widget);
if lgs <> lgsUserDefined then
StandardStyles[lgs] := StyleObject;
Result := StyleObject^.Style;
UpdateSysColorMap(StyleObject^.Widget, lgs);
// ToDo: create all gc of the style
//gtk_widget_set_rc_style(StyleObject^.Widget);

View File

@ -379,7 +379,7 @@ procedure CopyGDIColor(var SourceGDIColor, DestGDIColor: TGDIColor);
function AllocGDKColor(const AColor: LongInt): TGDKColor;
function TGDKColorToTColor(const value: TGDKColor): TColor;
function TColortoTGDKColor(const value: TColor): TGDKColor;
procedure UpdateSysColorMap(Widget: PGtkWidget);
procedure UpdateSysColorMap(Widget: PGtkWidget; Lgs: TLazGtkStyle);
function IsBackgroundColor(Color: TColor): boolean;
procedure RealizeGDKColor(ColorMap: PGdkColormap; Color: PGDKColor);

View File

@ -248,6 +248,7 @@ begin
// Init stock objects;
InitStockItems;
InitSystemColors;
// clipboard
ClipboardTypeAtoms[ctPrimarySelection]:=GDK_SELECTION_PRIMARY;
@ -1278,6 +1279,17 @@ begin
DeleteAndNilObject(FStockSystemFont);
end;
procedure TGTKWidgetSet.InitSystemColors;
begin
// we need to request style and inside UpdateSysColorMap will be indirectly called
GetStyle(lgsButton);
GetStyle(lgsWindow);
GetStyle(lgsMenuBar);
GetStyle(lgsMenuitem);
GetStyle(lgsVerticalScrollbar);
GetStyle(lgsTooltip);
end;
{------------------------------------------------------------------------------
Method: TGtkWidgetSet.AppTerminate
Params: None