17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <cursor.h>
57dd7cddfSDavid du Colombier #include <event.h>
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier #define W Borderwidth
87dd7cddfSDavid du Colombier
97dd7cddfSDavid du Colombier static Image *tmp[4];
107dd7cddfSDavid du Colombier static Image *red;
117dd7cddfSDavid du Colombier
127dd7cddfSDavid du Colombier static Cursor sweep={
137dd7cddfSDavid du Colombier {-7, -7},
147dd7cddfSDavid du Colombier {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
157dd7cddfSDavid du Colombier 0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
167dd7cddfSDavid du Colombier 0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
177dd7cddfSDavid du Colombier 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
187dd7cddfSDavid du Colombier {0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
197dd7cddfSDavid du Colombier 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
207dd7cddfSDavid du Colombier 0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
217dd7cddfSDavid du Colombier 0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
227dd7cddfSDavid du Colombier };
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier static
257dd7cddfSDavid du Colombier void
brects(Rectangle r,Rectangle rp[4])267dd7cddfSDavid du Colombier brects(Rectangle r, Rectangle rp[4])
277dd7cddfSDavid du Colombier {
287dd7cddfSDavid du Colombier if(Dx(r) < 2*W)
297dd7cddfSDavid du Colombier r.max.x = r.min.x+2*W;
307dd7cddfSDavid du Colombier if(Dy(r) < 2*W)
317dd7cddfSDavid du Colombier r.max.y = r.min.y+2*W;
327dd7cddfSDavid du Colombier rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
337dd7cddfSDavid du Colombier rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
347dd7cddfSDavid du Colombier rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
357dd7cddfSDavid du Colombier rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
367dd7cddfSDavid du Colombier }
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier Rectangle
egetrect(int but,Mouse * m)397dd7cddfSDavid du Colombier egetrect(int but, Mouse *m)
407dd7cddfSDavid du Colombier {
417dd7cddfSDavid du Colombier Rectangle r, rc;
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier but = 1<<(but-1);
447dd7cddfSDavid du Colombier esetcursor(&sweep);
457dd7cddfSDavid du Colombier while(m->buttons)
467dd7cddfSDavid du Colombier *m = emouse();
477dd7cddfSDavid du Colombier while(!(m->buttons & but)){
487dd7cddfSDavid du Colombier *m = emouse();
497dd7cddfSDavid du Colombier if(m->buttons & (7^but))
507dd7cddfSDavid du Colombier goto Return;
517dd7cddfSDavid du Colombier }
527dd7cddfSDavid du Colombier r.min = m->xy;
537dd7cddfSDavid du Colombier r.max = m->xy;
547dd7cddfSDavid du Colombier do{
557dd7cddfSDavid du Colombier rc = canonrect(r);
567dd7cddfSDavid du Colombier edrawgetrect(rc, 1);
577dd7cddfSDavid du Colombier *m = emouse();
587dd7cddfSDavid du Colombier edrawgetrect(rc, 0);
597dd7cddfSDavid du Colombier r.max = m->xy;
607dd7cddfSDavid du Colombier }while(m->buttons == but);
617dd7cddfSDavid du Colombier
627dd7cddfSDavid du Colombier Return:
637dd7cddfSDavid du Colombier esetcursor(0);
647dd7cddfSDavid du Colombier if(m->buttons & (7^but)){
657dd7cddfSDavid du Colombier rc.min.x = rc.max.x = 0;
667dd7cddfSDavid du Colombier rc.min.y = rc.max.y = 0;
677dd7cddfSDavid du Colombier while(m->buttons)
687dd7cddfSDavid du Colombier *m = emouse();
697dd7cddfSDavid du Colombier }
707dd7cddfSDavid du Colombier return rc;
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier
73*9a747e4fSDavid du Colombier static
74*9a747e4fSDavid du Colombier void
freetmp(void)75*9a747e4fSDavid du Colombier freetmp(void)
76*9a747e4fSDavid du Colombier {
77*9a747e4fSDavid du Colombier freeimage(tmp[0]);
78*9a747e4fSDavid du Colombier freeimage(tmp[1]);
79*9a747e4fSDavid du Colombier freeimage(tmp[2]);
80*9a747e4fSDavid du Colombier freeimage(tmp[3]);
81*9a747e4fSDavid du Colombier freeimage(red);
82*9a747e4fSDavid du Colombier tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
83*9a747e4fSDavid du Colombier }
84*9a747e4fSDavid du Colombier
857dd7cddfSDavid du Colombier void
edrawgetrect(Rectangle rc,int up)867dd7cddfSDavid du Colombier edrawgetrect(Rectangle rc, int up)
877dd7cddfSDavid du Colombier {
887dd7cddfSDavid du Colombier int i;
897dd7cddfSDavid du Colombier Rectangle r, rects[4];
907dd7cddfSDavid du Colombier
91*9a747e4fSDavid du Colombier if(up && tmp[0]!=nil)
92*9a747e4fSDavid du Colombier if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
93*9a747e4fSDavid du Colombier freetmp();
94*9a747e4fSDavid du Colombier
957dd7cddfSDavid du Colombier if(tmp[0] == 0){
96*9a747e4fSDavid du Colombier r = Rect(0, 0, Dx(screen->r), W);
97*9a747e4fSDavid du Colombier tmp[0] = allocimage(display, r, screen->chan, 0, -1);
98*9a747e4fSDavid du Colombier tmp[1] = allocimage(display, r, screen->chan, 0, -1);
99*9a747e4fSDavid du Colombier r = Rect(0, 0, W, Dy(screen->r));
100*9a747e4fSDavid du Colombier tmp[2] = allocimage(display, r, screen->chan, 0, -1);
101*9a747e4fSDavid du Colombier tmp[3] = allocimage(display, r, screen->chan, 0, -1);
102*9a747e4fSDavid du Colombier red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
1037dd7cddfSDavid du Colombier if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0)
1047dd7cddfSDavid du Colombier drawerror(display, "getrect: allocimage failed");
1057dd7cddfSDavid du Colombier }
1067dd7cddfSDavid du Colombier brects(rc, rects);
1077dd7cddfSDavid du Colombier if(!up){
1087dd7cddfSDavid du Colombier for(i=0; i<4; i++)
1097dd7cddfSDavid du Colombier draw(screen, rects[i], tmp[i], nil, ZP);
1107dd7cddfSDavid du Colombier return;
1117dd7cddfSDavid du Colombier }
1127dd7cddfSDavid du Colombier for(i=0; i<4; i++){
1137dd7cddfSDavid du Colombier draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
1147dd7cddfSDavid du Colombier draw(screen, rects[i], red, nil, ZP);
1157dd7cddfSDavid du Colombier }
1167dd7cddfSDavid du Colombier }
117