|
|
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.