#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <stdio.h>
#define RUBBOX 0
#define RUBLINE 1
extern Window draw_win;
extern Display *display;
extern int screen;
extern int xor_flag,xorfix;
extern GC gc,gc_graph;
extern unsigned int MyBackColor,MyForeColor,GrFore,GrBack;
rubber(x1,y1,x2,y2,w,f)
int *x1,*y1,*x2,*y2,f;
Window w;
{
XEvent ev;
int there=0;
int error=0;
int dragx=0,dragy=0;
int oldx=0,oldy=0;
int state=0;
xor_flag=1;
chk_xor();
if(xorfix)
XSetForeground(display,gc,GrFore);
XSelectInput(display,w,
KeyPressMask|ButtonPressMask|ButtonReleaseMask|
PointerMotionMask|ButtonMotionMask|ExposureMask);
while(!there)
{
XNextEvent(display,&ev);
switch(ev.type){
case Expose: do_expose(ev);
xor_flag=1;
chk_xor();
if(xorfix)
XSetForeground(display,gc,GrFore);
break;
case KeyPress:
if(state>0)break; /* too late Bozo */
there=1;
error=1;
break;
case ButtonPress:
if(state>0)break;
state=1;
dragx=ev.xkey.x;
dragy=ev.xkey.y;
oldx=dragx;
oldy=dragy;
rbox(dragx,dragy,oldx,oldy,w,f);
break;
case MotionNotify:
if(state==0)break;
rbox(dragx,dragy,oldx,oldy,w,f);
oldx=ev.xmotion.x;
oldy=ev.xmotion.y;
rbox(dragx,dragy,oldx,oldy,w,f);
break;
case ButtonRelease:
if(state==0)break;
there=1;
rbox(dragx,dragy,oldx,oldy,w,f);
break;
}
}
xor_flag=0;
chk_xor();
if(xorfix)
XSetForeground(display,gc,GrBack);
if(!error){
*x1=dragx;
*y1=dragy;
*x2=oldx;
*y2=oldy;
}
XSelectInput(display,w,KeyPressMask|ButtonPressMask|ExposureMask|
ButtonReleaseMask|ButtonMotionMask);
if(error)return(0);
return(1);
}
rbox(i1,j1,i2,j2,w,f)
int i1,j1,i2,j2,f;
Window w;
{
int x1=i1,x2=i2,y1=j1,y2=j2;
if(f==RUBLINE){
XDrawLine(display,w,gc,i1,j1,i2,j2);
return;
}
if(x1>x2){x2=i1;x1=i2;}
if(y1>y2){y1=j2;y2=j1;}
rectangle(x1,y1,x2,y2,w);
}
syntax highlighted by Code2HTML, v. 0.9.1