summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2009-10-24 14:17:47 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2009-10-24 14:17:47 +0000
commitf308266e3a1ddc40d03a4b40929b1b8b4159e638 (patch)
tree98bb59c4bf8226cd1f65bc1adf65861dbf35952f /app
parent2d8fe321f4636ebbb1e84d5223a2af8dd95840f8 (diff)
Udate to xinput version 1.5.0
Diffstat (limited to 'app')
-rw-r--r--app/xinput/ChangeLog725
-rw-r--r--app/xinput/Makefile.in2
-rw-r--r--app/xinput/aclocal.m489
-rw-r--r--app/xinput/config.h.in2
-rwxr-xr-xapp/xinput/configure975
-rw-r--r--app/xinput/configure.ac23
-rw-r--r--app/xinput/man/Makefile.in2
-rw-r--r--app/xinput/man/xinput.man111
-rw-r--r--app/xinput/src/Makefile.am5
-rw-r--r--app/xinput/src/Makefile.in17
-rw-r--r--app/xinput/src/hierarchy.c134
-rw-r--r--app/xinput/src/list.c260
-rw-r--r--app/xinput/src/property.c684
-rw-r--r--app/xinput/src/setcp.c13
-rw-r--r--app/xinput/src/test_xi2.c381
-rw-r--r--app/xinput/src/version.c43
-rw-r--r--app/xinput/src/xinput.c130
-rw-r--r--app/xinput/src/xinput.h289
18 files changed, 2793 insertions, 1092 deletions
diff --git a/app/xinput/ChangeLog b/app/xinput/ChangeLog
index a7c0f68f8..152ac0dc6 100644
--- a/app/xinput/ChangeLog
+++ b/app/xinput/ChangeLog
@@ -1,10 +1,496 @@
-commit 5600d953531f377b5be114c9b72aca281f9bbca5
+commit 09b075863708e43b9c1202dd052f36d5f865f571
Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date: Thu May 7 15:21:16 2009 +1000
+Date: Tue Oct 13 15:25:19 2009 +1000
- xinput 1.4.2
+ xinput 1.5.0
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 5f49354072a3d331fe359eac0ebff09506668952
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Oct 9 15:28:34 2009 +1000
+
+ Clean up --version, don't require a DISPLAY and display the server version too.
+
+ version.c was removed, seemed a bit excessive for the 20 lines of code.
+ --version is integrated separate from the other commands now, checked before
+ opening the display. xinput now prints its own version in all cases, even if
+ the display is unavailable. If the display is available, it prints the
+ server version too. Example output:
+
+ $> xinput --version
+ xinput version 1.4.99.3
+ XI version on server: 2.0
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 7ecd7d55d7a7ab9f5cea5f34f28c7c221171c2bf
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Oct 9 15:07:30 2009 +1000
+
+ man: clean up the man page.
+
+ Several changes to the man page to tidy it up a bit:
+ - RCS tag removed
+ - synopsis shortened, OPTIONS section added instead
+ - "xinput" dropped before the option descriptions, options in manpage
+ prefixed with '--'.
+ - device_name replaced with just device, since it may be a deviceid.
+ - Removed references to XI man page calls that some options use, it really
+ doesn't matter to users what the underlying Xlib call is.
+ - mark set-int-prop and set-float-prop as deprecated in the man page.
+ - add --test_xi2 flag
+ - Added a few more authors.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+ Reviewed-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 7010a6c924ce6937c8e040c837a118663d6dfdb3
+Author: Thomas Jaeger <ThJaeger@gmail.com>
+Date: Wed Oct 7 13:05:15 2009 -0400
+
+ Rework 'xinput list' code
+
+ * Drop the questionable --loop option
+ * Add a --long option (opposite of --short)
+ * Make --short the default if no device argument is given
+ * XI2: Make it possible to query a single device
+
+ Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
+
+ squashed in a man page update for --short and --long.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 7d930a42e6c294ecaaf42585e37b8dc24be8a805
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Sep 24 10:45:54 2009 +1000
+
+ Bump to 1.4.99.3
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a2392f62a93fd288abb8000556d1b34eadaf697f
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date: Mon Sep 21 17:30:55 2009 -0700
+
+ Use __xorgversion__ instead of RCS $Date in man page header/footer
+
+ Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 2ba793d412608dcad61dbca1c8c76740d4982e2b
+Author: Julien Cristau <jcristau@debian.org>
+Date: Tue Sep 15 17:37:34 2009 +0200
+
+ Use do_set_prop for set_{atom,float,int}_prop
+
+ Signed-off-by: Julien Cristau <jcristau@debian.org>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 79800e1e0fa3b45b6ed37453851df24c98da4435
+Author: Julien Cristau <jcristau@debian.org>
+Date: Tue Sep 15 17:55:35 2009 +0200
+
+ set-prop: add --type={atom,float,int} and --format={8,16,32} options
+
+ Allows creating new properties or modifying the type and format of
+ existing ones.
+
+ Signed-off-by: Julien Cristau <jcristau@debian.org>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 1665fa4e24930f7e3f1cfbc8bf50119ab7d6ca04
+Author: Julien Cristau <jcristau@debian.org>
+Date: Tue Sep 15 17:33:54 2009 +0200
+
+ Add a format and type argument to the set_prop functions
+
+ This will allow the addition of command-line options to set format and
+ type, and the reuse of this code for the set-{atom,float,int}-prop
+ paths.
+
+ Signed-off-by: Julien Cristau <jcristau@debian.org>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 650c52db8b30cebca3386ac350154a6b3a0abbe1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Sep 16 12:29:26 2009 +1000
+
+ Require xorg-macros 1.3 for XORG_DEFAULT_OPTIONS.
+
+commit 22fdd63f4521c89ae43bbfc6741e872b4a74d18f
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Aug 21 15:56:19 2009 +1000
+
+ test_xi2: Print the key repeat flag if it is set.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 6c362c67ec7fb62d2d7bab5ab4e779147f941a33
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Aug 3 15:59:16 2009 +1000
+
+ Bump to 1.4.99.2
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 10a5596e9cd6dbca0826929e03e9495703279822
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Jul 21 16:20:03 2009 +1000
+
+ test-xi2: Update to keycode grabs instead of keysym grabs.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 6aa2dbd555ca4d659acbebffabe28bf648eed32d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Jul 16 16:14:01 2009 +1000
+
+ Print XINotifyPassiveGrab detail in enter events too.
+
+commit b6949c809c69d824fa5fdb2825f045ed716237d8
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Jul 14 16:27:36 2009 +1000
+
+ test_xi: Print deviceid for enter events too
+
+commit 59fc7423bf0e8d29747074449e7a3484cafb2f42
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Jul 14 16:13:48 2009 +1000
+
+ Use XI2 defines for enter/leave modes and detail.
+
+ Doesn't matter much since they are the same as the core ones anyway, but
+ nicer for consistency.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 9a20ce005c12cea9cf215125c96a00c7cbe988c7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Jul 13 16:05:25 2009 +1000
+
+ Adjust to new, split-up raw event types.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 7baaba9fbef48b1f45a51c1654e605df074800b8
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Jul 13 09:18:35 2009 +1000
+
+ test_xi2: Plug memory leak with XGetAtomName.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit cb93b032989907e5274d9a5d95ae01535001ec19
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Jul 13 09:15:49 2009 +1000
+
+ test_xi2: Update to use cookie events - require libXi 1.2.99.2
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit d7f6f7eda435b550d782b545cd7828b21c19b7b4
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Jun 30 16:18:20 2009 +1000
+
+ Plug memory leak from XGetAtomName.
+
+commit 248faefc957a9b0877384842540b2d935e1b5c07
+Author: Benjamin Close <Benjamin.Close@clearchain.com>
+Date: Wed Jun 24 11:55:00 2009 +0930
+
+ Obtain the XInput opcode and check that GenericEvents are actually XI events
+
+ Signed-off-by: Benjamin Close <Benjamin.Close@clearchain.com>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 1c28ba44958389892470688ce394c034dc8efa21
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jun 24 10:30:45 2009 +1000
+
+ test_xi2: don't map the window before selecting for events.
+
+ Mapping the window before selecting for XI2 events leaves some events out
+ (e.g. enter events if the pointer is already in the area where the window is
+ being mapped).
+
+ Reported-by: Thomas Jaeger
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit f00f6b1c58b3ded52d8cb0002e0bacd558bc874c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jun 24 10:29:12 2009 +1000
+
+ test_xi2: use %#x alternative printf format.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 97fbbe671827194fa175d6bd15f6189e921393c5
+Author: Thomas Jaeger <ThJaeger@gmail.com>
+Date: Tue Jun 23 12:49:56 2009 -0400
+
+ remove-master: document possible return modes in --help
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit f1e11109acae93f2d9cbee2333dcf7b65cf6151b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Jun 23 13:26:56 2009 +1000
+
+ Fix --help output for create-master and remove-master.
+
+ Missing <> added. All parameters in the --help output have surrounding <> if
+ the parameter is something the user has to substitute.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 863423141a3347a013004c809e9d8ce29e11d377
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sat Jun 20 17:59:59 2009 +1000
+
+ Bump to 1.4.99.1
+
+ We've had a 1.4 branch for a while now, this bump is way overdue.
+
+commit e8ca8fa459eb2eb4d9e9faf294d7172fb4fdb17b
+Author: Thomas Jaeger <ThJaeger@gmail.com>
+Date: Sun Jun 14 13:58:39 2009 -0400
+
+ reattach: Default to return to VCP/VCK when returnMode is AttachToMaster
+
+ Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit f8b3dc4e1c43140514d20fbc9fddd0f352cbe40b
+Author: Thomas Jaeger <ThJaeger@gmail.com>
+Date: Mon Jun 15 21:45:32 2009 -0400
+
+ test-xi2: Report correct event coordinates
+
+ Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit cddc199d10952ec2a851e4b120061701e664be1b
+Author: Thomas Jaeger <ThJaeger@gmail.com>
+Date: Mon Jun 15 21:37:56 2009 -0400
+
+ test-xi2: Use standard macros instead of BitIsOn/SetBit
+
+ Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 82d338548e22ae271f50592e759794dd7536a207
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jun 17 21:23:17 2009 +1000
+
+ Require inputproto 1.9.99.12
+
+commit efab9cff2a3605c803786ff9a69ff1aeb155479d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jun 17 21:23:06 2009 +1000
+
+ Print the valuator value for absolute axes.
+
+commit a4efa37a0646497ed46f4462d8c745ab17339f62
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jun 17 21:22:23 2009 +1000
+
+ Print button and valuator labels when listing a device.
+
+commit 632ef53adf1e18509dfa2a1ae820910aa0a88545
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Jun 15 14:10:30 2009 +1000
+
+ Print button state when listing XI2 devices.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit e119d872c74f0190d40d5c4cd742c196aab6bf48
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Jun 12 16:31:02 2009 +1000
+
+ Print the sourceid when listing device classes.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a97520d6e5245ad15d7b7edbf355a343db53e144
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Jun 12 16:29:37 2009 +1000
+
+ Use the XI2 class defines for listing device classes in XI2 mode.
+
+ Purely cosmetic change, the values are the same anyway.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 47983fbd12366ee8ce89b293955b43f7e49b1785
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Jun 12 15:47:02 2009 +1000
+
+ Fix build errors introduced by inputproto 1.9.99.11.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 8659d4f88c805e764d671ae50dc110f742727dd7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jun 3 12:57:10 2009 +1000
+
+ xi2 test: add two missing breaks.
+
+ Printing a hierarchy event would always print only "master keyboard" or
+ "slave keyboard", never pointers.
+
+commit 8917716f37e4acbd848ea0c6abd1c943bde2f24d
+Author: Thomas Jaeger <ThJaeger@gmail.com>
+Date: Fri May 29 19:23:04 2009 -0400
+
+ test-xi2: fix modifiers for XIGrabButton call
+
+ Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 6c701334d13aabc832b41a3a060dedb8978943d3
+Author: Benjamin Close <Benjamin.Close@clearchain.com>
+Date: Thu May 28 18:44:47 2009 +1000
+
+ Remove superfluous dev assignment.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 969aad3967e58acfcb3da3583858cae09694652a
+Merge: 9aa8f48 5ad5edc
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 27 07:34:32 2009 +1000
+
+ Merge branch 'master' into xi2
-commit 0996eebd20b017078b7a61e42b13b3c1c5acd1b8
+commit 5ad5edc65e55fe4be63ba31acec4bc1fca96e81b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 27 07:33:31 2009 +1000
+
+ Print empty properties as <no items>.
+
+commit 9aa8f4826ed7120ae0ff759c6df40a0d3f37c720
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 27 07:33:52 2009 +1000
+
+ Print empty XI2 properties as <no items>
+
+commit 13e9758b2ebd5d545c08903aab0eccd423851a30
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 27 07:33:31 2009 +1000
+
+ Print empty properties as <no items>.
+
+commit 5fcd16638abf156a47d4d1c2e3caf0206b97b953
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 20 12:11:07 2009 +1000
+
+ Print None properties in XI2 mode too.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 7458e7dde70f5d9ff281848fb1a56e9a5f1dd783
+Merge: 14f47c2 aae3bfe
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 20 12:10:44 2009 +1000
+
+ Merge branch 'master' into xi2
+
+commit aae3bfee098567a80444b970aea4c737c736254c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 20 12:02:31 2009 +1000
+
+ Deal with None atoms.
+
+ An atom may in some cases be 0 (None). Deal with this instead of failing with
+ BadAtom values.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 14f47c23f56c06058673748755b3e31a6d18edf1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue May 19 15:28:16 2009 +1000
+
+ Print floating slaves in XI2 list mode.
+
+ Floating slaves are always printed last.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 1c72fd55d61371de81f44be5d92982a3012ad24b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed May 13 14:20:58 2009 +1000
+
+ Update to new inputproto and libXi naming conventions.
+
+ Require inputproto 1.9.99.9.
+
+commit 9c6a51e8aaba50b8f3a0f3ad767c34a80aee55a1
+Merge: 239cd6a 4832dc1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri May 8 15:15:45 2009 +1000
+
+ Merge branch 'master' into xi2
+
+ Conflicts:
+ src/xinput.h
+
+commit 239cd6a673be2821915301c1b3c3bae063e9dd94
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri May 8 14:21:17 2009 +1000
+
+ Update to new inputproto defines.
+
+commit 5d973706f4f706b7576bb6feac4beb7273438b78
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Apr 30 16:53:05 2009 +1000
+
+ update test_xi2 with a few more tests.
+
+commit 4832dc1f3ee8d11eadc99b5cd4e8158773d11f9b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 14:00:46 2009 +1000
+
+ XCloseDisplay when we're done.
+
+ This isn't really necessary, but we might as well be correct.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit d15a6c0c4cbf2b7d3feec0c829145e3036d84e4d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 12:56:58 2009 +1000
+
+ Clean up xinput.h a bit
+
+ Remove the unnecessary NeedFunctionPrototypes ifdef.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 125074488dc27f484a30a8d076133c73f4d9ef48
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 14:37:58 2009 +1000
+
+ Add support for XI2 property requests.
+
+ If XI2 is available, we use XI2 for list-props, delete-prop and set-prop.
+
+commit ff1b12265de1010aa22011c5db829274a8a3dab1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 14:13:45 2009 +1000
+
+ Get the XIDeviceInfo instead of just the id.
+
+ This way we leak the XIDeviceInfo array, but then again it doesn't matter
+ since we exit after the command anyway.
+ And with the XIDeviceInfo around, we can actually print the name and
+ whatnot.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit ba2396b40a427c30c58f8c17b64f4cf7bfaa2909
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Thu May 7 14:00:46 2009 +1000
@@ -13,9 +499,36 @@ Date: Thu May 7 14:00:46 2009 +1000
This isn't really necessary, but we might as well be correct.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
- (cherry picked from commit 4832dc1f3ee8d11eadc99b5cd4e8158773d11f9b)
-commit c6c2736a31c00717c5915e97a22b85d96ce163fe
+commit ea87f587e4090d2881ce8957476411b6de1c260b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 13:59:12 2009 +1000
+
+ Remove one more unnecessary ifdef.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a783c19f94e6fed28aeaf0550558cd0b63402b9c
+Merge: 65e3e12 4e6e0dd
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 13:06:05 2009 +1000
+
+ Merge branch 'master' into xi2
+
+ Conflicts:
+ src/property.c
+ src/xinput.c
+ src/xinput.h
+
+commit 4e6e0dd562e8e844bede349bd11c339644447d78
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu May 7 12:56:58 2009 +1000
+
+ Clean up xinput.h a bit
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 4b4b2e3f31cf08073887d8583997eb3340a6c2e1
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Fri May 1 11:22:53 2009 +1000
@@ -27,9 +540,8 @@ Date: Fri May 1 11:22:53 2009 +1000
Reported-by: Simon Thum <simon.thum@gmx.de>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
- (cherry picked from commit 4b4b2e3f31cf08073887d8583997eb3340a6c2e1)
-commit c7df478676b6573a07f74484668f9130706c4a1f
+commit 42dca922d287ffddcf2185ca96738f1505a04c27
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Thu Apr 30 14:50:08 2009 +1000
@@ -37,18 +549,85 @@ Date: Thu Apr 30 14:50:08 2009 +1000
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Simon Thum <simon.thum@gmx.de>
- (cherry picked from commit 42dca922d287ffddcf2185ca96738f1505a04c27)
-commit 0616fc2e8c76c70d95173377abf39b2c7edfce19
+commit e9af7c5f602b5580df36c77ee1c2ed22ccf72134
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Fri May 1 09:14:46 2009 +1000
The float_atom should actually be an Atom
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
- (cherry picked from commit e9af7c5f602b5580df36c77ee1c2ed22ccf72134)
-commit 4fa194b42a5a6a15b533be070d21d981751b9b83
+commit 65e3e12fa6fc2043fbb0122c72a4f7df09b1c659
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Apr 30 14:50:08 2009 +1000
+
+ If there's multiple null-terminated strings in the property, print all.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit e7cd0436689b54d14e05a601e426cd600994db89
+Author: Julien Cristau <jcristau@debian.org>
+Date: Mon Apr 20 13:58:03 2009 +0200
+
+ xinput: add set-prop command
+
+ There's no reason to require the user to know the difference between
+ set-int-prop, set-float-prop and set-atom-prop, and to know the required
+ format for each integer property, since we can just ask
+ XGetDeviceProperty.
+
+ Signed-off-by: Julien Cristau <jcristau@debian.org>
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 167034ba2798fbe34abf4748068ae480e45bfe13
+Author: Julien Cristau <jcristau@debian.org>
+Date: Thu Apr 16 18:55:46 2009 +0200
+
+ Factorize atom parsing in its own function
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 2722d1a177c9482989e314e0177c782563a0b54e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Apr 20 08:28:53 2009 +1000
+
+ XSync the display before jumping in the grab code.
+
+ The grab code only handles button presses, so we need to remove all events
+ before (exposures, enter/leave, etc.).
+
+commit 0df21cff5cdf2cf4af0af353f0dbfc7c33388b32
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sun Apr 19 21:28:25 2009 +1000
+
+ Add a hunk to test XI2 sync'd grabs.
+
+commit dd27752cbff03ea79ac76801d3748edc348570dc
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sun Apr 19 21:27:40 2009 +1000
+
+ Register for exposure events and block until we're mapped.
+
+commit a7de225eea0c7561e73d44c63844a8e98dea9676
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sun Apr 19 21:09:49 2009 +1000
+
+ Print event/root x/y on device events.
+
+commit 795799eff591be1fa8ce5199aa89a86dcb4b04e8
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sun Apr 19 20:33:40 2009 +1000
+
+ Actually print event_y when trying to print event_y in Enter/Leave events.
+
+commit 57d367b74d1068d38ce313a06a36654fd82ad460
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sat Apr 18 08:43:43 2009 +1000
+
+ replace BYTE with an unsigned char.
+
+commit a577bada8dddf3241a59cab812f5128131c46b29
Author: Peter Hutterer <peter.hutterer@redhat.com>
Date: Thu Apr 16 09:20:16 2009 -0400
@@ -58,9 +637,8 @@ Date: Thu Apr 16 09:20:16 2009 -0400
typecast around a bit.
Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
- (cherry picked from commit a577bada8dddf3241a59cab812f5128131c46b29)
-commit 7abb366e80d3a309d4ab8cd459ce184c6806b6d1
+commit de6326a75de810752a5b4e4c2f5fe98a2f7241a9
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Tue Apr 14 09:13:15 2009 -0400
@@ -69,25 +647,32 @@ Date: Tue Apr 14 09:13:15 2009 -0400
libX11 uses longs for 32 bit values, increasing hilarity on 64 bit machines.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
- (cherry picked from commit de6326a75de810752a5b4e4c2f5fe98a2f7241a9)
-commit 4dc5f13e13c9434d6fa9ed9f10a8e12a55aedc24
+commit 1e3da5be51efebdd75df540a1c94baa6505cfc9a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Apr 14 13:54:40 2009 +1000
+
+ Fix 64 bit issues with set-int-prop.
+
+ libX11 expects longs for 32 bit numbers.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 2f8f2193fdfe783c0854772cc46f1b2e0b2e3ec4
Author: Simon Thum <simon.thum@gmx.de>
Date: Thu Mar 26 13:52:15 2009 +0100
xinput: include device type in device list
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
- (cherry picked from commit 2f8f2193fdfe783c0854772cc46f1b2e0b2e3ec4)
-commit 61b2df1cd0135d90c65219cfa17caedbe60a44a2
+commit 17d537fd65ba9b1c99a0dde7833eb4069cc624a8
Author: Simon Thum <simon.thum@gmx.de>
Date: Thu Mar 26 15:19:47 2009 +0100
xinput: mention set-float-prop in manpage
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
- (cherry picked from commit 17d537fd65ba9b1c99a0dde7833eb4069cc624a8)
commit 286724a1417ffda447be918e8bcf46cc37ed715b
Author: Peter Hutterer <peter.hutterer@who-t.net>
@@ -107,6 +692,108 @@ Date: Thu Feb 19 14:39:29 2009 +1030
Signed-off-by: Benjamin Close <Benjamin.Close@clearchain.com>
+commit b04e8b472022c185123638a3d4639fbbcf0f144f
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Mar 11 09:52:08 2009 +1000
+
+ Print enter/leave and focus events.
+
+commit 70aac046bb4fb0028fcf018ae72bf29acfe6abac
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Mar 10 15:41:15 2009 +1000
+
+ Register for raw events
+
+commit 54136f2c2a37e92a5b5e49035d27ce6728e12e3a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Mar 10 13:23:53 2009 +1000
+
+ Change event registration a bit, using SetBit instead.
+
+commit 959faacf2e125312b3ff0cc71f4e0b4ee059757f
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sun Mar 8 17:41:23 2009 +1000
+
+ Print out hierarchy events
+
+commit ab0632284539460dd66c76e023894540fe77fcd2
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sun Mar 8 12:25:15 2009 +1000
+
+ Print DeviceChanged events.
+
+commit 57940c7995a3779792213468cafe7d982d009035
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue Mar 3 15:44:45 2009 +1000
+
+ Add test_xi2 for xi2 testing.
+
+commit 3cad22debfaceca754fc166ca766d92b7a8faf70
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Mar 4 21:57:54 2009 +1000
+
+ If XI2 is available, list devices through XIQueryDevice.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 5aa923fc560718b9a093ad18966f4530eef0efd7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Feb 26 16:14:21 2009 +1000
+
+ Update to new XI2 requests and sanitize the check for XI2 in configure.
+
+ Check for the actual library version, not for some random function inside the
+ library.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a12acdea9e289c9495bc14dd886e9a68cf9a533f
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Mar 4 21:25:50 2009 +1000
+
+ Change is_xinput_present() to xinput_version().
+
+ Returns major version of XI.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a197551573663cab9e79e07e2de9d423c7a7a572
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Mar 6 22:13:17 2009 +1000
+
+ add xi2_find_device_id
+
+commit 4ad33929e0f640dbc91004857ed2168006d21a71
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Feb 26 16:09:17 2009 +1000
+
+ Rip HAVE_XI2 conditional functionality out.
+
+ XI2 needs to be harder separated now.
+
+commit 10f5f9da1d4d7f6eb75d10316f318a7c9d7dc28b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu Feb 26 15:53:24 2009 +1000
+
+ Clean up xinput.h a bit.
+
+ All functions have to look the same anyway, so might as well use a one-line
+ macro to declare them.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 199c323332dac782b45dcb092da0322149843d5a
+Author: Benjamin Close <Benjamin.Close@clearchain.com>
+Date: Thu Mar 12 21:17:53 2009 +1000
+
+ Error out when more than one instance of a name exists
+
+ Previously the check was in place for the duplicate name, however the first
+ device with the requested name was still selected regardless.
+ Correct this by exiting out forcing the user to select by id instead.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
commit 49ef8a40f96c0383a8a42a78fda3a990ac934e59
Author: Simon Thum <simon.thum@gmx.de>
Date: Wed Jan 21 14:09:29 2009 +0100
diff --git a/app/xinput/Makefile.in b/app/xinput/Makefile.in
index 85d32d858..2ac0a46dd 100644
--- a/app/xinput/Makefile.in
+++ b/app/xinput/Makefile.in
@@ -154,6 +154,8 @@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
+XI2_CFLAGS = @XI2_CFLAGS@
+XI2_LIBS = @XI2_LIBS@
XINPUT_CFLAGS = @XINPUT_CFLAGS@
XINPUT_LIBS = @XINPUT_LIBS@
ac_ct_CC = @ac_ct_CC@
diff --git a/app/xinput/aclocal.m4 b/app/xinput/aclocal.m4
index e6e4bfd9e..d6409426d 100644
--- a/app/xinput/aclocal.m4
+++ b/app/xinput/aclocal.m4
@@ -995,7 +995,7 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
-dnl xorg-macros.m4. Generated from xorg-macros.m4.in:xorgversion.m4 by configure.
+dnl xorg-macros.m4. Generated from xorg-macros.m4.in xorgversion.m4 by configure.
dnl
dnl Copyright 2005-2006 Sun Microsystems, Inc. All rights reserved.
dnl
@@ -1032,27 +1032,24 @@ dnl of the copyright holder.
# your configure.ac with the minimum required version, such as:
# XORG_MACROS_VERSION(1.1)
#
-# To force at least a version with this macro defined, also add:
-# m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.1 or later before running autoconf/autogen])])
+# To ensure that this macro is defined, also add:
+# m4_ifndef([XORG_MACROS_VERSION],
+# [m4_fatal([must install xorg-macros 1.1 or later before running autoconf/autogen])])
#
#
# See the "minimum version" comment for each macro you use to see what
# version you require.
-AC_DEFUN([XORG_MACROS_VERSION],[
- [XORG_MACROS_needed_version=$1
- XORG_MACROS_needed_major=`echo $XORG_MACROS_needed_version | sed 's/\..*$//'`
- XORG_MACROS_needed_minor=`echo $XORG_MACROS_needed_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`]
- AC_MSG_CHECKING([if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}])
- [XORG_MACROS_version=1.2.1
- XORG_MACROS_major=`echo $XORG_MACROS_version | sed 's/\..*$//'`
- XORG_MACROS_minor=`echo $XORG_MACROS_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`]
- if test $XORG_MACROS_major -ne $XORG_MACROS_needed_major ; then
- AC_MSG_ERROR([configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x])
- fi
- if test $XORG_MACROS_minor -lt $XORG_MACROS_needed_minor ; then
- AC_MSG_ERROR([configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer])
- fi
- AC_MSG_RESULT([yes, $XORG_MACROS_version])
+m4_defun([XORG_MACROS_VERSION],[
+m4_define([vers_have], [1.3.0])
+m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.])))
+m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.])))
+m4_if(m4_cmp(maj_have, maj_needed), 0,,
+ [m4_fatal([xorg-macros major version ]maj_needed[ is required but ]vers_have[ found])])
+m4_if(m4_version_compare(vers_have, [$1]), -1,
+ [m4_fatal([xorg-macros version $1 or higher is required but ]vers_have[ found])])
+m4_undefine([vers_have])
+m4_undefine([maj_have])
+m4_undefine([maj_needed])
]) # XORG_MACROS_VERSION
# XORG_PROG_RAWCPP()
@@ -1319,7 +1316,7 @@ AC_SUBST(MAKE_HTML)
# their AM_CFLAGS (or other appropriate *_CFLAGS) to use them.
AC_DEFUN([XORG_CHECK_MALLOC_ZERO],[
AC_ARG_ENABLE(malloc0returnsnull,
- AC_HELP_STRING([--enable-malloc0returnsnull],
+ AS_HELP_STRING([--enable-malloc0returnsnull],
[malloc(0) returns NULL (default: auto)]),
[MALLOC_ZERO_RETURNS_NULL=$enableval],
[MALLOC_ZERO_RETURNS_NULL=auto])
@@ -1371,7 +1368,7 @@ AC_SUBST([XTMALLOC_ZERO_CFLAGS])
AC_DEFUN([XORG_WITH_LINT],[
# Allow checking code with lint, sparse, etc.
-AC_ARG_WITH(lint, [AC_HELP_STRING([--with-lint],
+AC_ARG_WITH(lint, [AS_HELP_STRING([--with-lint],
[Use a lint-style source code checker (default: disabled)])],
[use_lint=$withval], [use_lint=no])
if test "x$use_lint" = "xyes" ; then
@@ -1412,7 +1409,7 @@ AM_CONDITIONAL(LINT, [test x$LINT != xno])
AC_DEFUN([XORG_LINT_LIBRARY],[
AC_REQUIRE([XORG_WITH_LINT])
# Build lint "library" for more indepth checks of programs calling this library
-AC_ARG_ENABLE(lint-library, [AC_HELP_STRING([--enable-lint-library],
+AC_ARG_ENABLE(lint-library, [AS_HELP_STRING([--enable-lint-library],
[Create lint library (default: disabled)])],
[make_lint_lib=$enableval], [make_lint_lib=no])
if test "x$make_lint_lib" != "xno" ; then
@@ -1442,9 +1439,9 @@ if test "x$GCC" = xyes ; then
CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \
-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \
-Wbad-function-cast"
- case `gcc -dumpversion` in
+ case `$CC -dumpversion` in
3.4.* | 4.*)
- CWARNFLAGS+=" -Wold-style-definition -Wdeclaration-after-statement"
+ CWARNFLAGS="$CWARNFLAGS -Wold-style-definition -Wdeclaration-after-statement"
;;
esac
else
@@ -1454,7 +1451,51 @@ else
fi
fi
AC_SUBST(CWARNFLAGS)
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
]) # XORG_CWARNFLAGS
+
+# XORG_STRICT_OPTION
+# -----------------------
+# Minimum version: 1.3.0
+#
+# Add configure option to enable strict compilation
+AC_DEFUN([XORG_STRICT_OPTION], [
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_CC_C99])
+AC_REQUIRE([XORG_CWARNFLAGS])
+
+AC_ARG_ENABLE(strict-compilation,
+ AS_HELP_STRING([--enable-strict-compilation],
+ [Enable all warnings from compiler and make them errors (default: disabled)]),
+ [STRICT_COMPILE=$enableval], [STRICT_COMPILE=no])
+if test "x$STRICT_COMPILE" = "xyes"; then
+ AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
+ AC_CHECK_DECL([__INTEL_COMPILER], [INTELCC="yes"], [INTELCC="no"])
+ if test "x$GCC" = xyes ; then
+ STRICT_CFLAGS="-pedantic -Werror"
+ elif test "x$SUNCC" = "xyes"; then
+ STRICT_CFLAGS="-errwarn"
+ elif test "x$INTELCC" = "xyes"; then
+ STRICT_CFLAGS="-Werror"
+ fi
+fi
+CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS"
+AC_SUBST([CWARNFLAGS])
+]) # XORG_STRICT_OPTION
+
+# XORG_DEFAULT_OPTIONS
+# --------------------
+# Minimum version: 1.3.0
+#
+# Defines default options for X.Org modules.
+#
+AC_DEFUN([XORG_DEFAULT_OPTIONS], [
+XORG_CWARNFLAGS
+XORG_STRICT_OPTION
+XORG_RELEASE_VERSION
+XORG_CHANGELOG
+XORG_MANPAGE_SECTIONS
+]) # XORG_DEFAULT_OPTIONS
dnl Copyright 2005 Red Hat, Inc
dnl
dnl Permission to use, copy, modify, distribute, and sell this software and its
@@ -1489,7 +1530,7 @@ dnl
AC_DEFUN([XORG_RELEASE_VERSION],[
AC_ARG_WITH(release-version,
- AC_HELP_STRING([--with-release-version=STRING],
+ AS_HELP_STRING([--with-release-version=STRING],
[Use release version string in package name]),
[RELEASE_VERSION="$withval"],
[RELEASE_VERSION=""])
diff --git a/app/xinput/config.h.in b/app/xinput/config.h.in
index 77adb652d..c3ad5b2fd 100644
--- a/app/xinput/config.h.in
+++ b/app/xinput/config.h.in
@@ -27,7 +27,7 @@
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
-/* XInput Version 2 Enabled */
+/* XI2 available */
#undef HAVE_XI2
/* Name of package */
diff --git a/app/xinput/configure b/app/xinput/configure
index 7ace23bb1..747c9ce5e 100755
--- a/app/xinput/configure
+++ b/app/xinput/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.62 for xinput 1.4.2.
+# Generated by GNU Autoconf 2.62 for xinput 1.5.0.
#
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
#
@@ -596,8 +596,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='xinput'
PACKAGE_TARNAME='xinput'
-PACKAGE_VERSION='1.4.2'
-PACKAGE_STRING='xinput 1.4.2'
+PACKAGE_VERSION='1.5.0'
+PACKAGE_STRING='xinput 1.5.0'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
# Factoring default headers for most tests.
@@ -717,12 +717,8 @@ CPP
GREP
EGREP
CWARNFLAGS
-PKG_CONFIG
-XINPUT_CFLAGS
-XINPUT_LIBS
-HAVE_XI2_TRUE
-HAVE_XI2_FALSE
-HAVE_XI2
+CHANGELOG_CMD
+distcleancheck_listfiles
build
build_cpu
build_vendor
@@ -743,8 +739,14 @@ FILE_MAN_DIR
MISC_MAN_DIR
DRIVER_MAN_DIR
ADMIN_MAN_DIR
-CHANGELOG_CMD
-distcleancheck_listfiles
+PKG_CONFIG
+XINPUT_CFLAGS
+XINPUT_LIBS
+XI2_CFLAGS
+XI2_LIBS
+HAVE_XI2_TRUE
+HAVE_XI2_FALSE
+HAVE_XI2
LIBOBJS
LTLIBOBJS'
ac_subst_files=''
@@ -752,6 +754,7 @@ ac_user_opts='
enable_option_checking
enable_maintainer_mode
enable_dependency_tracking
+enable_strict_compilation
with_release_version
'
ac_precious_vars='build_alias
@@ -765,7 +768,9 @@ CPPFLAGS
CPP
PKG_CONFIG
XINPUT_CFLAGS
-XINPUT_LIBS'
+XINPUT_LIBS
+XI2_CFLAGS
+XI2_LIBS'
# Initialize some variables set by options.
@@ -1318,7 +1323,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures xinput 1.4.2 to adapt to many kinds of systems.
+\`configure' configures xinput 1.5.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1388,7 +1393,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of xinput 1.4.2:";;
+ short | recursive ) echo "Configuration of xinput 1.5.0:";;
esac
cat <<\_ACEOF
@@ -1400,6 +1405,9 @@ Optional Features:
(and sometimes confusing) to the casual installer
--disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors
+ --enable-strict-compilation
+ Enable all warnings from compiler and make them
+ errors (default: disabled)
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -1420,6 +1428,8 @@ Some influential environment variables:
XINPUT_CFLAGS
C compiler flags for XINPUT, overriding pkg-config
XINPUT_LIBS linker flags for XINPUT, overriding pkg-config
+ XI2_CFLAGS C compiler flags for XI2, overriding pkg-config
+ XI2_LIBS linker flags for XI2, overriding pkg-config
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1487,7 +1497,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-xinput configure 1.4.2
+xinput configure 1.5.0
generated by GNU Autoconf 2.62
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1501,7 +1511,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by xinput $as_me 1.4.2, which was
+It was created by xinput $as_me 1.5.0, which was
generated by GNU Autoconf 2.62. Invocation command line was
$ $0 $@
@@ -2150,7 +2160,7 @@ fi
# Define the identity of the package.
PACKAGE='xinput'
- VERSION='1.4.2'
+ VERSION='1.5.0'
cat >>confdefs.h <<_ACEOF
@@ -2321,29 +2331,17 @@ fi
-# Require xorg-macros: XORG_CWARNFLAGS, XORG_CHANGELOG
+# Require xorg-macros: XORG_DEFAULT_OPTIONS
+
+
+
+
+
+
+
+
- XORG_MACROS_needed_version=1.2
- XORG_MACROS_needed_major=`echo $XORG_MACROS_needed_version | sed 's/\..*$//'`
- XORG_MACROS_needed_minor=`echo $XORG_MACROS_needed_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`
- { $as_echo "$as_me:$LINENO: checking if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}" >&5
-$as_echo_n "checking if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}... " >&6; }
- XORG_MACROS_version=1.2.1
- XORG_MACROS_major=`echo $XORG_MACROS_version | sed 's/\..*$//'`
- XORG_MACROS_minor=`echo $XORG_MACROS_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`
- if test $XORG_MACROS_major -ne $XORG_MACROS_needed_major ; then
- { { $as_echo "$as_me:$LINENO: error: configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x" >&5
-$as_echo "$as_me: error: configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x" >&2;}
- { (exit 1); exit 1; }; }
- fi
- if test $XORG_MACROS_minor -lt $XORG_MACROS_needed_minor ; then
- { { $as_echo "$as_me:$LINENO: error: configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer" >&5
-$as_echo "$as_me: error: configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer" >&2;}
- { (exit 1); exit 1; }; }
- fi
- { $as_echo "$as_me:$LINENO: result: yes, $XORG_MACROS_version" >&5
-$as_echo "yes, $XORG_MACROS_version" >&6; }
ac_config_headers="$ac_config_headers config.h"
@@ -4168,15 +4166,301 @@ fi
done
+ { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if test "${ac_cv_prog_cc_c99+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+ your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str;
+ int number;
+ float fnumber;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case 's': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case 'd': // int
+ number = va_arg (args_copy, int);
+ break;
+ case 'f': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+}
+
+int
+main ()
+{
+
+ // Check bool.
+ _Bool success = false;
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ test_varargs ("s, d' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+ || dynamic_array[ni.number - 1] != 543);
+
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_c99=$ac_arg
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+ x)
+ { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c99"
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+{ $as_echo "$as_me:$LINENO: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if test "${ac_cv_build+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+$as_echo "$as_me: error: invalid value of canonical build" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:$LINENO: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if test "${ac_cv_host+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+$as_echo "$as_me: error: invalid value of canonical host" >&2;}
+ { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
if test "x$GCC" = xyes ; then
CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \
-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \
-Wbad-function-cast"
- case `gcc -dumpversion` in
+ case `$CC -dumpversion` in
3.4.* | 4.*)
- CWARNFLAGS+=" -Wold-style-definition -Wdeclaration-after-statement"
+ CWARNFLAGS="$CWARNFLAGS -Wold-style-definition -Wdeclaration-after-statement"
;;
esac
else
@@ -4246,6 +4530,268 @@ fi
+
+
+
+
+
+# Check whether --enable-strict-compilation was given.
+if test "${enable_strict_compilation+set}" = set; then
+ enableval=$enable_strict_compilation; STRICT_COMPILE=$enableval
+else
+ STRICT_COMPILE=no
+fi
+
+if test "x$STRICT_COMPILE" = "xyes"; then
+ { $as_echo "$as_me:$LINENO: checking whether __SUNPRO_C is declared" >&5
+$as_echo_n "checking whether __SUNPRO_C is declared... " >&6; }
+if test "${ac_cv_have_decl___SUNPRO_C+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef __SUNPRO_C
+ (void) __SUNPRO_C;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_have_decl___SUNPRO_C=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl___SUNPRO_C=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___SUNPRO_C" >&5
+$as_echo "$ac_cv_have_decl___SUNPRO_C" >&6; }
+if test $ac_cv_have_decl___SUNPRO_C = yes; then
+ SUNCC="yes"
+else
+ SUNCC="no"
+fi
+
+ { $as_echo "$as_me:$LINENO: checking whether __INTEL_COMPILER is declared" >&5
+$as_echo_n "checking whether __INTEL_COMPILER is declared... " >&6; }
+if test "${ac_cv_have_decl___INTEL_COMPILER+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef __INTEL_COMPILER
+ (void) __INTEL_COMPILER;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_have_decl___INTEL_COMPILER=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_have_decl___INTEL_COMPILER=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___INTEL_COMPILER" >&5
+$as_echo "$ac_cv_have_decl___INTEL_COMPILER" >&6; }
+if test $ac_cv_have_decl___INTEL_COMPILER = yes; then
+ INTELCC="yes"
+else
+ INTELCC="no"
+fi
+
+ if test "x$GCC" = xyes ; then
+ STRICT_CFLAGS="-pedantic -Werror"
+ elif test "x$SUNCC" = "xyes"; then
+ STRICT_CFLAGS="-errwarn"
+ elif test "x$INTELCC" = "xyes"; then
+ STRICT_CFLAGS="-Werror"
+ fi
+fi
+CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS"
+
+
+
+
+# Check whether --with-release-version was given.
+if test "${with_release_version+set}" = set; then
+ withval=$with_release_version; RELEASE_VERSION="$withval"
+else
+ RELEASE_VERSION=""
+fi
+
+ if test "x$RELEASE_VERSION" != "x"; then
+ PACKAGE="$PACKAGE-$RELEASE_VERSION"
+ PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION"
+ { $as_echo "$as_me:$LINENO: Building with package name set to $PACKAGE" >&5
+$as_echo "$as_me: Building with package name set to $PACKAGE" >&6;}
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1`
+_ACEOF
+
+ PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1`
+ if test "x$PVM" = "x"; then
+ PVM="0"
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_MINOR $PVM
+_ACEOF
+
+ PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1`
+ if test "x$PVP" = "x"; then
+ PVP="0"
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_PATCHLEVEL $PVP
+_ACEOF
+
+
+
+CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > .changelog.tmp && \
+mv .changelog.tmp ChangeLog) || (rm -f .changelog.tmp; touch ChangeLog; \
+echo 'git directory not found: installing possibly empty changelog.' >&2)"
+
+distcleancheck_listfiles='find . -type f ! -name ChangeLog -print'
+
+
+
+
+
+if test x$APP_MAN_SUFFIX = x ; then
+ APP_MAN_SUFFIX=1
+fi
+if test x$APP_MAN_DIR = x ; then
+ APP_MAN_DIR='$(mandir)/man$(APP_MAN_SUFFIX)'
+fi
+
+if test x$LIB_MAN_SUFFIX = x ; then
+ LIB_MAN_SUFFIX=3
+fi
+if test x$LIB_MAN_DIR = x ; then
+ LIB_MAN_DIR='$(mandir)/man$(LIB_MAN_SUFFIX)'
+fi
+
+if test x$FILE_MAN_SUFFIX = x ; then
+ case $host_os in
+ solaris*) FILE_MAN_SUFFIX=4 ;;
+ *) FILE_MAN_SUFFIX=5 ;;
+ esac
+fi
+if test x$FILE_MAN_DIR = x ; then
+ FILE_MAN_DIR='$(mandir)/man$(FILE_MAN_SUFFIX)'
+fi
+
+if test x$MISC_MAN_SUFFIX = x ; then
+ case $host_os in
+ solaris*) MISC_MAN_SUFFIX=5 ;;
+ *) MISC_MAN_SUFFIX=7 ;;
+ esac
+fi
+if test x$MISC_MAN_DIR = x ; then
+ MISC_MAN_DIR='$(mandir)/man$(MISC_MAN_SUFFIX)'
+fi
+
+if test x$DRIVER_MAN_SUFFIX = x ; then
+ case $host_os in
+ solaris*) DRIVER_MAN_SUFFIX=7 ;;
+ *) DRIVER_MAN_SUFFIX=4 ;;
+ esac
+fi
+if test x$DRIVER_MAN_DIR = x ; then
+ DRIVER_MAN_DIR='$(mandir)/man$(DRIVER_MAN_SUFFIX)'
+fi
+
+if test x$ADMIN_MAN_SUFFIX = x ; then
+ case $host_os in
+ solaris*) ADMIN_MAN_SUFFIX=1m ;;
+ *) ADMIN_MAN_SUFFIX=8 ;;
+ esac
+fi
+if test x$ADMIN_MAN_DIR = x ; then
+ ADMIN_MAN_DIR='$(mandir)/man$(ADMIN_MAN_SUFFIX)'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# Checks for pkg-config packages
@@ -4479,317 +5025,96 @@ $as_echo "yes" >&6; }
:
fi
-LIBS="$XINPUT_LIBS $LIBS"
-{ $as_echo "$as_me:$LINENO: checking for XSetClientPointer" >&5
-$as_echo_n "checking for XSetClientPointer... " >&6; }
-if test "${ac_cv_func_XSetClientPointer+set}" = set; then
- $as_echo_n "(cached) " >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-/* Define XSetClientPointer to an innocuous variant, in case <limits.h> declares XSetClientPointer.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define XSetClientPointer innocuous_XSetClientPointer
-
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char XSetClientPointer (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef XSetClientPointer
+# XI2 support
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char XSetClientPointer ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_XSetClientPointer || defined __stub___XSetClientPointer
-choke me
-#endif
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for XI2" >&5
+$as_echo_n "checking for XI2... " >&6; }
-int
-main ()
-{
-return XSetClientPointer ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
- (eval "$ac_link") 2>conftest.er1
+if test -n "$PKG_CONFIG"; then
+ if test -n "$XI2_CFLAGS"; then
+ pkg_cv_XI2_CFLAGS="$XI2_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xi >= 1.2.99.2 inputproto >= 1.9.99.15\"") >&5
+ ($PKG_CONFIG --exists --print-errors "xi >= 1.2.99.2 inputproto >= 1.9.99.15") 2>&5
ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- $as_test_x conftest$ac_exeext
- }; then
- ac_cv_func_XSetClientPointer=yes
+ (exit $ac_status); }; then
+ pkg_cv_XI2_CFLAGS=`$PKG_CONFIG --cflags "xi >= 1.2.99.2 inputproto >= 1.9.99.15" 2>/dev/null`
else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_cv_func_XSetClientPointer=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
- conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_XSetClientPointer" >&5
-$as_echo "$ac_cv_func_XSetClientPointer" >&6; }
-if test $ac_cv_func_XSetClientPointer = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_XI2 1
-_ACEOF
-
+ pkg_failed=yes
fi
-
-
-
-if test "x$ac_cv_func_XSetClientPointer" = "xyes" ; then
- HAVE_XI2_TRUE=
- HAVE_XI2_FALSE='#'
+ fi
else
- HAVE_XI2_TRUE='#'
- HAVE_XI2_FALSE=
+ pkg_failed=untried
fi
-
-
-XINPUT_CFLAGS="$CWARNFLAGS $XINPUT_CFLAGS"
-
-
-
-
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
-$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
- { (exit 1); exit 1; }; }
-
-{ $as_echo "$as_me:$LINENO: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then
- $as_echo_n "(cached) " >&6
+if test -n "$PKG_CONFIG"; then
+ if test -n "$XI2_LIBS"; then
+ pkg_cv_XI2_LIBS="$XI2_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xi >= 1.2.99.2 inputproto >= 1.9.99.15\"") >&5
+ ($PKG_CONFIG --exists --print-errors "xi >= 1.2.99.2 inputproto >= 1.9.99.15") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ pkg_cv_XI2_LIBS=`$PKG_CONFIG --libs "xi >= 1.2.99.2 inputproto >= 1.9.99.15" 2>/dev/null`
else
- ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
- { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
- { (exit 1); exit 1; }; }
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
-$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
- { (exit 1); exit 1; }; }
-
+ pkg_failed=yes
fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
-$as_echo "$as_me: error: invalid value of canonical build" >&2;}
- { (exit 1); exit 1; }; };;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:$LINENO: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then
- $as_echo_n "(cached) " >&6
-else
- if test "x$host_alias" = x; then
- ac_cv_host=$ac_cv_build
+ fi
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
-$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
-$as_echo "$as_me: error: invalid value of canonical host" >&2;}
- { (exit 1); exit 1; }; };;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-
-
-
-if test x$APP_MAN_SUFFIX = x ; then
- APP_MAN_SUFFIX=1
-fi
-if test x$APP_MAN_DIR = x ; then
- APP_MAN_DIR='$(mandir)/man$(APP_MAN_SUFFIX)'
-fi
-
-if test x$LIB_MAN_SUFFIX = x ; then
- LIB_MAN_SUFFIX=3
-fi
-if test x$LIB_MAN_DIR = x ; then
- LIB_MAN_DIR='$(mandir)/man$(LIB_MAN_SUFFIX)'
-fi
-
-if test x$FILE_MAN_SUFFIX = x ; then
- case $host_os in
- solaris*) FILE_MAN_SUFFIX=4 ;;
- *) FILE_MAN_SUFFIX=5 ;;
- esac
-fi
-if test x$FILE_MAN_DIR = x ; then
- FILE_MAN_DIR='$(mandir)/man$(FILE_MAN_SUFFIX)'
-fi
-
-if test x$MISC_MAN_SUFFIX = x ; then
- case $host_os in
- solaris*) MISC_MAN_SUFFIX=5 ;;
- *) MISC_MAN_SUFFIX=7 ;;
- esac
-fi
-if test x$MISC_MAN_DIR = x ; then
- MISC_MAN_DIR='$(mandir)/man$(MISC_MAN_SUFFIX)'
-fi
-
-if test x$DRIVER_MAN_SUFFIX = x ; then
- case $host_os in
- solaris*) DRIVER_MAN_SUFFIX=7 ;;
- *) DRIVER_MAN_SUFFIX=4 ;;
- esac
-fi
-if test x$DRIVER_MAN_DIR = x ; then
- DRIVER_MAN_DIR='$(mandir)/man$(DRIVER_MAN_SUFFIX)'
-fi
-
-if test x$ADMIN_MAN_SUFFIX = x ; then
- case $host_os in
- solaris*) ADMIN_MAN_SUFFIX=1m ;;
- *) ADMIN_MAN_SUFFIX=8 ;;
- esac
-fi
-if test x$ADMIN_MAN_DIR = x ; then
- ADMIN_MAN_DIR='$(mandir)/man$(ADMIN_MAN_SUFFIX)'
+ pkg_failed=untried
fi
+if test $pkg_failed = yes; then
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-release-version was given.
-if test "${with_release_version+set}" = set; then
- withval=$with_release_version; RELEASE_VERSION="$withval"
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
else
- RELEASE_VERSION=""
+ _pkg_short_errors_supported=no
fi
+ if test $_pkg_short_errors_supported = yes; then
+ XI2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xi >= 1.2.99.2 inputproto >= 1.9.99.15"`
+ else
+ XI2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xi >= 1.2.99.2 inputproto >= 1.9.99.15"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$XI2_PKG_ERRORS" >&5
- if test "x$RELEASE_VERSION" != "x"; then
- PACKAGE="$PACKAGE-$RELEASE_VERSION"
- PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION"
- { $as_echo "$as_me:$LINENO: Building with package name set to $PACKAGE" >&5
-$as_echo "$as_me: Building with package name set to $PACKAGE" >&6;}
- fi
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1`
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_XI2="no"
+elif test $pkg_failed = untried; then
+ HAVE_XI2="no"
+else
+ XI2_CFLAGS=$pkg_cv_XI2_CFLAGS
+ XI2_LIBS=$pkg_cv_XI2_LIBS
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_XI2="yes";
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_XI2 1
_ACEOF
- PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1`
- if test "x$PVM" = "x"; then
- PVM="0"
- fi
+fi;
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION_MINOR $PVM
-_ACEOF
- PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1`
- if test "x$PVP" = "x"; then
- PVP="0"
- fi
+if test "$HAVE_XI2" = "yes" ; then
+ HAVE_XI2_TRUE=
+ HAVE_XI2_FALSE='#'
+else
+ HAVE_XI2_TRUE='#'
+ HAVE_XI2_FALSE=
+fi
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION_PATCHLEVEL $PVP
-_ACEOF
-CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > .changelog.tmp && \
-mv .changelog.tmp ChangeLog) || (rm -f .changelog.tmp; touch ChangeLog; \
-echo 'git directory not found: installing possibly empty changelog.' >&2)"
-distcleancheck_listfiles='find . -type f ! -name ChangeLog -print'
@@ -5242,7 +5567,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by xinput $as_me 1.4.2, which was
+This file was extended by xinput $as_me 1.5.0, which was
generated by GNU Autoconf 2.62. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -5295,7 +5620,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-xinput config.status 1.4.2
+xinput config.status 1.5.0
configured by $0, generated by GNU Autoconf 2.62,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/app/xinput/configure.ac b/app/xinput/configure.ac
index 3d95380c8..19e9fd66f 100644
--- a/app/xinput/configure.ac
+++ b/app/xinput/configure.ac
@@ -2,39 +2,36 @@ dnl Copyright 2007 Peter Hutterer <peter@cs.unisa.edu.au>
dnl Process this file with autoconf to create configure.
AC_PREREQ([2.57])
-AC_INIT(xinput,[1.4.2], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xinput)
+AC_INIT(xinput,[1.5.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xinput)
AM_INIT_AUTOMAKE([dist-bzip2])
AM_MAINTAINER_MODE
-# Require xorg-macros: XORG_CWARNFLAGS, XORG_CHANGELOG
-m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.2 or later before running autoconf/autogen])])
-XORG_MACROS_VERSION(1.2)
+# Require xorg-macros: XORG_DEFAULT_OPTIONS
+m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.3 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.3)
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_INSTALL
-XORG_CWARNFLAGS
+XORG_DEFAULT_OPTIONS
# Checks for pkg-config packages
PKG_CHECK_MODULES(XINPUT, x11 xext [xi >= 1.2] [inputproto >= 1.5])
-LIBS="$XINPUT_LIBS $LIBS"
-AC_CHECK_FUNC(XSetClientPointer,AC_DEFINE(HAVE_XI2,1,[XInput Version 2 Enabled]))
-AM_CONDITIONAL(HAVE_XI2, [test "x$ac_cv_func_XSetClientPointer" = "xyes"] )
+# XI2 support
+PKG_CHECK_MODULES(XI2, [xi >= 1.2.99.2] [inputproto >= 1.9.99.15],
+ HAVE_XI2="yes"; AC_DEFINE(HAVE_XI2, 1, [XI2 available]),
+ HAVE_XI2="no");
+AM_CONDITIONAL(HAVE_XI2, [ test "$HAVE_XI2" = "yes" ])
-XINPUT_CFLAGS="$CWARNFLAGS $XINPUT_CFLAGS"
AC_SUBST(XINPUT_CFLAGS)
AC_SUBST(XINPUT_LIBS)
AC_SUBST(HAVE_XI2)
AC_SUBST(VERSION)
-XORG_MANPAGE_SECTIONS
-XORG_RELEASE_VERSION
-XORG_CHANGELOG
-
AC_OUTPUT([Makefile
src/Makefile
man/Makefile])
diff --git a/app/xinput/man/Makefile.in b/app/xinput/man/Makefile.in
index f15c26b02..15643f9f9 100644
--- a/app/xinput/man/Makefile.in
+++ b/app/xinput/man/Makefile.in
@@ -142,6 +142,8 @@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
+XI2_CFLAGS = @XI2_CFLAGS@
+XI2_LIBS = @XI2_LIBS@
XINPUT_CFLAGS = @XINPUT_CFLAGS@
XINPUT_LIBS = @XINPUT_LIBS@
ac_ct_CC = @ac_ct_CC@
diff --git a/app/xinput/man/xinput.man b/app/xinput/man/xinput.man
index 8f4cefbd8..fbf445e65 100644
--- a/app/xinput/man/xinput.man
+++ b/app/xinput/man/xinput.man
@@ -1,89 +1,104 @@
-.\" $Id: xinput.man,v 1.3 2009/05/18 20:50:16 matthieu Exp $
-.TH xinput 1 "$Date: 2009/05/18 20:50:16 $" "Frederic Lepied"
+.TH xinput 1 __xorgversion__
.SH NAME
-xinput - utility to configure and test XInput devices
+xinput - utility to configure and test X input devices
.SH SYNOPSIS
-.B xinput
-[version] [list [\fIdevice_name\fP]] [set-pointer \fIdevice_name\fP]
-[get-feedbacks \fIdevice_name\fP]
-[set-mode \fIdevice_name\fP \fIABSOLUTE|RELATIVE\fP]
-[set-ptr-feedback \fIdevice_name\fP \fIthreshold\fP \fInum\fP \fIdenom\fP]
-[set-integer-feedback \fIdevice_name\fP \fIindex\fP \fIvalue\fP]
-[set-button-map \fIdevice_name\fP \fImap button 1\fP [\fImap button 2\fP [\fI...\fP]]]
-[query-state \fIdevice_name\fP]
-[test [-proximity] \fIdevice_name\fP]
+.B xinput [OPTIONS] [DEVICE]
.SH DESCRIPTION
+xinput is a utility to list available input devices, query information about
+a device and change input device settings.
+.SH OPTIONS
.TP 8
-.B xinput version
-test if the XInput extension is available and return the version number
-of the program.
+.B --version
+Test if the X Input extension is available and return the version number
+of the program and the version supported by the server. This option does not
+require a device name.
.PP
.TP 8
-.B xinput list [\fIdevice_name\fP]
-If no argument is given list all the input devices showing all their
-features. If an argument is given, show all the feature of \fIdevice_name\fP.
-Uses XListInputDevices(3).
+.B --list [--short || --long] [\fIdevice\fP]
+If no argument is given list all the input devices. If an argument is given,
+show all the features of \fIdevice\fP. Uses XListInputDevices(3).
+If --long is provided, the output includes detailed information about the
+capabilities of each devices. Otherwise, or if --short is provided, only the
+device names and some minimal information is listed.
.PP
.TP 8
-.B xinput get-feedbacks \fIdevice_name\fP
-Display the feedbacks of \fIdevice_name\fP. Uses XGetFeedbackControl(3).
+.B --get-feedbacks \fIdevice\fP
+Display the feedbacks of \fIdevice\fP.
.PP
.TP 8
-.B xinput set-pointer \fIdevice_name\fP
-Switch \fIdevice_name\fP in core pointer. Uses XChangePointerDevice(3).
+.B --set-pointer \fIdevice\fP
+Switch \fIdevice\fP in core pointer.
+This option does nothing on X servers 1.5 and later.
.PP
.TP 8
-.B xinput set-mode \fIdevice_name\fP \fIABSOLUTE|RELATIVE\fP
-Change the mode of \fIdevice_name\fP. Uses XSetDeviceMode(3).
+.B --set-mode \fIdevice\fP \fIABSOLUTE|RELATIVE\fP
+Change the mode of \fIdevice\fP.
.PP
.TP 8
-.B xinput set-ptr-feedback \fIdevice_name\fP \fIthreshold\fP \fInum\fP \fIdenom\fP
-Change the acceleration of \fIdevice_name\fP. Uses XChangeFeedbackControl(3).
+.B --set-ptr-feedback \fIdevice\fP \fIthreshold\fP \fInum\fP \fIdenom\fP
+Change the acceleration of \fIdevice\fP.
.PP
.TP 8
-.B xinput set-integer-feedback \fIdevice_name\fP \fIindex\fP \fIvalue\fP
-Change the value of an integer feedback of \fIdevice_name\fP. Uses XChangeFeedbackControl(3).
+.B --set-integer-feedback \fIdevice\fP \fIindex\fP \fIvalue\fP
+Change the value of an integer feedback of \fIdevice\fP.
.PP
.TP 8
-.B xinput set-button-map \fIdevice_name\fP \fImap button 1\fP [\fImap button 2\fP [\fI...\fP]]
-Change the button mapping of \fIdevice_name\fP. Uses XSetDeviceButtonMapping(3).
+.B --set-button-map \fIdevice\fP \fImap_button_1\fP [\fImap_button_2\fP [\fI...\fP]]
+Change the button mapping of \fIdevice\fP. The buttons are specified in
+physical order (starting with button 1) and are mapped to the logical button
+provided. 0 disables a button. The default button mapping for a device is 1
+2 3 4 5 6 etc.
.PP
.TP 8
-.B xinput query-state \fIdevice_name\fP
-Query the device state. Uses XQueryDeviceState(3).
+.B --query-state \fIdevice\fP
+Query the device state.
.PP
.TP 8
-.B xinput list-props \fIdevice_name\fP [\fIdevice_name\fP...]
+.B --list-props \fIdevice\fP [\fIdevice\fP [\fI...\fP]]
Lists properties that can be set for the given device(s).
.PP
.TP 8
-.B xinput set-int-prop \fIdevice_name\fP \fIproperty\fP \fIformat\fP \fIvalue\fP
+.B --set-int-prop \fIdevice\fP \fIproperty\fP \fIformat\fP \fIvalue\fP
Sets an integer property for the device. Appropriate values for \fIformat\fP
-are 8, 16, or 32, depending on the property.
+are 8, 16, or 32, depending on the property. Deprecated, use
+.B --set-prop
+instead.
.PP
.TP 8
-.B xinput set-float-prop \fIdevice_name\fP \fIproperty\fP \fIvalue\fP
-Sets a float property for the device.
+.B --set-float-prop \fIdevice\fP \fIproperty\fP \fIvalue\fP
+Sets a float property for the device. Deprecated, use
+.B --set-prop
+instead.
.PP
.TP 8
-.B xinput watch-props \fIdevice_name\fP
+.B --set\-prop [\-\-type=\fIatom|float|int\fP] [\-\-format=\fI8|16|32\fP] \fIdevice\fP \fIproperty\fP \fIvalue\fP [...]
+Set the property to the given value(s). If not specified, the format and type
+of the property are left as-is. The arguments are interpreted according to the
+property type.
+.PP
+.TP 8
+.B --watch-props \fIdevice\fP
Prints to standard out when property changes occur.
.PP
.TP 8
-.B xinput delete-prop \fIdevice_name\fP \fIproperty\fP
+.B --delete-prop \fIdevice\fP \fIproperty\fP
Delete the property from the device.
.PP
-.PP
.TP 8
-.B xinput test [-proximity] \fIdevice_name\fP
-Register all extended events from \fIdevice_name\fP and enter an endless
+.B --test [-proximity] \fIdevice\fP
+Register all extended events from \fIdevice\fP and enter an endless
loop displaying events received. If the -proximity is given, ProximityIn
and ProximityOut are registered.
.PP
-\fIdevice_name\fP can be the device name as a string or the XID of the
+.TP 8
+.B --test_xi2
+Register for a number of XI2 events and display them. This option does not
+take a device argument.
+.PP
+\fIdevice\fP can be the device name as a string or the XID of the
device.
.PP
\fIproperty\fP can be the property as a string or the Atom value.
@@ -94,11 +109,13 @@ Copyright 1996,1997, Frederic Lepied.
.PP
Copyright 2008, Philip Langdale.
-.SH AUTHOR
+.SH AUTHORS
.nf
Philip Langdale, <philipl@alumni.utexas.net>
Frederic Lepied, France <Frederic.Lepied@sugix.frmug.org>
+Peter Hutterer <peter.hutterer@who-t.net>
+Julien Cristau <jcristau@debian.org>
+Thomas Jaeger <ThJaeger@gmail.com>
+and more.
.fi
-
-Patches, bug reports, and suggestions are welcome.
diff --git a/app/xinput/src/Makefile.am b/app/xinput/src/Makefile.am
index 1efddb888..ba0d325ac 100644
--- a/app/xinput/src/Makefile.am
+++ b/app/xinput/src/Makefile.am
@@ -26,8 +26,8 @@ xinput_LDADD = $(XINPUT_LIBS)
if HAVE_XI2
- xinput2_files = hierarchy.c setcp.c
-endif # HAVE_XI2
+xinput2_files = hierarchy.c setcp.c test_xi2.c
+endif
xinput_SOURCES = \
buttonmap.c \
@@ -39,7 +39,6 @@ xinput_SOURCES = \
state.c \
property.c \
test.c \
- version.c \
xinput.c \
xinput.h \
$(xinput2_files)
diff --git a/app/xinput/src/Makefile.in b/app/xinput/src/Makefile.in
index 040d73972..4ba411ca1 100644
--- a/app/xinput/src/Makefile.in
+++ b/app/xinput/src/Makefile.in
@@ -71,14 +71,14 @@ am__installdirs = "$(DESTDIR)$(bindir)"
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS)
am__xinput_SOURCES_DIST = buttonmap.c feedback.c list.c setint.c \
- setmode.c setptr.c state.c property.c test.c version.c \
- xinput.c xinput.h hierarchy.c setcp.c
-@HAVE_XI2_TRUE@am__objects_1 = hierarchy.$(OBJEXT) setcp.$(OBJEXT)
+ setmode.c setptr.c state.c property.c test.c xinput.c xinput.h \
+ hierarchy.c setcp.c test_xi2.c
+@HAVE_XI2_TRUE@am__objects_1 = hierarchy.$(OBJEXT) setcp.$(OBJEXT) \
+@HAVE_XI2_TRUE@ test_xi2.$(OBJEXT)
am_xinput_OBJECTS = buttonmap.$(OBJEXT) feedback.$(OBJEXT) \
list.$(OBJEXT) setint.$(OBJEXT) setmode.$(OBJEXT) \
setptr.$(OBJEXT) state.$(OBJEXT) property.$(OBJEXT) \
- test.$(OBJEXT) version.$(OBJEXT) xinput.$(OBJEXT) \
- $(am__objects_1)
+ test.$(OBJEXT) xinput.$(OBJEXT) $(am__objects_1)
xinput_OBJECTS = $(am_xinput_OBJECTS)
am__DEPENDENCIES_1 =
xinput_DEPENDENCIES = $(am__DEPENDENCIES_1)
@@ -158,6 +158,8 @@ SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
+XI2_CFLAGS = @XI2_CFLAGS@
+XI2_LIBS = @XI2_LIBS@
XINPUT_CFLAGS = @XINPUT_CFLAGS@
XINPUT_LIBS = @XINPUT_LIBS@
ac_ct_CC = @ac_ct_CC@
@@ -206,7 +208,7 @@ sysconfdir = @sysconfdir@
target_alias = @target_alias@
AM_CFLAGS = $(XINPUT_CFLAGS)
xinput_LDADD = $(XINPUT_LIBS)
-@HAVE_XI2_TRUE@xinput2_files = hierarchy.c setcp.c
+@HAVE_XI2_TRUE@xinput2_files = hierarchy.c setcp.c test_xi2.c
xinput_SOURCES = \
buttonmap.c \
feedback.c \
@@ -217,7 +219,6 @@ xinput_SOURCES = \
state.c \
property.c \
test.c \
- version.c \
xinput.c \
xinput.h \
$(xinput2_files)
@@ -299,7 +300,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setptr.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_xi2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xinput.Po@am__quote@
.c.o:
diff --git a/app/xinput/src/hierarchy.c b/app/xinput/src/hierarchy.c
index 869c3fd8e..7f35c3988 100644
--- a/app/xinput/src/hierarchy.c
+++ b/app/xinput/src/hierarchy.c
@@ -40,7 +40,7 @@
int
create_master(Display* dpy, int argc, char** argv, char* name, char *desc)
{
- XCreateMasterInfo c;
+ XIAddMasterInfo c;
if (argc == 0)
{
@@ -48,12 +48,12 @@ create_master(Display* dpy, int argc, char** argv, char* name, char *desc)
return EXIT_FAILURE;
}
- c.type = CH_CreateMasterDevice;
+ c.type = XIAddMaster;
c.name = argv[0];
- c.sendCore = (argc >= 2) ? atoi(argv[1]) : 1;
+ c.send_core = (argc >= 2) ? atoi(argv[1]) : 1;
c.enable = (argc >= 3) ? atoi(argv[2]) : 1;
- return XChangeDeviceHierarchy(dpy, (XAnyHierarchyChangeInfo*)&c, 1);
+ return XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&c, 1);
}
/**
@@ -64,9 +64,8 @@ create_master(Display* dpy, int argc, char** argv, char* name, char *desc)
int
remove_master(Display* dpy, int argc, char** argv, char *name, char *desc)
{
- XDeviceInfo *info;
- XRemoveMasterInfo r;
- XDevice* master = NULL, *ptr = NULL, *keybd = NULL;
+ XIRemoveMasterInfo r;
+ XIDeviceInfo *info;
int ret;
if (argc == 0)
@@ -75,45 +74,67 @@ remove_master(Display* dpy, int argc, char** argv, char *name, char *desc)
return EXIT_FAILURE;
}
- info = find_device_info(dpy, argv[0], False);
+ info = xi2_find_device_info(dpy, argv[0]);
if (!info) {
fprintf(stderr, "unable to find device %s\n", argv[0]);
return EXIT_FAILURE;
}
- master = XOpenDevice(dpy, info->id);
- if (!master)
- Error(BadValue, "Unable to open device %s.\n", argv[0]);
-
- r.type = CH_RemoveMasterDevice;
- r.device = master;
+ r.type = XIRemoveMaster;
+ r.deviceid = info->deviceid;
if (argc >= 2)
{
if (!strcmp(argv[1], "Floating"))
- r.returnMode = Floating;
+ r.return_mode = XIFloating;
else if (!strcmp(argv[1], "AttachToMaster"))
- r.returnMode = AttachToMaster;
+ r.return_mode = XIAttachToMaster;
else
- Error(BadValue, "Invalid returnMode.\n");
+ Error(BadValue, "Invalid return_mode.\n");
} else
- r.returnMode = Floating;
+ r.return_mode = XIFloating;
- if (r.returnMode == AttachToMaster)
+ if (r.return_mode == XIAttachToMaster)
{
- ptr = XOpenDevice(dpy, atoi(argv[2]));
- keybd = XOpenDevice(dpy, atoi(argv[3]));
- if (!ptr || !keybd)
- Error(BadValue, "Invalid fallback master.\n");
- r.returnPointer = ptr;
- r.returnKeyboard = keybd;
+ r.return_pointer = 0;
+ if (argc >= 3) {
+ info = xi2_find_device_info(dpy, argv[2]);
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[2]);
+ return EXIT_FAILURE;
+ }
+
+ r.return_pointer = info->deviceid;
+ }
+
+ r.return_keyboard = 0;
+ if (argc >= 4) {
+ info = xi2_find_device_info(dpy, argv[3]);
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[3]);
+ return EXIT_FAILURE;
+ }
+
+ r.return_keyboard = info->deviceid;
+ }
+
+ if (!r.return_pointer || !r.return_keyboard) {
+ int i, ndevices;
+ info = XIQueryDevice(dpy, XIAllMasterDevices, &ndevices);
+ for(i = 0; i < ndevices; i++) {
+ if (info[i].use == XIMasterPointer && !r.return_pointer)
+ r.return_pointer = info[i].deviceid;
+ if (info[i].use == XIMasterKeyboard && !r.return_keyboard)
+ r.return_keyboard = info[i].deviceid;
+ if (r.return_pointer && r.return_keyboard)
+ break;
+ }
+
+ XIFreeDeviceInfo(info);
+ }
}
- ret = XChangeDeviceHierarchy(dpy, (XAnyHierarchyChangeInfo*)&r, 1);
- if (ptr)
- XCloseDevice(dpy, ptr);
- if (keybd)
- XCloseDevice(dpy, keybd);
+ ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&r, 1);
return ret;
}
@@ -123,9 +144,8 @@ remove_master(Display* dpy, int argc, char** argv, char *name, char *desc)
int
change_attachment(Display* dpy, int argc, char** argv, char *name, char* desc)
{
- XDeviceInfo *info_sd, *info_md;
- XChangeAttachmentInfo c;
- XDevice *slave, *master;
+ XIDeviceInfo *sd_info, *md_info;
+ XIAttachSlaveInfo c;
int ret;
if (argc < 2)
@@ -134,36 +154,24 @@ change_attachment(Display* dpy, int argc, char** argv, char *name, char* desc)
return EXIT_FAILURE;
}
- info_sd = find_device_info(dpy, argv[0], True);
- info_md = find_device_info(dpy, argv[1], False);
+ sd_info = xi2_find_device_info(dpy, argv[0]);
+ md_info= xi2_find_device_info(dpy, argv[1]);
- if (!info_sd) {
+ if (!sd_info) {
fprintf(stderr, "unable to find device %s\n", argv[0]);
return EXIT_FAILURE;
}
- if (!info_md) {
+ if (!md_info) {
fprintf(stderr, "unable to find device %s\n", argv[1]);
return EXIT_FAILURE;
}
- slave = XOpenDevice(dpy, info_sd->id);
- master = XOpenDevice(dpy, info_md->id);
-
- if (!slave)
- Error(BadValue, "Invalid slave device given %d\n", atoi(argv[0]));
-
- if (!master)
- Error(BadValue, "Invalid master device given %d\n", atoi(argv[1]));
+ c.type = XIAttachSlave;
+ c.deviceid = sd_info->deviceid;
+ c.new_master = md_info->deviceid;
- c.type = CH_ChangeAttachment;
- c.changeMode = AttachToMaster;
- c.device = slave;
- c.newMaster = master;
-
- ret = XChangeDeviceHierarchy(dpy, (XAnyHierarchyChangeInfo*)&c, 1);
- XCloseDevice(dpy, slave);
- XCloseDevice(dpy, master);
+ ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&c, 1);
return ret;
}
@@ -173,9 +181,8 @@ change_attachment(Display* dpy, int argc, char** argv, char *name, char* desc)
int
float_device(Display* dpy, int argc, char** argv, char* name, char* desc)
{
- XDeviceInfo *info;
- XChangeAttachmentInfo c;
- XDevice *slave;
+ XIDeviceInfo *info;
+ XIDetachSlaveInfo c;
int ret;
if (argc < 1)
@@ -184,24 +191,17 @@ float_device(Display* dpy, int argc, char** argv, char* name, char* desc)
return EXIT_FAILURE;
}
- info = find_device_info(dpy, argv[0], True);
+ info = xi2_find_device_info(dpy, argv[0]);
if (!info) {
fprintf(stderr, "unable to find device %s\n", argv[0]);
return EXIT_FAILURE;
}
- slave = XOpenDevice(dpy, info->id);
-
- if (!slave)
- return BadValue;
-
- c.type = CH_ChangeAttachment;
- c.changeMode = Floating;
- c.device = slave;
+ c.type = XIDetachSlave;
+ c.deviceid = info->deviceid;
- ret = XChangeDeviceHierarchy(dpy, (XAnyHierarchyChangeInfo*)&c, 1);
- XCloseDevice(dpy, slave);
+ ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&c, 1);
return ret;
}
diff --git a/app/xinput/src/list.c b/app/xinput/src/list.c
index bd71a5ccc..ecf1f4ba5 100644
--- a/app/xinput/src/list.c
+++ b/app/xinput/src/list.c
@@ -34,9 +34,6 @@ print_info(Display* dpy, XDeviceInfo *info, Bool shortformat)
XButtonInfoPtr b;
XValuatorInfoPtr v;
XAxisInfoPtr a;
-#if HAVE_XI2
- XAttachInfoPtr att;
-#endif
printf("\"%s\"\tid=%ld\t[", info->name, info->id);
@@ -98,12 +95,6 @@ print_info(Display* dpy, XDeviceInfo *info, Bool shortformat)
printf ("\t\tResolution is %d\n", a->resolution);
}
break;
-#if HAVE_XI2
- case AttachClass:
- att = (XAttachInfoPtr)any;
- printf("\tAttached to %d\n", att->attached);
- break;
-#endif
default:
printf ("unknown class\n");
}
@@ -112,78 +103,221 @@ print_info(Display* dpy, XDeviceInfo *info, Bool shortformat)
}
}
-int
-list(Display *display,
- int argc,
- char *argv[],
- char *name,
- char *desc)
+static int list_xi1(Display *display,
+ int shortformat)
{
XDeviceInfo *info;
int loop;
- int shortformat = False;
- int daemon = False;
+ int num_devices;
- shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
- daemon = (argc == 1 && strcmp(argv[0], "--loop") == 0);
+ info = XListInputDevices(display, &num_devices);
+ for(loop=0; loop<num_devices; loop++) {
+ print_info(display, info+loop, shortformat);
+ }
+ return EXIT_SUCCESS;
+}
- if (argc == 0 || shortformat || daemon) {
- int num_devices;
- XEvent ev;
+#ifdef HAVE_XI2
+/* also used from test_xi2.c */
+void
+print_classes_xi2(Display* display, XIAnyClassInfo **classes,
+ int num_classes)
+{
+ int i, j;
-#if HAVE_XI2
- if (daemon)
+ printf("\tReporting %d classes:\n", num_classes);
+ for (i = 0; i < num_classes; i++)
+ {
+ printf("\t\tClass originated from: %d\n", classes[i]->sourceid);
+ switch(classes[i]->type)
{
- XiSelectEvent(display, DefaultRootWindow(display), NULL,
- XI_DeviceHierarchyChangedMask |
- XI_DeviceClassesChangedMask);
+ case XIButtonClass:
+ {
+ XIButtonClassInfo *b = (XIButtonClassInfo*)classes[i];
+ char *name;
+ printf("\t\tButtons supported: %d\n", b->num_buttons);
+ printf("\t\tButton labels:");
+ for (j = 0; j < b->num_buttons; j++)
+ {
+ name = (b->labels[j]) ? XGetAtomName(display, b->labels[j]) : NULL;
+ printf(" %s", (name) ? name : "None");
+ XFree(name);
+ }
+ printf("\n");
+ printf("\t\tButton state:");
+ for (j = 0; j < b->state.mask_len * 8; j++)
+ if (XIMaskIsSet(b->state.mask, j))
+ printf(" %d", j);
+ printf("\n");
+
+ }
+ break;
+ case XIKeyClass:
+ {
+ XIKeyClassInfo *k = (XIKeyClassInfo*)classes[i];
+ printf("\t\tKeycodes supported: %d\n", k->num_keycodes);
+ }
+ break;
+ case XIValuatorClass:
+ {
+ XIValuatorClassInfo *v = (XIValuatorClassInfo*)classes[i];
+ char *name = v->label ? XGetAtomName(display, v->label) : NULL;
+
+ printf("\t\tDetail for Valuator %d:\n", v->number);
+ printf("\t\t Label: %s\n", (name) ? name : "None");
+ printf("\t\t Range: %f - %f\n", v->min, v->max);
+ printf("\t\t Resolution: %d units/m\n", v->resolution);
+ printf("\t\t Mode: %s\n", v->mode == Absolute ? "absolute" :
+ "relative");
+ if (v->mode == Absolute)
+ printf("\t\t Current value: %f\n", v->value);
+ XFree(name);
+ }
+ break;
}
-#endif
+ }
- do {
- info = XListInputDevices(display, &num_devices);
- for(loop=0; loop<num_devices; loop++) {
- print_info(display, info+loop, shortformat);
- }
+ printf("\n");
+}
-#if HAVE_XI2
- /* just wait for the next generic event to come along */
- while (daemon && !XNextEvent(display, &ev))
+static void
+print_info_xi2(Display* display, XIDeviceInfo *dev, Bool shortformat)
+{
+ printf("%-40s\tid=%d\t[", dev->name, dev->deviceid);
+ switch(dev->use)
+ {
+ case XIMasterPointer:
+ printf("master pointer (%d)]\n", dev->attachment);
+ break;
+ case XIMasterKeyboard:
+ printf("master keyboard (%d)]\n", dev->attachment);
+ break;
+ case XISlavePointer:
+ printf("slave pointer (%d)]\n", dev->attachment);
+ break;
+ case XISlaveKeyboard:
+ printf("slave keyboard (%d)]\n", dev->attachment);
+ break;
+ case XIFloatingSlave:
+ printf("floating slave]\n");
+ break;
+ }
+
+ if (shortformat)
+ return;
+
+ if (!dev->enabled)
+ printf("\tThis device is disabled\n");
+
+ print_classes_xi2(display, dev->classes, dev->num_classes);
+}
+
+
+static int
+list_xi2(Display *display,
+ int shortformat)
+{
+ int major = XI_2_Major,
+ minor = XI_2_Minor;
+ int ndevices;
+ int i, j;
+ XIDeviceInfo *info, *dev;
+
+ if (XIQueryVersion(display, &major, &minor) != Success ||
+ (major * 1000 + minor) < (XI_2_Major * 1000 + XI_2_Minor))
+ {
+ fprintf(stderr, "XI2 not supported.\n");
+ return EXIT_FAILURE;
+ }
+
+ info = XIQueryDevice(display, XIAllDevices, &ndevices);
+
+ for(i = 0; i < ndevices; i++)
+ {
+ dev = &info[i];
+ if (dev->use == XIMasterPointer || dev->use == XIMasterKeyboard)
+ {
+ if (dev->use == XIMasterPointer)
+ printf("⎡ ");
+ else
+ printf("⎣ ");
+
+ print_info_xi2(display, dev, shortformat);
+ for (j = 0; j < ndevices; j++)
{
- if (ev.type == GenericEvent)
+ XIDeviceInfo* sd = &info[j];
+
+ if ((sd->use == XISlavePointer || sd->use == XISlaveKeyboard) &&
+ (sd->attachment == dev->deviceid))
{
- XGenericEvent* gev = (XGenericEvent*)&ev;
- /* we just assume that extension is IReqCode, pretty save
- since we don't register for other events. */
- if (gev->evtype == XI_DeviceHierarchyChangedNotify)
- {
- printf("Hierarchy change.\n");
- } else if (gev->evtype == XI_DeviceClassesChangedNotify)
- {
- printf("Device classes changed.\n");
- free(((XDeviceClassesChangedEvent*)&ev)->inputclassinfo);
- }
- break;
+ printf("%s ↳ ", dev->use == XIMasterPointer ? "⎜" : " ");
+ print_info_xi2(display, sd, shortformat);
}
}
+ }
+ }
+
+ for (i = 0; i < ndevices; i++)
+ {
+ dev = &info[i];
+ if (dev->use == XIFloatingSlave)
+ {
+ printf("∼ ");
+ print_info_xi2(display, dev, shortformat);
+ }
+ }
+
+
+ XIFreeDeviceInfo(info);
+ return EXIT_SUCCESS;
+}
#endif
- } while(daemon);
- } else {
- int ret = EXIT_SUCCESS;
- for(loop=0; loop<argc; loop++) {
- info = find_device_info(display, argv[loop], False);
+int
+list(Display *display,
+ int argc,
+ char *argv[],
+ char *name,
+ char *desc)
+{
+ int shortformat = (argc >= 1 && strcmp(argv[0], "--short") == 0);
+ int longformat = (argc >= 1 && strcmp(argv[0], "--long") == 0);
+ int arg_dev = shortformat || longformat;
- if (!info) {
- fprintf(stderr, "unable to find device %s\n", argv[loop]);
- ret = EXIT_FAILURE;
- } else {
- print_info(display, info, shortformat);
- }
- }
- return ret;
+ if (argc > arg_dev)
+ {
+#ifdef HAVE_XI2
+ if (xinput_version(display) == XI_2_Major)
+ {
+ XIDeviceInfo *info = xi2_find_device_info(display, argv[arg_dev]);
+
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
+ return EXIT_FAILURE;
+ } else {
+ print_info_xi2(display, info, shortformat);
+ return EXIT_SUCCESS;
+ }
+ } else
+#endif
+ {
+ XDeviceInfo *info = find_device_info(display, argv[arg_dev], False);
+
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
+ return EXIT_FAILURE;
+ } else {
+ print_info(display, info, shortformat);
+ return EXIT_SUCCESS;
+ }
+ }
+ } else {
+#ifdef HAVE_XI2
+ if (xinput_version(display) == XI_2_Major)
+ return list_xi2(display, !longformat);
+#endif
+ return list_xi1(display, !longformat);
}
- return EXIT_SUCCESS;
}
/* end of list.c */
diff --git a/app/xinput/src/property.c b/app/xinput/src/property.c
index 60565ed5e..6cd8e7af1 100644
--- a/app/xinput/src/property.c
+++ b/app/xinput/src/property.c
@@ -34,6 +34,23 @@
#include "xinput.h"
+static Atom parse_atom(Display *dpy, char *name) {
+ Bool is_atom = True;
+ int i;
+
+ for (i = 0; name[i] != '\0'; i++) {
+ if (!isdigit(name[i])) {
+ is_atom = False;
+ break;
+ }
+ }
+
+ if (is_atom)
+ return atoi(name);
+ else
+ return XInternAtom(dpy, name, False);
+}
+
static void
print_property(Display *dpy, XDevice* dev, Atom property)
{
@@ -55,6 +72,9 @@ print_property(Display *dpy, XDevice* dev, Atom property)
ptr = data;
+ if (nitems == 0)
+ printf("<no items>");
+
switch(act_format)
{
case 8: size = sizeof(char); break;
@@ -94,8 +114,13 @@ print_property(Display *dpy, XDevice* dev, Atom property)
the terminating 0 */
break;
case XA_ATOM:
- printf("\"%s\"", XGetAtomName(dpy, *(Atom*)ptr));
- break;
+ {
+ Atom a = *(Atom*)ptr;
+ printf("\"%s\" (%d)",
+ (a) ? XGetAtomName(dpy, a) : "None",
+ (int)a);
+ break;
+ }
default:
if (float_atom != None && act_type == float_atom)
{
@@ -111,10 +136,10 @@ print_property(Display *dpy, XDevice* dev, Atom property)
ptr += size;
- if (j < nitems - 1)
- printf(", ");
if (done == True)
break;
+ if (j < nitems - 1)
+ printf(", ");
}
printf("\n");
XFree(data);
@@ -123,7 +148,8 @@ print_property(Display *dpy, XDevice* dev, Atom property)
}
-int list_props(Display *dpy, int argc, char** argv, char* name, char *desc)
+static int
+list_props_xi1(Display *dpy, int argc, char** argv, char* name, char *desc)
{
XDeviceInfo *info;
XDevice *dev;
@@ -172,23 +198,19 @@ int list_props(Display *dpy, int argc, char** argv, char* name, char *desc)
return EXIT_SUCCESS;
}
-int
-set_int_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+
+int watch_props(Display *dpy, int argc, char** argv, char* n, char *desc)
{
- XDeviceInfo *info;
XDevice *dev;
- Atom prop;
+ XDeviceInfo *info;
+ XEvent ev;
+ XDevicePropertyNotifyEvent *dpev;
char *name;
- int i;
- Bool is_atom = True;
- char *data;
- int format, nelements = 0;
+ int type_prop;
+ XEventClass cls_prop;
- if (argc < 3)
- {
- fprintf(stderr, "Usage: xinput %s %s\n", n, desc);
+ if (list_props(dpy, argc, argv, n, desc) != EXIT_SUCCESS)
return EXIT_FAILURE;
- }
info = find_device_info(dpy, argv[0], False);
if (!info)
@@ -200,71 +222,82 @@ set_int_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
dev = XOpenDevice(dpy, info->id);
if (!dev)
{
- fprintf(stderr, "unable to open device %s\n", argv[0]);
+ fprintf(stderr, "unable to open device '%s'\n", info->name);
return EXIT_FAILURE;
}
- name = argv[1];
+ DevicePropertyNotify(dev, type_prop, cls_prop);
+ XSelectExtensionEvent(dpy, DefaultRootWindow(dpy), &cls_prop, 1);
- for(i = 0; i < strlen(name); i++) {
- if (!isdigit(name[i])) {
- is_atom = False;
- break;
- }
+ while(1)
+ {
+ XNextEvent(dpy, &ev);
+
+ dpev = (XDevicePropertyNotifyEvent*)&ev;
+ if (dpev->type != type_prop)
+ continue;
+
+ name = XGetAtomName(dpy, dpev->atom);
+ printf("Property '%s' changed.\n", name);
+ print_property(dpy, dev, dpev->atom);
}
- if (!is_atom)
- prop = XInternAtom(dpy, name, False);
- else
- prop = atoi(name);
+ XCloseDevice(dpy, dev);
+}
- nelements = argc - 3;
- format = atoi(argv[2]);
- if (format != 8 && format != 16 && format != 32)
+static int
+delete_prop_xi1(Display *dpy, int argc, char** argv, char* n, char *desc)
+{
+ XDevice *dev;
+ XDeviceInfo *info;
+ char *name;
+ Atom prop;
+
+ info = find_device_info(dpy, argv[0], False);
+ if (!info)
{
- fprintf(stderr, "Invalid format %d\n", format);
+ fprintf(stderr, "unable to find device %s\n", argv[0]);
return EXIT_FAILURE;
}
- data = calloc(nelements, sizeof(long));
- for (i = 0; i < nelements; i++)
+ dev = XOpenDevice(dpy, info->id);
+ if (!dev)
{
- switch(format)
- {
- case 8:
- *(((char*)data) + i) = atoi(argv[3 + i]);
- break;
- case 16:
- *(((short*)data) + i) = atoi(argv[3 + i]);
- break;
- case 32:
- *(((long*)data) + i) = atoi(argv[3 + i]);
- break;
- }
+ fprintf(stderr, "unable to open device '%s'\n", info->name);
+ return EXIT_FAILURE;
}
- XChangeDeviceProperty(dpy, dev, prop, XA_INTEGER, format, PropModeReplace,
- (unsigned char*)data, nelements);
+ name = argv[1];
+
+ prop = parse_atom(dpy, name);
+
+ XDeleteDeviceProperty(dpy, dev, prop);
- free(data);
XCloseDevice(dpy, dev);
return EXIT_SUCCESS;
}
-int
-set_float_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+static int
+do_set_prop_xi1(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc)
{
- XDeviceInfo *info;
- XDevice *dev;
- Atom prop, float_atom;
- char *name;
- int i;
- Bool is_atom = True;
- long *data;
- int nelements = 0;
- char* endptr;
+ XDeviceInfo *info;
+ XDevice *dev;
+ Atom prop;
+ Atom old_type;
+ char *name;
+ int i;
+ Atom float_atom;
+ int old_format, nelements = 0;
+ unsigned long act_nitems, bytes_after;
+ char *endptr;
+ union {
+ unsigned char *c;
+ short *s;
+ long *l;
+ Atom *a;
+ } data;
- if (argc < 2)
+ if (argc < 3)
{
fprintf(stderr, "Usage: xinput %s %s\n", n, desc);
return EXIT_FAILURE;
@@ -286,153 +319,263 @@ set_float_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
name = argv[1];
- for(i = 0; i < strlen(name); i++) {
- if (!isdigit(name[i])) {
- is_atom = False;
- break;
- }
+ prop = parse_atom(dpy, name);
+
+ if (prop == None) {
+ fprintf(stderr, "invalid property %s\n", name);
+ return EXIT_FAILURE;
}
- if (!is_atom)
- prop = XInternAtom(dpy, name, False);
- else
- prop = atoi(name);
+ float_atom = XInternAtom(dpy, "FLOAT", False);
nelements = argc - 2;
+ if (type == None || format == 0) {
+ if (XGetDeviceProperty(dpy, dev, prop, 0, 0, False, AnyPropertyType,
+ &old_type, &old_format, &act_nitems,
+ &bytes_after, &data.c) != Success) {
+ fprintf(stderr, "failed to get property type and format for %s\n",
+ name);
+ return EXIT_FAILURE;
+ } else {
+ if (type == None)
+ type = old_type;
+ if (format == 0)
+ format = old_format;
+ }
- float_atom = XInternAtom(dpy, "FLOAT", False);
-
- if (float_atom == (Atom)0)
- {
- fprintf(stderr, "no FLOAT atom present in server\n");
- return EXIT_FAILURE;
+ XFree(data.c);
}
- if (sizeof(float) != 4)
- {
- fprintf(stderr, "sane FP required\n");
- return EXIT_FAILURE;
+ if (type == None) {
+ fprintf(stderr, "property %s doesn't exist, you need to specify "
+ "its type and format\n", name);
+ return EXIT_FAILURE;
}
- data = calloc(nelements, sizeof(long));
+ data.c = calloc(nelements, sizeof(long));
+
for (i = 0; i < nelements; i++)
{
- *((float*)(data + i)) = strtod(argv[2 + i], &endptr);
- if(endptr == argv[2 + i]){
- fprintf(stderr, "argument %s could not be parsed\n", argv[2 + i]);
- return EXIT_FAILURE;
- }
+ if (type == XA_INTEGER) {
+ switch (format)
+ {
+ case 8:
+ data.c[i] = atoi(argv[2 + i]);
+ break;
+ case 16:
+ data.s[i] = atoi(argv[2 + i]);
+ break;
+ case 32:
+ data.l[i] = atoi(argv[2 + i]);
+ break;
+ default:
+ fprintf(stderr, "unexpected size for property %s", name);
+ return EXIT_FAILURE;
+ }
+ } else if (type == float_atom) {
+ if (format != 32) {
+ fprintf(stderr, "unexpected format %d for property %s\n",
+ format, name);
+ return EXIT_FAILURE;
+ }
+ *(float *)(data.l + i) = strtod(argv[2 + i], &endptr);
+ if (endptr == argv[2 + i]) {
+ fprintf(stderr, "argument %s could not be parsed\n", argv[2 + i]);
+ return EXIT_FAILURE;
+ }
+ } else if (type == XA_ATOM) {
+ if (format != 32) {
+ fprintf(stderr, "unexpected format %d for property %s\n",
+ format, name);
+ return EXIT_FAILURE;
+ }
+ data.a[i] = parse_atom(dpy, argv[2 + i]);
+ } else {
+ fprintf(stderr, "unexpected type for property %s\n", name);
+ return EXIT_FAILURE;
+ }
}
- XChangeDeviceProperty(dpy, dev, prop, float_atom, 32, PropModeReplace,
- (unsigned char*)data, nelements);
-
- free(data);
+ XChangeDeviceProperty(dpy, dev, prop, type, format, PropModeReplace,
+ data.c, nelements);
+ free(data.c);
XCloseDevice(dpy, dev);
return EXIT_SUCCESS;
}
-
-int watch_props(Display *dpy, int argc, char** argv, char* n, char *desc)
+#if HAVE_XI2
+static void
+print_property_xi2(Display *dpy, int deviceid, Atom property)
{
- XDevice *dev;
- XDeviceInfo *info;
- XEvent ev;
- XDevicePropertyNotifyEvent *dpev;
- char *name;
- int type_prop;
- XEventClass cls_prop;
+ Atom act_type;
+ char *name;
+ int act_format;
+ unsigned long nitems, bytes_after;
+ unsigned char *data, *ptr;
+ int j, done = False;
- if (list_props(dpy, argc, argv, n, desc) != EXIT_SUCCESS)
- return EXIT_FAILURE;
+ name = XGetAtomName(dpy, property);
+ printf("\t%s (%ld):\t", name, property);
- info = find_device_info(dpy, argv[0], False);
- if (!info)
+ if (XIGetProperty(dpy, deviceid, property, 0, 1000, False,
+ AnyPropertyType, &act_type, &act_format,
+ &nitems, &bytes_after, &data) == Success)
{
- fprintf(stderr, "unable to find device %s\n", argv[0]);
- return EXIT_FAILURE;
- }
+ Atom float_atom = XInternAtom(dpy, "FLOAT", True);
- dev = XOpenDevice(dpy, info->id);
- if (!dev)
+ ptr = data;
+
+ if (nitems == 0)
+ printf("<no items>");
+
+ for (j = 0; j < nitems; j++)
+ {
+ switch(act_type)
+ {
+ case XA_INTEGER:
+ switch(act_format)
+ {
+ case 8:
+ printf("%d", *((int8_t*)ptr));
+ break;
+ case 16:
+ printf("%d", *((int16_t*)ptr));
+ break;
+ case 32:
+ printf("%d", *((int32_t*)ptr));
+ break;
+ }
+ break;
+ case XA_STRING:
+ if (act_format != 8)
+ {
+ printf("Unknown string format.\n");
+ done = True;
+ break;
+ }
+ printf("\"%s\"", ptr);
+ j += strlen((char*)ptr); /* The loop's j++ jumps over the
+ terminating 0 */
+ ptr += strlen((char*)ptr); /* ptr += size below jumps over
+ the terminating 0 */
+ break;
+ case XA_ATOM:
+ {
+ Atom a = *(Atom*)ptr;
+ printf("\"%s\" (%d)",
+ (a) ? XGetAtomName(dpy, a) : "None",
+ (int)a);
+ break;
+ }
+ break;
+ default:
+ if (float_atom != None && act_type == float_atom)
+ {
+ printf("%f", *((float*)ptr));
+ break;
+ }
+
+ printf("\t... of unknown type %s\n",
+ XGetAtomName(dpy, act_type));
+ done = True;
+ break;
+ }
+
+ ptr += act_format/8;
+
+ if (done == True)
+ break;
+ if (j < nitems - 1)
+ printf(", ");
+ }
+ printf("\n");
+ XFree(data);
+ } else
+ printf("\tFetch failure\n");
+
+}
+
+static int
+list_props_xi2(Display *dpy, int argc, char** argv, char* name, char *desc)
+{
+ XIDeviceInfo *info;
+ int i;
+ int nprops;
+ Atom *props;
+
+ if (argc == 0)
{
- fprintf(stderr, "unable to open device '%s'\n", info->name);
+ fprintf(stderr, "Usage: xinput %s %s\n", name, desc);
return EXIT_FAILURE;
}
- DevicePropertyNotify(dev, type_prop, cls_prop);
- XSelectExtensionEvent(dpy, DefaultRootWindow(dpy), &cls_prop, 1);
-
- while(1)
+ for (i = 0; i < argc; i++)
{
- XNextEvent(dpy, &ev);
+ info = xi2_find_device_info(dpy, argv[i]);
+ if (!info)
+ {
+ fprintf(stderr, "unable to find device %s\n", argv[i]);
+ continue;
+ }
- dpev = (XDevicePropertyNotifyEvent*)&ev;
- if (dpev->type != type_prop)
+ props = XIListProperties(dpy, info->deviceid, &nprops);
+ if (!nprops)
+ {
+ printf("Device '%s' does not report any properties.\n", info->name);
continue;
+ }
- name = XGetAtomName(dpy, dpev->atom);
- printf("Property '%s' changed.\n", name);
- print_property(dpy, dev, dpev->atom);
- }
+ printf("Device '%s':\n", info->name);
+ while(nprops--)
+ {
+ print_property_xi2(dpy, info->deviceid, props[nprops]);
+ }
- XCloseDevice(dpy, dev);
+ XFree(props);
+ }
+ return EXIT_SUCCESS;
}
-int delete_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+static int
+delete_prop_xi2(Display *dpy, int argc, char** argv, char* n, char *desc)
{
- XDevice *dev;
- XDeviceInfo *info;
+ XIDeviceInfo *info;
char *name;
- int i;
- Bool is_atom = True;
Atom prop;
- info = find_device_info(dpy, argv[0], False);
+ info = xi2_find_device_info(dpy, argv[0]);
if (!info)
{
fprintf(stderr, "unable to find device %s\n", argv[0]);
return EXIT_FAILURE;
}
- dev = XOpenDevice(dpy, info->id);
- if (!dev)
- {
- fprintf(stderr, "unable to open device '%s'\n", info->name);
- return EXIT_FAILURE;
- }
-
name = argv[1];
- for(i = 0; i < strlen(name); i++) {
- if (!isdigit(name[i])) {
- is_atom = False;
- break;
- }
- }
-
- if (!is_atom)
- prop = XInternAtom(dpy, name, False);
- else
- prop = atoi(name);
+ prop = parse_atom(dpy, name);
- XDeleteDeviceProperty(dpy, dev, prop);
+ XIDeleteProperty(dpy, info->deviceid, prop);
- XCloseDevice(dpy, dev);
return EXIT_SUCCESS;
}
-int
-set_atom_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+static int
+do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char *n, char *desc)
{
- XDeviceInfo *info;
- XDevice *dev;
- Atom prop;
- char *name;
- int i, j;
- Bool is_atom = True;
- Atom *data;
- int nelements = 0;
+ XIDeviceInfo *info;
+ Atom prop;
+ Atom old_type;
+ char *name;
+ int i;
+ Atom float_atom;
+ int old_format, nelements = 0;
+ unsigned long act_nitems, bytes_after;
+ char *endptr;
+ union {
+ unsigned char *c;
+ int16_t *s;
+ int32_t *l;
+ } data;
if (argc < 3)
{
@@ -440,62 +583,219 @@ set_atom_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
return EXIT_FAILURE;
}
- info = find_device_info(dpy, argv[0], False);
+ info = xi2_find_device_info(dpy, argv[0]);
if (!info)
{
fprintf(stderr, "unable to find device %s\n", argv[0]);
return EXIT_FAILURE;
}
- dev = XOpenDevice(dpy, info->id);
- if (!dev)
- {
- fprintf(stderr, "unable to open device %s\n", argv[0]);
+ name = argv[1];
+
+ prop = parse_atom(dpy, name);
+
+ if (prop == None) {
+ fprintf(stderr, "invalid property %s\n", name);
return EXIT_FAILURE;
}
- name = argv[1];
+ float_atom = XInternAtom(dpy, "FLOAT", False);
- for(i = 0; i < strlen(name); i++) {
- if (!isdigit(name[i])) {
- is_atom = False;
- break;
- }
+ nelements = argc - 2;
+ if (type == None || format == 0) {
+ if (XIGetProperty(dpy, info->deviceid, prop, 0, 0, False,
+ AnyPropertyType, &old_type, &old_format, &act_nitems,
+ &bytes_after, &data.c) != Success) {
+ fprintf(stderr, "failed to get property type and format for %s\n",
+ name);
+ return EXIT_FAILURE;
+ } else {
+ if (type == None)
+ type = old_type;
+ if (format == 0)
+ format = old_format;
+ }
+
+ XFree(data.c);
}
- if (!is_atom)
- prop = XInternAtom(dpy, name, False);
- else
- prop = atoi(name);
+ if (type == None) {
+ fprintf(stderr, "property %s doesn't exist, you need to specify "
+ "its type and format\n", name);
+ return EXIT_FAILURE;
+ }
+
+ data.c = calloc(nelements, sizeof(int32_t));
- nelements = argc - 2;
- data = calloc(nelements, sizeof(Atom));
for (i = 0; i < nelements; i++)
{
- is_atom = True;
- name = argv[2 + i];
- for(j = 0; j < strlen(name); j++) {
- if (!isdigit(name[j])) {
- is_atom = False;
- break;
+ if (type == XA_INTEGER) {
+ switch (format)
+ {
+ case 8:
+ data.c[i] = atoi(argv[2 + i]);
+ break;
+ case 16:
+ data.s[i] = atoi(argv[2 + i]);
+ break;
+ case 32:
+ data.l[i] = atoi(argv[2 + i]);
+ break;
+ default:
+ fprintf(stderr, "unexpected size for property %s", name);
+ return EXIT_FAILURE;
+ }
+ } else if (type == float_atom) {
+ if (format != 32) {
+ fprintf(stderr, "unexpected format %d for property %s\n",
+ format, name);
+ return EXIT_FAILURE;
+ }
+ *(float *)(data.l + i) = strtod(argv[2 + i], &endptr);
+ if (endptr == argv[2 + i]) {
+ fprintf(stderr, "argument %s could not be parsed\n", argv[2 + i]);
+ return EXIT_FAILURE;
}
+ } else if (type == XA_ATOM) {
+ if (format != 32) {
+ fprintf(stderr, "unexpected format %d for property %s\n",
+ format, name);
+ return EXIT_FAILURE;
+ }
+ data.l[i] = parse_atom(dpy, argv[2 + i]);
+ } else {
+ fprintf(stderr, "unexpected type for property %s\n", name);
+ return EXIT_FAILURE;
}
+ }
- if (!is_atom)
- data[i] = XInternAtom(dpy, name, False);
- else
- {
- data[i] = atoi(name);
- XFree(XGetAtomName(dpy, data[i]));
- }
+ XIChangeProperty(dpy, info->deviceid, prop, type, format, PropModeReplace,
+ data.c, nelements);
+ free(data.c);
+ return EXIT_SUCCESS;
+}
+#endif
+
+int list_props(Display *display, int argc, char *argv[], char *name,
+ char *desc)
+{
+#ifdef HAVE_XI2
+ if (xinput_version(display) == XI_2_Major)
+ return list_props_xi2(display, argc, argv, name, desc);
+#endif
+ return list_props_xi1(display, argc, argv, name, desc);
+
+}
+
+int delete_prop(Display *display, int argc, char *argv[], char *name,
+ char *desc)
+{
+#ifdef HAVE_XI2
+ if (xinput_version(display) == XI_2_Major)
+ return delete_prop_xi2(display, argc, argv, name, desc);
+#endif
+ return delete_prop_xi1(display, argc, argv, name, desc);
+
+}
+
+static int
+do_set_prop(Display *display, Atom type, int format, int argc, char *argv[], char *name, char *desc)
+{
+#ifdef HAVE_XI2
+ if (xinput_version(display) == XI_2_Major)
+ return do_set_prop_xi2(display, type, format, argc, argv, name, desc);
+#endif
+ return do_set_prop_xi1(display, type, format, argc, argv, name, desc);
+}
+
+int
+set_atom_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+{
+ return do_set_prop(dpy, XA_ATOM, 32, argc, argv, n, desc);
+}
+
+int
+set_int_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+{
+ int i;
+ int format;
+
+ if (argc < 3)
+ {
+ fprintf(stderr, "Usage: xinput %s %s\n", n, desc);
+ return EXIT_FAILURE;
}
- XChangeDeviceProperty(dpy, dev, prop, XA_ATOM, 32, PropModeReplace,
- (unsigned char*)data, nelements);
+ format = atoi(argv[2]);
+ if (format != 8 && format != 16 && format != 32)
+ {
+ fprintf(stderr, "Invalid format %d\n", format);
+ return EXIT_FAILURE;
+ }
- free(data);
- XCloseDevice(dpy, dev);
- return EXIT_SUCCESS;
+ for (i = 3; i < argc; i++)
+ argv[i - 1] = argv[i];
+
+ return do_set_prop(dpy, XA_INTEGER, format, argc - 1, argv, n, desc);
}
+int
+set_float_prop(Display *dpy, int argc, char** argv, char* n, char *desc)
+{
+ Atom float_atom = XInternAtom(dpy, "FLOAT", False);
+
+ if (sizeof(float) != 4)
+ {
+ fprintf(stderr, "sane FP required\n");
+ return EXIT_FAILURE;
+ }
+
+ return do_set_prop(dpy, float_atom, 32, argc, argv, n, desc);
+}
+int set_prop(Display *display, int argc, char *argv[], char *name,
+ char *desc)
+{
+ Atom type = None;
+ int format = 0;
+ int i = 0, j;
+
+ while (i < argc) {
+ char *option = strchr(argv[i], '=');
+ /* skip non-option arguments */
+ if (strncmp(argv[i], "--", 2) || !option) {
+ i++;
+ continue;
+ }
+
+ if (!strncmp(argv[i], "--type=", strlen("--type="))) {
+ if (!strcmp(option + 1, "int")) {
+ type = XA_INTEGER;
+ } else if (!strcmp(option + 1, "float")) {
+ type = XInternAtom(display, "FLOAT", False);
+ format = 32;
+ } else if (!strcmp(option + 1, "atom")) {
+ type = XA_ATOM;
+ format = 32;
+ } else {
+ fprintf(stderr, "unknown property type %s\n", option + 1);
+ return EXIT_FAILURE;
+ }
+ } else if (!strncmp(argv[i], "--format=", strlen("--format="))) {
+ format = atoi(option + 1);
+ if (format != 8 && format != 16 && format != 32) {
+ fprintf(stderr, "invalid property format %s\n", option + 1);
+ return EXIT_FAILURE;
+ }
+ } else {
+ fprintf(stderr, "invalid option %s\n", argv[i]);
+ return EXIT_FAILURE;
+ }
+
+ for (j = i; j + 1 < argc; j++)
+ argv[j] = argv[j + 1];
+ argc--;
+ }
+
+ return do_set_prop(display, type, format, argc, argv, name, desc);
+}
diff --git a/app/xinput/src/setcp.c b/app/xinput/src/setcp.c
index e44bb00fa..7a2864479 100644
--- a/app/xinput/src/setcp.c
+++ b/app/xinput/src/setcp.c
@@ -32,9 +32,8 @@
int
set_clientpointer(Display* dpy, int argc, char** argv, char* name, char *desc)
{
- XDeviceInfo* info;
+ XIDeviceInfo *info;
XID window;
- XDevice* dev = NULL;
char* id;
char* dummy;
@@ -50,19 +49,13 @@ set_clientpointer(Display* dpy, int argc, char** argv, char* name, char *desc)
window = strtol(argv[0], &dummy, (*id == 'x') ? 16 : 10);
- info = find_device_info(dpy, argv[1], False);
+ info = xi2_find_device_info(dpy, argv[1]);
if (!info) {
fprintf(stderr, "unable to find device %s\n", argv[1]);
return EXIT_FAILURE;
}
- dev = XOpenDevice(dpy, info->id);
-
- if (!dev)
- {
- fprintf(stderr, "Cannot open device %s.\n", argv[1]);
- } else
- XSetClientPointer(dpy, window, dev);
+ XISetClientPointer(dpy, window, info->deviceid);
return 0;
}
diff --git a/app/xinput/src/test_xi2.c b/app/xinput/src/test_xi2.c
new file mode 100644
index 000000000..53d984f04
--- /dev/null
+++ b/app/xinput/src/test_xi2.c
@@ -0,0 +1,381 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * 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, sublicense,
+ * 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS 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.
+ *
+ */
+
+
+#include "xinput.h"
+#include <string.h>
+
+extern void print_classes_xi2(Display*, XIAnyClassInfo **classes,
+ int num_classes);
+
+static Window create_win(Display *dpy)
+{
+ Window win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 200,
+ 200, 0, 0, WhitePixel(dpy, 0));
+ Window subwindow = XCreateSimpleWindow(dpy, win, 50, 50, 50, 50, 0, 0,
+ BlackPixel(dpy, 0));
+
+ XMapWindow(dpy, subwindow);
+ XSelectInput(dpy, win, ExposureMask);
+ return win;
+}
+
+static void print_deviceevent(XIDeviceEvent* event)
+{
+ double *val;
+ int i;
+
+ printf(" device: %d (%d)\n", event->deviceid, event->sourceid);
+ printf(" detail: %d\n", event->detail);
+ printf(" flags: %s\n", (event->flags & XIKeyRepeat) ? "repeat" : "");
+
+ printf(" root: %.2f/%.2f\n", event->root_x, event->root_y);
+ printf(" event: %.2f/%.2f\n", event->event_x, event->event_y);
+
+ printf(" buttons:");
+ for (i = 0; i < event->buttons.mask_len * 8; i++)
+ if (XIMaskIsSet(event->buttons.mask, i))
+ printf(" %d", i);
+ printf("\n");
+
+ printf(" modifiers: locked %#x latched %#x base %#x effective: %#x\n",
+ event->mods.locked, event->mods.latched,
+ event->mods.base, event->mods.effective);
+ printf(" group: locked %#x latched %#x base %#x effective: %#x\n",
+ event->group.locked, event->group.latched,
+ event->group.base, event->group.effective);
+ printf(" valuators:");
+
+ val = event->valuators.values;
+ for (i = 0; i < event->valuators.mask_len * 8; i++)
+ if (XIMaskIsSet(event->valuators.mask, i))
+ printf(" %.2f", *val++);
+ printf("\n");
+
+ printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
+ event->root, event->event, event->child);
+}
+
+static void print_devicechangedevent(Display *dpy, XIDeviceChangedEvent *event)
+{
+ printf(" device: %d (%d)\n", event->deviceid, event->sourceid);
+ printf(" reason: %s\n", (event->reason == XISlaveSwitch) ? "SlaveSwitch" :
+ "DeviceChanged");
+ print_classes_xi2(dpy, event->classes, event->num_classes);
+}
+
+static void print_hierarchychangedevent(XIHierarchyEvent *event)
+{
+ int i;
+ printf(" Changes happened: %s %s %s %s %s %s %s %s\n",
+ (event->flags & XIMasterAdded) ? "[new master]" : "",
+ (event->flags & XIMasterRemoved) ? "[master removed]" : "",
+ (event->flags & XISlaveAdded) ? "[new slave]" : "",
+ (event->flags & XISlaveRemoved) ? "[slave removed]" : "",
+ (event->flags & XISlaveAttached) ? "[slave attached]" : "",
+ (event->flags & XISlaveDetached) ? "[slave detached]" : "",
+ (event->flags & XIDeviceEnabled) ? "[device enabled]" : "",
+ (event->flags & XIDeviceDisabled) ? "[device disabled]" : "");
+
+ for (i = 0; i < event->num_info; i++)
+ {
+ char *use;
+ switch(event->info[i].use)
+ {
+ case XIMasterPointer: use = "master pointer"; break;
+ case XIMasterKeyboard: use = "master keyboard"; break;
+ case XISlavePointer: use = "slave pointer"; break;
+ case XISlaveKeyboard: use = "slave keyboard"; break;
+ case XIFloatingSlave: use = "floating slave"; break;
+ break;
+ }
+
+ printf(" device %d [%s (%d)] is %s\n",
+ event->info[i].deviceid,
+ use,
+ event->info[i].attachment,
+ (event->info[i].enabled) ? "enabled" : "disabled");
+ if (event->info[i].flags)
+ {
+ printf(" changes: %s %s %s %s %s %s %s %s\n",
+ (event->info[i].flags & XIMasterAdded) ? "[new master]" : "",
+ (event->info[i].flags & XIMasterRemoved) ? "[master removed]" : "",
+ (event->info[i].flags & XISlaveAdded) ? "[new slave]" : "",
+ (event->info[i].flags & XISlaveRemoved) ? "[slave removed]" : "",
+ (event->info[i].flags & XISlaveAttached) ? "[slave attached]" : "",
+ (event->info[i].flags & XISlaveDetached) ? "[slave detached]" : "",
+ (event->info[i].flags & XIDeviceEnabled) ? "[device enabled]" : "",
+ (event->info[i].flags & XIDeviceDisabled) ? "[device disabled]" : "");
+ }
+ }
+}
+
+static void print_rawevent(XIRawEvent *event)
+{
+ int i;
+ double *val, *raw_val;
+
+ printf(" device: %d\n", event->deviceid);
+ printf(" detail: %d\n", event->detail);
+ printf(" valuators:\n");
+
+ val = event->valuators.values;
+ raw_val = event->raw_values;
+ for (i = 0; i < event->valuators.mask_len * 8; i++)
+ if (XIMaskIsSet(event->valuators.mask, i))
+ printf(" %2d: %.2f (%.2f)\n", i, *val++, *raw_val++);
+ printf("\n");
+}
+
+static void print_enterleave(XILeaveEvent* event)
+{
+ char *mode, *detail;
+ int i;
+
+ printf(" device: %d\n", event->deviceid);
+ printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
+ event->root, event->event, event->child);
+ switch(event->mode)
+ {
+ case XINotifyNormal: mode = "NotifyNormal"; break;
+ case XINotifyGrab: mode = "NotifyGrab"; break;
+ case XINotifyUngrab: mode = "NotifyUngrab"; break;
+ case XINotifyWhileGrabbed: mode = "NotifyWhileGrabbed"; break;
+ case XINotifyPassiveGrab: mode = "NotifyPassiveGrab"; break;
+ case XINotifyPassiveUngrab:mode = "NotifyPassiveUngrab"; break;
+ }
+ switch (event->detail)
+ {
+ case XINotifyAncestor: detail = "NotifyAncestor"; break;
+ case XINotifyVirtual: detail = "NotifyVirtual"; break;
+ case XINotifyInferior: detail = "NotifyInferior"; break;
+ case XINotifyNonlinear: detail = "NotifyNonlinear"; break;
+ case XINotifyNonlinearVirtual: detail = "NotifyNonlinearVirtual"; break;
+ case XINotifyPointer: detail = "NotifyPointer"; break;
+ case XINotifyPointerRoot: detail = "NotifyPointerRoot"; break;
+ case XINotifyDetailNone: detail = "NotifyDetailNone"; break;
+ }
+ printf(" mode: %s (detail %s)\n", mode, detail);
+ printf(" flags: %s %s\n", event->focus ? "[focus]" : "",
+ event->same_screen ? "[same screen]" : "");
+ printf(" buttons:");
+ for (i = 0; i < event->buttons.mask_len * 8; i++)
+ if (XIMaskIsSet(event->buttons.mask, i))
+ printf(" %d", i);
+ printf("\n");
+
+ printf(" modifiers: locked %#x latched %#x base %#x effective: %#x\n",
+ event->mods.locked, event->mods.latched,
+ event->mods.base, event->mods.effective);
+ printf(" group: locked %#x latched %#x base %#x effective: %#x\n",
+ event->group.locked, event->group.latched,
+ event->group.base, event->group.effective);
+
+ printf(" root x/y: %.2f / %.2f\n", event->root_x, event->root_y);
+ printf(" event x/y: %.2f / %.2f\n", event->event_x, event->event_y);
+
+}
+
+static void print_propertyevent(Display *display, XIPropertyEvent* event)
+{
+ char *changed;
+ char *name;
+
+ if (event->what == XIPropertyDeleted)
+ changed = "deleted";
+ else if (event->what == XIPropertyCreated)
+ changed = "created";
+ else
+ changed = "modified";
+ name = XGetAtomName(display, event->property);
+ printf(" property: %ld '%s'\n", event->property, name);
+ printf(" changed: %s\n", changed);
+
+ XFree(name);
+}
+void
+test_sync_grab(Display *display, Window win)
+{
+ int loop = 3;
+ int rc;
+ XIEventMask mask;
+
+ /* Select for motion events */
+ mask.deviceid = XIAllDevices;
+ mask.mask_len = 2;
+ mask.mask = calloc(2, sizeof(char));
+ XISetMask(mask.mask, XI_ButtonPress);
+
+ if ((rc = XIGrabDevice(display, 2, win, CurrentTime, None, GrabModeSync,
+ GrabModeAsync, False, &mask)) != GrabSuccess)
+ {
+ fprintf(stderr, "Grab failed with %d\n", rc);
+ return;
+ }
+ free(mask.mask);
+
+ XSync(display, True);
+ XIAllowEvents(display, 2, SyncPointer, CurrentTime);
+ XFlush(display);
+
+ printf("Holding sync grab for %d button presses.\n", loop);
+
+ while(loop--)
+ {
+ XIEvent ev;
+
+ XNextEvent(display, (XEvent*)&ev);
+ if (ev.type == GenericEvent && ev.extension == xi_opcode )
+ {
+ XIDeviceEvent *event = (XIDeviceEvent*)&ev;
+ print_deviceevent(event);
+ XIAllowEvents(display, 2, SyncPointer, CurrentTime);
+ }
+ }
+
+ XIUngrabDevice(display, 2, CurrentTime);
+ printf("Done\n");
+}
+
+int
+test_xi2(Display *display,
+ int argc,
+ char *argv[],
+ char *name,
+ char *desc)
+{
+ XIEventMask mask;
+ Window win;
+
+ list(display, argc, argv, name, desc);
+ win = create_win(display);
+
+ /* Select for motion events */
+ mask.deviceid = XIAllDevices;
+ mask.mask_len = XIMaskLen(XI_RawMotion);
+ mask.mask = calloc(mask.mask_len, sizeof(char));
+ XISetMask(mask.mask, XI_ButtonPress);
+ XISetMask(mask.mask, XI_ButtonRelease);
+ XISetMask(mask.mask, XI_KeyPress);
+ XISetMask(mask.mask, XI_KeyRelease);
+ XISetMask(mask.mask, XI_Motion);
+ XISetMask(mask.mask, XI_DeviceChanged);
+ XISetMask(mask.mask, XI_Enter);
+ XISetMask(mask.mask, XI_Leave);
+ XISetMask(mask.mask, XI_FocusIn);
+ XISetMask(mask.mask, XI_FocusOut);
+ XISetMask(mask.mask, XI_HierarchyChanged);
+ XISetMask(mask.mask, XI_PropertyEvent);
+ XISelectEvents(display, win, &mask, 1);
+ XMapWindow(display, win);
+ XSync(display, False);
+
+ {
+ XIGrabModifiers modifiers[] = {{0, 0}, {0, 0x10}, {0, 0x1}, {0, 0x11}};
+ int nmods = sizeof(modifiers)/sizeof(modifiers[0]);
+
+ mask.deviceid = 2;
+ memset(mask.mask, 0, 2);
+ XISetMask(mask.mask, XI_KeyPress);
+ XISetMask(mask.mask, XI_KeyRelease);
+ XISetMask(mask.mask, XI_ButtonPress);
+ XISetMask(mask.mask, XI_ButtonRelease);
+ XISetMask(mask.mask, XI_Motion);
+ XIGrabButton(display, 2, 1, win, None, GrabModeAsync, GrabModeAsync,
+ False, &mask, nmods, modifiers);
+ XIGrabKeycode(display, 3, 24 /* q */, win, GrabModeAsync, GrabModeAsync,
+ False, &mask, nmods, modifiers);
+ XIUngrabButton(display, 3, 1, win, nmods - 2, &modifiers[2]);
+ XIUngrabKeycode(display, 3, 24 /* q */, win, nmods - 2, &modifiers[2]);
+ }
+
+ mask.deviceid = XIAllMasterDevices;
+ memset(mask.mask, 0, 2);
+ XISetMask(mask.mask, XI_RawKeyPress);
+ XISetMask(mask.mask, XI_RawKeyRelease);
+ XISetMask(mask.mask, XI_RawButtonPress);
+ XISetMask(mask.mask, XI_RawButtonRelease);
+ XISetMask(mask.mask, XI_RawMotion);
+ XISelectEvents(display, DefaultRootWindow(display), &mask, 1);
+
+ free(mask.mask);
+
+ {
+ XEvent event;
+ XMaskEvent(display, ExposureMask, &event);
+ XSelectInput(display, win, 0);
+ }
+
+ /*
+ test_sync_grab(display, win);
+ */
+
+ while(1)
+ {
+ XEvent ev;
+ XGenericEventCookie *cookie = (XGenericEventCookie*)&ev.xcookie;
+ XNextEvent(display, (XEvent*)&ev);
+
+ if (XGetEventData(display, cookie) &&
+ cookie->type == GenericEvent &&
+ cookie->extension == xi_opcode)
+ {
+ printf("EVENT type %d\n", cookie->evtype);
+ switch (cookie->evtype)
+ {
+ case XI_DeviceChanged:
+ print_devicechangedevent(display, cookie->data);
+ break;
+ case XI_HierarchyChanged:
+ print_hierarchychangedevent(cookie->data);
+ break;
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ case XI_RawMotion:
+ print_rawevent(cookie->data);
+ break;
+ case XI_Enter:
+ case XI_Leave:
+ case XI_FocusIn:
+ case XI_FocusOut:
+ print_enterleave(cookie->data);
+ break;
+ case XI_PropertyEvent:
+ print_propertyevent(display, cookie->data);
+ break;
+ default:
+ print_deviceevent(cookie->data);
+ break;
+ }
+ }
+
+ XFreeEventData(display, cookie);
+ }
+
+ XDestroyWindow(display, win);
+
+ return EXIT_SUCCESS;
+}
diff --git a/app/xinput/src/version.c b/app/xinput/src/version.c
deleted file mode 100644
index 93a50d8be..000000000
--- a/app/xinput/src/version.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 1996-1997 by Frederic Lepied, France. <Frederic.Lepied@sugix.frmug.org>
- *
- * 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 the authors not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. The authors make 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.
- *
- */
-
-#include "xinput.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-static const char version_id[] = VERSION;
-
-int
-version(Display *display,
- int argc,
- char *argv[],
- char *name,
- char *desc)
-{
- printf("%s %s\n", name, version_id);
- return EXIT_SUCCESS;
-}
-
-/* end of version.c */
diff --git a/app/xinput/src/xinput.c b/app/xinput/src/xinput.c
index 82dc54a85..149662d20 100644
--- a/app/xinput/src/xinput.c
+++ b/app/xinput/src/xinput.c
@@ -25,12 +25,10 @@
#include <ctype.h>
#include <string.h>
-typedef int (*prog)(
-#if NeedFunctionPrototypes
- Display* display, int argc, char *argv[],
- char *prog_name, char *prog_desc
-#endif
-);
+int xi_opcode;
+
+typedef int (*prog)(Display* display, int argc, char *argv[],
+ char *prog_name, char *prog_desc);
typedef struct
{
@@ -70,7 +68,7 @@ static entry drivers[] =
set_mode
},
{"list",
- "[--loop || --short || <device name>...]",
+ "[--short || --long] [<device name>...]",
list
},
{"query-state",
@@ -81,17 +79,13 @@ static entry drivers[] =
"[-proximity] <device name>",
test
},
- {"version",
- "",
- version
- },
#if HAVE_XI2
{ "create-master",
- "<id> [sendCore (dflt:1)] [enable (dflt:1)]",
+ "<id> [<sendCore (dflt:1)>] [<enable (dflt:1)>]",
create_master
},
{ "remove-master",
- "<id> [returnMode (dflt:Floating)] [returnPointer] [returnKeyboard]",
+ "<id> [Floating|AttachToMaster (dflt:Floating)] [<returnPointer>] [<returnKeyboard>]",
remove_master
},
{ "reattach",
@@ -106,6 +100,10 @@ static entry drivers[] =
"<window> <device>",
set_clientpointer
},
+ { "test-xi2",
+ "<device>",
+ test_xi2,
+ },
#endif
{ "list-props",
"<device> [<device> ...]",
@@ -131,29 +129,62 @@ static entry drivers[] =
"<device> <property>",
delete_prop
},
+ { "set-prop",
+ "<device> [--type=atom|float|int] [--format=8|16|32] <property> <val> [<val> ...]",
+ set_prop
+ },
{NULL, NULL, NULL
}
};
-static Bool
-is_xinput_present(Display *display)
+static const char version_id[] = VERSION;
+
+int
+print_version()
{
XExtensionVersion *version;
- Bool present;
+ Display *display;
+
+ printf("xinput version %s\n", version_id);
+
+ display = XOpenDisplay(NULL);
+
+ printf("XI version on server: ");
+
+ if (display == NULL)
+ printf("Failed to open display.\n");
+ else {
+ version = XGetExtensionVersion(display, INAME);
+ if (!version || (version == (XExtensionVersion*) NoSuchExtension))
+ printf(" Extension not supported.\n");
+ else {
+ printf("%d.%d\n", version->major_version,
+ version->minor_version);
+ XFree(version);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int
+xinput_version(Display *display)
+{
+ XExtensionVersion *version;
+ static int vers = -1;
+
+ if (vers != -1)
+ return vers;
-#if HAVE_XI2
- version = XQueryInputVersion(display, XI_2_Major, XI_2_Minor);
-#else
version = XGetExtensionVersion(display, INAME);
-#endif
if (version && (version != (XExtensionVersion*) NoSuchExtension)) {
- present = version->present;
+ vers = version->major_version;
XFree(version);
- return present;
- } else {
- return False;
}
+
+ return vers;
}
XDeviceInfo*
@@ -200,6 +231,41 @@ find_device_info(Display *display,
return found;
}
+#ifdef HAVE_XI2
+XIDeviceInfo*
+xi2_find_device_info(Display *display, char *name)
+{
+ XIDeviceInfo *info;
+ int ndevices;
+ Bool is_id = True;
+ int i, id = -1;
+
+ for(i = 0; i < strlen(name); i++) {
+ if (!isdigit(name[i])) {
+ is_id = False;
+ break;
+ }
+ }
+
+ if (is_id) {
+ id = atoi(name);
+ }
+
+ info = XIQueryDevice(display, XIAllDevices, &ndevices);
+ for(i = 0; i < ndevices; i++)
+ {
+ if ((is_id && info[i].deviceid == id) ||
+ (!is_id && strcmp(info[i].name, name) == 0))
+ {
+ return &info[i];
+ }
+ }
+
+ XIFreeDeviceInfo(info);
+ return NULL;
+}
+#endif
+
static void
usage(void)
{
@@ -220,12 +286,20 @@ main(int argc, char * argv[])
Display *display;
entry *driver = drivers;
char *func;
+ int event, error;
if (argc < 2) {
usage();
return EXIT_FAILURE;
}
+ func = argv[1];
+ while((*func) == '-') func++;
+
+ if (strcmp("version", func) == 0) {
+ return print_version(argv[0]);
+ }
+
display = XOpenDisplay(NULL);
if (display == NULL) {
@@ -233,10 +307,12 @@ main(int argc, char * argv[])
return EXIT_FAILURE;
}
- func = argv[1];
- while((*func) == '-') func++;
+ if (!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error)) {
+ printf("X Input extension not available.\n");
+ return EXIT_FAILURE;
+ }
- if (!is_xinput_present(display)) {
+ if (!xinput_version(display)) {
fprintf(stderr, "%s extension not available\n", INAME);
return EXIT_FAILURE;
}
diff --git a/app/xinput/src/xinput.h b/app/xinput/src/xinput.h
index 3c364973f..d44ce0960 100644
--- a/app/xinput/src/xinput.h
+++ b/app/xinput/src/xinput.h
@@ -27,6 +27,9 @@
#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>
+#ifdef HAVE_XI2
+#include <X11/extensions/XInput2.h>
+#endif
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
@@ -38,255 +41,41 @@
#define EXIT_FAILURE 0
#endif
-XDeviceInfo*
-find_device_info(
-#if NeedFunctionPrototypes
- Display *display,
- char *name,
- Bool only_extended
-#endif
- );
-int
-get_feedbacks(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_ptr_feedback(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-get_button_map(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_button_map(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_pointer(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_mode(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-list(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-test(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-version(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_integer_feedback(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-query_state(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-create_master(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-remove_master(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-change_attachment(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-float_device(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_clientpointer(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-list_props(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-
-int
-set_int_prop(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_float_prop(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-set_atom_prop(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-watch_props(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
-
-int
-delete_prop(
-#if NeedFunctionPrototypes
- Display* display,
- int argc,
- char *argv[],
- char *prog_name,
- char *prog_desc
-#endif
-);
+extern int xi_opcode; /* xinput extension op code */
+XDeviceInfo* find_device_info( Display *display, char *name, Bool only_extended);
+#if HAVE_XI2
+XIDeviceInfo* xi2_find_device_info(Display *display, char *name);
+int xinput_version(Display* display);
+#endif
+
+int get_feedbacks( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_ptr_feedback( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int get_button_map( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_button_map( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_pointer( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+
+int set_mode( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int list( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int test( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int version( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_integer_feedback( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int query_state( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+
+/* X Input 1.5 */
+int list_props( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_int_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_float_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_atom_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int watch_props( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int delete_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_prop( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+
+/* X Input 2.0 */
+int create_master( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int remove_master( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int change_attachment( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int float_device( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int set_clientpointer( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
+int test_xi2( Display* display, int argc, char *argv[], char *prog_name, char *prog_desc);
/* end of xinput.h */