diff options
author | Gatis Paeglis <gatis.paeglis@digia.com> | 2014-02-05 16:25:06 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-19 15:42:13 +0100 |
commit | b19b0808940c8c54b102012be134a370b26e348e (patch) | |
tree | 63d951814f771e87508be7b0f8d4346d0079dc05 /src/3rdparty/xkbcommon/src/keysym.c | |
parent | c6b555dac389f9a599a9ad342de56dea329fff60 (diff) |
Update bundled libxkbcommon version to 0.4.0
This release comes with important bug fixes. Also we can now
remove the workaround code which was needed for libxkbcommon 0.2.0.
Task-number: QTBUG-31712
Task-number: QTBUG-33732
Task-number: QTBUG-34056
Change-Id: I57caf7f803b9a01a15541a5ad82e464de3b8abbb
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/3rdparty/xkbcommon/src/keysym.c')
-rw-r--r-- | src/3rdparty/xkbcommon/src/keysym.c | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/src/3rdparty/xkbcommon/src/keysym.c b/src/3rdparty/xkbcommon/src/keysym.c index 1e92a4ac9f..f52d751973 100644 --- a/src/3rdparty/xkbcommon/src/keysym.c +++ b/src/3rdparty/xkbcommon/src/keysym.c @@ -53,24 +53,31 @@ #include "keysym.h" #include "ks_tables.h" +static inline const char * +get_name(const struct name_keysym *entry) +{ + return keysym_names + entry->offset; +} + static int compare_by_keysym(const void *a, const void *b) { - const struct name_keysym *key = a, *entry = b; - return key->keysym - (int32_t)entry->keysym; + const xkb_keysym_t *key = a; + const struct name_keysym *entry = b; + return *key - (int32_t) entry->keysym; } static int compare_by_name(const void *a, const void *b) { - const struct name_keysym *key = a, *entry = b; - return strcasecmp(key->name, entry->name); + const char *key = a; + const struct name_keysym *entry = b; + return strcasecmp(key, get_name(entry)); } XKB_EXPORT int xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size) { - const struct name_keysym search = { .name = NULL, .keysym = ks }; const struct name_keysym *entry; if ((ks & ((unsigned long) ~0x1fffffff)) != 0) { @@ -78,12 +85,12 @@ xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size) return -1; } - entry = bsearch(&search, keysym_to_name, + entry = bsearch(&ks, keysym_to_name, ARRAY_SIZE(keysym_to_name), sizeof(*keysym_to_name), compare_by_keysym); if (entry) - return snprintf(buffer, size, "%s", entry->name); + return snprintf(buffer, size, "%s", get_name(entry)); /* Unnamed Unicode codepoint. */ if (ks >= 0x01000100 && ks <= 0x0110ffff) { @@ -119,25 +126,25 @@ find_sym(const struct name_keysym *entry, const char *name, bool icase) if (!entry) return NULL; - if (!icase && strcmp(entry->name, name) == 0) + if (!icase && strcmp(get_name(entry), name) == 0) return entry; if (icase && xkb_keysym_is_lower(entry->keysym)) return entry; for (iter = entry - 1; iter >= name_to_keysym; --iter) { - if (!icase && strcmp(iter->name, name) == 0) + if (!icase && strcmp(get_name(iter), name) == 0) return iter; - if (strcasecmp(iter->name, entry->name) != 0) + if (strcasecmp(get_name(iter), get_name(entry)) != 0) break; if (icase && xkb_keysym_is_lower(iter->keysym)) return iter; } last = name_to_keysym + len; - for (iter = entry + 1; iter < last; --iter) { - if (!icase && strcmp(iter->name, name) == 0) + for (iter = entry + 1; iter < last; ++iter) { + if (!icase && strcmp(get_name(iter), name) == 0) return iter; - if (strcasecmp(iter->name, entry->name) != 0) + if (strcasecmp(get_name(iter), get_name(entry)) != 0) break; if (icase && xkb_keysym_is_lower(iter->keysym)) return iter; @@ -151,7 +158,6 @@ find_sym(const struct name_keysym *entry, const char *name, bool icase) XKB_EXPORT xkb_keysym_t xkb_keysym_from_name(const char *s, enum xkb_keysym_flags flags) { - const struct name_keysym search = { .name = s, .keysym = 0 }; const struct name_keysym *entry; char *tmp; xkb_keysym_t val; @@ -160,7 +166,7 @@ xkb_keysym_from_name(const char *s, enum xkb_keysym_flags flags) if (flags & ~XKB_KEYSYM_CASE_INSENSITIVE) return XKB_KEY_NoSymbol; - entry = bsearch(&search, name_to_keysym, + entry = bsearch(s, name_to_keysym, ARRAY_SIZE(name_to_keysym), sizeof(*name_to_keysym), compare_by_name); @@ -242,6 +248,26 @@ xkb_keysym_is_upper(xkb_keysym_t ks) return (ks == upper ? true : false); } +xkb_keysym_t +xkb_keysym_to_lower(xkb_keysym_t ks) +{ + xkb_keysym_t lower, upper; + + XConvertCase(ks, &lower, &upper); + + return lower; +} + +xkb_keysym_t +xkb_keysym_to_upper(xkb_keysym_t ks) +{ + xkb_keysym_t lower, upper; + + XConvertCase(ks, &lower, &upper); + + return upper; +} + /* * The following is copied verbatim from libX11:src/KeyBind.c, commit * d45b3fc19fbe95c41afc4e51d768df6d42332010, with the following changes: |