Annotation of researchv9/jtools/src/sam/x11/scroll.c, revision 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.