|
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
|