From 818811a7ac660e46d0dca1cbf9e53ad0475af330 Mon Sep 17 00:00:00 2001 From: TORRI Vincent Date: Fri, 24 Nov 2006 12:33:15 +0100 Subject: [PATCH 01/33] replace all the _new functions with xcb_generate_id. repalce X11/XCB with xcb. Fix a description of the default background of a window --- doc/tutorial/index.html | 70 ++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html index ea53305..e39ee2e 100644 --- a/doc/tutorial/index.html +++ b/doc/tutorial/index.html @@ -386,7 +386,7 @@ #include <string.h> #include <sys/time.h> -#include <X11/XCB/xcb.h> +#include <xcb/xcb.h> #include <X11/Xlib.h> @@ -596,7 +596,7 @@ gcc -Wall prog.c -o prog `pkg-config --cflags --libs xcb` and is opaque. Here is how the connection can be opened:

-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -684,7 +684,7 @@ xcb_screen_iterator_t xcb_setup_roots_iterator (xcb_setup_t *R);
       
 #include <stdio.h>
 
-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -731,7 +731,7 @@ typedef struct {
       We first ask for a new Id for our window, with this function:
       

-xcb_window_t xcb_window_new(xcb_connection_t *c);
+xcb_window_t xcb_generate_id(xcb_connection_t *c);
 

Then, XCB supplies the following function to create new windows: @@ -769,7 +769,7 @@ xcb_void_cookie_t xcb_map_window (xcb_connection_t *c,

 #include <unistd.h>      /* pause() */
 
-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -785,7 +785,7 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Ask for our window's Id */
-  win.window = xcb_window_new(c);
+  win.window = xcb_generate_id(c);
 
   /* Create the window */
   xcb_create_window (c,                             /* Connection          */
@@ -836,8 +836,8 @@ int xcb_aux_sync (xcb_connection_t *c);
       now, we put it there.
       

- The window that is created by the above code has a default - background (gray). This one can be set to a specific color, + The window that is created by the above code has a non defined + background. This one can be set to a specific color, thanks to the two last parameters of xcb_create_window(), which are not described yet. See the subsections @@ -862,7 +862,7 @@ int xcb_aux_sync (xcb_connection_t *c);

    -
  • xcb_window_new () +
  • xcb_generate_id ()
  • xcb_create_window ()
@@ -896,7 +896,7 @@ typedef struct { context with this function:

-xcb_gcontext_t xcb_gcontext_new (xcb_connection_t *c);
+xcb_gcontext_t xcb_generate_id (xcb_connection_t *c);
 

Then, we set the attributes of the graphic context with this function: @@ -914,7 +914,7 @@ xcb_void_cookie_t xcb_create_gc (xcb_connection_t *c, draw in foreground with a black color.

-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -932,7 +932,7 @@ main ()
 
   /* Create a black graphic context for drawing in the foreground */
   win.window = screen->root;
-  black = xcb_gcontext_new (c);
+  black = xcb_generate_id (c);
   mask = XCB_GC_FOREGROUND;
   value[0] = screen->black_pixel;
   xcb_create_gc (c, black, win, mask, value);
@@ -970,7 +970,7 @@ main ()
           
           
    -
  • xcb_gcontext_new () +
  • xcb_generate_id ()
  • xcb_create_gc ()
@@ -1246,7 +1246,7 @@ xcb_void_cookie_t xcb_poly_fill_arc (xcb_connection_t *c, #include <stdlib.h> #include <stdio.h> -#include <X11/XCB/xcb.h> +#include <xcb/xcb.h> int main () @@ -1293,14 +1293,14 @@ main () /* Create black (foreground) graphic context */ win.window = screen->root; - foreground = xcb_gcontext_new (c); + foreground = xcb_generate_id (c); mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; values[0] = screen->black_pixel; values[1] = 0; xcb_create_gc (c, foreground, win, mask, values); /* Ask for our window's Id */ - win.window = xcb_window_new(c); + win.window = xcb_generate_id(c); /* Create the window */ mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; @@ -1391,7 +1391,7 @@ main ()
   mask = XCB_CW_EVENT_MASK;
   valwin[0] = XCB_EVENT_MASK_EXPOSURE;
-  win.window = xcb_window_new (c);
+  win.window = xcb_generate_id (c);
   xcb_create_window (c, depth, win.window, root->root,
                      0, 0, 150, 150, 10,
                      XCB_WINDOW_CLASS_INPUT_OUTPUT, root->root_visual,
@@ -1405,7 +1405,7 @@ main ()
         
   mask = XCB_CW_EVENT_MASK;
   valwin[0] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS;
-  win.window = xcb_window_new (c);
+  win.window = xcb_generate_id (c);
   xcb_create_window (c, depth, win.window, root->root,
                      0, 0, 150, 150, 10,
                      XCB_WINDOW_CLASS_INPUT_OUTPUT, root->root_visual,
@@ -1894,7 +1894,7 @@ typedef xcb_key_press_event_t xcb_key_release_event_t;
 #include <stdlib.h>
 #include <stdio.h>
 
-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 void
 print_modifiers (uint32_t mask)
@@ -1928,7 +1928,7 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Ask for our window's Id */
-  win.window = xcb_window_new (c);
+  win.window = xcb_generate_id (c);
 
   /* Create the window */
   mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
@@ -2142,8 +2142,8 @@ xcb_void_cookie_t xcb_change_property (xcb_connection_t *c,       /* Connection
         
 #include <string.h>
 
-#include <X11/XCB/xcb.h>
-#include <X11/XCB/xcb_atom.h>
+#include <xcb/xcb.h>
+#include <xcb/xcb_atom.h>
 
 int
 main ()
@@ -2163,7 +2163,7 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Ask for our window's Id */
-  win = xcb_window_new (c);
+  win = xcb_generate_id (c);
 
   /* Create the window */
   xcb_create_window (c,                             /* Connection          */
@@ -2673,7 +2673,7 @@ typedef struct {
         
 #include <stdio.h>
 
-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -2702,7 +2702,7 @@ main ()
         map, with this function:
         

-xcb_colormap_t xcb_colormap_new (xcb_connection_t *c);
+xcb_colormap_t xcb_generate_id (xcb_connection_t *c);
 

Then, we create the color map with @@ -2718,7 +2718,7 @@ xcb_void_cookie_t xcb_create_colormap (xcb_connection_t *c, /* Pointer to Here is an example of creation of a new color map:

-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -2734,7 +2734,7 @@ main ()
 
   /* We create the window win here*/
 
-  cmap = xcb_colormap_new (c);
+  cmap = xcb_generate_id (c);
   xcb_create_colormap (c, XCB_COLORMAP_ALLOC_NONE, cmap, win, screen->root_visual);
 
   return 0;
@@ -2763,7 +2763,7 @@ xcb_void_cookie_t xcb_free_colormap (xcb_connection_t *c,   /* The connection */
           
           
    -
  • xcb_colormap_new () +
  • xcb_generate_id ()
  • xcb_create_colormap ()
@@ -2819,7 +2819,7 @@ xcb_alloc_color_reply_t *xcb_alloc_color_reply (xcb_connection_t *c,
 #include <malloc.h>
 
-#include <X11/XCB/xcb.h>
+#include <xcb/xcb.h>
 
 int
 main ()
@@ -2836,7 +2836,7 @@ main ()
 
   /* We create the window win here*/
 
-  cmap = xcb_colormap_new (c);
+  cmap = xcb_generate_id (c);
   xcb_create_colormap (c, XCB_COLORMAP_ALLOC_NONE, cmap, win, screen->root_visual);
 
   rep = xcb_alloc_color_reply (c, xcb_alloc_color (c, cmap, 65535, 0, 0), NULL);
@@ -2946,7 +2946,7 @@ typedef union {
         Id to our pixmap, with this function:
         

-xcb_pixmap_t xcb_pixmap_new (xcb_connection_t *c);
+xcb_pixmap_t xcb_generate_id (xcb_connection_t *c);
 

Then, XCB supplies the following function to create new pixmaps: @@ -3061,7 +3061,7 @@ xcb_void_cookie_t xcb_create_glyph_cursor_checked (xcb_connection_t *c,

So we first open that font (see Loading a Font) and create the new cursor. As for every X ressource, we have to - ask for an X id with xcb_cursor_new + ask for an X id with xcb_generate_id first:

@@ -3070,10 +3070,10 @@ xcb_cursor_t         cursor;
 
 /* The connection is set */
 
-font = xcb_font_new (conn);
+font = xcb_generate_id (conn);
 xcb_open_font (conn, font, strlen ("cursor"), "cursor");
 
-cursor = xcb_cursor_new (conn);
+cursor = xcb_generate_id (conn);
 xcb_create_glyph_cursor (conn, cursor, font, font,
                          58, 58 + 1,
                          0, 0, 0,
@@ -3560,7 +3560,7 @@ if (screen) {
   uint32_t       mask;
   uint32_t       values[2];
 
-  gc = xcb_gcontext_new (c);
+  gc = xcb_generate_id (c);
   draw.window = screen->root;
   mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
   values[0] = screen->black_pixel;

From 3360d0c79e98cf6b7f30b2d84f117aea0a28595d Mon Sep 17 00:00:00 2001
From: Jamey Sharp 
Date: Fri, 24 Nov 2006 13:24:05 -0800
Subject: [PATCH 02/33] NetBSD doesn't have AI_ADDRCONFIG: use it only if it's
 available.

---
 src/xcb_util.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/xcb_util.c b/src/xcb_util.c
index bd9f2b5..eeee1dd 100644
--- a/src/xcb_util.c
+++ b/src/xcb_util.c
@@ -176,7 +176,10 @@ static int _xcb_open_decnet(const char *host, const unsigned short port)
 static int _xcb_open_tcp(char *host, const unsigned short port)
 {
     int fd = -1;
-    struct addrinfo hints = { AI_ADDRCONFIG
+    struct addrinfo hints = { 0
+#ifdef AI_ADDRCONFIG
+                              | AI_ADDRCONFIG
+#endif
 #ifdef AI_NUMERICSERV
                               | AI_NUMERICSERV
 #endif

From 05d23a724d4dde42b11d6e9dec9ccaf5a516e287 Mon Sep 17 00:00:00 2001
From: Jamey Sharp 
Date: Fri, 24 Nov 2006 16:22:13 -0800
Subject: [PATCH 03/33] libXau didn't have a correct pkg-config file until
 0.99.2: fail if an older version is found.

---
 configure.ac | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index b400f03..cd682ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -31,7 +31,7 @@ AC_SUBST(HTML_CHECK_RESULT)
 
 # Checks for pkg-config packages
 PKG_CHECK_MODULES(XCBPROTO, xcb-proto >= 1.0)
-NEEDED="xau pthread-stubs"
+NEEDED="pthread-stubs xau >= 0.99.2"
 PKG_CHECK_MODULES(NEEDED, $NEEDED)
 
 PKG_CHECK_MODULES(XDMCP, xdmcp,

From e74cdcd02e6814222a76c0a237efca16c423bb26 Mon Sep 17 00:00:00 2001
From: Ian Osgood 
Date: Sat, 25 Nov 2006 11:00:14 -0800
Subject: [PATCH 04/33] Bug #9119: test xcb_popcount

---
 tests/check_public.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/tests/check_public.c b/tests/check_public.c
index a28fb49..e222221 100644
--- a/tests/check_public.c
+++ b/tests/check_public.c
@@ -3,6 +3,7 @@
 #include 
 #include "check_suites.h"
 #include "xcb.h"
+#include "xcbext.h"
 
 /* xcb_parse_display tests {{{ */
 
@@ -179,6 +180,28 @@ END_TEST
 
 /* }}} */
 
+static void popcount_eq(uint32_t bits, int count)
+{
+	fail_unless(xcb_popcount(bits) == count, "unexpected popcount(%08x) != %d", bits, count);
+}
+
+START_TEST(popcount)
+{
+	uint32_t mask;
+	int count;
+
+	for (mask = 0xffffffff, count = 32; count >= 0; mask >>= 1, --count) {
+		popcount_eq(mask, count);
+	}
+	for (mask = 0x80000000; mask; mask >>= 1) {
+		popcount_eq(mask, 1);
+	}
+	for (mask = 0x80000000; mask > 1; mask >>= 1) {
+		popcount_eq(mask | 1, 2);
+	}
+}
+END_TEST
+
 Suite *public_suite(void)
 {
 	Suite *s = suite_create("Public API");
@@ -189,5 +212,6 @@ Suite *public_suite(void)
 	suite_add_test(s, parse_display_ipv6, "xcb_parse_display ipv6");
 	suite_add_test(s, parse_display_decnet, "xcb_parse_display decnet");
 	suite_add_test(s, parse_display_negative, "xcb_parse_display negative");
+	suite_add_test(s, popcount, "xcb_popcount");
 	return s;
 }

From 98e2a5617ef1c9955b3b5553224c34f55c7c5d29 Mon Sep 17 00:00:00 2001
From: Josh Triplett 
Date: Sat, 25 Nov 2006 22:27:33 -0800
Subject: [PATCH 05/33] Use substitition variables in xcb-xinerama.pc.in, not
 instances of their values

xcb-xinerama.pc.in looked more like a generated .pc file; replace specific
instances of values provided by an invocation of configure with the general
substitution variables configure replaces.
---
 xcb-xinerama.pc.in | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/xcb-xinerama.pc.in b/xcb-xinerama.pc.in
index 93c35a3..c4775f9 100644
--- a/xcb-xinerama.pc.in
+++ b/xcb-xinerama.pc.in
@@ -1,11 +1,11 @@
-prefix=/opt/fdo/
-exec_prefix=${prefix}
-libdir=${exec_prefix}/lib
-includedir=${prefix}/include
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
 
 Name: XCB Xinerama
 Description: XCB Xinerama Extension
-Version: 0.9.92
+Version: @PACKAGE_VERSION@
 Requires: xcb
 Libs: -L${libdir} -lxcb-xinerama
 Cflags: -I${includedir}

From 19dfaf93ac1b5e9d3ce09b1f8e2338e53a5d7324 Mon Sep 17 00:00:00 2001
From: Ian Osgood 
Date: Sun, 26 Nov 2006 09:26:32 -0800
Subject: [PATCH 06/33] Fix unit tests for FreeBSD

putenv() string must contain '='
environment failure test is invalid if argument is NULL
---
 tests/check_public.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/tests/check_public.c b/tests/check_public.c
index e222221..2094bfe 100644
--- a/tests/check_public.c
+++ b/tests/check_public.c
@@ -25,7 +25,7 @@ static void parse_display_pass(const char *name, const char *host, const int dis
 		if(test_type == TEST_ARGUMENT)
 		{
 			argument = name;
-			putenv("DISPLAY");
+			putenv("DISPLAY=");
 		}
 		else if(test_type == TEST_ENVIRONMENT)
 		{
@@ -50,7 +50,7 @@ static void parse_display_pass(const char *name, const char *host, const int dis
 		fail_unless(strcmp(host, got_host) == 0, "screenless parse %sproduced unexpected hostname '%s' for '%s': expected '%s'", test_string[test_type], got_host, name, host);
 		fail_unless(display == got_display, "screenless parse %sproduced unexpected display '%d' for '%s': expected '%d'", test_string[test_type], got_display, name, display);
 	}
-	putenv("DISPLAY");
+	putenv("DISPLAY=");
 }
 
 static void parse_display_fail(const char *name)
@@ -66,10 +66,11 @@ static void parse_display_fail(const char *name)
 		if(test_type == TEST_ARGUMENT)
 		{
 			argument = name;
-			putenv("DISPLAY");
+			putenv("DISPLAY=");
 		}
 		else if(test_type == TEST_ENVIRONMENT)
 		{
+			if (!name) break;
 			argument = 0;
 			setenv("DISPLAY", name, 1);
 		}
@@ -91,7 +92,7 @@ static void parse_display_fail(const char *name)
 		fail_unless(got_host == (char *) -1, "host changed on parse failure %sfor '%s': got %p", test_string[test_type], name, got_host);
 		fail_unless(got_display == -42, "display changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_display);
 	}
-	putenv("DISPLAY");
+	putenv("DISPLAY=");
 }
 
 START_TEST(parse_display_unix)
@@ -205,7 +206,7 @@ END_TEST
 Suite *public_suite(void)
 {
 	Suite *s = suite_create("Public API");
-	putenv("DISPLAY");
+	putenv("DISPLAY=");
 	suite_add_test(s, parse_display_unix, "xcb_parse_display unix");
 	suite_add_test(s, parse_display_ip, "xcb_parse_display ip");
 	suite_add_test(s, parse_display_ipv4, "xcb_parse_display ipv4");

From 2e8e6debac39864450c0a69633086ad92459c25e Mon Sep 17 00:00:00 2001
From: Tilman Sauerbeck 
Date: Fri, 24 Nov 2006 15:43:39 +0100
Subject: [PATCH 07/33] Fixed evaluation of the disable-build-docs argument.

Now at least enable_build_docs is set correctly.
---
 acinclude.m4 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/acinclude.m4 b/acinclude.m4
index 186873c..e85ea5a 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -44,7 +44,7 @@ AC_DEFUN([AM_CHECK_DOXYGEN],
        AC_HELP_STRING(
           [--disable-build-docs],
           [Disable the build of the documentation]),
-       [if test "${disable_build_docs}" = "yes" ; then
+       [if test x"$enableval" != x"yes" ; then
            enable_build_docs="no"
         else
            enable_build_docs="yes"

From f486075fa093846c3f32b3e4b9624c039ea26ba4 Mon Sep 17 00:00:00 2001
From: Tilman Sauerbeck 
Date: Fri, 24 Nov 2006 15:48:08 +0100
Subject: [PATCH 08/33] If enable_build_docs is "no", we don't even try to look
 for doxygen.

Also set BUILD_DOCS in that branch. Now the disable-build-docs works
as expected.
---
 acinclude.m4 | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/acinclude.m4 b/acinclude.m4
index e85ea5a..8b240ad 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -50,6 +50,10 @@ AC_DEFUN([AM_CHECK_DOXYGEN],
            enable_build_docs="yes"
         fi],
        [enable_build_docs="yes"])
+
+    if test "$enable_build_docs" = "no" ; then
+        BUILD_DOCS=no
+    else
     dnl
     dnl Get the prefix where doxygen is installed.
     dnl
@@ -93,6 +97,7 @@ AC_DEFUN([AM_CHECK_DOXYGEN],
            AC_MSG_WARN(
               [Warning: no doxygen detected. Documentation will not be built])
         fi])
+    fi
     AC_MSG_CHECKING([whether documentation is built])
     AC_MSG_RESULT([${BUILD_DOCS}])
     dnl

From e624cca7df4c2c5bc5e44af1e851e5a0d17c88bd Mon Sep 17 00:00:00 2001
From: TORRI Vincent 
Date: Tue, 28 Nov 2006 20:14:16 +0100
Subject: [PATCH 09/33] add some output informations to configure script

---
 configure.ac | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index b400f03..eef3fa0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8,8 +8,8 @@ AC_INIT([libxcb],
 AC_CONFIG_SRCDIR([xcb.pc.in])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 
-PKG_CHECK_MODULES(CHECK, [check >= 0.9.4], [HAVE_CHECK=true], [HAVE_CHECK=false])
-AM_CONDITIONAL(HAVE_CHECK, test x$HAVE_CHECK = xtrue)
+PKG_CHECK_MODULES(CHECK, [check >= 0.9.4], [HAVE_CHECK=yes], [HAVE_CHECK=no])
+AM_CONDITIONAL(HAVE_CHECK, test x$HAVE_CHECK = xyes)
 
 AC_CONFIG_HEADERS([src/config.h])
 
@@ -22,7 +22,7 @@ if test "$XSLTPROC" = "no"; then
 fi
 
 HTML_CHECK_RESULT=false
-if test x"$HAVE_CHECK" = xtrue; then
+if test x"$HAVE_CHECK" = xyes; then
 	if test x"$XSLTPROC" != xno; then
 		HTML_CHECK_RESULT=true
 	fi
@@ -34,11 +34,13 @@ PKG_CHECK_MODULES(XCBPROTO, xcb-proto >= 1.0)
 NEEDED="xau pthread-stubs"
 PKG_CHECK_MODULES(NEEDED, $NEEDED)
 
+have_xdmcp="no"
 PKG_CHECK_MODULES(XDMCP, xdmcp,
 	AC_CHECK_LIB(Xdmcp, XdmcpWrap,
 		[
 		AC_DEFINE(HASXDMAUTH,1,[Has Wraphelp.c needed for XDM AUTH protocols])
 		NEEDED="$NEEDED xdmcp"
+		have_xdmcp="yes"
 		],
 		[
 		XDMCP_CFLAGS=
@@ -87,3 +89,21 @@ AC_CONFIG_FILES([xcb.pc xcb-xlib.pc xcb-composite.pc xcb-damage.pc xcb-dpms.pc x
 AC_CONFIG_FILES([doc/xcb.doxygen])
 
 AC_OUTPUT
+
+dnl Configuration output
+
+echo ""
+echo "  Package: ${PACKAGE_NAME} ${PACKAGE_VERSION}"
+echo ""
+echo "  Configuration"
+echo "    XDM support.........: ${have_xdmcp}"
+echo "    Build unit tests....: ${HAVE_CHECK}"
+echo ""
+echo "  Used CFLAGS:"
+echo "    CPPFLAGS............: ${CPPFLAGS}"
+echo "    CFLAGS..............: ${CFLAGS}"
+echo "    Warning CFLAGS......: ${CWARNFLAGS}"
+echo ""
+echo "  Installation:"
+echo "    Prefix..............: ${prefix}"
+echo ""

From 67af2d24e4c46580479570cf09586a54b84b1b63 Mon Sep 17 00:00:00 2001
From: TORRI Vincent 
Date: Tue, 28 Nov 2006 20:26:54 +0100
Subject: [PATCH 10/33] add doc tag for the _next functions. It creates doxygen
 doc in the header files for these functions

---
 src/c-client.xsl | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/c-client.xsl b/src/c-client.xsl
index 5df5762..d70b8b6 100644
--- a/src/c-client.xsl
+++ b/src/c-client.xsl
@@ -924,6 +924,14 @@ authorization from the authors.
     
     
       
+        /**
+         * Get the next element of the iterator
+         * @param i Pointer to a _iterator_t
+         *
+         * Get the next element in the iterator. The member rem is
+         * decreased by one. The member data points to the next
+         * element. The member index is increased by sizeof(_t)
+         */
         
         
           
@@ -1178,6 +1186,10 @@ authorization from the authors.
       
   
   
+    
+      
+      
+    
 /*****************************************************************************
  **
  ** 
@@ -1242,6 +1254,11 @@ authorization from the authors.
     
   
 
+  
+    
+
+  
+
   
     
     

From 867ae5eb5c19091365daad621b923f56ff699415 Mon Sep 17 00:00:00 2001
From: Josh Triplett 
Date: Sun, 10 Dec 2006 21:09:30 -0800
Subject: [PATCH 11/33] Add tools/* to EXTRA_DIST.

---
 Makefile.am | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Makefile.am b/Makefile.am
index e399ae0..5b26d4c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -48,4 +48,7 @@ xcb-xfixes.pc.in \
 xcb-xprint.pc.in \
 xcb-xtest.pc.in \
 xcb-xv.pc.in \
-xcb-xvmc.pc.in
+xcb-xvmc.pc.in \
+tools/README \
+tools/api_conv.pl \
+tools/constants

From 70a72f65e438888a5530e9911c36aad68833790f Mon Sep 17 00:00:00 2001
From: Josh Triplett 
Date: Sun, 10 Dec 2006 21:10:06 -0800
Subject: [PATCH 12/33] Add autogen.sh to EXTRA_DIST.

---
 Makefile.am | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Makefile.am b/Makefile.am
index 5b26d4c..2dce719 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -51,4 +51,5 @@ xcb-xv.pc.in \
 xcb-xvmc.pc.in \
 tools/README \
 tools/api_conv.pl \
-tools/constants
+tools/constants \
+autogen.sh

From 342e9cefcc7d942714488f6b424fee7a5bdc741f Mon Sep 17 00:00:00 2001
From: TORRI Vincent 
Date: Sat, 13 Jan 2007 11:20:55 +0100
Subject: [PATCH 13/33] fix all the occurence where a drawable where considered
 as a union

---
 doc/tutorial/index.html | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html
index e39ee2e..2e62c7d 100644
--- a/doc/tutorial/index.html
+++ b/doc/tutorial/index.html
@@ -776,7 +776,7 @@ main ()
 {
   xcb_connection_t *c;
   xcb_screen_t     *screen;
-  xcb_drawable_t    win;
+  xcb_window_t      win;
 
   /* Open the connection to the X server */
   c = xcb_connect (NULL, NULL);
@@ -785,12 +785,12 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Ask for our window's Id */
-  win.window = xcb_generate_id(c);
+  win = xcb_generate_id(c);
 
   /* Create the window */
   xcb_create_window (c,                             /* Connection          */
                      XCB_COPY_FROM_PARENT,          /* depth (same as root)*/
-                     win.window,                    /* window Id           */
+                     win,                           /* window Id           */
                      screen->root,                  /* parent window       */
                      0, 0,                          /* x, y                */
                      150, 150,                      /* width, height       */
@@ -800,7 +800,7 @@ main ()
                      0, NULL);                      /* masks, not used yet */
 
   /* Map the window on the screen */
-  xcb_map_window (c, win.window);
+  xcb_map_window (c, win);
 
   /* Make sure commands are sent before we pause, so window is shown */
   xcb_flush (c);
@@ -931,7 +931,7 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Create a black graphic context for drawing in the foreground */
-  win.window = screen->root;
+  win = screen->root;
   black = xcb_generate_id (c);
   mask = XCB_GC_FOREGROUND;
   value[0] = screen->black_pixel;
@@ -1291,7 +1291,7 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Create black (foreground) graphic context */
-  win.window = screen->root;
+  win = screen->root;
 
   foreground = xcb_generate_id (c);
   mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
@@ -1300,7 +1300,7 @@ main ()
   xcb_create_gc (c, foreground, win, mask, values);
 
   /* Ask for our window's Id */
-  win.window = xcb_generate_id(c);
+  win = xcb_generate_id(c);
 
   /* Create the window */
   mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
@@ -1308,7 +1308,7 @@ main ()
   values[1] = XCB_EVENT_MASK_EXPOSURE;
   xcb_create_window (c,                             /* Connection          */
                      XCB_COPY_FROM_PARENT,          /* depth               */
-                     win.window,                    /* window Id           */
+                     win,                           /* window Id           */
                      screen->root,                  /* parent window       */
                      0, 0,                          /* x, y                */
                      150, 150,                      /* width, height       */
@@ -1318,7 +1318,7 @@ main ()
                      mask, values);                 /* masks */
 
   /* Map the window on the screen */
-  xcb_map_window (c, win.window);
+  xcb_map_window (c, win);
 
 
   /* We flush the request */
@@ -1391,8 +1391,8 @@ main ()
         
   mask = XCB_CW_EVENT_MASK;
   valwin[0] = XCB_EVENT_MASK_EXPOSURE;
-  win.window = xcb_generate_id (c);
-  xcb_create_window (c, depth, win.window, root->root,
+  win = xcb_generate_id (c);
+  xcb_create_window (c, depth, win, root->root,
                      0, 0, 150, 150, 10,
                      XCB_WINDOW_CLASS_INPUT_OUTPUT, root->root_visual,
                      mask, valwin);
@@ -1405,8 +1405,8 @@ main ()
         
   mask = XCB_CW_EVENT_MASK;
   valwin[0] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS;
-  win.window = xcb_generate_id (c);
-  xcb_create_window (c, depth, win.window, root->root,
+  win = xcb_generate_id (c);
+  xcb_create_window (c, depth, win, root->root,
                      0, 0, 150, 150, 10,
                      XCB_WINDOW_CLASS_INPUT_OUTPUT, root->root_visual,
                      mask, valwin);
@@ -1916,7 +1916,7 @@ main ()
 {
   xcb_connection_t    *c;
   xcb_screen_t        *screen;
-  xcb_drawable_t       win;
+  xcb_window_t         win;
   xcb_generic_event_t *e;
   uint32_t             mask = 0;
   uint32_t             values[2];
@@ -1928,7 +1928,7 @@ main ()
   screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
 
   /* Ask for our window's Id */
-  win.window = xcb_generate_id (c);
+  win = xcb_generate_id (c);
 
   /* Create the window */
   mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
@@ -1939,7 +1939,7 @@ main ()
               XCB_EVENT_MASK_KEY_PRESS      | XCB_EVENT_MASK_KEY_RELEASE;
   xcb_create_window (c,                             /* Connection          */
                      0,                             /* depth               */
-                     win.window,                    /* window Id           */
+                     win,                           /* window Id           */
                      screen->root,                  /* parent window       */
                      0, 0,                          /* x, y                */
                      150, 150,                      /* width, height       */
@@ -1949,7 +1949,7 @@ main ()
                      mask, values);                 /* masks */
 
   /* Map the window on the screen */
-  xcb_map_window (c, win.window);
+  xcb_map_window (c, win);
 
   xcb_flush (c);
 
@@ -3561,7 +3561,7 @@ if (screen) {
   uint32_t       values[2];
 
   gc = xcb_generate_id (c);
-  draw.window = screen->root;
+  draw = screen->root;
   mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
   values[0] = screen->black_pixel;
   values[1] = screen->white_pixel;

From ab22a4d61665bbe637b8c1f349fcfaf04e386e88 Mon Sep 17 00:00:00 2001
From: TORRI Vincent 
Date: Mon, 22 Jan 2007 11:40:15 +0100
Subject: [PATCH 14/33] add doxygen doc for the *_end functions

---
 src/c-client.xsl | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/c-client.xsl b/src/c-client.xsl
index d70b8b6..3e2e849 100644
--- a/src/c-client.xsl
+++ b/src/c-client.xsl
@@ -950,6 +950,15 @@ authorization from the authors.
         
       
       
+        /**
+         * Return the iterator pointing to the last element
+         * @param i An _iterator_t
+         * @return  The iterator pointing to the last element
+         *
+         * Set the current element in the iterator to the last element.
+         * The member rem is set to 0. The member data points to the
+         * last element.
+         */
         
         xcb_generic_iterator_t ret;
         

From 6cedaece0e294d39fe090b87e2f60569b40a4554 Mon Sep 17 00:00:00 2001
From: TORRI Vincent 
Date: Tue, 6 Feb 2007 09:31:54 +0100
Subject: [PATCH 15/33] add the complete cursor example. Make the html code
 valid

---
 doc/tutorial/index.html | 431 +++++++++++++++++++++++++++++++++++++---
 doc/tutorial/xcb.css    |  10 +-
 2 files changed, 411 insertions(+), 30 deletions(-)

diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html
index 2e62c7d..1ba0775 100644
--- a/doc/tutorial/index.html
+++ b/doc/tutorial/index.html
@@ -587,8 +587,8 @@ gcc -Wall prog.c -o prog `pkg-config --cflags --libs xcb`
       will be the one in the environment variable DISPLAY.
       

-xcb_connection_t *xcb_connect (const char *displayname,
-                               int        *screenp);
+xcb_connection_t *xcb_connect (const char *displayname,
+                               int        *screenp);
 

The second parameter returns the screen number used for the @@ -596,24 +596,24 @@ gcc -Wall prog.c -o prog `pkg-config --cflags --libs xcb` and is opaque. Here is how the connection can be opened:

-#include <xcb/xcb.h>
+#include <xcb/xcb.h>
 
-int
-main ()
+int
+main ()
 {
-  xcb_connection_t *c;
+  xcb_connection_t *c;
 
   /* Open the connection to the X server. Use the DISPLAY environment variable as the default display name */
   c = xcb_connect (NULL, NULL);
 
-  return 0;
+  return 0;
 }
 

To close a connection, it suffices to use:

-void xcb_disconnect (xcb_connection_t *c);
+void xcb_disconnect (xcb_connection_t *c);
 
@@ -640,8 +640,7 @@ gcc -Wall prog.c -o prog `pkg-config --cflags --libs xcb`
-

-

+
  • Checking basic information about a connection

    Once we have opened a connection to an X server, we should check some @@ -3039,18 +3038,18 @@ xcb_void_cookie_t xcb_free_pixmap (xcb_connection_t *c, /* Pointer to the the function xcb_create_glyph_cursor:

    -xcb_void_cookie_t xcb_create_glyph_cursor_checked (xcb_connection_t *c,
    -                                                   xcb_cursor_t      cid,
    -                                                   xcb_font_t        source_font, /* font for the source glyph */
    -                                                   xcb_font_t        mask_font,   /* font for the mask glyph or XCB_NONE */
    -                                                   uint16_t          source_char, /* character glyph for the source */
    -                                                   uint16_t          mask_char,   /* character glyph for the mask */
    -                                                   uint16_t          fore_red,    /* red value for the foreground of the source */
    -                                                   uint16_t          fore_green,  /* green value for the foreground of the source */
    -                                                   uint16_t          fore_blue,   /* blue value for the foreground of the source */
    -                                                   uint16_t          back_red,    /* red value for the background of the source */
    -                                                   uint16_t          back_green,  /* green value for the background of the source */
    -                                                   uint16_t          back_blue)   /* blue value for the background of the source */
    +xcb_void_cookie_t xcb_create_glyph_cursor (xcb_connection_t *c,
    +                                           xcb_cursor_t      cid,
    +                                           xcb_font_t        source_font, /* font for the source glyph */
    +                                           xcb_font_t        mask_font,   /* font for the mask glyph or XCB_NONE */
    +                                           uint16_t          source_char, /* character glyph for the source */
    +                                           uint16_t          mask_char,   /* character glyph for the mask */
    +                                           uint16_t          fore_red,    /* red value for the foreground of the source */
    +                                           uint16_t          fore_green,  /* green value for the foreground of the source */
    +                                           uint16_t          fore_blue,   /* blue value for the foreground of the source */
    +                                           uint16_t          back_red,    /* red value for the background of the source */
    +                                           uint16_t          back_green,  /* green value for the background of the source */
    +                                           uint16_t          back_blue)   /* blue value for the background of the source */
     

    TODO: Describe source_char @@ -3124,8 +3123,391 @@ xcb_change_window_attributes (conn, window, mask, &value_list);

  • Complete example

    - TODO: to do... + The following example displays a window with a + button. When entering the window, the window cursor is changed + to an arrow. When clicking once on the button, the cursor is + changed to a hand. When clicking again on the button, the + cursor window gets back to the arrow. The Esc key exits the + application.

    +
    +#include <stdlib.h>
    +#include <stdio.h>
    +#include <string.h>
    +
    +#include <xcb/xcb.h>
    +
    +#define WIDTH 300
    +#define HEIGHT 150
    +
    +
    +
    +static xcb_gc_t gc_font_get (xcb_connection_t *c,
    +                             xcb_screen_t     *screen,
    +                             xcb_window_t      window,
    +                             const char       *font_name);
    +
    +static void button_draw (xcb_connection_t *c,
    +                         xcb_screen_t     *screen,
    +                         xcb_window_t      window,
    +                         int16_t           x1,
    +                         int16_t           y1,
    +                         const char       *label);
    +
    +static void text_draw (xcb_connection_t *c,
    +                       xcb_screen_t     *screen,
    +                       xcb_window_t      window,
    +                       int16_t           x1,
    +                       int16_t           y1,
    +                       const char       *label);
    +
    +static void cursor_set (xcb_connection_t *c,
    +                        xcb_screen_t     *screen,
    +                        xcb_window_t      window,
    +                        int               cursor_id);
    +
    +
    +static void
    +button_draw (xcb_connection_t *c,
    +             xcb_screen_t     *screen,
    +             xcb_window_t      window,
    +             int16_t           x1,
    +             int16_t           y1,
    +             const char       *label)
    +{
    +  xcb_point_t          points[5];
    +  xcb_void_cookie_t    cookie_gc;
    +  xcb_void_cookie_t    cookie_line;
    +  xcb_void_cookie_t    cookie_text;
    +  xcb_generic_error_t *error;
    +  xcb_gcontext_t       gc;
    +  int16_t              width;
    +  int16_t              height;
    +  uint8_t              length;
    +  int16_t              inset;
    +
    +  length = strlen (label);
    +  inset = 2;
    +
    +  gc = gc_font_get(c, screen, window, "7x13");
    +
    +  width = 7 * length + 2 * (inset + 1);
    +  height = 13 + 2 * (inset + 1);
    +  points[0].x = x1;
    +  points[0].y = y1;
    +  points[1].x = x1 + width;
    +  points[1].y = y1;
    +  points[2].x = x1 + width;
    +  points[2].y = y1 - height;
    +  points[3].x = x1;
    +  points[3].y = y1 - height;
    +  points[4].x = x1;
    +  points[4].y = y1;
    +  cookie_line = xcb_poly_line_checked (c, XCB_COORD_MODE_ORIGIN,
    +                                       window, gc, 5, points);
    +
    +  error = xcb_request_check (c, cookie_line);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't draw lines : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  cookie_text = xcb_image_text_8_checked (c, length, window, gc,
    +                                          x1 + inset + 1,
    +                                          y1 - inset - 1, label);
    +  error = xcb_request_check (c, cookie_text);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't paste text : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  cookie_gc = xcb_free_gc (c, gc);
    +  error = xcb_request_check (c, cookie_gc);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't free gc : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +}
    +
    +static void
    +text_draw (xcb_connection_t *c,
    +           xcb_screen_t     *screen,
    +           xcb_window_t      window,
    +           int16_t           x1,
    +           int16_t           y1,
    +           const char       *label)
    +{
    +  xcb_void_cookie_t    cookie_gc;
    +  xcb_void_cookie_t    cookie_text;
    +  xcb_generic_error_t *error;
    +  xcb_gcontext_t       gc;
    +  uint8_t              length;
    +
    +  length = strlen (label);
    +
    +  gc = gc_font_get(c, screen, window, "7x13");
    +
    +  cookie_text = xcb_image_text_8_checked (c, length, window, gc,
    +                                          x1,
    +                                          y1, label);
    +  error = xcb_request_check (c, cookie_text);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't paste text : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  cookie_gc = xcb_free_gc (c, gc);
    +  error = xcb_request_check (c, cookie_gc);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't free gc : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +}
    +
    +static xcb_gc_t
    +gc_font_get (xcb_connection_t *c,
    +             xcb_screen_t     *screen,
    +             xcb_window_t      window,
    +             const char       *font_name)
    +{
    +  uint32_t             value_list[3];
    +  xcb_void_cookie_t    cookie_font;
    +  xcb_void_cookie_t    cookie_gc;
    +  xcb_generic_error_t *error;
    +  xcb_font_t           font;
    +  xcb_gcontext_t       gc;
    +  uint32_t             mask;
    +
    +  font = xcb_generate_id (c);
    +  cookie_font = xcb_open_font_checked (c, font,
    +                                       strlen (font_name),
    +                                       font_name);
    +
    +  error = xcb_request_check (c, cookie_font);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't open font : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    return -1;
    +  }
    +
    +  gc = xcb_generate_id (c);
    +  mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
    +  value_list[0] = screen->black_pixel;
    +  value_list[1] = screen->white_pixel;
    +  value_list[2] = font;
    +  cookie_gc = xcb_create_gc_checked (c, gc, window, mask, value_list);
    +  error = xcb_request_check (c, cookie_gc);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't create gc : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  cookie_font = xcb_close_font_checked (c, font);
    +  error = xcb_request_check (c, cookie_font);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't close font : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  return gc;
    +}
    +
    +static void
    +cursor_set (xcb_connection_t *c,
    +            xcb_screen_t     *screen,
    +            xcb_window_t      window,
    +            int               cursor_id)
    +{
    +  uint32_t             values_list[3];
    +  xcb_void_cookie_t    cookie_font;
    +  xcb_void_cookie_t    cookie_gc;
    +  xcb_generic_error_t *error;
    +  xcb_font_t           font;
    +  xcb_cursor_t         cursor;
    +  xcb_gcontext_t       gc;
    +  uint32_t             mask;
    +  uint32_t             value_list;
    +
    +  font = xcb_generate_id (c);
    +  cookie_font = xcb_open_font_checked (c, font,
    +                                       strlen ("cursor"),
    +                                       "cursor");
    +  error = xcb_request_check (c, cookie_font);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't open font : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  cursor = xcb_generate_id (c);
    +  xcb_create_glyph_cursor (c, cursor, font, font,
    +                           cursor_id, cursor_id + 1,
    +                           0, 0, 0,
    +                           0, 0, 0);
    +
    +  gc = xcb_generate_id (c);
    +  mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
    +  values_list[0] = screen->black_pixel;
    +  values_list[1] = screen->white_pixel;
    +  values_list[2] = font;
    +  cookie_gc = xcb_create_gc_checked (c, gc, window, mask, values_list);
    +  error = xcb_request_check (c, cookie_gc);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't create gc : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +
    +  mask = XCB_CW_CURSOR;
    +  value_list = cursor;
    +  xcb_change_window_attributes (c, window, mask, &value_list);
    +
    +  xcb_free_cursor (c, cursor);
    +
    +  cookie_font = xcb_close_font_checked (c, font);
    +  error = xcb_request_check (c, cookie_font);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't close font : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    exit (-1);
    +  }
    +}
    +
    +int main ()
    +{
    +  xcb_screen_iterator_t screen_iter;
    +  xcb_connection_t     *c;
    +  const xcb_setup_t    *setup;
    +  xcb_screen_t         *screen;
    +  xcb_generic_event_t  *e;
    +  xcb_generic_error_t  *error;
    +  xcb_void_cookie_t     cookie_window;
    +  xcb_void_cookie_t     cookie_map;
    +  xcb_window_t          window;
    +  uint32_t              mask;
    +  uint32_t              values[2];
    +  int                   screen_number;
    +  uint8_t               is_hand = 0;
    +
    +  /* getting the connection */
    +  c = xcb_connect (NULL, &screen_number);
    +  if (!c) {
    +    fprintf (stderr, "ERROR: can't connect to an X server\n");
    +    return -1;
    +  }
    +
    +  /* getting the current screen */
    +  setup = xcb_get_setup (c);
    +
    +  screen = NULL;
    +  screen_iter = xcb_setup_roots_iterator (setup);
    +  for (; screen_iter.rem != 0; --screen_number, xcb_screen_next (&screen_iter))
    +    if (screen_number == 0)
    +      {
    +        screen = screen_iter.data;
    +        break;
    +      }
    +  if (!screen) {
    +    fprintf (stderr, "ERROR: can't get the current screen\n");
    +    xcb_disconnect (c);
    +    return -1;
    +  }
    +
    +  /* creating the window */
    +  window = xcb_generate_id (c);
    +  mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
    +  values[0] = screen->white_pixel;
    +  values[1] =
    +    XCB_EVENT_MASK_KEY_RELEASE |
    +    XCB_EVENT_MASK_BUTTON_PRESS |
    +    XCB_EVENT_MASK_EXPOSURE |
    +    XCB_EVENT_MASK_POINTER_MOTION;
    +  cookie_window = xcb_create_window_checked (c,
    +                                             screen->root_depth,
    +                                             window, screen->root,
    +                                             20, 200, WIDTH, HEIGHT,
    +                                             0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
    +                                             screen->root_visual,
    +                                             mask, values);
    +  cookie_map = xcb_map_window_checked (c, window);
    +
    +  /* error managing */
    +  error = xcb_request_check (c, cookie_window);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't create window : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    return -1;
    +  }
    +  error = xcb_request_check (c, cookie_map);
    +  if (error) {
    +    fprintf (stderr, "ERROR: can't map window : %d\n", error->error_code);
    +    xcb_disconnect (c);
    +    return -1;
    +  }
    +
    +  cursor_set (c, screen, window, 68);
    +
    +  xcb_flush(c);
    +
    +  while (1) {
    +    e = xcb_poll_for_event(c);
    +    if (e) {
    +      switch (e->response_type) {
    +      case XCB_EXPOSE: {
    +        char *text;
    +
    +        text = "click here to change cursor";
    +        button_draw (c, screen, window,
    +                     (WIDTH - 7 * strlen(text)) / 2,
    +                     (HEIGHT - 16) / 2, text);
    +
    +        text = "Press ESC key to exit...";
    +        text_draw (c, screen, window, 10, HEIGHT - 10, text);
    +        break;
    +      }
    +      case XCB_BUTTON_PRESS: {
    +        xcb_button_press_event_t *ev;
    +        int                       length;
    +
    +        ev = (xcb_button_press_event_t *)e;
    +        length = strlen ("click here to change cursor");
    +
    +        if ((ev->event_x >= (WIDTH - 7 * length) / 2) &&
    +            (ev->event_x <= ((WIDTH - 7 * length) / 2 + 7 * length + 6)) &&
    +            (ev->event_y >= (HEIGHT - 16) / 2 - 19) &&
    +            (ev->event_y <= ((HEIGHT - 16) / 2)))
    +          is_hand = 1 - is_hand;
    +
    +        is_hand ? cursor_set (c, screen, window, 58) : cursor_set (c, screen, window, 68);
    +      }
    +      case XCB_KEY_RELEASE: {
    +        xcb_key_release_event_t *ev;
    +
    +        ev = (xcb_key_release_event_t *)e;
    +
    +        switch (ev->detail) {
    +          /* ESC */
    +        case 9:
    +          free (e);
    +          xcb_disconnect (c);
    +          return 0;
    +        }
    +      }
    +      }
    +      free (e);
    +    }
    +  }
    +
    +  return 0;
    +}
    +
  • Translation of basic Xlib functions and macros

    @@ -3438,8 +3820,7 @@ default_screen = screen_of_display (c, screen_default_nbr); /* default_screen contains now the default root window, or a NULL window if no screen is found */

  • RootWindow / RootWindowOfScreen -

    -

    +
     xcb_connection_t *c;
     xcb_screen_t     *screen;
    diff --git a/doc/tutorial/xcb.css b/doc/tutorial/xcb.css
    index d2ab886..e059b3b 100644
    --- a/doc/tutorial/xcb.css
    +++ b/doc/tutorial/xcb.css
    @@ -101,23 +101,23 @@ span.code
       font-family: monospace;
       font-size: 12px;
     }
    -pre.code type
    +pre.code .type
     {
       color: #44bb44;
     }
    -pre.code function
    +pre.code .function
     {
       color: #449fb7;
     }
    -pre.code include
    +pre.code .include
     {
       color: #7d93ae;
     }
    -pre.code string
    +pre.code .string
     {
       color: #ef6e4b;
     }
    -pre.code keyword
    +pre.code .keyword
     {
       color: #00bbbb;
     }
    
    From 8a8c1fa184939ef23f96421990c171b49d16ee33 Mon Sep 17 00:00:00 2001
    From: TORRI Vincent 
    Date: Wed, 7 Feb 2007 18:57:46 +0100
    Subject: [PATCH 16/33] no more xid or id fields
    
    ---
     doc/tutorial/index.html | 61 ++++++++++++++++-------------------------
     1 file changed, 23 insertions(+), 38 deletions(-)
    
    diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html
    index 1ba0775..de7849a 100644
    --- a/doc/tutorial/index.html
    +++ b/doc/tutorial/index.html
    @@ -705,7 +705,7 @@ main ()
         }
     
       printf ("\n");
    -  printf ("Informations of screen %ld:\n", screen->root.xid);
    +  printf ("Informations of screen %ld:\n", screen->root);
       printf ("  width.........: %d\n", screen->width_in_pixels);
       printf ("  height........: %d\n", screen->height_in_pixels);
       printf ("  white pixel...: %ld\n", screen->white_pixel);
    @@ -722,9 +722,7 @@ main ()
           characterized by an Id. So, in XCB, a window is of type:
           

    -typedef struct {
    -    uint32_t xid;
    -} xcb_window_t;
    +typedef uint32_t xcb_window_t;
     

    We first ask for a new Id for our window, with this function: @@ -886,9 +884,7 @@ int xcb_aux_sync (xcb_connection_t *c); a Graphics Context is, as a window, characterized by an Id:

    -typedef struct {
    -    uint32_t xid;
    -} xcb_gcontext_t;
    +typedef uint32_t xcb_gcontext_t;
     

    We first ask the X server to attribute an Id to our graphic @@ -1958,25 +1954,25 @@ main () xcb_expose_event_t *ev = (xcb_expose_event_t *)e; printf ("Window %ld exposed. Region to be redrawn at location (%d,%d), with dimension (%d,%d)\n", - ev->window.xid, ev->x, ev->y, ev->width, ev->height); + ev->window, ev->x, ev->y, ev->width, ev->height); break; } case XCB_BUTTON_PRESS: { xcb_button_press_event_t *ev = (xcb_button_press_event_t *)e; print_modifiers(ev->state); - switch (ev->detail.id) { + switch (ev->detail) { case 4: printf ("Wheel Button up in window %ld, at coordinates (%d,%d)\n", - ev->event.xid, ev->event_x, ev->event_y); + ev->event, ev->event_x, ev->event_y); break; case 5: printf ("Wheel Button down in window %ld, at coordinates (%d,%d)\n", - ev->event.xid, ev->event_x, ev->event_y); + ev->event, ev->event_x, ev->event_y); break; default: printf ("Button %d pressed in window %ld, at coordinates (%d,%d)\n", - ev->detail.id, ev->event.xid, ev->event_x, ev->event_y); + ev->detail, ev->event, ev->event_x, ev->event_y); } break; } @@ -1985,28 +1981,28 @@ main () print_modifiers(ev->state); printf ("Button %d released in window %ld, at coordinates (%d,%d)\n", - ev->detail.id, ev->event.xid, ev->event_x, ev->event_y); + ev->detail, ev->event, ev->event_x, ev->event_y); break; } case XCB_MOTION_NOTIFY: { xcb_motion_notify_event_t *ev = (xcb_motion_notify_event_t *)e; printf ("Mouse moved in window %ld, at coordinates (%d,%d)\n", - ev->event.xid, ev->event_x, ev->event_y); + ev->event, ev->event_x, ev->event_y); break; } case XCB_ENTER_NOTIFY: { xcb_enter_notify_event_t *ev = (xcb_enter_notify_event_t *)e; printf ("Mouse entered window %ld, at coordinates (%d,%d)\n", - ev->event.xid, ev->event_x, ev->event_y); + ev->event, ev->event_x, ev->event_y); break; } case XCB_LEAVE_NOTIFY: { xcb_leave_notify_event_t *ev = (xcb_leave_notify_event_t *)e; printf ("Mouse left window %ld, at coordinates (%d,%d)\n", - ev->event.xid, ev->event_x, ev->event_y); + ev->event, ev->event_x, ev->event_y); break; } case XCB_KEY_PRESS: { @@ -2014,7 +2010,7 @@ main () print_modifiers(ev->state); printf ("Key pressed in window %ld\n", - ev->event.xid); + ev->event); break; } case XCB_KEY_RELEASE: { @@ -2022,7 +2018,7 @@ main () print_modifiers(ev->state); printf ("Key released in window %ld\n", - ev->event.xid); + ev->event); break; } default: @@ -2054,9 +2050,7 @@ main () defined. You know what ? It's an Id:

    -typedef struct {
    -    uint32_t xid;
    -} xcb_font_t;
    +typedef uint32_t xcb_font_t;
     

    It is used to contain information about a font, and is passed @@ -2096,9 +2090,7 @@ typedef struct { Id. Their type are xcb_atom_t:

    -typedef struct {
    -    uint32_t xid;
    -} xcb_atom_t;
    +typedef uint32_t xcb_atom_t;
     

    To change the property of a window, we use the following @@ -2658,9 +2650,7 @@ xcb_get_window_attributes_reply_t *xcb_get_window_attributes_reply (xcb_connecti In XCB, a color map is (as often in X) an Id:

    -typedef struct {
    -    uint32_t xid;
    -} xcb_colormap_t;
    +typedef uint32_t xcb_colormap_t;
     

    In order to access the screen's default color map, you just @@ -2901,19 +2891,14 @@ main () of X pixmap in XCB is an Id like a window:

    -typedef struct {
    -    uint32_t xid;
    -} xcb_pixmap_t;
    +typedef uint32_t xcb_pixmap_t;
     

    - In order to make the difference between a window and a pixmap, - XCB introduces a drawable type, which is a union + Like Xlib, there is no difference between a Drawable, a Window + or a Pixmap:

    -typedef union {
    -    xcb_window_t window;
    -    xcb_pixmap_t pixmap;
    -} xcb_drawable_t;
    +typedef uint32_t xcb_drawable_t;
     

    in order to avoid confusion between a window and a pixmap. The @@ -3115,7 +3100,7 @@ uint32_t value_list; /* The cursor is already created */ mask = XCB_CWCURSOR; -value_list = cursor.xid; +value_list = cursor; xcb_change_window_attributes (conn, window, mask, &value_list);

    @@ -3910,7 +3895,7 @@ if (screen) { visual_iter = xcb_depth_visuals_iterator (depth_iter.data); for (; visual_iter.rem; xcb_visualtype_next (&visual_iter)) { - if (screen->root_visual.id == visual_iter.data->visual_id.id) { + if (screen->root_visual == visual_iter.data->visual_id) { visual_type = visual_iter.data; break; } From acefe83bea9b2b17a956d68f5be504866d34196f Mon Sep 17 00:00:00 2001 From: TORRI Vincent Date: Wed, 7 Feb 2007 20:04:10 +0100 Subject: [PATCH 17/33] font part --- doc/tutorial/index.html | 311 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 303 insertions(+), 8 deletions(-) diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html index de7849a..ac173a0 100644 --- a/doc/tutorial/index.html +++ b/doc/tutorial/index.html @@ -59,9 +59,10 @@

  • Handling text and fonts
    1. The Font structure -
    2. Loading a Font -
    3. Assigning a Font to a Graphic Context -
    4. Drawing text in a window +
    5. Opening a Font +
    6. Assigning a Font to a Graphic Context +
    7. Drawing text in a drawable +
    8. Complete example
  • Windows hierarchy
      @@ -977,8 +978,9 @@ main () change its attributes (for example, changing the foreground color we use to draw a line, or changing the attributes of the font we use to display strings. See Subsections Drawing with a - color and Assigning a Font to a Graphic Context). This is done - by using this function: + color and + Assigning a Font to a Graphic Context). + This is done by using this function:

       xcb_void_cookie_t xcb_change_gc (xcb_connection_t *c,           /* The XCB Connection */
      @@ -2046,7 +2048,7 @@ main ()
             
      1. The Font structure

        - In order to support flexible fonts, a font structure is + In order to support flexible fonts, a font type is defined. You know what ? It's an Id:

        @@ -2055,11 +2057,304 @@ typedef uint32_t xcb_font_t;
                 

        It is used to contain information about a font, and is passed to several functions that handle fonts selection and text drawing. + We ask the X server to attribute an Id to our font with the + function:

        +
        +xcb_font_t xcb_generate_id (xcb_connection_t *c);
        +

        - TODO: example for picking a font and displaying some text. - Even better, also demonstrate translating keypresses to text. +

      2. Opening a Font +

        + To open a font, we use the following function:

        +
        +xcb_void_cookie_t xcb_open_font (xcb_connection_t *c,
        +                                 xcb_font_t        fid,
        +                                 uint16_t          name_len,
        +                                 const char       *name);
        +
        +

        + The fid parameter is the font Id + defined by xcb_generate_id() (see + above). The name parameter is the + name of the font you want to open. Use the command + xlsfonts in a terminal to know which + are the fonts available on your computer. The parameter + name_len is the length of the name + of the font (given by strlen()). +

        +
      3. Assigning a Font to a Graphic Context +

        + Once a font is opened, you have to create a Graphic Context + that will contain the informations about the color of the + foreground and the background used when you draw a text in a + Drawable. Here is an exemple of a Graphic Context that will + allow us to draw an opened font with a black foreground and a + white background: +

        +
        +  /*
        +   * c is the connection
        +   * screen is the screen where the window is displayed
        +   * window is the window in which we will draw the text
        +   * font is the opened font
        +   */
        +
        +  uint32_t             value_list[3];
        +  xcb_gcontext_t       gc;
        +  uint32_t             mask;
        +
        +  gc = xcb_generate_id (c);
        +  mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
        +  value_list[0] = screen->black_pixel;
        +  value_list[1] = screen->white_pixel;
        +  value_list[2] = font;
        +  xcb_create_gc (c, gc, window, mask, value_list);
        +
        +  /* The font is not needed anymore, so we close it */
        +  xcb_close_font (c, font);
        +
        +
      4. Drawing text in a drawable +

        + To draw a text in a drawable, we use the following function: +

        +
        +xcb_void_cookie_t xcb_image_text_8 (xcb_connection_t *c,
        +                                    uint8_t           string_len,
        +                                    xcb_drawable_t    drawable,
        +                                    xcb_gcontext_t    gc,
        +                                    int16_t           x,
        +                                    int16_t           y,
        +                                    const char       *string);
        +
        +

        + The string parameter is the text to + draw. The location of the drawing is given by the parameters + x and y. + The base line of the text is exactly the parameter + y. +

        +
      5. Complete example +

        + This example draw a text at 10 pixels (for the base line) of + the bottom of a window. Pressing the Esc key exits the program. +

        +
        #include 
        +#include 
        +#include 
        +
        +#include 
        +
        +#define WIDTH 300
        +#define HEIGHT 100
        +
        +
        +
        +static xcb_gc_t gc_font_get (xcb_connection_t *c,
        +                             xcb_screen_t     *screen,
        +                             xcb_window_t      window,
        +                             const char       *font_name);
        +
        +static void text_draw (xcb_connection_t *c,
        +                       xcb_screen_t     *screen,
        +                       xcb_window_t      window,
        +                       int16_t           x1,
        +                       int16_t           y1,
        +                       const char       *label);
        +
        +static void
        +text_draw (xcb_connection_t *c,
        +           xcb_screen_t     *screen,
        +           xcb_window_t      window,
        +           int16_t           x1,
        +           int16_t           y1,
        +           const char       *label)
        +{
        +  xcb_void_cookie_t    cookie_gc;
        +  xcb_void_cookie_t    cookie_text;
        +  xcb_generic_error_t *error;
        +  xcb_gcontext_t       gc;
        +  uint8_t              length;
        +
        +  length = strlen (label);
        +
        +  gc = gc_font_get(c, screen, window, "7x13");
        +
        +  cookie_text = xcb_image_text_8_checked (c, length, window, gc,
        +                                          x1,
        +                                          y1, label);
        +  error = xcb_request_check (c, cookie_text);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't paste text : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    exit (-1);
        +  }
        +
        +  cookie_gc = xcb_free_gc (c, gc);
        +  error = xcb_request_check (c, cookie_gc);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't free gc : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    exit (-1);
        +  }
        +}
        +
        +static xcb_gc_t
        +gc_font_get (xcb_connection_t *c,
        +             xcb_screen_t     *screen,
        +             xcb_window_t      window,
        +             const char       *font_name)
        +{
        +  uint32_t             value_list[3];
        +  xcb_void_cookie_t    cookie_font;
        +  xcb_void_cookie_t    cookie_gc;
        +  xcb_generic_error_t *error;
        +  xcb_font_t           font;
        +  xcb_gcontext_t       gc;
        +  uint32_t             mask;
        +
        +  font = xcb_generate_id (c);
        +  cookie_font = xcb_open_font_checked (c, font,
        +                                       strlen (font_name),
        +                                       font_name);
        +
        +  error = xcb_request_check (c, cookie_font);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't open font : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    return -1;
        +  }
        +
        +  gc = xcb_generate_id (c);
        +  mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
        +  value_list[0] = screen->black_pixel;
        +  value_list[1] = screen->white_pixel;
        +  value_list[2] = font;
        +  cookie_gc = xcb_create_gc_checked (c, gc, window, mask, value_list);
        +  error = xcb_request_check (c, cookie_gc);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't create gc : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    exit (-1);
        +  }
        +
        +  cookie_font = xcb_close_font_checked (c, font);
        +  error = xcb_request_check (c, cookie_font);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't close font : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    exit (-1);
        +  }
        +
        +  return gc;
        +}
        +
        +int main ()
        +{
        +  xcb_screen_iterator_t screen_iter;
        +  xcb_connection_t     *c;
        +  const xcb_setup_t    *setup;
        +  xcb_screen_t         *screen;
        +  xcb_generic_event_t  *e;
        +  xcb_generic_error_t  *error;
        +  xcb_void_cookie_t     cookie_window;
        +  xcb_void_cookie_t     cookie_map;
        +  xcb_window_t          window;
        +  uint32_t              mask;
        +  uint32_t              values[2];
        +  int                   screen_number;
        +
        +  /* getting the connection */
        +  c = xcb_connect (NULL, &screen_number);
        +  if (!c) {
        +    fprintf (stderr, "ERROR: can't connect to an X server\n");
        +    return -1;
        +  }
        +
        +  /* getting the current screen */
        +  setup = xcb_get_setup (c);
        +
        +  screen = NULL;
        +  screen_iter = xcb_setup_roots_iterator (setup);
        +  for (; screen_iter.rem != 0; --screen_number, xcb_screen_next (&screen_iter))
        +    if (screen_number == 0)
        +      {
        +        screen = screen_iter.data;
        +        break;
        +      }
        +  if (!screen) {
        +    fprintf (stderr, "ERROR: can't get the current screen\n");
        +    xcb_disconnect (c);
        +    return -1;
        +  }
        +
        +  /* creating the window */
        +  window = xcb_generate_id (c);
        +  mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
        +  values[0] = screen->white_pixel;
        +  values[1] =
        +    XCB_EVENT_MASK_KEY_RELEASE |
        +    XCB_EVENT_MASK_BUTTON_PRESS |
        +    XCB_EVENT_MASK_EXPOSURE |
        +    XCB_EVENT_MASK_POINTER_MOTION;
        +  cookie_window = xcb_create_window_checked (c,
        +                                             screen->root_depth,
        +                                             window, screen->root,
        +                                             20, 200, WIDTH, HEIGHT,
        +                                             0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
        +                                             screen->root_visual,
        +                                             mask, values);
        +  cookie_map = xcb_map_window_checked (c, window);
        +
        +  /* error managing */
        +  error = xcb_request_check (c, cookie_window);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't create window : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    return -1;
        +  }
        +  error = xcb_request_check (c, cookie_map);
        +  if (error) {
        +    fprintf (stderr, "ERROR: can't map window : %d\n", error->error_code);
        +    xcb_disconnect (c);
        +    return -1;
        +  }
        +
        +  xcb_flush(c);
        +
        +  while (1) {
        +    e = xcb_poll_for_event(c);
        +    if (e) {
        +      switch (e->response_type) {
        +      case XCB_EXPOSE: {
        +        char *text;
        +
        +        text = "Press ESC key to exit...";
        +        text_draw (c, screen, window, 10, HEIGHT - 10, text);
        +        break;
        +      }
        +      case XCB_KEY_RELEASE: {
        +        xcb_key_release_event_t *ev;
        +
        +        ev = (xcb_key_release_event_t *)e;
        +
        +        switch (ev->detail) {
        +          /* ESC */
        +        case 9:
        +          free (e);
        +          xcb_disconnect (c);
        +          return 0;
        +        }
        +      }
        +      }
        +      free (e);
        +    }
        +  }
        +
        +  return 0;
        +}
        +
    1. Interacting with the window manager

      From bca41cdcdb11e2a610d7b7a3d077cbb77bc81e45 Mon Sep 17 00:00:00 2001 From: TORRI Vincent Date: Wed, 7 Feb 2007 20:08:27 +0100 Subject: [PATCH 18/33] and make the html code valid... --- doc/tutorial/index.html | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html index ac173a0..75e1f75 100644 --- a/doc/tutorial/index.html +++ b/doc/tutorial/index.html @@ -2063,7 +2063,7 @@ typedef uint32_t xcb_font_t;

       xcb_font_t xcb_generate_id (xcb_connection_t *c);
       
      -

      +

    2. Opening a Font

      To open a font, we use the following function: @@ -2140,11 +2140,12 @@ xcb_void_cookie_t xcb_image_text_8 (xcb_connection_t *c, This example draw a text at 10 pixels (for the base line) of the bottom of a window. Pressing the Esc key exits the program.

      -
      #include 
      -#include 
      -#include 
      +        
      +#include <stdlib.h>
      +#include <stdio.h>
      +#include <string.h>
       
      -#include 
      +#include <xcb/xcb.h>
       
       #define WIDTH 300
       #define HEIGHT 100
      @@ -2266,7 +2267,7 @@ int main ()
         int                   screen_number;
       
         /* getting the connection */
      -  c = xcb_connect (NULL, &screen_number);
      +  c = xcb_connect (NULL, &screen_number);
         if (!c) {
           fprintf (stderr, "ERROR: can't connect to an X server\n");
           return -1;
      @@ -2277,7 +2278,7 @@ int main ()
       
         screen = NULL;
         screen_iter = xcb_setup_roots_iterator (setup);
      -  for (; screen_iter.rem != 0; --screen_number, xcb_screen_next (&screen_iter))
      +  for (; screen_iter.rem != 0; --screen_number, xcb_screen_next (&screen_iter))
           if (screen_number == 0)
             {
               screen = screen_iter.data;
      
      From 4a60950b7433eb41e08cb0c74dc8ced8f92fd78a Mon Sep 17 00:00:00 2001
      From: TORRI Vincent 
      Date: Tue, 27 Feb 2007 13:35:02 +0100
      Subject: [PATCH 19/33] add the first step toward the documentation of the
       request/reply functions. The arguments of the requests are not found yet.
       Josh, can you look at it ?
      
      ---
       src/c-client.xsl | 30 ++++++++++++++++++++++++++++++
       1 file changed, 30 insertions(+)
      
      diff --git a/src/c-client.xsl b/src/c-client.xsl
      index 3e2e849..d7a0eb9 100644
      --- a/src/c-client.xsl
      +++ b/src/c-client.xsl
      @@ -342,6 +342,24 @@ authorization from the authors.
                 
               
             
      +      /**
      +       * Delivers a request to the X server
      +       * @param c The connection
      +       * @return A cookie
      +       *
      +       * Delivers a request to the X server.
      +       * 
      +      
      +         * This form can be used only if the request will not cause
      +         * a reply to be generated. Any returned error will be
      +         * saved for handling by xcb_request_check().
      +      
      +      
      +         * This form can be used only if the request will cause
      +         * a reply to be generated. Any returned error will be
      +         * placed in the event queue.
      +      
      +       */
             
             
             
             
             
      +        /**
      +         * Return the reply
      +         * @param c      The connection
      +         * @param cookie The cookie
      +         * @param e      The xcb_generic_error_t supplied
      +         *
      +         * Returns the reply of the request asked by
      +         * 
      +         * The parameter @p e supplied to this function must be NULL if
      +         * _unchecked(). is used.
      +         * Otherwise, it stores the error if any.
      +         */
               
               
                 
      
      From 91be36f845352dea7838853d0f98ae144fe571a4 Mon Sep 17 00:00:00 2001
      From: Eamon Walsh 
      Date: Thu, 29 Mar 2007 12:28:07 -0700
      Subject: [PATCH 20/33] Replaces special-casing in c-client stylesheet with
       support for new attribute.  Tested with diff and found no difference with
       previous stylesheet header-file output.
      
      ---
       src/c-client.xsl | 38 +++++++++++++-------------------------
       1 file changed, 13 insertions(+), 25 deletions(-)
      
      diff --git a/src/c-client.xsl b/src/c-client.xsl
      index d7a0eb9..24ffe6c 100644
      --- a/src/c-client.xsl
      +++ b/src/c-client.xsl
      @@ -97,31 +97,19 @@ authorization from the authors.
           
           
             xcb
      -      
      -        
      -          _randr
      -        
      -        
      -          _screensaver
      -        
      -        
      -          _xf86dri
      -        
      -        
      -          _xfixes
      -        
      -        
      -          _xvmc
      -        
      -        
      -          _
      -          
      -            
      -          
      -        
      -        
      -        
      -      
      +      
      +	_
      +	
      +	  
      +	    
      +	  
      +	  
      +	    
      +	      
      +	    
      +	  
      +	
      +      
             
               _
               
      
      From eaa380efefd347abcd11a6c24c008686beaf8257 Mon Sep 17 00:00:00 2001
      From: Eamon Walsh 
      Date: Tue, 10 Apr 2007 11:56:06 -0400
      Subject: [PATCH 21/33] Modify new attribute from previous patch so that it is
       necessary only on extensions with split names.  Tested with diff and found no
       difference with previous stylesheet header-file output.
      
      ---
       src/c-client.xsl | 8 ++++----
       1 file changed, 4 insertions(+), 4 deletions(-)
      
      diff --git a/src/c-client.xsl b/src/c-client.xsl
      index 24ffe6c..be6aa30 100644
      --- a/src/c-client.xsl
      +++ b/src/c-client.xsl
      @@ -100,13 +100,13 @@ authorization from the authors.
             
       	_
       	
      -	  
      -	    
      -	  
      -	  
      +	  
       	    
       	      
       	    
      +	  
      +	  
      +	    
       	  
       	
             
      
      From 3abd41625c7d6db6d01f3167d6bac2b7481965cf Mon Sep 17 00:00:00 2001
      From: Matthias Hopf 
      Date: Wed, 11 Apr 2007 17:31:31 +0200
      Subject: [PATCH 22/33] Update autogen.sh to one that does objdir != srcdir
      
      ---
       autogen.sh | 11 ++++++++++-
       1 file changed, 10 insertions(+), 1 deletion(-)
      
      diff --git a/autogen.sh b/autogen.sh
      index d68a142..904cd67 100755
      --- a/autogen.sh
      +++ b/autogen.sh
      @@ -1,3 +1,12 @@
       #! /bin/sh
      +
      +srcdir=`dirname $0`
      +test -z "$srcdir" && srcdir=.
      +
      +ORIGDIR=`pwd`
      +cd $srcdir
      +
       autoreconf -v --install || exit 1
      -./configure "$@"
      +cd $ORIGDIR || exit $?
      +
      +$srcdir/configure --enable-maintainer-mode "$@"
      
      From 0925e470b2abf8837c62e81428660a01bbb990fa Mon Sep 17 00:00:00 2001
      From: TORRI Vincent 
      Date: Thu, 12 Apr 2007 15:46:05 +0200
      Subject: [PATCH 23/33] remove the 7th bit of the response_type for the event
       loops
      
      ---
       doc/tutorial/index.html | 9 +++++----
       1 file changed, 5 insertions(+), 4 deletions(-)
      
      diff --git a/doc/tutorial/index.html b/doc/tutorial/index.html
      index 75e1f75..c540426 100644
      --- a/doc/tutorial/index.html
      +++ b/doc/tutorial/index.html
      @@ -178,8 +178,9 @@
             level GUI toolkit like Motif,
             LessTiff,
             GTK,
      -      QT or
      -      EWL, or use
      +      QT,
      +      EWL,
      +      ETK, or use
             Cairo.
             However,
             we need to start somewhere. More than this, knowing how things
      @@ -2327,7 +2328,7 @@ int main ()
         while (1) {
           e = xcb_poll_for_event(c);
           if (e) {
      -      switch (e->response_type) {
      +      switch (e->response_type & ~0x80) {
             case XCB_EXPOSE: {
               char *text;
       
      @@ -3740,7 +3741,7 @@ int main ()
         while (1) {
           e = xcb_poll_for_event(c);
           if (e) {
      -      switch (e->response_type) {
      +      switch (e->response_type & ~0x80) {
             case XCB_EXPOSE: {
               char *text;
       
      
      From 158c9b6ba18b39f424bd524fceb66f3fec0d1616 Mon Sep 17 00:00:00 2001
      From: Ian Osgood 
      Date: Fri, 13 Apr 2007 15:14:12 -0700
      Subject: [PATCH 24/33] Generate error constants as XCB_BAD_*, similar to Xlib.
      
      The previous constants remain for compatibility, but should be deprecated.
      ---
       src/c-client.xsl | 5 +++++
       1 file changed, 5 insertions(+)
      
      diff --git a/src/c-client.xsl b/src/c-client.xsl
      index be6aa30..c90e94f 100644
      --- a/src/c-client.xsl
      +++ b/src/c-client.xsl
      @@ -449,6 +449,11 @@ authorization from the authors.
               
             
           
      +    
      +      
      +        
      +      
      +    
           
           
             
      
      From e20a31d72b8838cdf31b568431b5ad78492c1481 Mon Sep 17 00:00:00 2001
      From: Jamey Sharp 
      Date: Sat, 2 Jun 2007 18:29:37 -0700
      Subject: [PATCH 25/33] xcb_poll_for_event: Return already-read events before
       read(2)ing again.
      
      ---
       src/xcb_in.c | 3 ++-
       1 file changed, 2 insertions(+), 1 deletion(-)
      
      diff --git a/src/xcb_in.c b/src/xcb_in.c
      index 1cb6b69..2997de4 100644
      --- a/src/xcb_in.c
      +++ b/src/xcb_in.c
      @@ -403,7 +403,8 @@ xcb_generic_event_t *xcb_poll_for_event(xcb_connection_t *c)
           {
               _xcb_lock_io(c);
               /* FIXME: follow X meets Z architecture changes. */
      -        if(_xcb_in_read(c)) /* _xcb_in_read shuts down the connection on error */
      +        ret = get_event(c);
      +        if(!ret && _xcb_in_read(c)) /* _xcb_in_read shuts down the connection on error */
                   ret = get_event(c);
               _xcb_unlock_io(c);
           }
      
      From 605c778e695a4535c35c5324325f310b5faf80e2 Mon Sep 17 00:00:00 2001
      From: Christoph Pfister 
      Date: Wed, 6 Jun 2007 17:17:49 +0200
      Subject: [PATCH 26/33] Print backtraces in case an assert fails inside
       xlib/xcb.
      
      As you know there are some nasty libs / apps doing locking
      incorrectly. In order to improve the information given to the user
      when he encounters such a situation (people don't run apps in gdb
      normally) I created the patch attached.
      It's very non-intrusive (and affects only xlib/xcb, Josh told me on
      irc that it could be useful for other areas too, personally I don't
      think that it's really needed at other places ...).
      
      Some same outputs and the discussion of them:
      
          lxuser@pdln:/tmp$ ./main
          Got a backtrace:
          #0 /tmp/usr/lib/libxcb-xlib.so.0 [0xb7f9d728]
          #1 /tmp/usr/lib/libxcb-xlib.so.0(xcb_xlib_unlock+0x31) [0xb7f9d861]
          #2 ./test.so(function_a+0x11) [0xb7f9f3fd]
          #3 ./test.so(function_b+0x11) [0xb7f9f410]
          #4 ./main [0x80484a7]
          #5 /lib/libc.so.6(__libc_start_main+0xdc) [0xb7e60ebc]
          #6 ./main [0x80483f1]
          main: xcb_xlib.c:82: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.
          Aborted
      
      That's kinda the normal situation.
      
          lxuser@pdln:/tmp$ ./main
          Got a backtrace:
          #0 /tmp/usr/lib/libxcb-xlib.so.0 [0xb7f90728]
          #1 /tmp/usr/lib/libxcb-xlib.so.0(xcb_xlib_unlock+0x31) [0xb7f90861]
          #2 /tmp/test.so [0xb7f923cd]
          #3 /tmp/test.so(function_b+0x11) [0xb7f923e0]
          #4 ./main [0x80484ab]
          #5 /lib/libc.so.6(__libc_start_main+0xdc) [0xb7e53ebc]
          #6 ./main [0x80483f1]
          main: xcb_xlib.c:82: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.
          Aborted
      
      There are two possible reasons that the name doesn't appear in #2:
      a) a hidden symbol or a symbol with statical linkage in a library
      b) a symbol in an app not compiled with -rdynamic.
      But in both cases you still know _where_ the caller is.
      
      Note that in this example test.so was compiled with
      -fomit-frame-pointer; this isn't an issue as _one_ (= the caller)
      stack trace is still valid (as long as you don't have the insane idea
      to compile xcb with -fo-f-p).
      
      Another issue that may appear is "tail call elimination" (some entries
      are mysteriously missing; this is quite ugly, but you still get enough
      information so that you can do something useful with the issue e.g. by
      disassembling the relevant parts with gdb).
      
      Signed-off-by: Jamey Sharp 
      ---
       configure.ac   |  2 ++
       src/xcb_xlib.c | 38 +++++++++++++++++++++++++++++++++++---
       2 files changed, 37 insertions(+), 3 deletions(-)
      
      diff --git a/configure.ac b/configure.ac
      index d73e51f..b446e7f 100644
      --- a/configure.ac
      +++ b/configure.ac
      @@ -48,6 +48,8 @@ PKG_CHECK_MODULES(XDMCP, xdmcp,
       		], [$XDMCP_LIBS]),
       	[AC_MSG_RESULT(no)])
       
      +AC_CHECK_HEADER([execinfo.h], [AC_DEFINE(HAVE_BACKTRACE,1,[Has backtrace*() needed for retrieving stack traces])])
      +
       AC_SUBST(NEEDED)
       
       # Find the xcb-proto protocol descriptions
      diff --git a/src/xcb_xlib.c b/src/xcb_xlib.c
      index 59f972c..07d530c 100644
      --- a/src/xcb_xlib.c
      +++ b/src/xcb_xlib.c
      @@ -28,6 +28,38 @@
       
       #include 
       
      +#ifdef HAVE_BACKTRACE
      +#include 
      +#include 
      +#include 
      +#endif
      +
      +static void xcb_xlib_printbt(void)
      +{
      +#ifdef HAVE_BACKTRACE
      +	void *array[20];
      +	int size;
      +	char **strings;
      +	int i;
      +
      +	size = backtrace(array, 20);
      +	strings = backtrace_symbols(array, size);
      +
      +	printf("Got a backtrace:\n");
      +
      +	for (i = 0; i < size; ++i)
      +		printf("#%i %s\n", i, strings[i]);
      +
      +	free(strings);
      +#endif
      +}
      +
      +#ifndef NDEBUG
      +#define xcb_assert(x) do { if (!(x)) { xcb_xlib_printbt(); assert(x); } } while(0)
      +#else
      +#define xcb_assert(x)
      +#endif
      +
       unsigned int xcb_get_request_sent(xcb_connection_t *c)
       {
           if(c->has_error)
      @@ -38,7 +70,7 @@ unsigned int xcb_get_request_sent(xcb_connection_t *c)
       void xcb_xlib_lock(xcb_connection_t *c)
       {
           _xcb_lock_io(c);
      -    assert(!c->xlib.lock);
      +    xcb_assert(!c->xlib.lock);
           c->xlib.lock = 1;
           c->xlib.thread = pthread_self();
           _xcb_unlock_io(c);
      @@ -47,8 +79,8 @@ void xcb_xlib_lock(xcb_connection_t *c)
       void xcb_xlib_unlock(xcb_connection_t *c)
       {
           _xcb_lock_io(c);
      -    assert(c->xlib.lock);
      -    assert(pthread_equal(c->xlib.thread, pthread_self()));
      +    xcb_assert(c->xlib.lock);
      +    xcb_assert(pthread_equal(c->xlib.thread, pthread_self()));
           c->xlib.lock = 0;
           pthread_cond_broadcast(&c->xlib.cond);
           _xcb_unlock_io(c);
      
      From 65ffbc6cfdb97b14689d3baef183cd50fbd31a7f Mon Sep 17 00:00:00 2001
      From: Josh Triplett 
      Date: Wed, 13 Jun 2007 23:46:37 -0700
      Subject: [PATCH 27/33] Send locking assertion backtraces to stderr.  Improve
       the heading on the backtrace.
      
      ---
       src/xcb_xlib.c | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/src/xcb_xlib.c b/src/xcb_xlib.c
      index 07d530c..35ad3c3 100644
      --- a/src/xcb_xlib.c
      +++ b/src/xcb_xlib.c
      @@ -45,10 +45,10 @@ static void xcb_xlib_printbt(void)
       	size = backtrace(array, 20);
       	strings = backtrace_symbols(array, size);
       
      -	printf("Got a backtrace:\n");
      +	fprintf(stderr, "Locking assertion failure.  Backtrace:\n");
       
       	for (i = 0; i < size; ++i)
      -		printf("#%i %s\n", i, strings[i]);
      +		fprintf(stderr, "#%i %s\n", i, strings[i]);
       
       	free(strings);
       #endif
      
      From 09045eaac34973662aaa820a94ca8ed66d9dcb4e Mon Sep 17 00:00:00 2001
      From: Egbert Eich 
      Date: Thu, 19 Jul 2007 17:00:18 +0200
      Subject: [PATCH 28/33] Allow unix: style display names again.
      
      https://bugzilla.novell.com/show_bug.cgi?id=289007
      This notion is used in a lot of scripts.
      ---
       src/xcb_util.c | 98 +++++++++++++++++++++++++++++++++-----------------
       1 file changed, 66 insertions(+), 32 deletions(-)
      
      diff --git a/src/xcb_util.c b/src/xcb_util.c
      index eeee1dd..dd2305a 100644
      --- a/src/xcb_util.c
      +++ b/src/xcb_util.c
      @@ -55,14 +55,30 @@ int xcb_popcount(uint32_t mask)
           return ((y + (y >> 3)) & 030707070707) % 077;
       }
       
      -int xcb_parse_display(const char *name, char **host, int *displayp, int *screenp)
      +static int _xcb_parse_display(const char *name, char **host, char **protocol,
      +                      int *displayp, int *screenp)
       {
           int len, display, screen;
      -    char *colon, *dot, *end;
      +    char *slash, *colon, *dot, *end;
           if(!name || !*name)
               name = getenv("DISPLAY");
           if(!name)
               return 0;
      +    slash = strrchr(name, '/');
      +    if (slash) {
      +        len = slash - name;
      +        if (protocol) {
      +            *protocol = malloc(len + 1);
      +            if(!*protocol)
      +                return 0;
      +            memcpy(*protocol, name, len);
      +            (*protocol)[len] = '\0';
      +        }
      +        name = slash + 1;
      +    } else
      +        if (protocol)
      +            *protocol = NULL;
      +
           colon = strrchr(name, ':');
           if(!colon)
               return 0;
      @@ -96,51 +112,58 @@ int xcb_parse_display(const char *name, char **host, int *displayp, int *screenp
           return 1;
       }
       
      -static int _xcb_open_tcp(char *host, const unsigned short port);
      -static int _xcb_open_unix(const char *file);
      +int xcb_parse_display(const char *name, char **host, int *displayp,
      +                             int *screenp)
      +{
      +    return _xcb_parse_display(name, host, NULL, displayp, screenp);
      +}
      +
      +static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port);
      +static int _xcb_open_unix(char *protocol, const char *file);
       #ifdef DNETCONN
      -static int _xcb_open_decnet(const char *host, const unsigned short port);
      +static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port);
       #endif
       
      -static int _xcb_open(char *host, const int display)
      +static int _xcb_open(char *host, char *protocol, const int display)
       {
           int fd;
      +    static const char base[] = "/tmp/.X11-unix/X";
      +    char file[sizeof(base) + 20];
       
           if(*host)
           {
       #ifdef DNETCONN
      -        /* DECnet displays have two colons, so xcb_parse_display will have left
      -           one at the end.  However, an IPv6 address can end with *two* colons,
      -           so only treat this as a DECnet display if host ends with exactly one
      -           colon. */
      +        /* DECnet displays have two colons, so _xcb_parse_display will have
      +           left one at the end.  However, an IPv6 address can end with *two*
      +           colons, so only treat this as a DECnet display if host ends with
      +           exactly one colon. */
               char *colon = strchr(host, ':');
               if(colon && *(colon+1) == '\0')
               {
                   *colon = '\0';
      -            fd = _xcb_open_decnet(host, display);
      +            return _xcb_open_decnet(host, protocol, display);
               }
               else
       #endif
      -        {
      -            /* display specifies TCP */
      -            unsigned short port = X_TCP_PORT + display;
      -            fd = _xcb_open_tcp(host, port);
      -        }
      -    }
      -    else
      -    {
      -        /* display specifies Unix socket */
      -        static const char base[] = "/tmp/.X11-unix/X";
      -        char file[sizeof(base) + 20];
      -        snprintf(file, sizeof(file), "%s%d", base, display);
      -        fd = _xcb_open_unix(file);
      +            if (protocol
      +                || strcmp("unix",host)) { /* follow the old unix: rule */
      +
      +                /* display specifies TCP */
      +                unsigned short port = X_TCP_PORT + display;
      +                return _xcb_open_tcp(host, protocol, port);
      +            }
           }
       
      +    /* display specifies Unix socket */
      +    snprintf(file, sizeof(file), "%s%d", base, display);
      +    return  _xcb_open_unix(protocol, file);
      +
      +
           return fd;
       }
       
       #ifdef DNETCONN
      -static int _xcb_open_decnet(const char *host, const unsigned short port)
      +static int _xcb_open_decnet(const char *host, const char *protocol, const unsigned short port)
       {
           int fd;
           struct sockaddr_dn addr;
      @@ -149,6 +172,8 @@ static int _xcb_open_decnet(const char *host, const unsigned short port)
       
           if(!nodeaddr)
               return -1;
      +    if (protocol && strcmp("dnet",protocol))
      +        return -1;
           addr.sdn_family = AF_DECnet;
       
           addr.sdn_add.a_len = nodeaddr->n_length;
      @@ -173,7 +198,7 @@ static int _xcb_open_decnet(const char *host, const unsigned short port)
       }
       #endif
       
      -static int _xcb_open_tcp(char *host, const unsigned short port)
      +static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port)
       {
           int fd = -1;
           struct addrinfo hints = { 0
      @@ -187,7 +212,10 @@ static int _xcb_open_tcp(char *host, const unsigned short port)
           char service[6]; /* "65535" with the trailing '\0' */
           struct addrinfo *results, *addr;
           char *bracket;
      -    
      +
      +    if (protocol && strcmp("tcp",protocol))
      +        return -1;
      +
           /* Allow IPv6 addresses enclosed in brackets. */
           if(host[0] == '[' && (bracket = strrchr(host, ']')) && bracket[1] == '\0')
           {
      @@ -213,10 +241,14 @@ static int _xcb_open_tcp(char *host, const unsigned short port)
           return fd;
       }
       
      -static int _xcb_open_unix(const char *file)
      +static int _xcb_open_unix(char *protocol, const char *file)
       {
           int fd;
           struct sockaddr_un addr = { AF_UNIX };
      +
      +    if (protocol && strcmp("unix",protocol))
      +        return -1;
      +
           strcpy(addr.sun_path, file);
       
           fd = socket(AF_UNIX, SOCK_STREAM, 0);
      @@ -231,12 +263,13 @@ xcb_connection_t *xcb_connect(const char *displayname, int *screenp)
       {
           int fd, display = 0;
           char *host;
      +    char *protocol;
           xcb_connection_t *c;
           xcb_auth_info_t auth;
       
      -    if(!xcb_parse_display(displayname, &host, &display, screenp))
      +    if(!_xcb_parse_display(displayname, &host, &protocol, &display, screenp))
               return (xcb_connection_t *) &error_connection;
      -    fd = _xcb_open(host, display);
      +    fd = _xcb_open(host, protocol, display);
           free(host);
           if(fd == -1)
               return (xcb_connection_t *) &error_connection;
      @@ -256,10 +289,11 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname,
       {
           int fd, display = 0;
           char *host;
      +    char *protocol;
       
      -    if(!xcb_parse_display(displayname, &host, &display, screenp))
      +    if(!_xcb_parse_display(displayname, &host, &protocol, &display, screenp))
               return (xcb_connection_t *) &error_connection;
      -    fd = _xcb_open(host, display);
      +    fd = _xcb_open(host, protocol, display);
           free(host);
           if(fd == -1)
               return (xcb_connection_t *) &error_connection;
      
      From 4d828c5eba9fc7161c5f18650f2dbe218e1db06f Mon Sep 17 00:00:00 2001
      From: Jamey Sharp 
      Date: Tue, 23 Oct 2007 11:03:33 -0700
      Subject: [PATCH 29/33] Don't abort() on locking assertions if
       LIBXCB_ALLOW_SLOPPY_LOCK is set.
      
      But do still print a full backtrace, on platforms where that's
      supported.
      
      This commit follows the spirit of Novell's libxcb-sloppy-lock.diff.
      
      I strongly opposed proposals like this one for a long time. Originally I
      had a very good reason: libX11, when compiled to use XCB, would crash
      soon after a locking correctness violation, so it was better to have an
      informative assert failure than a mystifying crash soon after.
      
      It took some time for me to realize that I'd changed the libX11
      implementation (for unrelated reasons) so that it could survive most
      invalid locking situations, as long as it wasn't actually being used
      from multiple threads concurrently.
      
      The other thing that has changed is that most of the code with incorrect
      locking has now been fixed. The value of the assert is accordingly
      lower.
      
      However, remaining broken callers do need to be fixed. That's why libXCB
      will still noisily print a stacktrace (if possible) on each assertion
      failure, even when assert isn't actually invoked to abort() the program;
      and that's why aborting is still default. This environment variable is
      provided only for use as a temporary workaround for broken applications.
      
      Signed-off-by: Jamey Sharp 
      Acked-by: Josh Triplett 
      ---
       src/xcb_conn.c |  3 +++
       src/xcb_xlib.c | 10 +++++-----
       src/xcbint.h   |  1 +
       3 files changed, 9 insertions(+), 5 deletions(-)
      
      diff --git a/src/xcb_conn.c b/src/xcb_conn.c
      index 3b315bc..827a12b 100644
      --- a/src/xcb_conn.c
      +++ b/src/xcb_conn.c
      @@ -62,6 +62,9 @@ static int set_fd_flags(const int fd)
       static int _xcb_xlib_init(_xcb_xlib *xlib)
       {
           xlib->lock = 0;
      +#ifndef NDEBUG
      +    xlib->sloppy_lock = (getenv("LIBXCB_ALLOW_SLOPPY_LOCK") != 0);
      +#endif
           pthread_cond_init(&xlib->cond, 0);
           return 1;
       }
      diff --git a/src/xcb_xlib.c b/src/xcb_xlib.c
      index 35ad3c3..1b573e8 100644
      --- a/src/xcb_xlib.c
      +++ b/src/xcb_xlib.c
      @@ -55,9 +55,9 @@ static void xcb_xlib_printbt(void)
       }
       
       #ifndef NDEBUG
      -#define xcb_assert(x) do { if (!(x)) { xcb_xlib_printbt(); assert(x); } } while(0)
      +#define xcb_assert(c,x) do { if (!(x)) { xcb_xlib_printbt(); if (!(c)->xlib.sloppy_lock) assert(x); } } while(0)
       #else
      -#define xcb_assert(x)
      +#define xcb_assert(c,x)
       #endif
       
       unsigned int xcb_get_request_sent(xcb_connection_t *c)
      @@ -70,7 +70,7 @@ unsigned int xcb_get_request_sent(xcb_connection_t *c)
       void xcb_xlib_lock(xcb_connection_t *c)
       {
           _xcb_lock_io(c);
      -    xcb_assert(!c->xlib.lock);
      +    xcb_assert(c, !c->xlib.lock);
           c->xlib.lock = 1;
           c->xlib.thread = pthread_self();
           _xcb_unlock_io(c);
      @@ -79,8 +79,8 @@ void xcb_xlib_lock(xcb_connection_t *c)
       void xcb_xlib_unlock(xcb_connection_t *c)
       {
           _xcb_lock_io(c);
      -    xcb_assert(c->xlib.lock);
      -    xcb_assert(pthread_equal(c->xlib.thread, pthread_self()));
      +    xcb_assert(c, c->xlib.lock);
      +    xcb_assert(c, pthread_equal(c->xlib.thread, pthread_self()));
           c->xlib.lock = 0;
           pthread_cond_broadcast(&c->xlib.cond);
           _xcb_unlock_io(c);
      diff --git a/src/xcbint.h b/src/xcbint.h
      index a8e167c..ab692ee 100644
      --- a/src/xcbint.h
      +++ b/src/xcbint.h
      @@ -130,6 +130,7 @@ int _xcb_in_read_block(xcb_connection_t *c, void *buf, int nread);
       
       typedef struct _xcb_xlib {
           int lock;
      +    int sloppy_lock;
           pthread_t thread;
           pthread_cond_t cond;
       } _xcb_xlib;
      
      From f6b75d6090dc40918196d2b902e9616d0199af42 Mon Sep 17 00:00:00 2001
      From: Jamey Sharp 
      Date: Sun, 28 Oct 2007 11:56:08 -0700
      Subject: [PATCH 30/33] Factor pthread_cond_wait(iolock) to _xcb_wait_io.
      
      This parallels the _xcb_lock_io and _xcb_unlock_io factoring.
      ---
       src/xcb_conn.c | 7 ++++++-
       src/xcb_out.c  | 4 ++--
       src/xcbint.h   | 1 +
       3 files changed, 9 insertions(+), 3 deletions(-)
      
      diff --git a/src/xcb_conn.c b/src/xcb_conn.c
      index 827a12b..9a58bff 100644
      --- a/src/xcb_conn.c
      +++ b/src/xcb_conn.c
      @@ -288,6 +288,11 @@ void _xcb_unlock_io(xcb_connection_t *c)
           pthread_mutex_unlock(&c->iolock);
       }
       
      +void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond)
      +{
      +    pthread_cond_wait(cond, &c->iolock);
      +}
      +
       int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count)
       {
           int ret;
      @@ -296,7 +301,7 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec
           /* If the thing I should be doing is already being done, wait for it. */
           if(count ? c->out.writing : c->in.reading)
           {
      -        pthread_cond_wait(cond, &c->iolock);
      +        _xcb_wait_io(c, cond);
               return 1;
           }
       
      diff --git a/src/xcb_out.c b/src/xcb_out.c
      index caf8ef5..60226e5 100644
      --- a/src/xcb_out.c
      +++ b/src/xcb_out.c
      @@ -190,7 +190,7 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect
           _xcb_lock_io(c);
           /* wait for other writing threads to get out of my way. */
           while(c->out.writing)
      -        pthread_cond_wait(&c->out.cond, &c->iolock);
      +        _xcb_wait_io(c, &c->out.cond);
       
           request = ++c->out.request;
           /* send GetInputFocus (sync) when 64k-2 requests have been sent without
      @@ -297,7 +297,7 @@ int _xcb_out_flush_to(xcb_connection_t *c, unsigned int request)
               return _xcb_out_send(c, &vec_ptr, &count);
           }
           while(c->out.writing)
      -        pthread_cond_wait(&c->out.cond, &c->iolock);
      +        _xcb_wait_io(c, &c->out.cond);
           assert(XCB_SEQUENCE_COMPARE(c->out.request_written, >=, request));
           return 1;
       }
      diff --git a/src/xcbint.h b/src/xcbint.h
      index ab692ee..ab0264f 100644
      --- a/src/xcbint.h
      +++ b/src/xcbint.h
      @@ -183,6 +183,7 @@ struct xcb_connection_t {
       };
       
       void _xcb_conn_shutdown(xcb_connection_t *c);
      +void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond);
       int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count);
       
       
      
      From a29fbc2645fabb96d02c382ffef499b48fb1514a Mon Sep 17 00:00:00 2001
      From: Jamey Sharp 
      Date: Sun, 28 Oct 2007 13:28:18 -0700
      Subject: [PATCH 31/33] Don't hold the xlib-xcb lock while sleeping: that
       allows deadlock.
      
      With this patch, `ico -threads 2` runs without deadlock.
      
      Many thanks to Christoph Pfister  for
      pointing out the problem, providing detailed analyses, explaining it to
      me repeatedly until I understood what was going on, and proposing and
      reviewing possible solutions.
      
      Signed-off-by: Jamey Sharp 
      Acked-by: Christoph Pfister 
      ---
       src/xcb_conn.c | 26 +++++++++++++++++++++++++-
       1 file changed, 25 insertions(+), 1 deletion(-)
      
      diff --git a/src/xcb_conn.c b/src/xcb_conn.c
      index 9a58bff..e7856c3 100644
      --- a/src/xcb_conn.c
      +++ b/src/xcb_conn.c
      @@ -290,12 +290,25 @@ void _xcb_unlock_io(xcb_connection_t *c)
       
       void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond)
       {
      +    int xlib_locked = c->xlib.lock;
      +    if(xlib_locked)
      +    {
      +        c->xlib.lock = 0;
      +        pthread_cond_broadcast(&c->xlib.cond);
      +    }
           pthread_cond_wait(cond, &c->iolock);
      +    if(xlib_locked)
      +    {
      +        while(c->xlib.lock)
      +            pthread_cond_wait(&c->xlib.cond, &c->iolock);
      +        c->xlib.lock = 1;
      +        c->xlib.thread = pthread_self();
      +    }
       }
       
       int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count)
       {
      -    int ret;
      +    int ret, xlib_locked;
           fd_set rfds, wfds;
       
           /* If the thing I should be doing is already being done, wait for it. */
      @@ -316,6 +329,12 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec
               ++c->out.writing;
           }
       
      +    xlib_locked = c->xlib.lock;
      +    if(xlib_locked)
      +    {
      +        c->xlib.lock = 0;
      +        pthread_cond_broadcast(&c->xlib.cond);
      +    }
           _xcb_unlock_io(c);
           do {
       	ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
      @@ -326,6 +345,11 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec
       	ret = 0;
           }
           _xcb_lock_io(c);
      +    if(xlib_locked)
      +    {
      +        c->xlib.lock = 1;
      +        c->xlib.thread = pthread_self();
      +    }
       
           if(ret)
           {
      
      From af50de26c10c93ccc4cd3bc61e92aff47651b961 Mon Sep 17 00:00:00 2001
      From: Jamey Sharp 
      Date: Sun, 4 Nov 2007 17:26:21 -0800
      Subject: [PATCH 32/33] Revert "Generate error constants as XCB_BAD_*, similar
       to Xlib."
      
      Since several extensions named their errors like "BadFoo", this patch
      results in names like XCB_EXT_BAD_BAD_FOO, which is really awful. Those
      extensions are already kind of awful, as they produce structure names
      like xcb_ext_bad_foo_error_t, which is redundant.
      
      A patch that removes "Bad" from the XML extension descriptions, while
      maintaining API and ABI compatibility in XCB, is needed before this
      patch can be released.
      
      This reverts commit 158c9b6ba18b39f424bd524fceb66f3fec0d1616.
      ---
       src/c-client.xsl | 5 -----
       1 file changed, 5 deletions(-)
      
      diff --git a/src/c-client.xsl b/src/c-client.xsl
      index c90e94f..be6aa30 100644
      --- a/src/c-client.xsl
      +++ b/src/c-client.xsl
      @@ -449,11 +449,6 @@ authorization from the authors.
               
             
           
      -    
      -      
      -        
      -      
      -    
           
           
             
      
      From 3c6c8f127c2bce4f45bface7dd45cc719af9de0d Mon Sep 17 00:00:00 2001
      From: Jamey Sharp 
      Date: Sun, 4 Nov 2007 17:29:13 -0800
      Subject: [PATCH 33/33] Release libxcb 1.1
      
      ---
       NEWS         | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
       README       |  9 +++++----
       configure.ac |  4 ++--
       3 files changed, 64 insertions(+), 6 deletions(-)
      
      diff --git a/NEWS b/NEWS
      index 91e7348..a0260cb 100644
      --- a/NEWS
      +++ b/NEWS
      @@ -1,3 +1,60 @@
      +Release 1.1 (2007-11-04)
      +========================
      +
      +This release requires xcb-proto 1.1, due to the addition of the
      +extension-multiword attribute to the XML schema.
      +
      +This release contains several important bug fixes, summarized below. It
      +also contains a patch much like Novell's libxcb-sloppy-lock.diff.
      +Rationale from the commit message follows. The patch and this rationale
      +were authored by Jamey Sharp , with agreement from
      +Josh Triplett .
      +
      +    I strongly opposed proposals like this one for a long time.
      +    Originally I had a very good reason: libX11, when compiled to use
      +    XCB, would crash soon after a locking correctness violation, so it
      +    was better to have an informative assert failure than a mystifying
      +    crash soon after.
      +
      +    It took some time for me to realize that I'd changed the libX11
      +    implementation (for unrelated reasons) so that it could survive most
      +    invalid locking situations, as long as it wasn't actually being used
      +    from multiple threads concurrently.
      +
      +    The other thing that has changed is that most of the code with
      +    incorrect locking has now been fixed. The value of the assert is
      +    accordingly lower.
      +
      +    However, remaining broken callers do need to be fixed. That's why
      +    libXCB will still noisily print a stacktrace (if possible) on each
      +    assertion failure, even when assert isn't actually invoked to
      +    abort() the program; and that's why aborting is still default. This
      +    environment variable is provided only for use as a temporary
      +    workaround for broken applications.
      +
      +Enhancements:
      +* Print a backtrace, if possible, on locking assertion failures.
      +* Skip abort() on locking assertions if LIBXCB_ALLOW_SLOPPY_LOCK is set.
      +* xcb_poll_for_event: Return already-read events before reading again.
      +* Output a configuration summary at the end of ./configure.
      +
      +Bug fixes:
      +* Don't hold the xlib-xcb lock while sleeping: that allows deadlock.
      +* Allow unix: style display names again.
      +* Bug #9119: test xcb_popcount
      +* Fix unit tests for FreeBSD
      +* NetBSD doesn't have AI_ADDRCONFIG: use it only if it's available.
      +* Require libXau >= 0.99.2; earlier versions have a broken .pc file
      +* Use substitition variables in xcb-xinerama.pc.in
      +* Update autogen.sh to one that does objdir != srcdir
      +* Add tools/* and autogen.sh to EXTRA_DIST.
      +* Doxygen can now be fully disabled if desired.
      +
      +Documentation improvements:
      +* Many fixes and updates to the tutorial.
      +* Iterators, requests, and replies get partial Doxygen documentation.
      +
      +
       Release 1.0 (2006-11-23)
       ========================
       
      diff --git a/README b/README
      index 5629fe9..167c8ac 100644
      --- a/README
      +++ b/README
      @@ -1,11 +1,12 @@
       About libxcb
       ============
       
      -libxcb provides an interface to the X Window System protocol, which replaces
      -the current Xlib interface. It has several advantages over Xlib, including:
      -- size: small library and lower memory footprint
      +libxcb provides an interface to the X Window System protocol, which
      +replaces the current Xlib interface. It has several advantages over
      +Xlib, including:
      +- size: small, simple library, and lower memory footprint
       - latency hiding: batch several requests and wait for the replies later
      -- direct protocol access: one-to-one mapping between interface and protocol
      +- direct protocol access: interface and protocol correspond exactly
       - proven thread support: transparently access XCB from multiple threads
       - easy extension implementation: interfaces auto-generated from XML-XCB
       
      diff --git a/configure.ac b/configure.ac
      index b446e7f..df554e6 100644
      --- a/configure.ac
      +++ b/configure.ac
      @@ -3,7 +3,7 @@
       
       AC_PREREQ(2.57)
       AC_INIT([libxcb],
      -        1.0,
      +        1.1,
               [xcb@lists.freedesktop.org])
       AC_CONFIG_SRCDIR([xcb.pc.in])
       AM_INIT_AUTOMAKE([foreign dist-bzip2])
      @@ -30,7 +30,7 @@ fi
       AC_SUBST(HTML_CHECK_RESULT)
       
       # Checks for pkg-config packages
      -PKG_CHECK_MODULES(XCBPROTO, xcb-proto >= 1.0)
      +PKG_CHECK_MODULES(XCBPROTO, xcb-proto >= 1.1)
       NEEDED="pthread-stubs xau >= 0.99.2"
       PKG_CHECK_MODULES(NEEDED, $NEEDED)