summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/x11/keymap.c22
-rw-r--r--src/x11/util.c17
-rw-r--r--src/x11/x11-priv.h8
3 files changed, 39 insertions, 8 deletions
diff --git a/src/x11/keymap.c b/src/x11/keymap.c
index 38be217..67319a8 100644
--- a/src/x11/keymap.c
+++ b/src/x11/keymap.c
@@ -1087,10 +1087,24 @@ get_names(struct xkb_keymap *keymap, struct x11_atom_interner *interner,
reply->which,
&list);
- if (!get_atom_name(conn, list.keycodesName, &keymap->keycodes_section_name) ||
- !get_atom_name(conn, list.symbolsName, &keymap->symbols_section_name) ||
- !get_atom_name(conn, list.typesName, &keymap->types_section_name) ||
- !get_atom_name(conn, list.compatName, &keymap->compat_section_name) ||
+ xcb_get_atom_name_cookie_t cookies[4];
+ get_atom_name(conn, list.keycodesName, &cookies[0]);
+ get_atom_name(conn, list.symbolsName, &cookies[1]);
+ get_atom_name(conn, list.typesName, &cookies[2]);
+ get_atom_name(conn, list.compatName, &cookies[3]);
+
+ /* We need to ensure all replies are collected and thus no short-circuit */
+ bool atom_success = true;
+ atom_success &= get_atom_name_reply(conn, list.keycodesName, cookies[0],
+ &keymap->keycodes_section_name);
+ atom_success &= get_atom_name_reply(conn, list.symbolsName, cookies[1],
+ &keymap->symbols_section_name);
+ atom_success &= get_atom_name_reply(conn, list.typesName, cookies[2],
+ &keymap->types_section_name);
+ atom_success &= get_atom_name_reply(conn, list.compatName, cookies[3],
+ &keymap->compat_section_name);
+
+ if (!atom_success ||
!get_type_names(keymap, interner, reply, &list) ||
!get_indicator_names(keymap, interner, reply, &list) ||
!get_vmod_names(keymap, interner, reply, &list) ||
diff --git a/src/x11/util.c b/src/x11/util.c
index 766e9a0..6618dfe 100644
--- a/src/x11/util.c
+++ b/src/x11/util.c
@@ -124,20 +124,31 @@ xkb_x11_get_core_keyboard_device_id(xcb_connection_t *conn)
return device_id;
}
+void
+get_atom_name(xcb_connection_t *conn, xcb_atom_t atom,
+ xcb_get_atom_name_cookie_t *cookie)
+{
+ if (atom == 0) {
+ cookie->sequence = 0;
+ } else {
+ *cookie = xcb_get_atom_name(conn, atom);
+ }
+}
+
bool
-get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out)
+get_atom_name_reply(xcb_connection_t *conn, xcb_atom_t atom,
+ xcb_get_atom_name_cookie_t cookie, char **out)
{
- xcb_get_atom_name_cookie_t cookie;
xcb_get_atom_name_reply_t *reply;
int length;
char *name;
if (atom == 0) {
*out = NULL;
+ assert(cookie.sequence == 0);
return true;
}
- cookie = xcb_get_atom_name(conn, atom);
reply = xcb_get_atom_name_reply(conn, cookie, NULL);
if (!reply)
return false;
diff --git a/src/x11/x11-priv.h b/src/x11/x11-priv.h
index 5b7f5c2..9a6e8e0 100644
--- a/src/x11/x11-priv.h
+++ b/src/x11/x11-priv.h
@@ -29,9 +29,15 @@
#include "keymap.h"
#include "xkbcommon/xkbcommon-x11.h"
+/* Preparation for get_atom_name_reply() */
+void
+get_atom_name(xcb_connection_t *conn, xcb_atom_t atom,
+ xcb_get_atom_name_cookie_t *cookie);
+
/* Get a strdup'd name of an X atom. */
bool
-get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out);
+get_atom_name_reply(xcb_connection_t *conn, xcb_atom_t atom,
+ xcb_get_atom_name_cookie_t cookie, char **out);
struct x11_atom_interner {
struct xkb_context *ctx;