aboutsummaryrefslogtreecommitdiff
path: root/src/x11/x11-priv.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/x11/x11-priv.h')
-rw-r--r--src/x11/x11-priv.h60
1 files changed, 43 insertions, 17 deletions
diff --git a/src/x11/x11-priv.h b/src/x11/x11-priv.h
index 3a19e99..7f37fd5 100644
--- a/src/x11/x11-priv.h
+++ b/src/x11/x11-priv.h
@@ -29,26 +29,52 @@
#include "keymap.h"
#include "xkbcommon/xkbcommon-x11.h"
-/* Get a strdup'd name of an X atom. */
-bool
-get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out);
+struct x11_atom_interner {
+ struct xkb_context *ctx;
+ xcb_connection_t *conn;
+ bool had_error;
+ /* Atoms for which we send a GetAtomName request */
+ struct {
+ xcb_atom_t from;
+ xkb_atom_t *out;
+ xcb_get_atom_name_cookie_t cookie;
+ } pending[128];
+ size_t num_pending;
+ /* Atoms which were already pending but queried again */
+ struct {
+ xcb_atom_t from;
+ xkb_atom_t *out;
+ } copies[128];
+ size_t num_copies;
+ /* These are not interned, but saved directly (after XkbEscapeMapName) */
+ struct {
+ xcb_get_atom_name_cookie_t cookie;
+ char **out;
+ } escaped[4];
+ size_t num_escaped;
+};
+
+void
+x11_atom_interner_init(struct x11_atom_interner *interner,
+ struct xkb_context *ctx, xcb_connection_t *conn);
+
+void
+x11_atom_interner_round_trip(struct x11_atom_interner *interner);
/*
- * Make a xkb_atom_t's from X atoms (prefer to send as many as possible
- * at once, to avoid many roundtrips).
- *
- * TODO: We can make this more flexible, such that @to doesn't have to
- * be sequential. Then we can convert most adopt_atom() calls to
- * adopt_atoms().
- * Atom caching would also likely be useful for avoiding quite a
- * few requests.
+ * Make a xkb_atom_t's from X atoms. The actual write is delayed until the next
+ * call to x11_atom_interner_round_trip() or when too many atoms are pending.
*/
-bool
-adopt_atoms(struct xkb_context *ctx, xcb_connection_t *conn,
- const xcb_atom_t *from, xkb_atom_t *to, size_t count);
+void
+x11_atom_interner_adopt_atom(struct x11_atom_interner *interner,
+ const xcb_atom_t atom, xkb_atom_t *out);
-bool
-adopt_atom(struct xkb_context *ctx, xcb_connection_t *conn, xcb_atom_t atom,
- xkb_atom_t *out);
+/*
+ * Get a strdup'd and XkbEscapeMapName'd name of an X atom. The actual write is
+ * delayed until the next call to x11_atom_interner_round_trip().
+ */
+void
+x11_atom_interner_get_escaped_atom_name(struct x11_atom_interner *interner,
+ xcb_atom_t atom, char **out);
#endif