about summary refs log tree commit diff stats
path: root/client.c
diff options
context:
space:
mode:
authorAnselm R. Garbe <garbeam@wmii.de>2006-07-10 22:16:48 +0200
committerAnselm R. Garbe <garbeam@wmii.de>2006-07-10 22:16:48 +0200
commit439e15d09f6fa9271d3b49ef97194f0c80ebe161 (patch)
tree0f1abd8629f3fc226bb313ce29f00b6b8424f375 /client.c
parent2de59d0f0927cec656fc4b9f6fc9ea178fb01c1e (diff)
downloaddwm-439e15d09f6fa9271d3b49ef97194f0c80ebe161.tar.gz
added several other stuff
Diffstat (limited to 'client.c')
-rw-r--r--client.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/client.c b/client.c
new file mode 100644
index 0000000..a5141ea
--- /dev/null
+++ b/client.c
@@ -0,0 +1,89 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <string.h>
+#include <X11/Xatom.h>
+
+#include "util.h"
+#include "wm.h"
+
+static void
+update_client_name(Client *c)
+{
+	XTextProperty name;
+	int n;
+	char **list = 0;
+
+	name.nitems = 0;
+	c->name[0] = 0;
+	XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]);
+	if(!name.nitems)
+		XGetWMName(dpy, c->win, &name);
+	if(!name.nitems)
+		return;
+	if(name.encoding == XA_STRING)
+		strncpy(c->name, (char *)name.value, sizeof(c->name));
+	else {
+		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
+				&& n > 0 && *list)
+		{
+			strncpy(c->name, *list, sizeof(c->name));
+			XFreeStringList(list);
+		}
+	}
+	XFree(name.value);
+}
+
+Client *
+create_client(Window w, XWindowAttributes *wa)
+{
+	Client *c;
+	XSetWindowAttributes twa;
+	long msize;
+
+	c = emallocz(sizeof(Client));
+	c->win = w;
+	c->r[RFloat].x = wa->x;
+	c->r[RFloat].y = wa->y;
+	c->r[RFloat].width = wa->width;
+	c->r[RFloat].height = wa->height;
+	c->border = wa->border_width;
+	XSetWindowBorderWidth(dpy, c->win, 0);
+	c->proto = win_proto(c->win);
+	XGetTransientForHint(dpy, c->win, &c->trans);
+	if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
+		c->size.flags = PSize;
+	c->fixedsize =
+		(c->size.flags & PMinSize && c->size.flags & PMaxSize
+		 && c->size.min_width == c->size.max_width
+		 && c->size.min_height == c->size.max_height);
+	XAddToSaveSet(dpy, c->win);
+	update_client_name(c);
+	twa.override_redirect = 1;
+	twa.background_pixmap = ParentRelative;
+	twa.event_mask = ExposureMask;
+
+	c->title = XCreateWindow(dpy, root, c->r[RFloat].x, c->r[RFloat].y,
+			c->r[RFloat].width, barrect.height, 0,
+			DefaultDepth(dpy, screen), CopyFromParent,
+			DefaultVisual(dpy, screen),
+			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
+	XFlush(dpy);
+
+#if 0
+	for(t=&client, i=0; *t; t=&(*t)->next, i++);
+	c->next = *t; /* *t == nil */
+	*t = c;
+#endif
+	return c;
+}
+
+void
+manage(Client *c)
+{
+	XMapRaised(dpy, c->win);
+	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+	XFlush(dpy);
+}