main.c
changeset 792 99044861fd9b
parent 789 3edec0a35000
child 793 79cb72e82b21
equal deleted inserted replaced
791:9ab130668f41 792:99044861fd9b
    71 	}
    71 	}
    72 	return XTextWidth(dc.font.xfont, text, len);
    72 	return XTextWidth(dc.font.xfont, text, len);
    73 }
    73 }
    74 
    74 
    75 static void
    75 static void
    76 drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) {
    76 drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
    77 	int x, y, w, h;
    77 	int x;
    78 	static char buf[256];
       
    79 	unsigned int len, olen;
       
    80 	XGCValues gcv;
    78 	XGCValues gcv;
    81 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    79 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    82 
    80 
    83 	XSetForeground(dpy, dc.gc, col[ColBG]);
       
    84 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       
    85 	if(!text)
       
    86 		return;
       
    87 	w = 0;
       
    88 	olen = len = strlen(text);
       
    89 	if(len >= sizeof buf)
       
    90 		len = sizeof buf - 1;
       
    91 	memcpy(buf, text, len);
       
    92 	buf[len] = 0;
       
    93 	h = dc.font.ascent + dc.font.descent;
       
    94 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
       
    95 	x = dc.x + (h / 2);
       
    96 	/* shorten text if necessary */
       
    97 	while(len && (w = textnw(buf, len)) > dc.w - h)
       
    98 		buf[--len] = 0;
       
    99 	if(len < olen) {
       
   100 		if(len > 1)
       
   101 			buf[len - 1] = '.';
       
   102 		if(len > 2)
       
   103 			buf[len - 2] = '.';
       
   104 		if(len > 3)
       
   105 			buf[len - 3] = '.';
       
   106 	}
       
   107 	if(w > dc.w)
       
   108 		return; /* too long */
       
   109 	gcv.foreground = col[ColFG];
    81 	gcv.foreground = col[ColFG];
   110 	if(dc.font.set) {
    82 	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
   111 		XChangeGC(dpy, dc.gc, GCForeground, &gcv);
    83 	x = (dc.font.ascent + dc.font.descent + 2) / 4;
   112 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
       
   113 	}
       
   114 	else {
       
   115 		gcv.font = dc.font.xfont->fid;
       
   116 		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
       
   117 		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       
   118 	}
       
   119 	x = (h + 2) / 4;
       
   120 	r.x = dc.x + 1;
    84 	r.x = dc.x + 1;
   121 	r.y = dc.y + 1;
    85 	r.y = dc.y + 1;
   122 	if(filledsquare) {
    86 	if(filled) {
   123 		r.width = r.height = x + 1;
    87 		r.width = r.height = x + 1;
   124 		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    88 		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
   125 	}
    89 	}
   126 	else if(emptysquare) {
    90 	else if(empty) {
   127 		r.width = r.height = x;
    91 		r.width = r.height = x;
   128 		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    92 		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
   129 	}
    93 	}
   130 }
    94 }
   131 
    95 
   304 	int i, x;
   268 	int i, x;
   305 
   269 
   306 	dc.x = dc.y = 0;
   270 	dc.x = dc.y = 0;
   307 	for(i = 0; i < ntags; i++) {
   271 	for(i = 0; i < ntags; i++) {
   308 		dc.w = textw(tags[i]);
   272 		dc.w = textw(tags[i]);
   309 		if(seltag[i])
   273 		if(seltag[i]) {
   310 			drawtext(tags[i], dc.sel, sel && sel->tags[i], isoccupied(i));
   274 			drawtext(tags[i], dc.sel);
   311 		else
   275 			drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel);
   312 			drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(i));
   276 		}
       
   277 		else {
       
   278 			drawtext(tags[i], dc.norm);
       
   279 			drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm);
       
   280 		}
   313 		dc.x += dc.w;
   281 		dc.x += dc.w;
   314 	}
   282 	}
   315 	dc.w = blw;
   283 	dc.w = blw;
   316 	drawtext(lt->symbol, dc.norm, False, False);
   284 	drawtext(lt->symbol, dc.norm);
   317 	x = dc.x + dc.w;
   285 	x = dc.x + dc.w;
   318 	dc.w = textw(stext);
   286 	dc.w = textw(stext);
   319 	dc.x = sw - dc.w;
   287 	dc.x = sw - dc.w;
   320 	if(dc.x < x) {
   288 	if(dc.x < x) {
   321 		dc.x = x;
   289 		dc.x = x;
   322 		dc.w = sw - x;
   290 		dc.w = sw - x;
   323 	}
   291 	}
   324 	drawtext(stext, dc.norm, False, False);
   292 	drawtext(stext, dc.norm);
   325 	if((dc.w = dc.x - x) > bh) {
   293 	if((dc.w = dc.x - x) > bh) {
   326 		dc.x = x;
   294 		dc.x = x;
   327 		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False);
   295 		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm);
   328 	}
   296 	}
   329 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
   297 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
   330 	XSync(dpy, False);
   298 	XSync(dpy, False);
       
   299 }
       
   300 
       
   301 void
       
   302 drawtext(const char *text, unsigned long col[ColLast]) {
       
   303 	int x, y, w, h;
       
   304 	static char buf[256];
       
   305 	unsigned int len, olen;
       
   306 	XGCValues gcv;
       
   307 	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       
   308 
       
   309 	XSetForeground(dpy, dc.gc, col[ColBG]);
       
   310 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
       
   311 	if(!text)
       
   312 		return;
       
   313 	w = 0;
       
   314 	olen = len = strlen(text);
       
   315 	if(len >= sizeof buf)
       
   316 		len = sizeof buf - 1;
       
   317 	memcpy(buf, text, len);
       
   318 	buf[len] = 0;
       
   319 	h = dc.font.ascent + dc.font.descent;
       
   320 	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
       
   321 	x = dc.x + (h / 2);
       
   322 	/* shorten text if necessary */
       
   323 	while(len && (w = textnw(buf, len)) > dc.w - h)
       
   324 		buf[--len] = 0;
       
   325 	if(len < olen) {
       
   326 		if(len > 1)
       
   327 			buf[len - 1] = '.';
       
   328 		if(len > 2)
       
   329 			buf[len - 2] = '.';
       
   330 		if(len > 3)
       
   331 			buf[len - 3] = '.';
       
   332 	}
       
   333 	if(w > dc.w)
       
   334 		return; /* too long */
       
   335 	gcv.foreground = col[ColFG];
       
   336 	if(dc.font.set) {
       
   337 		XChangeGC(dpy, dc.gc, GCForeground, &gcv);
       
   338 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
       
   339 	}
       
   340 	else {
       
   341 		gcv.font = dc.font.xfont->fid;
       
   342 		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
       
   343 		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
       
   344 	}
   331 }
   345 }
   332 
   346 
   333 void
   347 void
   334 sendevent(Window w, Atom a, long value) {
   348 sendevent(Window w, Atom a, long value) {
   335 	XEvent e;
   349 	XEvent e;