|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright Massachusetts Institute of Technology 1985 */ ! 4: ! 5: /* ! 6: * LowerIconify - This subroutine implements window lowering and ! 7: * iconifing for the X Window System window manager (xwm). ! 8: * ! 9: * File: LowerIconify.c ! 10: * Modified: ADF 29-May-85 Converted to X version 8.0 ! 11: */ ! 12: ! 13: #include "xwm.h" ! 14: #ifndef lint ! 15: static char *rcsid_LowerIconify_c = "$Header: LowerIconify.c,v 10.4 86/02/01 16:09:38 tony Rel $"; ! 16: #endif ! 17: ! 18: LowerIconify(window, x, y) ! 19: Window window; /* Event window. */ ! 20: int x, y; /* Event mouse position. */ ! 21: { ! 22: register WindowInfo window_info; /* Event window info. */ ! 23: register WindowInfo icon_info; /* Icon window info. */ ! 24: char *name; /* Event window name. */ ! 25: int mse_x, mse_y; /* Mouse X and Y coordinates. */ ! 26: int icon_x, icon_y; /* Icon U. L. X and Y coordinates. */ ! 27: int icon_w, icon_h; /* Icon width and height. */ ! 28: int icon_bdr; /* Icon border width. */ ! 29: int status; /* Routine call return status. */ ! 30: int num_vectors; /* Number of vectors in zap buffer. */ ! 31: Window icon; /* Icon window. */ ! 32: Window sub_win; /* Mouse position sub-window. */ ! 33: XButtonEvent button_event; /* Button event packet. */ ! 34: Vertex zap[MAX_ZAP_VECTORS]; /* Zap effect vertex buffer. */ ! 35: Bool iconifying; /* Are we iconifying? */ ! 36: ! 37: /* ! 38: * Clear the vector buffer. ! 39: */ ! 40: if (Zap) bzero(zap, sizeof(zap)); ! 41: ! 42: /* ! 43: * Get info on the event window. ! 44: */ ! 45: status = XQueryWindow(window, &window_info); ! 46: if (status == FAILURE) return; ! 47: ! 48: /* ! 49: * If the mouse is in an icon window simply lower the window and return. ! 50: */ ! 51: if (window_info.type == IsIcon) { ! 52: ! 53: /* ! 54: * Wait for the button to come back up. ! 55: */ ! 56: while (!GetButton(&button_event)); ! 57: ! 58: if ( ! 59: (button_event.type == ButtonReleased) && ! 60: ((button_event.detail & ValueMask) == LeftButton) ! 61: ){ ! 62: XLowerWindow(window); ! 63: } ! 64: ! 65: return; ! 66: } ! 67: ! 68: /* ! 69: * If we are here then the event was not on an iconified window. ! 70: * This flag denotes whether the window we're on is being ! 71: * iconified or not. ! 72: */ ! 73: iconifying = FALSE; ! 74: ! 75: /* ! 76: * We spin our wheels here looking for mouse movement or a change ! 77: * in the status of the buttons. ! 78: */ ! 79: while (TRUE) { ! 80: ! 81: /* ! 82: * Check to see if we have a change in mouse button status. ! 83: * This is how we get out of this "while" loop. ! 84: */ ! 85: if (XPending() && GetButton(&button_event)) { ! 86: mse_x = button_event.x; ! 87: mse_y = button_event.y; ! 88: if ( ! 89: !iconifying && ! 90: ((abs(mse_x - x) > Delta) || (abs(mse_y - y) > Delta)) ! 91: ){ ! 92: /* ! 93: * The mouse has moved Delta pixels without the left button ! 94: * going up. This means we are iconifying a window. ! 95: * We warn the user by changing the mouse cursor to the ! 96: * funny icon cursor. ! 97: */ ! 98: iconifying = TRUE; ! 99: status = XGrabButton( ! 100: RootWindow, ! 101: IconCursor, ! 102: (LeftMask | ButtonMask), ! 103: (ButtonPressed | ButtonReleased) ! 104: ); ! 105: if (status == FAILURE) { ! 106: Error("LowerIconify -> Unable to grab left button and change cursor."); ! 107: } ! 108: } ! 109: break; ! 110: } ! 111: else if (!iconifying) { ! 112: /* ! 113: * Continue to track the mouse untill we exceed delta or ! 114: * get a change in button status. ! 115: */ ! 116: XQueryMouse(RootWindow, &mse_x, &mse_y, &sub_win); ! 117: ! 118: if ((abs(mse_x - x) > Delta) || (abs(mse_y - y) > Delta)) { ! 119: /* ! 120: * The mouse has moved Delta pixels without the left button ! 121: * going up. This means we are iconifying a window. ! 122: * We warn the user by changing the mouse cursor to the ! 123: * funny icon cursor. ! 124: */ ! 125: iconifying = TRUE; ! 126: status = XGrabButton( ! 127: RootWindow, ! 128: IconCursor, ! 129: (LeftMask | ButtonMask), ! 130: (ButtonPressed | ButtonReleased) ! 131: ); ! 132: if (status == FAILURE) { ! 133: Error("LowerIconify -> Unable to grab left button and change cursor."); ! 134: } ! 135: } ! 136: } ! 137: } ! 138: ! 139: if (iconifying) { ! 140: /* ! 141: * Restore the window manager mouse cursor. ! 142: */ ! 143: status = XGrabButton( ! 144: RootWindow, ! 145: DotCursor, ! 146: (LeftMask | ButtonMask), ! 147: (ButtonPressed | ButtonReleased) ! 148: ); ! 149: if (status == FAILURE) { ! 150: Error("LowerIconify -> Unable to grab left button and change cursor."); ! 151: } ! 152: } ! 153: ! 154: /* ! 155: * If the left button is released and we are not iconifying then ! 156: * lower the window and return. If any other button event occured ! 157: * abort the operation. ! 158: */ ! 159: if ( ! 160: (button_event.type == ButtonReleased) && ! 161: ((button_event.detail & ValueMask) == LeftButton) ! 162: ){ ! 163: if (!iconifying) { ! 164: XLowerWindow(window); ! 165: return; ! 166: } ! 167: } ! 168: else { ! 169: /* ! 170: * Abort! ! 171: */ ! 172: return; ! 173: } ! 174: ! 175: /* ! 176: * If we are here we have committed to iconifying the window. ! 177: */ ! 178: ! 179: if (window_info.assoc_wind == 0) { ! 180: /* ! 181: * We need to make an icon window for the event window. ! 182: */ ! 183: ! 184: /* ! 185: * Set the icon border width. ! 186: */ ! 187: icon_bdr = IBorderWidth; ! 188: ! 189: /* ! 190: * Determine the size of the icon window. ! 191: */ ! 192: status = XFetchName(window, &name); ! 193: if (status == FAILURE) return; ! 194: icon_h = IFontInfo.height + (IPadding << 1); ! 195: icon_w = XQueryWidth(name, IFont); ! 196: if (icon_w == 0) { ! 197: icon_w = icon_h; ! 198: } ! 199: else { ! 200: icon_w += (IPadding << 1); ! 201: } ! 202: ! 203: /* ! 204: * Determine the coordinates of the icon window; ! 205: * normalize so that we don't lose the icon off the ! 206: * edge of the screen. ! 207: */ ! 208: icon_x = mse_x - (icon_w >> 1) + 1; ! 209: if (icon_x < 0) icon_x = 0; ! 210: icon_y = mse_y - (icon_h >> 1) + 1; ! 211: if (icon_y < 0) icon_y = 0; ! 212: if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) { ! 213: icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1; ! 214: } ! 215: if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) { ! 216: icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1; ! 217: } ! 218: ! 219: /* ! 220: * Create the icon window. ! 221: */ ! 222: icon = XCreateWindow( ! 223: RootWindow, ! 224: icon_x, icon_y, ! 225: icon_w, icon_h, ! 226: icon_bdr, ! 227: IBorder, IBackground ! 228: ); ! 229: if (icon == FAILURE) return; ! 230: ! 231: /* ! 232: * Use the text cursor whenever the mouse is in the icon window. ! 233: */ ! 234: XDefineCursor(icon, TextCursor); ! 235: ! 236: /* ! 237: * Select "key pressed", "window exposure" and "unmap window" ! 238: * events for the icon window. ! 239: */ ! 240: XSelectInput(icon, (KeyPressed | ExposeWindow | UnmapWindow)); ! 241: ! 242: /* ! 243: * Set the event window's icon window to be the new icon window. ! 244: */ ! 245: XSetIconWindow(window, icon); ! 246: } ! 247: else { ! 248: /* ! 249: * If we already have an icon window all we have to do is ! 250: * retrieve the info on it and move it into place. ! 251: */ ! 252: icon = window_info.assoc_wind; ! 253: ! 254: /* ! 255: * Get info on the icon window. ! 256: */ ! 257: status = XQueryWindow(icon, &icon_info); ! 258: if (status == FAILURE) return; ! 259: ! 260: /* ! 261: * Set the icon border width. ! 262: */ ! 263: icon_bdr = icon_info.bdrwidth; ! 264: ! 265: /* ! 266: * Determine the size of the icon window. ! 267: */ ! 268: icon_h = icon_info.height; ! 269: icon_w = icon_info.width; ! 270: ! 271: /* ! 272: * Determine the coordinates of the icon window; ! 273: * normalize so that we don't lose the icon off the ! 274: * edge of the screen. ! 275: */ ! 276: icon_x = mse_x - (icon_w >> 1) + 1; ! 277: if (icon_x < 0) icon_x = 0; ! 278: icon_y = mse_y - (icon_h >> 1) + 1; ! 279: if (icon_y < 0) icon_y = 0; ! 280: if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) { ! 281: icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1; ! 282: } ! 283: if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) { ! 284: icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1; ! 285: } ! 286: ! 287: /* ! 288: * Move the window into place. ! 289: */ ! 290: XMoveWindow(icon, icon_x, icon_y); ! 291: } ! 292: ! 293: if (Zap) { ! 294: /* ! 295: * Store the zap effect vectors. ! 296: */ ! 297: num_vectors = StoreZap( ! 298: zap, ! 299: window_info.x - 1, ! 300: window_info.y - 1, ! 301: window_info.x + window_info.width + (window_info.bdrwidth << 1), ! 302: window_info.y + window_info.height + (window_info.bdrwidth << 1), ! 303: icon_x - 1, ! 304: icon_y - 1, ! 305: icon_x + icon_w + (icon_bdr << 1), ! 306: icon_y + icon_h + (icon_bdr << 1) ! 307: ); ! 308: } ! 309: ! 310: /* ! 311: * Map the icon window. ! 312: */ ! 313: XMapWindow(icon); ! 314: ! 315: if (Zap) { ! 316: /* ! 317: * Draw zap lines from the window to its icon. ! 318: */ ! 319: XDraw( ! 320: RootWindow, ! 321: zap, num_vectors, ! 322: DRAW_HEIGHT, DRAW_WIDTH, ! 323: DRAW_VALUE, DRAW_FUNC, DRAW_PLANES ! 324: ); ! 325: XDraw( ! 326: RootWindow, ! 327: zap, num_vectors, ! 328: DRAW_HEIGHT, DRAW_WIDTH, ! 329: DRAW_VALUE, DRAW_FUNC, DRAW_PLANES ! 330: ); ! 331: } ! 332: ! 333: /* ! 334: * Unmap the event window. ! 335: */ ! 336: XUnmapWindow(window); ! 337: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.