wmii/lib/libstuff/x11/insanity/sethints.c

101 lines
1.9 KiB
C
Raw Normal View History

2010-05-22 06:52:47 +04:00
/* Copyright ©2007-2010 Kris Maglione <maglione.k at Gmail>
* See LICENSE file for license details.
*/
#include <string.h>
2010-05-22 06:52:47 +04:00
#include "../x11.h"
void
sethints(Window *w) {
XSizeHints xs;
XWMHints *wmh;
WinHints *h;
Point p;
long size;
if(w->hints == nil)
w->hints = emalloc(sizeof *h);
h = w->hints;
memset(h, 0, sizeof *h);
h->max = Pt(INT_MAX, INT_MAX);
h->inc = Pt(1,1);
wmh = XGetWMHints(display, w->xid);
if(wmh) {
if(wmh->flags & WindowGroupHint)
h->group = wmh->window_group;
free(wmh);
}
if(!XGetWMNormalHints(display, w->xid, &xs, &size))
return;
if(xs.flags & PMinSize) {
h->min.x = xs.min_width;
h->min.y = xs.min_height;
}
if(xs.flags & PMaxSize) {
h->max.x = xs.max_width;
h->max.y = xs.max_height;
}
/* Goddamn buggy clients. */
if(h->max.x < h->min.x)
h->max.x = h->min.x;
if(h->max.y < h->min.y)
h->max.y = h->min.y;
h->base = h->min;
if(xs.flags & PBaseSize) {
p.x = xs.base_width;
p.y = xs.base_height;
h->base = p;
h->baspect = p;
}
if(xs.flags & PResizeInc) {
h->inc.x = max(xs.width_inc, 1);
h->inc.y = max(xs.height_inc, 1);
}
if(xs.flags & PAspect) {
h->aspect.min.x = xs.min_aspect.x;
h->aspect.min.y = xs.min_aspect.y;
h->aspect.max.x = xs.max_aspect.x;
h->aspect.max.y = xs.max_aspect.y;
}
h->position = (xs.flags & (USPosition|PPosition)) != 0;
if(!(xs.flags & PWinGravity))
xs.win_gravity = NorthWestGravity;
p = ZP;
switch (xs.win_gravity) {
case EastGravity:
case CenterGravity:
case WestGravity:
p.y = 1;
break;
case SouthEastGravity:
case SouthGravity:
case SouthWestGravity:
p.y = 2;
break;
}
switch (xs.win_gravity) {
case NorthGravity:
case CenterGravity:
case SouthGravity:
p.x = 1;
break;
case NorthEastGravity:
case EastGravity:
case SouthEastGravity:
p.x = 2;
break;
}
h->grav = p;
h->gravstatic = (xs.win_gravity == StaticGravity);
}