示例#1
0
// === WindowWorkspace() ===
unsigned int LXCB::WindowWorkspace(WId win){
  if(DEBUG){ qDebug() << "XCB: WindowWorkspace()" << win; }
  //qDebug() << "Get Window Workspace";
  if(win==0){ return 0; }
  uint32_t wkspace = 0;
  xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_desktop_unchecked(&EWMH, win);
  if(cookie.sequence == 0){ return wkspace; } 
  xcb_ewmh_get_wm_desktop_reply(&EWMH, cookie, &wkspace, NULL);
  //qDebug() << " - done: " << wkspace;
  return wkspace;	
}
示例#2
0
文件: window.c 项目: Stebalien/bspwm
void adopt_orphans(void)
{
	xcb_query_tree_reply_t *qtr = xcb_query_tree_reply(dpy, xcb_query_tree(dpy, root), NULL);
	if (qtr == NULL) {
		return;
	}

	int len = xcb_query_tree_children_length(qtr);
	xcb_window_t *wins = xcb_query_tree_children(qtr);

	for (int i = 0; i < len; i++) {
		uint32_t idx;
		xcb_window_t win = wins[i];
		if (xcb_ewmh_get_wm_desktop_reply(ewmh, xcb_ewmh_get_wm_desktop(ewmh, win), &idx, NULL) == 1) {
			schedule_window(win);
		}
	}

	free(qtr);
}
示例#3
0
static int
widget_update (struct widget *widget, xcb_ewmh_connection_t *ewmh, int screen_nbr) {
	unsigned short i;
	uint32_t desktop_curr, desktop_len, client_desktop;
	char desktop_name[COPY_PROP_BUFSIZ];
	xcb_ewmh_get_utf8_strings_reply_t desktop_names;
	xcb_ewmh_get_windows_reply_t clients;
	xcb_icccm_wm_hints_t window_hints;
	struct desktop *desktops;

	/* get current desktop */
	int desktop_curr_success = xcb_ewmh_get_current_desktop_reply(ewmh, xcb_ewmh_get_current_desktop_unchecked(ewmh, screen_nbr), &desktop_curr, NULL);
	if (!desktop_curr_success) {
		LOG_DEBUG("ewmh: could not get current desktop");

		return 1;
	}

	/* get desktop count */
	int desktop_len_success = xcb_ewmh_get_number_of_desktops_reply(ewmh, xcb_ewmh_get_number_of_desktops_unchecked(ewmh, screen_nbr), &desktop_len, NULL);
	if (!desktop_len_success) {
		LOG_DEBUG("ewmh: could not get desktop count");

		return 2;
	}

	desktops = calloc(desktop_len, sizeof(struct desktop));

	int desktop_names_success = xcb_ewmh_get_desktop_names_reply(ewmh, xcb_ewmh_get_desktop_names_unchecked(ewmh, screen_nbr), &desktop_names, NULL);
	if (!desktop_names_success) {
		LOG_DEBUG("ewmh: could not get desktop names");
	}

	for (i = 0; i < desktop_len; i++) {
		desktops[i].is_selected = i == desktop_curr;
		desktops[i].is_urgent = false;
		desktops[i].clients_len = 0;

		if (desktop_names_success && desktop_names.strings) {
			copy_prop(desktop_name, desktop_names.strings, desktop_names.strings_len, i, desktop_len);
		}
		else {
			snprintf(desktop_name, COPY_PROP_BUFSIZ - 1, "%i", i + 1);
		}
		desktops[i].name = strndup(desktop_name, strlen(desktop_name));
	}

	/* get clients */
	int clients_success = xcb_ewmh_get_client_list_reply(ewmh, xcb_ewmh_get_client_list_unchecked(ewmh, screen_nbr), &clients, NULL);
	if (!clients_success) {
		LOG_DEBUG("ewmh: could not get client list");
	}
	else {
		for (i = 0; i < clients.windows_len; i++) {
			if (!xcb_ewmh_get_wm_desktop_reply(ewmh, xcb_ewmh_get_wm_desktop_unchecked(ewmh, clients.windows[i]), &client_desktop, NULL)) {
				/* window isn't associated with a desktop */
				continue;
			}
			desktops[client_desktop].clients_len++;

			/* check icccm urgency hint on client */
			if (!xcb_icccm_get_wm_hints_reply(ewmh->connection, xcb_icccm_get_wm_hints_unchecked(ewmh->connection, clients.windows[i]), &window_hints, NULL)) {
				LOG_DEBUG("icccm: could not get window hints");
			}
			if (window_hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY) {
				desktops[client_desktop].is_urgent = true;
			}
		}
	}

	json_t *json_data_object = json_object();
	json_t *json_desktops_array = json_array();
	json_object_set_new(json_data_object, "desktops", json_desktops_array);

	for (i = 0; i < desktop_len; i++) {
		json_t *json_desktop = json_object();
		json_object_set_new(json_desktop, "name", json_string(desktops[i].name));
		json_object_set_new(json_desktop, "clients_len", json_integer(desktops[i].clients_len));
		json_object_set_new(json_desktop, "is_urgent", json_boolean(desktops[i].is_urgent));
		json_array_append_new(json_desktops_array, json_desktop);

		if (desktops[i].is_selected) {
			json_object_set_new(json_data_object, "current_desktop", json_integer(i));
		}
	}

	char *json_str = strdup(json_dumps(json_data_object, 0));
	widget_data_callback(widget, widget_data_arg_string(json_str));

	json_decref(json_data_object);
	free(json_str);

	/* cleanup */
	if (desktop_names_success) {
		xcb_ewmh_get_utf8_strings_reply_wipe(&desktop_names);
	}
	if (clients_success) {
		xcb_ewmh_get_windows_reply_wipe(&clients);
	}
	for (i = 0; i < desktop_len; i++) {
		free(desktops[i].name);
	}
	free(desktops);

	return 0;
}