make i3bar use libi3’s root_atom_contents()
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.
This commit is contained in:
parent
ca39289e3e
commit
d3beff2339
|
@ -791,17 +791,17 @@ int main(int argc, char *argv[]) {
|
||||||
close(fd);
|
close(fd);
|
||||||
unlink(config_path);
|
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)
|
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)
|
if (socket_path == NULL)
|
||||||
socket_path = "/tmp/i3-ipc.sock";
|
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);
|
keysyms = xcb_key_symbols_alloc(conn);
|
||||||
xcb_get_modifier_mapping_cookie_t modmap_cookie;
|
xcb_get_modifier_mapping_cookie_t modmap_cookie;
|
||||||
modmap_cookie = xcb_get_modifier_mapping(conn);
|
modmap_cookie = xcb_get_modifier_mapping(conn);
|
||||||
|
@ -813,7 +813,7 @@ int main(int argc, char *argv[]) {
|
||||||
#include "atoms.xmacro"
|
#include "atoms.xmacro"
|
||||||
#undef xmacro
|
#undef xmacro
|
||||||
|
|
||||||
root_screen = xcb_aux_get_screen(conn, screens);
|
root_screen = xcb_aux_get_screen(conn, screen);
|
||||||
root = root_screen->root;
|
root = root_screen->root;
|
||||||
|
|
||||||
if (!(modmap_reply = xcb_get_modifier_mapping_reply(conn, modmap_cookie, NULL)))
|
if (!(modmap_reply = xcb_get_modifier_mapping_reply(conn, modmap_cookie, NULL)))
|
||||||
|
|
|
@ -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) {
|
if (shmname == NULL) {
|
||||||
/* Something failed. Let’s invest a little effort to find out what it
|
/* 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
|
* 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"));
|
fprintf(stderr, "FYI: The DISPLAY environment variable is set to \"%s\".\n", getenv("DISPLAY"));
|
||||||
exit(1);
|
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");
|
fprintf(stderr, "i3-dump-log: ERROR: i3 is running, but SHM logging is not enabled.\n\n");
|
||||||
if (!is_debug_build()) {
|
if (!is_debug_build()) {
|
||||||
fprintf(stderr, "You seem to be using a release version of i3:\n %s\n\n", I3_VERSION);
|
fprintf(stderr, "You seem to be using a release version of i3:\n %s\n\n", I3_VERSION);
|
||||||
|
|
|
@ -368,23 +368,23 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
printf("using format \"%s\"\n", format);
|
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)
|
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)
|
if (socket_path == NULL)
|
||||||
socket_path = "/tmp/i3-ipc.sock";
|
socket_path = "/tmp/i3-ipc.sock";
|
||||||
|
|
||||||
sockfd = ipc_connect(socket_path);
|
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. */
|
/* Request the current InputFocus to restore when i3-input exits. */
|
||||||
focus_cookie = xcb_get_input_focus(conn);
|
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;
|
root = root_screen->root;
|
||||||
|
|
||||||
symbols = xcb_key_symbols_alloc(conn);
|
symbols = xcb_key_symbols_alloc(conn);
|
||||||
|
|
|
@ -188,7 +188,7 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (socket_path == NULL)
|
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 */
|
/* Fall back to the default socket path */
|
||||||
if (socket_path == NULL)
|
if (socket_path == NULL)
|
||||||
|
|
|
@ -960,26 +960,7 @@ char *init_xcb_early() {
|
||||||
/* Now we get the atoms and save them in a nice data structure */
|
/* Now we get the atoms and save them in a nice data structure */
|
||||||
get_atoms();
|
get_atoms();
|
||||||
|
|
||||||
xcb_get_property_cookie_t path_cookie;
|
char *path = root_atom_contents("I3_SOCKET_PATH", xcb_connection, screen);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (xcb_request_failed(sl_pm_cookie, "Could not allocate statusline-buffer") ||
|
if (xcb_request_failed(sl_pm_cookie, "Could not allocate statusline-buffer") ||
|
||||||
xcb_request_failed(clear_ctx_cookie, "Could not allocate statusline-buffer-clearcontext") ||
|
xcb_request_failed(clear_ctx_cookie, "Could not allocate statusline-buffer-clearcontext") ||
|
||||||
|
|
|
@ -84,11 +84,14 @@ void errorlog(char *fmt, ...);
|
||||||
* Try to get the contents of the given atom (for example I3_SOCKET_PATH) from
|
* 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.
|
* 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
|
* The memory for the contents is dynamically allocated and has to be
|
||||||
* free()d by the caller.
|
* 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
|
* Safe-wrapper around malloc which exits if malloc returns NULL (meaning that
|
||||||
|
|
|
@ -19,19 +19,22 @@
|
||||||
* Try to get the contents of the given atom (for example I3_SOCKET_PATH) from
|
* 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.
|
* 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
|
* The memory for the contents is dynamically allocated and has to be
|
||||||
* free()d by the caller.
|
* 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) {
|
||||||
xcb_connection_t *conn;
|
|
||||||
xcb_intern_atom_cookie_t atom_cookie;
|
xcb_intern_atom_cookie_t atom_cookie;
|
||||||
xcb_intern_atom_reply_t *atom_reply;
|
xcb_intern_atom_reply_t *atom_reply;
|
||||||
int screen;
|
|
||||||
char *content;
|
char *content;
|
||||||
|
xcb_connection_t *conn = provided_conn;
|
||||||
|
|
||||||
if ((conn = xcb_connect(NULL, &screen)) == NULL ||
|
if (provided_conn == NULL &&
|
||||||
xcb_connection_has_error(conn))
|
((conn = xcb_connect(NULL, &screen)) == NULL ||
|
||||||
|
xcb_connection_has_error(conn)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
atom_cookie = xcb_intern_atom(conn, 0, strlen(atomname), atomname);
|
atom_cookie = xcb_intern_atom(conn, 0, strlen(atomname), atomname);
|
||||||
|
@ -60,6 +63,7 @@ char *root_atom_contents(const char *atomname) {
|
||||||
(char*)xcb_get_property_value(prop_reply)) == -1)
|
(char*)xcb_get_property_value(prop_reply)) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (provided_conn == NULL)
|
||||||
xcb_disconnect(conn);
|
xcb_disconnect(conn);
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,11 +68,11 @@ static yajl_callbacks version_callbacks = {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void display_running_version(void) {
|
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)
|
if (socket_path == NULL)
|
||||||
exit(EXIT_SUCCESS);
|
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 (pid_from_atom == NULL) {
|
||||||
/* If I3_PID is not set, the running version is older than 4.2-200. */
|
/* If I3_PID is not set, the running version is older than 4.2-200. */
|
||||||
printf("\nRunning version: < 4.2-200\n");
|
printf("\nRunning version: < 4.2-200\n");
|
||||||
|
|
|
@ -352,7 +352,7 @@ int main(int argc, char *argv[]) {
|
||||||
break;
|
break;
|
||||||
} else if (strcmp(long_options[option_index].name, "get-socketpath") == 0 ||
|
} else if (strcmp(long_options[option_index].name, "get-socketpath") == 0 ||
|
||||||
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) {
|
if (socket_path) {
|
||||||
printf("%s\n", socket_path);
|
printf("%s\n", socket_path);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
@ -442,7 +442,7 @@ int main(int argc, char *argv[]) {
|
||||||
optind++;
|
optind++;
|
||||||
}
|
}
|
||||||
DLOG("Command is: %s (%zd bytes)\n", payload, strlen(payload));
|
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) {
|
if (!socket_path) {
|
||||||
ELOG("Could not get i3 IPC socket path\n");
|
ELOG("Could not get i3 IPC socket path\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue