[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