Blame tests/util/xmruler.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: xmruler.c /main/6 1995/07/13 20:57:53 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
 *    file:    xmruler.c
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <testlib.h>
Packit b099d7
#include <X11/cursorfont.h>
Packit b099d7
Packit b099d7
#define    XK_MISCELLANY
Packit b099d7
#include <X11/keysymdef.h>
Packit b099d7
Packit b099d7
#define    MM_PER_INCH    25.4
Packit b099d7
Packit b099d7
/* callback procedures */
Packit b099d7
static void  quitCB();
Packit b099d7
static void  measureFunc();
Packit b099d7
static Boolean    do_measure();
Packit b099d7
static void    draw_box();
Packit b099d7
Packit b099d7
Packit b099d7
Widget        upper_left_Xlabel, upper_left_Xvalue;
Packit b099d7
Widget        upper_left_Ylabel, upper_left_Yvalue;
Packit b099d7
Widget        lower_right_Xlabel, lower_right_Xvalue;
Packit b099d7
Widget        lower_right_Ylabel, lower_right_Yvalue;
Packit b099d7
Packit b099d7
Widget        pixel_width_label, width_in_pixels;
Packit b099d7
Widget        pixel_height_label, height_in_pixels;
Packit b099d7
Widget        mm_width_label, width_in_mms;
Packit b099d7
Widget        mm_height_label, height_in_mms;
Packit b099d7
Widget        inch_width_label, width_in_inches;
Packit b099d7
Widget        inch_height_label, height_in_inches;
Packit b099d7
Packit b099d7
Packit b099d7
int    user_button, press_button;
Packit b099d7
int    box_x, box_y;
Packit b099d7
unsigned int    box_width, box_height;
Packit b099d7
Packit b099d7
int    upper_leftX, upper_leftY;
Packit b099d7
int    lower_rightX, lower_rightY;
Packit b099d7
int    pixel_width, pixel_height;
Packit b099d7
double mm_width, mm_height;
Packit b099d7
double inch_width, inch_height;
Packit b099d7
Packit b099d7
int    screenWidth, screenHeight;
Packit b099d7
double screenWidthMM, screenHeightMM;
Packit b099d7
double screenWidthInches, screenHeightInches;
Packit b099d7
Packit b099d7
int    prev_ulx = 0;
Packit b099d7
int    prev_uly = 0;
Packit b099d7
int    prev_lrx = 0;
Packit b099d7
int    prev_lry = 0;
Packit b099d7
Packit b099d7
Packit b099d7
static void  measureFunc(w, client_data, call_data)
Packit b099d7
Widget w;
Packit b099d7
XtPointer client_data, call_data;
Packit b099d7
{
Packit b099d7
Packit b099d7
    Arg    args[1];
Packit b099d7
    int    n;
Packit b099d7
    char    label[100];
Packit b099d7
    int    value;
Packit b099d7
Packit b099d7
    upper_leftX = prev_ulx;
Packit b099d7
    upper_leftY = prev_uly;
Packit b099d7
    lower_rightX = prev_lrx;
Packit b099d7
    lower_rightY = prev_lry;
Packit b099d7
Packit b099d7
    XtUnmapWidget(Shell1);
Packit b099d7
Packit b099d7
    if (do_measure() == True) {
Packit b099d7
Packit b099d7
        prev_ulx = upper_leftX;
Packit b099d7
         prev_uly = upper_leftY;
Packit b099d7
         prev_lrx = lower_rightX;
Packit b099d7
         prev_lry = lower_rightY;
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%d", upper_leftX);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(upper_left_Xvalue, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%d", upper_leftY);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(upper_left_Yvalue, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%d", lower_rightX);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(lower_right_Xvalue, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%d", lower_rightY);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(lower_right_Yvalue, args, n);
Packit b099d7
Packit b099d7
    pixel_width = lower_rightX - upper_leftX;
Packit b099d7
    pixel_height = lower_rightY - upper_leftY;
Packit b099d7
    mm_width = pixel_width * (screenWidthMM / screenWidth);
Packit b099d7
    mm_height = pixel_height * (screenHeightMM / screenHeight);
Packit b099d7
    inch_width = pixel_width * (screenWidthInches / screenWidth);
Packit b099d7
    inch_height = pixel_height * (screenHeightInches / screenHeight);
Packit b099d7
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%d", pixel_width);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(width_in_pixels, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%d", pixel_height);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(height_in_pixels, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%.2f", mm_width);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(width_in_mms, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%.2f", mm_height);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(height_in_mms, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%.2f", inch_width);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(width_in_inches, args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    sprintf(label, "%.2f", inch_height);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple (label)); n++;
Packit b099d7
    XtSetValues(height_in_inches, args, n);
Packit b099d7
Packit b099d7
    XtMapWidget(Shell1);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void  quitCB(w, client_data, call_data)
Packit b099d7
Widget w;
Packit b099d7
XtPointer client_data, call_data;
Packit b099d7
{
Packit b099d7
     printf("Begin exiting ... please standby ... \n");
Packit b099d7
     fflush(stdout);
Packit b099d7
     exit(0);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void  main(argc, argv)
Packit b099d7
    int     argc;
Packit b099d7
    char  **argv;
Packit b099d7
{
Packit b099d7
    register int  n;
Packit b099d7
    Arg           args[MAX_ARGS];
Packit b099d7
    Widget        Form1;
Packit b099d7
    Widget          RowCol1, RowCol2;
Packit b099d7
    Widget        quit;
Packit b099d7
    Widget        measure;
Packit b099d7
Packit b099d7
Packit b099d7
    CommonTestInit(argc, argv);
Packit b099d7
    
Packit b099d7
Packit b099d7
    screenWidth = WidthOfScreen(screen);
Packit b099d7
    screenHeight = HeightOfScreen(screen);
Packit b099d7
    screenWidthMM = WidthMMOfScreen(screen);
Packit b099d7
    screenHeightMM = HeightMMOfScreen(screen);
Packit b099d7
    screenWidthInches = screenWidthMM / MM_PER_INCH;
Packit b099d7
    screenHeightInches = screenHeightMM / MM_PER_INCH;
Packit b099d7
Packit b099d7
    pixel_width = pixel_height = 
Packit b099d7
    mm_width = mm_height = 
Packit b099d7
    inch_width = inch_height = 0;
Packit b099d7
Packit b099d7
    /* Shell 1 children */
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Form1 = XmCreateForm (Shell1, "Form1", args, n);
Packit b099d7
    XtManageChild (Form1);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightPosition, 50); n++;
Packit b099d7
    XtSetArg(args[n], XmNentryAlignment, XmALIGNMENT_CENTER); n++;
Packit b099d7
    XtSetArg(args[n], XmNspacing, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNorientation, XmVERTICAL); n++;
Packit b099d7
    XtSetArg(args[n], XmNpacking, XmPACK_COLUMN); n++;
Packit b099d7
    XtSetArg(args[n], XmNbackground, CommonGetColor("darkgreen")); n++;
Packit b099d7
Packit b099d7
    RowCol1 = XmCreateRowColumn(Form1, "RowCol1", args, n);
Packit b099d7
    XtManageChild(RowCol1);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftPosition, 50); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNentryAlignment, XmALIGNMENT_CENTER); n++;
