Blame


1 ed7c8e8d 2003-09-30 devnull #include <u.h>
2 ed7c8e8d 2003-09-30 devnull #include <libc.h>
3 ed7c8e8d 2003-09-30 devnull #include <draw.h>
4 ed7c8e8d 2003-09-30 devnull #include <thread.h>
5 ed7c8e8d 2003-09-30 devnull #include <cursor.h>
6 ed7c8e8d 2003-09-30 devnull #include <mouse.h>
7 ed7c8e8d 2003-09-30 devnull
8 ed7c8e8d 2003-09-30 devnull #define W Borderwidth
9 ed7c8e8d 2003-09-30 devnull
10 ed7c8e8d 2003-09-30 devnull static Image *tmp[4];
11 ed7c8e8d 2003-09-30 devnull static Image *red;
12 ed7c8e8d 2003-09-30 devnull
13 ed7c8e8d 2003-09-30 devnull static Cursor sweep={
14 ed7c8e8d 2003-09-30 devnull {-7, -7},
15 ed7c8e8d 2003-09-30 devnull {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
16 ed7c8e8d 2003-09-30 devnull 0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
17 ed7c8e8d 2003-09-30 devnull 0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
18 ed7c8e8d 2003-09-30 devnull 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
19 ed7c8e8d 2003-09-30 devnull {0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
20 ed7c8e8d 2003-09-30 devnull 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
21 ed7c8e8d 2003-09-30 devnull 0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
22 ed7c8e8d 2003-09-30 devnull 0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
23 ed7c8e8d 2003-09-30 devnull };
24 ed7c8e8d 2003-09-30 devnull
25 ed7c8e8d 2003-09-30 devnull static
26 ed7c8e8d 2003-09-30 devnull void
27 ed7c8e8d 2003-09-30 devnull brects(Rectangle r, Rectangle rp[4])
28 ed7c8e8d 2003-09-30 devnull {
29 ed7c8e8d 2003-09-30 devnull if(Dx(r) < 2*W)
30 ed7c8e8d 2003-09-30 devnull r.max.x = r.min.x+2*W;
31 ed7c8e8d 2003-09-30 devnull if(Dy(r) < 2*W)
32 ed7c8e8d 2003-09-30 devnull r.max.y = r.min.y+2*W;
33 ed7c8e8d 2003-09-30 devnull rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
34 ed7c8e8d 2003-09-30 devnull rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
35 ed7c8e8d 2003-09-30 devnull rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
36 ed7c8e8d 2003-09-30 devnull rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
37 ed7c8e8d 2003-09-30 devnull }
38 ed7c8e8d 2003-09-30 devnull
39 ed7c8e8d 2003-09-30 devnull Rectangle
40 ed7c8e8d 2003-09-30 devnull getrect(int but, Mousectl *mc)
41 ed7c8e8d 2003-09-30 devnull {
42 ed7c8e8d 2003-09-30 devnull Rectangle r, rc;
43 ed7c8e8d 2003-09-30 devnull
44 ed7c8e8d 2003-09-30 devnull but = 1<<(but-1);
45 ed7c8e8d 2003-09-30 devnull setcursor(mc, &sweep);
46 ed7c8e8d 2003-09-30 devnull while(mc->m.buttons)
47 ed7c8e8d 2003-09-30 devnull readmouse(mc);
48 ed7c8e8d 2003-09-30 devnull while(!(mc->m.buttons & but)){
49 ed7c8e8d 2003-09-30 devnull readmouse(mc);
50 ed7c8e8d 2003-09-30 devnull if(mc->m.buttons & (7^but))
51 ed7c8e8d 2003-09-30 devnull goto Return;
52 ed7c8e8d 2003-09-30 devnull }
53 ed7c8e8d 2003-09-30 devnull r.min = mc->m.xy;
54 ed7c8e8d 2003-09-30 devnull r.max = mc->m.xy;
55 ed7c8e8d 2003-09-30 devnull do{
56 ed7c8e8d 2003-09-30 devnull rc = canonrect(r);
57 ed7c8e8d 2003-09-30 devnull drawgetrect(rc, 1);
58 ed7c8e8d 2003-09-30 devnull readmouse(mc);
59 ed7c8e8d 2003-09-30 devnull drawgetrect(rc, 0);
60 ed7c8e8d 2003-09-30 devnull r.max = mc->m.xy;
61 ed7c8e8d 2003-09-30 devnull }while(mc->m.buttons == but);
62 ed7c8e8d 2003-09-30 devnull
63 ed7c8e8d 2003-09-30 devnull Return:
64 ed7c8e8d 2003-09-30 devnull setcursor(mc, nil);
65 ed7c8e8d 2003-09-30 devnull if(mc->m.buttons & (7^but)){
66 ed7c8e8d 2003-09-30 devnull rc.min.x = rc.max.x = 0;
67 ed7c8e8d 2003-09-30 devnull rc.min.y = rc.max.y = 0;
68 ed7c8e8d 2003-09-30 devnull while(mc->m.buttons)
69 ed7c8e8d 2003-09-30 devnull readmouse(mc);
70 ed7c8e8d 2003-09-30 devnull }
71 ed7c8e8d 2003-09-30 devnull return rc;
72 ed7c8e8d 2003-09-30 devnull }
73 ed7c8e8d 2003-09-30 devnull
74 ed7c8e8d 2003-09-30 devnull static
75 ed7c8e8d 2003-09-30 devnull void
76 ed7c8e8d 2003-09-30 devnull freetmp(void)
77 ed7c8e8d 2003-09-30 devnull {
78 ed7c8e8d 2003-09-30 devnull freeimage(tmp[0]);
79 ed7c8e8d 2003-09-30 devnull freeimage(tmp[1]);
80 ed7c8e8d 2003-09-30 devnull freeimage(tmp[2]);
81 ed7c8e8d 2003-09-30 devnull freeimage(tmp[3]);
82 ed7c8e8d 2003-09-30 devnull freeimage(red);
83 ed7c8e8d 2003-09-30 devnull tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
84 ed7c8e8d 2003-09-30 devnull }
85 ed7c8e8d 2003-09-30 devnull
86 ed7c8e8d 2003-09-30 devnull static
87 ed7c8e8d 2003-09-30 devnull int
88 ed7c8e8d 2003-09-30 devnull max(int a, int b)
89 ed7c8e8d 2003-09-30 devnull {
90 ed7c8e8d 2003-09-30 devnull if(a > b)
91 ed7c8e8d 2003-09-30 devnull return a;
92 ed7c8e8d 2003-09-30 devnull return b;
93 ed7c8e8d 2003-09-30 devnull }
94 ed7c8e8d 2003-09-30 devnull
95 ed7c8e8d 2003-09-30 devnull void
96 ed7c8e8d 2003-09-30 devnull drawgetrect(Rectangle rc, int up)
97 ed7c8e8d 2003-09-30 devnull {
98 ed7c8e8d 2003-09-30 devnull int i;
99 ed7c8e8d 2003-09-30 devnull Rectangle r, rects[4];
100 ed7c8e8d 2003-09-30 devnull
101 ed7c8e8d 2003-09-30 devnull /*
102 ed7c8e8d 2003-09-30 devnull * BUG: if for some reason we have two of these going on at once
103 ed7c8e8d 2003-09-30 devnull * when we must grow the tmp buffers, we lose data. Also if tmp
104 ed7c8e8d 2003-09-30 devnull * is unallocated and we ask to restore the screen, it would be nice
105 ed7c8e8d 2003-09-30 devnull * to complain, but we silently make a mess.
106 ed7c8e8d 2003-09-30 devnull */
107 ed7c8e8d 2003-09-30 devnull if(up && tmp[0]!=nil)
108 ed7c8e8d 2003-09-30 devnull if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
109 ed7c8e8d 2003-09-30 devnull freetmp();
110 ed7c8e8d 2003-09-30 devnull if(tmp[0] == 0){
111 ed7c8e8d 2003-09-30 devnull r = Rect(0, 0, max(Dx(display->screenimage->r), Dx(rc)), W);
112 ed7c8e8d 2003-09-30 devnull tmp[0] = allocimage(display, r, screen->chan, 0, -1);
113 ed7c8e8d 2003-09-30 devnull tmp[1] = allocimage(display, r, screen->chan, 0, -1);
114 ed7c8e8d 2003-09-30 devnull r = Rect(0, 0, W, max(Dy(display->screenimage->r), Dy(rc)));
115 ed7c8e8d 2003-09-30 devnull tmp[2] = allocimage(display, r, screen->chan, 0, -1);
116 ed7c8e8d 2003-09-30 devnull tmp[3] = allocimage(display, r, screen->chan, 0, -1);
117 ed7c8e8d 2003-09-30 devnull red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
118 ed7c8e8d 2003-09-30 devnull if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0){
119 ed7c8e8d 2003-09-30 devnull freetmp();
120 ed7c8e8d 2003-09-30 devnull drawerror(display, "getrect: allocimage failed");
121 ed7c8e8d 2003-09-30 devnull }
122 ed7c8e8d 2003-09-30 devnull }
123 ed7c8e8d 2003-09-30 devnull brects(rc, rects);
124 ed7c8e8d 2003-09-30 devnull if(!up){
125 ed7c8e8d 2003-09-30 devnull for(i=0; i<4; i++)
126 ed7c8e8d 2003-09-30 devnull draw(screen, rects[i], tmp[i], nil, ZP);
127 ed7c8e8d 2003-09-30 devnull return;
128 ed7c8e8d 2003-09-30 devnull }
129 ed7c8e8d 2003-09-30 devnull for(i=0; i<4; i++){
130 ed7c8e8d 2003-09-30 devnull draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
131 ed7c8e8d 2003-09-30 devnull draw(screen, rects[i], red, nil, ZP);
132 ed7c8e8d 2003-09-30 devnull }
133 ed7c8e8d 2003-09-30 devnull }