Ejemplo n.º 1
0
static void print_messages(DIALOG *d)
{
    int y = d->y;
    struct line *p;

    for (p = __mlog.lines; p; p = p->next, y += text_height(font) + 2) {
        textprintf_ex(gui_get_screen(), font, d->x, y, d->bg, d->bg, "%*c",
                      __mlog.c, ' ');

        textprintf_ex(gui_get_screen(), font, d->x, y, p->fg, d->bg, "%s", p->s);
    }
}
Ejemplo n.º 2
0
int d_agtk_shadow_box_proc(int msg, DIALOG *d, int c)
{
    (void)c;
    if (msg == MSG_DRAW)
        gtk_box(gui_get_screen(), d->x, d->y, d->w, d->h, 0, 1);
    return D_O_K;
}
Ejemplo n.º 3
0
static void
abitmap_draw_text (DIALOG *d, int what, int offx, int offy, int push,
int halign, int valign)
{
	int s = get_state (d);

	int x = d->x + offx;
	int y = d->y + offy;
	int w = gui_strlen (d->dp);
	int h = text_height (font);
	if (halign == 1)
		x = d->x + (d->w - offx) / 2 - w / 2;
	if (halign == 2)
		x = d->x + (d->w - offx) - w;
	if (valign == 1)
		y = d->y + (d->h - offy) / 2 - h / 2;
	if (valign == 2)
		y = d->y + (d->h - offy) - h;

	if (push && (d->flags & D_SELECTED)) {
		x += theme->textpushx;
		y += theme->textpushy;
	}

	gui_textout_ex(gui_get_screen(), d->dp, x, y, theme->bitmaps[what][s].color, -1, FALSE);
}
Ejemplo n.º 4
0
int
d_abitmap_clear_proc (int msg, DIALOG *d, int c)
{
	if (msg == MSG_DRAW) {
		int s = get_state (d);
		abitmap_draw_bmp (gui_get_screen(), &theme->bitmaps[B_CLEAR][s], 0, 0, SCREEN_W, SCREEN_H);
		return D_O_K;
	}
	return d_clear_proc (msg, d, c);
}
Ejemplo n.º 5
0
int
d_agtk_clear_proc (int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW)
    {
        clear_to_color (gui_get_screen(), agtk_bg_color);
        return D_O_K;
    }
    return d_clear_proc (msg, d, c);
}
Ejemplo n.º 6
0
int
d_abitmap_list_proc (int msg, DIALOG *d, int c)
{
	if (msg == MSG_DRAW) {
		BITMAP *bmp = gui_get_screen();
		int height, size, i, len, bar, x, y;
		char *sel = d->dp2;
		char s[1024];
		int c = 0;

		if (d->flags & D_GOTFOCUS)
			c = 1;
		if (d->flags & D_DISABLED)
			c = 2;

		(*(char *(*)(int, int *)) d->dp) (-1, &size);
		height = (d->h - 4) / text_height (font);
		bar = (size > height);

		abitmap_draw_area (d, B_LIST, 0, 0, bar ? d->w - 12 : d->w, d->h, 0, 0);
		if (bar)
			abitmap_draw_scroller (d, d->d2, size, height);

		/* draw the contents */
		for (i = 0; i < height; i++) {
			if (d->d2 + i < size) {
				int fg = theme->bitmaps[B_LIST][c].color;

				x = d->x + 2;
				y = d->y + 2 + i * text_height (font);

				if (d->d2 + i == d->d1 || ((sel) && (sel[d->d2 + i]))) {
					abitmap_draw_area (d, B_LIST_ITEM, 0, y - d->y,
						bar ? d->w - 12 : d->w, text_height (font), 0, 0);
					fg = theme->bitmaps[B_LIST_ITEM][c].color;
				}
				ustrzcpy (s, sizeof (s),
					(*(char *(*)(int, int *)) d->dp) (i + d->d2, NULL));

				x += 8;
				len = ustrlen (s);
				while (text_length (font, s) >=
				MAX (d->w - 1 - (bar ? 22 : 11), 1)) {
					len--;
					usetat (s, len, 0);
				}
				textout_ex (bmp, font, s, x, y, fg, -1);
				x += text_length (font, s);

			}
		}
		return D_O_K;
	}
	return d_list_proc (msg, d, c);
}
Ejemplo n.º 7
0
static void gtk_draw_menu_item(MENU *m, int x, int y, int w, int h, int bar, int sel)
{
    BITMAP *bmp = gui_get_screen();
    int fg, bg;
    int i, j;
    char buf[256], *tok;

    if (m->flags & D_DISABLED) {
        fg = nshadow;
        bg = normal;
    }
    else {
        fg = black;
        bg = (sel) ? highlight : normal;
    }

    rectfill(bmp, x+1, y+1, x+w-3, y+h-4, bg);

    if (ugetc(m->text)) {
        i = 0;
        j = ugetc(m->text);

        while ((j) && (j != '\t')) {
            i += usetc(buf+i, j);
            j = ugetc(m->text+i);
        }

        usetc(buf+i, 0);

        gui_textout_ex(bmp, buf, x+8, y+1, fg, bg, FALSE);

        if (j == '\t') {
            tok = m->text+i + uwidth(m->text+i);
            gui_textout_ex(bmp, tok, x+w-gui_strlen(tok)-10, y+1, fg, bg, FALSE);
        }

        if ((m->child) && (!bar))
            draw_sprite(bmp, menu_arrow_bmp, x+w-12, y+(h-menu_arrow_bmp->h)/2);
    }
    else {
        hline(bmp, x+4, y+text_height(font)/2+2, x+w-4, nshadow);
        hline(bmp, x+4, y+text_height(font)/2+3, x+w-4, highlight);
    }

    if (m->flags & D_SELECTED) {
        line(bmp, x+1, y+text_height(font)/2+1, x+3, y+text_height(font)+1, fg);
        line(bmp, x+3, y+text_height(font)+1, x+6, y+2, fg);
    }
}
Ejemplo n.º 8
0
int d_agtk_check_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        draw_base(bmp, d);
        gtk_bevel(bmp, d->x+3, d->y+d->h/2-5, 10, 10, (d->flags & D_SELECTED) ? 2 : 1);
        if (d->dp) {
            gui_textout_ex(bmp, (char *)d->dp,
                           d->x+18, d->y+d->h/2-text_height(font)/2,
                           (d->flags & D_DISABLED) ? nshadow : black, -1, FALSE);
        }
        return D_O_K;
    }

    return d_button_proc(msg, d, c);
}
Ejemplo n.º 9
0
static void gtk_draw_scrollable_frame(DIALOG *d, int listsize, int offset, int height)
{
    BITMAP *bmp = gui_get_screen();
    int i, len, c;
    int xx, yy;

    /* draw frame */
    hline(bmp, d->x, d->y, d->x+d->w-1, nshadow);
    vline(bmp, d->x, d->y, d->y+d->h-1, nshadow);
    hline(bmp, d->x+1, d->y+1, d->x+d->w-2, black);
    vline(bmp, d->x+1, d->y+1, d->y+d->h-2, black);
    hline(bmp, d->x+2, d->y+d->h-2, d->x+d->w-2, normal);
    vline(bmp, d->x+d->w-2, d->y+2, d->y+d->h-3, normal);
    hline(bmp, d->x+1, d->y+d->h-1, d->x+d->w-1, white);
    vline(bmp, d->x+d->w-1, d->y+1, d->y+d->h-2, white);

    /* possibly draw scrollbar */
    if (listsize > height) {
        if (d->flags & D_GOTFOCUS)
            c = 1;
        else if (d->flags & D_SELECTED)
            c = 2;
        else
            c = 0;

        xx = d->x+d->w-11;
        yy = d->y;
        len = (((d->h-2) * offset) + listsize/2) / listsize;
        gtk_box(bmp, xx-2, yy, 12, d->h-1, 2, 0);

        i = ((d->h-5) * height + listsize/2) / listsize;
        xx = d->x+d->w-11;
        yy = d->y+2;

        if (offset > 0) {
            len = (((d->h-5) * offset) + listsize/2) / listsize;
            rectfill(bmp, xx, yy, xx+8, yy+len, pressed);
            yy += len;
        }
        if (yy+i < d->y+d->h-3) {
            gtk_box(bmp, xx, yy, 8, i, c, 0);
            yy += i+1;
        }
        else
            gtk_box(bmp, xx, yy, 8, d->h-3-yy+d->y, c, 0);
    }
}
Ejemplo n.º 10
0
static void clear_messages(DIALOG *d)
{
    unsigned int i;
    int y;

    pthread_mutex_lock(&__m_lines);

    for (i = 0, y = d->y; i < __mlog.l; i++, y += text_height(font) + 2) {
        textprintf_ex(gui_get_screen(), font, d->x, y, d->bg, d->bg, "%*c",
                      __mlog.c, ' ');
    }

    cl_dll_free(__mlog.lines, NULL);
    __mlog.lines = NULL;

    pthread_mutex_unlock(&__m_lines);
}
Ejemplo n.º 11
0
/* d1 used for group number. */
int d_agtk_radio_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        draw_base(bmp, d);
        draw_sprite(bmp, (d->flags & D_SELECTED) ? radio_down_bmp : radio_up_bmp, d->x+3, d->y+d->h/2-5);

        if (d->dp) {
            gui_textout_ex(bmp, (char *)d->dp,
                           d->x+18, d->y+d->h/2-text_height(font)/2,
                           (d->flags & D_DISABLED) ? nshadow : black, -1, FALSE);
        }
        return D_O_K;
    }

    return d_radio_proc(msg, d, c);
}
Ejemplo n.º 12
0
int
d_abitmap_icon_proc (int msg, DIALOG *d, int c)
{
	if (msg == MSG_DRAW) {
		int b = d->flags & D_SELECTED ? B_ICON_DOWN : B_ICON;
		int px = 0, py = 0;
		abitmap_draw_box (d, b);
		if (d->flags & D_SELECTED) {
			px = theme->textpushx;
			py = theme->textpushy;
		}
		stretch_sprite (gui_get_screen(), d->dp, d->x + 2 + px, d->y + 2 + py,
			d->w - 4 - px, d->h - 4 - py);
		return D_O_K;
	}
	return d_icon_proc (msg, d, c);
}
Ejemplo n.º 13
0
int d_agtk_slider_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        int vert = TRUE;    /* flag: is slider vertical? */
        int hh = 32;        /* handle height (width for horizontal sliders) */
        int slp;            /* slider position */
        int irange;
        int slx, sly, slh, slw;
        fixed slratio, slmax, slpos;

        /* check for slider direction */
        if (d->h < d->w)
            vert = FALSE;

        irange = (vert) ? d->h : d->w;
        slmax = itofix(irange-hh);
        slratio = slmax / (d->d1);
        slpos = slratio * d->d2;
        slp = fixtoi(slpos);

        /* draw background */
        gtk_box(bmp, d->x, d->y, d->w, d->h, 2, 0);

        /* now draw the handle */
        if (vert) {
            slx = d->x+2;
            sly = d->y+2+(d->h)-(hh+slp);
            slw = d->w-1-3;
            slh = hh-1-3;
        } else {
            slx = d->x+2+slp;
            sly = d->y+2;
            slw = hh-1-3;
            slh = d->h-1-3;
        }

        gtk_box(bmp, slx, sly, slw, slh, (d->flags & D_GOTFOCUS) ? 1 : 0, 0);

        return D_O_K;
    }

    return d_slider_proc(msg, d, c);
}
Ejemplo n.º 14
0
int d_agtk_window_proc(int msg, DIALOG *d, int c)
{
    (void)c;

    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        gtk_box(bmp, d->x, d->y, d->w, d->h, 0, 1);

        if (d->dp) {
            int cl = bmp->cl, ct = bmp->ct, cr = bmp->cr, cb = bmp->cb;
            set_clip_rect(bmp, d->x, d->y, d->x+d->w-1, d->y+d->h-1);

            textout_ex(bmp, font, (char *)d->dp, d->x+6, d->y+6, black, normal);

            set_clip_rect(bmp, cl, ct, cr, cb);
        }
    }

    return D_O_K;
}
Ejemplo n.º 15
0
static void
abitmap_draw_area (DIALOG *d, int what, int offx, int offy, int aw, int ah,
int halign, int valign)
{
	int s = get_state (d);

	int x = d->x + offx;
	int y = d->y + offy;
	int w = aw;
	int h = ah;
	if (halign == 1)
		x = d->x + (d->w - offx) / 2 - w / 2;
	if (halign == 2)
		x = d->x + (d->w - offx) - w;
	if (valign == 1)
		y = d->y + (d->h - offy) / 2 - h / 2;
	if (valign == 2)
		y = d->y + (d->h - offy) - h;

	abitmap_draw_bmp (gui_get_screen(), &theme->bitmaps[what][s], x, y, w, h);
}
Ejemplo n.º 16
0
int d_agtk_icon_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        BITMAP *img = (BITMAP *)d->dp;
        int x;

        if (d->flags & D_SELECTED)
            x = 2;
        else if (d->flags & D_GOTFOCUS)
            x = 1;
        else
            x = 0;
        gtk_box(bmp, d->x, d->y, d->w, d->h, x, d->flags & D_GOTFOCUS);

        stretch_sprite(bmp, img, d->x+2, d->y+2, d->w-4, d->h-4);
        return D_O_K;
    }

    return d_agtk_button_proc(msg, d, c);
}
Ejemplo n.º 17
0
int d_agtk_button_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        int x;
        if (d->flags & D_SELECTED)
            x = 2;
        else if (d->flags & D_GOTFOCUS)
            x = 1;
        else
            x = 0;
        gtk_box(bmp, d->x, d->y, d->w, d->h, x, d->flags & D_GOTFOCUS);

        if (d->dp) {
            gui_textout_ex(bmp, (char *)d->dp,
                           d->x+d->w/2, d->y+d->h/2-text_height(font)/2,
                           (d->flags & D_DISABLED) ? nshadow : black, -1, TRUE);
        }
        return D_O_K;
    }

    return d_button_proc(msg, d, c);
}
Ejemplo n.º 18
0
int gui_d_bitmap_proc(int msg, DIALOG *d, int c __attribute__((unused)))
{
    BITMAP *b;

    switch (msg) {
        case MSG_LOAD_IMAGE:
            /* c = image_fmt */
            /* Convert image to Allegro format */
            /* Stretch_blit to BITMAP */
            return D_REDRAWME;

        case MSG_DRAW:
            if (d->dp != NULL) {
                b = (BITMAP *)d->dp;
                blit(b, gui_get_screen(), 0, 0, d->x, d->y, b->w, b->h);
                destroy_bitmap(b);
            }

            break;
    }

    return D_O_K;
}
Ejemplo n.º 19
0
static void
abitmap_draw_box (DIALOG *d, int what)
{
	int s = get_state (d);
	abitmap_draw_bmp (gui_get_screen(), &theme->bitmaps[what][s], d->x, d->y, d->w, d->h);
}
Ejemplo n.º 20
0
int
d_abitmap_edit_proc (int msg, DIALOG *d, int c)
{
	if (msg == MSG_DRAW) {
		BITMAP *bmp = gui_get_screen();
		int l, x, b, f, p, w;
		char *s = (char *) d->dp;
		char buf[16];			 /* Buffer to hold one char at a time. */
		int c = 0;
		int fg;

		agup_edit_adjust_position (d);

		if (d->flags & D_GOTFOCUS)
			c = 1;
		if (d->flags & D_DISABLED)
			c = 2;

		abitmap_draw_area (d, B_EDIT, 0, 0, d->w, text_height (font) + 8, 0, 0);

		l = ustrlen (s);
		/* set cursor pos */
		if (d->d2 >= l) {
			d->d2 = l;
			usetc (buf + usetc (buf, ' '), 0);
			x = text_length (font, buf) + 2;
		}
		else
			x = 2;

		b = 0;					 /* num of chars to be blitted */
		/* get the part of the string to be blitted */
		for (p = d->d2; p >= 0; p--) {
			usetc (buf + usetc (buf, ugetat (s, p)), 0);
			x += text_length (font, buf);
			b++;
			if (x > d->w - 4)
				break;
		}

		/* see if length of text is too wide */
		if (x <= d->w - 2) {
			b = l;
			p = 0;
		} else {
			b--;
			p = d->d2 - b + 1;
			b = d->d2;
		}

		for (x = 4; p <= b; p++) {
			f = ugetat (s, p);
			usetc (buf + usetc (buf, (f) ? f : ' '), 0);
			w = text_length (font, buf);

			if (((p == d->d2) && (d->flags & D_GOTFOCUS))) {
				abitmap_draw_bmp (bmp, &theme->bitmaps[B_CURSOR][c],
					d->x + x, d->y, w, text_height (font) + 4);
				fg =  theme->bitmaps[B_CURSOR][c].color;
			}
			else
				fg =  theme->bitmaps[B_EDIT][c].color;

			textout_ex (bmp, font, buf, d->x + x, d->y + 4, fg, -1);

			if ((x += w) + w > d->w - 4)
				break;
		}

		agup_edit_restore_position (d);

		return D_O_K;
	}

	if (msg == MSG_LOSTFOCUS || msg == MSG_LOSTMOUSE)
		return D_WANTFOCUS;

	return d_agup_adjusted_edit_proc (msg, d, c);
}
Ejemplo n.º 21
0
static void
abitmap_draw_menu_item (MENU * m, int x, int y, int w, int h, int bar,
int sel)
{
	BITMAP *bmp = gui_get_screen();
	int i, j;
	char buf[256], *tok;
	int c;
	int fg;
	int x2 = x, y2 = y, w2 = w, h2 = h;

	if (m->flags & D_DISABLED)
		c = 2;
	else
		c = 0;
	if (sel)
		c = 1;

	if (bar) {
		fg = theme->bitmaps[B_MENUBAR_ITEM][c].color;
		y2 -= 1;
		h2 += 3;
	} else {
		fg = theme->bitmaps[B_MENU_ITEM][c].color;
		x2 -= 1;
		w2 += 3;
	}

	/* See the previous function. */
	if (!menu_done) {
		/* Draw the menu background. */
		if (bar)
			abitmap_draw_bmp (bmp, &theme->bitmaps[B_MENUBAR][c], last_x, last_y, last_w,
				last_h);
		else
			abitmap_draw_bmp (bmp, &theme->bitmaps[B_MENU][c], last_x, last_y, last_w,
				last_h);
		menu_done = TRUE;
	}

	abitmap_draw_bmp (bmp, &theme->bitmaps[bar ? B_MENUBAR_ITEM :
	B_MENU_ITEM][c],    x2, y2, w2, h2);

	if (m->flags & D_SELECTED) {
		/* checked menu item */
		abitmap_draw_bmp (bmp, &theme->bitmaps[B_MENU_CHECK][c], x, y, 12, h);
	}

	if (ugetc (m->text)) {
		i = 0;
		j = ugetc (m->text);

		while ((j) && (j != '\t')) {
			i += usetc (buf + i, j);
			j = ugetc (m->text + i);
		}

		usetc (buf + i, 0);

		gui_textout_ex (bmp, buf, x + 8, y + 1, fg, -1, FALSE);

		if (j == '\t') {
			tok = m->text + i + uwidth (m->text + i);
			gui_textout_ex (bmp, tok, x + w - gui_strlen (tok) - 10, y + 1,
				fg, -1, FALSE);
		}

		if ((m->child) && (!bar)) {
			abitmap_draw_bmp (bmp, &theme->bitmaps[B_MENU_SUB][c], x + w - 12, y, 12, h);
		}
	} else {
		/* menu separator */
		abitmap_draw_bmp (bmp, &theme->bitmaps[B_MENU_SEP][c], x, y, w, h);
	}
}
Ejemplo n.º 22
0
static void gtk_draw_menu(int x, int y, int w, int h)
{
    gtk_box(gui_get_screen(), x, y, w, h, 0, 1);
}
Ejemplo n.º 23
0
int d_agtk_edit_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        int l, x, b, f, p, w;
        int fg = (d->flags & D_DISABLED) ? hshadow : black;
        char *s = (char *)d->dp;
        char buf[16];
        int fonth;

        agup_edit_adjust_position (d);

        fonth = text_height(font);

        l = ustrlen(s);
        /* set cursor pos */
        if (d->d2 >= l) {
            d->d2 = l;
            usetc(buf+usetc(buf, ' '), 0);
            x = text_length(font, buf) + 2;
        }
        else
            x = 2;

        b = 0;	  /* num of chars to be blitted */
        /* get the part of the string to be blitted */
        for (p = d->d2; p >= 0; p--) {
            usetc(buf+usetc(buf, ugetat(s, p)), 0);
            x += text_length(font, buf);
            b++;
            if (x > d->w-4)
                break;
        }

        /* see if length of text is too wide */
        if (x <= d->w-2) {
            b = l;
            p = 0;
        }
        else {
            b--;
            p = d->d2-b+1;
            b = d->d2;
        }

        if (d->flags & D_GOTFOCUS)
            gtk_bevel(bmp, d->x, d->y, d->w, fonth+6, 3);
        else
            gtk_bevel(bmp, d->x, d->y, d->w, fonth+6, 2);

        rectfill(bmp, d->x+2, d->y+2, d->x+d->w-3, d->y+fonth+3, white);
        for (x = 4; p<=b; p++) {
            f = ugetat(s, p);
            usetc(buf+usetc(buf, (f) ? f : ' '), 0);
            w = text_length(font, buf);
            f = ((p == d->d2) && (d->flags & D_GOTFOCUS));
            textout_ex(bmp, font, buf, d->x+x, d->y+4, fg, white);
            if (f)
                vline(bmp, d->x+x-1, d->y+3, d->y+fonth+3, black);
            if ((x += w) + w > d->w - 4)
                break;
        }

        agup_edit_restore_position (d);

        return D_O_K;
    }

    return d_agup_adjusted_edit_proc(msg, d, c);
}
Ejemplo n.º 24
0
int d_agtk_list_proc(int msg, DIALOG *d, int c)
{
    if (msg == MSG_DRAW) {
        BITMAP *bmp = gui_get_screen();
        int height, listsize, i, len, bar, x, y, w;
        int fg_color, fg, bg;
        char *sel = (char *)d->dp2;
        char s[1024];

        (*(getfuncptr)d->dp)(-1, &listsize);
        height = (d->h-4) / text_height(font);
        bar = (listsize > height);
        w = (bar ? d->w-14 : d->w-3);
        fg_color = (d->flags & D_DISABLED) ? agtk_mg_color : d->fg;

        /* draw box contents */
        for (i=0; i<height; i++) {
            if (d->d2+i < listsize) {
                if (d->d2+i == d->d1) {
                    fg = white;
                    bg = blue;
                }
                else if ((sel) && (sel[d->d2+i])) {
                    fg = white;
                    bg = blue;
                }
                else {
                    fg = black;
                    bg = white;
                }
                usetc(s, 0);
                ustrncat(s, (*(getfuncptr)d->dp)(i+d->d2, NULL), sizeof(s)-ucwidth(0));
                x = d->x + 2;
                y = d->y + 2 + i*text_height(font);
                rectfill(bmp, x, y, x+7, y+text_height(font)-1, bg);
                x += 8;
                len = ustrlen(s);
                while (text_length(font, s) >= MAX(d->w - 1 - (bar ? 22 : 10), 1)) {
                    len--;
                    usetat(s, len, 0);
                }
                textout_ex(bmp, font, s, x, y, fg, bg);
                x += text_length(font, s);
                if (x <= d->x+w)
                    rectfill(bmp, x, y, d->x+w, y+text_height(font)-1, bg);
#if 0
                /* GTK puts a yellow box around the currently selected
                 * item, but it's quite ugly when we emulate it, so
                 * I'm disabling it. --pw
                 */
                if (d->d2+i == d->d1)
                    rect(bmp, x-text_length(font, s)-8, y, d->x+w, y+text_height(font)-1, yellow);
#endif
            }
            else {
                rectfill(bmp, d->x+2,  d->y+2+i*text_height(font),
                         d->x+w, d->y+1+(i+1)*text_height(font), white);
            }
        }

        if (d->y+2+i*text_height(font) <= d->y+d->h-3)
            rectfill(bmp, d->x+2, d->y+2+i*text_height(font),
                     d->x+w, d->y+d->h-3, white);

        /* draw frame, maybe with scrollbar */
        gtk_draw_scrollable_frame(d, listsize, d->d2, height);

        return D_O_K;
    }

    return d_list_proc(msg, d, c);
}