summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Triplett <josh@freedesktop.org>2006-02-18 16:49:41 -0800
committerJosh Triplett <josh@josh-mobile.localdomain>2006-02-18 16:49:41 -0800
commitd9709cda9f028b11fb0f6a9cef792a90222d3219 (patch)
treefe4e30bbb1f1c7b2668e730843fda067cf7c2a9b
Remove xcl and CVSROOT.
-rw-r--r--.cvsignore14
-rw-r--r--Doxyfile139
-rwxr-xr-xautogen.sh3
-rw-r--r--configure.ac33
-rw-r--r--keysyms/Makefile.am16
-rw-r--r--keysyms/keysyms.c378
-rw-r--r--keysyms/xcb-keysyms.pc.in11
-rw-r--r--keysyms/xcb_keysyms.h49
-rw-r--r--xcb_util_intro.in21
9 files changed, 664 insertions, 0 deletions
diff --git a/.cvsignore b/.cvsignore
new file mode 100644
index 0000000..ed2f649
--- /dev/null
+++ b/.cvsignore
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+libtool
+ltmain.sh
+missing
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..b915677
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,139 @@
+PROJECT_NAME = XCB Utility
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = doc/
+INPUT = xcb_util_intro image/
+IMAGE_PATH = doc/img
+OUTPUT_LANGUAGE = English
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+ENUM_VALUES_PER_LINE = 1
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = NO
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+HIDE_FRIEND_COMPOUNDS = YES
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+INTERNAL_DOCS = NO
+STRIP_CODE_COMMENTS = YES
+CASE_SENSE_NAMES = YES
+SHORT_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+VERBATIM_HEADERS = NO
+SHOW_INCLUDE_FILES = NO
+JAVADOC_AUTOBRIEF = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 2
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ALIASES =
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_JAVA = NO
+SHOW_USED_FILES = NO
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+INPUT_FILTER =
+FILTER_SOURCE_FILES = NO
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 2
+IGNORE_PREFIX =
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+GENERATE_LATEX = YES
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+GENERATE_MAN = YES
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = YES
+GENERATE_XML = YES
+XML_SCHEMA =
+XML_DTD =
+GENERATE_AUTOGEN_DEF = NO
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = NO
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+CLASS_DIAGRAMS = NO
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+CLASS_GRAPH = NO
+COLLABORATION_GRAPH = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = NO
+INCLUDED_BY_GRAPH = NO
+GRAPHICAL_HIERARCHY = NO
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 512
+MAX_DOT_GRAPH_HEIGHT = 512
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+SEARCHENGINE = NO
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..d68a142
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+autoreconf -v --install || exit 1
+./configure "$@"
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..4f5bbd7
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,33 @@
+AC_PREREQ(2.57)
+AC_INIT([xcb-util],0.1,[jamey@minilop.net])
+AC_CONFIG_SRCDIR([Makefile.am])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+
+AC_CHECK_PROGS(M4, m4)
+AC_CHECK_PROGS(GPERF, gperf, [no])
+if test $GPERF = "no"; then
+ AC_MSG_ERROR([Can't find gperf, please install it and try again])
+fi
+AC_PROG_CC
+AC_PROG_LIBTOOL
+
+xcbincludedir='${includedir}/X11/XCB'
+AC_SUBST(xcbincludedir)
+
+pkgconfigdir='${libdir}/pkgconfig'
+AC_SUBST(pkgconfigdir)
+
+PKG_CHECK_MODULES(XCB, xcb)
+
+AC_OUTPUT([Makefile
+ convenient/Makefile convenient/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
+ wm/Makefile wm/xcb-wm.pc
+ xcb_util_intro
+ ])
diff --git a/keysyms/Makefile.am b/keysyms/Makefile.am
new file mode 100644
index 0000000..1d602f3
--- /dev/null
+++ b/keysyms/Makefile.am
@@ -0,0 +1,16 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+lib_LTLIBRARIES = libXCBKeysyms.la
+
+xcbinclude_HEADERS = xcb_keysyms.h
+
+AM_CFLAGS = -Wall
+INCLUDES = $(XCB_CFLAGS)
+LDADD = $(XCB_LIBS)
+
+libXCBKeysyms_la_SOURCES = keysyms.c
+
+pkgconfig_DATA = xcb-keysyms.pc
+
+EXTRA_DIST=xcb-keysyms.pc.in
diff --git a/keysyms/keysyms.c b/keysyms/keysyms.c
new file mode 100644
index 0000000..f713450
--- /dev/null
+++ b/keysyms/keysyms.c
@@ -0,0 +1,378 @@
+#include <malloc.h>
+
+#include <X11/XCB/xcb.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#define XK_LATIN1
+#define XK_LATIN2
+#define XK_LATIN3
+#define XK_LATIN4
+#define XK_CYRILLIC
+#define XK_GREEK
+#define XK_ARMENIAN
+#include <X11/keysymdef.h>
+
+#include "xcb_keysyms.h"
+
+/* Private declaration */
+enum tag_t {
+ TAG_COOKIE,
+ TAG_VALUE
+};
+
+struct _XCBKeySymbols
+{
+ XCBConnection *c;
+ enum tag_t tag;
+ union {
+ XCBGetKeyboardMappingCookie cookie;
+ XCBGetKeyboardMappingRep *reply;
+ } u;
+};
+
+static void XCBConvertCase(XCBKEYSYM sym,
+ XCBKEYSYM *lower,
+ XCBKEYSYM *upper);
+
+static void XCBKeySymbolsGetReply (XCBKeySymbols *syms,
+ XCBGenericError **e);
+
+/* public implementation */
+
+XCBKeySymbols *
+XCBKeySymbolsAlloc (XCBConnection *c)
+{
+ XCBKeySymbols *syms;
+ XCBKEYCODE min_keycode;
+ XCBKEYCODE max_keycode;
+
+ if (!c)
+ return NULL;
+
+ syms = (XCBKeySymbols *)malloc (sizeof (XCBKeySymbols));
+
+ syms->c = c;
+ syms->tag = TAG_COOKIE;
+
+ min_keycode = XCBGetSetup (c)->min_keycode;
+ max_keycode = XCBGetSetup (c)->max_keycode;
+
+ syms->u.cookie = XCBGetKeyboardMapping(c,
+ min_keycode,
+ max_keycode.id - min_keycode.id + 1);
+
+ return syms;
+}
+
+void
+XCBKeySymbolsFree (XCBKeySymbols *syms)
+{
+ if (syms)
+ {
+ if (syms->tag == TAG_VALUE)
+ free (syms->u.reply);
+ free (syms);
+ syms = NULL;
+ }
+}
+
+XCBKEYSYM XCBKeySymbolsGetKeysym (XCBKeySymbols *syms,
+ XCBKEYCODE keycode,
+ int col)
+{
+ XCBKEYSYM *keysyms;
+ XCBKEYSYM keysym_null = { 0 };
+ XCBKEYSYM lsym;
+ XCBKEYSYM usym;
+ XCBKEYCODE min_keycode;
+ XCBKEYCODE max_keycode;
+ int per;
+
+ if (!syms)
+ return keysym_null;
+
+ XCBKeySymbolsGetReply (syms, NULL);
+
+ keysyms = XCBGetKeyboardMappingKeysyms (syms->u.reply);
+ min_keycode = XCBGetSetup (syms->c)->min_keycode;
+ max_keycode = XCBGetSetup (syms->c)->max_keycode;
+
+ per = syms->u.reply->keysyms_per_keycode;
+ if ((col < 0) || ((col >= per) && (col > 3)) ||
+ (keycode.id < min_keycode.id) ||
+ (keycode.id > max_keycode.id))
+ return keysym_null;
+
+ keysyms = &keysyms[(keycode.id - min_keycode.id) * per];
+ if (col < 4)
+ {
+ if (col > 1)
+ {
+ while ((per > 2) && (keysyms[per - 1].id == 0))
+ per--;
+ if (per < 3)
+ col -= 2;
+ }
+ if ((per <= (col|1)) || (keysyms[col|1].id == 0))
+ {
+ XCBConvertCase(keysyms[col&~1], &lsym, &usym);
+ if (!(col & 1))
+ return lsym;
+ else if (usym.id == lsym.id)
+ return keysym_null;
+ else
+ return usym;
+ }
+ }
+ return keysyms[col];
+}
+
+
+XCBKEYCODE
+XCBKeySymbolsGetKeycode (XCBKeySymbols *syms,
+ XCBKEYSYM keysym)
+{
+ XCBKEYSYM ks;
+ XCBKEYCODE keycode_null = { 0 };
+ int i, j;
+
+ if (!syms)
+ return keycode_null;
+
+ XCBKeySymbolsGetReply (syms, NULL);
+
+ for (j = 0; j < syms->u.reply->keysyms_per_keycode; j++)
+ {
+ for (i = XCBGetSetup (syms->c)->min_keycode.id; i <= XCBGetSetup (syms->c)->max_keycode.id; i++)
+ {
+ XCBKEYCODE keycode;
+
+ keycode.id = i;
+ ks = XCBKeySymbolsGetKeysym (syms, keycode, j);
+ if (ks.id == keysym.id)
+ return keycode;
+ }
+ }
+
+ return keycode_null;
+}
+
+XCBKEYSYM
+XCBKeyPressLookupKeysym (XCBKeySymbols *syms,
+ XCBKeyPressEvent *event,
+ int col)
+{
+ return XCBKeySymbolsGetKeysym (syms, event->detail, col);
+}
+
+XCBKEYSYM
+XCBKeyReleaseLookupKeysym (XCBKeySymbols *syms,
+ XCBKeyReleaseEvent *event,
+ int col)
+{
+ return XCBKeySymbolsGetKeysym (syms, event->detail, col);
+}
+
+int
+XCBRefreshKeyboardMapping (XCBKeySymbols *syms,
+ XCBMappingNotifyEvent *event)
+{
+ if (event->request == MappingKeyboard && syms) {
+ if (syms->tag == TAG_VALUE) {
+ XCBKEYCODE min_keycode;
+ XCBKEYCODE max_keycode;
+
+ if (syms->u.reply) {
+ free (syms->u.reply);
+ syms->u.reply = NULL;
+ }
+ syms->tag = TAG_COOKIE;
+ min_keycode = XCBGetSetup (syms->c)->min_keycode;
+ max_keycode = XCBGetSetup (syms->c)->max_keycode;
+
+ syms->u.cookie = XCBGetKeyboardMapping(syms->c,
+ min_keycode,
+ max_keycode.id - min_keycode.id + 1);
+
+ }
+ return 1;
+ }
+ return 0;
+}
+
+
+/* Tests for classes of symbols */
+
+int
+XCBIsKeypadKey (XCBKEYSYM keysym)
+{
+ return ((keysym.id >= XK_KP_Space) && (keysym.id <= XK_KP_Equal));
+}
+
+int
+XCBIsPrivateKeypadKey (XCBKEYSYM keysym)
+{
+ return ((keysym.id >= 0x11000000) && (keysym.id <= 0x1100FFFF));
+}
+
+int
+XCBIsCursorKey (XCBKEYSYM keysym)
+{
+ return ((keysym.id >= XK_Home) && (keysym.id <= XK_Select));
+}
+
+int
+XCBIsPFKey (XCBKEYSYM keysym)
+{
+ return ((keysym.id >= XK_KP_F1) && (keysym.id <= XK_KP_F4));
+}
+
+int
+XCBIsFunctionKey (XCBKEYSYM keysym)
+{
+ return ((keysym.id >= XK_F1) && (keysym.id <= XK_F35));
+}
+
+int
+XCBIsMiscFunctionKey (XCBKEYSYM keysym)
+{
+ return ((keysym.id >= XK_Select) && (keysym.id <= XK_Break));
+}
+
+int
+XCBIsModifierKey (XCBKEYSYM keysym)
+{
+ return (((keysym.id >= XK_Shift_L) && (keysym.id <= XK_Hyper_R)) ||
+ ((keysym.id >= XK_ISO_Lock) && (keysym.id <= XK_ISO_Last_Group_Lock)) ||
+ (keysym.id == XK_Mode_switch) ||
+ (keysym.id == XK_Num_Lock));
+}
+
+/* private functions */
+
+void
+XCBConvertCase(XCBKEYSYM sym,
+ XCBKEYSYM *lower,
+ XCBKEYSYM *upper)
+{
+ lower->id = sym.id;
+ upper->id = sym.id;
+
+ switch(sym.id >> 8)
+ {
+ case 0: /* Latin 1 */
+ if ((sym.id >= XK_A) && (sym.id <= XK_Z))
+ lower->id += (XK_a - XK_A);
+ else if ((sym.id >= XK_a) && (sym.id <= XK_z))
+ upper->id -= (XK_a - XK_A);
+ else if ((sym.id >= XK_Agrave) && (sym.id <= XK_Odiaeresis))
+ lower->id += (XK_agrave - XK_Agrave);
+ else if ((sym.id >= XK_agrave) && (sym.id <= XK_odiaeresis))
+ upper->id -= (XK_agrave - XK_Agrave);
+ else if ((sym.id >= XK_Ooblique) && (sym.id <= XK_Thorn))
+ lower->id += (XK_oslash - XK_Ooblique);
+ else if ((sym.id >= XK_oslash) && (sym.id <= XK_thorn))
+ upper->id -= (XK_oslash - XK_Ooblique);
+ break;
+ case 1: /* Latin 2 */
+ /* Assume the KeySym.Id is a legal value (ignore discontinuities) */
+ if (sym.id == XK_Aogonek)
+ lower->id = XK_aogonek;
+ else if (sym.id >= XK_Lstroke && sym.id <= XK_Sacute)
+ lower->id += (XK_lstroke - XK_Lstroke);
+ else if (sym.id >= XK_Scaron && sym.id <= XK_Zacute)
+ lower->id += (XK_scaron - XK_Scaron);
+ else if (sym.id >= XK_Zcaron && sym.id <= XK_Zabovedot)
+ lower->id += (XK_zcaron - XK_Zcaron);
+ else if (sym.id == XK_aogonek)
+ upper->id = XK_Aogonek;
+ else if (sym.id >= XK_lstroke && sym.id <= XK_sacute)
+ upper->id -= (XK_lstroke - XK_Lstroke);
+ else if (sym.id >= XK_scaron && sym.id <= XK_zacute)
+ upper->id -= (XK_scaron - XK_Scaron);
+ else if (sym.id >= XK_zcaron && sym.id <= XK_zabovedot)
+ upper->id -= (XK_zcaron - XK_Zcaron);
+ else if (sym.id >= XK_Racute && sym.id <= XK_Tcedilla)
+ lower->id += (XK_racute - XK_Racute);
+ else if (sym.id >= XK_racute && sym.id <= XK_tcedilla)
+ upper->id -= (XK_racute - XK_Racute);
+ break;
+ case 2: /* Latin 3 */
+ /* Assume the KeySym.Id is a legal value (ignore discontinuities) */
+ if (sym.id >= XK_Hstroke && sym.id <= XK_Hcircumflex)
+ lower->id += (XK_hstroke - XK_Hstroke);
+ else if (sym.id >= XK_Gbreve && sym.id <= XK_Jcircumflex)
+ lower->id += (XK_gbreve - XK_Gbreve);
+ else if (sym.id >= XK_hstroke && sym.id <= XK_hcircumflex)
+ upper->id -= (XK_hstroke - XK_Hstroke);
+ else if (sym.id >= XK_gbreve && sym.id <= XK_jcircumflex)
+ upper->id -= (XK_gbreve - XK_Gbreve);
+ else if (sym.id >= XK_Cabovedot && sym.id <= XK_Scircumflex)
+ lower->id += (XK_cabovedot - XK_Cabovedot);
+ else if (sym.id >= XK_cabovedot && sym.id <= XK_scircumflex)
+ upper->id -= (XK_cabovedot - XK_Cabovedot);
+ break;
+ case 3: /* Latin 4 */
+ /* Assume the KeySym.Id is a legal value (ignore discontinuities) */
+ if (sym.id >= XK_Rcedilla && sym.id <= XK_Tslash)
+ lower->id += (XK_rcedilla - XK_Rcedilla);
+ else if (sym.id >= XK_rcedilla && sym.id <= XK_tslash)
+ upper->id -= (XK_rcedilla - XK_Rcedilla);
+ else if (sym.id == XK_ENG)
+ lower->id = XK_eng;
+ else if (sym.id == XK_eng)
+ upper->id = XK_ENG;
+ else if (sym.id >= XK_Amacron && sym.id <= XK_Umacron)
+ lower->id += (XK_amacron - XK_Amacron);
+ else if (sym.id >= XK_amacron && sym.id <= XK_umacron)
+ upper->id -= (XK_amacron - XK_Amacron);
+ break;
+ case 6: /* Cyrillic */
+ /* Assume the KeySym.Id is a legal value (ignore discontinuities) */
+ if (sym.id >= XK_Serbian_DJE && sym.id <= XK_Serbian_DZE)
+ lower->id -= (XK_Serbian_DJE - XK_Serbian_dje);
+ else if (sym.id >= XK_Serbian_dje && sym.id <= XK_Serbian_dze)
+ upper->id += (XK_Serbian_DJE - XK_Serbian_dje);
+ else if (sym.id >= XK_Cyrillic_YU && sym.id <= XK_Cyrillic_HARDSIGN)
+ lower->id -= (XK_Cyrillic_YU - XK_Cyrillic_yu);
+ else if (sym.id >= XK_Cyrillic_yu && sym.id <= XK_Cyrillic_hardsign)
+ upper->id += (XK_Cyrillic_YU - XK_Cyrillic_yu);
+ break;
+ case 7: /* Greek */
+ /* Assume the KeySym.Id is a legal value (ignore discontinuities) */
+ if (sym.id >= XK_Greek_ALPHAaccent && sym.id <= XK_Greek_OMEGAaccent)
+ lower->id += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
+ else if (sym.id >= XK_Greek_alphaaccent && sym.id <= XK_Greek_omegaaccent &&
+ sym.id != XK_Greek_iotaaccentdieresis &&
+ sym.id != XK_Greek_upsilonaccentdieresis)
+ upper->id -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
+ else if (sym.id >= XK_Greek_ALPHA && sym.id <= XK_Greek_OMEGA)
+ lower->id += (XK_Greek_alpha - XK_Greek_ALPHA);
+ else if (sym.id >= XK_Greek_alpha && sym.id <= XK_Greek_omega &&
+ sym.id != XK_Greek_finalsmallsigma)
+ upper->id -= (XK_Greek_alpha - XK_Greek_ALPHA);
+ break;
+ case 0x14: /* Armenian */
+ if (sym.id >= XK_Armenian_AYB && sym.id <= XK_Armenian_fe) {
+ lower->id = sym.id | 1;
+ upper->id = sym.id & ~1;
+ }
+ break;
+ }
+}
+
+void
+XCBKeySymbolsGetReply (XCBKeySymbols *syms,
+ XCBGenericError **e)
+{
+ if (!syms)
+ return;
+
+ if (syms->tag == TAG_COOKIE)
+ {
+ syms->tag = TAG_VALUE;
+ syms->u.reply = XCBGetKeyboardMappingReply(syms->c,
+ syms->u.cookie,
+ e);
+ }
+}
diff --git a/keysyms/xcb-keysyms.pc.in b/keysyms/xcb-keysyms.pc.in
new file mode 100644
index 0000000..596017f
--- /dev/null
+++ b/keysyms/xcb-keysyms.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: XCBKeysyms
+Description: XCB Keysyms
+Version: @PACKAGE_VERSION@
+Requires: xcb
+Libs: -L${libdir} -lXCBKeysyms @LIBS@
+Cflags: -I${includedir}
diff --git a/keysyms/xcb_keysyms.h b/keysyms/xcb_keysyms.h
new file mode 100644
index 0000000..a2e3d3e
--- /dev/null
+++ b/keysyms/xcb_keysyms.h
@@ -0,0 +1,49 @@
+#ifndef __XCB_KEYSYMS_H__
+#define __XCB_KEYSYMS_H__
+
+
+
+typedef struct _XCBKeySymbols XCBKeySymbols;
+
+
+XCBKeySymbols *XCBKeySymbolsAlloc (XCBConnection *c);
+
+void XCBKeySymbolsFree (XCBKeySymbols *syms);
+
+XCBKEYSYM XCBKeySymbolsGetKeysym (XCBKeySymbols *syms,
+ XCBKEYCODE keycode,
+ int col);
+
+XCBKEYCODE XCBKeySymbolsGetKeycode (XCBKeySymbols *syms,
+ XCBKEYSYM keysym);
+
+XCBKEYSYM XCBKeyPressLookupKeysym (XCBKeySymbols *syms,
+ XCBKeyPressEvent *event,
+ int col);
+
+XCBKEYSYM XCBKeyReleaseLookupKeysym (XCBKeySymbols *syms,
+ XCBKeyReleaseEvent *event,
+ int col);
+
+int XCBRefreshKeyboardMapping (XCBKeySymbols *syms,
+ XCBMappingNotifyEvent *event);
+
+
+/* Tests for classes of symbols */
+
+int XCBIsKeypadKey (XCBKEYSYM keysym);
+
+int XCBIsPrivateKeypadKey (XCBKEYSYM keysym);
+
+int XCBIsCursorKey (XCBKEYSYM keysym);
+
+int XCBIsPFKey (XCBKEYSYM keysym);
+
+int XCBIsFunctionKey (XCBKEYSYM keysym);
+
+int XCBIsMiscFunctionKey (XCBKEYSYM keysym);
+
+int XCBIsModifierKey (XCBKEYSYM keysym);
+
+
+#endif /* __XCB_KEYSYMS_H__ */
diff --git a/xcb_util_intro.in b/xcb_util_intro.in
new file mode 100644
index 0000000..482d658
--- /dev/null
+++ b/xcb_util_intro.in
@@ -0,0 +1,21 @@
+/**
+@file
+@brief XCB Utility functions
+
+These routines are used to facilitate the use of XCB in programs
+*/
+
+/**
+
+@mainpage XCB Utility Documentation
+@version @PACKAGE_VERSION@
+@author Jamey Sharp <jamey@minilop.net>
+@author Vincent Torri <torri@iecn.u-nancy.fr>
+@date 2005
+
+
+@section intro What is available ?
+
+@todo Add more functions in XCBAux
+
+*/