Annotation of researchv9/jtools/src/sam/x11/scroll.c, revision 1.1.1.1

1.1       root        1: #include "samterm.h"
                      2: Rectangle      scrpos();
                      3: extern Texture darkgrey;
                      4: scrdraw(l, tot)
                      5:        register Flayer *l;
                      6:        long tot;
                      7: {
                      8:        Rectangle r;
                      9:        register Bitmap *b;
                     10:        if(l->f.b==0)
                     11:                panic("scrdraw");
                     12:        r=l->scroll;
                     13:        r.origin.x+=1;  /* border between margin and bar */
                     14:        if(l->visible!=All || (b=balloc(r))==0)
                     15:                b=l->f.b;
                     16:        rectf(b, r, F_OR);
                     17:        texture(b, inset(r, 1), &darkgrey, F_STORE);
                     18:        rectf(b, scrpos(r, l->origin, l->origin+l->f.nchars, tot), F_CLR);
                     19:        if(b!=l->f.b){
                     20:                bitblt(b, b->rect, l->f.b, b->rect.origin, F_STORE);
                     21:                bfree(b);
                     22:        }
                     23: }
                     24: Rectangle
                     25: scrpos(r, p0, p1, tot)
                     26:        Rectangle r;
                     27:        register long p0, p1, tot;
                     28: {
                     29:        register long h;
                     30:        Rectangle q;
                     31:        q=inset(r, 1);
                     32:        h=q.corner.y-q.origin.y;
                     33:        if(tot==0)
                     34:                return q;
                     35:        if(tot>1024L*1024L)
                     36:                tot>>=10, p0>>=10, p1>>=10;
                     37:        if(p0>0)
                     38:                q.origin.y+=muldiv(h, p0, tot);
                     39:        if(p1<tot)
                     40:                q.corner.y-=muldiv(h, tot-p1, tot);
                     41:        if(q.corner.y<q.origin.y+2){
                     42:                if(q.origin.y+2<=r.corner.y)
                     43:                        q.corner.y=q.origin.y+2;
                     44:                else
                     45:                        q.origin.y=q.corner.y-2;
                     46:        }
                     47:        return q;
                     48: }
                     49: scroll(l, but)
                     50:        register Flayer *l;
                     51: {
                     52:        register in=0, oin;
                     53:        register long tot=scrtotal(l);
                     54:        Rectangle scr, r, s, nscr;
                     55:        register x, y, my, oy, h;
                     56:        register long p0;
                     57:        s=inset(l->scroll, 1);
                     58:        x=s.origin.x+FLSCROLLWID/2;
                     59:        scr=scrpos(l->scroll, l->origin, l->origin+l->f.nchars, tot);
                     60:        r=scr;
                     61:        y=scr.origin.y;
                     62:        my=mouse.xy.y;
                     63: 
                     64:        while(button(but)){
                     65:                oin=in;
                     66:                in=abs(x-mouse.xy.x)<=FLSCROLLWID/2;
                     67:                if(oin!=in)
                     68:                        rectf(l->f.b, r, F_XOR);
                     69:                if(in){
                     70:                        oy=y;
                     71:                        my=mouse.xy.y;
                     72:                        if(my<s.origin.y)
                     73:                                my=s.origin.y;
                     74:                        if(my>=s.corner.y)
                     75:                                my=s.corner.y;
                     76:                        if(my != mouse.xy.y)
                     77:                                cursset(Pt(mouse.xy.x, my));
                     78:                        if(but==1){
                     79:                                p0=l->origin-charofpt(&l->f, Pt(s.corner.x, my));
                     80:                                nscr=scrpos(l->scroll, p0, p0+l->f.nchars, tot);
                     81:                                y=nscr.origin.y;
                     82:                        }else if(but==2){
                     83:                                y=my;
                     84:                                if(y>s.corner.y-2)
                     85:                                        y=s.corner.y-2;
                     86:                        }else if(but==3){
                     87:                                p0=l->origin+charofpt(&l->f, Pt(s.corner.x, my));
                     88:                                nscr=scrpos(l->scroll, p0, p0+l->f.nchars, tot);
                     89:                                y=nscr.origin.y;
                     90:                        }
                     91:                        if(y!=oy){
                     92:                                rectf(l->f.b, r, F_XOR);
                     93:                                r=raddp(scr, Pt(0, y-scr.origin.y));
                     94:                                rectf(l->f.b, r, F_XOR);
                     95:                        }
                     96:                }
                     97:                jnap(2);
                     98:        }
                     99:        if(in){
                    100:                Text *t=(Text *)l->user1;
                    101:                h=s.corner.y-s.origin.y;
                    102:                rectf(l->f.b, r, F_XOR);
                    103:                if(but==1)
                    104:                        outTsll(Torigin, t->tag, l->origin, (long)(my-s.origin.y)/fheight(l->f.font)+1);
                    105:                else if(but==2){
                    106:                        if(tot>1024L*1024L)
                    107:                                p0=muldiv(tot>>10, y-s.origin.y, h)<<10;
                    108:                        else
                    109:                                p0=muldiv(tot, y-s.origin.y, h);
                    110:                        outTsll(Torigin, t->tag, p0, 1L);
                    111:                }else if(but==3){
                    112:                        p0=l->origin+charofpt(&l->f, Pt(s.corner.x, my));
                    113:                        if(p0>tot)
                    114:                                p0=tot;
                    115:                        horigin(t->tag, p0);
                    116:                }
                    117:        }
                    118: }

unix.superglobalmegacorp.com

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