getrect.c - sam - An updated version of the sam text editor.
 (HTM) git clone git://vernunftzentrum.de/sam.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       getrect.c (1424B)
       ---
            1 /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */
            2 #include <u.h>
            3 #include <libg.h>
            4 #include "libgint.h"
            5 
            6 static void
            7 grabcursor(void)
            8 {
            9     raisewindow();
           10 
           11     /* Grab X server with an limp wrist. */
           12     while (XGrabPointer(_dpy, screen.id, False,
           13             ButtonPressMask|ButtonReleaseMask|
           14             ButtonMotionMask|StructureNotifyMask,
           15         GrabModeAsync, GrabModeAsync, None, None, CurrentTime)
           16             != GrabSuccess)
           17         sleep(2);
           18 
           19     /* Grab the keyboard too */
           20     XSetInputFocus(_dpy, screen.id, RevertToParent, CurrentTime);
           21 }
           22 
           23 static void
           24 ungrabcursor(void)
           25 {
           26     XUngrabPointer(_dpy, CurrentTime);
           27 }
           28 
           29 Rectangle
           30 getrect(int but, Mouse *m){
           31     Rectangle r, rc;
           32 
           33     but = 1<<(but-1);
           34     cursorswitch(SweepCursor);
           35     while(m->buttons)
           36         *m = emouse();
           37     grabcursor();
           38     while(!(m->buttons & but)){
           39         *m = emouse();
           40         if(m->buttons & (7^but))
           41             goto Return;
           42     }
           43     r.min = m->xy;
           44     r.max = m->xy;
           45     do{
           46         rc = rcanon(r);
           47         border(&screen, rc, 2, F&~D, _bgpixel);
           48         *m = emouse();
           49         border(&screen, rc, 2, F&~D, _bgpixel);
           50         r.max = m->xy;
           51     }while(m->buttons & but);
           52 
           53     Return:
           54     cursorswitch(DefaultCursor);
           55     if(m->buttons & (7^but)){
           56         rc.min.x = rc.max.x = 0;
           57         rc.min.y = rc.max.y = 0;
           58         while(m->buttons)
           59             *m = emouse();
           60     }
           61     ungrabcursor();
           62     return rc;
           63 }