コード例 #1
0
ファイル: dmenu.c プロジェクト: pierrechevalier83/dmenu
static void
drawmenu(void)
{
	unsigned int curpos;
	struct item *item;
	int x = 0, y = 0, w;

	drw_setscheme(drw, scheme[SchemeNorm]);
	drw_rect(drw, 0, 0, mw, mh, 1, 1);

	if (prompt && *prompt) {
		drw_setscheme(drw, scheme[SchemeSel]);
		x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0);
	}
	/* draw input field */
	w = (lines > 0 || !matches) ? mw - x : inputw;
	drw_setscheme(drw, scheme[SchemeNorm]);
	drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);

	drw_font_getexts(drw->fonts, text, cursor, &curpos, NULL);
	if ((curpos += lrpad / 2 - 1) < w) {
		drw_setscheme(drw, scheme[SchemeNorm]);
		drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
	}

	if (lines > 0) {
		/* draw vertical list */
		for (item = curr; item != next; item = item->right)
			drawitem(item, x, y += bh, mw - x);
	} else if (matches) {
		/* draw horizontal list */
		x += inputw;
		w = TEXTW("<");
		if (curr->left) {
			drw_setscheme(drw, scheme[SchemeNorm]);
			drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0);
		}
		x += w;
		for (item = curr; item != next; item = item->right)
			x = drawitem(item, x, 0, MIN(TEXTW(item->text), mw - x - TEXTW(">")));
		if (next) {
			w = TEXTW(">");
			drw_setscheme(drw, scheme[SchemeNorm]);
			drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0);
		}
	}
	drw_map(drw, win, 0, 0, mw, mh);
}
コード例 #2
0
ファイル: dmenu.c プロジェクト: pierrechevalier83/dmenu
static int
drawitem(struct item *item, int x, int y, int w)
{
	if (item == sel)
		drw_setscheme(drw, scheme[SchemeSel]);
	else if (item->out)
		drw_setscheme(drw, scheme[SchemeOut]);
	else
		drw_setscheme(drw, scheme[SchemeNorm]);

	return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
}
コード例 #3
0
ファイル: drw.c プロジェクト: ffflorian/dwm
void
drw_colored_text(Drw *drw, ClrScheme *scheme, int numcolors, int x, int y, unsigned int w, unsigned int h, char *text)
{
	if (!drw || !drw->fontcount || !drw->scheme)
		return;

	char *buf = text, *ptr = buf, c = 1;
	int i;

	while (*ptr) {
		for (i = 0; *ptr < 0 || *ptr > numcolors; i++, ptr++);
		if (!*ptr)
			break;
		c = *ptr;
		*ptr = 0;
		if (i)
			x = drw_text(drw, x, y, w, h, buf) + drw->fonts[0]->h;
		*ptr = c;
		drw_setscheme(drw, &scheme[c-1]);
		buf = ++ptr;
	}
	drw_text(drw, x, y, w, h, buf);
}
コード例 #4
0
ファイル: drw.c プロジェクト: ffflorian/dwm
int
drw_get_width(Drw *drw, int numcolors, const char *text)
{
	int i;
	Fnt *curfont = drw->fonts[0];
	int w = drw_text(drw, 0, 0, 0, 0, text) + curfont->h;

	for (i = 0; i < strlen(text); i++) {
		if (text[i] > 0 && text[i] <= numcolors) {
			/* we found a color code
			 * drw_text counted it as a normal character and added one character's width
			 * we aren't going to render this character, so we remove one character's width */
			w -= curfont->xfont->max_advance_width;

			if (i == 0 || i + 1 == strlen(text)) {
				/* we're on the first or the last character of the string
				 * drw_text already added one character's height (divided by 2) as padding to the beginning and end
				 * we don't want to double this padding, so we skip this character */
				continue;
			}

			if (text[i - 1] > 0 && text[i - 1] <= numcolors) {
				/* the previous character was also a color code
				 * we already added padding in the previous iteration
				 * we don't want to double this padding, so we skip this character */
				continue;
			}

			/* we are somewhere in the middle of the string and the color has changed
			 * we want to add one character's height (divided by 2) as padding to the end of the previous colored text
			 * and to the beginning of the new colored text */
			w += curfont->h;
		}
	}

  return w;
}
コード例 #5
0
ファイル: dmenu.c プロジェクト: temochka/dmenu
static void
drawmenu(void)
{
	int curpos;
	struct item *item;
	int x = 0, y = 0, h = bh, w;

	drw_setscheme(drw, &scheme[SchemeNorm]);
	drw_rect(drw, 0, 0, mw, mh, 1, 1, 1);

	if (prompt && *prompt) {
		drw_setscheme(drw, &scheme[SchemeSel]);
		drw_text(drw, x, 0, promptw, bh, prompt, 0);
		x += promptw;
	}
	/* draw input field */
	w = (lines > 0 || !matches) ? mw - x : inputw;
	drw_setscheme(drw, &scheme[SchemeNorm]);
	drw_text(drw, x, 0, w, bh, text, 0);

	if ((curpos = TEXTNW(text, cursor) + bh / 2 - 2) < w) {
		drw_setscheme(drw, &scheme[SchemeNorm]);
		drw_rect(drw, x + curpos + 2, 2, 1, bh - 4, 1, 1, 0);
	}

	if (lines > 0) {
		/* draw vertical list */
		w = mw - x;
		for (item = curr; item != next; item = item->right) {
			y += h;
			if (item == sel)
				drw_setscheme(drw, &scheme[SchemeSel]);
			else if (item->out)
				drw_setscheme(drw, &scheme[SchemeOut]);
			else
				drw_setscheme(drw, &scheme[SchemeNorm]);

			drw_text(drw, x, y, w, bh, item->text, 0);
		}
	} else if (matches) {
		/* draw horizontal list */
		x += inputw;
		w = TEXTW("<");
		if (curr->left) {
			drw_setscheme(drw, &scheme[SchemeNorm]);
			drw_text(drw, x, 0, w, bh, "<", 0);
		}
		for (item = curr; item != next; item = item->right) {
			x += w;
			w = MIN(TEXTW(item->text), mw - x - TEXTW(">"));

			if (item == sel)
				drw_setscheme(drw, &scheme[SchemeSel]);
			else if (item->out)
				drw_setscheme(drw, &scheme[SchemeOut]);
			else
				drw_setscheme(drw, &scheme[SchemeNorm]);
			drw_text(drw, x, 0, w, bh, item->text, 0);
		}
		w = TEXTW(">");
		x = mw - w;
		if (next) {
			drw_setscheme(drw, &scheme[SchemeNorm]);
			drw_text(drw, x, 0, w, bh, ">", 0);
		}
	}
	drw_map(drw, win, 0, 0, mw, mh);
}