[Xcb-commit] 3 commits - Makefile.am README configure.ac event wm xcb-util-common.h
Julien Danjou
jdanjou at kemper.freedesktop.org
Thu Apr 2 03:16:21 PDT 2009
Makefile.am | 2
README | 1
configure.ac | 1
event/event.c | 228 ++++++++++++++++++++++++++++++++++
event/xcb_event.h | 23 +++
wm/.gitignore | 1
wm/Makefile.am | 46 ------
wm/manage.c | 146 ---------------------
wm/reply_formats.c | 353 -----------------------------------------------------
wm/reply_formats.h | 31 ----
wm/table.c | 89 -------------
wm/xcb-wm.pc.in | 11 -
wm/xcb_wm.h | 57 --------
wm/xcbwm-test.c | 260 ---------------------------------------
xcb-util-common.h | 33 ++++
15 files changed, 285 insertions(+), 997 deletions(-)
New commits:
commit 4c9a707f472e49bc3005354db265a0214071d46b
Author: Julien Danjou <julien at danjou.info>
Date: Thu Apr 2 12:13:35 2009 +0200
wm: remove
This has never worked, and is not maintained nor developed anymore.
Signed-off-by: Julien Danjou <julien at danjou.info>
diff --git a/Makefile.am b/Makefile.am
index 250beca..80483ab 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
MAINTAINERCLEANFILES = Makefile.in
-SUBDIRS = atom aux event property icccm image keysyms reply wm renderutil
+SUBDIRS = atom aux event property icccm image keysyms reply renderutil
diff --git a/README b/README
index 5a31b5e..534a0be 100644
--- a/README
+++ b/README
@@ -18,7 +18,6 @@ icccm: Both client and window-manager helpers for ICCCM.
keysyms: Standard X key constants and conversion to/from keycodes.
event: Callback X event handling.
image: Port of Xlib's XImage and XShmImage functions.
-wm: Framework for window manager implementation.
If you find any of these libraries useful, please let us know what
you're using and why you aren't in a mental hospital yet. We'd welcome
diff --git a/configure.ac b/configure.ac
index e4d16f9..a67cbcc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -66,7 +66,6 @@ AC_OUTPUT([Makefile
keysyms/Makefile keysyms/xcb-keysyms.pc
property/Makefile property/xcb-property.pc
icccm/Makefile icccm/xcb-icccm.pc
- wm/Makefile wm/xcb-wm.pc
renderutil/Makefile renderutil/xcb-renderutil.pc
xcb_util_intro
])
diff --git a/wm/.gitignore b/wm/.gitignore
deleted file mode 100644
index a879c0f..0000000
--- a/wm/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-xcbwm-test
diff --git a/wm/Makefile.am b/wm/Makefile.am
deleted file mode 100644
index 03df8f9..0000000
--- a/wm/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-
-MAINTAINERCLEANFILES = Makefile.in
-
-lib_LTLIBRARIES = libxcb-wm.la
-
-xcbinclude_HEADERS = xcb_wm.h
-
-AM_CFLAGS = $(CWARNFLAGS)
-
-XCB_XCBWM_LIBS = libxcb-wm.la
-
-libxcb_wm_la_SOURCES = manage.c table.c
-libxcb_wm_la_CPPFLAGS = $(XCB_CFLAGS) \
- $(XCB_AUX_CFLAGS) \
- $(XCB_ATOM_CFLAGS) \
- $(XCB_EVENT_CFLAGS) \
- $(XCB_PROPERTY_CFLAGS) \
- $(XCB_ICCCM_CFLAGS)
-libxcb_wm_la_LIBADD = $(XCB_LIBS) \
- $(XCB_AUX_LIBS) \
- $(XCB_ATOM_LIBS) \
- $(XCB_EVENT_LIBS) \
- $(XCB_PROPERTY_LIBS) \
- $(XCB_ICCCM_LIBS)
-
-pkgconfig_DATA = xcb-wm.pc
-
-EXTRA_DIST = xcb-wm.pc.in
-
-noinst_PROGRAMS = xcbwm-test
-
-xcbwm_test_SOURCES = xcbwm-test.c reply_formats.c reply_formats.h
-xcbwm_test_CPPFLAGS = $(XCB_CFLAGS) \
- $(XCB_AUX_CFLAGS) \
- $(XCB_ATOM_CFLAGS) \
- $(XCB_EVENT_CFLAGS) \
- $(XCB_PROPERTY_CFLAGS) \
- $(XCB_ICCCM_CFLAGS)
-xcbwm_test_LDADD = $(XCB_LIBS) \
- $(XCB_ATOM_LIBS) \
- $(XCB_AUX_LIBS) \
- $(XCB_EVENT_LIBS) \
- $(XCB_PROPERTY_LIBS) \
- $(XCB_ICCCM_LIBS) \
- $(XCB_XCBWM_LIBS) \
- -lpthread
diff --git a/wm/manage.c b/wm/manage.c
deleted file mode 100644
index c4349f7..0000000
--- a/wm/manage.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright © 2008 Ian Osgood <iano at quirkster.com>
- * Copyright © 2008 Josh Triplett <josh at freedesktop.org>
- * Copyright © 2008 Thomas Hunger <hto at arco.de>
- * Copyright © 2008 Torri Vincent <vtorri at univ-evry.fr>
- *
- * 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 <stdio.h>
-#include "xcb_wm.h"
-
-table_t *byChild = 0;
-table_t *byParent = 0;
-
-void manage_window(xcb_property_handlers_t *prophs, xcb_connection_t *c, xcb_window_t window, window_attributes_t wa)
-{
- xcb_drawable_t d = { window };
- xcb_get_geometry_cookie_t geomc;
- xcb_get_geometry_reply_t *geom;
- xcb_get_window_attributes_reply_t *attr = 0;
- if(wa.tag == TAG_COOKIE)
- {
- attr = xcb_get_window_attributes_reply(c, wa.u.cookie, 0);
- if(!attr)
- return;
- if(attr->map_state != XCB_MAP_STATE_VIEWABLE)
- {
- printf("Window 0x%08x is not mapped. Ignoring.\n", window);
- free(attr);
- return;
- }
- wa.tag = TAG_VALUE;
- wa.u.override_redirect = attr->override_redirect;
- }
- if(!wa.u.override_redirect && table_get(byChild, window))
- {
- printf("Window 0x%08x already managed. Ignoring.\n", window);
- free(attr);
- return;
- }
- if(wa.u.override_redirect)
- {
- printf("Window 0x%08x has override-redirect set. Ignoring.\n", window);
- free(attr);
- return;
- }
- geomc = xcb_get_geometry(c, d);
- if(!attr)
- {
- wa.tag = TAG_COOKIE;
- wa.u.cookie = xcb_get_window_attributes(c, window);
- attr = xcb_get_window_attributes_reply(c, wa.u.cookie, 0);
- }
- geom = xcb_get_geometry_reply(c, geomc, 0);
- if(attr && geom)
- {
- reparent_window(c, window, attr->visual, geom->root, geom->depth, geom->x, geom->y, geom->width, geom->height);
- xcb_property_changed(prophs, XCB_PROPERTY_NEW_VALUE, window, WM_NAME);
- }
- free(attr);
- free(geom);
-}
-
-int handle_map_notify_event(void *prophs, xcb_connection_t *c, xcb_map_notify_event_t *e)
-{
- window_attributes_t wa = { TAG_VALUE };
- wa.u.override_redirect = e->override_redirect;
- printf("MapNotify for 0x%08x.\n", e->window);
- manage_window(prophs, c, e->window, wa);
- return 1;
-}
-
-int handle_unmap_notify_event(void *data, xcb_connection_t *c, xcb_unmap_notify_event_t *e)
-{
- client_window_t *client = table_remove(byChild, e->event);
- xcb_window_t root;
- printf("UnmapNotify for 0x%08x (received from 0x%08x): ", e->window, e->event);
- if(!client)
- {
- printf("not a managed window. Ignoring.\n");
- return 0;
- }
-
- root = xcb_setup_roots_iterator(xcb_get_setup(c)).data->root;
- printf("child of 0x%08x.\n", client->parent);
- xcb_reparent_window(c, client->child, root, 0, 0);
- xcb_destroy_window(c, client->parent);
- xcb_flush(c);
- table_remove(byParent, client->parent);
- free(client);
- return 1;
-}
-
-void manage_existing_windows(xcb_connection_t *c, xcb_property_handlers_t *prophs, xcb_window_t root)
-{
- xcb_query_tree_cookie_t wintree;
- xcb_query_tree_reply_t *rep;
- int i, len;
- xcb_window_t *children;
- xcb_get_window_attributes_cookie_t *cookies;
-
- wintree = xcb_query_tree(c, root);
- rep = xcb_query_tree_reply(c, wintree, 0);
- if(!rep)
- return;
- len = xcb_query_tree_children_length(rep);
- cookies = malloc(len * sizeof(*cookies));
- if(!cookies)
- {
- free(rep);
- return;
- }
- children = xcb_query_tree_children(rep);
- for(i = 0; i < len; ++i)
- cookies[i] = xcb_get_window_attributes(c, children[i]);
- for(i = 0; i < len; ++i)
- {
- window_attributes_t wa = { TAG_COOKIE, { cookies[i] } };
- manage_window(prophs, c, children[i], wa);
- }
- free(rep);
-}
diff --git a/wm/reply_formats.c b/wm/reply_formats.c
deleted file mode 100644
index 3702648..0000000
--- a/wm/reply_formats.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright © 2008 Bart Massey <bart at cs.pdx.edu>
- * Copyright © 2008 Jamey Sharp <jamey at minilop.net>
- *
- * 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 <stdio.h>
-#include "reply_formats.h"
-
-#define WINFMT "0x%08x"
-
-int format_get_window_attributes_reply(xcb_window_t wid, xcb_get_window_attributes_reply_t *reply)
-{
- if(!reply)
- {
- fprintf(stderr, "Failed to get attributes for window " WINFMT ".\n",
- (unsigned int) wid);
- return 0;
- }
-
- printf("Window " WINFMT " has attributes:\n"
- " backingStore = %d\n"
- " visualID = %#x\n"
- " class = %d\n"
- " bitGravity = %d\n"
- " winGravity = %d\n"
- " backingBitPlanes = 0x%08x\n"
- " backingPixel = %d\n"
- " saveUnder = %d\n"
- " mapInstalled = %d\n"
- " mapState = %d\n"
- " override = %d\n"
- " colormap = 0x%08x\n"
- " allEventMasks = 0x%08x\n"
- " yourEventMask = 0x%08x\n"
- " doNotPropagateMask = 0x%08x\n",
- (unsigned int) wid,
- reply->backing_store,
- (unsigned int) reply->visual,
- reply->_class,
- reply->bit_gravity,
- reply->win_gravity,
- reply->backing_planes,
- reply->backing_pixel,
- reply->save_under,
- reply->map_is_installed,
- reply->map_state,
- reply->override_redirect,
- (unsigned int) reply->colormap,
- (unsigned int) reply->all_event_masks,
- (unsigned int) reply->your_event_mask,
- reply->do_not_propagate_mask);
-
- fflush(stdout);
- return 1;
-}
-
-int format_get_geometry_reply(xcb_window_t wid, xcb_get_geometry_reply_t *reply)
-{
- if(!reply)
- {
- fprintf(stderr, "Failed to get geometry for window " WINFMT ".\n",
- (unsigned int) wid);
- return 0;
- }
-
- printf("Geometry for window " WINFMT ": %dx%d%+d%+d\n",
- (unsigned int) wid,
- reply->width,
- reply->height,
- reply->x,
- reply->y);
-
- fflush(stdout);
- return 1;
-}
-
-int format_query_tree_reply(xcb_window_t wid, xcb_query_tree_reply_t *reply)
-{
- int i;
-
- if(!reply)
- {
- fprintf(stderr, "Failed to query tree for window " WINFMT ".\n",
- (unsigned int) wid);
- return 0;
- }
-
- printf("Window " WINFMT " has parent " WINFMT ", root " WINFMT ", and %d children%c\n",
- (unsigned int) wid,
- (unsigned int) reply->parent,
- (unsigned int) reply->root,
- (unsigned int) reply->children_len,
- reply->children_len ? ':' : '.');
-
- for(i = 0; i < reply->children_len; ++i)
- printf(" window " WINFMT "\n",
- (unsigned int) xcb_query_tree_children(reply)[i]);
-
- fflush(stdout);
- return 1;
-}
-
-static const char *labelError[] = {
- "Success",
- "BadRequest",
- "BadValue",
- "BadWindow",
- "BadPixmap",
- "BadAtom",
- "BadCursor",
- "BadFont",
- "BadMatch",
- "BadDrawable",
- "BadAccess",
- "BadAlloc",
- "BadColor",
- "BadGC",
- "BadIDChoice",
- "BadName",
- "BadLength",
- "BadImplementation",
-};
-
-static const char *labelRequest[] = {
- "no request",
- "CreateWindow",
- "ChangeWindowAttributes",
- "GetWindowAttributes",
- "DestroyWindow",
- "DestroySubwindows",
- "ChangeSaveSet",
- "ReparentWindow",
- "MapWindow",
- "MapSubwindows",
- "UnmapWindow",
- "UnmapSubwindows",
- "ConfigureWindow",
- "CirculateWindow",
- "GetGeometry",
- "QueryTree",
- "InternAtom",
- "GetAtomName",
- "ChangeProperty",
- "DeleteProperty",
- "GetProperty",
- "ListProperties",
- "SetSelectionOwner",
- "GetSelectionOwner",
- "ConvertSelection",
- "SendEvent",
- "GrabPointer",
- "UngrabPointer",
- "GrabButton",
- "UngrabButton",
- "ChangeActivePointerGrab",
- "GrabKeyboard",
- "UngrabKeyboard",
- "GrabKey",
- "UngrabKey",
- "AllowEvents",
- "GrabServer",
- "UngrabServer",
- "QueryPointer",
- "GetMotionEvents",
- "TranslateCoords",
- "WarpPointer",
- "SetInputFocus",
- "GetInputFocus",
- "QueryKeymap",
- "OpenFont",
- "CloseFont",
- "QueryFont",
- "QueryTextExtents",
- "ListFonts",
- "ListFontsWithInfo",
- "SetFontPath",
- "GetFontPath",
- "CreatePixmap",
- "FreePixmap",
- "CreateGC",
- "ChangeGC",
- "CopyGC",
- "SetDashes",
- "SetClipRectangles",
- "FreeGC",
- "ClearArea",
- "CopyArea",
- "CopyPlane",
- "PolyPoint",
- "PolyLine",
- "PolySegment",
- "PolyRectangle",
- "PolyArc",
- "FillPoly",
- "PolyFillRectangle",
- "PolyFillArc",
- "PutImage",
- "GetImage",
- "PolyText",
- "PolyText",
- "ImageText",
- "ImageText",
- "CreateColormap",
- "FreeColormap",
- "CopyColormapAndFree",
- "InstallColormap",
- "UninstallColormap",
- "ListInstalledColormaps",
- "AllocColor",
- "AllocNamedColor",
- "AllocColorCells",
- "AllocColorPlanes",
- "FreeColors",
- "StoreColors",
- "StoreNamedColor",
- "QueryColors",
- "LookupColor",
- "CreateCursor",
- "CreateGlyphCursor",
- "FreeCursor",
- "RecolorCursor",
- "QueryBestSize",
- "QueryExtension",
- "ListExtensions",
- "ChangeKeyboardMapping",
- "GetKeyboardMapping",
- "ChangeKeyboardControl",
- "GetKeyboardControl",
- "Bell",
- "ChangePointerControl",
- "GetPointerControl",
- "SetScreenSaver",
- "GetScreenSaver",
- "ChangeHosts",
- "ListHosts",
- "SetAccessControl",
- "SetCloseDownMode",
- "KillClient",
- "RotateProperties",
- "ForceScreenSaver",
- "SetPointerMapping",
- "GetPointerMapping",
- "SetModifierMapping",
- "GetModifierMapping",
- "major 120",
- "major 121",
- "major 122",
- "major 123",
- "major 124",
- "major 125",
- "major 126",
- "NoOperation",
-};
-
-static const char *labelEvent[] = {
- "error",
- "reply",
- "KeyPress",
- "KeyRelease",
- "ButtonPress",
- "ButtonRelease",
- "MotionNotify",
- "EnterNotify",
- "LeaveNotify",
- "FocusIn",
- "FocusOut",
- "KeymapNotify",
- "Expose",
- "GraphicsExpose",
- "NoExpose",
- "VisibilityNotify",
- "CreateNotify",
- "DestroyNotify",
- "UnmapNotify",
- "MapNotify",
- "MapRequest",
- "ReparentNotify",
- "ConfigureNotify",
- "ConfigureRequest",
- "GravityNotify",
- "ResizeRequest",
- "CirculateNotify",
- "CirculateRequest",
- "PropertyNotify",
- "SelectionClear",
- "SelectionRequest",
- "SelectionNotify",
- "ColormapNotify",
- "ClientMessage",
- "MappingNotify",
-};
-
-static const char *labelSendEvent[] = {
- "",
- " (from SendEvent)",
-};
-
-int format_event(xcb_generic_event_t *e)
-{
- uint8_t sendEvent;
- uint16_t seqnum;
-
- sendEvent = (e->response_type & 0x80) ? 1 : 0;
- e->response_type &= ~0x80;
- seqnum = *((uint16_t *) e + 1);
-
- switch(e->response_type)
- {
- case 0:
- printf("Error %s on seqnum %d (%s).\n",
- labelError[*((uint8_t *) e + 1)],
- seqnum,
- labelRequest[*((uint8_t *) e + 10)]);
- break;
- default:
- printf("Event %s following seqnum %d%s.\n",
- labelEvent[e->response_type],
- seqnum,
- labelSendEvent[sendEvent]);
- break;
- case XCB_KEYMAP_NOTIFY:
- printf("Event %s%s.\n",
- labelEvent[e->response_type],
- labelSendEvent[sendEvent]);
- break;
- }
-
- fflush(stdout);
- return 1;
-}
diff --git a/wm/reply_formats.h b/wm/reply_formats.h
deleted file mode 100644
index 38530bb..0000000
--- a/wm/reply_formats.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2001-2002 Bart Massey and Jamey Sharp.
- * All Rights Reserved. See the file COPYING in this directory
- * for licensing information.
- */
-
-#ifndef REPLY_FORMATS_H
-#define REPLY_FORMATS_H
-
-#include <xcb/xcb.h>
-
-int format_get_window_attributes_reply(xcb_window_t wid, xcb_get_window_attributes_reply_t *reply);
-int format_get_geometry_reply(xcb_window_t wid, xcb_get_geometry_reply_t *reply);
-int format_query_tree_reply(xcb_window_t wid, xcb_query_tree_reply_t *reply);
-int format_event(xcb_generic_event_t *e);
-
-#if 0 /* not yet ready */
-int formatButtonReleaseEvent(void *data, xcb_connection_t *c, xcb_button_release_event_t *event);
-int formatEnterNotifyEvent(void *data, xcb_connection_t *c, xcb_enter_notify_event_t *event);
-int formatExposeEvent(void *data, xcb_connection_t *c, xcb_expose_event_t *event);
-int formatDestroyNotifyEvent(void *data, xcb_connection_t *c, xcb_destroy_notify_event_t *event);
-int formatUnmapNotifyEvent(void *data, xcb_connection_t *c, xcb_unmap_notify_event_t *event);
-int formatMapNotifyEvent(void *data, xcb_connection_t *c, xcb_map_notify_event_t *event);
-int formatReparentNotifyEvent(void *data, xcb_connection_t *c, xcb_reparent_notify_event_t *event);
-int formatConfigureNotifyEvent(void *data, xcb_connection_t *c, xcb_configure_notify_event_t *event);
-int formatGravityNotifyEvent(void *data, xcb_connection_t *c, xcb_gravity_notify_event_t *event);
-int formatCirculateNotifyEvent(void *data, xcb_connection_t *c, xcb_circulate_notify_event_t *event);
-int formatClientMessageEvent(void *data, xcb_connection_t *c, xcb_client_message_event_t *event);
-#endif
-
-#endif /* REPLY_FORMATS_H */
diff --git a/wm/table.c b/wm/table.c
deleted file mode 100644
index 945d401..0000000
--- a/wm/table.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright © 2008 Ian Osgood <iano at quirkster.com>
- * Copyright © 2008 Josh Triplett <josh at freedesktop.org>
- * Copyright © 2008 Thomas Hunger <hto at arco.de>
- *
- * 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_wm.h"
-
-typedef struct node node;
-struct node {
- node *next;
- uint32_t key;
- void *value;
-};
-
-struct table_t {
- node *head;
-};
-
-table_t *alloc_table()
-{
- return calloc(1, sizeof(table_t));
-}
-
-void free_table(table_t *table)
-{
- free(table);
-}
-
-int table_put(table_t *table, uint32_t key, void *value)
-{
- node *record = malloc(sizeof(node));
- if(!record)
- return 0;
- record->next = table->head;
- record->key = key;
- record->value = value;
- table->head = record;
- return 1;
-}
-
-void *table_get(table_t *table, uint32_t key)
-{
- node *cur;
- for(cur = table->head; cur; cur = cur->next)
- if(cur->key == key)
- return cur->value;
- return 0;
-}
-
-void *table_remove(table_t *table, uint32_t key)
-{
- node **cur;
- for(cur = &table->head; *cur; cur = &(*cur)->next)
- if((*cur)->key == key)
- {
- node *tmp = *cur;
- void *ret = tmp->value;
- *cur = (*cur)->next;
- free(tmp);
- return ret;
- }
- return 0;
-}
diff --git a/wm/xcb-wm.pc.in b/wm/xcb-wm.pc.in
deleted file mode 100644
index 0ed613a..0000000
--- a/wm/xcb-wm.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: XCB WM library
-Description: XCB window manager convenience library
-Version: @PACKAGE_VERSION@
-Requires: xcb xcb-atom xcb-event xcb-property xcb-icccm
-Libs: -L${libdir} -lxcb-wm @LIBS@
-Cflags: -I${includedir}
diff --git a/wm/xcb_wm.h b/wm/xcb_wm.h
deleted file mode 100644
index 7581df7..0000000
--- a/wm/xcb_wm.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef __XCB_WM_H__
-#define __XCB_WM_H__
-
-#include <xcb/xcb.h>
-#include "xcb_atom.h"
-#include "xcb_property.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-void reparent_window(xcb_connection_t *c, xcb_window_t child,
- xcb_visualid_t v, xcb_window_t r, uint8_t d,
- int16_t x, int16_t y, uint16_t width, uint16_t height);
-
-typedef struct {
- xcb_window_t child;
- xcb_window_t parent;
- int name_len;
- char *name;
- xcb_gcontext_t titlegc;
-} client_window_t;
-
-typedef struct {
- enum xcb_atom_fast_tag_t tag;
- union {
- xcb_get_window_attributes_cookie_t cookie;
- uint8_t override_redirect;
- } u;
-} window_attributes_t;
-
-void manage_window(xcb_property_handlers_t *prophs, xcb_connection_t *c, xcb_window_t window, window_attributes_t wa);
-int handle_map_notify_event(void *prophs, xcb_connection_t *c, xcb_map_notify_event_t *e);
-int handle_unmap_notify_event(void *data, xcb_connection_t *c, xcb_unmap_notify_event_t *e);
-void manage_existing_windows(xcb_connection_t *c, xcb_property_handlers_t *prophs, xcb_window_t root);
-
-typedef struct table_t table_t;
-
-table_t *alloc_table();
-void free_table(table_t *table);
-
-int table_put(table_t *table, uint32_t key, void *value);
-void *table_get(table_t *table, uint32_t key);
-void *table_remove(table_t *table, uint32_t key);
-
-extern table_t *byChild;
-extern table_t *byParent;
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __XCB_WM_H__ */
diff --git a/wm/xcbwm-test.c b/wm/xcbwm-test.c
deleted file mode 100644
index a711790..0000000
--- a/wm/xcbwm-test.c
+++ /dev/null
@@ -1,260 +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 <pthread.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-
-#include <xcb/xcb.h>
-#include "reply_formats.h"
-#include "xcb_aux.h"
-#include "xcb_event.h"
-#include "xcb_atom.h"
-#include "xcb_icccm.h"
-#include "xcb_wm.h"
-
-static const int TOP = 20;
-static const int LEFT = 5;
-static const int BOTTOM = 5;
-static const int RIGHT = 5;
-
-static const int TEST_THREADS = 1;
-static const int TEST_WATCH_ROOT = 1;
-
-static int16_t move_from_x = -1;
-static int16_t move_from_y = -1;
-
-static int handleEvent(void *ignored, xcb_connection_t *c, xcb_generic_event_t *e)
-{
- return format_event(e);
-}
-
-static int handleButtonPressEvent(void *data, xcb_connection_t *c, xcb_button_press_event_t *e)
-{
- if(move_from_x != -1 && move_from_y != -1)
- {
- printf("Weird. Got ButtonPress after ButtonPress.\n");
- return 0;
- }
- move_from_x = e->root_x;
- move_from_y = e->root_y;
- return 1;
-}
-
-static int handleButtonReleaseEvent(void *data, xcb_connection_t *c, xcb_button_release_event_t *e)
-{
- uint32_t values[2];
- if(move_from_x == -1 && move_from_y == -1)
- {
- printf("Weird. Got ButtonRelease without ButtonPress.\n");
- return 0;
- }
- values[0] = /* x */ e->root_x;
- values[1] = /* y */ e->root_y;
- xcb_configure_window(c, e->event, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, values);
- xcb_flush(c);
- move_from_x = -1;
- move_from_y = -1;
- return 1;
-}
-
-static int addClientWindow(xcb_window_t child, xcb_window_t parent, xcb_gcontext_t titlegc)
-{
- int success;
- client_window_t *record = malloc(sizeof(client_window_t));
- assert(record);
- record->child = child;
- record->parent = parent;
- record->name_len = 0;
- record->name = 0;
- record->titlegc = titlegc;
- success = table_put(byParent, parent, record) &&
- table_put(byChild, child, record);
- assert(success);
- return 1;
-}
-
-void reparent_window(xcb_connection_t *c, xcb_window_t child,
- xcb_visualid_t v, xcb_window_t r, uint8_t d,
- int16_t x, int16_t y, uint16_t width, uint16_t height)
-{
- xcb_window_t w;
- xcb_drawable_t drawable;
- uint32_t mask = 0;
- uint32_t values[3];
- xcb_screen_t *root = xcb_setup_roots_iterator(xcb_get_setup(c)).data;
- xcb_gcontext_t titlegc;
-
- w = xcb_generate_id(c);
-
- mask |= XCB_CW_BACK_PIXEL;
- values[0] = root->white_pixel;
-
- mask |= XCB_CW_OVERRIDE_REDIRECT;
- values[1] = 1;
-
- mask |= XCB_CW_EVENT_MASK;
- values[2] = XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE
- | XCB_EVENT_MASK_EXPOSURE /* | XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW */;
-
- printf("Reparenting 0x%08x under 0x%08x.\n", child, w);
- xcb_create_window(c, d, w, r, x, y,
- width + LEFT + RIGHT, height + TOP + BOTTOM,
- /* border_width */ 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, v, mask, values);
- xcb_change_save_set(c, XCB_SET_MODE_INSERT, child);
- xcb_map_window(c, w);
-
- titlegc = xcb_generate_id(c);
-
- mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
- values[0] = root->black_pixel;
- values[1] = root->white_pixel;
- drawable = w;
- xcb_create_gc(c, titlegc, drawable, mask, values);
- addClientWindow(child, w, titlegc);
-
- xcb_reparent_window(c, child, w, LEFT - 1, TOP - 1);
-
- mask = XCB_CW_EVENT_MASK;
- values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
- xcb_change_window_attributes(c, child, mask, values);
-
- xcb_flush(c);
-}
-
-static void redrawWindow(xcb_connection_t *c, client_window_t *client)
-{
- xcb_drawable_t d = { client->parent };
- if(!client->name_len)
- return;
- xcb_clear_area(c, 0, d, 0, 0, 0, 0);
- xcb_image_text_8(c, client->name_len, d, client->titlegc,
- LEFT - 1, TOP - 4, client->name);
- xcb_flush(c);
-}
-
-static int handleExposeEvent(void *data, xcb_connection_t *c, xcb_expose_event_t *e)
-{
- client_window_t *client = table_get(byParent, e->window);
- if(!client || e->count != 0)
- return 1;
- redrawWindow(c, client);
- return 1;
-}
-
-static int handleWMNameChange(void *data, xcb_connection_t *c, uint8_t state, xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *prop)
-{
- client_window_t *client = table_get(byChild, window);
- printf("WM_NAME change: Window 0x%08x ", window);
- if(!client)
- {
- printf("is not being managed.\n");
- return 0;
- }
- if(client->name)
- {
- printf("was named \"%.*s\"; now ", client->name_len, client->name);
- free(client->name);
- }
- if(!prop)
- {
- client->name_len = 0;
- client->name = 0;
- printf("has no name.\n");
- return 1;
- }
-
- client->name_len = xcb_get_property_value_length(prop);
- client->name = malloc(client->name_len);
- assert(client->name);
- strncpy(client->name, xcb_get_property_value(prop), client->name_len);
- printf("is named \"%.*s\".\n", client->name_len, client->name);
-
- redrawWindow(c, client);
- return 1;
-}
-
-int main(int argc, char **argv)
-{
- xcb_connection_t *c;
- xcb_event_handlers_t evenths;
- xcb_property_handlers_t prophs;
- xcb_window_t root;
- pthread_t event_thread;
- int screen_nbr;
- int i;
-
- byChild = alloc_table();
- byParent = alloc_table();
-
- c = xcb_connect(NULL, &screen_nbr);
-
- xcb_event_handlers_init(c, &evenths);
-
- for(i = 2; i < 128; ++i)
- xcb_event_set_handler(&evenths, i, handleEvent, 0);
- for(i = 0; i < 256; ++i)
- xcb_event_set_error_handler(&evenths, i, (xcb_generic_error_handler_t) handleEvent, 0);
- xcb_event_set_button_press_handler(&evenths, handleButtonPressEvent, 0);
- xcb_event_set_button_release_handler(&evenths, handleButtonReleaseEvent, 0);
- xcb_event_set_unmap_notify_handler(&evenths, handle_unmap_notify_event, 0);
- xcb_event_set_expose_handler(&evenths, handleExposeEvent, 0);
-
- xcb_property_handlers_init(&prophs, &evenths);
- xcb_event_set_map_notify_handler(&evenths, handle_map_notify_event, &prophs);
- xcb_watch_wm_name(&prophs, 40, handleWMNameChange, 0);
-
- if(TEST_THREADS)
- {
- pthread_create(&event_thread, 0, (void *(*)(void *))xcb_event_wait_for_event_loop, &evenths);
- }
-
- root = xcb_aux_get_screen(c, screen_nbr)->root;
-
- {
- uint32_t mask = XCB_CW_EVENT_MASK;
- uint32_t values[] = { XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE };
- xcb_change_window_attributes(c, root, mask, values);
- }
- xcb_flush(c);
-
- manage_existing_windows(c, &prophs, root);
-
- /* Terminate only when the event loop terminates */
- if(TEST_THREADS)
- pthread_join(event_thread, 0);
- else
- xcb_event_wait_for_event_loop(&evenths);
-
- exit(0);
- /*NOTREACHED*/
-}
commit 8e874377416b79c9da4c6d6aade6e50eb686df11
Author: Julien Danjou <julien at danjou.info>
Date: Thu Apr 2 12:11:01 2009 +0200
event: add functions to convert event/errors to labels
Signed-off-by: Julien Danjou <julien at danjou.info>
diff --git a/event/event.c b/event/event.c
index 97af53b..3d8fd7c 100644
--- a/event/event.c
+++ b/event/event.c
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include "xcb_event.h"
+#include "../xcb-util-common.h"
void
xcb_event_handlers_init(xcb_connection_t *c, xcb_event_handlers_t *evenths)
@@ -115,3 +116,230 @@ xcb_event_set_error_handler(xcb_event_handlers_t *evenths, int error, xcb_generi
{
set_handler((xcb_generic_event_handler_t) handler, data, get_error_handler(evenths, error));
}
+
+static const char *labelError[] =
+{
+ "Success",
+ "BadRequest",
+ "BadValue",
+ "BadWindow",
+ "BadPixmap",
+ "BadAtom",
+ "BadCursor",
+ "BadFont",
+ "BadMatch",
+ "BadDrawable",
+ "BadAccess",
+ "BadAlloc",
+ "BadColor",
+ "BadGC",
+ "BadIDChoice",
+ "BadName",
+ "BadLength",
+ "BadImplementation",
+};
+
+static const char *labelRequest[] =
+{
+ "no request",
+ "CreateWindow",
+ "ChangeWindowAttributes",
+ "GetWindowAttributes",
+ "DestroyWindow",
+ "DestroySubwindows",
+ "ChangeSaveSet",
+ "ReparentWindow",
+ "MapWindow",
+ "MapSubwindows",
+ "UnmapWindow",
+ "UnmapSubwindows",
+ "ConfigureWindow",
+ "CirculateWindow",
+ "GetGeometry",
+ "QueryTree",
+ "InternAtom",
+ "GetAtomName",
+ "ChangeProperty",
+ "DeleteProperty",
+ "GetProperty",
+ "ListProperties",
+ "SetSelectionOwner",
+ "GetSelectionOwner",
+ "ConvertSelection",
+ "SendEvent",
+ "GrabPointer",
+ "UngrabPointer",
+ "GrabButton",
+ "UngrabButton",
+ "ChangeActivePointerGrab",
+ "GrabKeyboard",
+ "UngrabKeyboard",
+ "GrabKey",
+ "UngrabKey",
+ "AllowEvents",
+ "GrabServer",
+ "UngrabServer",
+ "QueryPointer",
+ "GetMotionEvents",
+ "TranslateCoords",
+ "WarpPointer",
+ "SetInputFocus",
+ "GetInputFocus",
+ "QueryKeymap",
+ "OpenFont",
+ "CloseFont",
+ "QueryFont",
+ "QueryTextExtents",
+ "ListFonts",
+ "ListFontsWithInfo",
+ "SetFontPath",
+ "GetFontPath",
+ "CreatePixmap",
+ "FreePixmap",
+ "CreateGC",
+ "ChangeGC",
+ "CopyGC",
+ "SetDashes",
+ "SetClipRectangles",
+ "FreeGC",
+ "ClearArea",
+ "CopyArea",
+ "CopyPlane",
+ "PolyPoint",
+ "PolyLine",
+ "PolySegment",
+ "PolyRectangle",
+ "PolyArc",
+ "FillPoly",
+ "PolyFillRectangle",
+ "PolyFillArc",
+ "PutImage",
+ "GetImage",
+ "PolyText",
+ "PolyText",
+ "ImageText",
+ "ImageText",
+ "CreateColormap",
+ "FreeColormap",
+ "CopyColormapAndFree",
+ "InstallColormap",
+ "UninstallColormap",
+ "ListInstalledColormaps",
+ "AllocColor",
+ "AllocNamedColor",
+ "AllocColorCells",
+ "AllocColorPlanes",
+ "FreeColors",
+ "StoreColors",
+ "StoreNamedColor",
+ "QueryColors",
+ "LookupColor",
+ "CreateCursor",
+ "CreateGlyphCursor",
+ "FreeCursor",
+ "RecolorCursor",
+ "QueryBestSize",
+ "QueryExtension",
+ "ListExtensions",
+ "ChangeKeyboardMapping",
+ "GetKeyboardMapping",
+ "ChangeKeyboardControl",
+ "GetKeyboardControl",
+ "Bell",
+ "ChangePointerControl",
+ "GetPointerControl",
+ "SetScreenSaver",
+ "GetScreenSaver",
+ "ChangeHosts",
+ "ListHosts",
+ "SetAccessControl",
+ "SetCloseDownMode",
+ "KillClient",
+ "RotateProperties",
+ "ForceScreenSaver",
+ "SetPointerMapping",
+ "GetPointerMapping",
+ "SetModifierMapping",
+ "GetModifierMapping",
+ "major 120",
+ "major 121",
+ "major 122",
+ "major 123",
+ "major 124",
+ "major 125",
+ "major 126",
+ "NoOperation",
+};
+
+static const char *labelEvent[] =
+{
+ "error",
+ "reply",
+ "KeyPress",
+ "KeyRelease",
+ "ButtonPress",
+ "ButtonRelease",
+ "MotionNotify",
+ "EnterNotify",
+ "LeaveNotify",
+ "FocusIn",
+ "FocusOut",
+ "KeymapNotify",
+ "Expose",
+ "GraphicsExpose",
+ "NoExpose",
+ "VisibilityNotify",
+ "CreateNotify",
+ "DestroyNotify",
+ "UnmapNotify",
+ "MapNotify",
+ "MapRequest",
+ "ReparentNotify",
+ "ConfigureNotify",
+ "ConfigureRequest",
+ "GravityNotify",
+ "ResizeRequest",
+ "CirculateNotify",
+ "CirculateRequest",
+ "PropertyNotify",
+ "SelectionClear",
+ "SelectionRequest",
+ "SelectionNotify",
+ "ColormapNotify",
+ "ClientMessage",
+ "MappingNotify",
+};
+
+const char *
+xcb_event_get_label(const xcb_generic_event_t *e)
+{
+ uint32_t type = XCB_EVENT_RESPONSE_TYPE(e);
+ if(type < countof(labelEvent))
+ return labelEvent[type];
+ return NULL;
+}
+
+const char *
+xcb_event_get_error_label(const xcb_generic_event_t *e)
+{
+ /* Check that it's an error */
+ if(e->response_type == 0)
+ {
+ uint32_t type = XCB_EVENT_RESPONSE_TYPE(e) + 1;
+ if(type < countof(labelError))
+ return labelError[type];
+ }
+ return NULL;
+}
+
+const char *
+xcb_event_get_request_label(const xcb_generic_event_t *e)
+{
+ if(e->response_type == 0)
+ {
+ uint32_t type = XCB_EVENT_RESPONSE_TYPE(e) + 10;
+ if(type < countof(labelRequest))
+ return labelRequest[type];
+ }
+ return NULL;
+}
diff --git a/event/xcb_event.h b/event/xcb_event.h
index c2d1cd6..4324931 100644
--- a/event/xcb_event.h
+++ b/event/xcb_event.h
@@ -168,6 +168,29 @@ 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 reponse type to a label.
+ * @param e The event.
+ * @return A string with the event name, or NULL if unknown.
+ */
+const char * xcb_event_get_label(const xcb_generic_event_t *e);
+
+/**
+ * @brief Convert an event error type to a label.
+ * @param e The event.
+ * @return A string with the event name, or NULL if unknown or if the event is
+ * not an error.
+ */
+const char * xcb_event_get_error_label(const xcb_generic_event_t *e);
+
+/**
+ * @brief Convert an event request type to a label.
+ * @param e The event.
+ * @return A string with the event name, or NULL if unknown or if the event is
+ * not an error.
+ */
+const char * xcb_event_get_request_label(const xcb_generic_event_t *e);
+
#ifdef __cplusplus
}
#endif
commit 2af5698efb70c53091204b9cd44c31bdcce7c5a2
Author: Julien Danjou <julien at danjou.info>
Date: Thu Apr 2 12:01:26 2009 +0200
add a useful common header with common function/define
Signed-off-by: Julien Danjou <julien at danjou.info>
diff --git a/xcb-util-common.h b/xcb-util-common.h
new file mode 100644
index 0000000..b325bf5
--- /dev/null
+++ b/xcb-util-common.h
@@ -0,0 +1,33 @@
+/*
+ * Common useful header for xcb-util
+ *
+ * Copyright © 2009 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.
+ *
+ */
+
+#define ssizeof(foo) (ssize_t)sizeof(foo)
+#define countof(foo) (ssizeof(foo) / ssizeof(foo[0]))
More information about the xcb-commit
mailing list