Set the WM_NAME property of each monitor's root

For example, `xdo id -N Bspwm -n root -a LVDS1` now returns the ID of
the root window of the monitor named LVDS1.
This commit is contained in:
Bastien Dejean 2016-05-18 21:13:27 +02:00
parent 0b56bdefa3
commit fc02698f46
5 changed files with 15 additions and 13 deletions

View file

@ -296,7 +296,7 @@ void setup(void)
for (int i = 0; i < n; i++) {
xcb_xinerama_screen_info_t info = xsi[i];
xcb_rectangle_t rect = (xcb_rectangle_t) {info.x_org, info.y_org, info.width, info.height};
monitor_t *m = make_monitor(&rect, XCB_NONE);
monitor_t *m = make_monitor(NULL, &rect, XCB_NONE);
add_monitor(m);
add_desktop(m, make_desktop(NULL, XCB_NONE));
}
@ -304,7 +304,7 @@ void setup(void)
} else {
warn("Xinerama is inactive.\n");
xcb_rectangle_t rect = (xcb_rectangle_t) {0, 0, screen_width, screen_height};
monitor_t *m = make_monitor(&rect, XCB_NONE);
monitor_t *m = make_monitor(NULL, &rect, XCB_NONE);
add_monitor(m);
add_desktop(m, make_desktop(NULL, XCB_NONE));
}

View file

@ -1155,8 +1155,7 @@ void cmd_wm(char **args, int num, FILE *rsp)
num--, args++;
xcb_rectangle_t r;
if (parse_rectangle(*args, &r)) {
monitor_t *m = make_monitor(&r, XCB_NONE);
snprintf(m->name, sizeof(m->name), "%s", name);
monitor_t *m = make_monitor(name, &r, XCB_NONE);
add_monitor(m);
add_desktop(m, make_desktop(NULL, XCB_NONE));
} else {

View file

@ -23,6 +23,7 @@
*/
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
@ -37,14 +38,14 @@
#include "window.h"
#include "monitor.h"
monitor_t *make_monitor(xcb_rectangle_t *rect, uint32_t id)
monitor_t *make_monitor(const char *name, xcb_rectangle_t *rect, uint32_t id)
{
monitor_t *m = malloc(sizeof(monitor_t));
if (id == XCB_NONE) {
m->id = xcb_generate_id(dpy);
}
m->randr_id = XCB_NONE;
snprintf(m->name, sizeof(m->name), "%s", DEFAULT_MON_NAME);
snprintf(m->name, sizeof(m->name), "%s", name == NULL ? DEFAULT_MON_NAME : name);
m->padding = padding;
m->border_width = border_width;
m->window_gap = window_gap;
@ -72,6 +73,7 @@ void update_root(monitor_t *m, xcb_rectangle_t *rect)
rect->x, rect->y, rect->width, rect->height, 0,
XCB_WINDOW_CLASS_INPUT_ONLY, XCB_COPY_FROM_PARENT, XCB_CW_EVENT_MASK, values);
xcb_icccm_set_wm_class(dpy, m->root, sizeof(ROOT_WINDOW_IC), ROOT_WINDOW_IC);
xcb_icccm_set_wm_name(dpy, m->root, XCB_ATOM_STRING, 8, strlen(m->name), m->name);
window_lower(m->root);
if (focus_follows_pointer) {
window_show(m->root);
@ -97,6 +99,7 @@ void rename_monitor(monitor_t *m, const char *name)
put_status(SBSC_MASK_MONITOR_RENAME, "monitor_rename 0x%08X %s %s\n", m->id, m->name, name);
snprintf(m->name, sizeof(m->name), "%s", name);
xcb_icccm_set_wm_name(dpy, m->root, XCB_ATOM_STRING, 8, strlen(m->name), m->name);
put_status(SBSC_MASK_REPORT);
}
@ -449,11 +452,11 @@ bool update_monitors(void)
update_root(mm, &rect);
mm->wired = true;
} else {
mm = make_monitor(&rect, XCB_NONE);
char *name = (char *) xcb_randr_get_output_info_name(info);
int len = xcb_randr_get_output_info_name_length(info);
size_t name_size = MIN(sizeof(mm->name), (size_t) len + 1);
snprintf(mm->name, name_size, "%s", name);
size_t len = (size_t) xcb_randr_get_output_info_name_length(info);
char *name_copy = copy_string(name, len);
mm = make_monitor(name_copy, &rect, XCB_NONE);
free(name_copy);
mm->randr_id = outputs[i];
add_monitor(mm);
}

View file

@ -27,7 +27,7 @@
#define DEFAULT_MON_NAME "MONITOR"
monitor_t *make_monitor(xcb_rectangle_t *rect, uint32_t id);
monitor_t *make_monitor(const char *name, xcb_rectangle_t *rect, uint32_t id);
void update_root(monitor_t *m, xcb_rectangle_t *rect);
void rename_monitor(monitor_t *m, const char *name);
monitor_t *find_monitor(uint32_t id);

View file

@ -223,7 +223,7 @@ monitor_t *restore_monitor(jsmntok_t **t, char *json)
{
int num = (*t)->size;
(*t)++;
monitor_t *m = make_monitor(NULL, UINT32_MAX);
monitor_t *m = make_monitor(NULL, NULL, UINT32_MAX);
uint32_t focused_desktop_id = 0;
for (int i = 0; i < num; i++) {