[PATCH 1/2] xkb: split out keymap compilation.

Peter Hutterer peter.hutterer at who-t.net
Wed Feb 9 21:34:31 PST 2011


Refacturing for simpler double-use in the next patch. No functional changes.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 xkb/ddxLoad.c |   55 +++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index 51b5777..b968c43 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -425,35 +425,58 @@ XkbRF_RulesPtr	rules;
     return complete;
 }
 
-XkbDescPtr
-XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+static Bool
+XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccgst)
 {
-    XkbComponentNamesRec kccgst;
     XkbRF_VarDefsRec mlvo;
-    XkbDescPtr xkb;
-    char name[PATH_MAX];
-
-    if (!dev || !rmlvo) {
-        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
-        return NULL;
-    }
 
     mlvo.model = rmlvo->model;
     mlvo.layout = rmlvo->layout;
     mlvo.variant = rmlvo->variant;
     mlvo.options = rmlvo->options;
 
-    /* XDNFR already logs for us. */
-    if (!XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, &kccgst))
+    return XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, kccgst);
+}
+
+/**
+ * Compile the given RMLVO keymap and return it. Returns the XkbDescPtr on
+ * success or NULL on failure. If the components compiled are not a superset
+ * or equal to need, the compiliation is treated as failure.
+ */
+static XkbDescPtr
+XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need)
+{
+    XkbDescPtr xkb;
+    unsigned int provided;
+    XkbComponentNamesRec kccgst;
+    char name[PATH_MAX];
+
+    if (!XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst))
         return NULL;
 
-    /* XDLKBN too, but it might return 0 as well as allocating. */
-    if (!XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, 0, &xkb, name,
-                                 PATH_MAX)) {
-        if (xkb)
+    provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need,
+                                       &xkb, name, PATH_MAX);
+    if ((need & provided) != need) {
+        if (xkb) {
             XkbFreeKeyboard(xkb, 0, TRUE);
+            xkb = NULL;
+        }
+    }
+
+    return xkb;
+}
+
+XkbDescPtr
+XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+{
+    XkbDescPtr xkb;
+
+    if (!dev || !rmlvo) {
+        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
         return NULL;
     }
 
+    xkb = XkbCompileKeymapForDevice(dev, rmlvo, 0);
+
     return xkb;
 }
-- 
1.7.3.5



More information about the xorg-devel mailing list