[PATCH 2/3] libxkbfile: Add a few missing flags the output of the xkb layout

Andreas Wettstein wettstein509 at solnet.ch
Thu Jan 23 11:39:55 PST 2014


Output "affect" flags for control locks, modifier locks, and ISOLock.  Output
flag "genKeyEvent" flag for message actions.  Do not generate output for any of
these if the flags have their default setting, to avoid problems of parsing
this output with versions of xkbcomp that do not support these flags.

Signed-off-by: Andreas Wettstein <wettstein509 at solnet.ch>
---
 src/xkbtext.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 51 insertions(+), 5 deletions(-)

diff --git a/src/xkbtext.c b/src/xkbtext.c
index b5d4750..d80c7a3 100644
--- a/src/xkbtext.c
+++ b/src/xkbtext.c
@@ -886,8 +886,22 @@ CopyModActionArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
     }
     else
         TryCopyStr(buf, "none", sz);
-    if (act->type == XkbSA_LockMods)
+    if (act->type == XkbSA_LockMods) {
+	switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) {
+        case XkbSA_LockNoLock:
+            TryCopyStr(buf, ",affect=unlock", sz);
+            break;
+        case XkbSA_LockNoUnlock:
+            TryCopyStr(buf, ",affect=lock", sz);
+            break;
+        case XkbSA_LockNoUnlock|XkbSA_LockNoLock:
+            TryCopyStr(buf, ",affect=neither", sz);
+            break;
+        default:
+            break;
+	}
         return True;
+    }
     if (act->flags & XkbSA_ClearLocks)
         TryCopyStr(buf, ",clearLocks", sz);
     if (act->flags & XkbSA_LatchToLock)
@@ -906,11 +920,11 @@ CopyGroupActionArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
     act = &action->group;
     TryCopyStr(buf, "group=", sz);
     if (act->flags & XkbSA_GroupAbsolute)
-        snprintf(tbuf, sizeof(buf), "%d", XkbSAGroup(act) + 1);
+        snprintf(tbuf, sizeof(tbuf), "%d", XkbSAGroup(act) + 1);
     else if (XkbSAGroup(act) < 0)
-        snprintf(tbuf, sizeof(buf), "%d", XkbSAGroup(act));
+        snprintf(tbuf, sizeof(tbuf), "%d", XkbSAGroup(act));
     else
-        snprintf(tbuf, sizeof(buf), "+%d", XkbSAGroup(act));
+        snprintf(tbuf, sizeof(tbuf), "+%d", XkbSAGroup(act));
     TryCopyStr(buf, tbuf, sz);
     if (act->type == XkbSA_LockGroup)
         return True;
@@ -1049,8 +1063,12 @@ CopyISOLockArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
             TryCopyStr(buf, "none", sz);
     }
     TryCopyStr(buf, ",affect=", sz);
-    if ((act->affect & XkbSA_ISOAffectMask) == 0)
+    if ((act->affect & XkbSA_ISOAffectMask) == 0) {
         TryCopyStr(buf, "all", sz);
+    }
+    else if ((act->affect & XkbSA_ISOAffectMask) == XkbSA_ISOAffectMask) {
+        TryCopyStr(buf, "none", sz);
+    }
     else {
         int nOut = 0;
 
@@ -1074,6 +1092,18 @@ CopyISOLockArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
             nOut++;
         }
     }
+    switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) {
+    case XkbSA_LockNoLock:
+	TryCopyStr(buf, "+unlock", sz);
+        break;
+    case XkbSA_LockNoUnlock:
+	TryCopyStr(buf, "+lock", sz);
+        break;
+    case XkbSA_LockNoUnlock | XkbSA_LockNoLock:
+	TryCopyStr(buf, "+neither", sz);
+        break;
+    default: ;
+    }
     return True;
 }
 
@@ -1183,6 +1213,20 @@ CopySetLockControlsArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
             nOut++;
         }
     }
+    if (action->type == XkbSA_LockControls) {
+	switch (act->flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) {
+	case XkbSA_LockNoLock:
+	    TryCopyStr(buf, ",affect=unlock", sz);
+            break;
+	case XkbSA_LockNoUnlock:
+	    TryCopyStr(buf, ",affect=lock", sz);
+            break;
+	case XkbSA_LockNoUnlock | XkbSA_LockNoLock:
+	    TryCopyStr(buf, ",affect=neither", sz);
+            break;
+	default: ;
+	}
+    }
     return True;
 }
 
@@ -1218,6 +1262,8 @@ CopyActionMessageArgs(Display *dpy, XkbDescPtr xkb, XkbAction *action,
     TryCopyStr(buf, tbuf, sz);
     snprintf(tbuf, sizeof(tbuf), ",data[5]=0x%02x", act->message[5]);
     TryCopyStr(buf, tbuf, sz);
+    if (act->flags & XkbSA_MessageGenKeyEvent)
+	TryCopyStr(buf, ",genKeyEvent", sz);
     return True;
 }
 
-- 
1.8.3.1



More information about the xorg-devel mailing list