garbeam@5: /* garbeam@5: * (C)opyright MMVI Anselm R. Garbe garbeam@5: * See LICENSE file for license details. garbeam@5: */ garbeam@5: garbeam@5: #include garbeam@5: #include garbeam@5: garbeam@5: #include "util.h" garbeam@5: #include "wm.h" garbeam@5: garbeam@5: static void garbeam@5: update_client_name(Client *c) garbeam@5: { garbeam@5: XTextProperty name; garbeam@5: int n; garbeam@5: char **list = 0; garbeam@5: garbeam@5: name.nitems = 0; garbeam@5: c->name[0] = 0; garbeam@5: XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]); garbeam@5: if(!name.nitems) garbeam@5: XGetWMName(dpy, c->win, &name); garbeam@5: if(!name.nitems) garbeam@5: return; garbeam@5: if(name.encoding == XA_STRING) garbeam@5: strncpy(c->name, (char *)name.value, sizeof(c->name)); garbeam@5: else { garbeam@5: if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success garbeam@5: && n > 0 && *list) garbeam@5: { garbeam@5: strncpy(c->name, *list, sizeof(c->name)); garbeam@5: XFreeStringList(list); garbeam@5: } garbeam@5: } garbeam@5: XFree(name.value); garbeam@5: } garbeam@5: garbeam@5: Client * garbeam@5: create_client(Window w, XWindowAttributes *wa) garbeam@5: { garbeam@5: Client *c; garbeam@5: XSetWindowAttributes twa; garbeam@5: long msize; garbeam@5: garbeam@5: c = emallocz(sizeof(Client)); garbeam@5: c->win = w; garbeam@5: c->r[RFloat].x = wa->x; garbeam@5: c->r[RFloat].y = wa->y; garbeam@5: c->r[RFloat].width = wa->width; garbeam@5: c->r[RFloat].height = wa->height; garbeam@5: c->border = wa->border_width; garbeam@5: XSetWindowBorderWidth(dpy, c->win, 0); garbeam@5: c->proto = win_proto(c->win); garbeam@5: XGetTransientForHint(dpy, c->win, &c->trans); garbeam@5: if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags) garbeam@5: c->size.flags = PSize; garbeam@5: c->fixedsize = garbeam@5: (c->size.flags & PMinSize && c->size.flags & PMaxSize garbeam@5: && c->size.min_width == c->size.max_width garbeam@5: && c->size.min_height == c->size.max_height); garbeam@5: XAddToSaveSet(dpy, c->win); garbeam@5: update_client_name(c); garbeam@5: twa.override_redirect = 1; garbeam@5: twa.background_pixmap = ParentRelative; garbeam@5: twa.event_mask = ExposureMask; garbeam@5: garbeam@5: c->title = XCreateWindow(dpy, root, c->r[RFloat].x, c->r[RFloat].y, garbeam@5: c->r[RFloat].width, barrect.height, 0, garbeam@5: DefaultDepth(dpy, screen), CopyFromParent, garbeam@5: DefaultVisual(dpy, screen), garbeam@5: CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); garbeam@5: XFlush(dpy); garbeam@5: garbeam@5: #if 0 garbeam@5: for(t=&client, i=0; *t; t=&(*t)->next, i++); garbeam@5: c->next = *t; /* *t == nil */ garbeam@5: *t = c; garbeam@5: #endif garbeam@5: return c; garbeam@5: } garbeam@5: garbeam@5: void garbeam@5: manage(Client *c) garbeam@5: { garbeam@5: XMapRaised(dpy, c->win); garbeam@5: XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); garbeam@5: XFlush(dpy); garbeam@5: }