This is very nearly ready, but it still has two bugs I don't know how to fix - hopefully though it will provide enough of a basis that somebody can help me finish it off.
Bugs: 1) Tedit doesn't display unless the font is EXPLICITELY set (e.g. my current catch code doesn't seem to work for it) 2) TLable sets the font at designtime but not at runtime -- A.J. Venter Chief Software Architect OpenLab International www.getopenlab.com www.silentcoder.co.za +27 82 726 5103
Index: components/fpcunit/Makefile.fpc =================================================================== --- components/fpcunit/Makefile.fpc (revision 8836) +++ components/fpcunit/Makefile.fpc (working copy) @@ -7,7 +7,7 @@ [compiler] unittargetdir=lib/$(CPU_TARGET)-$(OS_TARGET) unitdir=../../lcl/units/$(CPU_TARGET)-$(OS_TARGET)/ ../../lcl/units/$(CPU_TARGET)-$(OS_TARGET)/$(LCL_PLATFORM)/ ../../packager/units/$(CPU_TARGET)-$(OS_TARGET)/ -options=-dLCL -dLCLgtk -S2 -gl +options=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl [target] units=fpcunittestrunner.pas @@ -18,6 +18,16 @@ $(wildcard $(COMPILER_UNITTARGETDIR)/*$(RSTEXT)) \ $(wildcard $(COMPILER_UNITTARGETDIR)/*.compiled) \ $(wildcard *$(OEXT)) $(wildcard *$(PPUEXT)) $(wildcard *$(RSTEXT)) +[prerules] +# LCL Platform +ifndef LCL_PLATFORM +ifeq ($(OS_TARGET),win32) +LCL_PLATFORM=win32 +else +LCL_PLATFORM=gtk +endif +endif +export LCL_PLATFORM [rules] .PHONY: cleartarget all Index: components/fpcunit/Makefile =================================================================== --- components/fpcunit/Makefile (revision 8836) +++ components/fpcunit/Makefile (working copy) @@ -1,5 +1,5 @@ # -# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/01/19] +# Don't edit, this file is generated by FPCMake Version 2.0.0 [2005/12/07] # default: all MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-emx i386-watcom i386-netwlibc i386-wince m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-solaris x86_64-linux x86_64-freebsd x86_64-win64 arm-linux arm-wince powerpc64-linux @@ -231,6 +231,14 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra) override PACKAGE_NAME=fpcunittestrunner override PACKAGE_VERSION=0.1 +ifndef LCL_PLATFORM +ifeq ($(OS_TARGET),win32) +LCL_PLATFORM=win32 +else +LCL_PLATFORM=gtk +endif +endif +export LCL_PLATFORM ifeq ($(FULL_TARGET),i386-linux) override TARGET_UNITS+=fpcunittestrunner.pas endif @@ -454,115 +462,115 @@ override CLEAN_FILES+=$(wildcard $(COMPILER_UNITTARGETDIR)/*$(OEXT)) $(wildcard $(COMPILER_UNITTARGETDIR)/*$(PPUEXT)) $(wildcard $(COMPILER_UNITTARGETDIR)/*$(RSTEXT)) $(wildcard $(COMPILER_UNITTARGETDIR)/*.compiled) $(wildcard *$(OEXT)) $(wildcard *$(PPUEXT)) $(wildcard *$(RSTEXT)) endif ifeq ($(FULL_TARGET),i386-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-go32v2) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-win32) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-os2) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-freebsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-beos) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-netbsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-solaris) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-qnx) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-netware) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-openbsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-wdosx) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-emx) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-watcom) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-netwlibc) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-wince) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-freebsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-netbsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-amiga) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-atari) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-openbsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),m68k-palmos) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),powerpc-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),powerpc-netbsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),powerpc-macos) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),powerpc-darwin) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),powerpc-morphos) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),sparc-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),sparc-netbsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),sparc-solaris) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),x86_64-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),x86_64-freebsd) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),x86_64-win64) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),arm-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),arm-wince) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),powerpc64-linux) -override COMPILER_OPTIONS+=-dLCL -dLCLgtk -S2 -gl +override COMPILER_OPTIONS+=-dLCL -dLCL$(LCL_PLATFORM) -S2 -gl endif ifeq ($(FULL_TARGET),i386-linux) override COMPILER_UNITDIR+=../../lcl/units/$(CPU_TARGET)-$(OS_TARGET)/ ../../lcl/units/$(CPU_TARGET)-$(OS_TARGET)/$(LCL_PLATFORM)/ ../../packager/units/$(CPU_TARGET)-$(OS_TARGET)/ @@ -969,9 +977,6 @@ ifndef INSTALL_DATADIR INSTALL_DATADIR=$(INSTALL_BASEDIR) endif -ifndef INSTALL_SHAREDDIR -INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib -endif ifdef CROSSCOMPILE ifndef CROSSBINDIR CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX)) @@ -992,7 +997,6 @@ SMARTEXT=.sl STATICLIBEXT=.a SHAREDLIBEXT=.so -SHAREDLIBPREFIX=libfp STATICLIBPREFIX=libp RSTEXT=.rst ifeq ($(findstring 1.0.,$(FPC_VERSION)),) @@ -1763,14 +1767,6 @@ override FPCOPTDEF+=HASUNIX endif endif -ifdef CREATESHARED -override FPCOPT+=-Cg -ifeq ($(CPU_TARGET),i386) -override FPCOPT+=-Aas -endif -endif -ifdef LINKSHARED -endif ifdef OPT override FPCOPT+=$(OPT) endif @@ -1785,14 +1781,6 @@ override FPCOPT:=!FPCEXTCMD export FPCEXTCMD endif -override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET) -override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE) -ifneq ($(AFULL_TARGET),$(AFULL_SOURCE)) -override ACROSSCOMPILE=1 -endif -ifdef ACROSSCOMPILE -override FPCOPT+=$(CROSSOPT) -endif override COMPILER:=$(FPC) $(FPCOPT) ifeq (,$(findstring -s ,$(COMPILER))) EXECPPAS= @@ -1814,7 +1802,7 @@ override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS)) override CLEANRSTFILES+=$(RSTFILES) endif -.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared +.PHONY: fpc_all fpc_smart fpc_debug fpc_release $(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET) @$(ECHOREDIR) Compiled > $(FPCMADE) fpc_all: $(FPCMADE) @@ -1855,38 +1843,6 @@ vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) vpath %$(OEXT) $(COMPILER_UNITTARGETDIR) vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR) -.PHONY: fpc_shared -override INSTALLTARGET+=fpc_shared_install -ifndef SHARED_LIBVERSION -SHARED_LIBVERSION=$(FPC_VERSION) -endif -ifndef SHARED_LIBNAME -SHARED_LIBNAME=$(PACKAGE_NAME) -endif -ifndef SHARED_FULLNAME -SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT) -endif -ifndef SHARED_LIBUNITS -SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS) -override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS)) -endif -fpc_shared: -ifdef HASSHAREDLIB - $(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1 -ifneq ($(SHARED_BUILD),n) - $(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR) -endif -else - @$(ECHO) Shared Libraries not supported -endif -fpc_shared_install: -ifneq ($(SHARED_BUILD),n) -ifneq ($(SHARED_LIBUNITS),) -ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),) - $(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR) -endif -endif -endif .PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall ifdef INSTALL_UNITS override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS)) @@ -2217,7 +2173,7 @@ release: fpc_release units: fpc_units examples: -shared: fpc_shared +shared: install: fpc_install sourceinstall: fpc_sourceinstall exampleinstall: fpc_exampleinstall Index: ide/revision.inc =================================================================== --- ide/revision.inc (revision 8836) +++ ide/revision.inc (working copy) @@ -1,2 +1,2 @@ // Created by Svn2RevisionInc -const RevisionStr = '8642M'; +const RevisionStr = '8836:8838M'; Index: lcl/interfaces/gtk2/gtk2int.pas =================================================================== --- lcl/interfaces/gtk2/gtk2int.pas (revision 8836) +++ lcl/interfaces/gtk2/gtk2int.pas (working copy) @@ -54,6 +54,7 @@ TGtk2WidgetSet = class(TGtkWidgetSet) protected + procedure SetWidgetFont(const AWidget: PGTKWidget; const Afont: tFont); procedure AppendText(Sender: TObject; Str: PChar); function CreateComponent(Sender : TObject): THandle; override; function GetText(Sender: TComponent; var Text: String): Boolean; @@ -120,6 +121,8 @@ property Sorted : boolean read FSorted write SetSorted; property Owner: TWinControl read FOwner; end; + +Type PGTK2Widget = ^TGTK2WidgetSet; {$IfDef GTK2_2} procedure gdk_display_get_pointer(display : PGdkDisplay; screen :PGdkScreen; x :Pgint; y : Pgint; mask : PGdkModifierType); cdecl; external gdklib; Index: lcl/interfaces/gtk2/gtk2object.inc =================================================================== --- lcl/interfaces/gtk2/gtk2object.inc (revision 8836) +++ lcl/interfaces/gtk2/gtk2object.inc (working copy) @@ -959,6 +959,63 @@ Applies a Message to the sender ------------------------------------------------------------------------------} + +Procedure TGTK2WidgetSet.SetWidgetFont(const AWidget: PGTKWidget; const Afont: tFont); +Var + PangoDescStr,DescOpts : String; + NewFontDescription : PPangoFontDescription; + Size : Integer; + Name : String; +Begin +{$IFDEF GTK2} + If Afont.IsDefault then Exit; + + If AFont.Size = 0 then + Size := 10 + else + Size := AFont.Size; + + if (length(AFont.Name) = 0) or + (upperCase(AFont.Name) = 'DEFAULT') then + Name := 'Sans' + else + Name := AFont.Name; + DebugLn('Setting font name: '+Name); + PangoDescStr := Name; + DescOpts := ''; + If FSBold in AFont.Style then + DescOpts := DescOpts + ' bold'; + If FSItalic in AFont.Style then + DescOpts := DescOpts + ' italic'; + If FSUnderline in AFont.Style then + DescOpts := DescOpts + ' underline'; + If FSStrikeOut in AFont.Style then + DescOpts := DescOpts + ' strikethrough'; + + PangoDescStr := PangoDescStr+DescOpts+' '+intToStr(Size); +//Pango does not appear to have a way to set the character set in the +//font description but seems to default to UTF-8 this probably +//requires some or other todo item. +try + NewFontDescription := PPangoFontDescription(PangoDescStr); + NewFontDescription :=pango_font_description_from_string(PChar(PangoDescStr)); + gtk_widget_modify_font(AWidget,NewFontDescription); + pango_font_description_free(NewFontDescription); +except + debugln('COULD NOT SET FONT'); +end; +{$ENDIF} +end; +{------------------------------------------------------------------------------ +Procedure: TGtk2Widget.SetWidgetFont + Params: AWidget - The widget to set the font for + AFont - The font to set + + Sets the widget font +Contributed by: A.J. Venter ([EMAIL PROTECTED]) +------------------------------------------------------------------------------} + + procedure TGTK2WidgetSet.SetCallback(const AMsg: LongInt; const AGTKObject: PGTKObject; const ALCLObject: TObject); procedure ConnectSenderSignal(const AnObject:PGTKObject; const ASignal: PChar; Index: lcl/interfaces/gtk2/gtk2wsbuttons.pp =================================================================== --- lcl/interfaces/gtk2/gtk2wsbuttons.pp (revision 8836) +++ lcl/interfaces/gtk2/gtk2wsbuttons.pp (working copy) @@ -44,6 +44,8 @@ TGtk2WSButton = class(TWSButton) private protected + class procedure SetFont(const AWinControl: TWinControl; const AFont : tFont); override; + public end; @@ -52,6 +54,8 @@ TGtk2WSBitBtn = class(TWSBitBtn) private protected + class procedure SetFont(const AWinControl: TWinControl; const AFont : tFont); override; + public end; @@ -66,6 +70,37 @@ implementation +procedure TGtkWSButton.SetFont(const AWinControl: TWinControl; const AFont : TFont); +var + Widget: PGTKWidget; + LblWidget: PGtkWidget; +begin + Widget:= PGtkWidget(AWinControl.Handle); + {$IFDEF GTK2} + LblWidget := (PGtkBin(Widget)^.Child); + if LblWidget<>nil then + Gtk2WidgetSet.SetWidgetFont(LblWidget, AFont); +end; + +procedure TGtkWSBitBtn.SetFont(const AWinControl: TWinControl; + const AFont: TFont); + var + WidgetInfo: PWidgetInfo; + BitBtnInfo: PBitBtnWidgetInfo; + Widget: PGTKWidget; +begin + if not AWinControl.HandleAllocated then exit; + if AFont.IsDefault then exit; + Widget:= PGtkWidget(AWinControl.Handle); + WidgetInfo := GetWidgetInfo(Widget); + BitBtnInfo := WidgetInfo^.UserData; + if (BitBtnInfo=nil) or (BitBtnInfo^.LabelWidget = nil) then Exit; + Gtk2WidgetSet.SetWidgetFont(AWinControl,AFont); +end; + + + + initialization ////////////////////////////////////////////////////