Packit b099d7
    XtSetArg(args[n], XmNspacing, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNorientation, XmVERTICAL); n++;
Packit b099d7
    XtSetArg(args[n], XmNpacking, XmPACK_COLUMN); n++;
Packit b099d7
    XtSetArg(args[n], XmNbackground, CommonGetColor("darkgreen")); n++;
Packit b099d7
Packit b099d7
    RowCol2 = XmCreateRowColumn(Form1, "RowCol2", args, n);
Packit b099d7
    XtManageChild(RowCol2);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    upper_left_Xlabel = XmCreateLabel (RowCol1, "UpperLeft_X: ", args, n);      
Packit b099d7
    XtManageChild (upper_left_Xlabel);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    upper_left_Ylabel = XmCreateLabel (RowCol1, "UpperLeft_Y: ", args, n);      
Packit b099d7
    XtManageChild (upper_left_Ylabel);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    lower_right_Xlabel = XmCreateLabel (RowCol1, "LowerRight_X: ", args, n);
Packit b099d7
    XtManageChild (lower_right_Xlabel);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    lower_right_Ylabel = XmCreateLabel (RowCol1, "LowerRight_Y: ", args, n);
Packit b099d7
    XtManageChild (lower_right_Ylabel);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    pixel_width_label = XmCreateLabel (RowCol1, "Width_In_Pixels: ", args, n);
