(* GTK-Kylix Library: GTKUtils - Various utilities Copyright (C) 2003 Tomas Bzatek This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. *) unit GTKUtils; interface uses lazglib2, lazgdk3, lazgtk3, SysUtils, GTKControls, GTKClasses; (********************************************************************************************************************************) (* function AllocateColor(Widget: PGtkWidget; R, G, B: Word): PGdkColor; overload; function AllocateColor(R, G, B: Word): TGDKColor; overload; *) function KeyValToUnicode(const Key: word): guint32; function UnicodeToKeyVal(const UnicodeVal: guint32): word; { function GetDefaultForegroundColor(State: TGtkStateFlags): PGdkRGBA; overload; function GetDefaultForegroundColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; overload; } function GetDefaultBackgroundColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; overload; { function GetDefaultBaseColor(State: TGtkStateFlags): PGdkRGBA; overload; function GetDefaultBaseColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; overload; } // Returns newly allocated PGdkRGBA function GetDefaultTextColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; { function GDKColorToPGdkRGBA(Color: TGDKColor): PGdkRGBA; function PGdkRGBAToGDKColor(Color: PGdkRGBA): TGDKColor;} function GDKRGBAToString(Color: PGdkRGBA): string; function StringToGDKRGBA(Str: string): PGdkRGBA; function ValidateColorString(const Color: string): boolean; function PangoFontDescToCSS(const PangoFontDesc: string): string; (********************************************************************************************************************************) implementation uses lazpango1; (********************************************************************************************************************************) (* function AllocateColor(Widget: PGtkWidget; R, G, B: Word): PGdkColor; begin New(Result); with Result^ do begin Pixel := 0; Red := R; Green := G; Blue := B; end; if Assigned(Widget) then gdk_colormap_alloc_color(gtk_widget_get_colormap(Widget), Result, True, False); end; function AllocateColor(R, G, B: Word): TGDKColor; begin Result.red := R; Result.green := G; Result.blue := B; end; *) (********************************************************************************************************************************) function KeyValToUnicode(const Key: word): guint32; begin Result := gdk_keyval_to_unicode(Key); end; (********************************************************************************************************************************) function UnicodeToKeyVal(const UnicodeVal: guint32): word; begin Result := gdk_unicode_to_keyval(UnicodeVal); end; (********************************************************************************************************************************) (* function GetDefaultForegroundColor(State: TGtkStateFlags): PGdkRGBA; var Widget: PGtkWidget; Style: PGtkStyle; begin Widget := gtk_window_new(GTK_WINDOW_TOPLEVEL); Style := gtk_rc_get_style(Widget); Result := @(Style^.fg[State]); gtk_widget_destroy(Widget); end; function GetDefaultForegroundColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; var Style: PGtkStyle; begin Style := gtk_rc_get_style(Widget.FWidget); Result := @(Style^.fg[State]); end; *) (********************************************************************************************************************************) function GetDefaultBackgroundColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; var StyleContext: PGtkStyleContext; Value: PGdkRGBA; begin Value := nil; StyleContext := gtk_widget_get_style_context(Widget.FWidget); gtk_style_context_get(StyleContext, State, [GTK_STYLE_PROPERTY_BACKGROUND_COLOR, @Value, nil]); Result := Value; end; (********************************************************************************************************************************) (* function GetDefaultBaseColor(State: TGtkStateFlags): PGdkRGBA; var Widget: PGtkWidget; Style: PGtkStyle; begin Widget := gtk_window_new(GTK_WINDOW_TOPLEVEL); Style := gtk_rc_get_style(Widget); Result := @(Style^.base[State]); gtk_widget_destroy(Widget); end; function GetDefaultBaseColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; var Style: PGtkStyle; begin Style := gtk_rc_get_style(Widget.FWidget); Result := @(Style^.base[State]); end; *) (********************************************************************************************************************************) function GetDefaultTextColor(Widget: TGTKControl; State: TGtkStateFlags): PGdkRGBA; var StyleContext: PGtkStyleContext; Value: PGdkRGBA; begin Value := nil; StyleContext := gtk_widget_get_style_context(Widget.FWidget); gtk_style_context_get(StyleContext, State, [GTK_STYLE_PROPERTY_COLOR, @Value, nil]); Result := Value; end; (********************************************************************************************************************************) (* function GDKColorToPGdkRGBA(Color: TGDKColor): PGdkRGBA; begin New(Result); Result^.pixel := Color.pixel; Result^.red := Color.red; Result^.green := Color.green; Result^.blue := Color.blue; end; *) (********************************************************************************************************************************) (* function PGdkRGBAToGDKColor(Color: PGdkRGBA): TGDKColor; function PGdkColorToGDKColor(Color: PGdkColor): TGDKColor; begin Result.pixel := Color^.pixel; Result.red := Color^.red; Result.green := Color^.green; Result.blue := Color^.blue; end; *) (********************************************************************************************************************************) (* function GDKColorToString(Color: TGDKColor): string; begin Result := Format('#%.2x%.2x%.2xFF', [Color.red div 256, Color.green div 256, Color.blue div 256]); end; *) (********************************************************************************************************************************) (* function StringToGDKColor(Str: string; var Color: TGDKColor): boolean; var AColor: PGdkColor; begin Result := False; Str := ANSIUpperCase(Trim(Str)); if (Length(Str) < 7) or (Str[1] <> '#') then Exit; try New(AColor); if Length(Str) = 9 then Delete(Str, 8, 2); Result := boolean(gdk_color_parse(PChar(Str), AColor)); Color := PGdkColorToGDKColor(AColor); Dispose(AColor); except end; end; *) (********************************************************************************************************************************) function GDKRGBAToString(Color: PGdkRGBA): string; begin Result := ''; if Assigned(Color) then Result := String(gdk_rgba_to_string(Color)); end; function StringToGDKRGBA(Str: string): PGdkRGBA; var Value: TGdkRGBA; begin if Length(Str) < 1 then begin Result := nil; Exit; end; Initialize(Value); if gdk_rgba_parse(@Value, PChar(Str)) then Result := gdk_rgba_copy(@Value) else begin g_log(PChar('tuxcmd'), [G_LOG_LEVEL_WARNING], 'Failed to parse color string "%s"', [PChar(Str)]); Result := nil; end; end; function ValidateColorString(const Color: string): boolean; var rgba: TGdkRGBA; begin Result := gdk_rgba_parse(@rgba, PChar(Color)); end; (********************************************************************************************************************************) function PangoFontDescToCSS(const PangoFontDesc: string): string; var font_desc: PPangoFontDescription; s: string; val: Pgchar; size: gint; begin s := ''; font_desc := pango_font_description_from_string(PChar(PangoFontDesc)); if not Assigned(font_desc) then begin Result := ''; Exit; end; val := pango_font_description_get_family(font_desc); if Assigned(val) then s := s + 'font-family: ' + string(val) + '; '; size := pango_font_description_get_size(font_desc); if size > 0 then begin if pango_font_description_get_size_is_absolute(font_desc) then s := s + 'font-size: ' + IntToStr(size) + 'px; ' else s := s + 'font-size: ' + IntToStr(Trunc(pango_units_to_double(size))) + 'pt; '; end; case pango_font_description_get_style(font_desc) of PANGO_STYLE_NORMAL: ; PANGO_STYLE_OBLIQUE: s := s + 'font-style: oblique; '; PANGO_STYLE_ITALIC: s := s + 'font-style: italic; '; end; pango_font_description_free(font_desc); Result := s; end; end.