Add format argument to xkb_keymap_get_as_string
authorRan Benita <ran234@gmail.com>
Sun, 23 Sep 2012 15:52:51 +0000 (17:52 +0200)
committerDaniel Stone <daniel@fooishbar.org>
Sun, 23 Sep 2012 23:13:32 +0000 (09:13 +1000)
This function really needs a format argument, for symmetry with the
keymap creation functions. If we add new formats, we will almost
certainly want to add support for serializing it into a string. It would
also allow to convert from one format to another, etc.

The in the common case, the user would just want to use the format she
used to create the keymap; for that we add a special
XKB_KEYMAP_USE_ORIGINAL_FORMAT value, which will do that (it is defined
to -1 outside of the enum because I have a feeling we might want to use
0 for something else). To support this we need to keep the format inside
the keymap. While we're at it we also initialize keymap flags properly.

This changes the API, but the old xkb_map_get_as_string name works as
expected so this is the best time to do this.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/compat.c
src/keymap-dump.c
src/keymap.c
src/keymap.h
src/xkbcomp/xkbcomp.c
test/print-compiled-keymap.c
test/stringcomp.c
xkbcommon/xkbcommon-compat.h
xkbcommon/xkbcommon.h

index 0b0adb733b91460116d39e15d84e52e07f4d4125..244a723b7828de52b1a31aefc7fef39161dc4797 100644 (file)
@@ -60,7 +60,7 @@ xkb_map_new_from_string(struct xkb_context *context, const char *string,
 XKB_EXPORT char *
 xkb_map_get_as_string(struct xkb_keymap *keymap)
 {
-    return xkb_keymap_get_as_string(keymap);
+    return xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
 }
 
 XKB_EXPORT struct xkb_keymap *
index 4ae53958d8333acb1b64c878d12569cfd597fc35..701441caa1aff485beadaf16e32fee0a43668c3a 100644 (file)
@@ -746,11 +746,22 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
 }
 
 XKB_EXPORT char *
-xkb_keymap_get_as_string(struct xkb_keymap *keymap)
+xkb_keymap_get_as_string(struct xkb_keymap *keymap,
+                         enum xkb_keymap_format format)
 {
     bool ok;
     struct buf buf = { NULL, 0, 0 };
 
+    if (format == XKB_KEYMAP_USE_ORIGINAL_FORMAT)
+        format = keymap->format;
+
+    if (format != XKB_KEYMAP_FORMAT_TEXT_V1) {
+        log_err(keymap->ctx,
+                "Trying to get a keymap as a string in an unsupported format (%d)\n",
+                format);
+        return NULL;
+    }
+
     ok = (check_write_buf(&buf, "xkb_keymap {\n") &&
           write_keycodes(keymap, &buf) &&
           write_types(keymap, &buf) &&
index 442dfff4e294dbb054e7fcef9350e4841b69e186..13ad8299e78df5612a74b36d188e6f9ba9734d65 100644 (file)
@@ -54,7 +54,9 @@
 #include "text.h"
 
 struct xkb_keymap *
-xkb_keymap_new(struct xkb_context *ctx)
+xkb_keymap_new(struct xkb_context *ctx,
+               enum xkb_keymap_format format,
+               enum xkb_keymap_compile_flags flags)
 {
     struct xkb_keymap *keymap;
 
@@ -65,6 +67,9 @@ xkb_keymap_new(struct xkb_context *ctx)
     keymap->refcnt = 1;
     keymap->ctx = xkb_context_ref(ctx);
 
+    keymap->format = format;
+    keymap->flags = flags;
+
     return keymap;
 }
 
index be22124df2ba6bcf87a4a36dd79895f135ec4c6e..2f1e42ef1ea30b7edf7b2282a22cdf2b9c80c943 100644 (file)
@@ -342,6 +342,7 @@ struct xkb_keymap {
 
     int refcnt;
     enum xkb_keymap_compile_flags flags;
+    enum xkb_keymap_format format;
 
     unsigned int enabled_ctrls;
 
@@ -421,6 +422,8 @@ XkbKeyActionEntry(const struct xkb_key *key, xkb_layout_index_t layout,
 }
 
 struct xkb_keymap *
-xkb_keymap_new(struct xkb_context *ctx);
+xkb_keymap_new(struct xkb_context *ctx,
+               enum xkb_keymap_format format,
+               enum xkb_keymap_compile_flags);
 
 #endif
index 884ab2fc4545c65c0c807605a614bf26b563eb99..426f2025c8555517a3a2e040fb0a8035a6ef5ce4 100644 (file)
 #include "rules.h"
 
 static struct xkb_keymap *
-compile_keymap_file(struct xkb_context *ctx, XkbFile *file)
+compile_keymap_file(struct xkb_context *ctx, XkbFile *file,
+                    enum xkb_keymap_format format,
+                    enum xkb_keymap_compile_flags flags)
 {
     struct xkb_keymap *keymap;
 
-    keymap = xkb_keymap_new(ctx);
+    keymap = xkb_keymap_new(ctx, format, flags);
     if (!keymap)
         goto err;
 
@@ -111,7 +113,7 @@ xkb_keymap_new_from_names(struct xkb_context *ctx,
         return NULL;
     }
 
-    keymap = compile_keymap_file(ctx, file);
+    keymap = compile_keymap_file(ctx, file, XKB_KEYMAP_FORMAT_TEXT_V1, flags);
     FreeXkbFile(file);
     return keymap;
 }
@@ -142,7 +144,7 @@ xkb_keymap_new_from_string(struct xkb_context *ctx,
         return NULL;
     }
 
-    keymap = compile_keymap_file(ctx, file);
+    keymap = compile_keymap_file(ctx, file, format, flags);
     FreeXkbFile(file);
     return keymap;
 }
@@ -173,7 +175,7 @@ xkb_keymap_new_from_file(struct xkb_context *ctx,
         return NULL;
     }
 
-    keymap = compile_keymap_file(ctx, xkb_file);
+    keymap = compile_keymap_file(ctx, xkb_file, format, flags);
     FreeXkbFile(xkb_file);
     return keymap;
 }
index 95bd85af675a07d4ff813d092c9f02f505b6dbc7..0e14205ea14d66dc839173d4b0384b22a6e0a056 100644 (file)
@@ -87,7 +87,7 @@ main(int argc, char *argv[])
         goto err_ctx;
     }
 
