[Xcb] [RFC PATCH] Delete callback-based APIs for events, properties, and replies.

Vincent Torri vtorri at univ-evry.fr
Thu Jun 24 14:04:09 PDT 2010



On Thu, 24 Jun 2010, Jamey Sharp wrote:

> They are poorly designed and not terribly useful. I wrote the original
> versions of these libraries for demonstration purposes and would like to
> actively discourage anyone from actually using them.
>
> After deleting the callback-based APIs, there was nothing interesting
> left in property or reply, so those libraries are deleted outright. The
> event library is no longer particularly related to event handling, but
> that's a problem for another commit.
>
> The icccm library had some simple hooks for integrating with the
> property library, which are precisely as useful as the property library
> itself, so I deleted them too. (Arnaud suggested this in
> <sa5ocib84hf.fsf at Orfeo.duckcorp.org>.)
>
> Signed-off-by: Jamey Sharp <jamey at minilop.net>
> ---
> Will anybody be sad if I push this commit?

what about moving them outside utils ? in "examples" or "deprecated" or 
whatever?

Vincent

>
> Makefile.am                 |    2 +-
> configure.ac                |   10 ---
> event/event.c               |   86 -----------------------
> event/xcb_event.h           |  112 ------------------------------
> icccm/Makefile.am           |    5 +-
> icccm/icccm.c               |   27 +-------
> icccm/xcb-icccm.pc.in       |    2 +-
> icccm/xcb_icccm.h           |   35 ---------
> property/Makefile.am        |   17 -----
> property/property.c         |  147 ---------------------------------------
> property/xcb-property.pc.in |   11 ---
> property/xcb_property.h     |  161 -------------------------------------------
> reply/.gitignore            |    1 -
> reply/Makefile.am           |   25 -------
> reply/reply.c               |  146 ---------------------------------------
> reply/test_reply.c          |   86 -----------------------
> reply/xcb-reply.pc.in       |   11 ---
> reply/xcb_reply.h           |  122 --------------------------------
> 18 files changed, 6 insertions(+), 1000 deletions(-)
> delete mode 100644 property/Makefile.am
> delete mode 100644 property/property.c
> delete mode 100644 property/xcb-property.pc.in
> delete mode 100644 property/xcb_property.h
> delete mode 100644 reply/.gitignore
> delete mode 100644 reply/Makefile.am
> delete mode 100644 reply/reply.c
> delete mode 100644 reply/test_reply.c
> delete mode 100644 reply/xcb-reply.pc.in
> delete mode 100644 reply/xcb_reply.h
>
> diff --git a/Makefile.am b/Makefile.am
> index 5a98062..f9be2b6 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -1,6 +1,6 @@
>
> MAINTAINERCLEANFILES = Makefile.in
>
> -SUBDIRS = atom aux event property icccm image keysyms reply renderutil
> +SUBDIRS = atom aux event icccm image keysyms renderutil
>
> EXTRA_DIST=xcb-util-common.h
> diff --git a/configure.ac b/configure.ac
> index e8b48f6..d843da6 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -80,31 +80,21 @@ XCB_AUX_CFLAGS='-I$(top_srcdir)/aux'
> XCB_AUX_LIBS='$(top_builddir)/aux/libxcb-aux.la'
> XCB_ATOM_CFLAGS='-I$(top_srcdir)/atom -I$(top_builddir)/atom'
> XCB_ATOM_LIBS='$(top_builddir)/atom/libxcb-atom.la'
> -XCB_EVENT_CFLAGS='-I$(top_srcdir)/event'
> -XCB_EVENT_LIBS='$(top_builddir)/event/libxcb-event.la'
> -XCB_PROPERTY_CFLAGS='-I$(top_srcdir)/property'
> -XCB_PROPERTY_LIBS='$(top_builddir)/property/libxcb-property.la'
> XCB_ICCCM_CFLAGS='-I$(top_srcdir)/icccm'
> XCB_ICCCM_LIBS='$(top_builddir)/icccm/libxcb-icccm.la'
> AC_SUBST(XCB_AUX_CFLAGS)
> AC_SUBST(XCB_AUX_LIBS)
> AC_SUBST(XCB_ATOM_CFLAGS)
> AC_SUBST(XCB_ATOM_LIBS)
> -AC_SUBST(XCB_EVENT_CFLAGS)
> -AC_SUBST(XCB_EVENT_LIBS)
> -AC_SUBST(XCB_PROPERTY_CFLAGS)
> -AC_SUBST(XCB_PROPERTY_LIBS)
> AC_SUBST(XCB_ICCCM_CFLAGS)
> AC_SUBST(XCB_ICCCM_LIBS)
>
> AC_OUTPUT([Makefile
> 	aux/Makefile aux/xcb-aux.pc
> -	reply/Makefile reply/xcb-reply.pc
> 	image/Makefile image/xcb-image.pc
> 	atom/Makefile atom/xcb-atom.pc
> 	event/Makefile event/xcb-event.pc
> 	keysyms/Makefile keysyms/xcb-keysyms.pc
> -	property/Makefile property/xcb-property.pc
> 	icccm/Makefile icccm/xcb-icccm.pc
> 	renderutil/Makefile renderutil/xcb-renderutil.pc
> 	xcb_util_intro
> diff --git a/event/event.c b/event/event.c
> index 7faac1c..f770612 100644
> --- a/event/event.c
> +++ b/event/event.c
> @@ -33,92 +33,6 @@
> #include "xcb_event.h"
> #include "../xcb-util-common.h"
>
> -void
> -xcb_event_handlers_init(xcb_connection_t *c, xcb_event_handlers_t *evenths)
> -{
> -    memset(evenths, 0, sizeof(xcb_event_handlers_t));
> -    evenths->c = c;
> -}
> -
> -xcb_connection_t *
> -xcb_event_get_xcb_connection(xcb_event_handlers_t *evenths)
> -{
> -    return evenths->c;
> -}
> -
> -static xcb_event_handler_t *
> -get_event_handler(xcb_event_handlers_t *evenths, int event)
> -{
> -    assert(event < 256);
> -    event &= XCB_EVENT_RESPONSE_TYPE_MASK;
> -    assert(event >= 2);
> -    return &evenths->event[event - 2];
> -}
> -
> -static xcb_event_handler_t *
> -get_error_handler(xcb_event_handlers_t *evenths, int error)
> -{
> -    assert(error >= 0 && error < 256);
> -    return &evenths->error[error];
> -}
> -
> -int
> -xcb_event_handle(xcb_event_handlers_t *evenths, xcb_generic_event_t *event)
> -{
> -    xcb_event_handler_t *eventh = 0;
> -    assert(event->response_type != 1);
> -
> -    if(event->response_type == 0)
> -        eventh = get_error_handler(evenths, ((xcb_generic_error_t *) event)->error_code);
> -    else
> -        eventh = get_event_handler(evenths, event->response_type);
> -
> -    if(eventh->handler)
> -        return eventh->handler(eventh->data, evenths->c, event);
> -    return 0;
> -}
> -
> -void
> -xcb_event_wait_for_event_loop(xcb_event_handlers_t *evenths)
> -{
> -    xcb_generic_event_t *event;
> -    while((event = xcb_wait_for_event(evenths->c)))
> -    {
> -        xcb_event_handle(evenths, event);
> -        free(event);
> -    }
> -}
> -
> -void
> -xcb_event_poll_for_event_loop(xcb_event_handlers_t *evenths)
> -{
> -    xcb_generic_event_t *event;
> -    while ((event = xcb_poll_for_event(evenths->c)))
> -    {
> -        xcb_event_handle(evenths, event);
> -        free(event);
> -    }
> -}
> -
> -static void
> -set_handler(xcb_generic_event_handler_t handler, void *data, xcb_event_handler_t *place)
> -{
> -    xcb_event_handler_t eventh = { handler, data };
> -    *place = eventh;
> -}
> -
> -void
> -xcb_event_set_handler(xcb_event_handlers_t *evenths, int event, xcb_generic_event_handler_t handler, void *data)
> -{
> -    set_handler(handler, data, get_event_handler(evenths, event));
> -}
> -
> -void
> -xcb_event_set_error_handler(xcb_event_handlers_t *evenths, int error, xcb_generic_error_handler_t handler, void *data)
> -{
> -    set_handler((xcb_generic_event_handler_t) handler, data, get_error_handler(evenths, error));
> -}
> -
> static const char *labelError[] =
> {
>     "Success",
> diff --git a/event/xcb_event.h b/event/xcb_event.h
> index 8978cca..ee911fc 100644
> --- a/event/xcb_event.h
> +++ b/event/xcb_event.h
> @@ -56,118 +56,6 @@ extern "C" {
> #define XCB_EVENT_RESPONSE_TYPE(e)   (e->response_type &  XCB_EVENT_RESPONSE_TYPE_MASK)
> #define XCB_EVENT_SENT(e)            (e->response_type & ~XCB_EVENT_RESPONSE_TYPE_MASK)
>
> -typedef int (*xcb_generic_event_handler_t)(void *data, xcb_connection_t *c, xcb_generic_event_t *event);
> -typedef int (*xcb_generic_error_handler_t)(void *data, xcb_connection_t *c, xcb_generic_error_t *error);
> -
> -typedef struct xcb_event_handler xcb_event_handler_t;
> -struct xcb_event_handler
> -{
> -    xcb_generic_event_handler_t handler;
> -    void *data;
> -};
> -
> -typedef struct xcb_event_handlers xcb_event_handlers_t;
> -struct xcb_event_handlers
> -{
> -    xcb_event_handler_t event[126];
> -    xcb_event_handler_t error[256];
> -    xcb_connection_t *c;
> -};
> -
> -/**
> - * @brief Initialize event handlers data structure.
> - * @param c The connection to the X server.
> - * @param evenths A pointer to the event handler data structure to initialize.
> - */
> -void xcb_event_handlers_init(xcb_connection_t *c, xcb_event_handlers_t *evenths);
> -
> -/**
> - * @brief Get X connection used in event handlers.
> - * @param evenths The event handlers.
> - * @return The connection to the X server.
> - */
> -xcb_connection_t *xcb_event_get_xcb_connection(xcb_event_handlers_t *evenths);
> -
> -/**
> - * @brief Wait for event and handle it with event handler.
> - * @param evenths The event handlers.
> - */
> -void xcb_event_wait_for_event_loop(xcb_event_handlers_t *evenths);
> -
> -/**
> - * @brief Poll for event and handle it with event handler.
> - * @param evenths The event handlers.
> - */
> -void xcb_event_poll_for_event_loop(xcb_event_handlers_t *evenths);
> -
> -/**
> - * @brief Handle an event using event handlers from event handlers data
> - * structure.
> - * @param evenths The event handlers.
> - * @param event The event to handle.
> - * @return The return value of the handler, or 0 if no handler exists for this
> - * event.
> - */
> -int xcb_event_handle(xcb_event_handlers_t *evenths, xcb_generic_event_t *event);
> -
> -/**
> - * @brief Set an event handler for an event type.
> - * @param evenths The event handlers data structure.
> - * @param event The event type.
> - * @param handler The callback function to call for this event type.
> - * @param data Optional data pointer to pass to handler callback function.
> - */
> -void xcb_event_set_handler(xcb_event_handlers_t *evenths, int event, xcb_generic_event_handler_t handler, void *data);
> -
> -/**
> - * @brief Set an error handler for an error type.
> - * @param evenths The error handlers data structure.
> - * @param error The error type.
> - * @param handler The callback function to call for this error type.
> - * @param data Optional data pointer to pass to handler callback function.
> - */
> -void xcb_event_set_error_handler(xcb_event_handlers_t *evenths, int error, xcb_generic_error_handler_t handler, void *data);
> -
> -#define XCB_EVENT_MAKE_EVENT_HANDLER(lkind, ukind) \
> -static inline void xcb_event_set_##lkind##_handler(xcb_event_handlers_t *evenths, int (*handler)(void *, xcb_connection_t *, xcb_##lkind##_event_t *), void *data) \
> -{ \
> -    xcb_event_set_handler(evenths, XCB_##ukind, (xcb_generic_event_handler_t) handler, data); \
> -}
> -
> -XCB_EVENT_MAKE_EVENT_HANDLER(key_press, KEY_PRESS)
> -XCB_EVENT_MAKE_EVENT_HANDLER(key_release, KEY_RELEASE)
> -XCB_EVENT_MAKE_EVENT_HANDLER(button_press, BUTTON_PRESS)
> -XCB_EVENT_MAKE_EVENT_HANDLER(button_release, BUTTON_RELEASE)
> -XCB_EVENT_MAKE_EVENT_HANDLER(motion_notify, MOTION_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(enter_notify, ENTER_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(leave_notify, LEAVE_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(focus_in, FOCUS_IN)
> -XCB_EVENT_MAKE_EVENT_HANDLER(focus_out, FOCUS_OUT)
> -XCB_EVENT_MAKE_EVENT_HANDLER(keymap_notify, KEYMAP_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(expose, EXPOSE)
> -XCB_EVENT_MAKE_EVENT_HANDLER(graphics_exposure, GRAPHICS_EXPOSURE)
> -XCB_EVENT_MAKE_EVENT_HANDLER(no_exposure, NO_EXPOSURE)
> -XCB_EVENT_MAKE_EVENT_HANDLER(visibility_notify, VISIBILITY_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(create_notify, CREATE_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(destroy_notify, DESTROY_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(unmap_notify, UNMAP_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(map_notify, MAP_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(map_request, MAP_REQUEST)
> -XCB_EVENT_MAKE_EVENT_HANDLER(reparent_notify, REPARENT_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(configure_notify, CONFIGURE_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(configure_request, CONFIGURE_REQUEST)
> -XCB_EVENT_MAKE_EVENT_HANDLER(gravity_notify, GRAVITY_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(resize_request, RESIZE_REQUEST)
> -XCB_EVENT_MAKE_EVENT_HANDLER(circulate_notify, CIRCULATE_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(circulate_request, CIRCULATE_REQUEST)
> -XCB_EVENT_MAKE_EVENT_HANDLER(property_notify, PROPERTY_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(selection_clear, SELECTION_CLEAR)
> -XCB_EVENT_MAKE_EVENT_HANDLER(selection_request, SELECTION_REQUEST)
> -XCB_EVENT_MAKE_EVENT_HANDLER(selection_notify, SELECTION_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(colormap_notify, COLORMAP_NOTIFY)
> -XCB_EVENT_MAKE_EVENT_HANDLER(client_message, CLIENT_MESSAGE)
> -XCB_EVENT_MAKE_EVENT_HANDLER(mapping_notify, MAPPING_NOTIFY)
> -
> /**
>  * @brief Convert an event response type to a label.
>  * @param type The event type.
> diff --git a/icccm/Makefile.am b/icccm/Makefile.am
> index bd955f0..68059e9 100644
> --- a/icccm/Makefile.am
> +++ b/icccm/Makefile.am
> @@ -8,9 +8,8 @@ xcbinclude_HEADERS = xcb_icccm.h
> AM_CFLAGS = $(CWARNFLAGS)
>
> libxcb_icccm_la_SOURCES = icccm.c
> -libxcb_icccm_la_CPPFLAGS = $(XCB_CFLAGS) $(XPROTO_CFLAGS) $(XCB_EVENT_CFLAGS) \
> -	$(XCB_PROPERTY_CFLAGS)
> -libxcb_icccm_la_LIBADD = $(XCB_LIBS) $(XPROTO_LIBS) $(XCB_PROPERTY_LIBS)
> +libxcb_icccm_la_CPPFLAGS = $(XCB_CFLAGS) $(XPROTO_CFLAGS)
> +libxcb_icccm_la_LIBADD = $(XCB_LIBS) $(XPROTO_LIBS)
> libxcb_icccm_la_LDFLAGS = -version-info 2:0:0
>
> pkgconfig_DATA = xcb-icccm.pc
> diff --git a/icccm/icccm.c b/icccm/icccm.c
> index e620bde..69b03b8 100644
> --- a/icccm/icccm.c
> +++ b/icccm/icccm.c
> @@ -41,7 +41,7 @@ xcb_get_text_property(xcb_connection_t *c,
>                       xcb_window_t window,
>                       xcb_atom_t property)
> {
> -  return xcb_get_any_property(c, 0, window, property, UINT_MAX);
> +  return xcb_get_property(c, 0, window, property, XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX);
> }
>
> xcb_get_property_cookie_t
> @@ -49,7 +49,7 @@ xcb_get_text_property_unchecked(xcb_connection_t *c,
>                                 xcb_window_t window,
>                                 xcb_atom_t property)
> {
> -  return xcb_get_any_property_unchecked(c, 0, window, property, UINT_MAX);
> +  return xcb_get_property_unchecked(c, 0, window, property, XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX);
> }
>
> uint8_t
> @@ -124,13 +124,6 @@ xcb_get_wm_name_reply(xcb_connection_t *c,
>   return xcb_get_text_property_reply(c, cookie, prop, e);
> }
>
> -uint8_t
> -xcb_watch_wm_name(xcb_property_handlers_t *prophs, uint32_t long_len,
> -                  xcb_generic_property_handler_t handler, void *data)
> -{
> -  return xcb_property_set_handler(prophs, XCB_ATOM_WM_NAME, long_len, handler, data);
> -}
> -
> /* WM_ICON_NAME */
>
> xcb_void_cookie_t
> @@ -176,14 +169,6 @@ xcb_get_wm_icon_name_reply(xcb_connection_t *c,
>   return xcb_get_text_property_reply(c, cookie, prop, e);
> }
>
> -uint8_t
> -xcb_watch_wm_icon_name(xcb_property_handlers_t *prophs, uint32_t long_len,
> -                       xcb_generic_property_handler_t handler, void *data)
> -{
> -  return xcb_property_set_handler(prophs, XCB_ATOM_WM_ICON_NAME, long_len, handler,
> -				  data);
> -}
> -
> /* WM_COLORMAP_WINDOWS */
>
> xcb_void_cookie_t
> @@ -307,14 +292,6 @@ xcb_get_wm_client_machine_reply(xcb_connection_t *c,
>   return xcb_get_text_property_reply(c, cookie, prop, e);
> }
>
> -uint8_t
> -xcb_watch_wm_client_machine(xcb_property_handlers_t *prophs, uint32_t long_len,
> -                            xcb_generic_property_handler_t handler, void *data)
> -{
> -  return xcb_property_set_handler(prophs, XCB_ATOM_WM_CLIENT_MACHINE, long_len, handler,
> -				  data);
> -}
> -
> /* WM_CLASS */
>
> xcb_void_cookie_t
> diff --git a/icccm/xcb-icccm.pc.in b/icccm/xcb-icccm.pc.in
> index f85d0cb..d873ed9 100644
> --- a/icccm/xcb-icccm.pc.in
> +++ b/icccm/xcb-icccm.pc.in
> @@ -6,6 +6,6 @@ includedir=@includedir@
> Name: XCB ICCCM library
> Description: XCB ICCCM binding
> Version: @PACKAGE_VERSION@
> -Requires: xcb xcb-proto xcb-property
> +Requires: xcb xcb-proto
> Libs: -L${libdir} -lxcb-icccm @LIBS@
> Cflags: -I${includedir}
> diff --git a/icccm/xcb_icccm.h b/icccm/xcb_icccm.h
> index f05ced0..1617b84 100644
> --- a/icccm/xcb_icccm.h
> +++ b/icccm/xcb_icccm.h
> @@ -40,7 +40,6 @@
>  */
>
> #include <xcb/xcb.h>
> -#include "xcb_property.h"
>
> #ifdef __cplusplus
> extern "C" {
> @@ -166,16 +165,6 @@ uint8_t xcb_get_wm_name_reply(xcb_connection_t *c,
>                               xcb_get_text_property_reply_t *prop,
>                               xcb_generic_error_t **e);
>
> -/**
> - * @brief Set a callback on WM_NAME property changes.
> - * @param prophs Property handlers.
> - * @param long_len Length of data.
> - * @param handler The callback.
> - * @param data data given to the callback.
> - */
> -uint8_t xcb_watch_wm_name(xcb_property_handlers_t *prophs, uint32_t long_len,
> -			  xcb_generic_property_handler_t handler, void *data);
> -
> /* WM_ICON_NAME */
>
> /**
> @@ -233,18 +222,6 @@ uint8_t xcb_get_wm_icon_name_reply(xcb_connection_t *c,
>                                    xcb_get_text_property_reply_t *prop,
>                                    xcb_generic_error_t **e);
>
> -/**
> - * @brief Set a callback on WM_ICON_NAME property changes.
> - * @param prophs Property handlers.
> - * @param long_len Length of data.
> - * @param handler The callback.
> - * @param data data given to the callback.
> - */
> -uint8_t xcb_watch_wm_icon_name(xcb_property_handlers_t *prophs,
> -			       uint32_t long_len,
> -			       xcb_generic_property_handler_t handler,
> -			       void *data);
> -
> /* WM_COLORMAP_WINDOWS */
>
> /**
> @@ -394,18 +371,6 @@ uint8_t xcb_get_wm_client_machine_reply(xcb_connection_t *c,
>                                         xcb_get_text_property_reply_t *prop,
>                                         xcb_generic_error_t **e);
>
> -/**
> - * @brief Set a callback on WM_CLIENT_MACHINE property changes.
> - * @param prophs Property handlers.
> - * @param long_len Length of data.
> - * @param handler The callback.
> - * @param data data given to the callback.
> - */
> -uint8_t xcb_watch_wm_client_machine(xcb_property_handlers_t *prophs,
> -				    uint32_t long_len,
> -				    xcb_generic_property_handler_t handler,
> -				    void *data);
> -
> /* WM_CLASS */
>
> /**
> diff --git a/property/Makefile.am b/property/Makefile.am
> deleted file mode 100644
> index 3fb56de..0000000
> --- a/property/Makefile.am
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -
> -MAINTAINERCLEANFILES = Makefile.in
> -
> -lib_LTLIBRARIES = libxcb-property.la
> -
> -xcbinclude_HEADERS = xcb_property.h
> -
> -AM_CFLAGS = $(CWARNFLAGS)
> -
> -libxcb_property_la_SOURCES = property.c
> -libxcb_property_la_CPPFLAGS = $(XCB_CFLAGS) $(XCB_EVENT_CFLAGS)
> -libxcb_property_la_LIBADD = $(XCB_LIBS) $(XCB_EVENT_LIBS)
> -libxcb_property_la_LDFLAGS = -version-info 1:0:0
> -
> -pkgconfig_DATA = xcb-property.pc
> -
> -EXTRA_DIST = xcb-property.pc.in
> diff --git a/property/property.c b/property/property.c
> deleted file mode 100644
> index 161481e..0000000
> --- a/property/property.c
> +++ /dev/null
> @@ -1,147 +0,0 @@
> -/*
> - * Copyright © 2008 Julien Danjou <julien at danjou.info>
> - *
> - * Permission is hereby granted, free of charge, to any person
> - * obtaining a copy of this software and associated documentation
> - * files (the "Software"), to deal in the Software without
> - * restriction, including without limitation the rights to use, copy,
> - * modify, merge, publish, distribute, sublicense, and/or sell copies
> - * of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - * Except as contained in this notice, the names of the authors or
> - * their institutions shall not be used in advertising or otherwise to
> - * promote the sale, use or other dealings in this Software without
> - * prior written authorization from the authors.
> - */
> -
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "xcb_property.h"
> -
> -xcb_get_property_cookie_t
> -xcb_get_any_property(xcb_connection_t *c, uint8_t del, xcb_window_t window, xcb_atom_t name, uint32_t long_len)
> -{
> -    static const xcb_atom_t type = XCB_GET_PROPERTY_TYPE_ANY;
> -
> -    return xcb_get_property(c, del, window, name, type, 0, long_len);
> -}
> -
> -xcb_get_property_cookie_t
> -xcb_get_any_property_unchecked(xcb_connection_t *c,
> -                                                             uint8_t del,
> -                                                             xcb_window_t window,
> -                                                             xcb_atom_t name,
> -                                                             uint32_t long_len)
> -{
> -    return xcb_get_property_unchecked(c, del, window, name, XCB_GET_PROPERTY_TYPE_ANY, 0, long_len);
> -}
> -
> -static int
> -call_handler(xcb_connection_t *c, uint8_t state, xcb_window_t window, xcb_atom_t atom, xcb_property_handler_t *h)
> -{
> -    xcb_get_property_reply_t *propr = 0;
> -    int                     ret;
> -
> -    if(state != XCB_PROPERTY_DELETE)
> -    {
> -        xcb_get_property_cookie_t cookie = xcb_get_any_property(c, 0, window, atom, h->long_len);
> -        propr = xcb_get_property_reply(c, cookie, 0);
> -    }
> -    ret = h->handler(h->data, c, state, window, atom, propr);
> -    free(propr);
> -    return ret;
> -}
> -
> -int
> -xcb_property_changed(xcb_property_handlers_t *prophs, uint8_t state, xcb_window_t window, xcb_atom_t atom)
> -{
> -    xcb_connection_t *c = xcb_event_get_xcb_connection(xcb_property_get_event_handlers(prophs));
> -    xcb_property_handler_node_t *cur;
> -
> -    for(cur = prophs->head; cur; cur = cur->next)
> -        if(cur->name == atom)
> -            return call_handler(c, state, window, atom, &cur->h);
> -
> -    if(prophs->def.handler)
> -        return call_handler(c, state, window, atom, &prophs->def);
> -
> -    return 0;
> -}
> -
> -static int
> -handle_property_notify_event(void *data, xcb_connection_t *c, xcb_property_notify_event_t *e)
> -{
> -    xcb_property_handlers_t *prophs = data;
> -    uint8_t state = e->state;
> -    xcb_window_t window = e->window;
> -    xcb_atom_t atom = e->atom;
> -
> -    return xcb_property_changed(prophs, state, window, atom);
> -}
> -
> -void
> -xcb_property_handlers_init(xcb_property_handlers_t *prophs, xcb_event_handlers_t *evenths)
> -{
> -    memset(prophs, 0, sizeof(prophs));
> -    prophs->evenths = evenths;
> -    xcb_event_set_property_notify_handler(evenths, handle_property_notify_event, prophs);
> -}
> -
> -void
> -xcb_property_handlers_wipe(xcb_property_handlers_t *prophs)
> -{
> -    xcb_property_handler_node_t *node, *next;
> -
> -    for(node = prophs->head; node; node = next)
> -    {
> -            next = node->next;
> -            free(node);
> -    }
> -}
> -
> -xcb_event_handlers_t *
> -xcb_property_get_event_handlers(xcb_property_handlers_t *prophs)
> -{
> -    return prophs->evenths;
> -}
> -
> -static inline void
> -set_prop_handler(xcb_property_handler_t *cur, uint32_t long_len, xcb_generic_property_handler_t handler, void *data)
> -{
> -    cur->long_len = long_len;
> -    cur->handler = handler;
> -    cur->data = data;
> -}
> -
> -uint8_t
> -xcb_property_set_handler(xcb_property_handlers_t *prophs, xcb_atom_t name, uint32_t long_len, xcb_generic_property_handler_t handler, void *data)
> -{
> -    xcb_property_handler_node_t *cur = malloc(sizeof(xcb_property_handler_node_t));
> -    if(!cur)
> -        return 0;
> -    cur->next = prophs->head;
> -    cur->name = name;
> -    set_prop_handler(&cur->h, long_len, handler, data);
> -    prophs->head = cur;
> -    return 1;
> -}
> -
> -uint8_t
> -xcb_property_set_default_handler(xcb_property_handlers_t *prophs, uint32_t long_len, xcb_generic_property_handler_t handler, void *data)
> -{
> -    set_prop_handler(&prophs->def, long_len, handler, data);
> -    return 1;
> -}
> diff --git a/property/xcb-property.pc.in b/property/xcb-property.pc.in
> deleted file mode 100644
> index 94cd0f7..0000000
> --- a/property/xcb-property.pc.in
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -prefix=@prefix@
> -exec_prefix=@exec_prefix@
> -libdir=@libdir@
> -includedir=@includedir@
> -
> -Name: XCB Property library
> -Description: XCB property convenience library
> -Version: @PACKAGE_VERSION@
> -Requires: xcb xcb-event
> -Libs: -L${libdir} -lxcb-property @LIBS@
> -Cflags: -I${includedir}
> diff --git a/property/xcb_property.h b/property/xcb_property.h
> deleted file mode 100644
> index 30ffc14..0000000
> --- a/property/xcb_property.h
> +++ /dev/null
> @@ -1,161 +0,0 @@
> -/*
> - * Copyright (C) 2008 Julien Danjou <julien at danjou.info>
> - *
> - * Permission is hereby granted, free of charge, to any person
> - * obtaining a copy of this software and associated documentation
> - * files (the "Software"), to deal in the Software without
> - * restriction, including without limitation the rights to use, copy,
> - * modify, merge, publish, distribute, sublicense, and/or sell copies
> - * of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - * Except as contained in this notice, the names of the authors or
> - * their institutions shall not be used in advertising or otherwise to
> - * promote the sale, use or other dealings in this Software without
> - * prior written authorization from the authors.
> - */
> -
> -/**
> - * @defgroup xcb__property_t XCB Property Functions
> - *
> - * These functions ease the handling of X properties received.
> - *
> - * @{
> - */
> -
> -#ifndef __XCB_PROPERTY_H__
> -#define __XCB_PROPERTY_H__
> -
> -#include "xcb_event.h"
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -typedef struct xcb_property_handlers xcb_property_handlers_t;
> -typedef int (*xcb_generic_property_handler_t)(void *data, xcb_connection_t *c, uint8_t state, xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *property);
> -
> -typedef struct {
> -	uint32_t                       long_len;
> -	xcb_generic_property_handler_t handler;
> -	void                          *data;
> -} xcb_property_handler_t;
> -
> -typedef struct xcb_property_handler_node xcb_property_handler_node_t;
> -struct xcb_property_handler_node {
> -	xcb_property_handler_node_t *next;
> -	xcb_atom_t     name;
> -	xcb_property_handler_t h;
> -};
> -
> -struct xcb_property_handlers {
> -	xcb_property_handler_node_t *head;
> -	xcb_property_handler_t      def;
> -	xcb_event_handlers_t        *evenths;
> -};
> -
> -/**
> - * @brief Get any property from a window, from any format.
> - * @param c The connection to the X server.
> - * @param del Boolean value that determines whether the property is deleted.
> - * @param window The window to get property from.
> - * @param name The property atom name.
> - * @param long_len The maximum length of the property.
> - * @return A cookie.
> - */
> -xcb_get_property_cookie_t xcb_get_any_property(xcb_connection_t *c,
> -                                               uint8_t del,
> -                                               xcb_window_t window,
> -                                               xcb_atom_t name,
> -                                               uint32_t long_len);
> -
> -/**
> - * @see xcb_get_any_property
> - */
> -xcb_get_property_cookie_t xcb_get_any_property_unchecked(xcb_connection_t *c,
> -                                                         uint8_t del,
> -                                                         xcb_window_t window,
> -                                                         xcb_atom_t name,
> -                                                         uint32_t long_len);
> -/**
> - * @brief Initialize a property handlers structure.
> - * @param prophs The property handlers data structure pointer.
> - * @param evenths The event handlers.
> - */
> -void xcb_property_handlers_init(xcb_property_handlers_t *prophs, xcb_event_handlers_t *evenths);
> -
> -/**
> - * @brief Wipe a property handler structure.
> - * @param prophs The property handlers data structure pointer.
> - */
> -void xcb_property_handlers_wipe(xcb_property_handlers_t *prophs);
> -
> -/**
> - * @brief Get a event handlers from a property handlers data structure.
> - * @param prophs The property handlers.
> - * @return The event handlers data structure which was set if any, NULL
> - * otherwise.
> - */
> -xcb_event_handlers_t *xcb_property_get_event_handlers(xcb_property_handlers_t *prophs);
> -
> -/**
> - * @brief Set a property handler for an event.
> - * @param prophs The property handlers.
> - * @param name The property atom name.
> - * @param long_len The maximum length of the property value that will be
> - * handled.
> - * @param handler The handler callback function.
> - * @param data Optional data that will be passed as argument of the handler
> - * callback function. Can be NULL safely if you do not need it.
> - * @return Return 1 on success, 0 otherwise.
> - */
> -uint8_t xcb_property_set_handler(xcb_property_handlers_t *prophs,
> -                                 xcb_atom_t name,
> -                                 uint32_t long_len,
> -                                 xcb_generic_property_handler_t handler,
> -                                 void *data);
> -
> -/**
> - * @brief Set the default property handler.
> - * If a property does not have its own handler function, this one will be
> - * used.
> - * @param prophs The property handlers.
> - * @param name The property atom name.
> - * @param long_len The maximum length of the property value that will be
> - * handled.
> - * @param handler The handler callback function.
> - * @param data Optional data that will be passed as argument of the handler
> - * callback function. Can be NULL safely if you do not need it.
> - * @return Return 1 on success, 0 otherwise.
> - */
> -uint8_t xcb_property_set_default_handler(xcb_property_handlers_t *prophs, uint32_t long_len, xcb_generic_property_handler_t handler, void *data);
> -
> -/**
> - * @brief Notify that a property has changed and call handler function callback as needed.
> - * @param prophs The property handlers.
> - * @param state The property state.
> - * @param window The window.
> - * @param atom The property atom name.
> - */
> -int xcb_property_changed(xcb_property_handlers_t *prophs, uint8_t state, xcb_window_t window, xcb_atom_t atom);
> -
> -#ifdef __cplusplus
> -}
> -#endif
> -
> -/**
> - * @}
> - */
> -
> -#endif /* __XCB_PROPERTY_H__ */
> diff --git a/reply/.gitignore b/reply/.gitignore
> deleted file mode 100644
> index 957705d..0000000
> --- a/reply/.gitignore
> +++ /dev/null
> @@ -1 +0,0 @@
> -test_reply
> diff --git a/reply/Makefile.am b/reply/Makefile.am
> deleted file mode 100644
> index aa49773..0000000
> --- a/reply/Makefile.am
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -
> -MAINTAINERCLEANFILES = Makefile.in
> -
> -lib_LTLIBRARIES = libxcb-reply.la
> -
> -xcbinclude_HEADERS = xcb_reply.h
> -
> -AM_CFLAGS = $(CWARNFLAGS)
> -
> -XCB_REPLY_LIBS = libxcb-reply.la
> -
> -libxcb_reply_la_SOURCES = reply.c
> -libxcb_reply_la_CPPFLAGS = $(XCB_CFLAGS)
> -libxcb_reply_la_LIBADD = $(XCB_LIBS) -lpthread
> -libxcb_reply_la_LDFLAGS = -version-info 1:0:0
> -
> -pkgconfig_DATA = xcb-reply.pc
> -
> -EXTRA_DIST=xcb-reply.pc.in
> -
> -noinst_PROGRAMS = test_reply
> -
> -test_reply_CPPFLAGS = $(XCB_CFLAGS)
> -test_reply_LDADD = $(XCB_LIBS) $(XCB_REPLY_LIBS)
> -test_reply_SOURCES = test_reply.c
> diff --git a/reply/reply.c b/reply/reply.c
> deleted file mode 100644
> index 0cc75c6..0000000
> --- a/reply/reply.c
> +++ /dev/null
> @@ -1,146 +0,0 @@
> -/*
> - * Copyright © 2008 Julien Danjou <julien at danjou.info>
> - *
> - * Permission is hereby granted, free of charge, to any person
> - * obtaining a copy of this software and associated documentation
> - * files (the "Software"), to deal in the Software without
> - * restriction, including without limitation the rights to use, copy,
> - * modify, merge, publish, distribute, sublicense, and/or sell copies
> - * of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - * Except as contained in this notice, the names of the authors or
> - * their institutions shall not be used in advertising or otherwise to
> - * promote the sale, use or other dealings in this Software without
> - * prior written authorization from the authors.
> - */
> -
> -#include <stdlib.h>
> -#include <xcb/xcbext.h>
> -
> -#include "xcb_reply.h"
> -
> -void
> -xcb_reply_handlers_init(xcb_connection_t *c, xcb_reply_handlers_t *r)
> -{
> -    static const pthread_mutex_t proto_lock = PTHREAD_MUTEX_INITIALIZER;
> -    static const pthread_cond_t proto_cond = PTHREAD_COND_INITIALIZER;
> -    r->lock = proto_lock;
> -    r->cond = proto_cond;
> -    r->c = c;
> -    r->head = NULL;
> -}
> -
> -xcb_connection_t *
> -xcb_reply_get_xcb_connection(xcb_reply_handlers_t *h)
> -{
> -    return h->c;
> -}
> -
> -static void
> -insert_handler(xcb_reply_handlers_t *h, struct xcb_reply_node *cur)
> -{
> -    struct xcb_reply_node **prev = &h->head;
> -    while(*prev && (*prev)->request < cur->request)
> -        prev = &(*prev)->next;
> -    cur->next = *prev;
> -    *prev = cur;
> -}
> -
> -static void
> -remove_handler(xcb_reply_handlers_t *h, struct xcb_reply_node *cur)
> -{
> -    struct xcb_reply_node **prev = &h->head;
> -    while(*prev && (*prev)->request < cur->request)
> -        prev = &(*prev)->next;
> -    if(!(*prev) || (*prev)->request != cur->request)
> -        return;
> -    *prev = cur->next;
> -    free(cur);
> -}
> -
> -static int
> -process_replies(xcb_reply_handlers_t *h, int block)
> -{
> -    int handled = 0;
> -    pthread_mutex_lock(&h->lock);
> -    pthread_cleanup_push((void (*)(void *)) pthread_mutex_unlock, &h->lock);
> -    while(1)
> -    {
> -        struct xcb_reply_node *cur = h->head;
> -        xcb_generic_error_t *error;
> -        void *reply;
> -        pthread_mutex_unlock(&h->lock);
> -        pthread_cleanup_push((void (*)(void *)) pthread_mutex_lock, &h->lock);
> -        if(block)
> -            reply = xcb_wait_for_reply(h->c, cur->request, &error);
> -        else if(!xcb_poll_for_reply(h->c, cur->request, &reply, &error))
> -            return handled;
> -        if(reply || error)
> -        {
> -            cur->handler(cur->data, h->c, reply, error);
> -            cur->handled = 1;
> -            free(reply);
> -            free(error);
> -        }
> -        handled |= cur->handled;
> -        pthread_cleanup_pop(1);
> -        if(!reply)
> -            remove_handler(h, cur);
> -        if(!h->head)
> -        {
> -            if(block)
> -                pthread_cond_wait(&h->cond, &h->lock);
> -            else
> -                break;
> -        }
> -    }
> -    pthread_cleanup_pop(1);
> -    return handled;
> -}
> -
> -static void *
> -reply_thread(void *h)
> -{
> -    process_replies(h, 1);
> -    return 0;
> -}
> -
> -void
> -xcb_reply_start_thread(xcb_reply_handlers_t *h)
> -{
> -    pthread_create(&h->thread, 0, reply_thread, h);
> -}
> -
> -void
> -xcb_reply_stop_thread(xcb_reply_handlers_t *h)
> -{
> -    pthread_cancel(h->thread);
> -    pthread_join(h->thread, 0);
> -}
> -
> -void
> -xcb_reply_add_handler(xcb_reply_handlers_t *h, unsigned int request, xcb_generic_reply_handler_t handler, void *data)
> -{
> -    struct xcb_reply_node *cur = malloc(sizeof(struct xcb_reply_node));
> -    cur->request = request;
> -    cur->handler = handler;
> -    cur->data = data;
> -    cur->handled = 0;
> -
> -    pthread_mutex_lock(&h->lock);
> -    insert_handler(h, cur);
> -    pthread_cond_broadcast(&h->cond);
> -    pthread_mutex_unlock(&h->lock);
> -}
> diff --git a/reply/test_reply.c b/reply/test_reply.c
> deleted file mode 100644
> index 0805c41..0000000
> --- a/reply/test_reply.c
> +++ /dev/null
> @@ -1,86 +0,0 @@
> -/*
> - * Copyright © 2008 Ian Osgood  <iano at quirkster.com>
> - * Copyright © 2008 Jamey Sharp <jamey at minilop.net>
> - * Copyright © 2008 Josh Triplett <josh at freedesktop.org>
> - * Copyright © 2008 Julien Danjou <julien at danjou.info>
> - *
> - * Permission is hereby granted, free of charge, to any person
> - * obtaining a copy of this software and associated documentation
> - * files (the "Software"), to deal in the Software without
> - * restriction, including without limitation the rights to use, copy,
> - * modify, merge, publish, distribute, sublicense, and/or sell copies
> - * of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - * Except as contained in this notice, the names of the authors or
> - * their institutions shall not be used in advertising or otherwise to
> - * promote the sale, use or other dealings in this Software without
> - * prior written authorization from the authors.
> - */
> -
> -#include "xcb_reply.h"
> -
> -#include <string.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -
> -pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
> -pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
> -
> -void fontinfo_handler(void *data, xcb_connection_t *c, xcb_generic_reply_t *rg, xcb_generic_error_t *eg)
> -{
> -	xcb_list_fonts_with_info_reply_t *rep = (xcb_list_fonts_with_info_reply_t *) rg;
> -	if(rep)
> -	{
> -		int len = xcb_list_fonts_with_info_name_length(rep);
> -		if(len)
> -			printf("(+%u) Font \"%.*s\"\n",
> -					(unsigned int) rep->replies_hint,
> -					len, xcb_list_fonts_with_info_name(rep));
> -		else
> -		{
> -			pthread_mutex_lock(&lock);
> -			pthread_cond_broadcast(&cond);
> -			pthread_mutex_unlock(&lock);
> -			printf("End of font list.\n");
> -		}
> -	}
> -	if(eg)
> -		printf("Error from ListFontsWithInfo: %d\n", eg->error_code);
> -}
> -
> -int main(int argc, char **argv)
> -{
> -	int count = 10;
> -	char *pattern = "*";
> -	xcb_connection_t *c = xcb_connect(NULL, NULL);
> -	xcb_reply_handlers_t h;
> -        xcb_reply_handlers_init(c, &h);
> -
> -	if(argc > 1)
> -		count = atoi(argv[1]);
> -	if(argc > 2)
> -		pattern = argv[2];
> -
> -	xcb_reply_add_handler(&h, xcb_list_fonts_with_info(c, count, strlen(pattern), pattern).sequence, fontinfo_handler, 0);
> -	pthread_mutex_lock(&lock);
> -	xcb_reply_start_thread(&h);
> -	pthread_cond_wait(&cond, &lock);
> -	xcb_reply_stop_thread(&h);
> -	pthread_mutex_unlock(&lock);
> -
> -	xcb_disconnect(c);
> -	exit(0);
> -}
> diff --git a/reply/xcb-reply.pc.in b/reply/xcb-reply.pc.in
> deleted file mode 100644
> index 3299a5f..0000000
> --- a/reply/xcb-reply.pc.in
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -prefix=@prefix@
> -exec_prefix=@exec_prefix@
> -libdir=@libdir@
> -includedir=@includedir@
> -
> -Name: XCB Reply library
> -Description: XCB reply convenience library
> -Version: @PACKAGE_VERSION@
> -Requires: xcb
> -Libs: -L${libdir} -lxcb-reply @LIBS@
> -Cflags: -I${includedir}
> diff --git a/reply/xcb_reply.h b/reply/xcb_reply.h
> deleted file mode 100644
> index 71d07ac..0000000
> --- a/reply/xcb_reply.h
> +++ /dev/null
> @@ -1,122 +0,0 @@
> -/*
> - * Copyright (C) 2008 Julien Danjou <julien at danjou.info>
> - *
> - * Permission is hereby granted, free of charge, to any person
> - * obtaining a copy of this software and associated documentation
> - * files (the "Software"), to deal in the Software without
> - * restriction, including without limitation the rights to use, copy,
> - * modify, merge, publish, distribute, sublicense, and/or sell copies
> - * of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - * Except as contained in this notice, the names of the authors or
> - * their institutions shall not be used in advertising or otherwise to
> - * promote the sale, use or other dealings in this Software without
> - * prior written authorization from the authors.
> - */
> -
> -/**
> - * @defgroup xcb__reply_t XCB Reply Functions
> - *
> - * These functions ease the usage of asynchronous possibility of XCB about
> - * the reply retrieve of sent requests.
> - *
> - * @{
> - */
> -
> -#ifndef __XCB_REPLY_H__
> -#define __XCB_REPLY_H__
> -
> -#include <xcb/xcb.h>
> -#include <pthread.h>
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -typedef void (*xcb_generic_reply_handler_t)(void *data, xcb_connection_t *c, xcb_generic_reply_t *reply, xcb_generic_error_t *error);
> -
> -struct xcb_reply_node
> -{
> -    struct xcb_reply_node *next;
> -    unsigned int request;
> -    xcb_generic_reply_handler_t handler;
> -    void *data;
> -    char handled;
> -};
> -
> -struct xcb_reply_handlers
> -{
> -    pthread_mutex_t lock;
> -    pthread_cond_t cond;
> -    struct xcb_reply_node *head;
> -    xcb_connection_t *c;
> -    pthread_t thread;
> -};
> -
> -typedef struct xcb_reply_handlers xcb_reply_handlers_t;
> -
> -/**
> - * @brief Initialize a reply handlers structure.
> - * @param c The connection to the X server.
> - * @param h The reply handlers.
> - */
> -void xcb_reply_handlers_init(xcb_connection_t *c, xcb_reply_handlers_t *h);
> -
> -/**
> - * @brief Get the connection to the X server used in reply handlers.
> - * @param h The reply handlers data structure.
> - * @return The connection to the X server.
> - */
> -xcb_connection_t *xcb_reply_get_xcb_connection(xcb_reply_handlers_t *h);
> -
> -/**
> - * @brief Poll for reply using reply handlers.
> - * @param h The reply handlers data structure.
> - * @return The value return by the handler callback function, or 0 if no
> - * handler was found.
> - */
> -int xcb_reply_poll_for_reply(xcb_reply_handlers_t *h);
> -
> -/**
> - * @brief Start reply handling thread.
> - * This thread will run forever until it is stop with xcb_reply_stop_thread.
> - * @param h The reply handlers.
> - */
> -void xcb_reply_start_thread(xcb_reply_handlers_t *h);
> -
> -/**
> - * @brief Stop reply handling thread.
> - * @param h The reply handlers.
> - */
> -void xcb_reply_stop_thread(xcb_reply_handlers_t *h);
> -
> -/**
> - * @brief Add a reply handler.
> - * @param h The reply handlers data structure to fill.
> - * @param request The request identifier.
> - * @param handler The handler to call for this request.
> - * @param data Optional data passed to the callback function handling request.
> - */
> -void xcb_reply_add_handler(xcb_reply_handlers_t *h, unsigned int request, xcb_generic_reply_handler_t handler, void *data);
> -
> -#ifdef __cplusplus
> -}
> -#endif
> -
> -/**
> - * @}
> - */
> -
> -#endif /* __XCB_REPLY_H__ */
> -- 
> 1.7.0
>
>


More information about the Xcb mailing list