|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid_NewIconify_c = "$Header: NewIconify.c,v 10.4 86/04/07 17:04:38 jg Exp $"; ! 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 = "@(#)NewIconify.c 3.8 1/24/86"; ! 45: #endif ! 46: ! 47: #include "uwm.h" ! 48: ! 49: Bool NewIconify(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: register WindowInfo window_info; /* Event window info. */ ! 56: register WindowInfo icon_info; /* Icon window info. */ ! 57: char *name; /* Event window name. */ ! 58: int mse_x, mse_y; /* Mouse X and Y coordinates. */ ! 59: int icon_x, icon_y; /* Icon U. L. X and Y coordinates. */ ! 60: int icon_w, icon_h; /* Icon width and height. */ ! 61: int icon_bdr; /* Icon border width. */ ! 62: int prev_x; /* Previous event window X location. */ ! 63: int prev_y; /* Previous event window Y location. */ ! 64: int cur_x; /* Current event window X location. */ ! 65: int cur_y; /* Current event window Y location. */ ! 66: int ulx, uly; /* Event window upper left X and Y. */ ! 67: int lrx, lry; /* Event window lower right X and Y. */ ! 68: int init_ulx, init_uly; /* Init window upper left X and Y. */ ! 69: int init_lrx, init_lry; /* Init window lower right X and Y. */ ! 70: int num_vectors; /* Number of vectors in box. */ ! 71: int status; /* Routine call return status. */ ! 72: Window icon; /* Icon window. */ ! 73: Window sub_win; /* Mouse position sub-window. */ ! 74: XButtonEvent button_event; /* Button event packet. */ ! 75: Vertex box[MAX_BOX_VECTORS]; /* Box vertex buffer. */ ! 76: Vertex zap[MAX_ZAP_VECTORS]; /* Zap effect vertex buffer. */ ! 77: Bool iconifying; /* Are we iconifying? */ ! 78: ! 79: /* ! 80: * Do not lower or iconify the root window. ! 81: */ ! 82: if (window == RootWindow) ! 83: return(FALSE); ! 84: ! 85: /* ! 86: * Change the cursor to the icon cursor. ! 87: */ ! 88: status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK); ! 89: if (status == FAILURE) ! 90: Error("NewIconify -> Unable to grab button and change cursor."); ! 91: ! 92: /* ! 93: * Clear the vector buffers. ! 94: */ ! 95: bzero(box, sizeof(box)); ! 96: if (Zap) bzero(zap, sizeof(zap)); ! 97: ! 98: /* ! 99: * Get info on the event window. ! 100: */ ! 101: status = XQueryWindow(window, &window_info); ! 102: if (status == FAILURE) return(FALSE); ! 103: ! 104: /* ! 105: * Are we iconifying or de-iconifying? ! 106: */ ! 107: if (window_info.type != IsIcon) { ! 108: ! 109: /* ! 110: * Window => Icon (Iconifying). ! 111: */ ! 112: /* ! 113: * If an icon window doesn't exist for the event window, then ! 114: * make one. ! 115: */ ! 116: if (window_info.assoc_wind == 0) { ! 117: ! 118: /* ! 119: * Set the icon border width. ! 120: */ ! 121: icon_bdr = IBorderWidth; ! 122: ! 123: /* ! 124: * Determine the size of the icon window. ! 125: */ ! 126: status = XFetchName(window, &name); ! 127: if (status == FAILURE) return(FALSE); ! 128: icon_h = IFontInfo.height + (VIconPad << 1); ! 129: icon_w = XQueryWidth(name, IFont); ! 130: if (icon_w == 0) icon_w = icon_h; ! 131: else icon_w += (HIconPad << 1); ! 132: ! 133: ! 134: /* ! 135: * Create the icon window. ! 136: */ ! 137: icon = XCreateWindow(RootWindow, x + (icon_w >> 1), ! 138: y + (icon_h >> 1), icon_w, icon_h, ! 139: icon_bdr, IBorder, IBackground); ! 140: if (icon == FAILURE) return(FALSE); ! 141: ! 142: /* ! 143: * Use the text cursor whenever the mouse is in the icon window. ! 144: */ ! 145: XDefineCursor(icon, TextCursor); ! 146: ! 147: /* ! 148: * Select "key pressed", "window exposure" and "unmap window" ! 149: * events for the icon window. ! 150: */ ! 151: XSelectInput(icon, (KeyPressed | ExposeWindow | UnmapWindow)); ! 152: ! 153: /* ! 154: * Set the event window's icon window to be the new icon window. ! 155: */ ! 156: XSetIconWindow(window, icon); ! 157: } ! 158: else { ! 159: /* ! 160: * If we already have an icon window all we have to do is ! 161: * retrieve the info on it and move it into place. ! 162: */ ! 163: icon = window_info.assoc_wind; ! 164: ! 165: /* ! 166: * Get info on the icon window. ! 167: */ ! 168: status = XQueryWindow(icon, &icon_info); ! 169: if (status == FAILURE) return(FALSE); ! 170: ! 171: /* ! 172: * Determine the height, width, and borderwidth of the icon. ! 173: */ ! 174: icon_h = icon_info.height; ! 175: icon_w = icon_info.width; ! 176: icon_bdr = icon_info.bdrwidth; ! 177: } ! 178: ! 179: iconifying = TRUE; ! 180: } ! 181: else { ! 182: ! 183: /* ! 184: * Icon => Window (DeIconifying). ! 185: */ ! 186: /* ! 187: * If the window is gone, destroy the icon and return. ! 188: */ ! 189: if (window_info.assoc_wind == 0) { ! 190: XDestroyWindow(window); ! 191: Grab(mask); ! 192: return(FALSE); ! 193: } ! 194: ! 195: /* ! 196: * We call the normal window the "icon" window only to simplify ! 197: * the code later on in the function. ! 198: */ ! 199: icon = window_info.assoc_wind; ! 200: ! 201: /* ! 202: * Get info on the icon window. ! 203: */ ! 204: status = XQueryWindow(icon, &icon_info); ! 205: if (status == FAILURE) return(FALSE); ! 206: ! 207: /* ! 208: * Determine the height, width, and borderwidth of the icon. ! 209: */ ! 210: icon_h = icon_info.height; ! 211: icon_w = icon_info.width; ! 212: icon_bdr = icon_info.bdrwidth; ! 213: ! 214: iconifying = FALSE; ! 215: } ! 216: ! 217: /* ! 218: * Initialize the movement variables. ! 219: */ ! 220: init_ulx = ulx = x - (icon_w >> 1) - icon_bdr; ! 221: init_uly = uly = y - (icon_h >> 1) - icon_bdr; ! 222: init_lrx = lrx = x + (icon_w >> 1) + icon_bdr - 1; ! 223: init_lry = lry = y + (icon_h >> 1) + icon_bdr - 1; ! 224: prev_x = x; ! 225: prev_y = y; ! 226: ! 227: ! 228: /* ! 229: * Store the box. ! 230: */ ! 231: if (Grid) ! 232: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry); ! 233: else num_vectors = StoreBox(box, ulx, uly, lrx, lry); ! 234: ! 235: /* ! 236: * Freeze the server, if requested by the user. ! 237: * This results in a solid box instead of a flickering one. ! 238: */ ! 239: if (Freeze) ! 240: XGrabServer(); ! 241: ! 242: /* ! 243: * Process any outstanding events before drawing the box. ! 244: */ ! 245: while (QLength() > 0) { ! 246: XPeekEvent(&button_event); ! 247: if (button_event.window == RootWindow) ! 248: break; ! 249: GetButton(&button_event); ! 250: } ! 251: ! 252: /* ! 253: * Draw the box. ! 254: */ ! 255: DrawBox(); ! 256: if (Freeze) ! 257: Frozen = window; ! 258: ! 259: /* ! 260: * We spin our wheels here looking for mouse movement or a change ! 261: * in the status of the buttons. ! 262: */ ! 263: while (TRUE) { ! 264: ! 265: /* ! 266: * Check to see if we have a change in mouse button status. ! 267: * This is how we get out of this "while" loop. ! 268: */ ! 269: if (XPending() && GetButton(&button_event)) { ! 270: /* ! 271: * Process the pending events, this sequence is the only ! 272: * way out of the loop and the routine. ! 273: */ ! 274: ! 275: /* ! 276: * If we froze the server, then erase the last lines drawn. ! 277: */ ! 278: if (Freeze) { ! 279: DrawBox(); ! 280: Frozen = (Window)0; ! 281: XUngrabServer(); ! 282: } ! 283: ! 284: /* ! 285: * Save the mouse cursor location. ! 286: */ ! 287: mse_x = button_event.x; ! 288: mse_y = button_event.y; ! 289: break; ! 290: } ! 291: else { ! 292: /* ! 293: * Continue to track the mouse until we get a change ! 294: * in button status. ! 295: */ ! 296: XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_win); ! 297: ! 298: /* ! 299: * If the mouse has moved, then make sure the box follows it. ! 300: */ ! 301: if ((cur_x != prev_x) || (cur_y != prev_y)) { ! 302: ! 303: /* ! 304: * If we've frozen the server, then erase the old box first! ! 305: */ ! 306: if (Freeze) ! 307: DrawBox(); ! 308: ! 309: /* ! 310: * Set the new box position. ! 311: */ ! 312: ulx += cur_x - prev_x; ! 313: uly += cur_y - prev_y; ! 314: lrx += cur_x - prev_x; ! 315: lry += cur_y - prev_y; ! 316: ! 317: /* ! 318: * Calculate the vectors for the new box. ! 319: */ ! 320: if (Grid) ! 321: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry); ! 322: else num_vectors = StoreBox(box, ulx, uly, lrx, lry); ! 323: ! 324: /* ! 325: * Draw the new box. ! 326: */ ! 327: if (Freeze) ! 328: DrawBox(); ! 329: } ! 330: ! 331: /* ! 332: * Save the old box position. ! 333: */ ! 334: prev_x = cur_x; ! 335: prev_y = cur_y; ! 336: ! 337: /* ! 338: * If server is not frozen, then draw the "flicker" box. ! 339: */ ! 340: if (!Freeze) { ! 341: DrawBox(); ! 342: DrawBox(); ! 343: } ! 344: } ! 345: } ! 346: ! 347: /* ! 348: * Restore the main cursor. ! 349: */ ! 350: Grab(mask); ! 351: ! 352: /* ! 353: * If the button is not a button release of the same button pressed, ! 354: * then abort the operation. ! 355: */ ! 356: if ((button_event.type != ButtonReleased) || ! 357: ((button_event.detail & ValueMask) != button)) { ! 358: return(TRUE); ! 359: } ! 360: ! 361: /* ! 362: * If we are here we have committed to iconifying/deiconifying. ! 363: */ ! 364: ! 365: /* ! 366: * Determine the coordinates of the icon or window; ! 367: * normalize the window or icon coordinates if the user so desires. ! 368: */ ! 369: icon_x = mse_x - (icon_w >> 1) - icon_bdr; ! 370: icon_y = mse_y - (icon_h >> 1) - icon_bdr; ! 371: if ((NIcon && iconifying) || (NWindow && !iconifying)) { ! 372: if (icon_x < 0) icon_x = 0; ! 373: if (icon_y < 0) icon_y = 0; ! 374: if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) { ! 375: icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1; ! 376: } ! 377: if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) { ! 378: icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1; ! 379: } ! 380: } ! 381: ! 382: /* ! 383: * Move the window into place. ! 384: */ ! 385: XMoveWindow(icon, icon_x, icon_y); ! 386: ! 387: /* ! 388: * Map the icon window. ! 389: */ ! 390: XMapWindow(icon); ! 391: ! 392: if (Zap) { ! 393: num_vectors = StoreZap(zap, window_info.x, window_info.y, ! 394: window_info.x + window_info.width + ! 395: (window_info.bdrwidth << 1), ! 396: window_info.y + window_info.height + ! 397: (window_info.bdrwidth << 1), ! 398: ulx, uly, lrx, lry); ! 399: DrawZap(); ! 400: DrawZap(); ! 401: } ! 402: ! 403: /* ! 404: * Unmap the event window. ! 405: */ ! 406: XUnmapWindow(window); ! 407: return(TRUE); ! 408: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.