client.c
changeset 20 4560e0882c1d
parent 19 b5510d0c6d43
child 21 3ef108a5ca0a
equal deleted inserted replaced
19:b5510d0c6d43 20:4560e0882c1d
    42 	else
    42 	else
    43 		draw_client(c);
    43 		draw_client(c);
    44 }
    44 }
    45 
    45 
    46 void
    46 void
       
    47 update_size(Client *c)
       
    48 {
       
    49 	XSizeHints size;
       
    50 	long msize;
       
    51 	if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
       
    52 		size.flags = PSize;
       
    53 	c->flags = size.flags;
       
    54 	c->basew = size.base_width;
       
    55 	c->baseh = size.base_height;
       
    56 	c->incw = size.width_inc;
       
    57 	c->inch = size.height_inc;
       
    58 	c->maxw = size.max_width;
       
    59 	c->maxh = size.max_height;
       
    60 	c->minw = size.min_width;
       
    61 	c->minh = size.min_height;
       
    62 }
       
    63 
       
    64 void
    47 focus(Client *c)
    65 focus(Client *c)
    48 {
    66 {
    49 	Client **l;
    67 	Client **l;
    50 	for(l=&stack; *l && *l != c; l=&(*l)->snext);
    68 	for(l=&stack; *l && *l != c; l=&(*l)->snext);
    51 	eassert(*l == c);
    69 	eassert(*l == c);
    60 void
    78 void
    61 manage(Window w, XWindowAttributes *wa)
    79 manage(Window w, XWindowAttributes *wa)
    62 {
    80 {
    63 	Client *c, **l;
    81 	Client *c, **l;
    64 	XSetWindowAttributes twa;
    82 	XSetWindowAttributes twa;
    65 	long msize;
       
    66 
    83 
    67 	c = emallocz(sizeof(Client));
    84 	c = emallocz(sizeof(Client));
    68 	c->win = w;
    85 	c->win = w;
    69 	c->r[RFloat].x = wa->x;
    86 	c->x = wa->x;
    70 	c->r[RFloat].y = wa->y;
    87 	c->y = wa->y;
    71 	c->r[RFloat].width = wa->width;
    88 	c->w = wa->width;
    72 	c->r[RFloat].height = wa->height;
    89 	c->h = wa->height;
       
    90 	update_size(c);
    73 	XSetWindowBorderWidth(dpy, c->win, 1);
    91 	XSetWindowBorderWidth(dpy, c->win, 1);
    74 	XSelectInput(dpy, c->win, CLIENT_MASK);
    92 	XSelectInput(dpy, c->win, CLIENT_MASK);
    75 	XGetTransientForHint(dpy, c->win, &c->trans);
    93 	XGetTransientForHint(dpy, c->win, &c->trans);
    76 	if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
       
    77 		c->size.flags = PSize;
       
    78 	c->fixedsize =
       
    79 		(c->size.flags & PMinSize && c->size.flags & PMaxSize
       
    80 		 && c->size.min_width == c->size.max_width
       
    81 		 && c->size.min_height == c->size.max_height);
       
    82 	update_name(c);
    94 	update_name(c);
    83 	twa.override_redirect = 1;
    95 	twa.override_redirect = 1;
    84 	twa.background_pixmap = ParentRelative;
    96 	twa.background_pixmap = ParentRelative;
    85 	twa.event_mask = ExposureMask;
    97 	twa.event_mask = ExposureMask;
    86 
    98 
    87 	c->title = XCreateWindow(dpy, root, c->r[RFloat].x, c->r[RFloat].y,
    99 	c->title = XCreateWindow(dpy, root, c->x, c->y, c->w, barrect.height,
    88 			c->r[RFloat].width, barrect.height, 0,
   100 			0, DefaultDepth(dpy, screen), CopyFromParent,
    89 			DefaultDepth(dpy, screen), CopyFromParent,
       
    90 			DefaultVisual(dpy, screen),
   101 			DefaultVisual(dpy, screen),
    91 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   102 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
    92 
   103 
    93 	for(l=&clients; *l; l=&(*l)->next);
   104 	for(l=&clients; *l; l=&(*l)->next);
    94 	c->next = *l; /* *l == nil */
   105 	c->next = *l; /* *l == nil */
   108 void
   119 void
   109 resize(Client *c)
   120 resize(Client *c)
   110 {
   121 {
   111 	XConfigureEvent e;
   122 	XConfigureEvent e;
   112 
   123 
   113 	XMoveResizeWindow(dpy, c->win, c->r[RFloat].x, c->r[RFloat].y,
   124 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
   114 			c->r[RFloat].width, c->r[RFloat].height);
       
   115 	e.type = ConfigureNotify;
   125 	e.type = ConfigureNotify;
   116 	e.event = c->win;
   126 	e.event = c->win;
   117 	e.window = c->win;
   127 	e.window = c->win;
   118 	e.x = c->r[RFloat].x;
   128 	e.x = c->x;
   119 	e.y = c->r[RFloat].y;
   129 	e.y = c->y;
   120 	e.width = c->r[RFloat].width;
   130 	e.width = c->w;
   121 	e.height = c->r[RFloat].height;
   131 	e.height = c->h;
   122 	e.border_width = 0;
   132 	e.border_width = 0;
   123 	e.above = None;
   133 	e.above = None;
   124 	e.override_redirect = False;
   134 	e.override_redirect = False;
   125 	XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
   135 	XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
   126 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   136 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);