aboutsummaryrefslogtreecommitdiff
path: root/draw/drawtext.c
blob: d347b362b1e341a835e4b2e0a6ab73fff315e5ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* See LICENSE file for copyright and license details. */
#include <string.h>
#include <X11/Xlib.h>
#include "draw.h"

#define MIN(a, b)               ((a) < (b) ? (a) : (b))

void
drawtext(DC *dc, const char *text, unsigned long col[ColLast], Bool invert) {
	char buf[256];
	int i, x, y, h, len, olen;
	XRectangle r = { dc->x, dc->y, dc->w, dc->h };

	XSetForeground(dc->dpy, dc->gc, col[invert ? ColFG : ColBG]);
	XFillRectangles(dc->dpy, dc->drawable, dc->gc, &r, 1);
	if(!text)
		return;
	olen = strlen(text);
	h = dc->font.height;
	y = dc->y + ((h+2) / 2) - (h / 2) + dc->font.ascent;
	x = dc->x + (h / 2);
	/* shorten text if necessary */
	for(len = MIN(olen, sizeof buf); len && textnw(dc, text, len) > dc->w - h; len--);
	if(!len)
		return;
	memcpy(buf, text, len);
	if(len < olen)
		for(i = len; i && i > len - 3; buf[--i] = '.');
	XSetForeground(dc->dpy, dc->gc, col[invert ? ColBG : ColFG]);
	if(dc->font.set)
		XmbDrawString(dc->dpy, dc->drawable, dc->font.set, dc->gc, x, y, buf, len);
	else
		XDrawString(dc->dpy, dc->drawable, dc->gc, x, y, buf, len);
}