Go to file
David Herrmann 36f55c494e keymap: add xkb_keymap_new_from_buffer()
The current API doesn't allow the caller to create keymaps from mmap()'ed
files. The problem is, xkb_keymap_new_from_string() requires a terminating
0 byte. However, there is no way to guarantee that when using mmap() so a
user currently has to copy the whole file just to get the terminating zero
byte (assuming they cannot use xkb_keymap_new_from_file()).

This adds a new entry xkb_keymap_new_from_buffer() which takes a memory
location and the buffer size in bytes.

Internally, we depend on yy_scan_{string,byte}() helpers. According to
flex documentation these already copy the input string because they are
wrappers around yy_scan_buffer().
yy_scan_buffer() on the other hand has some insane requirements. The
buffer must be writeable and the last two bytes must be ASCII-NUL. But the
buffer may contain other 0 bytes just fine.

Because we don't want these constraints in our public API,
xkb_keymap_new_from_buffer() needs to create a copy of the input memory.
But it then calls yy_scan_buffer() directly. Hence, we have the same
number of buffer-copies as with *_from_string() but without the
terminating 0 requirement.
The explicit yy_scan_buffer() call is preferred over yy_scan_byte() so the
buffer-copy operation is not hidden somewhere in flex.

Maybe some day we no longer depend on flex and can have a zero-copy API. A
user could mmap() a file and it would get parsed right from this buffer.
But until then, we shouldn't expose this limitation in the API but instead
provide an API that some day can work with zero-copy.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>

[ran: rebased on top of my branch]
Conflicts:
	Makefile.am
	src/xkbcomp/xkbcomp.c
2013-04-01 18:04:06 +01:00
doc doc: use README as doxygen main page overview 2013-03-18 22:20:06 +00:00
m4 Make build non-recursive 2012-03-27 14:17:34 +01:00
src keymap: add xkb_keymap_new_from_buffer() 2013-04-01 18:04:06 +01:00
test keymap: add xkb_keymap_new_from_buffer() 2013-04-01 18:04:06 +01:00
xkbcommon keymap: add xkb_keymap_new_from_buffer() 2013-04-01 18:04:06 +01:00
.gitignore Update .gitignore for automake 1.12 2012-05-08 17:28:52 +01:00
.uncrustify.cfg Run source tree through uncrustify 2012-07-17 10:20:15 +01:00
Android.mk Android.mk: Remove unnecessary for loop 2012-09-11 15:11:35 +01:00
COPYING Update COPYING 2012-09-12 16:58:57 +01:00
Makefile.am keymap: add xkb_keymap_new_from_buffer() 2013-04-01 18:04:06 +01:00
README doc: use README as doxygen main page overview 2013-03-18 22:20:06 +00:00
autogen.sh autogen: use --force instead of --symlink 2012-10-24 00:59:37 +11:00
configure.ac Add environment overrides for default RMLVO 2013-03-19 10:53:37 +00:00
makekeys.py Add xkb_keysym_from_name() flags argument for case-insensitive search 2012-10-16 21:29:09 +02:00
xkbcommon-uninstalled.pc.in build: drop the include/ directory 2012-07-23 00:45:34 +03:00
xkbcommon.pc.in Remove xproto and kbproto from pkg-config file 2012-04-09 14:04:25 +01:00

README

Overview {#mainpage}
========

xkbcommon is a keymap compiler and support library which processes a
reduced subset of keymaps as defined by the XKB specification.  Primarily,
a keymap is created from a set of Rules/Model/Layout/Variant/Options names,
processed through an XKB ruleset, and compiled into a struct xkb_keymap,
which is the base type for all xkbcommon operations.

From an xkb_keymap, an xkb_state object is created which holds the current
state of all modifiers, groups, LEDs, etc, relating to that keymap.  All
key events must be fed into the xkb_state object using xkb_state_update_key().
Once this is done, the xkb_state object will be properly updated, and the
keysyms to use can be obtained with xkb_state_key_get_syms().

libxkbcommon does not distribute a dataset itself, other than for testing
purposes.  The most common dataset is xkeyboard-config, as used by all
current distributions for their X11 XKB data.  More information on
xkeyboard-config is available here:
    http://www.freedesktop.org/wiki/Software/XKeyboardConfig


API
===

While xkbcommon's API is somewhat derived from the classic XKB API as found
in <X11/extensions/XKB.h> and friends, it has been substantially reworked to
expose fewer internal details to clients.  The only supported API is available
in <xkbcommon/xkbcommon.h>.  Any definition not in this header (including
accessing internal structures through the old macros previously available)
should be regarded as an implementation detail and is liable to change at any
time.

During its early development, xkbcommon does not promise API or ABI stability.
Regardless, we will attempt to not break ABI during a minor release series,
so applications written against 0.1.0 should be completely compatible with
0.1.3, but not necessarily with 0.2.0.  However, new symbols may be introduced
in any release.  Thus, anyone packaging xkbcommon should make sure any package
depending on it depends on a release greater than or equal to the version it
was built against (or earlier, if it doesn't use any newly-introduced
symbols), but less than the next major release.

xkbcommon 1.x will offer full API and ABI stability for its lifetime, with a
soname of libxkbcommon.so.1.  Any ABI breaks will wait until xkbcommon 2.0,
which will be libxkbcommon.so.2.

The xkbcomp command-line tool has also been removed, although this will
likely reappear in a later release.


Relation to X11
===============

Relative to the XKB 1.1 specification implemented in current X servers,
xkbcommon has removed support for some parts of the specification which
introduced unnecessary complications.  Many of these removals were in fact
not implemented, or half-implemented at best, as well as being totally
unused in the standard dataset.

Notable removals:
    - geometry support
      + there were very few geometry definitions available, and while
        xkbcommon was responsible for parsing this insanely complex format,
        it never actually did anything with it
      + hopefully someone will develop a companion library which supports
        keyboard geometries in a more useful format
    - KcCGST (keycodes/compat/geometry/symbols/types) API
      + use RMLVO instead; KcCGST is now an implementation detail
      + including pre-defined keymap files
    - XKM support
      + may come in an optional X11 support/compatibility library
    - around half of the interpret actions
      + pointer device, message and redirect actions in particular
    - non-virtual modifiers
      + core and virtual modifiers have been collapsed into the same
        namespace, with a 'significant' flag that largely parallels the
        core/virtual split
    - radio groups
      + completely unused in current keymaps, never fully implemented
    - overlays
      + almost completely unused in current keymaps
    - key behaviors
      + used to implement radio groups and overlays, and to deal with things
        like keys that physically lock; unused in current keymaps
    - indicator behaviours such as LED-controls-key
      + the only supported LED behaviour is key-controls-LED; again this
        was never really used in current keymaps

Notable additions:
    - 32-bit keycodes
    - extended number of modifiers
    - extended number of groups
    - multiple keysyms per level
      + this requires incompatible dataset changes, such that X11 would
        not be able to parse these


Development
===========

An extremely rudimentary homepage can be found at:
    http://xkbcommon.org

xkbcommon is maintained in git at freedesktop.org:
    git://anongit.freedesktop.org/git/libxkbcommon

Patches are always welcome, and may be sent to either xorg-devel@lists.x.org,
or wayland-devel@lists.freedesktop.org.  Bugs are tracked in Bugzilla at:
    http://bugs.freedesktop.org

The maintainer is Daniel Stone, who can be reached at:
    <daniel@fooishbar.org>


Credits
=======

Many thanks are due to Dan Nicholson for his heroic work in getting xkbcommon
off the ground initially, as well as to Ran Benita for subsequent development.