]> git.sur5r.net Git - i3/i3/commitdiff
make i3bar use libi3’s root_atom_contents()
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 22 Nov 2013 14:48:45 +0000 (15:48 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 22 Nov 2013 14:48:45 +0000 (15:48 +0100)
This removes code duplication, which will be useful for a subsequent
commit.

Furthermore, we now don’t open X11 connections unnecessarily in some
corner cases.

i3-config-wizard/main.c
i3-dump-log/main.c
i3-input/main.c
i3-msg/main.c
i3bar/src/xcb.c
include/libi3.h
libi3/root_atom_contents.c
src/display_version.c
src/main.c

index ffc3df93011869e88561e523445fa9e267aeb68e..880b80ed8b4b84124c41325b9e733cd85856d57a 100644 (file)
@@ -791,17 +791,17 @@ int main(int argc, char *argv[]) {
     close(fd);
     unlink(config_path);
 
+    int screen;
+    if ((conn = xcb_connect(NULL, &screen)) == NULL ||
+        xcb_connection_has_error(conn))
+        errx(1, "Cannot open display\n");
+
     if (socket_path == NULL)
-        socket_path = root_atom_contents("I3_SOCKET_PATH");
+        socket_path = root_atom_contents("I3_SOCKET_PATH", conn, screen);
 
     if (socket_path == NULL)
         socket_path = "/tmp/i3-ipc.sock";
 
-    int screens;
-    if ((conn = xcb_connect(NULL, &screens)) == NULL ||
-        xcb_connection_has_error(conn))
-        errx(1, "Cannot open display\n");
-
     keysyms = xcb_key_symbols_alloc(conn);
     xcb_get_modifier_mapping_cookie_t modmap_cookie;
     modmap_cookie = xcb_get_modifier_mapping(conn);
@@ -813,7 +813,7 @@ int main(int argc, char *argv[]) {
     #include "atoms.xmacro"
     #undef xmacro
 
-    root_screen = xcb_aux_get_screen(conn, screens);
+    root_screen = xcb_aux_get_screen(conn, screen);
     root = root_screen->root;
 
     if (!(modmap_reply = xcb_get_modifier_mapping_reply(conn, modmap_cookie, NULL)))
index 852a5cf7b2fc944e50272fcd2c1a9b676c2070f6..acb7fcb1f36308b64a2f075b038668c20f55f00c 100644 (file)
@@ -90,7 +90,7 @@ int main(int argc, char *argv[]) {
         }
     }
 
-    char *shmname = root_atom_contents("I3_SHMLOG_PATH");
+    char *shmname = root_atom_contents("I3_SHMLOG_PATH", NULL, 0);
     if (shmname == NULL) {
         /* Something failed. Let’s invest a little effort to find out what it
          * is. This is hugely helpful for users who want to debug i3 but are
@@ -109,7 +109,7 @@ int main(int argc, char *argv[]) {
             fprintf(stderr, "FYI: The DISPLAY environment variable is set to \"%s\".\n", getenv("DISPLAY"));
             exit(1);
         }
-        if (root_atom_contents("I3_CONFIG_PATH") != NULL) {
+        if (root_atom_contents("I3_CONFIG_PATH", conn, screen) != NULL) {
             fprintf(stderr, "i3-dump-log: ERROR: i3 is running, but SHM logging is not enabled.\n\n");
             if (!is_debug_build()) {
                 fprintf(stderr, "You seem to be using a release version of i3:\n  %s\n\n", I3_VERSION);
index 49db4df231dd234260e30369d3f589353140b78f..da95c903fae825cf762d7633bcc7dd0bac2fa555 100644 (file)
@@ -368,23 +368,23 @@ int main(int argc, char *argv[]) {
 
     printf("using format \"%s\"\n", format);
 
+    int screen;
+    conn = xcb_connect(NULL, &screen);
+    if (!conn || xcb_connection_has_error(conn))
+        die("Cannot open display\n");
+
     if (socket_path == NULL)
-        socket_path = root_atom_contents("I3_SOCKET_PATH");
+        socket_path = root_atom_contents("I3_SOCKET_PATH", conn, screen);
 
     if (socket_path == NULL)
         socket_path = "/tmp/i3-ipc.sock";
 
     sockfd = ipc_connect(socket_path);
 
-    int screens;
-    conn = xcb_connect(NULL, &screens);
-    if (!conn || xcb_connection_has_error(conn))
-        die("Cannot open display\n");
-
     /* Request the current InputFocus to restore when i3-input exits. */
     focus_cookie = xcb_get_input_focus(conn);
 
-    root_screen = xcb_aux_get_screen(conn, screens);
+    root_screen = xcb_aux_get_screen(conn, screen);
     root = root_screen->root;
 
     symbols = xcb_key_symbols_alloc(conn);
index a1428fb8f5f89aac9e35f68420f983b808ee7303..935edc0467609a330ce6d3640778ab4f61bd764c 100644 (file)
@@ -188,7 +188,7 @@ int main(int argc, char *argv[]) {
     }
 
     if (socket_path == NULL)
-        socket_path = root_atom_contents("I3_SOCKET_PATH");
+        socket_path = root_atom_contents("I3_SOCKET_PATH", NULL, 0);
 
     /* Fall back to the default socket path */
     if (socket_path == NULL)
index cec7ab82db8b43673345d6d3e23022be38006b15..0c8de65ec5baeb5a8025deaee577f951ca3118b5 100644 (file)
@@ -960,26 +960,7 @@ char *init_xcb_early() {
     /* Now we get the atoms and save them in a nice data structure */
     get_atoms();
 
-    xcb_get_property_cookie_t path_cookie;
-    path_cookie = xcb_get_property_unchecked(xcb_connection,
-                                   0,
-                                   xcb_root,
-                                   atoms[I3_SOCKET_PATH],
-                                   XCB_GET_PROPERTY_TYPE_ANY,
-                                   0, PATH_MAX);
-
-    /* We check, if i3 set its socket-path */
-    xcb_get_property_reply_t *path_reply = xcb_get_property_reply(xcb_connection,
-                                                                  path_cookie,
-                                                                  NULL);
-    char *path = NULL;
-    if (path_reply) {
-        int len = xcb_get_property_value_length(path_reply);
-        if (len != 0) {
-            path = strndup(xcb_get_property_value(path_reply), len);
-        }
-    }
-
+    char *path = root_atom_contents("I3_SOCKET_PATH", xcb_connection, screen);
 
     if (xcb_request_failed(sl_pm_cookie, "Could not allocate statusline-buffer") ||
         xcb_request_failed(clear_ctx_cookie, "Could not allocate statusline-buffer-clearcontext") ||
index b0141f1df9cc22c8eae3e6abf4b2961967ce0330..9ba780042310128c0530674028cb9520f7779cc9 100644 (file)
@@ -84,11 +84,14 @@ void errorlog(char *fmt, ...);
  * Try to get the contents of the given atom (for example I3_SOCKET_PATH) from
  * the X11 root window and return NULL if it doesn’t work.
  *
+ * If the provided XCB connection is NULL, a new connection will be
+ * established.
+ *
  * The memory for the contents is dynamically allocated and has to be
  * free()d by the caller.
  *
  */
-char *root_atom_contents(const char *atomname);
+char *root_atom_contents(const char *atomname, xcb_connection_t *provided_conn, int screen);
 
 /**
  * Safe-wrapper around malloc which exits if malloc returns NULL (meaning that
index cabaaf2c3965f70c27be20937dbee3c377cc8ccf..697441ebadf8588f254bb53597032b4ab06dc4b4 100644 (file)
  * Try to get the contents of the given atom (for example I3_SOCKET_PATH) from
  * the X11 root window and return NULL if it doesn’t work.
  *
+ * If the provided XCB connection is NULL, a new connection will be
+ * established.
+ *
  * The memory for the contents is dynamically allocated and has to be
  * free()d by the caller.
  *
  */
-char *root_atom_contents(const char *atomname) {
-    xcb_connection_t *conn;
+char *root_atom_contents(const char *atomname, xcb_connection_t *provided_conn, int screen) {
     xcb_intern_atom_cookie_t atom_cookie;
     xcb_intern_atom_reply_t *atom_reply;
-    int screen;
     char *content;
+    xcb_connection_t *conn = provided_conn;
 
-    if ((conn = xcb_connect(NULL, &screen)) == NULL ||
-        xcb_connection_has_error(conn))
+    if (provided_conn == NULL &&
+        ((conn = xcb_connect(NULL, &screen)) == NULL ||
+         xcb_connection_has_error(conn)))
         return NULL;
 
     atom_cookie = xcb_intern_atom(conn, 0, strlen(atomname), atomname);
@@ -60,7 +63,8 @@ char *root_atom_contents(const char *atomname) {
                      (char*)xcb_get_property_value(prop_reply)) == -1)
             return NULL;
     }
-    xcb_disconnect(conn);
+    if (provided_conn == NULL)
+        xcb_disconnect(conn);
     return content;
 }
 
index 0901ae07b4cfea2cb391e5e5cd89899605e2c386..5fa4f8e2234945831776b36be875b444e177de15 100644 (file)
@@ -68,11 +68,11 @@ static yajl_callbacks version_callbacks = {
  *
  */
 void display_running_version(void) {
-    char *socket_path = root_atom_contents("I3_SOCKET_PATH");
+    char *socket_path = root_atom_contents("I3_SOCKET_PATH", conn, conn_screen);
     if (socket_path == NULL)
         exit(EXIT_SUCCESS);
 
-    char *pid_from_atom = root_atom_contents("I3_PID");
+    char *pid_from_atom = root_atom_contents("I3_PID", conn, conn_screen);
     if (pid_from_atom == NULL) {
         /* If I3_PID is not set, the running version is older than 4.2-200. */
         printf("\nRunning version: < 4.2-200\n");
index aac738831915fc8a003626bfd5f64595373d4d88..2b397181fc88088e60f43faa0956768cf2dd52e8 100644 (file)
@@ -352,7 +352,7 @@ int main(int argc, char *argv[]) {
                     break;
                 } else if (strcmp(long_options[option_index].name, "get-socketpath") == 0 ||
                            strcmp(long_options[option_index].name, "get_socketpath") == 0) {
-                    char *socket_path = root_atom_contents("I3_SOCKET_PATH");
+                    char *socket_path = root_atom_contents("I3_SOCKET_PATH", NULL, 0);
                     if (socket_path) {
                         printf("%s\n", socket_path);
                         exit(EXIT_SUCCESS);
@@ -442,7 +442,7 @@ int main(int argc, char *argv[]) {
             optind++;
         }
         DLOG("Command is: %s (%zd bytes)\n", payload, strlen(payload));
-        char *socket_path = root_atom_contents("I3_SOCKET_PATH");
+        char *socket_path = root_atom_contents("I3_SOCKET_PATH", NULL, 0);
         if (!socket_path) {
             ELOG("Could not get i3 IPC socket path\n");
             return 1;