summaryrefslogtreecommitdiff
path: root/gfx/x11
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graemeg@users.sourceforge.net>2006-11-18 18:11:20 +0000
committerGraeme Geldenhuys <graemeg@users.sourceforge.net>2006-11-18 18:11:20 +0000
commit8fe7ea95a343a35dc286bd9a13d257d285e9c4e1 (patch)
treeea9f9317f46f4c320a2667e0e0d4362c4f0980a3 /gfx/x11
parent546dce65494ea4e5f654e2840cc67307101e06f7 (diff)
downloadfpGUI-8fe7ea95a343a35dc286bd9a13d257d285e9c4e1.tar.xz
Initial checkin. Merged fpGUI, fpGFX and fpIMG from the OpenSoft sever.
Diffstat (limited to 'gfx/x11')
-rw-r--r--gfx/x11/Makefile1985
-rw-r--r--gfx/x11/Makefile.fpc27
-rw-r--r--gfx/x11/fpgfxpackage.lpk72
-rw-r--r--gfx/x11/fpgfxpackage.pas14
-rw-r--r--gfx/x11/gfx_x11.pas1865
-rw-r--r--gfx/x11/gfxinterface.pas41
-rw-r--r--gfx/x11/unitxft.pas155
7 files changed, 4159 insertions, 0 deletions
diff --git a/gfx/x11/Makefile b/gfx/x11/Makefile
new file mode 100644
index 00000000..a4d1387d
--- /dev/null
+++ b/gfx/x11/Makefile
@@ -0,0 +1,1985 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/08/28]
+#
+default: all
+MAKEFILETARGETS=i386-linux
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=/opt/fpc/src
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=fpgfx
+override PACKAGE_VERSION=0.2
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=gfx_x11 gfximpl
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_UNITDIR+=.. ../emulayer
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_UNITTARGETDIR+=../units
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+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))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifeq ($(OS_SOURCE),linux)
+ifndef GCCLIBDIR
+ifeq ($(CPU_TARGET),i386)
+ifneq ($(findstring x86_64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc64)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifndef GCCLIBDIR
+CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(CROSSGCC),)
+GCCLIBDIR:=$(shell dirname `$(CROSSGCC) -print-libgcc-file-name`)
+endif
+endif
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifdef inUnix
+ifeq ($(OS_SOURCE),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl fcl
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_NETDB=1
+REQUIRE_PACKAGES_LIBASYNC=1
+REQUIRE_PACKAGES_PTHREADS=1
+REQUIRE_PACKAGES_FCL=1
+REQUIRE_PACKAGES_PASJPEG=1
+REQUIRE_PACKAGES_IBASE=1
+REQUIRE_PACKAGES_POSTGRES=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_ODBC=1
+REQUIRE_PACKAGES_ORACLE=1
+REQUIRE_PACKAGES_SQLITE=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_HASH
+PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_HASH),)
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
+UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
+else
+UNITDIR_HASH=$(PACKAGEDIR_HASH)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_HASH)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_HASH=
+UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_HASH),)
+UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
+else
+UNITDIR_HASH=
+endif
+endif
+ifdef UNITDIR_HASH
+override COMPILER_UNITDIR+=$(UNITDIR_HASH)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PASZLIB
+PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASZLIB),)
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
+else
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PASZLIB=
+UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASZLIB),)
+UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
+else
+UNITDIR_PASZLIB=
+endif
+endif
+ifdef UNITDIR_PASZLIB
+override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
+endif
+endif
+ifdef REQUIRE_PACKAGES_NETDB
+PACKAGEDIR_NETDB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /netdb/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_NETDB),)
+ifneq ($(wildcard $(PACKAGEDIR_NETDB)/units/$(TARGETSUFFIX)),)
+UNITDIR_NETDB=$(PACKAGEDIR_NETDB)/units/$(TARGETSUFFIX)
+else
+UNITDIR_NETDB=$(PACKAGEDIR_NETDB)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_NETDB)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_NETDB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_NETDB)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_NETDB=
+UNITDIR_NETDB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /netdb/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_NETDB),)
+UNITDIR_NETDB:=$(firstword $(UNITDIR_NETDB))
+else
+UNITDIR_NETDB=
+endif
+endif
+ifdef UNITDIR_NETDB
+override COMPILER_UNITDIR+=$(UNITDIR_NETDB)
+endif
+endif
+ifdef REQUIRE_PACKAGES_LIBASYNC
+PACKAGEDIR_LIBASYNC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /libasync/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_LIBASYNC),)
+ifneq ($(wildcard $(PACKAGEDIR_LIBASYNC)/units/$(TARGETSUFFIX)),)
+UNITDIR_LIBASYNC=$(PACKAGEDIR_LIBASYNC)/units/$(TARGETSUFFIX)
+else
+UNITDIR_LIBASYNC=$(PACKAGEDIR_LIBASYNC)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_LIBASYNC)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_LIBASYNC) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_LIBASYNC)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_LIBASYNC=
+UNITDIR_LIBASYNC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /libasync/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_LIBASYNC),)
+UNITDIR_LIBASYNC:=$(firstword $(UNITDIR_LIBASYNC))
+else
+UNITDIR_LIBASYNC=
+endif
+endif
+ifdef UNITDIR_LIBASYNC
+override COMPILER_UNITDIR+=$(UNITDIR_LIBASYNC)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PTHREADS
+PACKAGEDIR_PTHREADS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /pthreads/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PTHREADS),)
+ifneq ($(wildcard $(PACKAGEDIR_PTHREADS)/units/$(TARGETSUFFIX)),)
+UNITDIR_PTHREADS=$(PACKAGEDIR_PTHREADS)/units/$(TARGETSUFFIX)
+else
+UNITDIR_PTHREADS=$(PACKAGEDIR_PTHREADS)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PTHREADS)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_PTHREADS) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PTHREADS)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PTHREADS=
+UNITDIR_PTHREADS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /pthreads/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PTHREADS),)
+UNITDIR_PTHREADS:=$(firstword $(UNITDIR_PTHREADS))
+else
+UNITDIR_PTHREADS=
+endif
+endif
+ifdef UNITDIR_PTHREADS
+override COMPILER_UNITDIR+=$(UNITDIR_PTHREADS)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL
+PACKAGEDIR_FCL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL=$(PACKAGEDIR_FCL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL=$(PACKAGEDIR_FCL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_FCL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL=
+UNITDIR_FCL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL),)
+UNITDIR_FCL:=$(firstword $(UNITDIR_FCL))
+else
+UNITDIR_FCL=
+endif
+endif
+ifdef UNITDIR_FCL
+override COMPILER_UNITDIR+=$(UNITDIR_FCL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PASJPEG
+PACKAGEDIR_PASJPEG:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /pasjpeg/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASJPEG),)
+ifneq ($(wildcard $(PACKAGEDIR_PASJPEG)/units/$(TARGETSUFFIX)),)
+UNITDIR_PASJPEG=$(PACKAGEDIR_PASJPEG)/units/$(TARGETSUFFIX)
+else
+UNITDIR_PASJPEG=$(PACKAGEDIR_PASJPEG)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PASJPEG)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_PASJPEG) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASJPEG)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PASJPEG=
+UNITDIR_PASJPEG:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /pasjpeg/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASJPEG),)
+UNITDIR_PASJPEG:=$(firstword $(UNITDIR_PASJPEG))
+else
+UNITDIR_PASJPEG=
+endif
+endif
+ifdef UNITDIR_PASJPEG
+override COMPILER_UNITDIR+=$(UNITDIR_PASJPEG)
+endif
+endif
+ifdef REQUIRE_PACKAGES_IBASE
+PACKAGEDIR_IBASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /ibase/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_IBASE),)
+ifneq ($(wildcard $(PACKAGEDIR_IBASE)/units/$(TARGETSUFFIX)),)
+UNITDIR_IBASE=$(PACKAGEDIR_IBASE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_IBASE=$(PACKAGEDIR_IBASE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_IBASE)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_IBASE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_IBASE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_IBASE=
+UNITDIR_IBASE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /ibase/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_IBASE),)
+UNITDIR_IBASE:=$(firstword $(UNITDIR_IBASE))
+else
+UNITDIR_IBASE=
+endif
+endif
+ifdef UNITDIR_IBASE
+override COMPILER_UNITDIR+=$(UNITDIR_IBASE)
+endif
+endif
+ifdef REQUIRE_PACKAGES_POSTGRES
+PACKAGEDIR_POSTGRES:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /postgres/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_POSTGRES),)
+ifneq ($(wildcard $(PACKAGEDIR_POSTGRES)/units/$(TARGETSUFFIX)),)
+UNITDIR_POSTGRES=$(PACKAGEDIR_POSTGRES)/units/$(TARGETSUFFIX)
+else
+UNITDIR_POSTGRES=$(PACKAGEDIR_POSTGRES)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_POSTGRES)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_POSTGRES) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_POSTGRES)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_POSTGRES=
+UNITDIR_POSTGRES:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /postgres/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_POSTGRES),)
+UNITDIR_POSTGRES:=$(firstword $(UNITDIR_POSTGRES))
+else
+UNITDIR_POSTGRES=
+endif
+endif
+ifdef UNITDIR_POSTGRES
+override COMPILER_UNITDIR+=$(UNITDIR_POSTGRES)
+endif
+endif
+ifdef REQUIRE_PACKAGES_MYSQL
+PACKAGEDIR_MYSQL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /mysql/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_MYSQL),)
+ifneq ($(wildcard $(PACKAGEDIR_MYSQL)/units/$(TARGETSUFFIX)),)
+UNITDIR_MYSQL=$(PACKAGEDIR_MYSQL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_MYSQL=$(PACKAGEDIR_MYSQL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_MYSQL)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_MYSQL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_MYSQL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_MYSQL=
+UNITDIR_MYSQL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /mysql/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_MYSQL),)
+UNITDIR_MYSQL:=$(firstword $(UNITDIR_MYSQL))
+else
+UNITDIR_MYSQL=
+endif
+endif
+ifdef UNITDIR_MYSQL
+override COMPILER_UNITDIR+=$(UNITDIR_MYSQL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_ODBC
+PACKAGEDIR_ODBC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /odbc/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_ODBC),)
+ifneq ($(wildcard $(PACKAGEDIR_ODBC)/units/$(TARGETSUFFIX)),)
+UNITDIR_ODBC=$(PACKAGEDIR_ODBC)/units/$(TARGETSUFFIX)
+else
+UNITDIR_ODBC=$(PACKAGEDIR_ODBC)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_ODBC)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_ODBC) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_ODBC)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_ODBC=
+UNITDIR_ODBC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /odbc/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_ODBC),)
+UNITDIR_ODBC:=$(firstword $(UNITDIR_ODBC))
+else
+UNITDIR_ODBC=
+endif
+endif
+ifdef UNITDIR_ODBC
+override COMPILER_UNITDIR+=$(UNITDIR_ODBC)
+endif
+endif
+ifdef REQUIRE_PACKAGES_ORACLE
+PACKAGEDIR_ORACLE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /oracle/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_ORACLE),)
+ifneq ($(wildcard $(PACKAGEDIR_ORACLE)/units/$(TARGETSUFFIX)),)
+UNITDIR_ORACLE=$(PACKAGEDIR_ORACLE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_ORACLE=$(PACKAGEDIR_ORACLE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_ORACLE)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_ORACLE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_ORACLE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_ORACLE=
+UNITDIR_ORACLE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /oracle/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_ORACLE),)
+UNITDIR_ORACLE:=$(firstword $(UNITDIR_ORACLE))
+else
+UNITDIR_ORACLE=
+endif
+endif
+ifdef UNITDIR_ORACLE
+override COMPILER_UNITDIR+=$(UNITDIR_ORACLE)
+endif
+endif
+ifdef REQUIRE_PACKAGES_SQLITE
+PACKAGEDIR_SQLITE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_SQLITE),)
+ifneq ($(wildcard $(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)),)
+UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_SQLITE)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_SQLITE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_SQLITE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_SQLITE=
+UNITDIR_SQLITE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_SQLITE),)
+UNITDIR_SQLITE:=$(firstword $(UNITDIR_SQLITE))
+else
+UNITDIR_SQLITE=
+endif
+endif
+ifdef UNITDIR_SQLITE
+override COMPILER_UNITDIR+=$(UNITDIR_SQLITE)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) -Xc
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O1r
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+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=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+ @$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+ $(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+ $(MAKE) all DEBUG=1
+fpc_release:
+ $(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+ $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+ $(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(PPUEXT): %.pas
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.pp
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.pas
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.lpr
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.dpr
+ $(COMPILER) $<
+ $(EXECPPAS)
+%.res: %.rc
+ windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+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))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+ $(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+ -$(UPXPROG) $(INSTALLEXEFILES)
+endif
+ $(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+ $(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+ $(MKDIR) $(INSTALL_UNITDIR)
+ $(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+ $(MKDIR) $(INSTALL_UNITDIR)
+ $(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+ $(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+ $(MKDIR) $(INSTALL_LIBDIR)
+ $(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+ ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+ $(MKDIR) $(INSTALL_DATADIR)
+ $(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+ $(MKDIR) $(INSTALL_SOURCEDIR)
+ $(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+ $(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+ $(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+ $(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+ $(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+ $(MKDIR) $(DIST_DESTDIR)
+ $(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+ $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+ $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+ $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+ echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+ echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+ echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+ /bin/sh $(ZIPWRAPPER)
+else
+ $(ZIPWRAPPER)
+endif
+ $(DEL) $(ZIPWRAPPER)
+else
+ $(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+ $(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+ $(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+ $(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+ $(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+ -$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+ -$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+ -$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+ -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+ -$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+ -$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+ -$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+ -$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+ -$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+ -$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+ -$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+ -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+ -$(DELTREE) units
+ -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+ -$(DEL) *.o *.ppu *.a
+endif
+ -$(DELTREE) *$(SMARTEXT)
+ -$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+ -$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+ -$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+ -$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+ @$(ECHO)
+ @$(ECHO) == Package info ==
+ @$(ECHO) Package Name..... $(PACKAGE_NAME)
+ @$(ECHO) Package Version.. $(PACKAGE_VERSION)
+ @$(ECHO)
+ @$(ECHO) == Configuration info ==
+ @$(ECHO)
+ @$(ECHO) FPC.......... $(FPC)
+ @$(ECHO) FPC Version.. $(FPC_VERSION)
+ @$(ECHO) Source CPU... $(CPU_SOURCE)
+ @$(ECHO) Target CPU... $(CPU_TARGET)
+ @$(ECHO) Source OS.... $(OS_SOURCE)
+ @$(ECHO) Target OS.... $(OS_TARGET)
+ @$(ECHO) Full Source.. $(FULL_SOURCE)
+ @$(ECHO) Full Target.. $(FULL_TARGET)
+ @$(ECHO) SourceSuffix. $(SOURCESUFFIX)
+ @$(ECHO) TargetSuffix. $(TARGETSUFFIX)
+ @$(ECHO)
+ @$(ECHO) == Directory info ==
+ @$(ECHO)
+ @$(ECHO) Required pkgs... $(REQUIRE_PACKAGES)
+ @$(ECHO)
+ @$(ECHO) Basedir......... $(BASEDIR)
+ @$(ECHO) FPCDir.......... $(FPCDIR)
+ @$(ECHO) CrossBinDir..... $(CROSSBINDIR)
+ @$(ECHO) UnitsDir........ $(UNITSDIR)
+ @$(ECHO) PackagesDir..... $(PACKAGESDIR)
+ @$(ECHO)
+ @$(ECHO) GCC library..... $(GCCLIBDIR)
+ @$(ECHO) Other library... $(OTHERLIBDIR)
+ @$(ECHO)
+ @$(ECHO) == Tools info ==
+ @$(ECHO)
+ @$(ECHO) As........ $(AS)
+ @$(ECHO) Ld........ $(LD)
+ @$(ECHO) Ar........ $(AR)
+ @$(ECHO) Rc........ $(RC)
+ @$(ECHO)
+ @$(ECHO) Mv........ $(MVPROG)
+ @$(ECHO) Cp........ $(CPPROG)
+ @$(ECHO) Rm........ $(RMPROG)
+ @$(ECHO) GInstall.. $(GINSTALL)
+ @$(ECHO) Echo...... $(ECHO)
+ @$(ECHO) Shell..... $(SHELL)
+ @$(ECHO) Date...... $(DATE)
+ @$(ECHO) FPCMake... $(FPCMAKE)
+ @$(ECHO) PPUMove... $(PPUMOVE)
+ @$(ECHO) Upx....... $(UPXPROG)
+ @$(ECHO) Zip....... $(ZIPPROG)
+ @$(ECHO)
+ @$(ECHO) == Object info ==
+ @$(ECHO)
+ @$(ECHO) Target Loaders........ $(TARGET_LOADERS)
+ @$(ECHO) Target Units.......... $(TARGET_UNITS)
+ @$(ECHO) Target Implicit Units. $(TARGET_IMPLICITUNITS)
+ @$(ECHO) Target Programs....... $(TARGET_PROGRAMS)
+ @$(ECHO) Target Dirs........... $(TARGET_DIRS)
+ @$(ECHO) Target Examples....... $(TARGET_EXAMPLES)
+ @$(ECHO) Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+ @$(ECHO)
+ @$(ECHO) Clean Units......... $(CLEAN_UNITS)
+ @$(ECHO) Clean Files......... $(CLEAN_FILES)
+ @$(ECHO)
+ @$(ECHO) Install Units....... $(INSTALL_UNITS)
+ @$(ECHO) Install Files....... $(INSTALL_FILES)
+ @$(ECHO)
+ @$(ECHO) == Install info ==
+ @$(ECHO)
+ @$(ECHO) DateStr.............. $(DATESTR)
+ @$(ECHO) ZipName.............. $(ZIPNAME)
+ @$(ECHO) ZipPrefix............ $(ZIPPREFIX)
+ @$(ECHO) ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+ @$(ECHO) ZipSuffix............ $(ZIPSUFFIX)
+ @$(ECHO) FullZipName.......... $(FULLZIPNAME)
+ @$(ECHO) Install FPC Package.. $(INSTALL_FPCPACKAGE)
+ @$(ECHO)
+ @$(ECHO) Install base dir..... $(INSTALL_BASEDIR)
+ @$(ECHO) Install binary dir... $(INSTALL_BINDIR)
+ @$(ECHO) Install library dir.. $(INSTALL_LIBDIR)
+ @$(ECHO) Install units dir.... $(INSTALL_UNITDIR)
+ @$(ECHO) Install source dir... $(INSTALL_SOURCEDIR)
+ @$(ECHO) Install doc dir...... $(INSTALL_DOCDIR)
+ @$(ECHO) Install example dir.. $(INSTALL_EXAMPLEDIR)
+ @$(ECHO) Install data dir..... $(INSTALL_DATADIR)
+ @$(ECHO)
+ @$(ECHO) Dist destination dir. $(DIST_DESTDIR)
+ @$(ECHO) Dist zip name........ $(DIST_ZIPNAME)
+ @$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+ fpc_makefile_dirs
+fpc_makefile:
+ $(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+ $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+ $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
diff --git a/gfx/x11/Makefile.fpc b/gfx/x11/Makefile.fpc
new file mode 100644
index 00000000..dcc60812
--- /dev/null
+++ b/gfx/x11/Makefile.fpc
@@ -0,0 +1,27 @@
+#
+# Makefile.fpc for fpGFX X11 target
+#
+
+[package]
+name=fpgfx
+version=0.3
+
+[require]
+packages=fcl
+unitdir=.. ../emulayer
+
+[target]
+units=gfx_x11 gfxinterface
+rst=gfx_x11
+
+[compiler]
+unitdir=.. ../emulayer
+unittargetdir=../units
+options=-S2h
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=/opt/fpc/src
+
diff --git a/gfx/x11/fpgfxpackage.lpk b/gfx/x11/fpgfxpackage.lpk
new file mode 100644
index 00000000..ee49e142
--- /dev/null
+++ b/gfx/x11/fpgfxpackage.lpk
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<CONFIG>
+ <Package Version="2">
+ <Name Value="fpgfxpackage"/>
+ <Author Value="Graeme Geldenhuys"/>
+ <CompilerOptions>
+ <Version Value="5"/>
+ <SearchPaths>
+ <OtherUnitFiles Value="../;../emulayer/"/>
+ <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+ </SearchPaths>
+ <CodeGeneration>
+ <Generate Value="Faster"/>
+ </CodeGeneration>
+ <Other>
+ <CompilerPath Value="$(CompPath)"/>
+ </Other>
+ </CompilerOptions>
+ <Description Value="Free Pascal GFX Library - [Linux]
+"/>
+ <License Value="LGPL
+"/>
+ <Version Minor="3"/>
+ <Files Count="8">
+ <Item1>
+ <Filename Value="../gfxbase.pas"/>
+ <UnitName Value="GfxBase"/>
+ </Item1>
+ <Item2>
+ <Filename Value="../emulayer/geldirty.pas"/>
+ <UnitName Value="GELDirty"/>
+ </Item2>
+ <Item3>
+ <Filename Value="../emulayer/gelimage.pas"/>
+ <UnitName Value="GELImage"/>
+ </Item3>
+ <Item4>
+ <Filename Value="gfx_x11.pas"/>
+ <UnitName Value="GFX_X11"/>
+ </Item4>
+ <Item5>
+ <Filename Value="gfxinterface.pas"/>
+ <UnitName Value="gfxinterface"/>
+ </Item5>
+ <Item6>
+ <Filename Value="../schar16.pas"/>
+ <UnitName Value="schar16"/>
+ </Item6>
+ <Item7>
+ <Filename Value="../unitkeys.pas"/>
+ <UnitName Value="unitkeys"/>
+ </Item7>
+ <Item8>
+ <Filename Value="../fpgfx.pas"/>
+ <UnitName Value="fpgfx"/>
+ </Item8>
+ </Files>
+ <RequiredPkgs Count="1">
+ <Item1>
+ <PackageName Value="FCL"/>
+ <MinVersion Major="1" Valid="True"/>
+ </Item1>
+ </RequiredPkgs>
+ <UsageOptions>
+ <UnitPath Value="$(PkgOutDir)/"/>
+ </UsageOptions>
+ <PublishOptions>
+ <Version Value="2"/>
+ <IgnoreBinaries Value="False"/>
+ </PublishOptions>
+ </Package>
+</CONFIG>
diff --git a/gfx/x11/fpgfxpackage.pas b/gfx/x11/fpgfxpackage.pas
new file mode 100644
index 00000000..24a9b9dc
--- /dev/null
+++ b/gfx/x11/fpgfxpackage.pas
@@ -0,0 +1,14 @@
+{ This file was automatically created by Lazarus. Do not edit!
+This source is only used to compile and install the package.
+ }
+
+unit fpgfxpackage;
+
+interface
+
+uses
+ GfxBase, GELDirty, GELImage, GFX_X11, gfxinterface, schar16, unitkeys, fpgfx;
+
+implementation
+
+end.
diff --git a/gfx/x11/gfx_x11.pas b/gfx/x11/gfx_x11.pas
new file mode 100644
index 00000000..ac74f781
--- /dev/null
+++ b/gfx/x11/gfx_x11.pas
@@ -0,0 +1,1865 @@
+{
+ fpGFX - Free Pascal Graphics Library
+ Copyright (C) 2000 - 2001 by
+ Areca Systems GmbH / Sebastian Guenther, sg@freepascal.org
+
+ X11/XLib target implementation
+
+ See the file COPYING.modifiedLGPL, included in this distribution,
+ for details about the copyright.
+
+ This program 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.
+}
+
+
+unit GFX_X11;
+
+{$IFDEF Debug}
+ {$ASSERTIONS On}
+{$ENDIF}
+
+{$mode objfpc}{$H+}
+
+{ Disable this, if you do not want Xft to be used for drawing text }
+{.$Define XftSupport}
+
+interface
+
+uses
+ SysUtils, Classes, // FPC units
+ X, XLib, XUtil, // X11 units
+ {$IFDEF XftSupport}
+ unitxft; // Xft font support
+ {$ENDIF}
+ GfxBase, // fpGFX units
+ GELDirty; // fpGFX emulation layer
+
+
+resourcestring
+ // X11 exception strings
+ SGCCreationFailed = 'Creation of X11 graphics context failed';
+ SXCanvasInvalidFontClass = 'Tried to set font of class "%s" into X11 context; only TXFont is allowed.';
+ SOpenDisplayFailed = 'Opening of display "%s" failed';
+ SWindowCreationFailed = 'Creation of X11 window failed';
+ SWindowUnsupportedPixelFormat = 'Window uses unsupported pixel format: %d bits per pixel';
+ SNoDefaultFont = 'Unable to load default font';
+ SIncompatibleCanvasForBlitting = 'Cannot blit from %s to %s';
+
+
+type
+ EX11Error = class(EGfxError);
+ TX11Canvas = class;
+ TX11Application = class;
+
+ // Returns True if it 'ate' the event
+ TX11EventFilter = function (const AEvent: TXEvent): Boolean of object;
+
+ { TX11Font }
+
+ TX11Font = class(TFCustomFont)
+ private
+ FFontStruct: PXFontStruct;
+ public
+ constructor Create(const Descriptor: String);
+ destructor Destroy; override;
+ class function GetDefaultFontName(const AFontClass: TGfxFontClass): String; override;
+ property FontStruct: PXFontStruct read FFontStruct;
+ end;
+
+
+ PX11CanvasState = ^TX11CanvasState;
+ TX11CanvasState = record
+ Prev: PX11CanvasState;
+ Matrix: TGfxMatrix;
+ Region: TRegion;
+ Color: TGfxPixel;
+ Font: TFCustomFont;
+ end;
+
+
+ { TX11Canvas }
+
+ TX11Canvas = class(TFCustomCanvas)
+ private
+ FHandle: X.TDrawable;
+ FGC: TGC;
+ FVisual: PVisual;
+ FRegion: TRegion;
+ FDefaultFont: PXFontStruct;
+ FFontStruct: PXFontStruct;
+ FStateStackpointer: PX11CanvasState;
+ FColormap: TColormap;
+ FCurColor: TGfxPixel;
+ FFont: TFCustomFont;
+ {$IFDEF XftSupport}
+ FXftDraw: PXftDraw;
+ {$ENDIF}
+ procedure Resized(NewWidth, NewHeight: Integer);
+ protected
+ function DoExcludeClipRect(const ARect: TRect): Boolean; override;
+ function DoIntersectClipRect(const ARect: TRect): Boolean; override;
+ function DoUnionClipRect(const ARect: TRect): Boolean; override;
+ function DoGetClipRect: TRect; override;
+ procedure DoDrawArc(const ARect: TRect; StartAngle, EndAngle: Single); override;
+ procedure DoDrawCircle(const ARect: TRect); override;
+ procedure DoDrawLine(const AFrom, ATo: TPoint); override;
+ procedure DoDrawRect(const ARect: TRect); override;
+ procedure DoDrawPoint(const APoint: TPoint); override;
+ procedure DoFillRect(const ARect: TRect); override;
+ procedure DoTextOut(const APosition: TPoint; const AText: String); override;
+ procedure DoCopyRect(ASource: TFCustomCanvas; const ASourceRect: TRect; const ADestPos: TPoint); override;
+ procedure DoMaskedCopyRect(ASource, AMask: TFCustomCanvas; const ASourceRect: TRect; const AMaskPos, ADestPos: TPoint); override;
+ procedure DoDrawImageRect(AImage: TFCustomImage; ASourceRect: TRect; const ADestPos: TPoint); override;
+ public
+ constructor Create(AColormap: TColormap; AXDrawable: X.TDrawable; ADefaultFont: PXFontStruct);
+ destructor Destroy; override;
+ function MapColor(const AColor: TGfxColor): TGfxPixel; override;
+ function FontCellHeight: Integer; override;
+ function TextExtent(const AText: String): TSize; override;
+ procedure SaveState; override;
+ procedure RestoreState; override;
+ procedure EmptyClipRect; override;
+ procedure SetColor_(AColor: TGfxPixel); override;
+ procedure SetFont(AFont: TFCustomFont); override;
+ procedure SetLineStyle(ALineStyle: TGfxLineStyle); override;
+ procedure DrawPolyLine(const Coords: array of TPoint); override;
+ property Handle: X.TDrawable read FHandle;
+ property GC: TGC read FGC;
+ property Visual: PVisual read FVisual;
+ property Colormap: TColormap read FColormap;
+ property Region: TRegion read FRegion;
+ end;
+
+
+ TX11WindowCanvas = class(TX11Canvas)
+ public
+ constructor Create(AColormap: TColormap;
+ AXDrawable: X.TDrawable; ADefaultFont: PXFontStruct);
+ end;
+
+
+ TX11PixmapCanvas = class(TX11Canvas)
+ public
+ constructor Create(AColormap: TColormap;
+ AHandle: TPixmap; APixelFormat: TGfxPixelFormat);
+ destructor Destroy; override;
+ end;
+
+
+ TX11MonoPixmapCanvas = class(TX11PixmapCanvas)
+ constructor Create(AColormap: TColormap; AHandle: TPixmap);
+ end;
+
+
+ TX11Image = class(TFCustomImage)
+ private
+ IsLocked: Boolean;
+ protected
+ FStride: LongWord;
+ FData: Pointer;
+ public
+ constructor Create(AWidth, AHeight: Integer; APixelFormat: TGfxPixelFormat); override;
+ destructor Destroy; override;
+ procedure Lock(var AData: Pointer; var AStride: LongWord); override;
+ procedure Unlock; override;
+ property Stride: LongWord read FStride;
+ property Data: Pointer read FData;
+ end;
+
+ { TX11Screen }
+
+ TX11Screen = class(TFCustomScreen)
+ private
+ FScreenIndex: Integer;
+ FScreenInfo: PScreen;
+ public
+ constructor Create; override;
+ property ScreenIndex: Integer read FScreenIndex;
+ property ScreenInfo: PScreen read FScreenInfo;
+ end;
+
+
+ TX11Window = class;
+
+
+ PXWindowListEntry = ^TXWindowListEntry;
+ TXWindowListEntry = record
+ GfxWindow: TFCustomWindow;
+ XWindowID: X.TWindow;
+ end;
+
+
+ { TX11Application }
+
+ TX11Application = class(TFCustomApplication)
+ private
+ DoBreakRun: Boolean;
+ FDirtyList: TDirtyList;
+ FDisplayName: String;
+ FDefaultFont: PXFontStruct;
+ FEventFilter: TX11EventFilter;
+ Handle: PDisplay;
+ FWMProtocols: TAtom; // Atom for "WM_PROTOCOLS"
+ FWMDeleteWindow: TAtom; // Atom for "WM_DELETE_WINDOW"
+ FWMHints: TAtom; // Atom for "_MOTIF_WM_HINTS"
+ property DirtyList: TDirtyList read FDirtyList;
+ function FindWindowByXID(XWindowID: X.TWindow): PXWindowListEntry;
+ public
+ { default methods }
+ constructor Create; override;
+ destructor Destroy; override;
+ procedure AddWindow(AWindow: TFCustomWindow); override;
+ procedure Initialize(ADisplayName: String = ''); override;
+ procedure Run; override;
+ procedure Quit; override;
+ { properties }
+ property DisplayName: String read FDisplayName write FDisplayName;
+ property EventFilter: TX11EventFilter read FEventFilter write FEventFilter;
+ end;
+
+ { TX11Window }
+
+ TX11Window = class(TFCustomWindow)
+ private
+ FParent: TFCustomWindow;
+ FComposeStatus: TXComposeStatus;
+ FComposeBuffer: String[32];
+ FCurCursorHandle: X.TCursor;
+ function StartComposing(const Event: TXKeyEvent): TKeySym;
+ procedure EndComposing;
+ procedure KeyPressed(var Event: TXKeyPressedEvent); message X.KeyPress;
+ procedure KeyReleased(var Event: TXKeyReleasedEvent); message X.KeyRelease;
+ procedure ButtonPressed(var Event: TXButtonPressedEvent); message X.ButtonPress;
+ procedure ButtonReleased(var Event: TXButtonReleasedEvent); message X.ButtonRelease;
+ procedure EnterWindow(var Event :TXEnterWindowEvent); message X.EnterNotify;
+ procedure LeaveWindow(var Event :TXLeaveWindowEvent); message X.LeaveNotify;
+ procedure PointerMoved(var Event: TXPointerMovedEvent); message X.MotionNotify;
+ procedure Expose(var Event: TXExposeEvent); message X.Expose;
+ procedure FocusIn(var Event: TXFocusInEvent); message X.FocusIn;
+ procedure FocusOut(var Event: TXFocusOutEvent); message X.FocusOut;
+ procedure Map(var Event: TXMapEvent); message X.MapNotify;
+ procedure Unmap(var Event: TXUnmapEvent); message X.UnmapNotify;
+ procedure Reparent(var Event: TXReparentEvent); message X.ReparentNotify;
+ procedure Configure(var Event: TXConfigureEvent); message X.ConfigureNotify;
+ procedure ClientMessage(var Event: TXClientMessageEvent); message X.ClientMessage;
+ protected
+ IsExposing: Boolean;
+ CanMaximize: Boolean;
+ function CreateXWindow(AParent: X.TWindow; ALeft, ATop: longint; AWidth, AHeight: longword; AVisual: PVisual; AValueMask: LongWord; const AAttr: TXSetWindowAttributes): X.TWindow; virtual;
+ function GetTitle: String; override;
+ function ConvertShiftState(AState: Cardinal): TShiftState;
+ function KeySymToKeycode(KeySym: TKeySym): Word;
+ procedure SetTitle(const ATitle: String); override;
+ procedure DoSetCursor; override;
+ procedure UpdateMotifWMHints;
+ public
+ constructor Create(AParent: TFCustomWindow; AWindowOptions: TGfxWindowOptions);
+ destructor Destroy; override;
+ procedure DefaultHandler(var Message); override;
+ procedure SetPosition(const APosition: TPoint); override;
+ procedure SetSize(const ASize: TSize); override;
+ procedure SetMinMaxSize(const AMinSize, AMaxSize: TSize); override;
+ procedure SetClientSize(const ASize: TSize); override;
+ procedure SetMinMaxClientSize(const AMinSize, AMaxSize: TSize); override;
+ procedure Show; override;
+ procedure Invalidate(const ARect: TRect); override;
+ procedure PaintInvalidRegion; override;
+ procedure CaptureMouse; override;
+ procedure ReleaseMouse; override;
+ end;
+
+
+var
+ LeaderWindow: X.TWindow;
+ ClientLeaderAtom: TAtom;
+
+function RectToXRect(const ARect: TRect): TXRectangle;
+function XRectToRect(const ARect: TXRectangle): TRect;
+function GetXEventName(Event: LongInt): String;
+
+
+implementation
+
+uses
+ GELImage, fpgfx;
+
+resourcestring
+ SFontCreationFailed = 'Could not create font with descriptor "%s"';
+
+{ TX11Font }
+
+constructor TX11Font.Create(const Descriptor: String);
+begin
+ inherited Create;
+
+ FFontStruct := XLoadQueryFont(gApplication.Handle, PChar(Descriptor));
+ if not Assigned(FFontStruct) then
+ raise EX11Error.CreateFmt(SFontCreationFailed, [Descriptor]);
+end;
+
+destructor TX11Font.Destroy;
+begin
+ if Assigned(FontStruct) then
+ begin
+ if FontStruct^.fid <> 0 then
+ XUnloadFont(gApplication.Handle, FontStruct^.fid);
+ XFreeFontInfo(nil, FontStruct, 0);
+ end;
+ inherited Destroy;
+end;
+
+class function TX11Font.GetDefaultFontName(const AFontClass: TGfxFontClass): String;
+const
+ FontNames: array[TGfxFontClass] of String = (
+ 'times', 'bitstream vera sans', 'courier', 'symbol');
+begin
+ Result := FontNames[AFontClass];
+end;
+
+
+{ TX11Canvas }
+
+constructor TX11Canvas.Create(AColormap: TColormap; AXDrawable: X.TDrawable; ADefaultFont: PXFontStruct);
+var
+ DummyWnd: PWindow;
+ DummyInt: LongInt;
+ GCValues: XLib.TXGCValues;
+begin
+ inherited Create;
+ FColormap := AColormap;
+ FHandle := AXDrawable;
+ FDefaultFont := ADefaultFont;
+ XGetGeometry(gApplication.Handle, Handle, @DummyWnd, @DummyInt, @DummyInt,
+ @FWidth, @FHeight, @DummyInt, @DummyInt);
+
+ GCValues.graphics_exposures := False;
+ FGC := XCreateGC(gApplication.Handle, Handle, GCGraphicsExposures, @GCValues);
+ if not Assigned(GC) then
+ raise EX11Error.Create(SGCCreationFailed);
+
+ XSetLineAttributes(gApplication.Handle, GC, 0,
+ LineSolid, CapNotLast, JoinMiter);
+
+ FFontStruct := FDefaultFont;
+ if Assigned(FFontStruct) then
+ XSetFont(gApplication.Handle, GC, FFontStruct^.FID);
+
+ FRegion := XCreateRegion;
+ Resized(Width, Height); // Set up a proper clipping region
+
+ {$IFDEF XftSupport}
+ {$IFDEF BUFFERING}
+ FBufferWin := XdbeAllocateBackBufferName(gApplication, FWin, nil);
+ if FBufferWin > 0 then
+ FXftDrawBuffer := XftDrawCreate(gApplication.Handle, FBufferWin,
+ XDefaultVisual(gApplication.Handle, GfxDefaultScreen),
+ XDefaultColormap(gApplication.Handle, GfxDefaultScreen));
+ {$ELSE}
+ // FBufferWin := -1;
+ // FXftDrawBuffer := nil;
+ {$ENDIF}
+ FXftDraw := XftDrawCreate(gApplication.Handle, Handle,
+ XDefaultVisual(gApplication.Handle, XDefaultScreen(gApplication.Handle)),
+ XDefaultColormap(gApplication.Handle, XDefaultScreen(gApplication.Handle)));
+ {$ENDIF XftSupport}
+end;
+
+destructor TX11Canvas.Destroy;
+begin
+ {$IFDEF XftSupport}
+ if FXftDraw <> nil then
+ XftDrawDestroy(FXftDraw);
+ {$ENDIF}
+ XDestroyRegion(Region);
+ if Assigned(GC) then
+ XFreeGC(gApplication.Handle, GC);
+ inherited Destroy;
+end;
+
+procedure TX11Canvas.SaveState;
+var
+ SavedState: PX11CanvasState;
+ NewRegion: TRegion;
+begin
+ New(SavedState);
+ SavedState^.Prev := FStateStackpointer;
+ SavedState^.Matrix := Matrix;
+ SavedState^.Region := Region;
+ NewRegion := XCreateRegion;
+ XUnionRegion(Region, NewRegion, NewRegion);
+ FRegion := NewRegion;
+ SavedState^.Color := FCurColor;
+ SavedState^.Font := FFont;
+ FStateStackpointer := SavedState;
+end;
+
+procedure TX11Canvas.RestoreState;
+var
+ SavedState: PX11CanvasState;
+begin
+ SavedState := FStateStackpointer;
+ FStateStackpointer := SavedState^.Prev;
+ Matrix := SavedState^.Matrix;
+
+ XDestroyRegion(Region);
+ FRegion := SavedState^.Region;
+ XSetRegion(gApplication.Handle, GC, Region);
+
+ SetColor_(SavedState^.Color);
+ SetFont(SavedState^.Font);
+
+ Dispose(SavedState);
+end;
+
+procedure TX11Canvas.EmptyClipRect;
+begin
+ XDestroyRegion(Region);
+ FRegion := XCreateRegion;
+ XSetRegion(gApplication.Handle, GC, Region);
+end;
+
+function TX11Canvas.DoExcludeClipRect(const ARect: TRect): Boolean;
+var
+ RectRegion: TRegion;
+ XRect: TXRectangle;
+begin
+ XRect := RectToXRect(ARect);
+ RectRegion := XCreateRegion;
+ XUnionRectWithRegion(@XRect, RectRegion, RectRegion);
+ XSubtractRegion(Region, RectRegion, Region);
+ XDestroyRegion(RectRegion);
+ XSetRegion(gApplication.Handle, GC, Region);
+ Result := XEmptyRegion(Region) = 0;
+end;
+
+function TX11Canvas.DoIntersectClipRect(const ARect: TRect): Boolean;
+var
+ RectRegion: TRegion;
+ XRect: TXRectangle;
+begin
+ XRect := RectToXRect(ARect);
+ RectRegion := XCreateRegion;
+ XUnionRectWithRegion(@XRect, RectRegion, RectRegion);
+ XIntersectRegion(Region, RectRegion, Region);
+ XDestroyRegion(RectRegion);
+ XSetRegion(gApplication.Handle, GC, Region);
+ Result := XEmptyRegion(Region) = 0;
+end;
+
+function TX11Canvas.DoUnionClipRect(const ARect: TRect): Boolean;
+var
+ XRect: TXRectangle;
+begin
+ XRect := RectToXRect(ARect);
+ XUnionRectWithRegion(@XRect, Region, Region);
+ XSetRegion(gApplication.Handle, GC, Region);
+ Result := XEmptyRegion(Region) = 0;
+end;
+
+function TX11Canvas.DoGetClipRect: TRect;
+var
+ XRect: TXRectangle;
+begin
+ XClipBox(Region, @XRect);
+ Result := XRectToRect(XRect);
+end;
+
+function TX11Canvas.MapColor(const AColor: TGfxColor): TGfxPixel;
+var
+ Color: TXColor;
+begin
+ Color.Pixel := 0;
+ Color.Red := AColor.Red;
+ Color.Green := AColor.Green;
+ Color.Blue := AColor.Blue;
+ XAllocColor(gApplication.Handle, Colormap, @Color);
+ Result := Color.Pixel;
+end;
+
+procedure TX11Canvas.SetColor_(AColor: TGfxPixel);
+begin
+ if AColor <> FCurColor then
+ begin
+ XSetForeground(gApplication.Handle, GC, AColor);
+ FCurColor := AColor;
+ end;
+end;
+
+procedure TX11Canvas.SetFont(AFont: TFCustomFont);
+begin
+ if AFont = FFont then
+ exit;
+
+ FFont := AFont;
+
+ if not Assigned(AFont) then
+ begin
+ if FFontStruct = FDefaultFont then
+ exit;
+ FFontStruct := FDefaultFont;
+ end else
+ begin
+ if not AFont.InheritsFrom(TX11Font) then
+ raise EGfxError.CreateFmt(SXCanvasInvalidFontClass, [AFont.ClassName]);
+ if TX11Font(AFont).FontStruct = FFontStruct then
+ exit;
+ FFontStruct := TX11Font(AFont).FontStruct;
+ end;
+ XSetFont(gApplication.Handle, GC, FFontStruct^.FID);
+end;
+
+procedure TX11Canvas.SetLineStyle(ALineStyle: TGfxLineStyle);
+const
+ DotDashes: array[0..1] of Char = #4#2;
+ { It was #1#1 which gives 1 pixel dots. Now it gives a 4 pixel line and a
+ 2 pixel space. }
+begin
+ case ALineStyle of
+ lsSolid:
+ XSetLineAttributes(gApplication.Handle, GC, 0,
+ LineSolid, CapNotLast, JoinMiter);
+ lsDot:
+ begin
+ XSetLineAttributes(gApplication.Handle, GC, 0,
+ LineOnOffDash, CapNotLast, JoinMiter);
+ XSetDashes(gApplication.Handle, GC, 0, DotDashes, 2);
+ end;
+ end;
+end;
+
+
+procedure TX11Canvas.DoDrawArc(const ARect: TRect; StartAngle, EndAngle: Single);
+begin
+ with ARect do
+ XDrawArc(gApplication.Handle, Handle, GC,
+ Left, Top, Right - Left - 1, Bottom - Top - 1,
+ Round(StartAngle * 64), Round((EndAngle - StartAngle) * 64));
+end;
+
+
+procedure TX11Canvas.DoDrawCircle(const ARect: TRect);
+begin
+ with ARect do
+ XDrawArc(gApplication.Handle, Handle, GC,
+ Left, Top, Right - Left - 1, Bottom - Top - 1, 0, 23040);
+end;
+
+
+procedure TX11Canvas.DoDrawLine(const AFrom, ATo: TPoint);
+begin
+ XDrawLine(gApplication.Handle, Handle, GC, AFrom.x, AFrom.y, ATo.x, ATo.y);
+end;
+
+
+procedure TX11Canvas.DrawPolyLine(const Coords: array of TPoint);
+var
+ Points: PXPoint;
+ CoordsIndex, PointsIndex: Integer;
+ Pt: TPoint;
+begin
+ Points := nil;
+ GetMem(Points, (High(Coords) - Low(Coords) + 1) * SizeOf(TXPoint));
+ CoordsIndex := Low(Coords);
+ PointsIndex := 0;
+ for CoordsIndex := Low(Coords) to High(Coords) do
+ begin
+ Pt := Transform(Coords[CoordsIndex]);
+ Points[PointsIndex].x := Pt.x;
+ Points[PointsIndex].y := Pt.y;
+ Inc(PointsIndex);
+ end;
+
+ XDrawLines(gApplication.Handle, Handle, GC, Points, PointsIndex, CoordModeOrigin);
+
+ FreeMem(Points);
+end;
+
+
+procedure TX11Canvas.DoDrawRect(const ARect: TRect);
+begin
+ with ARect do
+ XDrawRectangle(gApplication.Handle, Handle, GC, Left, Top,
+ Right - Left - 1, Bottom - Top - 1);
+end;
+
+
+procedure TX11Canvas.DoDrawPoint(const APoint: TPoint);
+begin
+ XDrawPoint(gApplication.Handle, Handle, GC, APoint.x, APoint.y);
+end;
+
+
+procedure TX11Canvas.DoFillRect(const ARect: TRect);
+begin
+ with ARect do
+ XFillRectangle(gApplication.Handle, Handle, GC, Left, Top,
+ Right - Left, Bottom - Top);
+end;
+
+
+function TX11Canvas.FontCellHeight: Integer;
+begin
+ {$note XftSupport needs to be handled here!!! }
+ Result := FFontStruct^.Ascent + FFontStruct^.Descent;
+end;
+
+
+function TX11Canvas.TextExtent(const AText: String): TSize;
+var
+ Direction, FontAscent, FontDescent: LongInt;
+ CharStruct: TXCharStruct;
+begin
+// inherited;
+ if Length(AText) = 0 then
+ begin
+ Result.cx := 0;
+ Result.cy := 0;
+ end else
+ begin
+ XQueryTextExtents(gApplication.Handle, XGContextFromGC(GC),
+ PChar(AText), Length(AText),
+ @Direction, @FontAscent, @FontDescent, @CharStruct);
+ Result.cx := CharStruct.Width;
+ Result.cy := CharStruct.Ascent + CharStruct.Descent;
+ end;
+end;
+
+
+procedure TX11Canvas.DoTextOut(const APosition: TPoint; const AText: String);
+var
+ WideText: PWideChar;
+ AnsiText: string;
+ Size: Integer;
+ {$IFDEF XftSupport}
+ fnt: PXftFont;
+ fntColor: TXftColor;
+ s: String16;
+
+ procedure SetXftColor(c: TGfxPixel; var colxft: TXftColor);
+ begin
+ colxft.color.blue := (c and $000000FF) shl 8;
+ colxft.color.green := (c and $0000FF00);
+ colxft.color.red := (c and $00FF0000) shr 8;
+
+ colxft.color.alpha := (c and $7F000000) shr 15;
+ colxft.color.alpha := colxft.color.alpha xor $FFFF; // invert: 0 in GfxColor means not translucent
+
+ colxft.pixel := 0;
+ end;
+
+ {$ENDIF}
+begin
+ if Length(AText) < 1 then
+ Exit; //==>
+
+ {$IFDEF XftSupport}
+ fnt := XftFontOpenName(gApplication.Handle, XDefaultScreen(gApplication.Handle), PChar('Sans-12'));
+ SetXftColor(FCurColor,fntColor);
+ s := u8(AText);
+// XftDrawString8(FXftDraw, fntColor, fnt, APosition.x, Aposition.y, PChar(AText),Length(AText));
+ XftDrawString16(FXftDraw, fntColor, fnt, APosition.x, Aposition.y * 3, @s[1], Length16(s));
+ XftFontClose(gApplication.Handle, fnt);
+ {$ELSE}
+ XDrawString(gApplication.Handle, Handle, GC, APosition.x,
+ APosition.y + FFontStruct^.ascent, PChar(AText), Length(AText));
+
+{ Size := Utf8ToUnicode(nil, PChar(AText), 0);
+ WideText := GetMem(Size * 2);
+ Utf8ToUnicode(WideText, PChar(AText), Size);
+
+ XwcDrawText(gApplication.Handle, Handle, GC, APosition.x,
+ APosition.y + FFontStruct^.ascent, PXwcTextItem(WideText), Length(WideText));
+
+ FreeMem(WideText);
+}
+ {$ENDIF}
+end;
+
+
+procedure TX11Canvas.DoCopyRect(ASource: TFCustomCanvas; const ASourceRect: TRect;
+ const ADestPos: TPoint);
+var
+ DestPos: TPoint;
+ RealHeight: Integer;
+begin
+ if not ASource.InheritsFrom(TX11Canvas) then
+ raise EX11Error.CreateFmt(SIncompatibleCanvasForBlitting,
+ [ASource.ClassName, Self.ClassName]);
+
+ if (ASource <> Self) and (ASource.PixelFormat.FormatType = ftMono) then
+ begin
+ // !!!: This case will probably be removed completely very soon
+ RealHeight := ASourceRect.Bottom - ASourceRect.Top;
+ if DestPos.y + RealHeight > Height then
+ RealHeight := Height - ADestPos.y;
+ XSetClipMask(gApplication.Handle, GC, TX11Canvas(ASource).Handle);
+ XSetClipOrigin(gApplication.Handle, GC, ADestPos.x, ADestPos.y);
+ XFillRectangle(gApplication.Handle, Handle, GC, ADestPos.x, ADestPos.y,
+ ASource.Width, RealHeight);
+ // Restore old clipping settings
+ XSetClipOrigin(gApplication.Handle, GC, 0, 0);
+ XSetRegion(gApplication.Handle, GC, Region);
+ end else
+ XCopyArea(gApplication.Handle, TX11Canvas(ASource).Handle, Handle, GC,
+ ASourceRect.Left, ASourceRect.Top,
+ ASourceRect.Right - ASourceRect.Left,
+ ASourceRect.Bottom - ASourceRect.Top, ADestPos.x, ADestPos.y);
+end;
+
+
+procedure TX11Canvas.DoMaskedCopyRect(ASource, AMask: TFCustomCanvas;
+ const ASourceRect: TRect; const AMaskPos, ADestPos: TPoint);
+var
+ RectWidth, RectHeight: Integer;
+ DestPos, MaskPos: TPoint;
+ SourceRect: TRect;
+begin
+ if not ASource.InheritsFrom(TX11Canvas) then
+ raise EX11Error.CreateFmt(SIncompatibleCanvasForBlitting,
+ [ASource.ClassName, Self.ClassName]);
+ if not AMask.InheritsFrom(TX11MonoPixmapCanvas) then
+ raise EX11Error.CreateFmt(SIncompatibleCanvasForBlitting,
+ [AMask.ClassName, Self.ClassName]);
+
+ RectWidth := ASourceRect.Right - ASourceRect.Left;
+ RectHeight := ASourceRect.Bottom - ASourceRect.Top;
+
+ { !!!: Attention! The current implementation only clips to the ClipRect,
+ i.e. the outer bounds of the current clipping region. In other words, the
+ result is only correct for a simple rectangle clipping region. }
+ with DoGetClipRect do
+ begin
+ if (ADestPos.x + RectWidth <= Left) or (ADestPos.y + RectHeight <= Top) then
+ exit;
+
+ DestPos := ADestPos;
+ MaskPos := AMaskPos;
+ SourceRect := ASourceRect;
+
+ if DestPos.x < Left then
+ begin
+ Inc(MaskPos.x, Left - DestPos.x);
+ Inc(SourceRect.Left, Left - DestPos.x);
+ DestPos.x := Left;
+ end;
+ if DestPos.y < Top then
+ begin
+ Inc(MaskPos.y, Top - DestPos.y);
+ Inc(SourceRect.Top, Top - DestPos.y);
+ DestPos.y := Top;
+ end;
+
+ if (DestPos.x >= Right) or (DestPos.y >= Bottom) then
+ exit;
+
+ if DestPos.x + RectWidth > Right then
+ RectWidth := Right - DestPos.x;
+ if DestPos.y + RectHeight > Bottom then
+ RectHeight := Bottom - DestPos.y;
+ end;
+
+ if (RectWidth <= 0) or (RectHeight <= 0) then
+ exit;
+
+
+ XSetClipMask(gApplication.Handle, GC, TX11Canvas(AMask).Handle);
+ XSetClipOrigin(gApplication.Handle, GC,
+ DestPos.x - MaskPos.x, DestPos.y - MaskPos.y);
+
+ XCopyArea(gApplication.Handle, TX11Canvas(ASource).Handle, Handle, GC,
+ SourceRect.Left, SourceRect.Top, RectWidth, RectHeight,
+ DestPos.x, DestPos.y);
+
+ // Restore old clipping settings
+ XSetClipOrigin(gApplication.Handle, GC, 0, 0);
+ XSetRegion(gApplication.Handle, GC, Region);
+end;
+
+procedure TX11Canvas.DoDrawImageRect(AImage: TFCustomImage; ASourceRect: TRect;
+ const ADestPos: TPoint);
+var
+ Image: XLib.PXImage;
+ ConvertFormat: TGfxPixelFormat;
+begin
+ ASSERT(AImage.InheritsFrom(TX11Image));
+ {$IFDEF Debug}
+ ASSERT(not TXImage(AImage).IsLocked);
+ {$ENDIF}
+
+ // !!!: Add support for XF86 4 and XShm etc. to speed this up!
+ Image := XCreateImage(gApplication.Handle, Visual,
+ FormatTypeBPPTable[PixelFormat.FormatType], ZPixmap, 0, nil,
+ ASourceRect.Right - ASourceRect.Left,
+ ASourceRect.Bottom - ASourceRect.Top, 8, 0);
+
+ { Here its necessary to alloc an extra byte, otherwise it will fail on 32-bits
+ machines, but still work on 64-bits machines. The cause of this is unknown. }
+ Image^.data := GetMem(Image^.bytes_per_line * (ASourceRect.Bottom - ASourceRect.Top) + 1);
+
+ if (AImage.PixelFormat.FormatType = ftMono) and
+ Self.InheritsFrom(TX11MonoPixmapCanvas) then
+ // mirror the bits within all image data bytes...:
+ FlipMonoImageBits(ASourceRect, TX11Image(AImage).Data,
+ TX11Image(AImage).Stride, 0, 0, Image^.data, Image^.bytes_per_line)
+ else
+ begin
+ ConvertFormat := PixelFormat;
+ { !!!: The following is a workaround: At least the XFree86 X server for
+ ATI graphics adapters uses 32 bit padding per pixel for 24 bpp
+ images...?!? To be checked: Is this always the case or only for ATI? }
+ if ConvertFormat.FormatType = ftRGB24 then
+ ConvertFormat.FormatType := ftRGB32;
+
+ ConvertImage(ASourceRect, AImage.PixelFormat, AImage.Palette,
+ TX11Image(AImage).Data, TX11Image(AImage).Stride,
+ 0, 0, ConvertFormat, Image^.data, Image^.bytes_per_line);
+ end;
+
+ XPutImage(gApplication.Handle, Handle, GC,
+ Image, 0, 0, ADestPos.x, ADestPos.y, AImage.Width, AImage.Height);
+
+ FreeMem(Image^.data);
+ Image^.data := nil;
+ XDestroyImage(Image);
+end;
+
+
+procedure TX11Canvas.Resized(NewWidth, NewHeight: Integer);
+var
+ XRect: TXRectangle;
+begin
+ FWidth := NewWidth;
+ FHeight := NewHeight;
+
+ XDestroyRegion(Region);
+ XRect.x := 0;
+ XRect.y := 0;
+ XRect.Width := Width;
+ XRect.Height := Height;
+ FRegion := XCreateRegion;
+ XUnionRectWithRegion(@XRect, Region, Region);
+end;
+
+
+{ TX11WindowCanvas }
+
+constructor TX11WindowCanvas.Create(AColormap: TColormap;
+ AXDrawable: X.TDrawable; ADefaultFont: PXFontStruct);
+var
+ Attr: XLib.TXWindowAttributes;
+begin
+ inherited Create(AColormap, AXDrawable, ADefaultFont);
+
+ XGetWindowAttributes(gApplication.Handle, Handle, @Attr);
+ FVisual := Attr.Visual;
+
+ case Attr.Depth of
+ 1: PixelFormat.FormatType := ftMono;
+ 4: PixelFormat.FormatType := ftPal4;
+ 8: PixelFormat.FormatType := ftPal8;
+ 16: PixelFormat.FormatType := ftRGB16;
+ 24: PixelFormat.FormatType := ftRGB24;
+ 32: PixelFormat.FormatType := ftRGB32;
+ else
+ raise EX11Error.CreateFmt(SWindowUnsupportedPixelFormat, [Attr.Depth]);
+ end;
+
+ if Attr.Depth >= 16 then
+ begin
+ PixelFormat.RedMask := Visual^.red_mask;
+ PixelFormat.GreenMask := Visual^.green_mask;
+ PixelFormat.BlueMask := Visual^.blue_mask;
+ end;
+end;
+
+
+{ TX11PixmapCanvas }
+
+constructor TX11PixmapCanvas.Create(AColormap: TColormap;
+ AHandle: TPixmap; APixelFormat: TGfxPixelFormat);
+begin
+ inherited Create(AColormap, AHandle, nil);
+ FPixelFormat := APixelFormat;
+end;
+
+
+destructor TX11PixmapCanvas.Destroy;
+begin
+ XFreePixmap(gApplication.Handle, Handle);
+ inherited Destroy;
+end;
+
+{ TX11MonoPixmapCanvas }
+
+constructor TX11MonoPixmapCanvas.Create(AColormap: TColormap; AHandle: TPixmap);
+begin
+ inherited Create(AColormap, AHandle, PixelFormatMono);
+end;
+
+{ TX11Image }
+
+constructor TX11Image.Create(AWidth, AHeight: Integer; APixelFormat: TGfxPixelFormat);
+begin
+ inherited Create(AWidth, AHeight, APixelFormat);
+
+ case APixelFormat.FormatType of
+ ftMono:
+ FStride := (AWidth + 7) shr 3;
+ ftPal4, ftPal4A:
+ FStride := (AWidth + 1) and not 1;
+ else
+ FStride := AWidth * (FormatTypeBPPTable[APixelFormat.FormatType] shr 3);
+ end;
+ GetMem(FData, FStride * Height);
+end;
+
+destructor TX11Image.Destroy;
+begin
+ FreeMem(FData);
+ inherited Destroy;
+end;
+
+procedure TX11Image.Lock(var AData: Pointer; var AStride: LongWord);
+begin
+ ASSERT(not IsLocked);
+ IsLocked := True;
+
+ AData := Data;
+ AStride := Stride;
+end;
+
+procedure TX11Image.Unlock;
+begin
+ ASSERT(IsLocked);
+ IsLocked := False;
+end;
+
+
+{ TX11Screen }
+
+constructor TX11Screen.Create;
+begin
+ inherited Create;
+
+// FScreenIndex := AScreenIndex;
+// FScreenInfo := XScreenOfDisplay(gApplication.Handle, ScreenIndex);
+end;
+
+
+{ TX11Application }
+
+constructor TX11Application.Create;
+begin
+ inherited Create;
+
+ FDirtyList := TDirtyList.Create;
+end;
+
+
+destructor TX11Application.Destroy;
+var
+ i: Integer;
+ WindowListEntry: PXWindowListEntry;
+begin
+ if Assigned(Forms) then
+ begin
+ for i := 0 to Forms.Count - 1 do
+ begin
+ WindowListEntry := PXWindowListEntry(Forms[i]);
+ WindowListEntry^.GfxWindow.Free;
+ Dispose(WindowListEntry);
+ end;
+ end;
+
+ DirtyList.Free;
+
+ if Assigned(FDefaultFont) then
+ begin
+ if FDefaultFont^.fid <> 0 then
+ XUnloadFont(Handle, FDefaultFont^.fid);
+ XFreeFontInfo(nil, FDefaultFont, 0);
+ end;
+
+ if Assigned(Handle) then
+ XCloseDisplay(Handle);
+
+ inherited Destroy;
+end;
+
+procedure TX11Application.AddWindow(AWindow: TFCustomWindow);
+var
+ WindowListEntry: PXWindowListEntry;
+begin
+ New(WindowListEntry);
+ WindowListEntry^.GfxWindow := AWindow;
+ WindowListEntry^.XWindowID := AWindow.Handle;
+ Forms.Add(WindowListEntry);
+end;
+
+procedure TX11Application.Run;
+var
+ Event: TXEvent;
+ WindowListEntry: PXWindowListEntry;
+begin
+ DoBreakRun := False;
+
+ while (not (QuitWhenLastWindowCloses and (Forms.Count = 0))) and
+ (DoBreakRun = False) do
+ begin
+ if Assigned(OnIdle) or Assigned(DirtyList.First) then
+ begin
+ if not XCheckMaskEvent(Handle, MaxInt, @Event) then
+ begin
+ if Assigned(DirtyList.First) then DirtyList.PaintAll
+ else if Assigned(OnIdle) then OnIdle(Self);
+
+ continue;
+ end;
+ end
+ else
+ XNextEvent(Handle, @Event);
+
+ // if the event filter returns true then it ate the message
+ if Assigned(FEventFilter) and FEventFilter(Event) then continue;
+
+ if Forms.Count = 0 then continue;
+
+ // According to a comment in X.h, the valid event types start with 2!
+ if Event._type >= 2 then
+ begin
+ WindowListEntry := FindWindowByXID(Event.XAny.Window);
+
+ if Event._type = X.DestroyNotify then
+ begin
+ Forms.Remove(WindowListEntry);
+ Dispose(WindowListEntry);
+ end
+ else if Assigned(WindowListEntry) then
+ begin
+ if Assigned(WindowListEntry^.GfxWindow) then
+ WindowListEntry^.GfxWindow.Dispatch(Event);
+ end
+ else
+ WriteLn('fpGFX/X11: Received X event "', GetXEventName(Event._type),
+ '" for unknown window');
+ end;
+ end;
+ DoBreakRun := False;
+end;
+
+
+procedure TX11Application.Quit;
+begin
+ DoBreakRun := True;
+end;
+
+
+function TX11Application.FindWindowByXID(XWindowID: X.TWindow): PXWindowListEntry;
+var
+ i: Integer;
+begin
+ for i := 0 to Forms.Count - 1 do
+ begin
+ Result := PXWindowListEntry(Forms[i]);
+ if Result^.XWindowID = XWindowID then
+ exit;
+ end;
+ Result := nil;
+end;
+
+procedure TX11Application.Initialize(ADisplayName: String = '');
+begin
+ if Length(ADisplayName) = 0 then FDisplayName := XDisplayName(nil)
+ else FDisplayName := ADisplayName;
+
+ Handle := XOpenDisplay(PChar(DisplayName));
+
+ if not Assigned(Handle) then
+ raise EX11Error.CreateFmt(SOpenDisplayFailed, [DisplayName]);
+
+ FDefaultFont := XLoadQueryFont(Handle,
+ '-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1');
+
+ if not Assigned(FDefaultFont) then
+ begin
+ FDefaultFont := XLoadQueryFont(Handle, 'fixed');
+ if not Assigned(FDefaultFont) then
+ raise EX11Error.Create(SNoDefaultFont);
+ end;
+end;
+
+{ TX11Window }
+
+{ Note, this only creates a window, it doesn't actually show the window. It
+ is still invisible. To make it visible, we need to call Show(). }
+constructor TX11Window.Create(AParent: TFCustomWindow;
+ AWindowOptions: TGfxWindowOptions);
+const
+ WindowHints: TXWMHints = (
+ flags: InputHint or StateHint or WindowGroupHint;
+ input: True;
+ initial_state: NormalState;
+ icon_pixmap: 0;
+ icon_window: 0;
+ icon_x: 0;
+ icon_y: 0;
+ icon_mask: 0;
+ window_group: 0;
+ );
+var
+ Colormap: TColormap;
+ Attr: TXSetWindowAttributes;
+ SizeHints: TXSizeHints;
+ ClassHint: PXClassHint;
+ lParentHandle: X.TWindow;
+ mask: longword;
+begin
+ inherited Create;
+
+ WindowOptions := AWindowOptions;
+ FParent := AParent;
+
+
+ if (woX11SkipWMHints in WindowOptions) = False then
+ begin
+ if LeaderWindow = 0 then
+ begin
+ LeaderWindow := XCreateSimpleWindow(gApplication.Handle,
+ XDefaultRootWindow(gApplication.Handle), 10, 10, 10, 10, 0, 0, 0);
+
+ ClassHint := XAllocClassHint;
+ ClassHint^.res_name := 'fpGFX'; // !!! use app name
+ ClassHint^.res_class := 'FpGFX';
+ XSetWMProperties(gApplication.Handle, LeaderWindow, nil, nil, nil, 0, nil, nil,
+ ClassHint);
+ XFree(ClassHint);
+ ClientLeaderAtom := XInternAtom(gApplication.Handle, 'WM_CLIENT_LEADER', False);
+ end;
+ end;
+
+ Colormap := XDefaultColormap(gApplication.Handle, XDefaultScreen(gApplication.Handle));
+ Attr.Colormap := Colormap;
+
+ SizeHints.flags := XUtil.PSize;
+ SizeHints.x := 0;
+ SizeHints.y := 0;
+ SizeHints.width := 200;
+ SizeHints.height := 200;
+
+ { Make sure we use the correct parent handle }
+ if FParent <> nil then
+ lParentHandle := TX11Window(FParent).Handle
+ else
+ lParentHandle := XDefaultRootWindow(gApplication.Handle);
+
+ { setup attributes and masks }
+ if (woBorderless in WindowOptions) or (woToolWindow in WindowOptions) or
+ (woPopup in WindowOptions) then
+ begin
+ Attr.Override_Redirect := longbool(1); // this removes window borders
+ mask := CWOverrideRedirect or CWColormap;
+ end
+ else
+ begin
+ Attr.Override_Redirect := longbool(0);
+ mask := CWColormap;
+ end;
+
+ FHandle := CreateXWindow(
+ lParentHandle, // parent
+ SizeHints.x, SizeHints.x, // position (top, left)
+ SizeHints.width, SizeHints.height, // default size
+ XDefaultVisual(gApplication.Handle, XDefaultScreen(gApplication.Handle)), // visual
+ mask,
+ Attr);
+
+ if FHandle = 0 then
+ raise EX11Error.Create(SWindowCreationFailed);
+
+ XSelectInput(gApplication.Handle, FHandle, KeyPressMask or KeyReleaseMask
+ or ButtonPressMask or ButtonReleaseMask or EnterWindowMask
+ or LeaveWindowMask or PointerMotionMask or ExposureMask or FocusChangeMask
+ or StructureNotifyMask);
+
+ if (woX11SkipWMHints in WindowOptions) = False then
+ begin
+ XSetStandardProperties(gApplication.Handle, Handle, nil, nil, 0,
+ argv, argc, @SizeHints);
+
+ XSetWMNormalHints(gApplication.Handle, Handle, @SizeHints);
+
+ WindowHints.flags := WindowGroupHint;
+ WindowHints.window_group := LeaderWindow;
+ XSetWMHints(gApplication.Handle, Handle, @WindowHints);
+
+ XChangeProperty(gApplication.Handle, Handle, ClientLeaderAtom, 33, 32,
+ PropModeReplace, @LeaderWindow, 1);
+
+ // We want to get a Client Message when the user tries to close this window
+ if gApplication.FWMProtocols = 0 then
+ gApplication.FWMProtocols := XInternAtom(gApplication.Handle, 'WM_PROTOCOLS', False);
+ if gApplication.FWMDeleteWindow = 0 then
+ gApplication.FWMDeleteWindow := XInternAtom(gApplication.Handle, 'WM_DELETE_WINDOW', False);
+
+ // send close event instead of quitting the whole application...
+ XSetWMProtocols(gApplication.Handle, FHandle, @gApplication.FWMDeleteWindow, 1);
+ end;
+
+ FCanvas := TX11WindowCanvas.Create(Colormap, Handle, gApplication.FDefaultFont);
+end;
+
+
+destructor TX11Window.Destroy;
+begin
+ if Assigned(OnClose) then
+ OnClose(Self);
+
+ gApplication.DirtyList.ClearQueueForWindow(Self);
+
+ XDestroyWindow(gApplication.Handle, Handle);
+ Canvas.Free;
+
+ gApplication.FindWindowByXID(Handle)^.GfxWindow := nil;
+
+ if FCurCursorHandle <> 0 then
+ XFreeCursor(gApplication.Handle, FCurCursorHandle);
+
+ inherited Destroy;
+end;
+
+
+procedure TX11Window.DefaultHandler(var Message);
+begin
+ WriteLn('fpGFX/X11: Unhandled X11 event received: ',
+ GetXEventName(TXEvent(Message)._type));
+end;
+
+
+procedure TX11Window.SetPosition(const APosition: TPoint);
+var
+ Supplied: PtrInt;
+ SizeHints: PXSizeHints;
+begin
+ SizeHints := XAllocSizeHints;
+ XGetWMNormalHints(gApplication.Handle, Handle, SizeHints, @Supplied);
+ SizeHints^.flags := SizeHints^.flags or PPosition;
+ SizeHints^.x := APosition.x;
+ SizeHints^.y := APosition.y;
+ XSetWMNormalHints(gApplication.Handle, Handle, SizeHints);
+ XFree(SizeHints);
+ XMoveWindow(gApplication.Handle, Handle, APosition.x, APosition.y);
+end;
+
+
+procedure TX11Window.SetSize(const ASize: TSize);
+begin
+ // !!!: Implement this properly
+ WriteLn('fpGFX/X11: TXWindow.SetSize is not properly implemented yet');
+ SetClientSize(ASize);
+end;
+
+
+procedure TX11Window.SetMinMaxSize(const AMinSize, AMaxSize: TSize);
+begin
+ // !!!: Implement this properly
+ WriteLn('fpGFX/X11: TXWindow.SetMinMaxSize is not properly implemented yet');
+ SetMinMaxClientSize(AMinSize, AMaxSize);
+end;
+
+
+procedure TX11Window.SetClientSize(const ASize: TSize);
+var
+ ChangeMask: Cardinal;
+ Changes: TXWindowChanges;
+begin
+ ChangeMask := 0;
+
+ if ASize.cx <> ClientWidth then
+ begin
+ ChangeMask := CWWidth;
+ Changes.Width := ASize.cx;
+ end;
+
+ if ASize.cy <> ClientHeight then
+ begin
+ ChangeMask := ChangeMask or CWHeight;
+ Changes.Height := ASize.cy;
+ end;
+
+ if ChangeMask <> 0 then
+ XConfigureWindow(gApplication.Handle, Handle, ChangeMask, @Changes);
+end;
+
+
+procedure TX11Window.SetMinMaxClientSize(const AMinSize, AMaxSize: TSize);
+var
+ Supplied: PtrInt;
+ SizeHints: PXSizeHints;
+begin
+ CanMaximize := (AMaxSize.cx = 0) or (AMaxSize.cy = 0) or
+ (AMaxSize.cx > AMinSize.cx) or (AMaxSize.cy > AMinSize.cy);
+ UpdateMotifWMHints;
+
+ SizeHints := XAllocSizeHints;
+ XGetWMNormalHints(gApplication.Handle, Handle, SizeHints, @Supplied);
+ with SizeHints^ do
+ begin
+ if (AMinSize.cx > 0) or (AMinSize.cy > 0) then
+ begin
+ flags := flags or PMinSize;
+ min_width := AMinSize.cx;
+ min_height := AMinSize.cy;
+ end else
+ flags := flags and not PMinSize;
+
+ if (AMaxSize.cx > 0) or (AMaxSize.cy > 0) then
+ begin
+ flags := flags or PMaxSize;
+ if AMaxSize.cx > 0 then
+ max_width := AMaxSize.cx
+ else
+ max_width := 32767;
+ if AMaxSize.cy > 0 then
+ max_height := AMaxSize.cy
+ else
+ max_height := 32767;
+ end else
+ flags := flags and not PMaxSize;
+ end;
+
+ XSetWMNormalHints(gApplication.Handle, Handle, SizeHints);
+ XFree(SizeHints);
+end;
+
+
+{ Makes the window visible and raises it to the top of the stack. }
+procedure TX11Window.Show;
+begin
+ XMapRaised(gApplication.Handle, Handle);
+end;
+
+
+procedure TX11Window.Invalidate(const ARect: TRect);
+begin
+ gApplication.DirtyList.AddRect(Self, ARect);
+end;
+
+
+procedure TX11Window.PaintInvalidRegion;
+begin
+ gApplication.DirtyList.PaintQueueForWindow(Self);
+end;
+
+
+procedure TX11Window.CaptureMouse;
+begin
+ XGrabPointer(gApplication.Handle, Handle, False, ButtonPressMask or
+ ButtonReleaseMask or EnterWindowMask or LeaveWindowMask or
+ PointerMotionMask, GrabModeAsync, GrabModeAsync, 0, 0, CurrentTime);
+end;
+
+
+procedure TX11Window.ReleaseMouse;
+begin
+ XUngrabPointer(gApplication.Handle, CurrentTime);
+end;
+
+
+// protected methods
+
+function TX11Window.GetTitle: String;
+var
+ s: PChar;
+begin
+ XFetchName(gApplication.Handle, Handle, @s);
+ Result := s;
+ XFree(s);
+end;
+
+
+procedure TX11Window.SetTitle(const ATitle: String);
+begin
+ XStoreName(gApplication.Handle, Handle, PChar(ATitle));
+end;
+
+
+procedure TX11Window.DoSetCursor;
+const
+ CursorTable: array[TGfxCursor] of Integer = (
+ -1, // crDefault
+ -2, // crNone !!!: not implemented
+ -1, // crArrow
+ 34, // crCross
+ 152, // crIBeam
+ 52, // crSize
+ 116, // crSizeNS
+ 108, // crSizeWE
+ 114, // crUpArrow
+ 150, // crHourGlass
+ 0, // crNoDrop
+ 92); // crHelp
+var
+ ID: Integer;
+begin
+ if FCurCursorHandle <> 0 then
+ XFreeCursor(gApplication.Handle, FCurCursorHandle);
+ ID := CursorTable[Cursor];
+ if ID = -1 then
+ FCurCursorHandle := 0
+ else
+ FCurCursorHandle := XCreateFontCursor(gApplication.Handle, ID);
+ XDefineCursor(gApplication.Handle, Handle, FCurCursorHandle);
+end;
+
+
+function TX11Window.ConvertShiftState(AState: Cardinal): TShiftState;
+begin
+ Result := [];
+ if (AState and Button1Mask) <> 0 then
+ Include(Result, ssLeft);
+ if (AState and Button2Mask) <> 0 then
+ Include(Result, ssMiddle);
+ if (AState and Button3Mask) <> 0 then
+ Include(Result, ssRight);
+ if (AState and ShiftMask) <> 0 then
+ Include(Result, ssShift);
+ if (AState and LockMask) <> 0 then
+ Include(Result, ssCaps);
+ if (AState and ControlMask) <> 0 then
+ Include(Result, ssCtrl);
+ if (AState and Mod1Mask) <> 0 then
+ Include(Result, ssAlt);
+ if (AState and Mod2Mask) <> 0 then
+ Include(Result, ssNum);
+ if (AState and Mod4Mask) <> 0 then
+ Include(Result, ssSuper);
+ if (AState and Mod5Mask) <> 0 then
+ Include(Result, ssScroll);
+ if (AState and (1 shl 13)) <> 0 then
+ Include(Result, ssAltGr);
+end;
+
+function TX11Window.KeySymToKeycode(KeySym: TKeySym): Word;
+const
+ Table_20aX: array[$20a0..$20ac] of Word = (keyEcuSign, keyColonSign,
+ keyCruzeiroSign, keyFFrancSign, keyLiraSign, keyMillSign, keyNairaSign,
+ keyPesetaSign, keyRupeeSign, keyWonSign, keyNewSheqelSign, keyDongSign,
+ keyEuroSign);
+ Table_feXX: array[$fe50..$fe60] of Word = (keyDeadGrave, keyDeadAcute,
+ keyDeadCircumflex, keyDeadTilde, keyDeadMacron,keyDeadBreve,
+ keyDeadAbovedot, keyDeadDiaeresis, keyDeadRing, keyDeadDoubleacute,
+ keyDeadCaron, keyDeadCedilla, keyDeadOgonek, keyDeadIota,
+ keyDeadVoicedSound, keyDeadSemivoicedSound, keyDeadBelowdot);
+ Table_ff5X: array[$ff50..$ff58] of Word = (keyHome, keyLeft, keyUp, keyRight,
+ keyDown, keyPrior, keyNext, keyEnd, keyBegin);
+ Table_ff6X: array[$ff60..$ff6b] of Word = (keySelect, keyPrintScreen,
+ keyExecute, keyNIL, keyInsert, keyUndo, keyRedo, keyMenu, keyFind,
+ keyCancel, keyHelp, keyBreak);
+ Table_ff9X: array[$ff91..$ff9f] of Word = (keyPF1, keyPF2, keyPF3, keyPF4,
+ keyP7, keyP4, keyP8, keyP6, keyP2, keyP9, keyP3, keyP1, keyP5, keyP0,
+ keyPDecimal);
+ Table_ffeX: array[$ffe1..$ffee] of Word = (keyShiftL, keyShiftR, keyCtrlL,
+ keyCtrlR, keyCapsLock, keyShiftLock, keyMetaL, keyMetaR, keyAltL, keyAltR,
+ keySuperL, keySuperR, keyHyperL, keyHyperR);
+begin
+ case KeySym of
+ 0..Ord('a')-1, Ord('z')+1..$bf, $f7:
+ Result := KeySym;
+ Ord('a')..Ord('z'), $c0..$f6, $f8..$ff:
+ Result := KeySym - 32;
+ $20a0..$20ac: Result := Table_20aX[KeySym];
+ $fe20: Result := keyTab;
+ $fe50..$fe60: Result := Table_feXX[KeySym];
+ $ff08: Result := keyBackspace;
+ $ff09: Result := keyTab;
+ $ff0a: Result := keyLinefeed;
+ $ff0b: Result := keyClear;
+ $ff0d: Result := keyReturn;
+ $ff13: Result := keyPause;
+ $ff14: Result := keyScrollLock;
+ $ff15: Result := keySysRq;
+ $ff1b: Result := keyEscape;
+ $ff50..$ff58: Result := Table_ff5X[KeySym];
+ $ff60..$ff6b: Result := Table_ff6X[KeySym];
+ $ff7e: Result := keyModeSwitch;
+ $ff7f: Result := keyNumLock;
+ $ff80: Result := keyPSpace;
+ $ff89: Result := keyPTab;
+ $ff8d: Result := keyPEnter;
+ $ff91..$ff9f: Result := Table_ff9X[KeySym];
+ $ffaa: Result := keyPAsterisk;
+ $ffab: Result := keyPPlus;
+ $ffac: Result := keyPSeparator;
+ $ffad: Result := keyPMinus;
+ $ffae: Result := keyPDecimal;
+ $ffaf: Result := keyPSlash;
+ $ffb0..$ffb9: Result := keyP0 + KeySym - $ffb0;
+ $ffbd: Result := keyPEqual;
+ $ffbe..$ffe0: Result := keyF1 + KeySym - $ffbe;
+ $ffe1..$ffee: Result := Table_ffeX[KeySym];
+ $ffff: Result := keyDelete;
+ else
+ Result := keyNIL;
+ end;
+{$IFDEF Debug}
+ if Result = keyNIL then
+ WriteLn('fpGFX/X11: Unknown KeySym: $', IntToHex(KeySym, 4));
+{$ENDIF}
+end;
+
+
+procedure TX11Window.UpdateMotifWMHints;
+type
+ PMotifWmHints = ^TMotifWmHints;
+ TMotifWmHints = packed record
+ Flags, Functions, Decorations: LongWord;
+ InputMode: LongInt;
+ Status: LongWord;
+ end;
+const
+ MWM_HINTS_FUNCTIONS = 1;
+ MWM_HINTS_DECORATIONS = 2;
+ FuncAll = 1;
+ FuncResize = 2;
+ FuncMove = 4;
+ FuncMinimize = 8;
+ FuncMaximize = 16;
+ FuncClose = 32;
+ DecorAll = 1;
+ DecorBorder = 2;
+ DecorResizeH = 4;
+ DecorTitle = 8;
+ DecorMenu = 16;
+ DecorMinimize = 32;
+ DecorMaximize = 64;
+var
+ PropType: TAtom;
+ PropFormat: LongInt;
+ PropItemCount, PropBytesAfter: LongWord;
+ Hints: PMotifWmHints;
+ NewHints: TMotifWmHints;
+begin
+ if gApplication.FWMHints = 0 then
+ gApplication.FWMHints :=
+ XInternAtom(gApplication.Handle, '_MOTIF_WM_HINTS', False);
+
+ XGetWindowProperty(gApplication.Handle, Handle,
+ gApplication.FWMHints, 0, 5, False, AnyPropertyType, @PropType,
+ @PropFormat, @PropItemCount, @PropBytesAfter, @Hints);
+
+ NewHints.Flags := MWM_HINTS_FUNCTIONS or MWM_HINTS_DECORATIONS;
+ NewHints.Functions := FuncResize or FuncMove or FuncMinimize or FuncClose;
+
+ if (woToolWindow in WindowOptions) or (woWindow in WindowOptions) or
+ (woPopup in WindowOptions) then
+ NewHints.Decorations := DecorBorder or DecorTitle or DecorMenu or DecorMinimize
+ else
+ NewHints.Decorations := 0;
+ if CanMaximize then
+ begin
+ NewHints.Functions := NewHints.Functions or FuncMaximize;
+ NewHints.Decorations := NewHints.Decorations or DecorMaximize;
+ end;
+
+ if Assigned(Hints) then
+ begin
+ Hints^.Flags := Hints^.Flags or NewHints.Flags;
+ Hints^.Decorations := NewHints.Decorations;
+ Hints^.Functions := NewHints.Functions;
+ end else
+ Hints := @NewHints;
+
+ XChangeProperty(gApplication.Handle, Handle,
+ gApplication.FWMHints, gApplication.FWMHints,
+ 32, PropModeReplace, Pointer(Hints), 5);
+ if Hints <> @NewHints then
+ XFree(Hints);
+end;
+
+
+// private methods
+
+const
+ ButtonTable: array[1..3] of TMouseButton = (mbLeft, mbMiddle, mbRight);
+
+
+function TX11Window.StartComposing(const Event: TXKeyEvent): TKeySym;
+begin
+ SetLength(FComposeBuffer,
+ XLookupString(@Event, @FComposeBuffer[1],
+ SizeOf(FComposeBuffer) - 1, @Result, @FComposeStatus));
+end;
+
+
+procedure TX11Window.EndComposing;
+var
+ i: Integer;
+begin
+ if Assigned(OnKeyChar) then
+ for i := 1 to Length(FComposeBuffer) do
+ OnKeyChar(Self, FComposeBuffer[i]);
+end;
+
+
+procedure TX11Window.KeyPressed(var Event: TXKeyPressedEvent);
+var
+ KeySym: TKeySym;
+begin
+ KeySym := StartComposing(Event);
+ if Assigned(OnKeyPressed) then
+ OnKeyPressed(Self, KeySymToKeycode(KeySym), ConvertShiftState(Event.State));
+
+ if (Event.State and (ControlMask or Mod1Mask)) = 0 then
+ EndComposing;
+end;
+
+
+procedure TX11Window.KeyReleased(var Event: TXKeyReleasedEvent);
+var
+ KeySym: TKeySym;
+begin
+ KeySym := StartComposing(Event);
+ if Assigned(OnKeyReleased) then
+ OnKeyReleased(Self, KeySymToKeycode(KeySym),
+ ConvertShiftState(Event.State));
+ // Do not call EndComposing, as this would generate duplicate KeyChar events!
+end;
+
+
+procedure TX11Window.ButtonPressed(var Event: TXButtonPressedEvent);
+var
+ Sum: Integer;
+ NewEvent: TXEvent;
+begin
+ case Event.Button of
+ Button1..Button3:
+ if Assigned(OnMousePressed) then
+ OnMousePressed(Self, ButtonTable[Event.Button],
+ ConvertShiftState(Event.State), Point(Event.x, Event.y));
+ Button4, Button5: // Mouse wheel message
+ begin
+ if Event.Button = Button4 then
+ Sum := -1
+ else
+ Sum := 1;
+
+ // Check for other mouse wheel messages in the queue
+ while XCheckTypedWindowEvent(gApplication.Handle, Handle,
+ X.ButtonPress, @NewEvent) do
+ begin
+ if NewEvent.xbutton.Button = 4 then
+ Dec(Sum)
+ else if NewEvent.xbutton.Button = 5 then
+ Inc(Sum)
+ else
+ begin
+ XPutBackEvent(gApplication.Handle, @NewEvent);
+ break;
+ end;
+ end;
+
+ if Assigned(OnMouseWheel) then
+ OnMouseWheel(Self, ConvertShiftState(Event.State),
+ Sum, Point(Event.x, Event.y));
+ end;
+ end;
+end;
+
+
+procedure TX11Window.ButtonReleased(var Event: TXButtonReleasedEvent);
+begin
+ if (Event.Button >= 1) and (Event.Button <= 3) and
+ Assigned(OnMouseReleased) then
+ OnMouseReleased(Self, ButtonTable[Event.Button],
+ ConvertShiftState(Event.State), Point(Event.x, Event.y));
+end;
+
+
+procedure TX11Window.EnterWindow(var Event: TXEnterWindowEvent);
+begin
+ if Assigned(OnMouseEnter) then
+ OnMouseEnter(Self, ConvertShiftState(Event.State), Point(Event.x, Event.y));
+end;
+
+
+procedure TX11Window.LeaveWindow(var Event: TXLeaveWindowEvent);
+begin
+ if Assigned(OnMouseEnter) then
+ OnMouseLeave(Self);
+end;
+
+
+procedure TX11Window.PointerMoved(var Event: TXPointerMovedEvent);
+begin
+ if Assigned(OnMouseMove) then
+ OnMouseMove(Self, ConvertShiftState(Event.State), Point(Event.x, Event.y));
+end;
+
+
+procedure TX11Window.Expose(var Event: TXExposeEvent);
+{var
+ IsNotEmpty: Boolean;
+begin
+WriteLn('Expose');
+ if Assigned(OnPaint) then
+ with Event do
+ begin
+ if not IsExposing then
+ begin
+ IsExposing := True;
+ Canvas.SaveState;
+ Canvas.EmptyClipRect;
+ end;
+ IsNotEmpty := Canvas.UnionClipRect(Rect(x, y, x + Width, y + Height));
+ if Count = 0 then
+ begin
+ if IsNotEmpty then
+ OnPaint(Self, Canvas.GetClipRect);
+ IsExposing := False;
+ Canvas.RestoreState;
+ end;
+ end;
+end;}
+var
+ r: TRect;
+begin
+ with Event do
+ r := Rect(x, y, x + Width, y + Height);
+ gApplication.DirtyList.AddRect(Self, r);
+end;
+
+
+procedure TX11Window.FocusIn(var Event: TXFocusInEvent);
+begin
+ if Assigned(OnFocusIn) then
+ OnFocusIn(Self);
+end;
+
+
+procedure TX11Window.FocusOut(var Event: TXFocusOutEvent);
+begin
+ if Assigned(OnFocusOut) then
+ OnFocusOut(Self);
+end;
+
+
+procedure TX11Window.Map(var Event: TXMapEvent);
+begin
+ if Assigned(OnShow) then
+ OnShow(Self);
+end;
+
+
+procedure TX11Window.Unmap(var Event: TXUnmapEvent);
+begin
+ if Assigned(OnHide) then
+ OnHide(Self);
+end;
+
+
+procedure TX11Window.Reparent(var Event: TXReparentEvent);
+begin
+ if Assigned(OnCreate) then
+ OnCreate(Self);
+end;
+
+
+procedure TX11Window.Configure(var Event: TXConfigureEvent);
+begin
+ while XCheckTypedWindowEvent(gApplication.Handle, Handle,
+ X.ConfigureNotify, @Event) do;
+
+ if (Event.x <> Left) or (Event.y <> Top) then
+ begin
+ FLeft := Event.x;
+ FTop := Event.y;
+ if Assigned(OnMove) then
+ OnMove(Self);
+ end;
+ if (Event.Width <> Width) or (Event.Height <> Height) then
+ begin
+ // !!!: The following 2 lines are _quite_ wrong... :)
+ FWidth := Event.Width;
+ FHeight := Event.Height;
+ FClientWidth := Event.Width;
+ FClientHeight := Event.Height;
+ TX11Canvas(Canvas).Resized(ClientWidth, ClientHeight);
+ if Assigned(OnResize) then
+ OnResize(Self);
+ end;
+end;
+
+
+procedure TX11Window.ClientMessage(var Event: TXClientMessageEvent);
+begin
+ if Event.message_type = gApplication.FWMProtocols then
+ if Event.Data.l[0] = gApplication.FWMDeleteWindow then
+ begin
+ if CanClose then
+ Free;
+ end else
+ WriteLn('fpGFX/X11: Unknown client protocol message: ', Event.Data.l[0])
+ else
+ WriteLn('fpGFX/X11: Unknown client message: ', Event.message_type);
+end;
+
+function TX11Window.CreateXWindow(AParent: X.TWindow; ALeft, ATop: longint; AWidth, AHeight: longword;
+ AVisual: PVisual; AValueMask: LongWord; const AAttr: TXSetWindowAttributes): X.TWindow;
+begin
+ Result := XCreateWindow(
+ gApplication.Handle,
+ AParent, // parent
+ ALeft, ATop, // position (top, left)
+ AWidth, AHeight, // size (width, height)
+ 0, // border size
+ CopyFromParent, // depth
+ InputOutput, // class
+ AVisual, // visual
+ AValueMask,
+ @AAttr);
+end;
+
+
+{ Global utility functions }
+
+function RectToXRect(const ARect: TRect): TXRectangle;
+begin
+ Result.x := ARect.Left;
+ Result.y := ARect.Top;
+ Result.width := ARect.Right - ARect.Left;
+ Result.height := ARect.Bottom - ARect.Top;
+end;
+
+
+function XRectToRect(const ARect: TXRectangle): TRect;
+begin
+ Result.Left := ARect.x;
+ Result.Top := ARect.y;
+ Result.Right := ARect.x + ARect.width;
+ Result.Bottom := ARect.y + ARect.height;
+end;
+
+
+function GetXEventName(Event: LongInt): String;
+const
+ EventNames: array[2..34] of String = (
+ 'KeyPress', 'KeyRelease', 'ButtonPress', 'ButtonRelease', 'MotionNotify',
+ 'EnterNotify', 'LeaveNotify', 'FocusIn', 'FocusOut', 'KeymapNotify',
+ 'Expose', 'GraphicsExpose', 'NoExpose', 'VisibilityNotify', 'CreateNotify',
+ 'DestroyNotify', 'UnmapNotify', 'MapNotify', 'MapRequest', 'ReparentNotify',
+ 'ConfigureNotify', 'ConfigureRequest', 'GravityNotify', 'ResizeRequest',
+ 'CirculateNotify', 'CirculateRequest', 'PropertyNotify', 'SelectionClear',
+ 'SelectionRequest', 'SelectionNotify', 'ColormapNotify', 'ClientMessage',
+ 'MappingNotify');
+begin
+ if (Event >= Low(EventNames)) and (Event <= High(EventNames)) then
+ Result := EventNames[Event]
+ else
+ Result := '#' + IntToStr(Event);
+end;
+
+end.
+
+
diff --git a/gfx/x11/gfxinterface.pas b/gfx/x11/gfxinterface.pas
new file mode 100644
index 00000000..248c935f
--- /dev/null
+++ b/gfx/x11/gfxinterface.pas
@@ -0,0 +1,41 @@
+{
+ fpGUI - Free Pascal Graphical User Interface
+
+ GFXInterface - Default target selection unit for X11 target
+
+ Copyright (C) 2000 - 2006 See the file AUTHORS, included in this
+ distribution, for details of the copyright.
+
+ See the file COPYING.modifiedLGPL, included in this distribution,
+ for details about redistributing fpGUI.
+
+ This program 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.
+}
+unit gfxinterface;
+
+interface
+
+uses
+ GFX_X11;
+
+type
+
+ TDefCanvas = TX11Canvas;
+
+ TDefFont = TX11Font;
+
+ TDefScreen = TX11Screen;
+
+ TDefApplication = TX11Application;
+
+ TDefWindow = TX11Window;
+
+ TDefImage = TX11Image;
+
+
+implementation
+
+end.
+
diff --git a/gfx/x11/unitxft.pas b/gfx/x11/unitxft.pas
new file mode 100644
index 00000000..2ede5a10
--- /dev/null
+++ b/gfx/x11/unitxft.pas
@@ -0,0 +1,155 @@
+{
+ fpGFX - Free Pascal Graphics Library
+ Copyright (C) 2006 by Graeme Geldenhuys
+ member of the fpGFX development team.
+
+ Xft interface functions
+
+ See the file COPYING.fpGFX, included in this distribution,
+ for details about the copyright.
+
+ This program 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.
+
+ **********************************************************************}
+
+
+unit unitxft;
+
+{$mode objfpc}{$H+}
+
+{$linklib Xft}
+
+interface
+uses
+ Classes
+ ,SysUtils
+ ,X
+ ,XLib
+ ,Xutil
+ ;
+
+
+type
+ TPicture = longword;
+
+ TXftDraw = record
+ dummy : Pointer;
+ end;
+ PXftDraw = ^TXftDraw;
+
+ TXftFont = record
+ ascent : integer;
+ descent : integer;
+ height : integer;
+ max_advance_width : integer;
+ ptr1 : Pointer; // charset
+ ptr2 : Pointer; // pattern
+ end;
+ PXftFont = ^TXftFont;
+
+ TXRenderColor = record
+ red : word;
+ green : word;
+ blue : word;
+ alpha : word;
+ end;
+
+ TXftColor = record
+ pixel : longword;
+ color : TXRenderColor;
+ end;
+
+ TXGlyphInfo = packed record
+ width : word;
+ height : word;
+ x : smallint;
+ y : smallint;
+ xOff : smallint;
+ yOff : smallint;
+ end;
+
+ TFcPattern = record
+ dummy : integer;
+ end;
+
+ PFcPattern = ^TFcPattern;
+ PPFcPattern = ^PFcPattern;
+
+ TFcFontSet = packed record
+ nfont : integer;
+ sfont : integer;
+ fonts : PPFcPattern;
+ end;
+ PFcFontSet = ^TFcFontSet;
+
+const
+ FC_FAMILY : PChar = 'family';
+ FC_SIZE : PChar = 'size';
+ FC_SCALABLE : PChar = 'scalable';
+
+ FcTypeVoid = 0;
+ FcTypeInteger = 1;
+ FcTypeDouble = 2;
+ FcTypeString = 3;
+ FcTypeBool = 4;
+ FcTypeMatrix = 5;
+ FcTypeCharSet = 6;
+ FcTypeFTFace = 7;
+ FcTypeLangSet = 8;
+
+function XftDrawCreate(display : PXDisplay; win : TXID; vis : PVisual; colorm : longint) : PXftDraw; cdecl;
+procedure XftDrawChange(xftd : PXftDraw; win : TXID); cdecl;
+procedure XftDrawDestroy(draw : PXftDraw); cdecl;
+
+function XftDrawPicture(draw : PXftDraw) : TPicture; cdecl;
+
+function XftFontOpenName(display : PXDisplay; scr : integer; par3 : PChar) : PXftFont; cdecl;
+procedure XftFontClose(display : PXDisplay; fnt : PXftFont); cdecl;
+
+procedure XftDrawString8(draw : PXftDraw; var col : TXftColor; fnt : PXftFont; x,y : integer; txt : PChar; len : integer); cdecl;
+procedure XftDrawString16(draw : PXftDraw; var col : TXftColor; fnt : PXftFont; x,y : integer; txt : PChar; len : integer); cdecl;
+
+procedure XftTextExtents16(display : PXDisplay; fnt : PXftFont; txt : PChar; len : integer; var extents : TXGlyphInfo); cdecl;
+procedure XftTextExtents8(display : PXDisplay; fnt : PXftFont; txt : PChar; len : integer; var extents : TXGlyphInfo); cdecl;
+
+//function XftGlyphExists(display : PXDisplay; fnt : PXftFont; ch : integer) : longbool; cdecl;
+
+//procedure XftDrawSetClipRectangles(draw : PXftDraw; xorigin, yorigin : integer; rect : PXRectangle; rnum : integer); cdecl;
+
+procedure XftDrawSetClip(draw : PXftDraw; rg : TRegion); cdecl;
+
+function XftListFonts(display : PXDisplay; screen : integer; params : array of const) : PFcFontSet; cdecl;
+function XftNameUnparse(pat : PFcPattern; dest : PChar; destlen : integer) : boolean; cdecl;
+procedure FcFontSetDestroy(fsp : PFcFontSet); cdecl;
+
+implementation
+
+function XftDrawCreate(display : PXDisplay; win : TXID; vis : PVisual; colorm : longint) : PXftDraw; cdecl; external;
+procedure XftDrawChange(xftd : PXftDraw; win : TXID); cdecl; external;
+procedure XftDrawDestroy(draw : PXftDraw); cdecl; external;
+
+function XftDrawPicture(draw : PXftDraw) : TPicture; cdecl; external;
+
+function XftFontOpenName(display : PXDisplay; scr : integer; par3 : PChar) : PXftFont; cdecl; external;
+procedure XftFontClose(display : PXDisplay; fnt : PXftFont); cdecl; external;
+
+procedure XftDrawString8(draw : PXftDraw; var col : TXftColor; fnt : PXftFont; x,y : integer; txt : PChar; len : integer); cdecl; external;
+procedure XftDrawString16(draw : PXftDraw; var col : TXftColor; fnt : PXftFont; x,y : integer; txt : PChar; len : integer); cdecl; external;
+
+procedure XftTextExtents16(display : PXDisplay; fnt : PXftFont; txt : PChar; len : integer; var extents : TXGlyphInfo); cdecl; external;
+procedure XftTextExtents8(display : PXDisplay; fnt : PXftFont; txt : PChar; len : integer; var extents : TXGlyphInfo); cdecl; external;
+
+//function XftGlyphExists(display : PXDisplay; fnt : PXftFont; ch : integer) : longbool; cdecl; external;
+
+//procedure XftDrawSetClipRectangles(draw : PXftDraw; xorigin, yorigin : integer; rect : PXRectangle; rnum : integer); cdecl; external;
+
+procedure XftDrawSetClip(draw : PXftDraw; rg : TRegion); cdecl; external;
+
+function XftListFonts(display : PXDisplay; screen : integer; params : array of const) : PFcFontSet; cdecl; external;
+function XftNameUnparse(pat : PFcPattern; dest : PChar; destlen : integer) : boolean; cdecl; external;
+procedure FcFontSetDestroy(fsp : PFcFontSet); cdecl; external;
+
+end.
+