diff options
Diffstat (limited to 'src/x11/x11-priv.h')
-rw-r--r-- | src/x11/x11-priv.h | 60 |
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 |