Packit b099d7
    XtManageChild (pixel_width_label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    pixel_height_label = XmCreateLabel (RowCol1, "Height_In_Pixels: ", args, n);
Packit b099d7
    XtManageChild (pixel_height_label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    mm_width_label = XmCreateLabel (RowCol1, "Width_In_MMs: ", args, n);      
Packit b099d7
    XtManageChild (mm_width_label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    mm_height_label = XmCreateLabel (RowCol1, "Height_In_MMs: ", args, n);
Packit b099d7
    XtManageChild (mm_height_label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    inch_width_label = XmCreateLabel (RowCol1, "Width_In_Inches: ", args, n);
Packit b099d7
    XtManageChild (inch_width_label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    inch_height_label = XmCreateLabel (RowCol1, "Height_In_Inches: ", args, n);
Packit b099d7
    XtManageChild (inch_height_label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    upper_left_Xvalue = XmCreateLabel (RowCol2, "0", args, n);      
Packit b099d7
    XtManageChild (upper_left_Xvalue);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    upper_left_Yvalue = XmCreateLabel (RowCol2, "0", args, n);      
Packit b099d7
    XtManageChild (upper_left_Yvalue);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    lower_right_Xvalue = XmCreateLabel (RowCol2, "0", args, n);      
Packit b099d7
    XtManageChild (lower_right_Xvalue);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    lower_right_Yvalue = XmCreateLabel (RowCol2, "0", args, n);      
Packit b099d7
    XtManageChild (lower_right_Yvalue);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    width_in_pixels = XmCreateLabel (RowCol2, "0", args, n);      
Packit b099d7
    XtManageChild (width_in_pixels);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    height_in_pixels = XmCreateLabel (RowCol2, "0", args, n);      
Packit b099d7
    XtManageChild (height_in_pixels);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    width_in_mms = XmCreateLabel (RowCol2, "0.0", args, n);      
Packit b099d7
    XtManageChild (width_in_mms);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    height_in_mms = XmCreateLabel (RowCol2, "0.0", args, n);      
Packit b099d7
    XtManageChild (height_in_mms);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    width_in_inches = XmCreateLabel (RowCol2, "0.0", args, n);      
Packit b099d7
    XtManageChild (width_in_inches);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    height_in_inches = XmCreateLabel (RowCol2, "0.0", args, n);      
Packit b099d7
    XtManageChild (height_in_inches);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopWidget, RowCol1); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightPosition, 50); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNlabelString, XmStringCreateSimple ("Measure")); n++;
Packit b099d7
    measure = XmCreatePushButton (Form1, "Measure", args, n);      
Packit b099d7
    XtManageChild (measure);
Packit b099d7
    XtAddCallback (measure,  XmNactivateCallback, measureFunc, NULL);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopWidget, RowCol2); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftPosition, 50); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 5); n++;
Packit b099d7
    XtSetArg (args[n], XmNlabelString, XmStringCreateSimple ("Quit")); n++;
Packit b099d7
    quit = XmCreatePushButton (Form1, "Quit", args, n);      
Packit b099d7
    XtManageChild (quit);
Packit b099d7
    XtAddCallback (quit,  XmNactivateCallback, quitCB, NULL);
Packit b099d7
    
Packit b099d7
    XtRealizeWidget(Shell1);
Packit b099d7
Packit b099d7
    XtAppMainLoop(app_context);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static Boolean do_measure ()
