Esempio n. 1
0
// an X screen. may have multiple monitors, xinerama, etc
void
setup_screen()
{
	int i;
	Window w;
	supporting = XCreateSimpleWindow(display, root, 0, 0, 1, 1, 0, 0, 0);
	unsigned long pid = getpid();

	// EWMH
	XChangeProperty(display, root, netatoms[_NET_SUPPORTED], XA_ATOM, 32,
	    PropModeReplace, (unsigned char *) netatoms, NETATOMS);

	// ewmh supporting wm
	XChangeProperty(display, root, netatoms[_NET_SUPPORTING_WM_CHECK],
	    XA_WINDOW, 32, PropModeReplace, (unsigned char *) &supporting, 1);
	XChangeProperty(display, supporting,
	    netatoms[_NET_SUPPORTING_WM_CHECK], XA_WINDOW, 32, PropModeReplace,
	    (unsigned char *) &supporting, 1);
	XChangeProperty(display, supporting, netatoms[_NET_WM_NAME], XA_STRING,
	    8, PropModeReplace, (const unsigned char *) "GoomwWM", 6);
	XChangeProperty(display, supporting, netatoms[_NET_WM_PID],
	    XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &pid, 1);

	// become the window manager here
	XSelectInput(display, root,
	    StructureNotifyMask | SubstructureRedirectMask |
	    SubstructureNotifyMask);

	// setup any existing windows
	winlist *l = window_children();
	winlist_ascend(l, i, w) {
		wincache *cache = allocate_clear(sizeof(wincache));
		winlist_append(windows, w, cache);
		client *c = client_create(w);
		if (c && c->manage && (c->visible
			|| client_get_wm_state(c) == IconicState)) {
			window_select(c->window);
			winlist_append(c->
			    visible ? windows_activated : windows_shaded,
			    c->window, NULL);
			client_full_review(c);
		}
	}
Esempio n. 2
0
// XGetWindowAttributes with caching
XWindowAttributes* window_get_attributes(Window w)
{
	int idx = winlist_find(cache_xattr, w);
	if (idx < 0)
	{
		XWindowAttributes *cattr = allocate(sizeof(XWindowAttributes));
		if (XGetWindowAttributes(display, w, cattr))
		{
			winlist_append(cache_xattr, w, cattr);
			return cattr;
		}
		free(cattr);
		return NULL;
	}
	return cache_xattr->data[idx];
}
Esempio n. 3
0
// top-level windows, visible or not. DOES include non-managable docks/panels
winlist* window_children()
{
	winlist *l = winlist_new();
	unsigned int nwins; int i; Window w1, w2, *wins;
	if (XQueryTree(display, root, &w1, &w2, &wins, &nwins) && wins)
	{
		for (i = 0; i < nwins; i++)
		{
			XWindowAttributes *attr = window_get_attributes(wins[i]);
			if (attr && attr->override_redirect == False && (attr->map_state == IsUnmapped || attr->map_state == IsViewable))
				winlist_append(l, wins[i], NULL);
		}
	}
	if (wins) XFree(wins);
	return l;
}
Esempio n. 4
0
// top-level, visible windows. DOES include non-managable docks/panels
winlist* windows_in_play()
{
	if (cache_inplay->len) return cache_inplay;

	unsigned int nwins; int i; Window w1, w2, *wins;
	if (XQueryTree(display, root, &w1, &w2, &wins, &nwins) && wins)
	{
		for (i = 0; i < nwins; i++)
		{
			XWindowAttributes *attr = window_get_attributes(wins[i]);
			if (attr && attr->override_redirect == False && attr->map_state == IsViewable)
				winlist_append(cache_inplay, wins[i], NULL);
		}
	}
	if (wins) XFree(wins);
	return cache_inplay;
}