-    dump = xkb_keymap_get_as_string(keymap);
+    dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
     if (!dump) {
         fprintf(stderr, "Couldn't get the keymap string\n");
         goto err_map;
index e00e92f07bc265f95f49fd75d1fce33766c045f6..e95a3c412e960e6129c1dea7e3ec7bbdb99a2dc6 100644 (file)
@@ -47,7 +47,7 @@ main(int argc, char *argv[])
     keymap = test_compile_string(ctx, original);
     assert(keymap);
 
-    dump = xkb_keymap_get_as_string(keymap);
+    dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
     assert(dump);
 
     if (!streq(original, dump)) {
index 2cd764f2e744e67d5b44ca0e1add3d696f30d111..0142bcac54b7cd3e85a0198797ca4df30220947a 100644 (file)
@@ -40,7 +40,8 @@
         xkb_keymap_new_from_file(context, file, format, flags)
 #define xkb_map_new_from_string(context, string, format, flags) \
         xkb_keymap_new_from_string(context, string, format, flags)
-#define xkb_map_get_as_string(keymap) xkb_keymap_get_as_string(keymap)
+#define xkb_map_get_as_string(keymap) \
+        xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1)
 #define xkb_map_ref(keymap) xkb_keymap_ref(keymap)
 #define xkb_map_unref(keymap) xkb_keymap_unref(keymap)
 
index a26744c799f011067276d27d81e6937c704ac323..1049ca570cfd28118e10b0333a416044b521ede5 100644 (file)
@@ -558,11 +558,18 @@ xkb_keymap_ref(struct xkb_keymap *keymap);
 void
 xkb_keymap_unref(struct xkb_keymap *keymap);
 
+/* See xkb_keymap_get_as_string(). */
+#define XKB_KEYMAP_USE_ORIGINAL_FORMAT ((enum xkb_keymap_format) -1)
+
 /**
  * @brief Get the compiled keymap as a string.
  *
- * @returns The compiled keymap as a NUL-terminated string, or NULL if
- * unsuccessful.
+ * @param keymap The keymap to get as a string.
+ * @param format The keymap format to use for the string.  You can pass
+ * in the special value XKB_KEYMAP_USE_ORIGINAL_FORMAT to use the format
+ * from which the keymap was originally created.
+ *
+ * @returns The keymap as a NUL-terminated string, or NULL if unsuccessful.
  *
  * The returned string may be fed back into xkb_map_new_from_string() to get
  * the exact same keymap (possibly in another process, etc.).
@@ -571,7 +578,8 @@ xkb_keymap_unref(struct xkb_keymap *keymap);
  * by the caller.
  */
 char *
-xkb_keymap_get_as_string(struct xkb_keymap *keymap);
+xkb_keymap_get_as_string(struct xkb_keymap *keymap,
+                         enum xkb_keymap_format format);
 
 /** @} */