draw.c
changeset 532 651f2c868b31
parent 530 451f19d48845
child 570 f05cfa7d5128
equal deleted inserted replaced
531:96563762b4ad 532:651f2c868b31
     1 /*
     1 /* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
     2  * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
       
     3  * See LICENSE file for license details.
     2  * See LICENSE file for license details.
     4  */
     3  */
     5 #include "dwm.h"
     4 #include "dwm.h"
     6 #include <stdio.h>
     5 #include <stdio.h>
     7 #include <string.h>
     6 #include <string.h>
    28 	XGCValues gcv;
    27 	XGCValues gcv;
    29 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    28 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    30 
    29 
    31 	XSetForeground(dpy, dc.gc, col[ColBG]);
    30 	XSetForeground(dpy, dc.gc, col[ColBG]);
    32 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    31 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    33 
       
    34 	if(!text)
    32 	if(!text)
    35 		return;
    33 		return;
    36 
       
    37 	w = 0;
    34 	w = 0;
    38 	olen = len = strlen(text);
    35 	olen = len = strlen(text);
    39 	if(len >= sizeof(buf))
    36 	if(len >= sizeof(buf))
    40 		len = sizeof(buf) - 1;
    37 		len = sizeof(buf) - 1;
    41 	memcpy(buf, text, len);
    38 	memcpy(buf, text, len);
    42 	buf[len] = 0;
    39 	buf[len] = 0;
    43 
       
    44 	h = dc.font.ascent + dc.font.descent;
    40 	h = dc.font.ascent + dc.font.descent;
    45 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
    41 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
    46 	x = dc.x + (h / 2);
    42 	x = dc.x + (h / 2);
    47 
       
    48 	/* shorten text if necessary */
    43 	/* shorten text if necessary */
    49 	while(len && (w = textnw(buf, len)) > dc.w - h)
    44 	while(len && (w = textnw(buf, len)) > dc.w - h)
    50 		buf[--len] = 0;
    45 		buf[--len] = 0;
    51 	if(len < olen) {
    46 	if(len < olen) {
    52 		if(len > 1)
    47 		if(len > 1)
    54 		if(len > 2)
    49 		if(len > 2)
    55 			buf[len - 2] = '.';
    50 			buf[len - 2] = '.';
    56 		if(len > 3)
    51 		if(len > 3)
    57 			buf[len - 3] = '.';
    52 			buf[len - 3] = '.';
    58 	}
    53 	}
    59 
       
    60 	if(w > dc.w)
    54 	if(w > dc.w)
    61 		return; /* too long */
    55 		return; /* too long */
    62 	gcv.foreground = col[ColFG];
    56 	gcv.foreground = col[ColFG];
    63 	if(dc.font.set) {
    57 	if(dc.font.set) {
    64 		XChangeGC(dpy, dc.gc, GCForeground, &gcv);
    58 		XChangeGC(dpy, dc.gc, GCForeground, &gcv);
    91 void
    85 void
    92 drawstatus(void) {
    86 drawstatus(void) {
    93 	int i, x;
    87 	int i, x;
    94 
    88 
    95 	dc.x = dc.y = 0;
    89 	dc.x = dc.y = 0;
    96 
       
    97 	for(i = 0; i < ntags; i++) {
    90 	for(i = 0; i < ntags; i++) {
    98 		dc.w = textw(tags[i]);
    91 		dc.w = textw(tags[i]);
    99 		if(seltag[i])
    92 		if(seltag[i])
   100 			drawtext(tags[i], dc.sel, sel && sel->tags[i]);
    93 			drawtext(tags[i], dc.sel, sel && sel->tags[i]);
   101 		else
    94 		else
   102 			drawtext(tags[i], dc.norm, sel && sel->tags[i]);
    95 			drawtext(tags[i], dc.norm, sel && sel->tags[i]);
   103 		dc.x += dc.w;
    96 		dc.x += dc.w;
   104 	}
    97 	}
   105 
       
   106 	dc.w = bmw;
    98 	dc.w = bmw;
   107 	drawtext(arrange == dofloat ?  FLOATSYMBOL : TILESYMBOL, dc.status, False);
    99 	drawtext(arrange == dofloat ?  FLOATSYMBOL : TILESYMBOL, dc.status, False);
   108 
       
   109 	x = dc.x + dc.w;
   100 	x = dc.x + dc.w;
   110 	dc.w = textw(stext);
   101 	dc.w = textw(stext);
   111 	dc.x = bx + bw - dc.w;
   102 	dc.x = bx + bw - dc.w;
   112 	if(dc.x < x) {
   103 	if(dc.x < x) {
   113 		dc.x = x;
   104 		dc.x = x;
   114 		dc.w = bw - x;
   105 		dc.w = bw - x;
   115 	}
   106 	}
   116 	drawtext(stext, dc.status, False);
   107 	drawtext(stext, dc.status, False);
   117 
       
   118 	if((dc.w = dc.x - x) > bh) {
   108 	if((dc.w = dc.x - x) > bh) {
   119 		dc.x = x;
   109 		dc.x = x;
   120 		if(sel)
   110 		if(sel)
   121 			drawtext(sel->name, dc.sel, False);
   111 			drawtext(sel->name, dc.sel, False);
   122 		else
   112 		else
   132 		drawstatus();
   122 		drawstatus();
   133 		XUnmapWindow(dpy, c->twin);
   123 		XUnmapWindow(dpy, c->twin);
   134 		XSetWindowBorder(dpy, c->win, dc.sel[ColBG]);
   124 		XSetWindowBorder(dpy, c->win, dc.sel[ColBG]);
   135 		return;
   125 		return;
   136 	}
   126 	}
   137 
       
   138 	XSetWindowBorder(dpy, c->win, dc.norm[ColBG]);
   127 	XSetWindowBorder(dpy, c->win, dc.norm[ColBG]);
   139 	XMapWindow(dpy, c->twin);
   128 	XMapWindow(dpy, c->twin);
   140 	dc.x = dc.y = 0;
   129 	dc.x = dc.y = 0;
   141 	dc.w = c->tw;
   130 	dc.w = c->tw;
   142 	drawtext(c->name, dc.norm, False);
   131 	drawtext(c->name, dc.norm, False);
   175 	}
   164 	}
   176 	if(dc.font.set) {
   165 	if(dc.font.set) {
   177 		XFontSetExtents *font_extents;
   166 		XFontSetExtents *font_extents;
   178 		XFontStruct **xfonts;
   167 		XFontStruct **xfonts;
   179 		char **font_names;
   168 		char **font_names;
   180 
       
   181 		dc.font.ascent = dc.font.descent = 0;
   169 		dc.font.ascent = dc.font.descent = 0;
   182 		font_extents = XExtentsOfFontSet(dc.font.set);
   170 		font_extents = XExtentsOfFontSet(dc.font.set);
   183 		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
   171 		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
   184 		for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
   172 		for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
   185 			if(dc.font.ascent < (*xfonts)->ascent)
   173 			if(dc.font.ascent < (*xfonts)->ascent)