+ewmh_update_desktops(void)
+{
+ int num_screens, i, j;
+ uint32_t *vals;
+
+ vals = calloc(workspace_limit * 2, sizeof(uint32_t));
+ if (vals == NULL)
+ err(1, "ewmh_update_desktops: calloc: failed to allocate "
+ "memory.");
+
+ num_screens = get_screen_count();
+ for (i = 0; i < num_screens; i++) {
+ xcb_change_property(conn, XCB_PROP_MODE_REPLACE,
+ screens[i].root, ewmh[_NET_NUMBER_OF_DESKTOPS].atom,
+ XCB_ATOM_CARDINAL, 32, 1, &workspace_limit);
+
+ for (j = 0; j < workspace_limit; ++j) {
+ if (screens[i].ws[j].r != NULL) {
+ vals[j * 2] = X(screens[i].ws[j].r);
+ vals[j * 2 + 1] = Y(screens[i].ws[j].r);
+ } else if (screens[i].ws[j].old_r != NULL) {
+ vals[j * 2] = X(screens[i].ws[j].old_r);
+ vals[j * 2 + 1] = Y(screens[i].ws[j].old_r);
+ } else {
+ vals[j * 2] = vals[j * 2 + 1] = 0;
+ }
+ }
+
+ xcb_change_property(conn, XCB_PROP_MODE_REPLACE,
+ screens[i].root, ewmh[_NET_DESKTOP_VIEWPORT].atom,
+ XCB_ATOM_CARDINAL, 32, workspace_limit * 2, vals);
+ }
+
+ free(vals);
+}
+
+void