aboutsummaryrefslogtreecommitdiff
path: root/libX11
diff options
context:
space:
mode:
Diffstat (limited to 'libX11')
-rw-r--r--libX11/ChangeLog129
-rw-r--r--libX11/aclocal.m435
-rw-r--r--libX11/configure80
-rw-r--r--libX11/configure.ac2
-rw-r--r--libX11/include/X11/Xlib-xcb.h5
-rw-r--r--libX11/include/X11/Xlib.h23
-rw-r--r--libX11/include/X11/Xlibint.h72
-rw-r--r--libX11/man/Makefile.am9
-rw-r--r--libX11/man/Makefile.in9
-rw-r--r--libX11/man/XGetEventData.man223
-rw-r--r--libX11/nls/en_US.UTF-8/Compose.pre2
-rw-r--r--libX11/src/ChkIfEv.c1
-rw-r--r--libX11/src/ChkMaskEv.c4
-rw-r--r--libX11/src/ChkTypEv.c4
-rw-r--r--libX11/src/ChkTypWEv.c4
-rw-r--r--libX11/src/ChkWinEv.c4
-rw-r--r--libX11/src/FreeEventData.c42
-rw-r--r--libX11/src/GetEventData.c42
-rw-r--r--libX11/src/IfEvent.c1
-rw-r--r--libX11/src/InitExt.c43
-rw-r--r--libX11/src/Makefile.am5
-rw-r--r--libX11/src/Makefile.in229
-rw-r--r--libX11/src/MaskEvent.c4
-rw-r--r--libX11/src/NextEvent.c4
-rw-r--r--libX11/src/OpenDis.c11
-rw-r--r--libX11/src/PeekEvent.c5
-rw-r--r--libX11/src/PeekIfEv.c5
-rw-r--r--libX11/src/PutBEvent.c18
-rw-r--r--libX11/src/WinEvent.c4
-rw-r--r--libX11/src/XlibInt.c183
-rw-r--r--libX11/src/utlist.h116
31 files changed, 1135 insertions, 183 deletions
diff --git a/libX11/ChangeLog b/libX11/ChangeLog
index c28af9157..2d0b18eba 100644
--- a/libX11/ChangeLog
+++ b/libX11/ChangeLog
@@ -1,3 +1,132 @@
+commit 9da7e230d5320e1556ad2084fcd06ee7994385ea
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Aug 5 14:15:02 2009 +1000
+
+ Bump to 1.2.99.901 (1.3 RC1)
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 8f78c7b4e3570cd46c5a220982963c17fe2157b8
+Author: Filippo Giunchedi <filippo@debian.org>
+Date: Sat Jun 6 16:56:54 2009 +0200
+
+ nls: add {left,right}wards arrow to compose table
+
+ Debian bug#532117 <http://bugs.debian.org/532117>
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 7949bfa00390241d994f32463e50d4bd78920568
+Author: Julien Cristau <jcristau@debian.org>
+Date: Fri Jul 31 13:33:52 2009 +0200
+
+ Update library version for new symbols
+
+ Commit 554f755e5545f63d3c8f299297927238da155773 added generic event
+ cookie handling. Bump libX11 version number accordingly.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 640fec5f4feacd01a00eea3dcd4edb220907d3dc
+Author: Julien Cristau <jcristau@debian.org>
+Date: Sun Aug 2 17:18:31 2009 +0200
+
+ Add _XFUNCPROTOBEGIN/END to Xlib-xcb.h
+
+ X.Org bug#22252 <https://bugs.freedesktop.org/show_bug.cgi?id=22252>
+
+ Reported-by: Riku Salminen <rsalmin2@cc.hut.fi>
+ Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit bc06d49e9dac1836d6824769ddb2ac5ba9f14df7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jul 29 08:44:09 2009 +1000
+
+ Fix compiler warning 'unused variable qelt'
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 03f4907e14f5755e72309f08742977b871e81e33
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed Jul 29 08:34:57 2009 +1000
+
+ Add utlist.h to the Makefile.am
+
+ utlist.h contains the linked list macros, it was added with the recent
+ addition of event cookies but utlist.h wasn't added to the Makefile.am. As a
+ result, make dist failed.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 554f755e5545f63d3c8f299297927238da155773
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri Jun 26 11:27:43 2009 +1000
+
+ Add generic event cookie handling to libX11.
+
+ Generic events require more bytes than Xlib provides in the standard XEvent.
+ Memory allocated by the extension and stored as pointers inside the event is
+ prone to leak by simple 'while (1) { XNextEvent(...); }' loops.
+
+ This patch adds cookie handling for generic events. Extensions may register
+ a cookie handler in addition to the normal event vectors. If an extension
+ has registered a cookie handler, _all_ generic events for this extensions
+ must be handled through cookies. Otherwise, the default event handler is
+ used.
+
+ The cookie handler must return an XGenericEventCookie with a pointer to the
+ data.The rest of the event (type, serialNumber, etc.) are to be filled as
+ normal. When a client retrieves such a cookie event, the data is stored in
+ an internal queue (the 'cookiejar'). This data is freed on the next call to
+ XNextEvent().
+
+ New extension interfaces:
+ XESetWireToEventCookie(display, extension_number, cookie_handler)
+
+ Where cookie_handler must set cookie->data. The data pointer is of arbitray
+ size and type but must be a single memory block. This memory block
+ represents the actual extension's event.
+
+ New client interfaces:
+ XGetEventData(display, *cookie);
+ XFreeEventData(display, *cookie);
+
+ If the client needs the actual event data, it must call XGetEventData() with
+ the cookie. This returns the data pointer (and removes it from the cookie
+ jar) and the client is then responsible for freeing the event with
+ XFreeEventData(). It is safe to call either function with a non-cookie
+ event. Events unclaimed or not handled by the XGetEventData() are cleaned up
+ automatically.
+
+ Example client code:
+ XEvent event;
+ XGenericEventCookie *cookie = &ev;
+
+ XNextEvent(display, &event);
+ if (XGetEventData(display, cookie)) {
+ XIEvent *xievent = cookie->data;
+ ...
+ } else if (cookie->type == GenericEvent) {
+ /* handle generic event */
+ } else {
+ /* handle extension/core event */
+ }
+ XFreeEventData(display, cookie);
+
+ Cookies are not multi-threading safe. Clients that use XGetEventData() must
+ lock between XNextEvent and XGetEventData to avoid other threads freeing
+ cookies.
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit d7675cb8fa7155e7aff1459636a117a97aa1bf28
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon Jul 6 13:17:35 2009 +1000
+
+ Bump to 1.2.99.1
+
+ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
commit 75fe48e7a42a685d7098e8d7108b9b956c471563
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Fri Jul 10 14:07:34 2009 +1000
diff --git a/libX11/aclocal.m4 b/libX11/aclocal.m4
index 6ef603015..52271427a 100644
--- a/libX11/aclocal.m4
+++ b/libX11/aclocal.m4
@@ -8161,27 +8161,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.2.2])
+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()
@@ -8571,9 +8568,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
diff --git a/libX11/configure b/libX11/configure
index 40002f063..e991244da 100644
--- a/libX11/configure
+++ b/libX11/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for libX11 1.2.2.
+# Generated by GNU Autoconf 2.63 for libX11 1.2.99.901.
#
# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
#
@@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='libX11'
PACKAGE_TARNAME='libX11'
-PACKAGE_VERSION='1.2.2'
-PACKAGE_STRING='libX11 1.2.2'
+PACKAGE_VERSION='1.2.99.901'
+PACKAGE_STRING='libX11 1.2.99.901'
PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
ac_unique_file="Makefile.am"
@@ -1582,7 +1582,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 libX11 1.2.2 to adapt to many kinds of systems.
+\`configure' configures libX11 1.2.99.901 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1652,7 +1652,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of libX11 1.2.2:";;
+ short | recursive ) echo "Configuration of libX11 1.2.99.901:";;
esac
cat <<\_ACEOF
@@ -1799,7 +1799,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-libX11 configure 1.2.2
+libX11 configure 1.2.99.901
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1813,7 +1813,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 libX11 $as_me 1.2.2, which was
+It was created by libX11 $as_me 1.2.99.901, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@
@@ -2663,7 +2663,7 @@ fi
# Define the identity of the package.
PACKAGE='libX11'
- VERSION='1.2.2'
+ VERSION='1.2.99.901'
cat >>confdefs.h <<_ACEOF
@@ -2736,26 +2736,14 @@ ac_config_headers="$ac_config_headers include/X11/XlibConf.h"
# Require xorg-macros: XORG_CWARNFLAGS, XORG_CHANGELOG, XORG_WITH_LINT
- 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; }
+
+
+
+
+
+
+
+
# Set common system defines for POSIX extensions, such as _GNU_SOURCE
@@ -5310,13 +5298,13 @@ if test "${lt_cv_nm_interface+set}" = set; then
else
lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:5313: $ac_compile\"" >&5)
+ (eval echo "\"\$as_me:5301: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err)
cat conftest.err >&5
- (eval echo "\"\$as_me:5316: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval echo "\"\$as_me:5304: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
cat conftest.err >&5
- (eval echo "\"\$as_me:5319: output\"" >&5)
+ (eval echo "\"\$as_me:5307: output\"" >&5)
cat conftest.out >&5
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
@@ -6521,7 +6509,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 6524 "configure"' > conftest.$ac_ext
+ echo '#line 6512 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -7886,11 +7874,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:7889: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:7877: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:7893: \$? = $ac_status" >&5
+ echo "$as_me:7881: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -8225,11 +8213,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8228: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:8216: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:8232: \$? = $ac_status" >&5
+ echo "$as_me:8220: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -8330,11 +8318,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8333: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:8321: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:8337: \$? = $ac_status" >&5
+ echo "$as_me:8325: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -8385,11 +8373,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8388: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:8376: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:8392: \$? = $ac_status" >&5
+ echo "$as_me:8380: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -11188,7 +11176,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11191 "configure"
+#line 11179 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11284,7 +11272,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11287 "configure"
+#line 11275 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12524,9 +12512,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
@@ -17542,7 +17530,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 libX11 $as_me 1.2.2, which was
+This file was extended by libX11 $as_me 1.2.99.901, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -17605,7 +17593,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-libX11 config.status 1.2.2
+libX11 config.status 1.2.99.901
configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/libX11/configure.ac b/libX11/configure.ac
index ab6d5a368..45e9d74ce 100644
--- a/libX11/configure.ac
+++ b/libX11/configure.ac
@@ -3,7 +3,7 @@
AC_PREREQ(2.60)
AC_INIT([libX11],
- 1.2.2,
+ 1.2.99.901,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
libX11)
AC_CONFIG_SRCDIR([Makefile.am])
diff --git a/libX11/include/X11/Xlib-xcb.h b/libX11/include/X11/Xlib-xcb.h
index b88e2e7a9..03d8f9867 100644
--- a/libX11/include/X11/Xlib-xcb.h
+++ b/libX11/include/X11/Xlib-xcb.h
@@ -6,10 +6,15 @@
#include <xcb/xcb.h>
#include <X11/Xlib.h>
+#include <X11/Xfuncproto.h>
+
+_XFUNCPROTOBEGIN
xcb_connection_t *XGetXCBConnection(Display *dpy);
enum XEventQueueOwner { XlibOwnsEventQueue = 0, XCBOwnsEventQueue };
void XSetEventQueueOwner(Display *dpy, enum XEventQueueOwner owner);
+_XFUNCPROTOEND
+
#endif /* XLIB_XCB_H */
diff --git a/libX11/include/X11/Xlib.h b/libX11/include/X11/Xlib.h
index 682988cf2..2c30bc09e 100644
--- a/libX11/include/X11/Xlib.h
+++ b/libX11/include/X11/Xlib.h
@@ -966,6 +966,17 @@ typedef struct
int evtype; /* actual event type. */
} XGenericEvent;
+typedef struct {
+ int type; /* of event. Always GenericEvent */
+ unsigned long serial; /* # of last request processed */
+ Bool send_event; /* true if from SendEvent request */
+ Display *display; /* Display the event was read from */
+ int extension; /* major opcode of extension that caused the event */
+ int evtype; /* actual event type. */
+ unsigned int cookie;
+ void *data;
+} XGenericEventCookie;
+
/*
* this union is defined so Xlib can always use the same sized
* event structure internally, to avoid memory fragmentation.
@@ -1003,6 +1014,8 @@ typedef union _XEvent {
XMappingEvent xmapping;
XErrorEvent xerror;
XKeymapEvent xkeymap;
+ XGenericEvent xgeneric;
+ XGenericEventCookie xcookie;
long pad[24];
} XEvent;
#endif
@@ -3998,6 +4011,16 @@ extern int _Xwctomb(
wchar_t /* wc */
);
+extern Bool XGetEventData(
+ Display* /* dpy */,
+ XGenericEventCookie* /* cookie*/
+);
+
+extern void XFreeEventData(
+ Display* /* dpy */,
+ XGenericEventCookie* /* cookie*/
+);
+
_XFUNCPROTOEND
#endif /* _XLIB_H_ */
diff --git a/libX11/include/X11/Xlibint.h b/libX11/include/X11/Xlibint.h
index 4f3755fae..2acfc7690 100644
--- a/libX11/include/X11/Xlibint.h
+++ b/libX11/include/X11/Xlibint.h
@@ -185,6 +185,20 @@ struct _XDisplay
struct _XkbInfoRec *xkb_info; /* XKB info */
struct _XtransConnInfo *trans_conn; /* transport connection object */
struct _X11XCBPrivate *xcb; /* XCB glue private data */
+
+ /* Generic event cookie handling */
+ unsigned int next_cookie; /* next event cookie */
+ /* vector for wire to generic event, index is (extension - 128) */
+ Bool (*generic_event_vec[128])(
+ Display * /* dpy */,
+ XGenericEventCookie * /* Xlib event */,
+ xEvent * /* wire event */);
+ /* vector for event copy, index is (extension - 128) */
+ Bool (*generic_event_copy_vec[128])(
+ Display * /* dpy */,
+ XGenericEventCookie * /* in */,
+ XGenericEventCookie * /* out*/);
+ void *cookiejar; /* cookie events returned but not claimed */
};
#define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n)
@@ -1005,6 +1019,19 @@ extern Bool _XUnknownWireEvent(
XEvent* /* re */,
xEvent* /* event */
);
+
+extern Bool _XUnknownWireEventCookie(
+ Display* /* dpy */,
+ XGenericEventCookie* /* re */,
+ xEvent* /* event */
+);
+
+extern Bool _XUnknownCopyEventCookie(
+ Display* /* dpy */,
+ XGenericEventCookie* /* in */,
+ XGenericEventCookie* /* out */
+);
+
extern Status _XUnknownNativeEvent(
Display* /* dpy */,
XEvent* /* re */,
@@ -1157,6 +1184,31 @@ extern Bool (*XESetWireToEvent(
Display*, XEvent*, xEvent*
);
+extern Bool (*XESetWireToEventCookie(
+ Display* /* display */,
+ int /* extension */,
+ Bool (*) (
+ Display* /* display */,
+ XGenericEventCookie* /* re */,
+ xEvent* /* event */
+ ) /* proc */
+))(
+ Display*, XGenericEventCookie*, xEvent*
+);
+
+extern Bool (*XESetCopyEventCookie(
+ Display* /* display */,
+ int /* extension */,
+ Bool (*) (
+ Display* /* display */,
+ XGenericEventCookie* /* in */,
+ XGenericEventCookie* /* out */
+ ) /* proc */
+))(
+ Display*, XGenericEventCookie*, XGenericEventCookie*
+);
+
+
extern Status (*XESetEventToWire(
Display* /* display */,
int /* event_number */,
@@ -1321,6 +1373,26 @@ int _XPutBackEvent (
register Display *dpy,
register XEvent *event);
+extern Bool _XIsEventCookie(
+ Display *dpy,
+ XEvent *ev);
+
+extern void _XFreeEventCookies(
+ Display *dpy);
+
+extern void _XStoreEventCookie(
+ Display *dpy,
+ XEvent *ev);
+
+extern Bool _XFetchEventCookie(
+ Display *dpy,
+ XGenericEventCookie *ev);
+
+extern Bool _XCopyEventCookie(
+ Display *dpy,
+ XGenericEventCookie *in,
+ XGenericEventCookie *out);
+
_XFUNCPROTOEND
#endif /* _XLIBINT_H_ */
diff --git a/libX11/man/Makefile.am b/libX11/man/Makefile.am
index b19c5d39a..b21d8fb9a 100644
--- a/libX11/man/Makefile.am
+++ b/libX11/man/Makefile.am
@@ -75,6 +75,7 @@ libman_PRE = \
XGravityEvent.man \
XrmGetFileDatabase.man \
XrmGetResource.man \
+ XGetEventData.man \
XGetVisualInfo.man \
XGetWindowAttributes.man \
XGetWindowProperty.man \
@@ -271,6 +272,7 @@ all_shadows = \
$(XGraphicsExposeEvent_shadows) \
$(XrmGetFileDatabase_shadows) \
$(XrmGetResource_shadows) \
+ $(XGetEventData_shadows) \
$(XGetVisualInfo_shadows) \
$(XGetWindowAttributes_shadows) \
$(XGetWindowProperty_shadows) \
@@ -658,6 +660,10 @@ XrmGetResource_shadows = \
XrmQGetSearchList \
XrmQGetSearchResource
+XGetEventData_shadows = \
+ XFreeEventData \
+ XGenericEventCookie
+
XGetVisualInfo_shadows = \
XMatchVisualInfo \
XVisualIDFromVisual \
@@ -1223,6 +1229,9 @@ shadows.DONE:
(for i in $(XrmGetResource_shadows:=.@LIB_MAN_SUFFIX@) ; do \
echo .so man$(LIB_MAN_DIR_SUFFIX)/XrmGetResource.$(LIB_MAN_SUFFIX) > $$i; \
done)
+ (for i in $(XGetEventData_shadows:=.@LIB_MAN_SUFFIX@) ; do \
+ echo .so man$(LIB_MAN_DIR_SUFFIX)/XGetEventData.$(LIB_MAN_SUFFIX) > $$i; \
+ done)
(for i in $(XGetVisualInfo_shadows:=.@LIB_MAN_SUFFIX@) ; do \
echo .so man$(LIB_MAN_DIR_SUFFIX)/XGetVisualInfo.$(LIB_MAN_SUFFIX) > $$i; \
done)
diff --git a/libX11/man/Makefile.in b/libX11/man/Makefile.in
index effbc173e..64f44af7f 100644
--- a/libX11/man/Makefile.in
+++ b/libX11/man/Makefile.in
@@ -358,6 +358,7 @@ libman_PRE = \
XGravityEvent.man \
XrmGetFileDatabase.man \
XrmGetResource.man \
+ XGetEventData.man \
XGetVisualInfo.man \
XGetWindowAttributes.man \
XGetWindowProperty.man \
@@ -559,6 +560,7 @@ all_shadows = \
$(XGraphicsExposeEvent_shadows) \
$(XrmGetFileDatabase_shadows) \
$(XrmGetResource_shadows) \
+ $(XGetEventData_shadows) \
$(XGetVisualInfo_shadows) \
$(XGetWindowAttributes_shadows) \
$(XGetWindowProperty_shadows) \
@@ -945,6 +947,10 @@ XrmGetResource_shadows = \
XrmQGetSearchList \
XrmQGetSearchResource
+XGetEventData_shadows = \
+ XFreeEventData \
+ XGenericEventCookie
+
XGetVisualInfo_shadows = \
XMatchVisualInfo \
XVisualIDFromVisual \
@@ -1894,6 +1900,9 @@ shadows.DONE:
(for i in $(XrmGetResource_shadows:=.@LIB_MAN_SUFFIX@) ; do \
echo .so man$(LIB_MAN_DIR_SUFFIX)/XrmGetResource.$(LIB_MAN_SUFFIX) > $$i; \
done)
+ (for i in $(XGetEventData_shadows:=.@LIB_MAN_SUFFIX@) ; do \
+ echo .so man$(LIB_MAN_DIR_SUFFIX)/XGetEventData.$(LIB_MAN_SUFFIX) > $$i; \
+ done)
(for i in $(XGetVisualInfo_shadows:=.@LIB_MAN_SUFFIX@) ; do \
echo .so man$(LIB_MAN_DIR_SUFFIX)/XGetVisualInfo.$(LIB_MAN_SUFFIX) > $$i; \
done)
diff --git a/libX11/man/XGetEventData.man b/libX11/man/XGetEventData.man
new file mode 100644
index 000000000..10008edc4
--- /dev/null
+++ b/libX11/man/XGetEventData.man
@@ -0,0 +1,223 @@
+.\" Copyright \(co 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.
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.na
+.de Ds
+.nf
+.\\$1D \\$2 \\$1
+.ft 1
+.\".ps \\n(PS
+.\".if \\n(VS>=40 .vs \\n(VSu
+.\".if \\n(VS<=39 .vs \\n(VSp
+..
+.de De
+.ce 0
+.if \\n(BD .DF
+.nr BD 0
+.in \\n(OIu
+.if \\n(TM .ls 2
+.sp \\n(DDu
+.fi
+..
+.de FD
+.LP
+.KS
+.TA .5i 3i
+.ta .5i 3i
+.nf
+..
+.de FN
+.fi
+.KE
+.LP
+..
+.de IN \" send an index entry to the stderr
+..
+.de C{
+.KS
+.nf
+.D
+.\"
+.\" choose appropriate monospace font
+.\" the imagen conditional, 480,
+.\" may be changed to L if LB is too
+.\" heavy for your eyes...
+.\"
+.ie "\\*(.T"480" .ft L
+.el .ie "\\*(.T"300" .ft L
+.el .ie "\\*(.T"202" .ft PO
+.el .ie "\\*(.T"aps" .ft CW
+.el .ft R
+.ps \\n(PS
+.ie \\n(VS>40 .vs \\n(VSu
+.el .vs \\n(VSp
+..
+.de C}
+.DE
+.R
+..
+.de Pn
+.ie t \\$1\fB\^\\$2\^\fR\\$3
+.el \\$1\fI\^\\$2\^\fP\\$3
+..
+.de ZN
+.ie t \fB\^\\$1\^\fR\\$2
+.el \fI\^\\$1\^\fP\\$2
+..
+.de hN
+.ie t <\fB\\$1\fR>\\$2
+.el <\fI\\$1\fP>\\$2
+..
+.de NT
+.ne 7
+.ds NO Note
+.if \\n(.$>$1 .if !'\\$2'C' .ds NO \\$2
+.if \\n(.$ .if !'\\$1'C' .ds NO \\$1
+.ie n .sp
+.el .sp 10p
+.TB
+.ce
+\\*(NO
+.ie n .sp
+.el .sp 5p
+.if '\\$1'C' .ce 99
+.if '\\$2'C' .ce 99
+.in +5n
+.ll -5n
+.R
+..
+. \" Note End -- doug kraft 3/85
+.de NE
+.ce 0
+.in -5n
+.ll +5n
+.ie n .sp
+.el .sp 10p
+..
+.ny0
+.TH XGetEventData __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGetEventData, XFreeEventData, XGenericEventCookie \- retrieve and free additional event data through cookies.
+.SH SYNTAX
+.HP
+Bool XGetEventData\^(\^Display *\fIdisplay\fP\^, XGenericEventCookie *\fIcookie\fP\^);
+.HP
+void XFreeEventData\^(\^Display *\fIdisplay\fP\^, XGenericEventCookie *\fIcookie\fP\^);
+.HP
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcookie\fP 1i
+Specifies the cookie to free or retrieve the data for.
+
+.SH STRUCTURES
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ int type;
+ unsigned long serial;
+ Bool send_event;
+ Display *display;
+ int extension;
+ int evtype;
+ unsigned int cookie;
+ void *data;
+} XGenericEventCookie;
+.De
+
+.SH DESCRIPTION
+Some extension
+.ZN XGenericEvents
+require additional memory to store information.
+For these events, the library returns a
+.ZN XGenericEventCookie
+with a token ('cookie') unique to this event. The
+.ZN XGenericEventCookie 's
+data pointer is undefined until
+.ZN XGetEventData
+is called.
+
+The
+.ZN XGetEventData
+function retrieves this extra data for the given cookie. No round-trip to
+the server is required. If the cookie is invalid or the
+event is not an event handled by cookie handlers,
+.ZN False
+is returned. If
+.ZN XGetEventData
+returns
+.ZN True ,
+the cookie's data pointer points to the memory containing the event
+information. A client must call
+.ZN XFreeEventData
+to free this memory.
+.ZN XGetEventData
+returns
+.ZN False
+for multiple calls for the same event cookie.
+
+The
+.ZN XFreeEventData
+function frees the data associated with a cookie. A client must call
+.ZN XFreeEventData
+for each cookie claimed with
+.ZN XGetEventData .
+
+.SH EXAMPLE CODE
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+XEvent event;
+XGenericEventCookie *cookie = &ev;
+
+XNextEvent(display, &event);
+if (XGetEventData(display, cookie)) {
+ handle_cookie_event(cookie->data);
+} else
+ handle_event(&event);
+}
+XFreeEventData(display, cookie);
+.De
+
+.SH NOTES
+A cookie is defined as unclaimed if it has been returned to the client
+through
+.ZN XNextEvent
+but its data has not been retrieved via
+.ZN XGetEventData .
+Subsequent calls to
+.ZN XNextEvent
+may free memory associated with unclaimed cookies.
+Multi-threaded X clients must ensure that
+.ZN XGetEventData
+is called before the next call to
+.ZN XNextEvent .
+
+.SH "SEE ALSO"
+XNextEvent(3X11),
+.br
+\fI\*(xL\fP
+
diff --git a/libX11/nls/en_US.UTF-8/Compose.pre b/libX11/nls/en_US.UTF-8/Compose.pre
index 26084b906..a4174bbe3 100644
--- a/libX11/nls/en_US.UTF-8/Compose.pre
+++ b/libX11/nls/en_US.UTF-8/Compose.pre
@@ -4150,6 +4150,8 @@ XCOMM Part 3
<Multi_key> <KP_Divide> <rightarrow> : "↛" U219B # RIGHTWARDS ARROW WITH STROKE
<Multi_key> <slash> <U2194> : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE
<Multi_key> <KP_Divide> <U2194> : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE
+<Multi_key> <less> <minus> : "←" U2190 # LEFTWARDS ARROW
+<Multi_key> <minus> <greater> : "→" U2192 # RIGHTWARDS ARROW
<Multi_key> <U2203> <U0338> : "∄" U2204 # THERE DOES NOT EXIST
<Multi_key> <U2208> <U0338> : "∉" U2209 # NOT AN ELEMENT OF
<Multi_key> <U220B> <U0338> : "∌" U220C # DOES NOT CONTAIN AS MEMBER
diff --git a/libX11/src/ChkIfEv.c b/libX11/src/ChkIfEv.c
index 9bef64f89..66f0c3c98 100644
--- a/libX11/src/ChkIfEv.c
+++ b/libX11/src/ChkIfEv.c
@@ -62,6 +62,7 @@ Bool XCheckIfEvent (
&& (*predicate)(dpy, &qelt->event, arg)) {
*event = qelt->event;
_XDeq(dpy, prev, qelt);
+ _XStoreEventCookie(dpy, event);
UnlockDisplay(dpy);
return True;
}
diff --git a/libX11/src/ChkMaskEv.c b/libX11/src/ChkMaskEv.c
index bc1a279f1..6fb71c9e0 100644
--- a/libX11/src/ChkMaskEv.c
+++ b/libX11/src/ChkMaskEv.c
@@ -54,6 +54,10 @@ Bool XCheckMaskEvent (
int n; /* time through count */
LockDisplay(dpy);
+
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
prev = NULL;
for (n = 3; --n >= 0;) {
for (qelt = prev ? prev->next : dpy->head;
diff --git a/libX11/src/ChkTypEv.c b/libX11/src/ChkTypEv.c
index fc4c7d187..f64ebd335 100644
--- a/libX11/src/ChkTypEv.c
+++ b/libX11/src/ChkTypEv.c
@@ -48,6 +48,10 @@ Bool XCheckTypedEvent (
int n; /* time through count */
LockDisplay(dpy);
+
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
prev = NULL;
for (n = 3; --n >= 0;) {
for (qelt = prev ? prev->next : dpy->head;
diff --git a/libX11/src/ChkTypWEv.c b/libX11/src/ChkTypWEv.c
index 6214c3654..d791eb255 100644
--- a/libX11/src/ChkTypWEv.c
+++ b/libX11/src/ChkTypWEv.c
@@ -49,6 +49,10 @@ Bool XCheckTypedWindowEvent (
int n; /* time through count */
LockDisplay(dpy);
+
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
prev = NULL;
for (n = 3; --n >= 0;) {
for (qelt = prev ? prev->next : dpy->head;
diff --git a/libX11/src/ChkWinEv.c b/libX11/src/ChkWinEv.c
index 1fd975cda..b753c5fd8 100644
--- a/libX11/src/ChkWinEv.c
+++ b/libX11/src/ChkWinEv.c
@@ -54,6 +54,10 @@ Bool XCheckWindowEvent (
int n; /* time through count */
LockDisplay(dpy);
+
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
prev = NULL;
for (n = 3; --n >= 0;) {
for (qelt = prev ? prev->next : dpy->head;
diff --git a/libX11/src/FreeEventData.c b/libX11/src/FreeEventData.c
new file mode 100644
index 000000000..e2d40b0db
--- /dev/null
+++ b/libX11/src/FreeEventData.c
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+void
+XFreeEventData(Display *dpy, XGenericEventCookie *event)
+{
+
+ if (_XIsEventCookie(dpy, (XEvent*)event) && event->data)
+ {
+ XFree(event->data);
+ event->data = NULL;
+ event->cookie = 0;
+ }
+ return;
+}
+
diff --git a/libX11/src/GetEventData.c b/libX11/src/GetEventData.c
new file mode 100644
index 000000000..b93dee6cd
--- /dev/null
+++ b/libX11/src/GetEventData.c
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+Bool
+XGetEventData(Display *dpy, XGenericEventCookie *event)
+{
+ Bool rc;
+ LockDisplay(dpy);
+
+ rc = _XFetchEventCookie(dpy, event);
+
+ UnlockDisplay(dpy);
+
+ return rc;
+}
+
diff --git a/libX11/src/IfEvent.c b/libX11/src/IfEvent.c
index 05a2b82cb..64c8f465b 100644
--- a/libX11/src/IfEvent.c
+++ b/libX11/src/IfEvent.c
@@ -61,6 +61,7 @@ XIfEvent (
&& (*predicate)(dpy, &qelt->event, arg)) {
*event = qelt->event;
_XDeq(dpy, prev, qelt);
+ _XStoreEventCookie(dpy, event);
UnlockDisplay(dpy);
return 0;
}
diff --git a/libX11/src/InitExt.c b/libX11/src/InitExt.c
index 92fc44afa..0e6c94ee6 100644
--- a/libX11/src/InitExt.c
+++ b/libX11/src/InitExt.c
@@ -253,6 +253,49 @@ WireToEventType XESetWireToEvent(
return (WireToEventType)oldproc;
}
+typedef Bool (*WireToEventCookieType) (
+ Display* /* display */,
+ XGenericEventCookie* /* re */,
+ xEvent* /* event */
+);
+
+WireToEventCookieType XESetWireToEventCookie(
+ Display *dpy, /* display */
+ int extension, /* extension major opcode */
+ WireToEventCookieType proc /* routine to call for generic events */
+ )
+{
+ WireToEventCookieType oldproc;
+ if (proc == NULL) proc = (WireToEventCookieType)_XUnknownWireEventCookie;
+ LockDisplay (dpy);
+ oldproc = dpy->generic_event_vec[extension & 0x7F];
+ dpy->generic_event_vec[extension & 0x7F] = proc;
+ UnlockDisplay (dpy);
+ return (WireToEventCookieType)oldproc;
+}
+
+typedef Bool (*CopyEventCookieType) (
+ Display* /* display */,
+ XGenericEventCookie* /* in */,
+ XGenericEventCookie* /* out */
+);
+
+CopyEventCookieType XESetCopyEventCookie(
+ Display *dpy, /* display */
+ int extension, /* extension major opcode */
+ CopyEventCookieType proc /* routine to copy generic events */
+ )
+{
+ CopyEventCookieType oldproc;
+ if (proc == NULL) proc = (CopyEventCookieType)_XUnknownCopyEventCookie;
+ LockDisplay (dpy);
+ oldproc = dpy->generic_event_copy_vec[extension & 0x7F];
+ dpy->generic_event_copy_vec[extension & 0x7F] = proc;
+ UnlockDisplay (dpy);
+ return (CopyEventCookieType)oldproc;
+}
+
+
typedef Status (*EventToWireType) (
Display* /* display */,
XEvent* /* re */,
diff --git a/libX11/src/Makefile.am b/libX11/src/Makefile.am
index 86a846e41..26d8e277f 100644
--- a/libX11/src/Makefile.am
+++ b/libX11/src/Makefile.am
@@ -130,6 +130,7 @@ libX11_la_SOURCES = \
FreeCols.c \
FreeCurs.c \
FreeEData.c \
+ FreeEventData.c \
FreeGC.c \
FreePix.c \
FSSaver.c \
@@ -139,6 +140,7 @@ libX11_la_SOURCES = \
GetAtomNm.c \
GetColor.c \
GetDflt.c \
+ GetEventData.c \
GetFPath.c \
GetFProp.c \
GetGCVals.c \
@@ -297,6 +299,7 @@ libX11_la_SOURCES = \
UnldFont.c \
UnmapSubs.c \
UnmapWin.c \
+ utlist.h \
VisUtil.c \
WarpPtr.c \
Window.c \
@@ -373,7 +376,7 @@ if XKB
USE_XKB_LIBS = $(XKB_LIBS)
endif
-libX11_la_LDFLAGS = -version-number 6:2:0 -no-undefined
+libX11_la_LDFLAGS = -version-number 6:3:0 -no-undefined
libX11_la_LIBADD = \
$(USE_I18N_LIBS) \
diff --git a/libX11/src/Makefile.in b/libX11/src/Makefile.in
index ef4df0a71..1d377c9e0 100644
--- a/libX11/src/Makefile.in
+++ b/libX11/src/Makefile.in
@@ -114,43 +114,43 @@ am__libX11_la_SOURCES_DIST = AllCells.c AllowEv.c AllPlanes.c \
DrRects.c DrSegs.c ErrDes.c ErrHndlr.c evtomask.c EvToWire.c \
FetchName.c FillArc.c FillArcs.c FillPoly.c FillRct.c \
FillRcts.c FilterEv.c Flush.c Font.c FontInfo.c FontNames.c \
- FreeCmap.c FreeCols.c FreeCurs.c FreeEData.c FreeGC.c \
- FreePix.c FSSaver.c FSWrap.c GCMisc.c Geom.c GetAtomNm.c \
- GetColor.c GetDflt.c GetFPath.c GetFProp.c GetGCVals.c \
- GetGeom.c GetHColor.c GetHints.c GetIFocus.c GetImage.c \
- GetKCnt.c GetMoEv.c GetNrmHint.c GetPCnt.c GetPntMap.c \
- GetProp.c GetRGBCMap.c GetSOwner.c GetSSaver.c GetStCmap.c \
- GetTxtProp.c GetWAttrs.c GetWMCMapW.c GetWMProto.c globals.c \
- GrButton.c GrKeybd.c GrKey.c GrPointer.c GrServer.c Host.c \
- Iconify.c IfEvent.c imConv.c ImText16.c ImText.c ImUtil.c \
- InitExt.c InsCmap.c IntAtom.c KeyBind.c Key.h KeysymStr.c \
- KillCl.c LiHosts.c LiICmaps.c LiProps.c ListExt.c LoadFont.c \
- LockDis.c locking.c locking.h LookupCol.c LowerWin.c Macros.c \
- MapRaised.c MapSubs.c MapWindow.c MaskEvent.c Misc.c ModMap.c \
- MoveWin.c NextEvent.c OCWrap.c OMWrap.c OpenDis.c ParseCmd.c \
- ParseCol.c ParseGeom.c PeekEvent.c PeekIfEv.c Pending.c \
- PixFormats.c PmapBgnd.c PmapBord.c poly.h PolyReg.c \
- PolyTxt16.c PolyTxt.c PropAlloc.c PutBEvent.c PutImage.c \
- Quarks.c QuBest.c QuColor.c QuColors.c QuCurShp.c QuExt.c \
- QuKeybd.c QuPntr.c QuStipShp.c QuTextE16.c QuTextExt.c \
- QuTileShp.c QuTree.c RaiseWin.c RdBitF.c RecolorC.c \
- ReconfWin.c ReconfWM.c Region.c RegstFlt.c RepWindow.c \
- RestackWs.c RotProp.c ScrResStr.c SelInput.c SendEvent.c \
- SetBack.c SetClMask.c SetClOrig.c SetCRects.c SetDashes.c \
- SetFont.c SetFore.c SetFPath.c SetFunc.c SetHints.c \
- SetIFocus.c SetLocale.c SetLStyle.c SetNrmHint.c SetPMask.c \
- SetPntMap.c SetRGBCMap.c SetSOwner.c SetSSaver.c SetState.c \
- SetStCmap.c SetStip.c SetTile.c SetTSOrig.c SetTxtProp.c \
- SetWMCMapW.c SetWMProto.c StBytes.c StColor.c StColors.c \
- StName.c StNColor.c StrKeysym.c StrToText.c Sync.c Synchro.c \
- Text16.c Text.c TextExt16.c TextExt.c TextToStr.c TrCoords.c \
- UndefCurs.c UngrabBut.c UngrabKbd.c UngrabKey.c UngrabPtr.c \
- UngrabSvr.c UninsCmap.c UnldFont.c UnmapSubs.c UnmapWin.c \
- VisUtil.c WarpPtr.c Window.c WinEvent.c Withdraw.c WMGeom.c \
- WMProps.c WrBitF.c Xatomtype.h Xintatom.h Xintconn.h \
- XlibAsync.c XlibInt.c Xprivate.h XomGeneric.h Xresinternal.h \
- Xrm.c XrmI.h os2Stubs.c udcInf.c UIThrStubs.c xcb_disp.c \
- xcb_io.c Xxcbint.h ConnDis.c x11_trans.c
+ FreeCmap.c FreeCols.c FreeCurs.c FreeEData.c FreeEventData.c \
+ FreeGC.c FreePix.c FSSaver.c FSWrap.c GCMisc.c Geom.c \
+ GetAtomNm.c GetColor.c GetDflt.c GetEventData.c GetFPath.c \
+ GetFProp.c GetGCVals.c GetGeom.c GetHColor.c GetHints.c \
+ GetIFocus.c GetImage.c GetKCnt.c GetMoEv.c GetNrmHint.c \
+ GetPCnt.c GetPntMap.c GetProp.c GetRGBCMap.c GetSOwner.c \
+ GetSSaver.c GetStCmap.c GetTxtProp.c GetWAttrs.c GetWMCMapW.c \
+ GetWMProto.c globals.c GrButton.c GrKeybd.c GrKey.c \
+ GrPointer.c GrServer.c Host.c Iconify.c IfEvent.c imConv.c \
+ ImText16.c ImText.c ImUtil.c InitExt.c InsCmap.c IntAtom.c \
+ KeyBind.c Key.h KeysymStr.c KillCl.c LiHosts.c LiICmaps.c \
+ LiProps.c ListExt.c LoadFont.c LockDis.c locking.c locking.h \
+ LookupCol.c LowerWin.c Macros.c MapRaised.c MapSubs.c \
+ MapWindow.c MaskEvent.c Misc.c ModMap.c MoveWin.c NextEvent.c \
+ OCWrap.c OMWrap.c OpenDis.c ParseCmd.c ParseCol.c ParseGeom.c \
+ PeekEvent.c PeekIfEv.c Pending.c PixFormats.c PmapBgnd.c \
+ PmapBord.c poly.h PolyReg.c PolyTxt16.c PolyTxt.c PropAlloc.c \
+ PutBEvent.c PutImage.c Quarks.c QuBest.c QuColor.c QuColors.c \
+ QuCurShp.c QuExt.c QuKeybd.c QuPntr.c QuStipShp.c QuTextE16.c \
+ QuTextExt.c QuTileShp.c QuTree.c RaiseWin.c RdBitF.c \
+ RecolorC.c ReconfWin.c ReconfWM.c Region.c RegstFlt.c \
+ RepWindow.c RestackWs.c RotProp.c ScrResStr.c SelInput.c \
+ SendEvent.c SetBack.c SetClMask.c SetClOrig.c SetCRects.c \
+ SetDashes.c SetFont.c SetFore.c SetFPath.c SetFunc.c \
+ SetHints.c SetIFocus.c SetLocale.c SetLStyle.c SetNrmHint.c \
+ SetPMask.c SetPntMap.c SetRGBCMap.c SetSOwner.c SetSSaver.c \
+ SetState.c SetStCmap.c SetStip.c SetTile.c SetTSOrig.c \
+ SetTxtProp.c SetWMCMapW.c SetWMProto.c StBytes.c StColor.c \
+ StColors.c StName.c StNColor.c StrKeysym.c StrToText.c Sync.c \
+ Synchro.c Text16.c Text.c TextExt16.c TextExt.c TextToStr.c \
+ TrCoords.c UndefCurs.c UngrabBut.c UngrabKbd.c UngrabKey.c \
+ UngrabPtr.c UngrabSvr.c UninsCmap.c UnldFont.c UnmapSubs.c \
+ UnmapWin.c utlist.h VisUtil.c WarpPtr.c Window.c WinEvent.c \
+ Withdraw.c WMGeom.c WMProps.c WrBitF.c Xatomtype.h Xintatom.h \
+ Xintconn.h XlibAsync.c XlibInt.c Xprivate.h XomGeneric.h \
+ Xresinternal.h Xrm.c XrmI.h os2Stubs.c udcInf.c UIThrStubs.c \
+ xcb_disp.c xcb_io.c Xxcbint.h ConnDis.c x11_trans.c
@OS2_TRUE@am__objects_1 = os2Stubs.lo
@UDC_TRUE@am__objects_2 = udcInf.lo
@THRSTUBS_TRUE@am__objects_3 = UIThrStubs.lo
@@ -172,44 +172,45 @@ am_libX11_la_OBJECTS = AllCells.lo AllowEv.lo AllPlanes.lo AutoRep.lo \
EvToWire.lo FetchName.lo FillArc.lo FillArcs.lo FillPoly.lo \
FillRct.lo FillRcts.lo FilterEv.lo Flush.lo Font.lo \
FontInfo.lo FontNames.lo FreeCmap.lo FreeCols.lo FreeCurs.lo \
- FreeEData.lo FreeGC.lo FreePix.lo FSSaver.lo FSWrap.lo \
- GCMisc.lo Geom.lo GetAtomNm.lo GetColor.lo GetDflt.lo \
- GetFPath.lo GetFProp.lo GetGCVals.lo GetGeom.lo GetHColor.lo \
- GetHints.lo GetIFocus.lo GetImage.lo GetKCnt.lo GetMoEv.lo \
- GetNrmHint.lo GetPCnt.lo GetPntMap.lo GetProp.lo GetRGBCMap.lo \
- GetSOwner.lo GetSSaver.lo GetStCmap.lo GetTxtProp.lo \
- GetWAttrs.lo GetWMCMapW.lo GetWMProto.lo globals.lo \
- GrButton.lo GrKeybd.lo GrKey.lo GrPointer.lo GrServer.lo \
- Host.lo Iconify.lo IfEvent.lo imConv.lo ImText16.lo ImText.lo \
- ImUtil.lo InitExt.lo InsCmap.lo IntAtom.lo KeyBind.lo \
- KeysymStr.lo KillCl.lo LiHosts.lo LiICmaps.lo LiProps.lo \
- ListExt.lo LoadFont.lo LockDis.lo locking.lo LookupCol.lo \
- LowerWin.lo Macros.lo MapRaised.lo MapSubs.lo MapWindow.lo \
- MaskEvent.lo Misc.lo ModMap.lo MoveWin.lo NextEvent.lo \
- OCWrap.lo OMWrap.lo OpenDis.lo ParseCmd.lo ParseCol.lo \
- ParseGeom.lo PeekEvent.lo PeekIfEv.lo Pending.lo PixFormats.lo \
- PmapBgnd.lo PmapBord.lo PolyReg.lo PolyTxt16.lo PolyTxt.lo \
- PropAlloc.lo PutBEvent.lo PutImage.lo Quarks.lo QuBest.lo \
- QuColor.lo QuColors.lo QuCurShp.lo QuExt.lo QuKeybd.lo \
- QuPntr.lo QuStipShp.lo QuTextE16.lo QuTextExt.lo QuTileShp.lo \
- QuTree.lo RaiseWin.lo RdBitF.lo RecolorC.lo ReconfWin.lo \
- ReconfWM.lo Region.lo RegstFlt.lo RepWindow.lo RestackWs.lo \
- RotProp.lo ScrResStr.lo SelInput.lo SendEvent.lo SetBack.lo \
- SetClMask.lo SetClOrig.lo SetCRects.lo SetDashes.lo SetFont.lo \
- SetFore.lo SetFPath.lo SetFunc.lo SetHints.lo SetIFocus.lo \
- SetLocale.lo SetLStyle.lo SetNrmHint.lo SetPMask.lo \
- SetPntMap.lo SetRGBCMap.lo SetSOwner.lo SetSSaver.lo \
- SetState.lo SetStCmap.lo SetStip.lo SetTile.lo SetTSOrig.lo \
- SetTxtProp.lo SetWMCMapW.lo SetWMProto.lo StBytes.lo \
- StColor.lo StColors.lo StName.lo StNColor.lo StrKeysym.lo \
- StrToText.lo Sync.lo Synchro.lo Text16.lo Text.lo TextExt16.lo \
- TextExt.lo TextToStr.lo TrCoords.lo UndefCurs.lo UngrabBut.lo \
- UngrabKbd.lo UngrabKey.lo UngrabPtr.lo UngrabSvr.lo \
- UninsCmap.lo UnldFont.lo UnmapSubs.lo UnmapWin.lo VisUtil.lo \
- WarpPtr.lo Window.lo WinEvent.lo Withdraw.lo WMGeom.lo \
- WMProps.lo WrBitF.lo XlibAsync.lo XlibInt.lo Xrm.lo \
- $(am__objects_1) $(am__objects_2) $(am__objects_3) \
- $(am__objects_4) $(am__objects_5)
+ FreeEData.lo FreeEventData.lo FreeGC.lo FreePix.lo FSSaver.lo \
+ FSWrap.lo GCMisc.lo Geom.lo GetAtomNm.lo GetColor.lo \
+ GetDflt.lo GetEventData.lo GetFPath.lo GetFProp.lo \
+ GetGCVals.lo GetGeom.lo GetHColor.lo GetHints.lo GetIFocus.lo \
+ GetImage.lo GetKCnt.lo GetMoEv.lo GetNrmHint.lo GetPCnt.lo \
+ GetPntMap.lo GetProp.lo GetRGBCMap.lo GetSOwner.lo \
+ GetSSaver.lo GetStCmap.lo GetTxtProp.lo GetWAttrs.lo \
+ GetWMCMapW.lo GetWMProto.lo globals.lo GrButton.lo GrKeybd.lo \
+ GrKey.lo GrPointer.lo GrServer.lo Host.lo Iconify.lo \
+ IfEvent.lo imConv.lo ImText16.lo ImText.lo ImUtil.lo \
+ InitExt.lo InsCmap.lo IntAtom.lo KeyBind.lo KeysymStr.lo \
+ KillCl.lo LiHosts.lo LiICmaps.lo LiProps.lo ListExt.lo \
+ LoadFont.lo LockDis.lo locking.lo LookupCol.lo LowerWin.lo \
+ Macros.lo MapRaised.lo MapSubs.lo MapWindow.lo MaskEvent.lo \
+ Misc.lo ModMap.lo MoveWin.lo NextEvent.lo OCWrap.lo OMWrap.lo \
+ OpenDis.lo ParseCmd.lo ParseCol.lo ParseGeom.lo PeekEvent.lo \
+ PeekIfEv.lo Pending.lo PixFormats.lo PmapBgnd.lo PmapBord.lo \
+ PolyReg.lo PolyTxt16.lo PolyTxt.lo PropAlloc.lo PutBEvent.lo \
+ PutImage.lo Quarks.lo QuBest.lo QuColor.lo QuColors.lo \
+ QuCurShp.lo QuExt.lo QuKeybd.lo QuPntr.lo QuStipShp.lo \
+ QuTextE16.lo QuTextExt.lo QuTileShp.lo QuTree.lo RaiseWin.lo \
+ RdBitF.lo RecolorC.lo ReconfWin.lo ReconfWM.lo Region.lo \
+ RegstFlt.lo RepWindow.lo RestackWs.lo RotProp.lo ScrResStr.lo \
+ SelInput.lo SendEvent.lo SetBack.lo SetClMask.lo SetClOrig.lo \
+ SetCRects.lo SetDashes.lo SetFont.lo SetFore.lo SetFPath.lo \
+ SetFunc.lo SetHints.lo SetIFocus.lo SetLocale.lo SetLStyle.lo \
+ SetNrmHint.lo SetPMask.lo SetPntMap.lo SetRGBCMap.lo \
+ SetSOwner.lo SetSSaver.lo SetState.lo SetStCmap.lo SetStip.lo \
+ SetTile.lo SetTSOrig.lo SetTxtProp.lo SetWMCMapW.lo \
+ SetWMProto.lo StBytes.lo StColor.lo StColors.lo StName.lo \
+ StNColor.lo StrKeysym.lo StrToText.lo Sync.lo Synchro.lo \
+ Text16.lo Text.lo TextExt16.lo TextExt.lo TextToStr.lo \
+ TrCoords.lo UndefCurs.lo UngrabBut.lo UngrabKbd.lo \
+ UngrabKey.lo UngrabPtr.lo UngrabSvr.lo UninsCmap.lo \
+ UnldFont.lo UnmapSubs.lo UnmapWin.lo VisUtil.lo WarpPtr.lo \
+ Window.lo WinEvent.lo Withdraw.lo WMGeom.lo WMProps.lo \
+ WrBitF.lo XlibAsync.lo XlibInt.lo Xrm.lo $(am__objects_1) \
+ $(am__objects_2) $(am__objects_3) $(am__objects_4) \
+ $(am__objects_5)
libX11_la_OBJECTS = $(am_libX11_la_OBJECTS)
libX11_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -498,43 +499,43 @@ libX11_la_SOURCES = AllCells.c AllowEv.c AllPlanes.c AutoRep.c \
DrRects.c DrSegs.c ErrDes.c ErrHndlr.c evtomask.c EvToWire.c \
FetchName.c FillArc.c FillArcs.c FillPoly.c FillRct.c \
FillRcts.c FilterEv.c Flush.c Font.c FontInfo.c FontNames.c \
- FreeCmap.c FreeCols.c FreeCurs.c FreeEData.c FreeGC.c \
- FreePix.c FSSaver.c FSWrap.c GCMisc.c Geom.c GetAtomNm.c \
- GetColor.c GetDflt.c GetFPath.c GetFProp.c GetGCVals.c \
- GetGeom.c GetHColor.c GetHints.c GetIFocus.c GetImage.c \
- GetKCnt.c GetMoEv.c GetNrmHint.c GetPCnt.c GetPntMap.c \
- GetProp.c GetRGBCMap.c GetSOwner.c GetSSaver.c GetStCmap.c \
- GetTxtProp.c GetWAttrs.c GetWMCMapW.c GetWMProto.c globals.c \
- GrButton.c GrKeybd.c GrKey.c GrPointer.c GrServer.c Host.c \
- Iconify.c IfEvent.c imConv.c ImText16.c ImText.c ImUtil.c \
- InitExt.c InsCmap.c IntAtom.c KeyBind.c Key.h KeysymStr.c \
- KillCl.c LiHosts.c LiICmaps.c LiProps.c ListExt.c LoadFont.c \
- LockDis.c locking.c locking.h LookupCol.c LowerWin.c Macros.c \
- MapRaised.c MapSubs.c MapWindow.c MaskEvent.c Misc.c ModMap.c \
- MoveWin.c NextEvent.c OCWrap.c OMWrap.c OpenDis.c ParseCmd.c \
- ParseCol.c ParseGeom.c PeekEvent.c PeekIfEv.c Pending.c \
- PixFormats.c PmapBgnd.c PmapBord.c poly.h PolyReg.c \
- PolyTxt16.c PolyTxt.c PropAlloc.c PutBEvent.c PutImage.c \
- Quarks.c QuBest.c QuColor.c QuColors.c QuCurShp.c QuExt.c \
- QuKeybd.c QuPntr.c QuStipShp.c QuTextE16.c QuTextExt.c \
- QuTileShp.c QuTree.c RaiseWin.c RdBitF.c RecolorC.c \
- ReconfWin.c ReconfWM.c Region.c RegstFlt.c RepWindow.c \
- RestackWs.c RotProp.c ScrResStr.c SelInput.c SendEvent.c \
- SetBack.c SetClMask.c SetClOrig.c SetCRects.c SetDashes.c \
- SetFont.c SetFore.c SetFPath.c SetFunc.c SetHints.c \
- SetIFocus.c SetLocale.c SetLStyle.c SetNrmHint.c SetPMask.c \
- SetPntMap.c SetRGBCMap.c SetSOwner.c SetSSaver.c SetState.c \
- SetStCmap.c SetStip.c SetTile.c SetTSOrig.c SetTxtProp.c \
- SetWMCMapW.c SetWMProto.c StBytes.c StColor.c StColors.c \
- StName.c StNColor.c StrKeysym.c StrToText.c Sync.c Synchro.c \
- Text16.c Text.c TextExt16.c TextExt.c TextToStr.c TrCoords.c \
- UndefCurs.c UngrabBut.c UngrabKbd.c UngrabKey.c UngrabPtr.c \
- UngrabSvr.c UninsCmap.c UnldFont.c UnmapSubs.c UnmapWin.c \
- VisUtil.c WarpPtr.c Window.c WinEvent.c Withdraw.c WMGeom.c \
- WMProps.c WrBitF.c Xatomtype.h Xintatom.h Xintconn.h \
- XlibAsync.c XlibInt.c Xprivate.h XomGeneric.h Xresinternal.h \
- Xrm.c XrmI.h $(am__append_1) $(am__append_2) $(am__append_3) \
- $(am__append_4) $(am__append_6)
+ FreeCmap.c FreeCols.c FreeCurs.c FreeEData.c FreeEventData.c \
+ FreeGC.c FreePix.c FSSaver.c FSWrap.c GCMisc.c Geom.c \
+ GetAtomNm.c GetColor.c GetDflt.c GetEventData.c GetFPath.c \
+ GetFProp.c GetGCVals.c GetGeom.c GetHColor.c GetHints.c \
+ GetIFocus.c GetImage.c GetKCnt.c GetMoEv.c GetNrmHint.c \
+ GetPCnt.c GetPntMap.c GetProp.c GetRGBCMap.c GetSOwner.c \
+ GetSSaver.c GetStCmap.c GetTxtProp.c GetWAttrs.c GetWMCMapW.c \
+ GetWMProto.c globals.c GrButton.c GrKeybd.c GrKey.c \
+ GrPointer.c GrServer.c Host.c Iconify.c IfEvent.c imConv.c \
+ ImText16.c ImText.c ImUtil.c InitExt.c InsCmap.c IntAtom.c \
+ KeyBind.c Key.h KeysymStr.c KillCl.c LiHosts.c LiICmaps.c \
+ LiProps.c ListExt.c LoadFont.c LockDis.c locking.c locking.h \
+ LookupCol.c LowerWin.c Macros.c MapRaised.c MapSubs.c \
+ MapWindow.c MaskEvent.c Misc.c ModMap.c MoveWin.c NextEvent.c \
+ OCWrap.c OMWrap.c OpenDis.c ParseCmd.c ParseCol.c ParseGeom.c \
+ PeekEvent.c PeekIfEv.c Pending.c PixFormats.c PmapBgnd.c \
+ PmapBord.c poly.h PolyReg.c PolyTxt16.c PolyTxt.c PropAlloc.c \
+ PutBEvent.c PutImage.c Quarks.c QuBest.c QuColor.c QuColors.c \
+ QuCurShp.c QuExt.c QuKeybd.c QuPntr.c QuStipShp.c QuTextE16.c \
+ QuTextExt.c QuTileShp.c QuTree.c RaiseWin.c RdBitF.c \
+ RecolorC.c ReconfWin.c ReconfWM.c Region.c RegstFlt.c \
+ RepWindow.c RestackWs.c RotProp.c ScrResStr.c SelInput.c \
+ SendEvent.c SetBack.c SetClMask.c SetClOrig.c SetCRects.c \
+ SetDashes.c SetFont.c SetFore.c SetFPath.c SetFunc.c \
+ SetHints.c SetIFocus.c SetLocale.c SetLStyle.c SetNrmHint.c \
+ SetPMask.c SetPntMap.c SetRGBCMap.c SetSOwner.c SetSSaver.c \
+ SetState.c SetStCmap.c SetStip.c SetTile.c SetTSOrig.c \
+ SetTxtProp.c SetWMCMapW.c SetWMProto.c StBytes.c StColor.c \
+ StColors.c StName.c StNColor.c StrKeysym.c StrToText.c Sync.c \
+ Synchro.c Text16.c Text.c TextExt16.c TextExt.c TextToStr.c \
+ TrCoords.c UndefCurs.c UngrabBut.c UngrabKbd.c UngrabKey.c \
+ UngrabPtr.c UngrabSvr.c UninsCmap.c UnldFont.c UnmapSubs.c \
+ UnmapWin.c utlist.h VisUtil.c WarpPtr.c Window.c WinEvent.c \
+ Withdraw.c WMGeom.c WMProps.c WrBitF.c Xatomtype.h Xintatom.h \
+ Xintconn.h XlibAsync.c XlibInt.c Xprivate.h XomGeneric.h \
+ Xresinternal.h Xrm.c XrmI.h $(am__append_1) $(am__append_2) \
+ $(am__append_3) $(am__append_4) $(am__append_6)
x11datadir = @X11_DATADIR@
x11data_DATA = XKeysymDB XErrorDB
EXTRA_DIST = \
@@ -553,7 +554,7 @@ EXTRA_DIST = \
@XLOCALE_TRUE@USE_I18N_LIBS = $(I18N_LIBS)
@XCMS_TRUE@USE_XCMS_LIBS = $(XCMS_LIBS)
@XKB_TRUE@USE_XKB_LIBS = $(XKB_LIBS)
-libX11_la_LDFLAGS = -version-number 6:2:0 -no-undefined
+libX11_la_LDFLAGS = -version-number 6:3:0 -no-undefined
libX11_la_LIBADD = \
$(USE_I18N_LIBS) \
$(USE_XCMS_LIBS) \
@@ -745,6 +746,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FreeCols.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FreeCurs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FreeEData.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FreeEventData.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FreeGC.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FreePix.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GCMisc.Plo@am__quote@
@@ -752,6 +754,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetAtomNm.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetColor.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetDflt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetEventData.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetFPath.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetFProp.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GetGCVals.Plo@am__quote@
diff --git a/libX11/src/MaskEvent.c b/libX11/src/MaskEvent.c
index acd903f9e..14af00cc0 100644
--- a/libX11/src/MaskEvent.c
+++ b/libX11/src/MaskEvent.c
@@ -53,6 +53,10 @@ XMaskEvent (
unsigned long qe_serial = 0;
LockDisplay(dpy);
+
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
prev = NULL;
while (1) {
for (qelt = prev ? prev->next : dpy->head;
diff --git a/libX11/src/NextEvent.c b/libX11/src/NextEvent.c
index d4f72e773..1dc8384e4 100644
--- a/libX11/src/NextEvent.c
+++ b/libX11/src/NextEvent.c
@@ -46,11 +46,15 @@ XNextEvent (
LockDisplay(dpy);
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
if (dpy->head == NULL)
_XReadEvents(dpy);
qelt = dpy->head;
*event = qelt->event;
_XDeq(dpy, NULL, qelt);
+ _XStoreEventCookie(dpy, event);
UnlockDisplay(dpy);
return 0;
}
diff --git a/libX11/src/OpenDis.c b/libX11/src/OpenDis.c
index 29ac65c6a..230ae561f 100644
--- a/libX11/src/OpenDis.c
+++ b/libX11/src/OpenDis.c
@@ -790,6 +790,17 @@ _XBigReqHandler(
void _XFreeDisplayStructure(Display *dpy)
{
+ /* move all cookies in the EQ to the jar, then free them. */
+ if (dpy->qfree) {
+ _XQEvent *qelt = dpy->qfree;
+ while (qelt) {
+ if (_XIsEventCookie(dpy, &qelt->event))
+ _XStoreEventCookie(dpy, &qelt->event);
+ qelt = qelt->next;
+ }
+ }
+ if (dpy->cookiejar)
+ _XFreeEventCookies(dpy);
while (dpy->ext_procs) {
_XExtension *ext = dpy->ext_procs;
dpy->ext_procs = ext->next;
diff --git a/libX11/src/PeekEvent.c b/libX11/src/PeekEvent.c
index 6eec4a04d..344fe02b2 100644
--- a/libX11/src/PeekEvent.c
+++ b/libX11/src/PeekEvent.c
@@ -43,10 +43,15 @@ XPeekEvent (
register Display *dpy,
register XEvent *event)
{
+ XEvent copy;
LockDisplay(dpy);
if (dpy->head == NULL)
_XReadEvents(dpy);
*event = (dpy->head)->event;
+ if (_XCopyEventCookie(dpy, &event->xcookie, &copy.xcookie)) {
+ _XStoreEventCookie(dpy, &copy);
+ *event = copy;
+ }
UnlockDisplay(dpy);
return 1;
}
diff --git a/libX11/src/PeekIfEv.c b/libX11/src/PeekIfEv.c
index 1d5b1ab9c..5105b6a58 100644
--- a/libX11/src/PeekIfEv.c
+++ b/libX11/src/PeekIfEv.c
@@ -60,7 +60,12 @@ XPeekIfEvent (
prev = qelt, qelt = qelt->next) {
if(qelt->qserial_num > qe_serial
&& (*predicate)(dpy, &qelt->event, arg)) {
+ XEvent copy;
*event = qelt->event;
+ if (_XCopyEventCookie(dpy, &event->xcookie, &copy.xcookie)) {
+ _XStoreEventCookie(dpy, &copy);
+ *event = copy;
+ }
UnlockDisplay(dpy);
return 0;
}
diff --git a/libX11/src/PutBEvent.c b/libX11/src/PutBEvent.c
index eca44f3af..03a9cd266 100644
--- a/libX11/src/PutBEvent.c
+++ b/libX11/src/PutBEvent.c
@@ -41,6 +41,7 @@ _XPutBackEvent (
register XEvent *event)
{
register _XQEvent *qelt;
+ XEvent store = *event;
if (!dpy->qfree) {
if ((dpy->qfree = (_XQEvent *) Xmalloc (sizeof (_XQEvent))) == NULL) {
@@ -48,11 +49,26 @@ _XPutBackEvent (
}
dpy->qfree->next = NULL;
}
+
+ /* unclaimed cookie? */
+ if (_XIsEventCookie(dpy, event))
+ {
+ XEvent copy = {0};
+ /* if not claimed, then just fetch and store again */
+ if (!event->xcookie.data) {
+ _XFetchEventCookie(dpy, &event->xcookie);
+ store = *event;
+ } else { /* if claimed, copy, client must free */
+ _XCopyEventCookie(dpy, &event->xcookie, &copy.xcookie);
+ store = copy;
+ }
+ }
+
qelt = dpy->qfree;
dpy->qfree = qelt->next;
qelt->qserial_num = dpy->next_event_serial_num++;
qelt->next = dpy->head;
- qelt->event = *event;
+ qelt->event = store;
dpy->head = qelt;
if (dpy->tail == NULL)
dpy->tail = qelt;
diff --git a/libX11/src/WinEvent.c b/libX11/src/WinEvent.c
index c6daf2a81..bcdf98148 100644
--- a/libX11/src/WinEvent.c
+++ b/libX11/src/WinEvent.c
@@ -56,6 +56,10 @@ XWindowEvent (
unsigned long qe_serial = 0;
LockDisplay(dpy);
+
+ /* Delete unclaimed cookies */
+ _XFreeEventCookies(dpy);
+
prev = NULL;
while (1) {
for (qelt = prev ? prev->next : dpy->head;
diff --git a/libX11/src/XlibInt.c b/libX11/src/XlibInt.c
index 320e80800..9505b3f18 100644
--- a/libX11/src/XlibInt.c
+++ b/libX11/src/XlibInt.c
@@ -2258,6 +2258,128 @@ void _XEatData(
}
#endif /* !USE_XCB */
+/* Cookie jar implementation
+ dpy->cookiejar is a linked list. _XEnq receives the events but leaves
+ them in the normal EQ. _XStoreEvent returns the cookie event (minus
+ data pointer) and adds it to the cookiejar. _XDeq just removes
+ the entry like any other event but resets the data pointer for
+ cookie events (to avoid double-free, the memory is re-used by Xlib).
+
+ _XFetchEventCookie (called from XGetEventData) removes a cookie from the
+ jar. _XFreeEventCookies removes all unclaimed cookies from the jar
+ (called by XNextEvent).
+
+ _XFreeDisplayStructure calls _XFreeEventCookies for each cookie in the
+ normal EQ.
+ */
+
+#include "utlist.h"
+struct stored_event {
+ XGenericEventCookie ev;
+ struct stored_event *prev;
+ struct stored_event *next;
+};
+
+Bool
+_XIsEventCookie(Display *dpy, XEvent *ev)
+{
+ return (ev->xcookie.type == GenericEvent &&
+ dpy->generic_event_vec[ev->xcookie.extension & 0x7F] != NULL);
+}
+
+/**
+ * Free all events in the event list.
+ */
+void
+_XFreeEventCookies(Display *dpy)
+{
+ struct stored_event **head, *e, *tmp;
+
+ if (!dpy->cookiejar)
+ return;
+
+ head = (struct stored_event**)&dpy->cookiejar;
+
+ DL_FOREACH_SAFE(*head, e, tmp) {
+ XFree(e->ev.data);
+ XFree(e);
+ if (dpy->cookiejar == e)
+ dpy->cookiejar = NULL;
+ }
+}
+
+/**
+ * Add an event to the display's event list. This event must be freed on the
+ * next call to XNextEvent().
+ */
+void
+_XStoreEventCookie(Display *dpy, XEvent *event)
+{
+ XGenericEventCookie* cookie = &event->xcookie;
+ struct stored_event **head, *add;
+
+ if (!_XIsEventCookie(dpy, event))
+ return;
+
+ head = (struct stored_event**)(&dpy->cookiejar);
+
+ add = Xmalloc(sizeof(struct stored_event));
+ if (!add) {
+ ESET(ENOMEM);
+ _XIOError(dpy);
+ }
+ add->ev = *cookie;
+ DL_APPEND(*head, add);
+ cookie->data = NULL; /* don't return data yet, must be claimed */
+}
+
+/**
+ * Return the event with the given cookie and remove it from the list.
+ */
+Bool
+_XFetchEventCookie(Display *dpy, XGenericEventCookie* ev)
+{
+ Bool ret = False;
+ struct stored_event **head, *event;
+ head = (struct stored_event**)&dpy->cookiejar;
+
+ if (!_XIsEventCookie(dpy, (XEvent*)ev))
+ return ret;
+
+ DL_FOREACH(*head, event) {
+ if (event->ev.cookie == ev->cookie &&
+ event->ev.extension == ev->extension &&
+ event->ev.evtype == ev->evtype) {
+ *ev = event->ev;
+ DL_DELETE(*head, event);
+ Xfree(event);
+ ret = True;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+Bool
+_XCopyEventCookie(Display *dpy, XGenericEventCookie *in, XGenericEventCookie *out)
+{
+ Bool ret = False;
+ int extension;
+
+ if (!_XIsEventCookie(dpy, (XEvent*)in) || !out)
+ return ret;
+
+ extension = in->extension & 0x7F;
+
+ if (!dpy->generic_event_copy_vec[extension])
+ return ret;
+
+ ret = ((*dpy->generic_event_copy_vec[extension])(dpy, in, out));
+ out->cookie = ret ? ++dpy->next_cookie : 0;
+ return ret;
+}
+
/*
* _XEnq - Place event packets on the display's queue.
@@ -2269,6 +2391,7 @@ void _XEnq(
register xEvent *event)
{
register _XQEvent *qelt;
+ int type, extension;
if ((qelt = dpy->qfree)) {
/* If dpy->qfree is non-NULL do this, else malloc a new one. */
@@ -2281,8 +2404,29 @@ void _XEnq(
_XIOError(dpy);
}
qelt->next = NULL;
- /* go call through display to find proper event reformatter */
- if ((*dpy->event_vec[event->u.u.type & 0177])(dpy, &qelt->event, event)) {
+
+ type = event->u.u.type & 0177;
+ extension = ((xGenericEvent*)event)->extension;
+ /* If an extension has registerd a generic_event_vec handler, then
+ * it can handle event cookies. Otherwise, proceed with the normal
+ * event handlers.
+ *
+ * If the generic_event_vec is called, qelt->event is a event cookie
+ * with the data pointer and the "free" pointer set. Data pointer is
+ * some memory allocated by the extension.
+ */
+ if (type == GenericEvent && dpy->generic_event_vec[extension & 0x7F]) {
+ XGenericEventCookie *cookie = &qelt->event.xcookie;
+ (*dpy->generic_event_vec[extension & 0x7F])(dpy, cookie, event);
+ cookie->cookie = ++dpy->next_cookie;
+
+ qelt->qserial_num = dpy->next_event_serial_num++;
+ if (dpy->tail) dpy->tail->next = qelt;
+ else dpy->head = qelt;
+
+ dpy->tail = qelt;
+ dpy->qlen++;
+ } else if ((*dpy->event_vec[type])(dpy, &qelt->event, event)) {
qelt->qserial_num = dpy->next_event_serial_num++;
if (dpy->tail) dpy->tail->next = qelt;
else dpy->head = qelt;
@@ -2316,6 +2460,13 @@ void _XDeq(
qelt->next = dpy->qfree;
dpy->qfree = qelt;
dpy->qlen--;
+
+ if (_XIsEventCookie(dpy, &qelt->event)) {
+ XGenericEventCookie* cookie = &qelt->event.xcookie;
+ /* dpy->qfree is re-used, reset memory to avoid double free on
+ * _XFreeDisplayStructure */
+ cookie->data = NULL;
+ }
}
/*
@@ -2337,6 +2488,34 @@ _XUnknownWireEvent(
return(False);
}
+Bool
+_XUnknownWireEventCookie(
+ Display *dpy, /* pointer to display structure */
+ XGenericEventCookie *re, /* pointer to where event should be reformatted */
+ xEvent *event) /* wire protocol event */
+{
+#ifdef notdef
+ fprintf(stderr,
+ "Xlib: unhandled wire cookie event! extension number = %d, display = %x\n.",
+ ((xGenericEvent*)event)->extension, dpy);
+#endif
+ return(False);
+}
+
+Bool
+_XUnknownCopyEventCookie(
+ Display *dpy, /* pointer to display structure */
+ XGenericEventCookie *in, /* source */
+ XGenericEventCookie *out) /* destination */
+{
+#ifdef notdef
+ fprintf(stderr,
+ "Xlib: unhandled cookie event copy! extension number = %d, display = %x\n.",
+ in->extension, dpy);
+#endif
+ return(False);
+}
+
/*ARGSUSED*/
Status
_XUnknownNativeEvent(
diff --git a/libX11/src/utlist.h b/libX11/src/utlist.h
new file mode 100644
index 000000000..215c2c62e
--- /dev/null
+++ b/libX11/src/utlist.h
@@ -0,0 +1,116 @@
+/*
+Copyright (c) 2007-2009, Troy D. Hanson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef UTLIST_H
+#define UTLIST_H
+
+#define UTLIST_VERSION 1.7
+
+/* From: http://uthash.sourceforge.net/utlist.html */
+/*
+ * This file contains macros to manipulate singly and doubly-linked lists.
+ *
+ * 1. LL_ macros: singly-linked lists.
+ * 2. DL_ macros: doubly-linked lists.
+ * 3. CDL_ macros: circular doubly-linked lists.
+ *
+ * To use singly-linked lists, your structure must have a "next" pointer.
+ * To use doubly-linked lists, your structure must "prev" and "next" pointers.
+ * Either way, the pointer to the head of the list must be initialized to NULL.
+ *
+ * ----------------.EXAMPLE -------------------------
+ * struct item {
+ * int id;
+ * struct item *prev, *next;
+ * }
+ *
+ * struct item *list = NULL:
+ *
+ * int main() {
+ * struct item *item;
+ * ... allocate and populate item ...
+ * DL_APPEND(list, item);
+ * }
+ * --------------------------------------------------
+ *
+ * For doubly-linked lists, the append and delete macros are O(1)
+ * For singly-linked lists, append and delete are O(n) but prepend is O(1)
+ * The sort macro is O(n log(n)) for all types of single/double/circular lists.
+ */
+
+
+/******************************************************************************
+ * doubly linked list macros (non-circular) *
+ *****************************************************************************/
+#define DL_PREPEND(head,add) \
+do { \
+ (add)->next = head; \
+ if (head) { \
+ (add)->prev = (head)->prev; \
+ (head)->prev = (add); \
+ } else { \
+ (add)->prev = (add); \
+ } \
+ (head) = (add); \
+} while (0)
+
+#define DL_APPEND(head,add) \
+do { \
+ if (head) { \
+ (add)->prev = (head)->prev; \
+ (head)->prev->next = (add); \
+ (head)->prev = (add); \
+ (add)->next = NULL; \
+ } else { \
+ (head)=(add); \
+ (head)->prev = (head); \
+ (head)->next = NULL; \
+ } \
+} while (0);
+
+#define DL_DELETE(head,del) \
+do { \
+ if ((del)->prev == (del)) { \
+ (head)=NULL; \
+ } else if ((del)==(head)) { \
+ (del)->next->prev = (del)->prev; \
+ (head) = (del)->next; \
+ } else { \
+ (del)->prev->next = (del)->next; \
+ if ((del)->next) { \
+ (del)->next->prev = (del)->prev; \
+ } else { \
+ (head)->prev = (del)->prev; \
+ } \
+ } \
+} while (0);
+
+
+#define DL_FOREACH(head,el) \
+ for(el=head;el;el=el->next)
+
+#define DL_FOREACH_SAFE(head,el,tmp) \
+ for(el=head,tmp=el->next;el;el=tmp,tmp=(el) ? (el->next) : NULL)
+
+#endif /* UTLIST_H */
+