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); }
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); }
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); }
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; }
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); }