void ewmh_init(void)
{
- ewmh = (xcb_ewmh_connection_t *) malloc(sizeof(xcb_ewmh_connection_t));
- xcb_intern_atom_cookie_t *ewmh_cookies;
- ewmh_cookies = xcb_ewmh_init_atoms(dpy, ewmh);
- xcb_ewmh_init_atoms_replies(ewmh, ewmh_cookies, NULL);
+ ewmh = malloc(sizeof(xcb_ewmh_connection_t));
+ if (xcb_ewmh_init_atoms_replies(ewmh, xcb_ewmh_init_atoms(dpy, ewmh), NULL) == 0)
+ err("Can't initialize EWMH atoms.\n");
}
void ewmh_update_wm_name(void)
{
if (wm_name != NULL)
- xcb_ewmh_set_wm_name(ewmh, screen->root, strlen(wm_name), wm_name);
+ xcb_ewmh_set_wm_name(ewmh, root, strlen(wm_name), wm_name);
}
void ewmh_update_active_window(void)
{
- xcb_window_t win = (desk->focus == NULL ? XCB_NONE : desk->focus->client->window);
+ xcb_window_t win = (mon->desk->focus == NULL ? XCB_NONE : mon->desk->focus->client->window);
xcb_ewmh_set_active_window(ewmh, default_screen, win);
}
uint32_t ewmh_get_desktop_index(desktop_t *d)
{
- desktop_t *cd = desk_head;
- uint32_t i;
+ uint32_t i = 0;
+ for (monitor_t *m = mon_head; m != NULL; m = m->next)
+ for (desktop_t *cd = m->desk_head; cd != NULL; cd = cd->next, i++)
+ if (d == cd)
+ return i;
- for (i = 0; cd != NULL && i < num_desktops; i++, cd = cd->next) {
- if (d == cd)
- break;
- }
+ return 0;
+}
- return i;
+bool ewmh_locate_desktop(uint32_t i, desktop_location_t *loc)
+{
+ for (monitor_t *m = mon_head; m != NULL; m = m->next)
+ for (desktop_t *d = m->desk_head; d != NULL; d = d->next, i--)
+ if (i == 0) {
+ loc->monitor = m;
+ loc->desktop = d;
+ return true;
+ }
+
+ return false;
}
void ewmh_update_current_desktop(void)
{
- uint32_t i = ewmh_get_desktop_index(desk);
- xcb_ewmh_set_current_desktop(ewmh, default_screen, i);
+ uint32_t i = ewmh_get_desktop_index(mon->desk);
+ xcb_ewmh_set_current_desktop(ewmh, default_screen, i);
}
void ewmh_set_wm_desktop(node_t *n, desktop_t *d)
void ewmh_update_desktop_names(void)
{
- char names[MAXLEN];
- desktop_t *d = desk_head;
- unsigned int pos, i;
-
- pos = i = 0;
-
- while (d != NULL && i < num_desktops) {
- for (unsigned int j = 0; j < strlen(d->name); j++)
- names[pos + j] = d->name[j];
- pos += strlen(d->name);
- names[pos] = '\0';
- pos++;
- d = d->next;
- i++;
- }
-
- if (i != num_desktops)
- return;
+ char names[MAXLEN];
+ unsigned int pos, i;
+ pos = i = 0;
+
+ for (monitor_t *m = mon_head; m != NULL; m = m->next)
+ for (desktop_t *d = m->desk_head; d != NULL && i < num_desktops; d = d->next) {
+ for (unsigned int j = 0; j < strlen(d->name); j++)
+ names[pos + j] = d->name[j];
+ pos += strlen(d->name);
+ names[pos] = '\0';
+ pos++, i++;
+ }
- pos--;
+ if (i != num_desktops)
+ return;
+ pos--;
- xcb_ewmh_set_desktop_names(ewmh, default_screen, pos, names);
+ xcb_ewmh_set_desktop_names(ewmh, default_screen, pos, names);
}
void ewmh_update_client_list(void)
{
if (num_clients == 0) {
xcb_ewmh_set_client_list(ewmh, default_screen, 0, NULL);
+ xcb_ewmh_set_client_list_stacking(ewmh, default_screen, 0, NULL);
return;
}
xcb_window_t wins[num_clients];
- desktop_t *d = desk_head;
unsigned int i = 0;
- while (d != NULL && i < num_clients) {
- node_t *n = first_extrema(d->root);
- while (n != NULL) {
- wins[i++] = n->client->window;
- n = next_leaf(n);
- }
- d = d->next;
- }
+ for (monitor_t *m = mon_head; m != NULL; m = m->next)
+ for (desktop_t *d = m->desk_head; d != NULL; d = d->next)
+ for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root))
+ wins[i++] = n->client->window;
if (i != num_clients)
return;
xcb_ewmh_set_client_list(ewmh, default_screen, num_clients, wins);
+ xcb_ewmh_set_client_list_stacking(ewmh, default_screen, num_clients, wins);
}