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