|
|
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;
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: while(button(but)){
64: oin=in;
65: in=abs(x-mouse.xy.x)<=FLSCROLLWID/2;
66: if(oin!=in)
67: rectf(l->f.b, r, F_XOR);
68: if(in){
69: oy=y;
70: my=mouse.xy.y;
71: if(my<s.origin.y)
72: my=s.origin.y;
73: if(my>=s.corner.y)
74: my=s.corner.y;
75: if(!eqpt(mouse.xy, Pt(x, my)))
76: cursset(Pt(x, my));
77: if(but==1){
78: p0=l->origin-charofpt(&l->f, Pt(s.corner.x, my));
79: y=scrpos(l->scroll, p0, p0+l->f.nchars, tot).origin.y;
80: }else if(but==2){
81: y=my;
82: if(y>s.corner.y-2)
83: y=s.corner.y-2;
84: }else if(but==3){
85: p0=l->origin+charofpt(&l->f, Pt(s.corner.x, my));
86: y=scrpos(l->scroll, p0, p0+l->f.nchars, tot).origin.y;
87: }
88: if(y!=oy){
89: rectf(l->f.b, r, F_XOR);
90: r=raddp(scr, Pt(0, y-scr.origin.y));
91: rectf(l->f.b, r, F_XOR);
92: }
93: }
94: nap(2);
95: }
96: if(in){
97: Text *t=(Text *)l->user1;
98: h=s.corner.y-s.origin.y;
99: rectf(l->f.b, r, F_XOR);
100: if(but==1)
101: outTsll(Torigin, t->tag, l->origin, (long)(my-s.origin.y)/l->f.font->height+1);
102: else if(but==2){
103: if(tot>1024L*1024L)
104: p0=muldiv(tot>>10, y-s.origin.y, h)<<10;
105: else
106: p0=muldiv(tot, y-s.origin.y, h);
107: outTsll(Torigin, t->tag, p0, 1L);
108: }else if(but==3){
109: p0=l->origin+charofpt(&l->f, Pt(s.corner.x, my));
110: if(p0>tot)
111: p0=tot;
112: horigin(t->tag, p0);
113: }
114: }
115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.