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