|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid_MoveOpaque_c = "$Header: MoveOpaque.c,v 10.3 86/02/01 16:23:22 tony Rel $"; ! 3: #endif lint ! 4: ! 5: /************************************************************************ ! 6: * * ! 7: * Copyright (c) 1986 by * ! 8: * Digital Equipment Corporation, Maynard, MA * ! 9: * All Rights Reserved. * ! 10: * * ! 11: * Permission to use, copy, modify, and distribute this software * ! 12: * and its documentation is hereby granted only to licensees of * ! 13: * The Regents of the University of California pursuant to their * ! 14: * license agreement for the Berkeley Software Distribution * ! 15: * provided that the following appears on all copies. * ! 16: * * ! 17: * "LICENSED FROM DIGITAL EQUIPMENT CORPORATION * ! 18: * COPYRIGHT (C) 1986 * ! 19: * DIGITAL EQUIPMENT CORPORATION * ! 20: * MAYNARD, MA * ! 21: * ALL RIGHTS RESERVED. * ! 22: * * ! 23: * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT * ! 24: * NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL * ! 25: * EQUIPMENT CORPORATION. DIGITAL MAKES NO REPRESENTATIONS * ! 26: * ABOUT SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. IT IS * ! 27: * SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. * ! 28: * * ! 29: * IF THE UNIVERSITY OF CALIFORNIA OR ITS LICENSEES MODIFY * ! 30: * THE SOFTWARE IN A MANNER CREATING DERIVATIVE COPYRIGHT * ! 31: * RIGHTS APPROPRIATE COPYRIGHT LEGENDS MAY BE PLACED ON THE * ! 32: * DERIVATIVE WORK IN ADDITION TO THAT SET FORTH ABOVE." * ! 33: * * ! 34: ************************************************************************/ ! 35: ! 36: ! 37: /* ! 38: * MODIFICATION HISTORY ! 39: * ! 40: * 000 -- M. Gancarz, DEC Ultrix Engineering Group ! 41: */ ! 42: ! 43: #ifndef lint ! 44: static char *sccsid = "@(#)MoveOpaque.c 1.7 1/24/86"; ! 45: #endif ! 46: ! 47: #include "uwm.h" ! 48: ! 49: Bool MoveOpaque(window, mask, button, x, y) ! 50: Window window; /* Event window. */ ! 51: int mask; /* Button/key mask. */ ! 52: short button; /* Button event detail. */ ! 53: int x, y; /* Event mouse position. */ ! 54: { ! 55: int prev_x, prev_y; /* Previous mouse location. */ ! 56: int cur_x, cur_y; /* Current mouse location. */ ! 57: int win_x, win_y; /* Current window location. */ ! 58: WindowInfo window_info; /* Event window information. */ ! 59: Window sub_window; /* Query mouse event sub-window. */ ! 60: XButtonEvent button_event; /* Button event packet. */ ! 61: ! 62: /* ! 63: * Do not try to move the root window. ! 64: */ ! 65: if (window == RootWindow) ! 66: return(FALSE); ! 67: ! 68: /* ! 69: * Change the cursor. ! 70: */ ! 71: status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK); ! 72: if (status == FAILURE) ! 73: Error("MoveOpaque -> Unable to grab button and change cursor."); ! 74: ! 75: /* ! 76: * Gather info on the event window. ! 77: */ ! 78: status = XQueryWindow(window, &window_info); ! 79: if (status == FAILURE) return(FALSE); ! 80: ! 81: /* ! 82: * Initialize movement variables. ! 83: */ ! 84: prev_x = cur_x = x; ! 85: prev_y = cur_y = y; ! 86: win_x = window_info.x; ! 87: win_y = window_info.y; ! 88: ! 89: /* ! 90: * Main loop. ! 91: */ ! 92: while (TRUE) { ! 93: ! 94: /* ! 95: * Check to see if we have a change in mouse button status. ! 96: * This is how we get out of this "while" loop. ! 97: */ ! 98: if (XPending() && GetButton(&button_event)) { ! 99: ! 100: /* ! 101: * If the button event was something other than the ! 102: * release of the original button pressed, then move the ! 103: * window back to where it was originally. ! 104: */ ! 105: if ((button_event.type != ButtonReleased) || ! 106: ((button_event.detail & ValueMask) != button)) ! 107: XMoveWindow(window, window_info.x, window_info.y); ! 108: ! 109: /* ! 110: * Reset the cursor and return. ! 111: */ ! 112: Grab(mask); ! 113: return(TRUE); ! 114: } ! 115: ! 116: /* ! 117: * Take care of all the little things that have changed; ! 118: * i.e., move the window, if necessary. ! 119: */ ! 120: XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_window); ! 121: if ((cur_x != prev_x) || (cur_y != prev_y)) { ! 122: win_x += (cur_x - prev_x); ! 123: win_y += (cur_y - prev_y); ! 124: XMoveWindow(window, win_x, win_y); ! 125: prev_x = cur_x; ! 126: prev_y = cur_y; ! 127: } ! 128: } ! 129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.