Annotation of researchv9/jerq/src/lib/j/drek/menu.c, revision 1.1.1.1

1.1       root        1: #include <jerq.h>
                      2: #include <font.h>
                      3: #define        SPACING 14
                      4: Rectangle
                      5: drawmenu(menu, pt)
                      6:        register Menu *menu;
                      7:        Point pt;
                      8: {
                      9:        register i,xmax;
                     10:        register char **s;
                     11:        Point p;
                     12:        register Bitmap *b;
                     13:        Rectangle r;
                     14:        extern Font defont;
                     15: 
                     16:        s = menu->item;
                     17:        xmax = jstrwidth(*s++);
                     18:        for (i = 0; *s; i++)
                     19:                xmax = max(xmax,jstrwidth(*s++));
                     20:        xmax += 10;
                     21:        menu->n = i+1;
                     22:        if(menu->lasty <= 0)
                     23:                menu->lasty = SPACING/2;
                     24:        /* move p to origin of rectangle */
                     25:        p.x = max(0, pt.x-(xmax>>1));
                     26:        p.y = max(0, pt.y-menu->lasty);
                     27:        p.x = min(p.x, XMAX-xmax);
                     28:        p.y = min(p.y, YMAX-menu->n*SPACING-2);
                     29:        r.origin = r.corner = p;
                     30:        r.corner.x += xmax;
                     31:        r.corner.y += menu->n*SPACING+2;
                     32:        menu->b = b = balloc(r);
                     33:        cursinhibit();
                     34:        if(b)
                     35:                bitblt(&display, r, b, p, F_STORE);
                     36:        rectf(&display, r, F_OR);
                     37:        rectf(&display, inset(r, 1), F_CLR);
                     38:        p.y += 2;       /* careful with font ascent */
                     39:        for (s = menu->item; *s; s++) {
                     40:                string(&defont, *s, &display,
                     41:                        Pt(p.x+((xmax-jstrwidth(*s))>>1), p.y), F_XOR);
                     42:                p.y += SPACING;
                     43:        }
                     44:        cursallow();
                     45:        return r;
                     46: }
                     47: menuhit(menu,but)
                     48:        register Menu *menu;
                     49: {
                     50:        register hit= -1,y=menu->lasty,oldhit;
                     51:        register Bitmap *b;
                     52:        Point p;
                     53:        Rectangle r;
                     54: 
                     55:        r = drawmenu(menu, mouse.xy);
                     56:        for (oldhit = -1; bttn(but); nap(2)) {
                     57:                if (ptinrect((p = mouse.xy),r)) {
                     58:                        y = p.y - r.origin.y;
                     59:                        hit = y/SPACING;
                     60:                        if (hit<0) hit = 0;
                     61:                        if (hit>=menu->n) hit = menu->n-1;
                     62:                        if (hit!=oldhit) {
                     63:                                /* A little hysteresis */
                     64:                                if (oldhit>0 &&
                     65:                                    abs(y-(SPACING/2+hit*SPACING)) > SPACING/3)
                     66:                                        hit = oldhit;
                     67:                        }
                     68:                }
                     69:                else
                     70:                        hit = -1;
                     71:                if (hit != oldhit) {
                     72:                        flip(r,oldhit);
                     73:                        flip(r,hit);
                     74:                        oldhit = hit;
                     75:                }
                     76:        }
                     77:        if(b=menu->b){  /* assignment = */
                     78:                cursinhibit();
                     79:                screenswap(b, b->rect, b->rect);
                     80:                cursallow();
                     81:                bfree(b);
                     82:                menu->b=0;
                     83:        }
                     84:        menu->lasty = y;
                     85:        return(hit);
                     86: }
                     87: 
                     88: static flip(r,n)
                     89: Rectangle r;
                     90: register int n;
                     91: {
                     92:        if (n >= 0) {
                     93:                r.origin.y += SPACING*n+1;      /* +1 for the top line... */
                     94:                r.corner.y = r.origin.y+SPACING;
                     95:                r.origin.x++;
                     96:                r.corner.x--;
                     97:                rectf(&display, r, F_XOR);
                     98:        }
                     99: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.