|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.