diff options
Diffstat (limited to 'gfx/x11')
-rw-r--r-- | gfx/x11/Makefile | 1985 | ||||
-rw-r--r-- | gfx/x11/Makefile.fpc | 27 | ||||
-rw-r--r-- | gfx/x11/fpgfxpackage.lpk | 72 | ||||
-rw-r--r-- | gfx/x11/fpgfxpackage.pas | 14 | ||||
-rw-r--r-- | gfx/x11/gfx_x11.pas | 1865 | ||||
-rw-r--r-- | gfx/x11/gfxinterface.pas | 41 | ||||
-rw-r--r-- | gfx/x11/unitxft.pas | 155 |
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. + |