Date: Sun, 8 Jul 2012 22:39:37 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 214097 for review Message-ID: <201207082239.q68MdbRt003950@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@214097?ac=10 Change 214097 by brooks@brooks_ecr_current on 2012/07/08 22:39:20 Checkpoint code with the touch screen working. Navigation works as long as you stay out of large directories. That will be fixed when I rewrite directory scanning in the near future. Affected files ... .. //depot/projects/ctsrd/beribsd/src/ctsrd/browser/browser.c#5 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/ctsrd/browser/browser.c#5 (text+ko) ==== @@ -34,6 +34,7 @@ #include <sys/stat.h> #include <sys/wait.h> +#include <assert.h> #include <ctype.h> #include <de4tc.h> #include <dirent.h> @@ -50,18 +51,18 @@ #include <time.h> #include <unistd.h> -#define BASEIMG "/usr/share/images/browser.png" -#define ICONS "/usr/share/images/icons.png" +#define BASEIMG "/usr/share/images/browser.png" +#define ICONS "/usr/share/images/icons.png" -#define vwhite(v) fb_colour((v), (v), (v)) -#define vred(v) fb_colour((v), 0, 0) -#define vgreen(v) fb_colour(0, (v), 0) -#define vblue(v) fb_colour(0, 0, (v)) -#define black vwhite(0) -#define white vwhite(0xFF) -#define red vred(0xFF) -#define green vgreen(0xFF) -#define blue vblue(0xFF) +#define vwhite(v) fb_colour((v), (v), (v)) +#define vred(v) fb_colour((v), 0, 0) +#define vgreen(v) fb_colour(0, (v), 0) +#define vblue(v) fb_colour(0, 0, (v)) +#define black vwhite(0) +#define white vwhite(0xFF) +#define red vred(0xFF) +#define green vgreen(0xFF) +#define blue vblue(0xFF) /* * Each file is displayed in a 266x40 box: @@ -75,33 +76,41 @@ * +--------------------------------------------------------------------------+ * |----------------------------------(800/3 = 266) pixels--------------------| */ -#define FROW 41 -#define NCOL 3 -#define NROW 10 -#define NSLOTS (NCOL * NROW) -#define CWIDTH 266 -#define RHEIGHT 40 -#define ICON_WH 32 -#define BORDER 4 -#define CHAR_HEIGHT 32 -#define CHAR_WIDTH 16 -#define TEXT_OFFSET (BORDER + ICON_WH + BORDER) -#define _TEXTSPACE (CWIDTH - (TEXT_OFFSET + BORDER)) -#define TEXTSPACE (_TEXTSPACE - _TEXTSPACE % CHAR_WIDTH) +#define FROW 41 +#define NCOL 3 +#define NROW 10 +#define NSLOTS (NCOL * NROW) +#define CWIDTH 266 +#define RHEIGHT 40 +#define ICON_WH 32 +#define BORDER 4 +#define CHAR_HEIGHT 32 +#define CHAR_WIDTH 16 +#define TEXT_OFFSET (BORDER + ICON_WH + BORDER) +#define _TEXTSPACE (CWIDTH - (TEXT_OFFSET + BORDER)) +#define TEXTSPACE (_TEXTSPACE - _TEXTSPACE % CHAR_WIDTH) +/* + * The get_action() function polls for input and returns a slot number + * (either a line on the console or a space on the screen) or one of + * these actions. Internally it handles changing protection modes. + */ +#define ACT_QUIT 100 +#define ACT_PREV 101 +#define ACT_NEXT 102 /* Beginning and ending colums of each sandbox type's name */ -#define SB_IMG_SPACING 20 -#define SB_IMG_NONE_BCOL 145 -#define SB_IMG_CAPSICUM_BCOL 223 -#define SB_IMG_CHERI_BCOL 350 -#define SB_IMG_NONE_ECOL (SB_IMG_CAPSICUM_BCOL - SB_IMG_SPACING) -#define SB_IMG_CAPSICUM_ECOL (SB_IMG_CHERI_BCOL - SB_IMG_SPACING) -#define SB_IMG_CHERI_ECOL 445 -#define SB_MINCOL SB_IMG_NONE_BCOL -#define SB_MAXCOL SB_IMG_CHERI_ECOL -#define SB_MINROW (fb_height - 39) -#define SB_MAXROW (fb_height - 1) +#define SB_IMG_SPACING 20 +#define SB_IMG_NONE_BCOL 145 +#define SB_IMG_CAPSICUM_BCOL 223 +#define SB_IMG_CHERI_BCOL 350 +#define SB_IMG_NONE_ECOL (SB_IMG_CAPSICUM_BCOL - SB_IMG_SPACING) +#define SB_IMG_CAPSICUM_ECOL (SB_IMG_CHERI_BCOL - SB_IMG_SPACING) +#define SB_IMG_CHERI_ECOL 445 +#define SB_MINCOL SB_IMG_NONE_BCOL +#define SB_MAXCOL SB_IMG_CHERI_ECOL +#define SB_MINROW (fb_height - 39) +#define SB_MAXROW (fb_height - 1) /* Start offsets for browser columns */ const int colstart[] = {0, 267, 534}; @@ -202,6 +211,21 @@ } } +static const char * +get_magic(int fd) +{ + switch (sbtype) { + case SB_NONE: + return magic_descriptor(magic, fd); + case SB_CAPSICUM: + return "devil"; + case SB_CHERI: + return "devil"; + default: + errx(1, "invalid sandbox type"); + } +} + static void update_sandbox(enum _sbtype type) { @@ -221,7 +245,7 @@ pixel = (j * fb_width) + i; if (bgimage[pixel] != black) { /* XXX: Assuming we're either blue or white */ - value = (bgimage[pixel] >> 8) & 0xFF; + value = (bgimage[pixel] >> 24) & 0xFF; if (value == 0) { printf("unexpected zero value, pixel %08x\n", bgimage[pixel]); @@ -236,21 +260,6 @@ } static const char * -get_magic(int fd) -{ - switch (sbtype) { - case SB_NONE: - return magic_descriptor(magic, fd); - case SB_CAPSICUM: - return "devil"; - case SB_CHERI: - return "devil"; - default: - return "unknown"; - } -} - -static const char * get_desc(int dfd, struct dirent *entry) { int fd, type; @@ -314,15 +323,116 @@ return (NULL); } +static void +update_slot(int s, u_int32_t *icon, const char *text) +{ + u_int32_t textbuf[TEXTSPACE*CHAR_HEIGHT]; + + memset(textbuf, 0, sizeof(textbuf)); + fb_render_text(text, 2, white, black, textbuf, + TEXTSPACE, CHAR_HEIGHT); + fb_post_region(textbuf, colstart[(s/NROW)] + TEXT_OFFSET, + FROW + (RHEIGHT * (s % NROW)) + BORDER, TEXTSPACE, + CHAR_HEIGHT); + fb_post_region(icon, colstart[(s/NROW)] + BORDER, + FROW + (RHEIGHT * (s % NROW)) + BORDER, ICON_WH, ICON_WH); +} + +#ifdef TEXT_INPUT +static int +get_action(int next_slot, int prev_slot) +{ + int f; + char line[256]; + +prompt: + printf("select a file or directory by number :\n"); + if (fgets(line, sizeof(line), stdin) == NULL) { + if (feof(stdin)) + return (-1); + else + errx(1, "fgets(): %s", strerror(ferror(stdin))); + } + printf("line '%s'\n", line); + f = 0; /* XXX: gcc warning*/ + switch (line[0]) { + case '\n': + case 'n': + return (ACT_NEXT); + case 'p': + return (ACT_PREV); + case 'q': + return (ACT_QUIT); + + default: + if (!isnumber(line[0])) { + printf("invalid file %s\n", line); + goto prompt; + } + f = atoi(line); + if (f < 0 || f >= NSLOTS - 1) { + printf("invalid file %s\n", line); + goto prompt; + } + return (f); + } +} + +#else /* TEXT_INPUT */ + static int +get_action(int next_slot, int prev_slot) +{ + struct tsstate *ts; + int action = -1, col, i, row, slot; + + printf("entering get_action\n"); + + while(action < 0) { + ts = ts_poll(); + if (ts->ts_gesture == TSG_CLICK) { + if (ts->ts_x1 < FROW) { + if (ts->ts_x1 > fb_width - 40) + return (ACT_QUIT); + } else if (ts->ts_y1 <= FROW + (NROW * RHEIGHT)) { + row = (ts->ts_y1 - FROW) / RHEIGHT; + for (col = NCOL - 1; + col > 0 && ts->ts_x1 < colstart[col]; col--) + /* do nothing */ + printf("row %d col %d\n", row, col); + slot = col * NROW + row; + if (slot == next_slot) + return (ACT_NEXT); + else if (slot == prev_slot) + return (ACT_PREV); + else + return (slot); + } else { + printf("in bottom bar, x = %d\n", ts->ts_x1); + if (ts->ts_x1 >= SB_MINCOL && + ts->ts_x1 <= SB_MAXCOL) { + for (i =0 ; ts->ts_x1 < sbdata[i].bcol || + ts->ts_x1 > sbdata[i].ecol; i++) + /* do nothing */ + assert(sbdata[i].sbtype != 0); + update_sandbox(sbdata[i].sbtype); + /* XXX: should trigger a rescan? */ + } + } + } + } + /* NOTREACHED */ + return (ACT_QUIT); +} +#endif /* TEXT_INPUT */ + +static int browsedir(int dfd) { - int f, i, j, s; + int action, i, j, s; long curloc, nextloc; DIR *dirp; struct dirent *entry, *entry2; - u_int32_t *icon, textbuf[TEXTSPACE*CHAR_HEIGHT]; - char line[256]; const char *desc; if ((dirp = fdopendir(dfd)) == NULL) @@ -340,29 +450,14 @@ s = 0; if (i > 0) { printf("p %20s\n", "previous page"); - memset(textbuf, 0, sizeof(textbuf)); - fb_render_text("previous page", 2, white, black, textbuf, - TEXTSPACE, CHAR_HEIGHT); - fb_post_region(textbuf, colstart[(s/NROW)] + TEXT_OFFSET, - FROW + (RHEIGHT * (s % NROW)) + BORDER, TEXTSPACE, - CHAR_HEIGHT); - icon = get_icon("prev"); - fb_post_region(icon, colstart[(s/NROW)] + BORDER, - FROW + (RHEIGHT * (s % NROW)) + BORDER, ICON_WH, ICON_WH); + update_slot(s, get_icon("prev"), "previous page"); s = 1; } entry = NULL; /* XXX: gcc warning */ while(s < NSLOTS - 1 && (entry = readdir(dirp)) != NULL) { desc = get_desc(dfd, entry); printf("%2d %20s %s\n", s, entry->d_name, desc); - memset(textbuf, 0, sizeof(textbuf)); - fb_render_text(entry->d_name, 2, white, black, textbuf, - TEXTSPACE, CHAR_HEIGHT); - fb_post_region(textbuf, colstart[(s/NROW)]+TEXT_OFFSET, - FROW + (RHEIGHT * (s % NROW)) + BORDER, TEXTSPACE, CHAR_HEIGHT); - icon = get_icon(desc); - fb_post_region(icon, colstart[(s/NROW)] + BORDER, - FROW + (RHEIGHT * (s % NROW)) + BORDER, ICON_WH, ICON_WH); + update_slot(s, get_icon(desc), entry->d_name); s++; } @@ -382,72 +477,35 @@ desc = get_desc(dfd, entry); printf("%2d %20s %s\n", s, entry->d_name, desc); - memset(textbuf, 0, sizeof(textbuf)); - fb_render_text(entry->d_name, 2, white, black, - textbuf, TEXTSPACE, CHAR_HEIGHT); - fb_post_region(textbuf, - colstart[(s/NROW)]+TEXT_OFFSET, - FROW + (RHEIGHT * (s % NROW)) + BORDER, - TEXTSPACE, CHAR_HEIGHT); - icon = get_icon(desc); - fb_post_region(icon, - colstart[(s/NROW)] + BORDER, - FROW + (RHEIGHT * (s % NROW)) + BORDER, - ICON_WH, ICON_WH); + update_slot(s, get_icon(desc), entry->d_name); s++; } else { printf("n %20s\n", "next page"); - memset(textbuf, 0, sizeof(textbuf)); - fb_render_text("next page", 2, white, black, - textbuf, TEXTSPACE, CHAR_HEIGHT); - fb_post_region(textbuf, - colstart[(s/NROW)]+TEXT_OFFSET, - FROW + (RHEIGHT * (s % NROW)) + BORDER, - TEXTSPACE, CHAR_HEIGHT); - icon = get_icon("next"); - fb_post_region(icon, - colstart[(s/NROW)] + BORDER, - FROW + (RHEIGHT * (s % NROW)) + BORDER, - ICON_WH, ICON_WH); + update_slot(s, get_icon("next"), "next page"); } } } -prompt: - printf("select a file or directory by number :\n"); - if (fgets(line, sizeof(line), stdin) == NULL) { - if (feof(stdin)) - return (-1); - else - errx(1, "fgets(): %s", strerror(ferror(stdin))); - } - printf("line '%s'\n", line); - f = 0; /* XXX: gcc warning*/ - switch (line[0]) { - case '\n': - case 'n': + action = get_action((s == NSLOTS - 1) && entry != NULL ? NSLOTS - 1 : -1, + i == 0 ? -1 : 0); + printf("action %d\n", action); + switch (action) { + case ACT_NEXT: /* This leaks an internal struct associted with curloc/ */ if (nextloc != 0) { i += s; curloc = nextloc; } goto start; - case 'p': + case ACT_PREV: i -= s; // XXX previous page break; - case 'q': - return(-1); + case ACT_QUIT: + return (-1); default: - if (!isnumber(line[0])) { - printf("invalid file %s\n", line); - goto prompt; - } - f = atoi(line); - if (f < 0 || f >= NSLOTS - 1) { - printf("invalid file %s\n", line); - goto prompt; - } + if (action < 0 || action >= NSLOTS - 1) + errx(1, "invalid action"); } /* Take action on the specified file */ @@ -456,7 +514,7 @@ j = 0; while((entry = readdir(dirp)) != NULL) { printf("%s\n", entry->d_name); - if (j++ != f) + if (j++ != action) continue; if (entry->d_type == DT_DIR) { if ((dfd = openat(dfd, entry->d_name,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207082239.q68MdbRt003950>
