URI:
       tegetrect.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tegetrect.c (2612B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <draw.h>
            4 #include <cursor.h>
            5 #include <event.h>
            6 
            7 #define        W        Borderwidth
            8 
            9 static Image *tmp[4];
           10 static Image *red;
           11 
           12 static Cursor sweep={
           13         {-7, -7},
           14         {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
           15          0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
           16          0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
           17          0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
           18         {0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
           19          0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
           20          0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
           21          0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
           22 };
           23 
           24 static
           25 void
           26 brects(Rectangle r, Rectangle rp[4])
           27 {
           28         if(Dx(r) < 2*W)
           29                 r.max.x = r.min.x+2*W;
           30         if(Dy(r) < 2*W)
           31                 r.max.y = r.min.y+2*W;
           32         rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
           33         rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
           34         rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
           35         rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
           36 }
           37 
           38 Rectangle
           39 egetrect(int but, Mouse *m)
           40 {
           41         Rectangle r, rc;
           42 
           43         but = 1<<(but-1);
           44         esetcursor(&sweep);
           45         while(m->buttons)
           46                 *m = emouse();
           47         while(!(m->buttons & but)){
           48                 *m = emouse();
           49                 if(m->buttons & (7^but))
           50                         goto Return;
           51         }
           52         r.min = m->xy;
           53         r.max = m->xy;
           54         do{
           55                 rc = canonrect(r);
           56                 edrawgetrect(rc, 1);
           57                 *m = emouse();
           58                 edrawgetrect(rc, 0);
           59                 r.max = m->xy;
           60         }while(m->buttons == but);
           61 
           62     Return:
           63         esetcursor(0);
           64         if(m->buttons & (7^but)){
           65                 rc.min.x = rc.max.x = 0;
           66                 rc.min.y = rc.max.y = 0;
           67                 while(m->buttons)
           68                         *m = emouse();
           69         }
           70         return rc;
           71 }
           72 
           73 static
           74 void
           75 freetmp(void)
           76 {
           77         freeimage(tmp[0]);
           78         freeimage(tmp[1]);
           79         freeimage(tmp[2]);
           80         freeimage(tmp[3]);
           81         freeimage(red);
           82         tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
           83 }
           84 
           85 void
           86 edrawgetrect(Rectangle rc, int up)
           87 {
           88         int i;
           89         Rectangle r, rects[4];
           90 
           91         if(up && tmp[0]!=nil)
           92                 if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
           93                         freetmp();
           94 
           95         if(tmp[0] == 0){
           96                 r = Rect(0, 0, Dx(screen->r), W);
           97                 tmp[0] = allocimage(display, r, screen->chan, 0, -1);
           98                 tmp[1] = allocimage(display, r, screen->chan, 0, -1);
           99                 r = Rect(0, 0, W, Dy(screen->r));
          100                 tmp[2] = allocimage(display, r, screen->chan, 0, -1);
          101                 tmp[3] = allocimage(display, r, screen->chan, 0, -1);
          102                 red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
          103                 if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0)
          104                         drawerror(display, "getrect: allocimage failed");
          105         }
          106         brects(rc, rects);
          107         if(!up){
          108                 for(i=0; i<4; i++)
          109                         draw(screen, rects[i], tmp[i], nil, ZP);
          110                 return;
          111         }
          112         for(i=0; i<4; i++){
          113                 draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
          114                 draw(screen, rects[i], red, nil, ZP);
          115         }
          116 }