Packit b099d7
{
Packit b099d7
Packit b099d7
    register int x, y;
Packit b099d7
    Window root_window, child_window;
Packit b099d7
    int root_x, root_y, win_x, win_y;
Packit b099d7
    int first_x, first_y;
Packit b099d7
    int final_x, final_y;
Packit b099d7
    unsigned int mask;
Packit b099d7
    Bool done, cancel;
Packit b099d7
    static GC crossGC = (GC) NULL;
Packit b099d7
    static Cursor crossCursor;
Packit b099d7
    static Cursor reversecrossCursor;
Packit b099d7
    XEvent event;
Packit b099d7
    static GC    gc;
Packit b099d7
    static int    first_time = True;
Packit b099d7
    static int    box_drawn = False;
Packit b099d7
Packit b099d7
Packit b099d7
    crossCursor = XCreateFontCursor (display, XC_cross);
Packit b099d7
    reversecrossCursor = XCreateFontCursor (display, XC_cross_reverse);
Packit b099d7
Packit b099d7
    if (first_time == True) {
Packit b099d7
Packit b099d7
#ifdef DEBUG
Packit b099d7
        gc = XCreateGC(display, rootWindow, CommonGetColor("black"), 0, NULL);
Packit b099d7
        XSetSubwindowMode(display, gc, IncludeInferiors);
Packit b099d7
        XSetForeground(display, gc, CommonGetColor("black"));
Packit b099d7
        XSetFunction(display, gc, GXxor);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
        if (UserData != NULL) {
Packit b099d7
            user_button = atoi(UserData);
Packit b099d7
            switch (user_button) {
Packit b099d7
Packit b099d7
                case 1:
Packit b099d7
                    press_button = Button1;
Packit b099d7
                    break;
Packit b099d7
Packit b099d7
                case 2:
Packit b099d7
                    press_button = Button2;
Packit b099d7
                    break;
Packit b099d7
Packit b099d7
                case 3:
Packit b099d7
                    press_button = Button3;
Packit b099d7
                    break;
Packit b099d7
Packit b099d7
                default:
Packit b099d7
                    press_button = Button1;
Packit b099d7
                    break;
Packit b099d7
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
        else
Packit b099d7
            press_button = Button1;
Packit b099d7
Packit b099d7
        first_time = False;
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XGrabPointer (display, rootWindow, False, ButtonReleaseMask,
Packit b099d7
              GrabModeAsync, GrabModeAsync, rootWindow,
Packit b099d7
              crossCursor, CurrentTime) != GrabSuccess) {
Packit b099d7
        fprintf (stderr, "Unable to grab pointer\n");
Packit b099d7
        exit (1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* Wait for ButtonPress with press_button event giving the first point */
Packit b099d7
    done = False;
Packit b099d7
    while (!done) {
Packit b099d7
Packit b099d7
        XNextEvent(display, &event);
Packit b099d7
        switch (event.type) {
Packit b099d7
Packit b099d7
            case ButtonRelease:
Packit b099d7
Packit b099d7
                if (event.xbutton.button == press_button) {
Packit b099d7
Packit b099d7
                    first_x = event.xbutton.x_root;
Packit b099d7
                    first_y = event.xbutton.y_root;
Packit b099d7
                    XUngrabPointer (display, CurrentTime);
Packit b099d7
                    XFlush (display);
Packit b099d7
                    if (XGrabPointer(display, rootWindow, False, 
Packit b099d7
                                     ButtonReleaseMask, GrabModeAsync, 
Packit b099d7
                                     GrabModeAsync, rootWindow, 
Packit b099d7
                                     reversecrossCursor, CurrentTime) 
Packit b099d7
                                     != GrabSuccess) {
Packit b099d7
                        fprintf (stderr, "Unable to grab pointer :2\n");
Packit b099d7
                        exit (1);
Packit b099d7
                    }
Packit b099d7
                    done = True;
Packit b099d7
        
Packit b099d7
                }
Packit b099d7
Packit b099d7
                break;
Packit b099d7
Packit b099d7
            default:
Packit b099d7
Packit b099d7
                break;
Packit b099d7
Packit b099d7
        }
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
#ifdef DEBUG
Packit b099d7
    /* We need pointer motion events also. */
Packit b099d7
    XChangeActivePointerGrab(display, PointerMotionHintMask |
Packit b099d7
                             ButtonMotionMask | ButtonPressMask |
Packit b099d7
                             ButtonReleaseMask | OwnerGrabButtonMask,
Packit b099d7
                             crossCursor, CurrentTime);
Packit b099d7
Packit b099d7
    XGrabServer(display);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    done = False;
Packit b099d7
    cancel = True;
Packit b099d7
    while (!done) {
Packit b099d7
Packit b099d7
        XNextEvent (display, &event);
Packit b099d7
Packit b099d7
        switch (event.type) {
Packit b099d7
Packit b099d7
            case ButtonRelease:
Packit b099d7
Packit b099d7
                if (event.xbutton.button != press_button)
Packit b099d7
                    continue;
Packit b099d7
Packit b099d7
#ifdef DEBUG
Packit b099d7
                if (box_drawn == True)
Packit b099d7
                    /* Undraw box */
Packit b099d7
                    draw_box(gc, box_x, box_y, box_width, box_height);
Packit b099d7
Packit b099d7
                XUngrabServer(display);
Packit b099d7
#endif
Packit b099d7
                XUngrabPointer (display, CurrentTime);
Packit b099d7
                XFlush (display);
Packit b099d7
Packit b099d7
                /* Get final pointer position */
Packit b099d7
                XQueryPointer(display, rootWindow, &root_window, 
Packit b099d7
                              &child_window, &final_x, &final_y, &win_x,
Packit b099d7
                              &win_y, &mask);
Packit b099d7
                XFlush(display);
Packit b099d7
#ifdef DEBUG
Packit b099d7
                box_drawn = False;
Packit b099d7
Packit b099d7
                while(XCheckMaskEvent(display, ButtonReleaseMask |
Packit b099d7
                                      ButtonPressMask, &event))
Packit b099d7
                    ;
Packit b099d7
#endif
Packit b099d7
                done = True;
Packit b099d7
                break;
Packit b099d7
Packit b099d7
#ifdef DEBUG
Packit b099d7
            case MotionNotify:
Packit b099d7
Packit b099d7
                if (box_drawn == True)
Packit b099d7
                    /* Undraw box */
Packit b099d7
                    draw_box(gc, box_x, box_y, box_width, box_height);
Packit b099d7
                /*
Packit b099d7
                 * Get rid of all MotionNotify events in queue, since
Packit b099d7
                 * otherwise the round-trip delays caused by
Packit b099d7
                 * XQueryPointer may cause a backlog of MotionNotify
Packit b099d7
                 * events, thus causing additional wasted XQueryPointer
Packit b099d7
                 * calls.
Packit b099d7
                 */
Packit b099d7
                while (XCheckTypedEvent(display, MotionNotify, &event))
Packit b099d7
                    ;
Packit b099d7
Packit b099d7
                /* Get current pointer position */
Packit b099d7
                XQueryPointer(display, rootWindow, &root_window,
Packit b099d7
                              &child_window, &root_x, &root_y,
Packit b099d7
                              &win_x, &win_y, &mask);
Packit b099d7
                box_width = abs(root_x - first_x);
Packit b099d7
                box_height = abs(root_y - first_y);
Packit b099d7
                box_x = (root_x < first_x) ? root_x : first_x;
Packit b099d7
                box_y = (root_y < first_y) ? root_y : first_y;
Packit b099d7
                draw_box(gc, box_x, box_y, box_width, box_height);
Packit b099d7
                box_drawn = True;
Packit b099d7
                break;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/**Debug**
Packit b099d7
            case KeyRelease:
Packit b099d7
Packit b099d7
                if (XKeycodeToKeysym(display, event.xkey.keycode, 0) ==
Packit b099d7
                    XK_Escape) {
Packit b099d7
Packit b099d7
                    done = True;
Packit b099d7
                    break;
Packit b099d7
Packit b099d7
                }
Packit b099d7
Packit b099d7
**/
Packit b099d7
            default:
Packit b099d7
Packit b099d7
                break;
Packit b099d7
Packit b099d7
        }
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
/**Debug**
Packit b099d7
    if (cancel == True)
Packit b099d7
        return(False);
Packit b099d7
**/
Packit b099d7
    upper_leftX = (first_x < final_x) ? first_x : final_x;
Packit b099d7
    upper_leftY = (first_y < final_y) ? first_y : final_y;
Packit b099d7
    lower_rightX = (first_x < final_x) ? final_x : first_x;
Packit b099d7
    lower_rightY = (first_y < final_y) ? final_y : first_y;
Packit b099d7
Packit b099d7
    return(True);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef DEBUG
Packit b099d7
static void    draw_box(gc, x, y, width, height)
Packit b099d7
GC    gc;
Packit b099d7
int    x, y;
Packit b099d7
unsigned int    width, height;
Packit b099d7
{
Packit b099d7
Packit b099d7
    /* Set foreground pixel value */
Packit b099d7
    XSetForeground(display, gc, CommonGetColor("black"));
Packit b099d7
Packit b099d7
    /* Drawing on root window, through all windows */
Packit b099d7
    XSetSubwindowMode(display, gc, IncludeInferiors);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Logical function is XOR, so that double drawing erases box
Packit b099d7
     * on both color and monochrome screens.
Packit b099d7
     */
Packit b099d7
     XSetFunction(display, gc, GXxor);
Packit b099d7
Packit b099d7
     XDrawRectangle(display, rootWindow, gc, x, y, width, height);
Packit b099d7
Packit b099d7
}
Packit b099d7
#endif