[Xcb-commit] XCBToDoKeyboard.mdwn

XCB site xcb at freedesktop.org
Tue Mar 23 09:20:36 PDT 2010


 XCBToDoKeyboard.mdwn |  197 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 197 insertions(+)

New commits:
commit 620337f04ce81e1fb7aaf536b96262e2078edd19
Author: ArnaudFontaine <ArnaudFontaine at web>
Date:   Tue Mar 23 09:20:35 2010 -0700

diff --git a/XCBToDoKeyboard.mdwn b/XCBToDoKeyboard.mdwn
new file mode 100644
index 0000000..1675643
--- /dev/null
+++ b/XCBToDoKeyboard.mdwn
@@ -0,0 +1,197 @@
+# XCB Keyboard support
+
+This page is about porting Xlib keyboard functions to XCB and also
+contains general information I use as a reminder. It is a work in
+progress so it is fairly incomplete and might contain mistakes as this
+is only what I have understood so far...
+
+## X Window System Core Protocol
+
+The X Window System Protocol describes the requests and events
+associated with the keyboard. Besides of these requests and events, it
+also describes how a KeyCode should be converted to a KeySym.
+
+### Requests and events
+
+* Requests to specify the key used as modifiers (SetModifierMapping
+  and GetModifierMapping)
+
+* Requests to manipulate the keyboard mapping (GetKeyboardMapping and
+  ChangeKeyboardMapping)
+
+* Requests to grab a specific key (GrabKey and UngrabKey)
+
+* Requests to grab the whole keyboard (GrabKeyboard and
+  UngrabKeyboard)
+
+* Events sent when a key is pressed (KeyPress) and released
+  (KeyRelease)
+
+* Requests to change various aspects of the keyboard
+  (ChangeKeyboardControl and GetKeyboardControl)
+
+### Overview
+
+According to the X Window System protocol, the KeyPress and KeyRelease
+events contains the following fields (`detail' contains the keycode
+and `state' the modifiers state):
+
+    root, event: WINDOW
+    child: WINDOW or None
+    same-screen: BOOL
+    root-x, root-y, event-x, event-y: INT16
+    detail: KEYCODE
+    state: SETofKEYBUTMASK
+    time: TIMESTAMP
+
+The section 5 of `X Window System Protocol' describes how a KeyCode is
+converted to a KeySym according to the modifiers state. Only at most
+two KeySym groups (which can be switched using the group modifier) can
+be associated to a KeyCode and each group can have two KeySyms.
+
+Unlike `shift', `lock' and `control' modifiers, `Mode_Switch' and
+`Num_Lock' KeySyms do not have a dedicated modifier and are just bound
+to any of the modifiers `Mod1' through `Mod5'.
+
+This is the client library responsibility to convert a KeySym to a
+character in the proper encoding.  The appendix A describes the KeySym
+encoding.  All Unicode characters listed refers to "ISO 10646 /
+Unicode".
+
+TODO: XIM?
+
+### Extensions
+
+TODO: XKB/XI?
+
+## Xlib
+
+In this section we will only talk about the core protocol functions,
+not XKB (set XKB_DISABLE variable environment to 1 in order to only
+use the formers). Besides of the X Window System protocol requests and
+events given above, Xlib defines the following functions:
+
+* XDisplayKeycodes
+
+  Return min-keycode and max-keycode as returned on successful
+  connection initialization.
+
+* XNewModifiermap, XInsertModifiermapEntry, XDeleteModifiermapEntry,
+  XFreeModifiermap
+
+  Only useful for Xlib where XSetModifierMapping and
+  XGetModifierMapping use ModifierMap type as parameters.
+
+* XConvertCase
+
+  Convert a KeySym to lowercase and uppercase forms.
+
+* XKeycodeToKeysym
+
+  Returns the KeySym from a KeyCode and index within the KeySyms list.
+
+* XLookupKeysym
+
+  Return the KeySym from a KeyPress or KeyRelease event, and the index
+  within the KeySyms list. Actually call the same function as the one
+  called in XKeycodeToKeyym().
+
+* XRefreshKeyboardMapping
+
+  Refresh the client-side stored modifier and keymap information.
+
+* XLookupString
+
+  Translate a KeyCode to a KeySym and a String. It firstly calls
+  _XTranslateKey which converts the KeyCode and the set modifiers to a
+  KeySym. Then, it calls _XTranslateKeySym to convert the KeySym to a
+  string, by looking at rebound KeySym (XRebindKey) then Latin 1 and
+  ASCII. `USE_OWN_COMPOSE' seem to never be set by default?
+
+* XKeysymToKeycode
+
+  For each couple (i, j) where 0 <= i <= keysyms_per_keycode and
+  min_keycode <= j <= max_keycode, check whether KeyCodetoKeySym(i, j)
+  (as called by XLookupKeysym) returns the same KeySym as the one
+  given as a parameter.
+
+* XStringToKeysym
+
+  TODO  
+
+* XKeysymToString
+
+  TODO
+
+#### Character encoding  
+
+As stated above, the "Unicode" KeySyms given in Appendix A of the X
+Window System Core protocol represent [ISO 10646 /
+Unicode](http://en.wikipedia.org/wiki/Universal_Character_Set)
+characters which have to be translated to the proper character
+encoding (UTF-8 ([http://www.cl.cam.ac.uk/~mgk25/unicode.html]),
+UTF-16 or UTF-32).
+
+This is implemented in `src/xlibi18n' as `Xutf8LookupString()' (UTF-8
+strings), `XwcLookupString' and `XmbLookupString'.
+
+## XCB
+
+### Current problems
+
+At the moment, XCB implements only a basic and incomplete sets of
+keyboard functions.  Therefore, it greatly restricts the usages of XCB
+in "real-world" applications and duplicate the efforts as most
+applications ported to XCB so far (such as Awesome Window Manager, VLC
+and others) have to write their own implementation, which is often
+incomplete and buggy as it's rather tricky to implement properly and
+entirely.
+
+### Current status
+
+Currently, XCB only implements the bits given in the X Window System
+Protocol, and even this support is not complete compared to Xlib
+(character encoding, no `XLookupString()'...). All the X Window System
+Protocol requests have been implemented so far, but most applications
+rely extensively on Xlib helpers which provides
+
+However, there is an ongoing effort to bring XKB extension to XCB
+which began as a Google Summer of Code project in 2009. Only the XML
+protocol description has been pushed so far but the parsing bit is
+still missing.
+
+Here is a list of files and/or functions:
+
+* `keysymdef.h'
+
+  Perhaps, it should be defined in an XML file, rather than a plain
+  header (useful to bindings for another programming languages?).
+
+* `XConvertCase()': `xcb_convert_case()'
+
+  Compare to Xlib implementation, XCB misses "Latin 1", "Unicode" and
+  "Latin 9" KeySyms. The first and second ones are implemented in
+  `UCSConvertCase()' Xlib function.
+
+  Moreover, Besides of that, the X Window System Protocol also defines
+  more sets, namely "Kana", "Arabic", "Technical", "Special",
+  "Publish", "APL", "Hebrew", "Thai", "Korean" and "Currency"?
+
+* `XKeycodeToKeysym()': `xcb_key_symbols_get_keysym()'
+
+  OK.
+
+* `XLookupKeysym()': `xcb_key_press_lookup_keysym()' and
+  `xcb_key_release_lookup_keysym()'
+
+  OK.
+
+* `XRefreshKeyboardMapping()': `xcb_refresh_keyboard_mapping()'
+
+  OK.
+
+### Roadmap
+
+1. Port core keyboard functions (in progress)
+2. Port code related to character encoding
+3. XKB


More information about the xcb-commit mailing list