예제 #1
0
static void
menu_draw(struct menu_ctx *mc, struct menu_q *menuq, struct menu_q *resultq)
{
	struct screen_ctx	*sc = mc->sc;
	struct menu		*mi;
	struct geom		 xine;
	int			 n, xsave, ysave;

	if (mc->list) {
		if (TAILQ_EMPTY(resultq) && mc->list) {
			/* Copy them all over. */
			TAILQ_FOREACH(mi, menuq, entry)
				TAILQ_INSERT_TAIL(resultq, mi,
				    resultentry);

			mc->listing = 1;
		} else if (mc->changed)
			mc->listing = 0;
	}

	mc->num = 0;
	mc->width = 0;
	mc->height = 0;
	if (mc->hasprompt) {
		(void)snprintf(mc->dispstr, sizeof(mc->dispstr), "%s%s%s%s",
		    mc->promptstr, PROMPT_SCHAR, mc->searchstr, PROMPT_ECHAR);
		mc->width = xu_xft_width(sc->xftfont, mc->dispstr,
		    strlen(mc->dispstr));
		mc->height = sc->xftfont->height + 1;
		mc->num = 1;
	}

	TAILQ_FOREACH(mi, resultq, resultentry) {
		char *text;

		if (mc->print != NULL) {
			(*mc->print)(mi, mc->listing);
			text = mi->print;
		} else {
			mi->print[0] = '\0';
			text = mi->text;
		}

		mc->width = MAX(mc->width, xu_xft_width(sc->xftfont, text,
		    MIN(strlen(text), MENU_MAXENTRY)));
		mc->height += sc->xftfont->height + 1;
		mc->num++;
	}
예제 #2
0
static void
mousefunc_sweep_draw(struct client_ctx *cc)
{
    struct screen_ctx	*sc = cc->sc;
    char			 s[14]; /* fits " nnnn x nnnn \0" */

    (void)snprintf(s, sizeof(s), " %4d x %-4d ",
                   (cc->geom.w - cc->hint.basew) / cc->hint.incw,
                   (cc->geom.h - cc->hint.baseh) / cc->hint.inch);

    XReparentWindow(X_Dpy, sc->menuwin, cc->win, 0, 0);
    XMoveResizeWindow(X_Dpy, sc->menuwin, 0, 0,
                      xu_xft_width(sc->xftfont, s, strlen(s)), sc->xftfont->height);
    XMapWindow(X_Dpy, sc->menuwin);
    XClearWindow(X_Dpy, sc->menuwin);

    xu_xft_draw(sc, s, CWM_COLOR_MENU_FONT, 0, sc->xftfont->ascent + 1);
}