Blame


1 b5990708 2003-09-30 devnull #include <u.h>
2 b5990708 2003-09-30 devnull #include <libc.h>
3 b5990708 2003-09-30 devnull #include <draw.h>
4 b5990708 2003-09-30 devnull #include <mouse.h>
5 b5990708 2003-09-30 devnull #include <frame.h>
6 b5990708 2003-09-30 devnull
7 b5990708 2003-09-30 devnull static
8 b5990708 2003-09-30 devnull int
9 b5990708 2003-09-30 devnull region(int a, int b)
10 b5990708 2003-09-30 devnull {
11 b5990708 2003-09-30 devnull if(a < b)
12 b5990708 2003-09-30 devnull return -1;
13 b5990708 2003-09-30 devnull if(a == b)
14 b5990708 2003-09-30 devnull return 0;
15 b5990708 2003-09-30 devnull return 1;
16 b5990708 2003-09-30 devnull }
17 b5990708 2003-09-30 devnull
18 b5990708 2003-09-30 devnull void
19 b5990708 2003-09-30 devnull frselect(Frame *f, Mousectl *mc) /* when called, button 1 is down */
20 b5990708 2003-09-30 devnull {
21 b5990708 2003-09-30 devnull ulong p0, p1, q;
22 b5990708 2003-09-30 devnull Point mp, pt0, pt1, qt;
23 b5990708 2003-09-30 devnull int reg, b, scrled;
24 b5990708 2003-09-30 devnull
25 b5990708 2003-09-30 devnull mp = mc->m.xy;
26 b5990708 2003-09-30 devnull b = mc->m.buttons;
27 b5990708 2003-09-30 devnull
28 b5990708 2003-09-30 devnull f->modified = 0;
29 b5990708 2003-09-30 devnull frdrawsel(f, frptofchar(f, f->p0), f->p0, f->p1, 0);
30 b5990708 2003-09-30 devnull p0 = p1 = frcharofpt(f, mp);
31 b5990708 2003-09-30 devnull f->p0 = p0;
32 b5990708 2003-09-30 devnull f->p1 = p1;
33 b5990708 2003-09-30 devnull pt0 = frptofchar(f, p0);
34 b5990708 2003-09-30 devnull pt1 = frptofchar(f, p1);
35 b5990708 2003-09-30 devnull frdrawsel(f, pt0, p0, p1, 1);
36 b5990708 2003-09-30 devnull reg = 0;
37 b5990708 2003-09-30 devnull do{
38 b5990708 2003-09-30 devnull scrled = 0;
39 b5990708 2003-09-30 devnull if(f->scroll){
40 b5990708 2003-09-30 devnull if(mp.y < f->r.min.y){
41 b5990708 2003-09-30 devnull (*f->scroll)(f, -(f->r.min.y-mp.y)/(int)f->font->height-1);
42 b5990708 2003-09-30 devnull p0 = f->p1;
43 b5990708 2003-09-30 devnull p1 = f->p0;
44 b5990708 2003-09-30 devnull scrled = 1;
45 b5990708 2003-09-30 devnull }else if(mp.y > f->r.max.y){
46 b5990708 2003-09-30 devnull (*f->scroll)(f, (mp.y-f->r.max.y)/(int)f->font->height+1);
47 b5990708 2003-09-30 devnull p0 = f->p0;
48 b5990708 2003-09-30 devnull p1 = f->p1;
49 b5990708 2003-09-30 devnull scrled = 1;
50 b5990708 2003-09-30 devnull }
51 b5990708 2003-09-30 devnull if(scrled){
52 b5990708 2003-09-30 devnull if(reg != region(p1, p0))
53 b5990708 2003-09-30 devnull q = p0, p0 = p1, p1 = q; /* undo the swap that will happen below */
54 b5990708 2003-09-30 devnull pt0 = frptofchar(f, p0);
55 b5990708 2003-09-30 devnull pt1 = frptofchar(f, p1);
56 b5990708 2003-09-30 devnull reg = region(p1, p0);
57 b5990708 2003-09-30 devnull }
58 b5990708 2003-09-30 devnull }
59 b5990708 2003-09-30 devnull q = frcharofpt(f, mp);
60 b5990708 2003-09-30 devnull if(p1 != q){
61 b5990708 2003-09-30 devnull if(reg != region(q, p0)){ /* crossed starting point; reset */
62 b5990708 2003-09-30 devnull if(reg > 0)
63 b5990708 2003-09-30 devnull frdrawsel(f, pt0, p0, p1, 0);
64 b5990708 2003-09-30 devnull else if(reg < 0)
65 b5990708 2003-09-30 devnull frdrawsel(f, pt1, p1, p0, 0);
66 b5990708 2003-09-30 devnull p1 = p0;
67 b5990708 2003-09-30 devnull pt1 = pt0;
68 b5990708 2003-09-30 devnull reg = region(q, p0);
69 b5990708 2003-09-30 devnull if(reg == 0)
70 b5990708 2003-09-30 devnull frdrawsel(f, pt0, p0, p1, 1);
71 b5990708 2003-09-30 devnull }
72 b5990708 2003-09-30 devnull qt = frptofchar(f, q);
73 b5990708 2003-09-30 devnull if(reg > 0){
74 b5990708 2003-09-30 devnull if(q > p1)
75 b5990708 2003-09-30 devnull frdrawsel(f, pt1, p1, q, 1);
76 b5990708 2003-09-30 devnull else if(q < p1)
77 b5990708 2003-09-30 devnull frdrawsel(f, qt, q, p1, 0);
78 b5990708 2003-09-30 devnull }else if(reg < 0){
79 b5990708 2003-09-30 devnull if(q > p1)
80 b5990708 2003-09-30 devnull frdrawsel(f, pt1, p1, q, 0);
81 b5990708 2003-09-30 devnull else
82 b5990708 2003-09-30 devnull frdrawsel(f, qt, q, p1, 1);
83 b5990708 2003-09-30 devnull }
84 b5990708 2003-09-30 devnull p1 = q;
85 b5990708 2003-09-30 devnull pt1 = qt;
86 b5990708 2003-09-30 devnull }
87 b5990708 2003-09-30 devnull f->modified = 0;
88 b5990708 2003-09-30 devnull if(p0 < p1) {
89 b5990708 2003-09-30 devnull f->p0 = p0;
90 b5990708 2003-09-30 devnull f->p1 = p1;
91 b5990708 2003-09-30 devnull }
92 b5990708 2003-09-30 devnull else {
93 b5990708 2003-09-30 devnull f->p0 = p1;
94 b5990708 2003-09-30 devnull f->p1 = p0;
95 b5990708 2003-09-30 devnull }
96 b5990708 2003-09-30 devnull if(scrled)
97 b5990708 2003-09-30 devnull (*f->scroll)(f, 0);
98 b5990708 2003-09-30 devnull flushimage(f->display, 1);
99 b5990708 2003-09-30 devnull if(!scrled)
100 b5990708 2003-09-30 devnull readmouse(mc);
101 b5990708 2003-09-30 devnull mp = mc->m.xy;
102 b5990708 2003-09-30 devnull }while(mc->m.buttons == b);
103 b5990708 2003-09-30 devnull }
104 b5990708 2003-09-30 devnull
105 b5990708 2003-09-30 devnull void
106 b5990708 2003-09-30 devnull frselectpaint(Frame *f, Point p0, Point p1, Image *col)
107 b5990708 2003-09-30 devnull {
108 b5990708 2003-09-30 devnull int n;
109 b5990708 2003-09-30 devnull Point q0, q1;
110 b5990708 2003-09-30 devnull
111 b5990708 2003-09-30 devnull q0 = p0;
112 b5990708 2003-09-30 devnull q1 = p1;
113 b5990708 2003-09-30 devnull q0.y += f->font->height;
114 b5990708 2003-09-30 devnull q1.y += f->font->height;
115 b5990708 2003-09-30 devnull n = (p1.y-p0.y)/f->font->height;
116 b5990708 2003-09-30 devnull if(f->b == nil)
117 b5990708 2003-09-30 devnull drawerror(f->display, "frselectpaint b==0");
118 b5990708 2003-09-30 devnull if(p0.y == f->r.max.y)
119 b5990708 2003-09-30 devnull return;
120 b5990708 2003-09-30 devnull if(n == 0)
121 b5990708 2003-09-30 devnull draw(f->b, Rpt(p0, q1), col, nil, ZP);
122 b5990708 2003-09-30 devnull else{
123 b5990708 2003-09-30 devnull if(p0.x >= f->r.max.x)
124 b5990708 2003-09-30 devnull p0.x = f->r.max.x-1;
125 b5990708 2003-09-30 devnull draw(f->b, Rect(p0.x, p0.y, f->r.max.x, q0.y), col, nil, ZP);
126 b5990708 2003-09-30 devnull if(n > 1)
127 b5990708 2003-09-30 devnull draw(f->b, Rect(f->r.min.x, q0.y, f->r.max.x, p1.y),
128 b5990708 2003-09-30 devnull col, nil, ZP);
129 b5990708 2003-09-30 devnull draw(f->b, Rect(f->r.min.x, p1.y, q1.x, q1.y),
130 b5990708 2003-09-30 devnull col, nil, ZP);
131 b5990708 2003-09-30 devnull }
132 b5990708 2003-09-30 devnull }