From 0652b7fee1c050e754b8bfe89024d33c16e25eb6 Mon Sep 17 00:00:00 2001 From: Kibum Kim Date: Sat, 7 Jan 2012 00:49:22 +0900 Subject: [PATCH] Git init --- COPYING | 20 + Makefile.am | 36 ++ README | 27 ++ autogen.sh | 12 + configure.ac | 49 +++ debian/changelog | 17 + debian/compat | 1 + debian/control | 34 ++ debian/libxgesture-dev.install | 5 + debian/libxgesture0.install | 1 + debian/rules | 107 +++++ debian/xsfbs/repack.sh | 32 ++ debian/xsfbs/xsfbs.mk | 276 +++++++++++++ debian/xsfbs/xsfbs.sh | 622 ++++++++++++++++++++++++++++ include/X11/extensions/gesture.h | 195 +++++++++ src/Makefile.am | 20 + src/gesture.c | 848 +++++++++++++++++++++++++++++++++++++++ xgesture.pc.in | 11 + 18 files changed, 2313 insertions(+) create mode 100755 COPYING create mode 100644 Makefile.am create mode 100644 README create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100755 debian/changelog create mode 100644 debian/compat create mode 100755 debian/control create mode 100755 debian/libxgesture-dev.install create mode 100644 debian/libxgesture0.install create mode 100755 debian/rules create mode 100644 debian/xsfbs/repack.sh create mode 100644 debian/xsfbs/xsfbs.mk create mode 100644 debian/xsfbs/xsfbs.sh create mode 100755 include/X11/extensions/gesture.h create mode 100644 src/Makefile.am create mode 100755 src/gesture.c create mode 100644 xgesture.pc.in diff --git a/COPYING b/COPYING new file mode 100755 index 0000000..fb25fee --- /dev/null +++ b/COPYING @@ -0,0 +1,20 @@ +Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without +fee, provided that the above copyright notice appear in all copies +and that both that copyright notice and this permission notice +appear in supporting documentation, and that the name of Red Hat +not be used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. Red +Hat makes no representations about the suitability of this software +for any purpose. It is provided "as is" without express or implied +warranty. + +THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..df223cb --- /dev/null +++ b/Makefile.am @@ -0,0 +1,36 @@ +# boiler plate +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Red Hat not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Red Hat makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +SUBDIRS = src + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = xgesture.pc + +MAINTAINERCLEANFILES = ChangeLog INSTALL + +.PHONY: ChangeLog INSTALL + +INSTALL: + $(INSTALL_CMD) + +ChangeLog: + $(CHANGELOG_CMD) + +dist-hook: ChangeLog INSTALL diff --git a/README b/README new file mode 100644 index 0000000..afa3b4c --- /dev/null +++ b/README @@ -0,0 +1,27 @@ +AppleWM is a simple library designed to interface with the Apple-WM extension. +This extension allows X window managers to better interact with +the Mac OS X Aqua user interface when running X11 in a rootless mode. + +All questions regarding this software should be directed at the +Xorg mailing list: + + http://lists.freedesktop.org/mailman/listinfo/xorg + +Please submit bug reports to the Xorg bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=xorg + +The master development code repository can be found at: + + git://anongit.freedesktop.org/git/xorg/lib/libAppleWM + + http://cgit.freedesktop.org/xorg/lib/libAppleWM + +For patch submission instructions, see: + + http://www.x.org/wiki/Development/Documentation/SubmittingPatches + +For more information on the git code manager, see: + + http://wiki.x.org/wiki/GitPage + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..904cd67 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,12 @@ +#! /bin/sh + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir + +autoreconf -v --install || exit 1 +cd $ORIGDIR || exit $? + +$srcdir/configure --enable-maintainer-mode "$@" diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..07d19ed --- /dev/null +++ b/configure.ac @@ -0,0 +1,49 @@ +# boilerplate +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Red Hat not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Red Hat makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +# Initialize Autoconf +AC_PREREQ([2.60]) +AC_INIT([libxgesture], [0.1.0], + [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libxgesture]) +AC_CONFIG_SRCDIR([Makefile.am]) +AC_CONFIG_HEADERS([config.h]) + +# Initialize Automake +AM_INIT_AUTOMAKE([foreign dist-bzip2]) +AM_MAINTAINER_MODE + +# Initialize libtool +AC_PROG_LIBTOOL + +# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS +m4_ifndef([XORG_MACROS_VERSION], + [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.8) +XORG_DEFAULT_OPTIONS +XORG_CHECK_MALLOC_ZERO + +# Obtain compiler/linker options for depedencies +PKG_CHECK_MODULES(GESTURE, x11 xext xextproto [gestureproto >= 0.1.0]) + +AC_CONFIG_FILES([Makefile + src/Makefile + xgesture.pc]) +AC_OUTPUT diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..1901869 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,17 @@ +libxgesture (0.1.0-2) unstable; urgency=low + + * Update debian/control + - Add x11proto-gesture-dev in libxgesture-dev's dependency section + * Git: 165.213.180.234:slp/pkgs/xorg/lib/libxgesture + * Tag: libxgesture_0.1.0-2 + + -- Sung-Jin Park Thu, 03 Nov 2011 14:00:05 +0900 + +libxgesture (0.1.0-1) unstable; urgency=low + + * Initial version + * Git: 165.213.180.234:slp/pkgs/xorg/lib/libxgesture + * Tag: libxgesture_0.1.0-1 + + -- Sung-Jin Park Tue, 18 Oct 2011 16:47:07 +0900 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..c0969f1 --- /dev/null +++ b/debian/control @@ -0,0 +1,34 @@ +Source: libxgesture +Section: x11 +Priority: optional +Maintainer: Sung-Jin Park , Sangjin Lee +Uploaders: Sung-Jin Park +Build-Depends: debhelper (>= 5.0.0), x11proto-core-dev (>= 7.0.13), x11proto-xext-dev (>= 7.0.3), x11proto-gesture-dev (>= 0.1.0), libx11-dev (>= 2:1.3.3-2), libxext-dev (>= 2:1.1.1-3), xutils-dev (>= 1:7.4+4) +#Build-Depends: debhelper (>= 5.0.0), x11proto-core-dev (>= 7.0.13), x11proto-xext-dev (>= 7.0.3), x11proto-gesture-dev (>= 0.1.0), libx11-dev (>= 2:1.3.3-2), libxext-dev (>= 2:1.1.1-3), xmlto, asciidoc (>= 8.4.5), pkg-config, quilt, xutils-dev (>= 1:7.4+4), automake, libtool +Standards-Version: 3.8.4 + +Package: libxgesture0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: X11 Gesture Extension library + libXgesture provides an X Window System client interface to the X Gesture + Extension to the X protocol. + +Package: libxgesture0-dbg +Section: debug +Architecture: any +Priority: extra +Depends: ${shlibs:Depends}, ${misc:Depends}, libxgesture0 (= ${binary:Version}) +Description: X11 Gesture Extension library (debug package) + libXgesture provides an X Window System client interface to the X Gesture + Extension to the X protocol. + +Package: libxgesture-dev +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libxgesture0 (= ${binary:Version}), libx11-dev, libxext-dev, x11proto-gesture-dev +Description: X11 Gesture Extension library (development headers) + libXgesture provides an X Window System client interface to the X Gesture + Extension to the X protocol. + diff --git a/debian/libxgesture-dev.install b/debian/libxgesture-dev.install new file mode 100755 index 0000000..9255c97 --- /dev/null +++ b/debian/libxgesture-dev.install @@ -0,0 +1,5 @@ +usr/lib/libXgesture.a +usr/lib/libXgesture.so +usr/lib/libXgesture.la +usr/lib/pkgconfig/xgesture.pc +usr/include/X11/extensions/ diff --git a/debian/libxgesture0.install b/debian/libxgesture0.install new file mode 100644 index 0000000..a04f422 --- /dev/null +++ b/debian/libxgesture0.install @@ -0,0 +1 @@ +usr/lib/libXgesture.so.* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..f911712 --- /dev/null +++ b/debian/rules @@ -0,0 +1,107 @@ +#!/usr/bin/make -f +# debian/rules for the Debian libxgesture package. +# Copyright © 2004 Scott James Remnant +# Copyright © 2005 Daniel Stone +# Copyright © 2005 David Nusinow + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# set this to the name of the main shlib's binary package +PACKAGE = libxgesture0 + +include debian/xsfbs/xsfbs.mk + +LDFLAGS += -Wl,--hash-style=both -Wl,--as-needed +CFLAGS = -Wall -g + +ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) + NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) + MAKEFLAGS += -j$(NUMJOBS) +endif + +DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE)) + confflags += --build=$(DEB_HOST_GNU_TYPE) +else + confflags += --build=$(DEB_HOST_GNU_TYPDEB_HOST_GNU_TYPEE) --host=$(DEB_HOST_GNU_TYPE) +# confflags += --build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) +endif + +#configure: $(STAMP_DIR)/patch +configure: + autoreconf -vfi + +obj-$(DEB_BUILD_GNU_TYPE)/config.status: configure + mkdir -p obj-$(DEB_BUILD_GNU_TYPE) + cd obj-$(DEB_BUILD_GNU_TYPE) && \ + ../configure --prefix=/usr --mandir=\$${prefix}/share/man \ + --infodir=\$${prefix}/share/info $(confflags) \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" + + +build: build-stamp +build-stamp: obj-$(DEB_BUILD_GNU_TYPE)/config.status + dh_testdir + cd obj-$(DEB_BUILD_GNU_TYPE) && $(MAKE) + + touch build-stamp + +clean: xsfclean + dh_testdir + dh_testroot + rm -f build-stamp + + rm -f config.cache config.log config.status + rm -f */config.cache */config.log */config.status + rm -f conftest* */conftest* + rm -rf autom4te.cache */autom4te.cache + rm -rf obj-* + rm -f $$(find -name Makefile.in) + rm -f INSTALL compile config.guess config.sub configure config.h.in + rm -f depcomp install-sh ltmain.sh missing aclocal.m4 mkinstalldirs + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + cd obj-$(DEB_BUILD_GNU_TYPE) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + +# dh_installdocs + dh_install --sourcedir=debian/tmp --list-missing --exclude=usr/share/man/man3 +# dh_installman +# dh_installchangelogs ChangeLog + dh_link + dh_strip --dbg-package=$(PACKAGE)-dbg + dh_compress + dh_fixperms + dh_makeshlibs -V'libxgesture0 (>= 0.1.0)' + dh_shlibdeps + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture-independent files here. +binary-indep: build install +# Nothing to do + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/debian/xsfbs/repack.sh b/debian/xsfbs/repack.sh new file mode 100644 index 0000000..5935cc9 --- /dev/null +++ b/debian/xsfbs/repack.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +set -e + +if ! [ -d debian/prune ]; then + exit 0 +fi + +if [ "x$1" != x--upstream-version ]; then + exit 1 +fi + +version="$2" +filename="$3" + +if [ -z "$version" ] || ! [ -f "$filename" ]; then + exit 1 +fi + +dir="$(pwd)" +tempdir="$(mktemp -d)" + +cd "$tempdir" +tar xf "$dir/$filename" +cat "$dir"/debian/prune/* | while read file; do rm -f */$file; done + +tar czf "$dir/$filename" * +cd "$dir" +rm -rf "$tempdir" +echo "Done pruning upstream tarball" + +exit 0 diff --git a/debian/xsfbs/xsfbs.mk b/debian/xsfbs/xsfbs.mk new file mode 100644 index 0000000..5e16b10 --- /dev/null +++ b/debian/xsfbs/xsfbs.mk @@ -0,0 +1,276 @@ +#!/usr/bin/make -f + +# Debian X Strike Force Build System (XSFBS): Make portion + +# Copyright 1996 Stephen Early +# Copyright 1997 Mark Eichin +# Copyright 1998-2005, 2007 Branden Robinson +# Copyright 2005 David Nusinow +# +# Licensed under the GNU General Public License, version 2. See the file +# /usr/share/common-licenses/GPL or . + +# Originally by Stephen Early +# Modified by Mark W. Eichin +# Modified by Adam Heath +# Modified by Branden Robinson +# Modified by Fabio Massimo Di Nitto +# Modified by David Nusinow +# Acknowledgements to Manoj Srivastava. + +# Pass $(DH_OPTIONS) into the environment for debhelper's benefit. +export DH_OPTIONS + +# force quilt to not use ~/.quiltrc and to use debian/patches +QUILT = QUILT_PATCHES=debian/patches quilt --quiltrc /dev/null + +# Set up parameters for the upstream build environment. + +# Determine (source) package name from Debian changelog. +SOURCE_NAME:=$(shell dpkg-parsechangelog -ldebian/changelog \ + | grep '^Source:' | awk '{print $$2}') + +# Determine package version from Debian changelog. +SOURCE_VERSION:=$(shell dpkg-parsechangelog -ldebian/changelog \ + | grep '^Version:' | awk '{print $$2}') + +# Determine upstream version number. +UPSTREAM_VERSION:=$(shell echo $(SOURCE_VERSION) | sed 's/-.*//') + +# Determine the source version without the epoch for make-orig-tar-gz +NO_EPOCH_VER:=$(shell echo $(UPSTREAM_VERSION) | sed 's/^.://') + +# Figure out who's building this package. +BUILDER:=$(shell echo $${DEBEMAIL:-$${EMAIL:-$$(echo $$LOGNAME@$$(cat /etc/mailname 2>/dev/null))}}) + +# Find out if this is an official build; an official build has nothing but +# digits, dots, and/or the codename of a release in the Debian part of the +# version number. Anything else indicates an unofficial build. +OFFICIAL_BUILD:=$(shell VERSION=$(SOURCE_VERSION); if ! expr "$$(echo $${VERSION\#\#*-} | sed 's/\(woody\|sarge\|etch\|lenny\)//g')" : ".*[^0-9.].*" >/dev/null 2>&1; then echo yes; fi) + +# Set up parameters for the Debian build environment. + +# Determine our architecture. +BUILD_ARCH:=$(shell dpkg-architecture -qDEB_BUILD_ARCH) +# Work around some old-time dpkg braindamage. +BUILD_ARCH:=$(subst i486,i386,$(BUILD_ARCH)) +# The DEB_HOST_ARCH variable may be set per the Debian cross-compilation policy. +ifdef DEB_HOST_ARCH + ARCH:=$(DEB_HOST_ARCH) +else + # dpkg-cross sets the ARCH environment variable; if set, use it. + ifdef ARCH + ARCH:=$(ARCH) + else + ARCH:=$(BUILD_ARCH) + endif +endif + +# $(STAMP_DIR) houses stamp files for complex targets. +STAMP_DIR:=stampdir + +# $(DEBTREEDIR) is where all install rules are told (via $(DESTDIR)) to place +# their files. +DEBTREEDIR:=$(CURDIR)/debian/tmp + +# All "important" targets have four lines: +# 1) A target name that is invoked by a package-building tool or the user. +# This consists of a dependency on a "$(STAMP_DIR)/"-prefixed counterpart. +# 2) A line delcaring 1) as a phony target (".PHONY:"). +# 3) A "$(STAMP_DIR)/"-prefixed target which does the actual work, and may +# depend on other targets. +# 4) A line declaring 3) as a member of the $(stampdir_targets) variable; the +# "$(STAMP_DIR)/" prefix is omitted. +# +# This indirection is needed so that the "stamp" files that signify when a rule +# is done can be located in a separate "stampdir". Recall that make has no way +# to know when a goal has been met for a phony target (like "build" or +# "install"). +# +# At the end of each "$(STAMP_DIR)/" target, be sure to run the command ">$@" +# so that the target will not be run again. Removing the file will make Make +# run the target over. + +# All phony targets should be declared as dependencies of .PHONY, even if they +# do not have "($STAMP_DIR)/"-prefixed counterparts. + +# Define a harmless default rule to keep things from going nuts by accident. +.PHONY: default +default: + +# Set up the $(STAMP_DIR) directory. +.PHONY: stampdir +stampdir_targets+=stampdir +stampdir: $(STAMP_DIR)/stampdir +$(STAMP_DIR)/stampdir: + mkdir $(STAMP_DIR) + >$@ + +# Set up the package build directory as quilt expects to find it. +.PHONY: prepare +stampdir_targets+=prepare +prepare: $(STAMP_DIR)/prepare +$(STAMP_DIR)/prepare: $(STAMP_DIR)/log $(STAMP_DIR)/genscripts + >$@ + +.PHONY: log +stampdir_targets+=log +log: $(STAMP_DIR)/log +$(STAMP_DIR)/log: $(STAMP_DIR)/stampdir + mkdir -p $(STAMP_DIR)/log + +# Apply all patches to the upstream source. +.PHONY: patch +stampdir_targets+=patch +patch: $(STAMP_DIR)/patch +$(STAMP_DIR)/patch: $(STAMP_DIR)/prepare + if ! [ `which quilt` ]; then \ + echo "Couldn't find quilt. Please install it or add it to the build-depends for this package."; \ + exit 1; \ + fi; \ + if $(QUILT) next >/dev/null 2>&1; then \ + echo -n "Applying patches..."; \ + if $(QUILT) push -a -v >$(STAMP_DIR)/log/patch 2>&1; then \ + cat $(STAMP_DIR)/log/patch; \ + echo "successful."; \ + else \ + cat $(STAMP_DIR)/log/patch; \ + echo "failed! (check $(STAMP_DIR)/log/patch for details)"; \ + exit 1; \ + fi; \ + else \ + echo "No patches to apply"; \ + fi; \ + >$@ + +# Revert all patches to the upstream source. +.PHONY: unpatch +unpatch: $(STAMP_DIR)/log + rm -f $(STAMP_DIR)/patch + @echo -n "Unapplying patches..."; \ + if $(QUILT) applied >/dev/null 2>/dev/null; then \ + if $(QUILT) pop -a -v >$(STAMP_DIR)/log/unpatch 2>&1; then \ + cat $(STAMP_DIR)/log/unpatch; \ + echo "successful."; \ + else \ + cat $(STAMP_DIR)/log/unpatch; \ + echo "failed! (check $(STAMP_DIR)/log/unpatch for details)"; \ + exit 1; \ + fi; \ + else \ + echo "nothing to do."; \ + fi + +# Clean the generated maintainer scripts. +.PHONY: cleanscripts +cleanscripts: + rm -f $(STAMP_DIR)/genscripts + rm -f debian/*.config \ + debian/*.postinst \ + debian/*.postrm \ + debian/*.preinst \ + debian/*.prerm + +# Clean the package build tree. +.PHONY: xsfclean +xsfclean: cleanscripts unpatch + dh_testdir + rm -rf .pc + rm -rf $(STAMP_DIR) + dh_clean + +# Remove files from the upstream source tree that we don't need, or which have +# licensing problems. It must be run before creating the .orig.tar.gz. +# +# Note: This rule is for Debian package maintainers' convenience, and is not +# needed for conventional build scenarios. +.PHONY: prune-upstream-tree +prune-upstream-tree: + # Ensure we're in the correct directory. + dh_testdir + grep -rvh '^#' debian/prune/ | xargs --no-run-if-empty rm -rf + +# Verify that there are no offsets or fuzz in the patches we apply. +# +# Note: This rule is for Debian package maintainers' convenience, and is not +# needed for conventional build scenarios. +.PHONY: patch-audit +patch-audit: prepare unpatch + @echo -n "Auditing patches..."; \ + >$(STAMP_DIR)/log/patch; \ + FUZZY=; \ + while [ -n "$$($(QUILT) next)" ]; do \ + RESULT=$$($(QUILT) push -v | tee -a $(STAMP_DIR)/log/patch | grep ^Hunk | sed 's/^Hunk.*\(succeeded\|FAILED\).*/\1/');\ + case "$$RESULT" in \ + succeeded) \ + echo "fuzzy patch: $$($(QUILT) top)" \ + | tee -a $(STAMP_DIR)/log/$$($(QUILT) top); \ + FUZZY=yes; \ + ;; \ + FAILED) \ + echo "broken patch: $$($(QUILT) next)" \ + | tee -a $(STAMP_DIR)/log/$$($(QUILT) next); \ + exit 1; \ + ;; \ + esac; \ + done; \ + if [ -n "$$FUZZY" ]; then \ + echo "there were fuzzy patches; please fix."; \ + exit 1; \ + else \ + echo "done."; \ + fi + +# Generate the maintainer scripts. +.PHONY: genscripts +stampdir_targets+=genscripts +genscripts: $(STAMP_DIR)/genscripts +$(STAMP_DIR)/genscripts: $(STAMP_DIR)/stampdir + for FILE in debian/*.config.in \ + debian/*.postinst.in \ + debian/*.postrm.in \ + debian/*.preinst.in \ + debian/*.prerm.in; do \ + if [ -e "$$FILE" ]; then \ + MAINTSCRIPT=$$(echo $$FILE | sed 's/.in$$//'); \ + sed -n '1,/^#INCLUDE_SHELL_LIB#$$/p' <$$FILE \ + | sed -e '/^#INCLUDE_SHELL_LIB#$$/d' >$$MAINTSCRIPT.tmp; \ + cat debian/xsfbs/xsfbs.sh >>$$MAINTSCRIPT.tmp; \ + sed -n '/^#INCLUDE_SHELL_LIB#$$/,$$p' <$$FILE \ + | sed -e '/^#INCLUDE_SHELL_LIB#$$/d' >>$$MAINTSCRIPT.tmp; \ + sed -e 's/@SOURCE_VERSION@/$(SOURCE_VERSION)/' \ + -e 's/@OFFICIAL_BUILD@/$(OFFICIAL_BUILD)/' \ + <$$MAINTSCRIPT.tmp >$$MAINTSCRIPT; \ + rm $$MAINTSCRIPT.tmp; \ + fi; \ + done + # Validate syntax of generated shell scripts. + #sh debian/scripts/validate-posix-sh debian/*.config \ + # debian/*.postinst \ + # debian/*.postrm \ + # debian/*.preinst \ + # debian/*.prerm + >$@ + +SERVERMINVERS = $(shell cat /usr/share/xserver-xorg/serverminver 2>/dev/null) +VIDEOABI = $(shell cat /usr/share/xserver-xorg/videoabiver 2>/dev/null) +INPUTABI = $(shell cat /usr/share/xserver-xorg/inputabiver 2>/dev/null) +SERVER_DEPENDS = xserver-xorg-core (>= $(SERVERMINVERS)) +VIDDRIVER_PROVIDES = xserver-xorg-video-$(VIDEOABI) +INPDRIVER_PROVIDES = xserver-xorg-input-$(INPUTABI) +ifeq ($(PACKAGE),) +PACKAGE=$(shell awk '/^Package:/ { print $$2; exit }' < debian/control) +endif + +.PHONY: serverabi +serverabi: install +ifeq ($(SERVERMINVERS),) + @echo error: xserver-xorg-dev needs to be installed + @exit 1 +else + echo "xserver:Depends=$(SERVER_DEPENDS)" >> debian/$(PACKAGE).substvars + echo "xviddriver:Provides=$(VIDDRIVER_PROVIDES)" >> debian/$(PACKAGE).substvars + echo "xinpdriver:Provides=$(INPDRIVER_PROVIDES)" >> debian/$(PACKAGE).substvars +endif + +# vim:set noet ai sts=8 sw=8 tw=0: diff --git a/debian/xsfbs/xsfbs.sh b/debian/xsfbs/xsfbs.sh new file mode 100644 index 0000000..813fd8d --- /dev/null +++ b/debian/xsfbs/xsfbs.sh @@ -0,0 +1,622 @@ +# This is the X Strike Force shell library for X Window System package +# maintainer scripts. It serves to define shell functions commonly used by +# such packages, and performs some error checking necessary for proper operation +# of those functions. By itself, it does not "do" much; the maintainer scripts +# invoke the functions defined here to accomplish package installation and +# removal tasks. + +# If you are reading this within a Debian package maintainer script (e.g., +# /var/lib/dpkg/info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can +# skip past this library by scanning forward in this file to the string +# "GOBSTOPPER". + +SOURCE_VERSION=@SOURCE_VERSION@ +OFFICIAL_BUILD=@OFFICIAL_BUILD@ + +# Use special abnormal exit codes so that problems with this library are more +# easily tracked down. +SHELL_LIB_INTERNAL_ERROR=86 +SHELL_LIB_THROWN_ERROR=74 +SHELL_LIB_USAGE_ERROR=99 + +# old -> new variable names +if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then + DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE" +fi +if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then + DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF" +fi + +# initial sanity checks +if [ -z "$THIS_PACKAGE" ]; then + cat >&2 < on the World Wide Web for +instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the +"doc-debian" package, or install the "reportbug" package and use the command of +the same name to file a report against version $SOURCE_VERSION of this package. +EOF + exit $SHELL_LIB_USAGE_ERROR +fi + +if [ -z "$THIS_SCRIPT" ]; then + cat >&2 < on the World Wide Web for +instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the +"doc-debian" package, or install the "reportbug" package and use the command of +the same name to file a report against version $SOURCE_VERSION of the +"$THIS_PACKAGE" package. +EOF + exit $SHELL_LIB_USAGE_ERROR +fi + +if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then + RECONFIGURE="true" +else + RECONFIGURE= +fi + +if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then + FIRSTINST="yes" +fi + +if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then + UPGRADE="yes" +fi + +trap "message;\ + message \"Received signal. Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\ + message;\ + exit 1" HUP INT QUIT TERM + +reject_nondigits () { + # syntax: reject_nondigits [ operand ... ] + # + # scan operands (typically shell variables whose values cannot be trusted) for + # characters other than decimal digits and barf if any are found + while [ -n "$1" ]; do + # does the operand contain anything but digits? + if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then + # can't use die(), because it wraps message() which wraps this function + echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \ + "possibly malicious garbage \"$1\"" >&2 + exit $SHELL_LIB_THROWN_ERROR + fi + shift + done +} + +reject_unlikely_path_chars () { + # syntax: reject_unlikely_path_chars [ operand ... ] + # + # scan operands (typically shell variables whose values cannot be trusted) for + # characters unlikely to be seen in a path and which the shell might + # interpret and barf if any are found + while [ -n "$1" ]; do + # does the operand contain any funny characters? + if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then + # can't use die(), because I want to avoid forward references + echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \ + "encountered possibly malicious garbage \"$1\"" >&2 + exit $SHELL_LIB_THROWN_ERROR + fi + shift + done +} + +# Query the terminal to establish a default number of columns to use for +# displaying messages to the user. This is used only as a fallback in the +# event the COLUMNS variable is not set. ($COLUMNS can react to SIGWINCH while +# the script is running, and this cannot, only being calculated once.) +DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true +if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then + DEFCOLUMNS=80 +fi + +message () { + # pretty-print messages of arbitrary length + reject_nondigits "$COLUMNS" + echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2 +} + +observe () { + # syntax: observe message ... + # + # issue observational message suitable for logging someday when support for + # it exists in dpkg + if [ -n "$DEBUG_XORG_PACKAGE" ]; then + message "$THIS_PACKAGE $THIS_SCRIPT note: $*" + fi +} + +warn () { + # syntax: warn message ... + # + # issue warning message suitable for logging someday when support for + # it exists in dpkg; also send to standard error + message "$THIS_PACKAGE $THIS_SCRIPT warning: $*" +} + +die () { + # syntax: die message ... + # + # exit script with error message + message "$THIS_PACKAGE $THIS_SCRIPT error: $*" + exit $SHELL_LIB_THROWN_ERROR +} + +internal_error () { + # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message + message "internal error: $*" + if [ -n "$OFFICIAL_BUILD" ]; then + message "Please report a bug in the $THIS_SCRIPT script of the" \ + "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \ + "Tracking System. Include all messages above that mention the" \ + "$THIS_PACKAGE package. Visit " \ + " on the World Wide Web for" \ + "instructions, read the file" \ + "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \ + "package, or install the reportbug package and use the command of" \ + "the same name to file a report." + fi + exit $SHELL_LIB_INTERNAL_ERROR +} + +usage_error () { + message "usage error: $*" + message "Please report a bug in the $THIS_SCRIPT script of the" \ + "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \ + "Tracking System. Include all messages above that mention the" \ + "$THIS_PACKAGE package. Visit " \ + " on the World Wide Web for" \ + "instructions, read the file" \ + "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \ + "package, or install the reportbug package and use the command of" \ + "the same name to file a report." + exit $SHELL_LIB_USAGE_ERROR +} + +font_update () { + # run $UPDATECMDS in $FONTDIRS + + local dir cmd shortcmd x_font_dir_prefix + + x_font_dir_prefix="/usr/share/fonts/X11" + + if [ -z "$UPDATECMDS" ]; then + usage_error "font_update() called but \$UPDATECMDS not set" + fi + if [ -z "$FONTDIRS" ]; then + usage_error "font_update() called but \$FONTDIRS not set" + fi + + reject_unlikely_path_chars "$UPDATECMDS" + reject_unlikely_path_chars "$FONTDIRS" + + for dir in $FONTDIRS; do + if [ -d "$x_font_dir_prefix/$dir" ]; then + for cmd in $UPDATECMDS; do + if which "$cmd" > /dev/null 2>&1; then + shortcmd=${cmd##*/} + observe "running $shortcmd in $dir font directory" + cmd_opts= + if [ "$shortcmd" = "update-fonts-alias" ]; then + cmd_opts=--x11r7-layout + fi + if [ "$shortcmd" = "update-fonts-dir" ]; then + cmd_opts=--x11r7-layout + fi + if [ "$shortcmd" = "update-fonts-scale" ]; then + cmd_opts=--x11r7-layout + fi + $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \ + "failed; font directory data may not" \ + "be up to date" + else + warn "$cmd not found; not updating corresponding $dir font" \ + "directory data" + fi + done + else + warn "$dir is not a directory; not updating font directory data" + fi + done +} + +remove_conffile_prepare () { + # syntax: remove_conffile_prepare filename official_md5sum ... + # + # Check a conffile "filename" against a list of canonical MD5 checksums. + # If the file's current MD5 checksum matches one of the "official_md5sum" + # operands provided, then prepare the conffile for removal from the system. + # We defer actual deletion until the package is configured so that we can + # roll this operation back if package installation fails. + # + # Call this function from a preinst script in the event $1 is "upgrade" or + # "install" and verify $2 to ensure the package is being upgraded from a + # version (or installed over a version removed-but-not-purged) prior to the + # one in which the conffile was obsoleted. + + local conffile current_checksum + + # validate arguments + if [ $# -lt 2 ]; then + usage_error "remove_conffile_prepare() called with wrong number of" \ + "arguments; expected at least 2, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + conffile="$1" + shift + + # does the conffile even exist? + if [ -e "$conffile" ]; then + # calculate its checksum + current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//') + # compare it to each supplied checksum + while [ -n "$1" ]; do + if [ "$current_checksum" = "$1" ]; then + # we found a match; move the confffile and stop looking + observe "preparing obsolete conffile $conffile for removal" + mv "$conffile" "$conffile.$THIS_PACKAGE-tmp" + break + fi + shift + done + fi +} + +remove_conffile_lookup () { + # syntax: remove_conffile_lookup package filename + # + # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal + # if it matches the actual file's md5sum. + # + # Call this function when you would call remove_conffile_prepare but only + # want to check against dpkg's status database instead of known checksums. + + local package conffile old_md5sum + + # validate arguments + if [ $# -ne 2 ]; then + usage_error "remove_conffile_lookup() called with wrong number of" \ + "arguments; expected 1, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + package="$1" + conffile="$2" + + if ! [ -e "$conffile" ]; then + return + fi + old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \ + awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')" + if [ -n "$old_md5sum" ]; then + remove_conffile_prepare "$conffile" "$old_md5sum" + fi +} + +remove_conffile_commit () { + # syntax: remove_conffile_commit filename + # + # Complete the removal of a conffile "filename" that has become obsolete. + # + # Call this function from a postinst script after having used + # remove_conffile_prepare() in the preinst. + + local conffile + + # validate arguments + if [ $# -ne 1 ]; then + usage_error "remove_conffile_commit() called with wrong number of" \ + "arguments; expected 1, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + conffile="$1" + + # if the temporary file created by remove_conffile_prepare() exists, remove it + if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then + observe "committing removal of obsolete conffile $conffile" + rm "$conffile.$THIS_PACKAGE-tmp" + fi +} + +remove_conffile_rollback () { + # syntax: remove_conffile_rollback filename + # + # Roll back the removal of a conffile "filename". + # + # Call this function from a postrm script in the event $1 is "abort-upgrade" + # or "abort-install" is after having used remove_conffile_prepare() in the + # preinst. + + local conffile + + # validate arguments + if [ $# -ne 1 ]; then + usage_error "remove_conffile_rollback() called with wrong number of" \ + "arguments; expected 1, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + conffile="$1" + + # if the temporary file created by remove_conffile_prepare() exists, move it + # back + if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then + observe "rolling back removal of obsolete conffile $conffile" + mv "$conffile.$THIS_PACKAGE-tmp" "$conffile" + fi +} + +replace_conffile_with_symlink_prepare () { + # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \ + # official_md5sum ... + # + # Check a conffile "oldfilename" against a list of canonical MD5 checksums. + # If the file's current MD5 checksum matches one of the "official_md5sum" + # operands provided, then prepare the conffile for removal from the system. + # We defer actual deletion until the package is configured so that we can + # roll this operation back if package installation fails. Otherwise copy it + # to newfilename and let dpkg handle it through conffiles mechanism. + # + # Call this function from a preinst script in the event $1 is "upgrade" or + # "install" and verify $2 to ensure the package is being upgraded from a + # version (or installed over a version removed-but-not-purged) prior to the + # one in which the conffile was obsoleted. + + local conffile current_checksum + + # validate arguments + if [ $# -lt 3 ]; then + usage_error "replace_conffile_with_symlink_prepare() called with wrong" \ + " number of arguments; expected at least 3, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + oldconffile="$1" + shift + newconffile="$1" + shift + + remove_conffile_prepare "$_oldconffile" "$@" + # If $oldconffile still exists, then md5sums didn't match. + # Copy it to new one. + if [ -f "$oldconffile" ]; then + cp "$oldconffile" "$newconffile" + fi + +} + +replace_conffile_with_symlink_commit () { + # syntax: replace_conffile_with_symlink_commit oldfilename + # + # Complete the removal of a conffile "oldfilename" that has been + # replaced by a symlink. + # + # Call this function from a postinst script after having used + # replace_conffile_with_symlink_prepare() in the preinst. + + local conffile + + # validate arguments + if [ $# -ne 1 ]; then + usage_error "replace_conffile_with_symlink_commit() called with wrong" \ + "number of arguments; expected 1, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + conffile="$1" + + remove_conffile_commit "$conffile" +} + +replace_conffile_with_symlink_rollback () { + # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename + # + # Roll back the replacing of a conffile "oldfilename" with symlink to + # "newfilename". + # + # Call this function from a postrm script in the event $1 is "abort-upgrade" + # or "abort-install" and verify $2 to ensure the package failed to upgrade + # from a version (or install over a version removed-but-not-purged) prior + # to the one in which the conffile was obsoleted. + # You should have used replace_conffile_with_symlink_prepare() in the + # preinst. + + local conffile + + # validate arguments + if [ $# -ne 2 ]; then + usage_error "replace_conffile_with_symlink_rollback() called with wrong" \ + "number of arguments; expected 2, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + oldconffile="$1" + newconffile="$2" + + remove_conffile_rollback "$_oldconffile" + if [ -f "$newconffile" ]; then + rm "$newconffile" + fi +} + +run () { + # syntax: run command [ argument ... ] + # + # Run specified command with optional arguments and report its exit status. + # Useful for commands whose exit status may be nonzero, but still acceptable, + # or commands whose failure is not fatal to us. + # + # NOTE: Do *not* use this function with db_get or db_metaget commands; in + # those cases the return value of the debconf command *must* be checked + # before the string returned by debconf is used for anything. + + local retval + + # validate arguments + if [ $# -lt 1 ]; then + usage_error "run() called with wrong number of arguments; expected at" \ + "least 1, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + "$@" || retval=$? + + if [ ${retval:-0} -ne 0 ]; then + observe "command \"$*\" exited with status $retval" + fi +} + +make_symlink_sane () { + # syntax: make_symlink_sane symlink target + # + # Ensure that the symbolic link symlink exists, and points to target. + # + # If symlink does not exist, create it and point it at target. + # + # If symlink exists but is not a symbolic link, back it up. + # + # If symlink exists, is a symbolic link, but points to the wrong location, fix + # it. + # + # If symlink exists, is a symbolic link, and already points to target, do + # nothing. + # + # This function wouldn't be needed if ln had an -I, --idempotent option. + + # Validate arguments. + if [ $# -ne 2 ]; then + usage_error "make_symlink_sane() called with wrong number of arguments;" \ + "expected 2, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + # We could just use the positional parameters as-is, but that makes things + # harder to follow. + local symlink target + + symlink="$1" + target="$2" + + if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then + observe "link from $symlink to $target already exists" + else + observe "creating symbolic link from $symlink to $target" + mkdir -p "${target%/*}" "${symlink%/*}" + ln -s -b -S ".dpkg-old" "$target" "$symlink" + fi +} + +migrate_dir_to_symlink () { + # syntax: migrate_dir_to_symlink old_location new_location + # + # Per Debian Policy section 6.5.4, "A directory will never be replaced by a + # symbolic link to a directory or vice versa; instead, the existing state + # (symlink or not) will be left alone and dpkg will follow the symlink if + # there is one." + # + # We have to do it ourselves. + # + # This function moves the contents of old_location, a directory, into + # new_location, a directory, then makes old_location a symbolic link to + # new_location. + # + # old_location need not exist, but if it does, it must be a directory (or a + # symlink to a directory). If it is not, it is backed up. If new_location + # exists already and is not a directory, it is backed up. + # + # This function should be called from a package's preinst so that other + # packages unpacked after this one --- but before this package's postinst runs + # --- are unpacked into new_location even if their payloads contain + # old_location filespecs. + + # Validate arguments. + if [ $# -ne 2 ]; then + usage_error "migrate_dir_to_symlink() called with wrong number of" + "arguments; expected 2, got $#" + exit $SHELL_LIB_USAGE_ERROR + fi + + # We could just use the positional parameters as-is, but that makes things + # harder to follow. + local new old + + old="$1" + new="$2" + + # Is old location a symlink? + if [ -L "$old" ]; then + # Does it already point to new location? + if [ "$(readlink "$old")" = "$new" ]; then + # Nothing to do; migration has already been done. + observe "migration of $old to $new already done" + return 0 + else + # Back it up. + warn "backing up symbolic link $old as $old.dpkg-old" + mv -b "$old" "$old.dpkg-old" + fi + fi + + # Does old location exist, but is not a directory? + if [ -e "$old" ] && ! [ -d "$old" ]; then + # Back it up. + warn "backing up non-directory $old as $old.dpkg-old" + mv -b "$old" "$old.dpkg-old" + fi + + observe "migrating $old to $new" + + # Is new location a symlink? + if [ -L "$new" ]; then + # Does it point the wrong way, i.e., back to where we're migrating from? + if [ "$(readlink "$new")" = "$old" ]; then + # Get rid of it. + observe "removing symbolic link $new which points to $old" + rm "$new" + else + # Back it up. + warn "backing up symbolic link $new as $new.dpkg-old" + mv -b "$new" "$new.dpkg-old" + fi + fi + + # Does new location exist, but is not a directory? + if [ -e "$new" ] && ! [ -d "$new" ]; then + warn "backing up non-directory $new as $new.dpkg-old" + mv -b "$new" "$new.dpkg-old" + fi + + # Create new directory if it does not yet exist. + if ! [ -e "$new" ]; then + observe "creating $new" + mkdir -p "$new" + fi + + # Copy files in old location to new location. Back up any filenames that + # already exist in the new location with the extension ".dpkg-old". + observe "copying files from $old to $new" + if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then + die "error(s) encountered while copying files from $old to $new" + fi + + # Remove files at old location. + observe "removing $old" + rm -r "$old" + + # Create symlink from old location to new location. + make_symlink_sane "$old" "$new" +} + +# vim:set ai et sw=2 ts=2 tw=80: + +# GOBSTOPPER: The X Strike Force shell library ends here. diff --git a/include/X11/extensions/gesture.h b/include/X11/extensions/gesture.h new file mode 100755 index 0000000..982d9d6 --- /dev/null +++ b/include/X11/extensions/gesture.h @@ -0,0 +1,195 @@ +/************************************************************************** + +libxgesture + +Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + +Contact: Sung-Jin Park + Sangjin LEE + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +#ifndef _GESTURE_LIB_H_ +#define _GESTURE_LIB_H_ + +#include +#include + +#ifndef Bool +#define Bool int +#endif + +#ifndef XFixed +typedef int XFixed; +#endif + +#ifndef XDouble +typedef double XDouble; +#endif + +#define XDoubleToFixed(f) ((XFixed) ((f) * 65536)) +#define XFixedToDouble(f) (((XDouble) (f)) / 65536) + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int groupid; + int num_group; +} XGestureNotifyGroupEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int num_finger; + int direction; /* 8 way direction (0 ~ 7) */ + int distance; /* distance between first point and last point (pixel) */ + Time duration; /* time difference between press and release (ms) */ + XFixed angle; /* angel difference between horizontal line and flick line (radian) */ +} XGestureNotifyFlickEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int num_finger; + int direction; /* 8 way direction (0 ~ 7) */ + int distance; /* distance between first point and last point (pixel) */ + Time duration; /* time difference between press and release (ms) */ + int dx; /* x coordinate delta */ + int dy; /* y coordinate delta */ +} XGestureNotifyPanEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int num_finger; + int distance; /* distance from center (pixel) */ + int cx; /* center x coordinate */ + int cy; /* center ycoordinate */ + XFixed zoom; /* zoom factor (base : 1.0) */ + XFixed angle; /* angel difference between first line and current line (radian) */ +} XGestureNotifyPinchRotationEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int num_finger; + int cx; /* center x coordinate */ + int cy; /* center ycoordinate */ + int tap_repeat; /* tap repeats such as SINGLE_TAP, DBL_TAP and so on */ + Time interval; /* time difference between tap and previous tap (ms) */ +} XGestureNotifyTapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int num_finger; + int cx; /* center x coordinate */ + int cy; /* center ycoordinate */ + Time interval; /* time difference between tap and hold (ms) */ + Time holdtime; /* hold time (ms) */ +} XGestureNotifyTapNHoldEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ + Time time; /* server timestamp when event happened */ + int kind; /* subevent type */ + int num_finger; + int cx; /* center x coordinate */ + int cy; /* center ycoordinate */ + Time holdtime; /* hold time (ms) */ +} XGestureNotifyHoldEvent; + +union _XGestureCommonEvent { + struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + Window window; + Time time; + int kind; + } any; + XGestureNotifyGroupEvent gev; + XGestureNotifyFlickEvent fev; + XGestureNotifyPanEvent pev; + XGestureNotifyPinchRotationEvent pcrev; + XGestureNotifyTapEvent tev; + XGestureNotifyTapNHoldEvent thev; + XGestureNotifyHoldEvent hev; +}; + +typedef union _XGestureCommonEvent XGestureCommonEvent; + +_XFUNCPROTOBEGIN + +extern Bool XGestureQueryExtension (Display *dpy, int *event_base, int *error_base); + +extern Bool XGestureQueryVersion (Display *dpy, int *majorVersion, + int *minorVersion, int *patchVersion); + +extern Status XGestureSelectEvents(Display* dpy, Window w, Mask mask); + +extern Status XGestureGetSelectedEvents(Display* dpy, Window w, Mask *mask_return); + +extern Status XGestureGrabEvent(Display* dpy, Window w, int eventType, int num_finger, Time time); + +extern Status XGestureUngrabEvent(Display* dpy, Window w, int eventType, int num_finger, Time time); + +_XFUNCPROTOEND + +#endif//_GESTURE_LIB_H_ + diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..6a6ad3d --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,20 @@ +lib_LTLIBRARIES = libXgesture.la + +libXgesture_la_SOURCES = \ + gesture.c + +AM_CFLAGS = \ + $(GESTURE_CFLAGS) \ + $(MALLOC_ZERO_CFLAGS) \ + $(CWARNFLAGS) \ + -F/System/Library/Frameworks/ApplicationServices.framework/Frameworks \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/include/X11 \ + -I$(top_srcdir)/include/X11/extensions + +libXgesture_la_LIBADD = @GESTURE_LIBS@ + +libXgesture_la_LDFLAGS = -version-info 7:0:0 -no-undefined -framework ApplicationServices + +extincludedir = $(includedir)/X11/extensions +extinclude_HEADERS = $(top_srcdir)/include/X11/extensions/gesture.h diff --git a/src/gesture.c b/src/gesture.c new file mode 100755 index 0000000..3a9a60e --- /dev/null +++ b/src/gesture.c @@ -0,0 +1,848 @@ +/************************************************************************** + +libxgesture + +Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + +Contact: Sung-Jin Park + Sangjin LEE + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +#define NEED_EVENTS +#define NEED_REPLIES +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include +#include + +#ifdef __XGESTURE_LIB_DEBUG__ +#include +#define TRACE(msg) fprintf(stderr, "[X11][GestureExt] %s\n", msg); +#else +#define TRACE(msg) +#endif + +static XExtensionInfo _gesture_info_data; +static XExtensionInfo *gesture_info = &_gesture_info_data; +static char *gesture_extension_name = GESTURE_EXT_NAME; + +#define GestureCheckExtension(dpy,i,val) \ + XextCheckExtension (dpy, i, gesture_extension_name, val) + +//hooking functions +static char *error_string(Display *dpy, int code, XExtCodes *codes, + char *buf, int n); +static int close_display(Display *dpy, XExtCodes *extCodes); +static Bool wire_to_event(Display *dpy, XEvent *event, xEvent *wire); +static Status event_to_wire(Display *dpy, XEvent *event, xEvent *wire); + +static /* const */ XExtensionHooks gesture_extension_hooks = { + NULL, /* create_gc */ + NULL, /* copy_gc */ + NULL, /* flush_gc */ + NULL, /* free_gc */ + NULL, /* create_font */ + NULL, /* free_font */ + close_display, /* close_display */ + wire_to_event, /* wire_to_event */ + event_to_wire, /* event_to_wire */ + NULL, /* error */ + error_string, /* error_string */ +}; + +static char *gesture_error_list[] = { + "ClientNotLocal", + "InValidMask", + "OperationNotSupported", +}; + +typedef struct _GestureVersionInfoRec { + short major; + short minor; + int num_errors; +} GestureVersionInfo; + +#define GET_VERSION(info) ((info) ? (const GestureVersionInfo*)(info)->data : NULL) +#define IS_VERSION_SUPPORTED(info) (!!GET_VERSION(info)) + +static XEXT_GENERATE_FIND_DISPLAY (find_display, gesture_info, + gesture_extension_name, + &gesture_extension_hooks, + GestureNumberEvents, NULL) + +static XEXT_GENERATE_CLOSE_DISPLAY (close_display, gesture_info) + +static +XExtDisplayInfo *find_display_create_optional(Display *dpy, Bool create) +{ + XExtDisplayInfo *dpyinfo; + + if (!gesture_info) { + if (!(gesture_info = XextCreateExtension())) return NULL; + } + + if (!(dpyinfo = XextFindDisplay (gesture_info, dpy)) && create) { + dpyinfo = XextAddDisplay(gesture_info, dpy, + GESTURE_EXT_NAME, + &gesture_extension_hooks, + GestureNumberErrors, + (XPointer)GetVersionInfo(dpy)); + } + + return dpyinfo; +} + +static +char *error_string(Display *dpy, int code, XExtCodes *codes, char *buf, int n) +{ + XExtDisplayInfo *info = find_display_create_optional(dpy, False); + int nerr = IS_VERSION_SUPPORTED(info) ? GET_VERSION(info)->num_errors : 0; + + code -= codes->first_error; + if (code >= 0 && code < nerr) { + char tmp[256]; + sprintf (tmp, "%s.%d", GESTURE_EXT_NAME, code); + XGetErrorDatabaseText (dpy, "XProtoError", tmp, gesture_error_list[code], buf, n); + return buf; + } + + return (char *)0; +} + +static Bool +wire_to_event (Display *dpy, XEvent *event, xEvent *wire) +{ + XExtDisplayInfo *info = find_display (dpy); + + XGestureNotifyGroupEvent *gev; + xGestureNotifyGroupEvent *wgev; + XGestureNotifyFlickEvent *fev; + xGestureNotifyFlickEvent *wfev; + XGestureNotifyPanEvent *pev; + xGestureNotifyPanEvent *wpev; + XGestureNotifyPinchRotationEvent *pcrev; + xGestureNotifyPinchRotationEvent *wpcrev; + XGestureNotifyTapEvent *tev; + xGestureNotifyTapEvent *wtev; + XGestureNotifyTapNHoldEvent *thev; + xGestureNotifyTapNHoldEvent *wthev; + XGestureNotifyHoldEvent *hev; + xGestureNotifyHoldEvent *whev; + + GestureCheckExtension (dpy, info, False); + +#ifdef __XGESTURE_LIB_DEBUG__ + xGestureCommonEvent *wxce = (xGestureCommonEvent *)wire; + fprintf(stderr, "[wire_to_event] wire->u.u.type=%d, info->codes->first_event=%d\n", + wire->u.u.type, info->codes->first_event); + fprintf(stderr, "[wire_to_event] wxce->any.kind=%d\n", wxce->any.kind); +#endif//__XGESTURE_LIB_DEBUG__ + + switch (wire->u.u.type - info->codes->first_event) { + case GestureNotifyGroup: + gev = (XGestureNotifyGroupEvent *)event; + wgev = (xGestureNotifyGroupEvent *)wire; + gev->type = wgev->type & 0x7f; + gev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + gev->send_event = (wgev->type & 0x80) != 0; + gev->display = dpy; + gev->time = wgev->time; + gev->kind = wgev->kind; + gev->groupid = wgev->groupid; + gev->num_group = wgev->num_group; + gev->window = wgev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "groupid=%d\n", wgev->groupid); + fprintf(stderr, "tap num_group=%d\n", wgev->num_group); + fprintf(stderr, "window=0x%x\n", wgev->window); + fprintf(stderr, "time=%d\n", wgev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "groupid=%d\n", gev->groupid); + fprintf(stderr, "tap num_group=%d\n", gev->num_group); + fprintf(stderr, "window=0x%x\n", gev->window); + fprintf(stderr, "time=%d\n", gev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyFlick: + fev = (XGestureNotifyFlickEvent *)event; + wfev = (xGestureNotifyFlickEvent *)wire; + fev->type = wfev->type & 0x7f; + fev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + fev->send_event = (wfev->type & 0x80) != 0; + fev->display = dpy; + fev->time = wfev->time; + fev->kind = wfev->kind; + fev->num_finger = wfev->num_finger; + fev->distance = wfev->distance; + fev->duration = wfev->duration; + fev->angle = wfev->angle; + fev->direction = wfev->direction; + fev->window = wfev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wfev->num_finger); + fprintf(stderr, "distance=%d\n", wfev->distance); + fprintf(stderr, "duration=%d\n", wfev->duration); + fprintf(stderr, "angle=%d\n", wfev->angle); + fprintf(stderr, "direction=%d\n", wfev->direction); + fprintf(stderr, "window=0x%x\n", wfev->window); + fprintf(stderr, "time=%d\n", wfev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", fev->num_finger); + fprintf(stderr, "distance=%d\n", fev->distance); + fprintf(stderr, "duration=%d\n", fev->duration); + fprintf(stderr, "angle=%d\n", fev->angle); + fprintf(stderr, "direction=%d\n", fev->direction); + fprintf(stderr, "window=0x%x\n", fev->window); + fprintf(stderr, "time=%d\n", fev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyPan: + pev = (XGestureNotifyPanEvent *)event; + wpev = (xGestureNotifyPanEvent *)wire; + pev->type = wpev->type & 0x7f; + pev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + pev->send_event = (wpev->type & 0x80) != 0; + pev->display = dpy; + pev->time = wpev->time; + pev->kind = wpev->kind; + pev->num_finger = wpev->num_finger; + pev->direction = wpev->direction; + pev->dx = (short int)wpev->dx; + pev->dy = (short int)wpev->dy; + pev->distance = wpev->distance; + pev->duration = wpev->duration; + pev->window = wpev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wpev->num_finger); + fprintf(stderr, "direction=%d\n", wpev->direction); + fprintf(stderr, "distance=%d\n", wpev->distance); + fprintf(stderr, "duration=%d\n", wpev->duration); + fprintf(stderr, "window=0x%x\n", wpev->window); + fprintf(stderr, "dx:%d, dy:%d\n", wpev->dx, wpev->dy); + fprintf(stderr, "time=%d\n", wpev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", pev->num_finger); + fprintf(stderr, "direction=%d\n", pev->direction); + fprintf(stderr, "distance=%d\n", pev->distance); + fprintf(stderr, "duration=%d\n", pev->duration); + fprintf(stderr, "window=0x%x\n", pev->window); + fprintf(stderr, "dx:%d, dy:%d\n", pev->dx, pev->dy); + fprintf(stderr, "time=%d\n", pev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyPinchRotation: + pcrev = (XGestureNotifyPinchRotationEvent *)event; + wpcrev = (xGestureNotifyPinchRotationEvent *)wire; + pcrev->type = wpcrev->type & 0x7f; + pcrev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + pcrev->send_event = (wpcrev->type & 0x80) != 0; + pcrev->display = dpy; + pcrev->time = wpcrev->time; + pcrev->kind = wpcrev->kind; + pcrev->num_finger = wpcrev->num_finger; + pcrev->zoom = wpcrev->zoom; + pcrev->angle = wpcrev->angle; + pcrev->cx = wpcrev->cx; + pcrev->cy = wpcrev->cy; + pcrev->distance = wpcrev->distance; + pcrev->window = wpcrev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wpcrev->num_finger); + fprintf(stderr, "zoom=%d\n", wpcrev->zoom); + fprintf(stderr, "angle=%d\n", wpcrev->angle); + fprintf(stderr, "distance=%d\n", wpcrev->distance); + fprintf(stderr, "window=0x%x\n", wpcrev->window); + fprintf(stderr, "cx:%d, cy:%d\n", wpcrev->cx, wpcrev->cy); + fprintf(stderr, "time=%d\n", wpcrev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", pcrev->num_finger); + fprintf(stderr, "zoom=%d\n", pcrev->zoom); + fprintf(stderr, "angle=%d\n", pcrev->angle); + fprintf(stderr, "distance=%d\n", pcrev->distance); + fprintf(stderr, "window=0x%x\n", pcrev->window); + fprintf(stderr, "cx:%d, cy:%d\n", pcrev->cx, pcrev->cy); + fprintf(stderr, "time=%d\n", pcrev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyTap: + tev = (XGestureNotifyTapEvent *)event; + wtev = (xGestureNotifyTapEvent *)wire; + tev->type = wtev->type & 0x7f; + tev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + tev->send_event = (wtev->type & 0x80) != 0; + tev->display = dpy; + tev->time = wtev->time; + tev->kind = wtev->kind; + tev->num_finger = wtev->num_finger; + tev->cx = wtev->cx; + tev->cy = wtev->cy; + tev->tap_repeat = wtev->tap_repeat; + tev->interval = wtev->interval; + tev->window = wtev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wtev->num_finger); + fprintf(stderr, "tap repeat=%d\n", wtev->tap_repeat); + fprintf(stderr, "window=0x%x\n", wtev->window); + fprintf(stderr, "cx:%d, cy:%d\n", wtev->cx, wtev->cy); + fprintf(stderr, "time=%d, interval=%d\n", wtev->time, wtev->interval); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", tev->num_finger); + fprintf(stderr, "tap repeat=%d\n", tev->tap_repeat); + fprintf(stderr, "window=0x%x\n", tev->window); + fprintf(stderr, "cx:%d, cy:%d\n", tev->cx, tev->cy); + fprintf(stderr, "time=%d, interval=%d\n", tev->time, tev->interval); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyTapNHold: + thev = (XGestureNotifyTapNHoldEvent *)event; + wthev = (xGestureNotifyTapNHoldEvent *)wire; + thev->type = wthev->type & 0x7f; + thev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + thev->send_event = (wthev->type & 0x80) != 0; + thev->display = dpy; + thev->time = wthev->time; + thev->kind = wthev->kind; + thev->num_finger = wthev->num_finger; + thev->cx = wthev->cx; + thev->cy = wthev->cy; + thev->interval = wthev->interval; + thev->window = wthev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wthev->num_finger); + fprintf(stderr, "interval=%d\n", wthev->interval); + fprintf(stderr, "window=0x%x\n", wthev->window); + fprintf(stderr, "cx:%d, cy:%d\n", wthev->cx, wthev->cy); + fprintf(stderr, "time=%d\n", wthev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", thev->num_finger); + fprintf(stderr, "interval=%d\n", thev->interval); + fprintf(stderr, "window=0x%x\n", thev->window); + fprintf(stderr, "cx:%d, cy:%d\n", thev->cx, thev->cy); + fprintf(stderr, "time=%d\n", thev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyHold: + hev = (XGestureNotifyHoldEvent *)event; + whev = (xGestureNotifyHoldEvent *)wire; + hev->type = whev->type & 0x7f; + hev->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + hev->send_event = (whev->type & 0x80) != 0; + hev->display = dpy; + hev->time = whev->time; + hev->kind = whev->kind; + hev->num_finger = whev->num_finger; + hev->cx = whev->cx; + hev->cy = whev->cy; + hev->holdtime = whev->holdtime; + hev->window = whev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", whev->num_finger); + fprintf(stderr, "holdtime=%d\n", whev->holdtime); + fprintf(stderr, "window=0x%x\n", whev->window); + fprintf(stderr, "cx:%d, cy:%d\n", whev->cx, whev->cy); + fprintf(stderr, "time=%d\n", whev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", hev->num_finger); + fprintf(stderr, "holdtime=%d\n", hev->holdtime); + fprintf(stderr, "window=0x%x\n", hev->window); + fprintf(stderr, "cx:%d, cy:%d\n", hev->cx, hev->cy); + fprintf(stderr, "time=%d\n", hev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + } + + return False; +} + +static Status +event_to_wire (Display *dpy, XEvent *event, xEvent *wire) +{ + XExtDisplayInfo *info = find_display (dpy); + + XGestureNotifyGroupEvent *gev; + xGestureNotifyGroupEvent *wgev; + XGestureNotifyFlickEvent *fev; + xGestureNotifyFlickEvent *wfev; + XGestureNotifyPanEvent *pev; + xGestureNotifyPanEvent *wpev; + XGestureNotifyPinchRotationEvent *pcrev; + xGestureNotifyPinchRotationEvent *wpcrev; + XGestureNotifyTapEvent *tev; + xGestureNotifyTapEvent *wtev; + XGestureNotifyTapNHoldEvent *thev; + xGestureNotifyTapNHoldEvent *wthev; + XGestureNotifyHoldEvent *hev; + xGestureNotifyHoldEvent *whev; + GestureCheckExtension (dpy, info, False); + + +#ifdef __XGESTURE_LIB_DEBUG__ + XGestureCommonEvent *xce = (XGestureCommonEvent *)event; + fprintf(stderr, "[event_to_wire] event->type=%d, info->codes->first_event=%d\n", + event->type, info->codes->first_event); + fprintf(stderr, "[event_to_wire] xce->any.kind=%d\n", xce->any.kind); +#endif//__XGESTURE_LIB_DEBUG__ + + switch (event->type - info->codes->first_event) { + case GestureNotifyGroup: + gev = (XGestureNotifyGroupEvent *)event; + wgev = (xGestureNotifyGroupEvent *)wire; + wgev->type = gev->type | (gev->send_event ? 0x80 : 0); + wgev->sequenceNumber = gev->serial & 0xffff; + wgev->time = gev->time; + wgev->kind = gev->kind; + wgev->groupid = gev->groupid; + wgev->num_group = gev->num_group; + wgev->window = gev->window; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "groupid=%d\n", wgev->groupid); + fprintf(stderr, "tap num_group=%d\n", wgev->num_group); + fprintf(stderr, "window=0x%x\n", wgev->window); + fprintf(stderr, "time=%d\n", wgev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "groupid=%d\n", gev->groupid); + fprintf(stderr, "tap num_group=%d\n", gev->num_group); + fprintf(stderr, "window=0x%x\n", gev->window); + fprintf(stderr, "time=%d\n", gev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyFlick: + fev = (XGestureNotifyFlickEvent *)event; + wfev = (xGestureNotifyFlickEvent *)wire; + wfev->type = fev->type | (fev->send_event ? 0x80 : 0); + wfev->sequenceNumber = fev->serial & 0xffff; + wfev->time = fev->time; + wfev->kind = fev->kind; + wfev->window = fev->window; + wfev->num_finger = fev->num_finger; + wfev->distance = fev->distance; + wfev->duration = fev->duration; + wfev->angle = fev->angle; + wfev->direction = fev->direction; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wfev->num_finger); + fprintf(stderr, "distance=%d\n", wfev->distance); + fprintf(stderr, "duration=%d\n", wfev->duration); + fprintf(stderr, "angle=%d\n", wfev->angle); + fprintf(stderr, "direction=%d\n", wfev->direction); + fprintf(stderr, "window=0x%x\n", wfev->window); + fprintf(stderr, "time=%d\n", wfev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", fev->num_finger); + fprintf(stderr, "distance=%d\n", fev->distance); + fprintf(stderr, "duration=%d\n", fev->duration); + fprintf(stderr, "angle=%d\n", fev->angle); + fprintf(stderr, "direction=%d\n", fev->direction); + fprintf(stderr, "window=0x%x\n", fev->window); + fprintf(stderr, "time=%d\n", fev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyPan: + pev = (XGestureNotifyPanEvent *)event; + wpev = (xGestureNotifyPanEvent *)wire; + wpev->type = pev->type | (pev->send_event ? 0x80 : 0); + wpev->sequenceNumber = pev->serial & 0xffff; + wpev->time = pev->time; + wpev->kind = pev->kind; + wpev->window = pev->window; + wpev->num_finger = pev->num_finger; + wpev->distance = pev->distance; + wpev->duration = pev->duration; + wpev->direction = pev->direction; + wpev->dx = (short int)pev->dx; + wpev->dy = (short int)pev->dy; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wpev->num_finger); + fprintf(stderr, "direction=%d\n", wpev->direction); + fprintf(stderr, "distance=%d\n", wpev->distance); + fprintf(stderr, "duration=%d\n", wpev->duration); + fprintf(stderr, "window=0x%x\n", wpev->window); + fprintf(stderr, "dx:%d, dy:%d\n", wpev->dx, wpev->dy); + fprintf(stderr, "time=%d\n", wpev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", pev->num_finger); + fprintf(stderr, "direction=%d\n", pev->direction); + fprintf(stderr, "distance=%d\n", pev->distance); + fprintf(stderr, "duration=%d\n", pev->duration); + fprintf(stderr, "window=0x%x\n", pev->window); + fprintf(stderr, "dx:%d, dy:%d\n", pev->dx, pev->dy); + fprintf(stderr, "time=%d\n", pev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyPinchRotation: + pcrev = (XGestureNotifyPinchRotationEvent *)event; + wpcrev = (xGestureNotifyPinchRotationEvent *)wire; + wpcrev->type = pcrev->type | (pcrev->send_event ? 0x80 : 0); + wpcrev->sequenceNumber = pcrev->serial & 0xffff; + wpcrev->time = pcrev->time; + wpcrev->kind = pcrev->kind; + wpcrev->window = pcrev->window; + wpcrev->num_finger = pcrev->num_finger; + wpcrev->zoom = pcrev->zoom; + wpcrev->angle = pcrev->angle; + wpcrev->cx = pcrev->cx; + wpcrev->cy = pcrev->cy; + wpcrev->distance = pcrev->distance; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wpcrev->num_finger); + fprintf(stderr, "zoom=%d\n", wpcrev->zoom); + fprintf(stderr, "angle=%d\n", wpcrev->angle); + fprintf(stderr, "distance=%d\n", wpcrev->distance); + fprintf(stderr, "window=0x%x\n", wpcrev->window); + fprintf(stderr, "cx:%d, cy:%d\n", wpcrev->cx, wpcrev->cy); + fprintf(stderr, "time=%d\n", wpcrev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", pcrev->num_finger); + fprintf(stderr, "zoom=%d\n", pcrev->zoom); + fprintf(stderr, "angle=%d\n", pcrev->angle); + fprintf(stderr, "distance=%d\n", pcrev->distance); + fprintf(stderr, "window=0x%x\n", pcrev->window); + fprintf(stderr, "cx:%d, cy:%d\n", pcrev->cx, pcrev->cy); + fprintf(stderr, "time=%d\n", pcrev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyTap: + tev = (XGestureNotifyTapEvent *)event; + wtev = (xGestureNotifyTapEvent *)wire; + wtev->type = tev->type | (tev->send_event ? 0x80 : 0); + wtev->sequenceNumber = tev->serial & 0xffff; + wtev->time = tev->time; + wtev->kind = tev->kind; + wtev->window = tev->window; + wtev->num_finger = tev->num_finger; + wtev->cx = tev->cx; + wtev->cy = tev->cy; + wtev->tap_repeat = tev->tap_repeat; + wtev->interval = tev->interval; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[event_to_wire]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wtev->num_finger); + fprintf(stderr, "tap repeat=%d\n", wtev->tap_repeat); + fprintf(stderr, "window=0x%x\n", wtev->window); + fprintf(stderr, "cx:%d, cy:%d\n", wtev->cx, wtev->cy); + fprintf(stderr, "time=%d, interval=%d\n", wtev->time, wtev->interval); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", tev->num_finger); + fprintf(stderr, "tap repeat=%d\n", tev->tap_repeat); + fprintf(stderr, "window=0x%x\n", tev->window); + fprintf(stderr, "cx:%d, cy:%d\n", tev->cx, tev->cy); + fprintf(stderr, "time=%d, interval=%d\n", tev->time, tev->interval); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyTapNHold: + thev = (XGestureNotifyTapNHoldEvent *)event; + wthev = (xGestureNotifyTapNHoldEvent *)wire; + wthev->type = thev->type | (thev->send_event ? 0x80 : 0); + wthev->sequenceNumber = thev->serial & 0xffff; + wthev->time = thev->time; + wthev->kind = thev->kind; + wthev->window = thev->window; + wthev->num_finger = thev->num_finger; + wthev->cx = thev->cx; + wthev->cy = thev->cy; + wthev->interval = thev->interval; + wthev->holdtime = thev->holdtime; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", wthev->num_finger); + fprintf(stderr, "interval=%d\n", wthev->interval); + fprintf(stderr, "window=0x%x\n", wthev->window); + fprintf(stderr, "cx:%d, cy:%d\n", wthev->cx, wthev->cy); + fprintf(stderr, "time=%d\n", wthev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", thev->num_finger); + fprintf(stderr, "interval=%d\n", thev->interval); + fprintf(stderr, "window=0x%x\n", thev->window); + fprintf(stderr, "cx:%d, cy:%d\n", thev->cx, thev->cy); + fprintf(stderr, "time=%d\n", thev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + + case GestureNotifyHold: + hev = (XGestureNotifyHoldEvent *)event; + whev = (xGestureNotifyHoldEvent *)wire; + whev->type = hev->type | (hev->send_event ? 0x80 : 0); + whev->sequenceNumber = hev->serial & 0xffff; + whev->time = hev->time; + whev->kind = hev->kind; + whev->window = hev->window; + whev->num_finger = hev->num_finger; + whev->cx = hev->cx; + whev->cy = hev->cy; + whev->holdtime = hev->holdtime; +#ifdef __XGESTURE_LIB_DEBUG__ + fprintf(stderr, "[wire_to_event]\n"); + fprintf(stderr, "[ == Wire values == ]\n"); + fprintf(stderr, "num of finger=%d\n", whev->num_finger); + fprintf(stderr, "holdtime=%d\n", whev->holdtime); + fprintf(stderr, "window=0x%x\n", whev->window); + fprintf(stderr, "cx:%d, cy:%d\n", whev->cx, whev->cy); + fprintf(stderr, "time=%d\n", whev->time); + fprintf(stderr, "[ == Event values]\n"); + fprintf(stderr, "num of finger=%d\n", hev->num_finger); + fprintf(stderr, "holdtime=%d\n", hev->holdtime); + fprintf(stderr, "window=0x%x\n", hev->window); + fprintf(stderr, "cx:%d, cy:%d\n", hev->cx, hev->cy); + fprintf(stderr, "time=%d\n", hev->time); +#endif//__XGESTURE_LIB_DEBUG__ + return True; + } + + return 0; +} + +Bool XGestureQueryExtension (Display *dpy, int *event_basep, int *error_basep) +{ + XExtDisplayInfo *info = find_display (dpy); + + TRACE("QueryExtension..."); + if (XextHasExtension(info)) { + *event_basep = info->codes->first_event; + *error_basep = info->codes->first_error; + TRACE("QueryExtension... return True"); + return True; + } else { + TRACE("QueryExtension... return False"); + return False; + } +} + +Bool XGestureQueryVersion(Display* dpy, int* majorVersion, int* minorVersion, + int* patchVersion) +{ + XExtDisplayInfo *info = find_display (dpy); + xGestureQueryVersionReply rep; + xGestureQueryVersionReq *req; + + TRACE("QueryVersion..."); + GestureCheckExtension (dpy, info, False); + + LockDisplay(dpy); + GetReq(GestureQueryVersion, req); + req->reqType = info->codes->major_opcode; + req->gestureReqType = X_GestureQueryVersion; + if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { + UnlockDisplay(dpy); + SyncHandle(); + TRACE("QueryVersion... return False"); + return False; + } + *majorVersion = rep.majorVersion; + *minorVersion = rep.minorVersion; + *patchVersion = rep.patchVersion; + UnlockDisplay(dpy); + SyncHandle(); + TRACE("QueryVersion... return True"); + + return True; +} + +Status XGestureSelectEvents(Display* dpy, Window w, Mask mask) +{ + XExtDisplayInfo *info = find_display (dpy); + xGestureSelectEventsReq *req; + + TRACE("SelectEvents..."); + GestureCheckExtension (dpy, info, False); + + LockDisplay(dpy); + GetReq(GestureSelectEvents, req); + req->reqType = info->codes->major_opcode; + req->gestureReqType = X_GestureSelectEvents; + req->window = w; + req->mask = mask; + UnlockDisplay(dpy); + SyncHandle(); + TRACE("SelectEvents... return True"); + + return GestureSuccess; +} + +Status XGestureGetSelectedEvents(Display* dpy, Window w, Mask *mask_return) +{ + Mask mask_out = 0; + + XExtDisplayInfo *info = find_display (dpy); + xGestureGetSelectedEventsReply rep; + xGestureGetSelectedEventsReq *req; + + TRACE("GetSelectedEvents..."); + GestureCheckExtension (dpy, info, False); + + LockDisplay(dpy); + GetReq(GestureGetSelectedEvents, req); + req->reqType = info->codes->major_opcode; + req->gestureReqType = X_GestureGetSelectedEvents; + req->window = w; + + if ( !_XReply (dpy, (xReply *) &rep, 0, xTrue) ) + { + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GetSelectedEvents... Failed"); + return GestureInvalidReply; + } + + mask_out = rep.mask; + + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GetSelectedEvents... Succeed"); + + *mask_return = mask_out; + + return GestureSuccess; +} + +Status XGestureGrabEvent(Display* dpy, Window w, int eventType, int num_finger, Time time) +{ + XExtDisplayInfo *info = find_display (dpy); + xGestureGrabEventReply rep; + xGestureGrabEventReq *req; + register int status; + + TRACE("GrabEvent..."); + GestureCheckExtension (dpy, info, False); + + LockDisplay(dpy); + GetReq(GestureGrabEvent, req); + req->reqType = info->codes->major_opcode; + req->gestureReqType = X_GestureGrabEvent; + req->window = w; + req->eventType = eventType; + req->num_finger = num_finger; + req->time = time; + + if( eventType >= GestureNumberEvents ) + { + TRACE("GrabEvent... return GestureGrabAbnormal"); + return GestureGrabAbnormal; + } + + /* if we ever return, suppress the error */ + if ( !_XReply (dpy, (xReply *) &rep, 0, xTrue) ) + { + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GrabEvent... return GestureInvalidReply"); + return GestureInvalidReply; + } + + status = rep.status; + + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GrabEvent... return success"); + + return status; +} + +Status XGestureUngrabEvent(Display* dpy, Window w, int eventType, int num_finger, Time time) +{ + XExtDisplayInfo *info = find_display (dpy); + xGestureUngrabEventReply rep; + xGestureUngrabEventReq *req; + register int status; + + TRACE("UnrabEvent..."); + GestureCheckExtension (dpy, info, False); + + if( !w ) + { + TRACE("UnrabEvent...w is invalid"); + return GestureUngrabAbnormal; + } + + LockDisplay(dpy); + GetReq(GestureUngrabEvent, req); + req->reqType = info->codes->major_opcode; + req->gestureReqType = X_GestureUngrabEvent; + req->window = w; + req->eventType = eventType; + req->num_finger = num_finger; + req->time = time; + + if( eventType >= GestureNumberEvents ) + { + TRACE("UnrabEvent... return GestureUngrabAbnormal"); + return GestureUngrabAbnormal; + } + + /* if we ever return, suppress the error */ + if ( !_XReply (dpy, (xReply *) &rep, 0, xTrue) ) + { + UnlockDisplay(dpy); + SyncHandle(); + TRACE("UnrabEvent... return failed"); + return GestureInvalidReply; + } + + status = rep.status; + + UnlockDisplay(dpy); + SyncHandle(); + TRACE("UnrabEvent... return success"); + + return status; +} + diff --git a/xgesture.pc.in b/xgesture.pc.in new file mode 100644 index 0000000..2d2f480 --- /dev/null +++ b/xgesture.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Xgesture +Description: The X Gesture Extension Library +Version: @PACKAGE_VERSION@ +Requires.private: x11 xext +Cflags: -I${includedir} +Libs: -L${libdir} -lXgesture -- 2.7.4