From b8e782c9836d14a14c8afcf6d42dc22055edca9a Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 12 Aug 2012 14:10:48 +0200 Subject: [PATCH] root_atom_contents: handle CARDINAL atoms such as I3_PID --- libi3/root_atom_contents.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libi3/root_atom_contents.c b/libi3/root_atom_contents.c index 927cc5f8..cabaaf2c 100644 --- a/libi3/root_atom_contents.c +++ b/libi3/root_atom_contents.c @@ -28,7 +28,7 @@ char *root_atom_contents(const char *atomname) { xcb_intern_atom_cookie_t atom_cookie; xcb_intern_atom_reply_t *atom_reply; int screen; - char *socket_path; + char *content; if ((conn = xcb_connect(NULL, &screen)) == NULL || xcb_connection_has_error(conn)) @@ -50,10 +50,17 @@ char *root_atom_contents(const char *atomname) { prop_reply = xcb_get_property_reply(conn, prop_cookie, NULL); if (prop_reply == NULL || xcb_get_property_value_length(prop_reply) == 0) return NULL; - if (asprintf(&socket_path, "%.*s", xcb_get_property_value_length(prop_reply), - (char*)xcb_get_property_value(prop_reply)) == -1) - return NULL; + if (prop_reply->type == XCB_ATOM_CARDINAL) { + /* We treat a CARDINAL as a >= 32-bit unsigned int. The only CARDINAL + * we query is I3_PID, which is 32-bit. */ + if (asprintf(&content, "%u", *((unsigned int*)xcb_get_property_value(prop_reply))) == -1) + return NULL; + } else { + if (asprintf(&content, "%.*s", xcb_get_property_value_length(prop_reply), + (char*)xcb_get_property_value(prop_reply)) == -1) + return NULL; + } xcb_disconnect(conn); - return socket_path; + return content; }