Date: Tue, 13 Nov 2012 20:37:31 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 219770 for review Message-ID: <201211132037.qADKbVhU038880@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@219770?ac=10 Change 219770 by brooks@brooks_zenith on 2012/11/13 20:36:49 Checkpoint a working configuration dialog. Affected files ... .. //depot/projects/ctsrd/cheribsd/src/ctsrd/cheripoint/cheripoint.c#3 edit Differences ... ==== //depot/projects/ctsrd/cheribsd/src/ctsrd/cheripoint/cheripoint.c#3 (text+ko) ==== @@ -52,7 +52,9 @@ MTL_DM_640x480_CENTER /* 640x480 VGA from 480p, center pixels */ }; +int sb_vis = 0; enum sbtype sb = SB_CAPSICUM; +enum mtl_display_mode res = MTL_DM_720x480; static uint32_t slide_fcol; static uint32_t slide_width; @@ -90,7 +92,253 @@ } } +/* + * Draw simple configuration dialog, let the user toggle things. When + * done (user pinches) return 0 if nothing changed, >0 if something did. + * + * The screen looks like: + * + * Sandbox Resolution + * [*] None [ ] 800x480 + * [ ] Capsicum [*] 720x480 + * [ ] CHERI [ ] 640x480 (Left) + * [ ] 640x480 (Center) + * [ ] Visible + * + */ +#define CD_BORDER_WIDTH 8 +#define CD_TEXT_SCALE 2 +#define CD_TEXT_ROWS 6 +#define CD_SB_COLS 12 +#define CD_GAP 16 +#define CD_RES_COLS 20 static int +config_dialog(void) +{ + int changed = 0; + int f_height, f_width, tbufcols; + char *text; + uint32_t d_width, d_height, d_x, d_y; + uint32_t cfg_startr, row; + uint32_t sb_startc, sb_endc; + uint32_t res_startc, res_endc; + uint32_t *dbuf, *savebuf, *textbuf; + struct tsstate *ts; + + dbuf = savebuf = textbuf = NULL; + text = NULL; + + if ((savebuf = malloc(sizeof(uint32_t) * fb_width * fb_height)) == NULL) + return (-1); + + f_width = fb_get_font_width() * 2; + f_height = fb_get_font_height() * 2; + tbufcols = CD_RES_COLS; /* XXX: max chars */ + textbuf = malloc(sizeof(uint32_t) * f_height * f_width * tbufcols); + if (textbuf == NULL) { + changed = -1; + goto error; + } + if ((text = malloc(tbufcols + 1)) == NULL) { + changed = -1; + goto error; + } + + d_width = (CD_BORDER_WIDTH * 2) + CD_GAP + + ((CD_SB_COLS + CD_RES_COLS) * f_width); + d_height = (CD_BORDER_WIDTH * 2) + (CD_TEXT_ROWS * f_height); + d_x = (fb_width - d_width) / 2; + d_y = (fb_height - d_height) / 2; + if ((dbuf = malloc(sizeof(uint32_t) * d_width * d_height)) == NULL) { + changed = -1; + goto error; + } + + fb_save(savebuf); + +repaint: + fb_fill_buf(dbuf, white, d_width, d_height); + + cfg_startr = CD_BORDER_WIDTH; + sb_startc = CD_BORDER_WIDTH; + sb_endc = sb_startc + (CD_SB_COLS * f_width); + res_startc = sb_endc + CD_GAP; + res_endc = res_startc + (CD_RES_COLS * f_width); + + fb_fill_buf(textbuf, white, f_width * CD_SB_COLS, f_height); + fb_render_text("Sandbox", + 2, black, white, textbuf, f_width * CD_SB_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH, CD_BORDER_WIDTH + (0 * f_height), + textbuf, f_width * CD_SB_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_SB_COLS, f_height); + sprintf(text, "[%c] None", sb == SB_NONE ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_SB_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH, CD_BORDER_WIDTH + (1 * f_height), + textbuf, f_width * CD_SB_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_SB_COLS, f_height); + sprintf(text, "[%c] Capsicum", sb == SB_CAPSICUM ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_SB_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH, CD_BORDER_WIDTH + (2 * f_height), + textbuf, f_width * CD_SB_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_SB_COLS, f_height); + sprintf(text, "[%c] CHERI", sb == SB_CHERI ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_SB_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH, CD_BORDER_WIDTH + (3 * f_height), + textbuf, f_width * CD_SB_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_SB_COLS, f_height); + sprintf(text, "[%c] Visible", sb_vis ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_SB_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH, CD_BORDER_WIDTH + (5 * f_height), + textbuf, f_width * CD_SB_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_RES_COLS, f_height); + fb_render_text("Resolution", + 2, black, white, textbuf, f_width * CD_RES_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH + (f_width * CD_SB_COLS) + CD_GAP, + CD_BORDER_WIDTH + (0 * f_height), + textbuf, f_width * CD_RES_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_RES_COLS, f_height); + sprintf(text, "[%c] 800x480", res == MTL_DM_800x480 ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_RES_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH + (f_width * CD_SB_COLS) + CD_GAP, + CD_BORDER_WIDTH + (1 * f_height), + textbuf, f_width * CD_RES_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_RES_COLS, f_height); + sprintf(text, "[%c] 720x480", res == MTL_DM_720x480 ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_RES_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH + (f_width * CD_SB_COLS) + CD_GAP, + CD_BORDER_WIDTH + (2 * f_height), + textbuf, f_width * CD_RES_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_RES_COLS, f_height); + sprintf(text, "[%c] 640x480 (Left)", res == MTL_DM_640x480 ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_RES_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH + (f_width * CD_SB_COLS) + CD_GAP, + CD_BORDER_WIDTH + (3 * f_height), + textbuf, f_width * CD_RES_COLS, f_height); + + fb_fill_buf(textbuf, white, f_width * CD_RES_COLS, f_height); + sprintf(text, "[%c] 640x480 (Centered)", + res == MTL_DM_640x480_CENTER ? '*' : ' '); + fb_render_text(text, 2, black, white, textbuf, + f_width * CD_RES_COLS, f_height); + fb_composite(dbuf, d_width, d_height, + CD_BORDER_WIDTH + (f_width * CD_SB_COLS) + CD_GAP, + CD_BORDER_WIDTH + (4 * f_height), + textbuf, f_width * CD_RES_COLS, f_height); + + fb_post_region(dbuf, d_x, d_y, d_width, d_height); + + for(;;) { + ts = ts_poll(); +#if DEBUG + printf("gesture 0x%x\n", ts->ts_gesture); +#endif + switch (ts->ts_gesture) { + case TSG2_ZOOM_OUT: + goto done; + case TSG_CLICK: + row = (ts->ts_y1 - d_y - cfg_startr) / f_height; + if ((uint)ts->ts_x1 > d_x + sb_startc && + (uint)ts->ts_x1 < d_x + sb_endc) { + switch (row) { + case 1: + if (sb != SB_NONE) { + changed = 1; + sb = SB_NONE; + goto repaint; + } + break; + case 2: + if (sb != SB_CAPSICUM) { + changed = 1; + sb = SB_CAPSICUM; + goto repaint; + } + break; + case 4: + if (sb != SB_CHERI) { + changed = 1; + sb = SB_CHERI; + goto repaint; + } + break; + case 6: + changed = 1; + sb_vis = sb_vis ? 0 : 1; + goto repaint; + break; + } + } else if ((uint)ts->ts_x1 > d_y + res_startc && + (uint)ts->ts_x1 < d_y + res_endc) { + switch (row) { + case 1: + if (res != MTL_DM_800x480) { + changed = 1; + res = MTL_DM_800x480; + goto repaint; + } + break; + case 2: + if (res != MTL_DM_720x480) { + changed = 1; + res = MTL_DM_720x480; + goto repaint; + } + break; + case 3: + if (res != MTL_DM_640x480) { + changed = 1; + res = MTL_DM_640x480; + goto repaint; + } + break; + case 4: + if (res != MTL_DM_640x480_CENTER) { + changed = 1; + res = MTL_DM_640x480_CENTER; + goto repaint; + } + break; + } + } + } + } + +done: + fb_post(savebuf); +error: + free(savebuf); + free(dbuf); + free(textbuf); + free(text); + + return (changed); +} + +static int strpcmp(const void *v1, const void *v2) { const char * const *sp1; @@ -112,7 +360,7 @@ int pfd; struct iboxstate *is; - printf("rendering cover %s\n", cover); + printf("rendering cover\n"); fb_fill_region(white, 0, 0, fb_width, fb_height); @@ -233,7 +481,6 @@ addslide(int *np, int *maxp, char ***arrayp, const char *name) { - printf("n %d, max %d\n", *np, *maxp); if (*maxp == 0) { *maxp = 8; if ((*arrayp = malloc(sizeof(**arrayp) * (*maxp))) == NULL) @@ -261,6 +508,7 @@ struct dirent *entry; char *coverpat; char **covers, **slides; + int error; int cover, ncovers, maxcovers; int slide, nslides, maxslides; struct tsstate *ts; @@ -276,7 +524,7 @@ fb_load_syscons_font(NULL, "/usr/share/syscons/fonts/iso-8x16.fnt"); busy_indicator(); - set_display_mode(MTL_DM_720x480); + set_display_mode(res); printf("reading slides\n"); @@ -289,7 +537,6 @@ if (entry->d_type != DT_REG) continue; - printf("checking it %s is a cover\n", entry->d_name); if (fnmatch("*-cover-*.png", entry->d_name, 0) == 0) addslide(&ncovers, &maxcovers, &covers, entry->d_name); else @@ -315,12 +562,20 @@ ts_drain(); nop: ts = ts_poll(); +#ifdef DEBUG printf("gesture 0x%x\n", ts->ts_gesture); +#endif switch (ts->ts_gesture) { case TSG2_ZOOM_OUT: exit(0); case TSG2_NORTH: - /* XXX: display configuration box */ + error = config_dialog(); + ts_drain(); + if (error == -1) + err(1, "internal error in config dialog"); + else if (error == 0) + goto nop; + set_display_mode(res); break; case TSG_EAST: if (slide == 0)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211132037.qADKbVhU038880>