|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* $Header: XCreate.c,v 10.10 86/08/11 12:55:45 wesommer Rel $ */ ! 4: /* Copyright 1985, Massachusetts Institute of Technology */ ! 5: /* stolen from CLU routine x_cons, redone by J. Gettys */ ! 6: ! 7: #include "XlibInternal.h" ! 8: #include <stdio.h> ! 9: #define TRUE 1 ! 10: #define FALSE 0 ! 11: #define max(a,b) ( (a) > (b) ? (a) : (b) ) ! 12: #define min(a,b) ( (a) > (b) ? (b) : (a) ) ! 13: #define abs(a) ( (a) > 0 ? (a) : -(a)) ! 14: ! 15: #define DCOUNT 2 ! 16: #define VCOUNT 1 + (4 * 2 * DCOUNT) ! 17: #define FCOUNT 1 + 4 ! 18: ! 19: #define CURSOR_LL 0 ! 20: #include "../cursors/ll_angle.cursor" ! 21: #include "../cursors/ll_angle_mask.cursor" ! 22: #define CURSOR_LR 1 ! 23: #include "../cursors/lr_angle.cursor" ! 24: #include "../cursors/lr_angle_mask.cursor" ! 25: #define CURSOR_UL 2 ! 26: #include "../cursors/ul_angle.cursor" ! 27: #include "../cursors/ul_angle_mask.cursor" ! 28: #define CURSOR_UR 3 ! 29: #include "../cursors/ur_angle.cursor" ! 30: #include "../cursors/ur_angle_mask.cursor" ! 31: ! 32: ! 33: Window XCreate(prompt, name, geometry, def, frame, minwidth, minheight) ! 34: char *prompt, *name; ! 35: register OpaqueFrame *frame; ! 36: int minwidth, minheight; ! 37: char *geometry, *def; ! 38: { ! 39: char *fn = "8x13"; /* default default font */ ! 40: FontInfo *pfninfo; /* font info on prompt */ ! 41: Window pop; /* pop up window */ ! 42: char *opt; ! 43: int pfore, pback; /* prompt window colors */ ! 44: int bpix; /* border color */ ! 45: int mfore, mback; /* mouse colors */ ! 46: int pbw = 1; /* prompt window border width */ ! 47: int ibw = 1; /* internal border width */ ! 48: int freeze = 0; /* should we freeze the server */ ! 49: Color cdef; /* color structure for lookup */ ! 50: Cursor ur,ul,lr,ll; /* cursors for rubber banding */ ! 51: int events; /* event mask */ ! 52: int popw, poph; /* prompt window height and width */ ! 53: int count = VCOUNT; /* vertex count */ ! 54: Pixmap save = 0; /* saved pixmap */ ! 55: Pixmap backmap, bdrmap; /* background and border pixmaps */ ! 56: Vertex box[VCOUNT]; /* vertex list for box */ ! 57: int x1, y1; /* location of mouse */ ! 58: int x2, y2; /* other corner of box */ ! 59: Window subw; /* subwindow it is in */ ! 60: int mindim; /* minimum dimension */ ! 61: int width, height; /* width and height of box */ ! 62: int left, stop; ! 63: int mouse; ! 64: int force; /* force default window to track */ ! 65: int xa, ya, xb, yb; ! 66: int doit; ! 67: XButtonEvent event; /* someplace to put the event */ ! 68: register int i; /* ye olde indexe variabel */ ! 69: int fx, fy, fw, fh; /* frame from parse... */ ! 70: int pr; /* parse geometry result */ ! 71: int change_cursor = FALSE; ! 72: int current_cursor = CURSOR_UL; ! 73: ! 74: int HereButton = LeftButton; /* make window at locator */ ! 75: int ResizeButton = MiddleButton;/* make window of specified size */ ! 76: int DefaultButton = RightButton;/* make window at default location */ ! 77: ! 78: pr = XGeometry (geometry, def, frame->bdrwidth, 1, 1, 0, 0, ! 79: &fx, &fy, &fw, &fh); ! 80: /* ! 81: * none of this nonsense would be necessary if I hadn't blown ! 82: * the frame structure definition. ! 83: */ ! 84: frame->x = fx; ! 85: frame->y = fy; ! 86: frame->width = fw; ! 87: frame->height = fh; ! 88: if (geometry != NULL) { ! 89: /* ! 90: * if x or y offsets are specified, then we should autoplace ! 91: */ ! 92: if ( (pr & XValue ) || (pr & YValue) ) { ! 93: if (frame->width < minwidth) frame->width = minwidth; ! 94: if (frame->height < minheight) frame->height = minheight; ! 95: goto makeit; ! 96: } ! 97: } ! 98: ! 99: if ((opt = XGetDefault(name, "MakeWindow.BodyFont")) != NULL) fn = opt; ! 100: ! 101: if ((pfninfo = XOpenFont(fn)) == NULL) { ! 102: fprintf(stderr, "Can't open font %s!\n", fn); ! 103: return(0); ! 104: } ! 105: ! 106: pfore = mback = WhitePixel; ! 107: pback = bpix = mfore = BlackPixel; ! 108: if ((opt = XGetDefault(name, "MakeWindow.ReverseVideo")) != NULL) ! 109: if (strcmp (opt, "on") == 0) { ! 110: pfore = BlackPixel; ! 111: pback = WhitePixel; ! 112: } ! 113: ! 114: if ((opt = XGetDefault(name, "MakeWindow.BorderWidth")) != NULL) ! 115: pbw = atoi (opt); ! 116: ! 117: if ((opt = XGetDefault(name, "MakeWindow.InternalBorder")) != NULL) ! 118: ibw = atoi (opt); ! 119: ! 120: if ((opt = XGetDefault(name, "MakeWindow.Freeze")) != NULL) ! 121: if (strcmp (opt, "on") == 0) freeze = 1; ! 122: ! 123: if (DisplayPlanes() > 2) { /* on color display, do color stuff */ ! 124: ! 125: if ((opt = XGetDefault(name,"MakeWindow.Foreground")) != NULL) ! 126: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef)) ! 127: pfore = cdef.pixel; ! 128: ! 129: if ((opt = XGetDefault(name,"MakeWindow.Background")) != NULL) ! 130: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef)) ! 131: pback = cdef.pixel; ! 132: ! 133: if ((opt = XGetDefault(name,"MakeWindow.Border")) != NULL) ! 134: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef)) ! 135: bpix = cdef.pixel; ! 136: ! 137: if ((opt = XGetDefault(name,"MakeWindow.Mouse")) != NULL) ! 138: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef)) ! 139: mfore = cdef.pixel; ! 140: ! 141: if ((opt = XGetDefault(name,"MakeWindow.MouseMask")) != NULL) ! 142: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef)) ! 143: mback = cdef.pixel; ! 144: ! 145: } ! 146: ! 147: if ((opt = XGetDefault(name, "MakeWindow.Here")) != NULL) { ! 148: switch (*opt) { ! 149: case 'L': ! 150: case 'l': ! 151: HereButton = LeftButton; ! 152: break; ! 153: ! 154: case 'M': ! 155: case 'm': ! 156: HereButton = MiddleButton; ! 157: break; ! 158: ! 159: case 'R': ! 160: case 'r': ! 161: HereButton = RightButton; ! 162: break; ! 163: /* ! 164: * Should have a default case, to check for invalid ! 165: * specification, but what should be done in that case? ! 166: */ ! 167: } ! 168: } ! 169: ! 170: if ((opt = XGetDefault(name, "MakeWindow.Resize")) != NULL) { ! 171: switch (*opt) { ! 172: case 'L': ! 173: case 'l': ! 174: ResizeButton = LeftButton; ! 175: break; ! 176: ! 177: case 'M': ! 178: case 'm': ! 179: ResizeButton = MiddleButton; ! 180: break; ! 181: ! 182: case 'R': ! 183: case 'r': ! 184: ResizeButton = RightButton; ! 185: break; ! 186: /* ! 187: * Should have a default case, to check for invalid ! 188: * specification, but what should be done in that case? ! 189: */ ! 190: } ! 191: } ! 192: ! 193: if ((opt = XGetDefault(name, "MakeWindow.Default")) != NULL) { ! 194: switch (*opt) { ! 195: case 'L': ! 196: case 'l': ! 197: DefaultButton = LeftButton; ! 198: break; ! 199: ! 200: case 'M': ! 201: case 'm': ! 202: DefaultButton = MiddleButton; ! 203: break; ! 204: ! 205: case 'R': ! 206: case 'r': ! 207: DefaultButton = RightButton; ! 208: break; ! 209: /* ! 210: * Should have a default case, to check for invalid ! 211: * specification, but what should be done in that case? ! 212: */ ! 213: } ! 214: } ! 215: ! 216: /* ! 217: * Should verify that HereButton != ResizeButton != DefaultButton, ! 218: * but what should be done if that's false? ! 219: */ ! 220: ! 221: ur = XCreateCursor (ur_angle_width, ur_angle_height, ur_angle_bits, ! 222: ur_angle_mask_bits, ur_angle_x_hot, ur_angle_y_hot, ! 223: mfore, mback, GXcopy); ! 224: ul = XCreateCursor (ul_angle_width, ul_angle_height, ul_angle_bits, ! 225: ul_angle_mask_bits, ul_angle_x_hot, ul_angle_y_hot, ! 226: mfore, mback, GXcopy); ! 227: ll = XCreateCursor (ll_angle_width, ll_angle_height, ll_angle_bits, ! 228: ll_angle_mask_bits, ll_angle_x_hot, ll_angle_y_hot, ! 229: mfore, mback, GXcopy); ! 230: lr = XCreateCursor (lr_angle_width, lr_angle_height, lr_angle_bits, ! 231: lr_angle_mask_bits, lr_angle_x_hot, lr_angle_y_hot, ! 232: mfore, mback, GXcopy); ! 233: ! 234: events = ButtonPressed | ButtonReleased; ! 235: ! 236: if (freeze) events |= MouseMoved; ! 237: ! 238: /* ! 239: * go get the mouse as soon as you can ! 240: */ ! 241: ! 242: while (1) { ! 243: if (XGrabMouse ( RootWindow, ul, events ) != 0) break; ! 244: sleep (1); ! 245: } ! 246: popw = XStringWidth (prompt, pfninfo, 0, 0) + 2 * ibw; ! 247: poph = pfninfo->height + 2 * ibw; ! 248: ! 249: if (freeze) { ! 250: XGrabServer(); ! 251: count = FCOUNT; ! 252: save = XPixmapSave (RootWindow, 0, 0, ! 253: popw + 2 * pbw, poph +2 * pbw); ! 254: } ! 255: ! 256: backmap = XMakeTile (pback); ! 257: bdrmap = XMakeTile (bpix); ! 258: ! 259: pop = XCreateWindow (RootWindow, ! 260: 0, 0, popw, poph, pbw, bdrmap, backmap); ! 261: XMapWindow( pop); ! 262: XText (pop, ibw, ibw, prompt, strlen(prompt), ! 263: pfninfo->id, pfore, pback); ! 264: ! 265: XQueryMouse (RootWindow, &x1, &y1, &subw); ! 266: ! 267: mindim = 2 * frame->bdrwidth - 1; ! 268: minwidth = minwidth + mindim; ! 269: minheight = minheight + mindim; ! 270: ! 271: x2 = x1 + minwidth; ! 272: y2 = y1 + minheight; ! 273: ! 274: width = minwidth; ! 275: height = minheight; ! 276: ! 277: left = TRUE; ! 278: force = FALSE; ! 279: stop = FALSE; ! 280: mouse = TRUE; ! 281: ! 282: xa = ya = xb = yb = -1; ! 283: ! 284: doit = TRUE; ! 285: ! 286: while (stop == FALSE) { ! 287: if ( (xb != max (x1, x2)) || (yb != max(y1, y2)) ! 288: ||(xa != min (x1, x2)) || (ya != min(y1, y2))) { ! 289: if (freeze && (doit == FALSE)) { ! 290: XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1); ! 291: } ! 292: xa = min (x1, x2); ! 293: ya = min (y1, y2); ! 294: xb = max (x1, x2); ! 295: yb = max (y1, y2); ! 296: for ( i = 0; i < count; i += 4) { ! 297: box[i].x = xa; box[i].y = ya; box[i].flags = 0; ! 298: if (i+1 == count) break; ! 299: box[i+1].x = xb; box[i+1].y = ya, box[i+1].flags = 0; ! 300: box[i+2].x = xb; box[i+2].y = yb, box[i+2].flags = 0; ! 301: box[i+3].x = xa; box[i+3].y = yb, box[i+3].flags = 0; ! 302: } ! 303: doit = TRUE; ! 304: } ! 305: if (doit) { ! 306: XDraw(RootWindow, box, count, 1, 1, 0, GXinvert, 1); ! 307: doit = !freeze; ! 308: } ! 309: if (freeze || XPending() ) { ! 310: register int button; ! 311: XNextEvent(&event); ! 312: button = event.detail & ValueMask; ! 313: if (mouse) { ! 314: x2 = event.x; ! 315: y2 = event.y; ! 316: } ! 317: if ( (left == TRUE) && ( event.type == ButtonPressed ) && ! 318: ( button == ResizeButton ) ) { ! 319: x1 = x2; ! 320: y1 = y2; ! 321: left = FALSE; ! 322: change_cursor = TRUE; ! 323: } ! 324: else if ( (left == FALSE) && (event.type == ButtonReleased) && ! 325: ( button == ResizeButton)) ! 326: stop = TRUE; ! 327: else if ( (left == TRUE) && (event.type == ButtonPressed) && ! 328: ( button == DefaultButton)) { ! 329: x1 = frame->x; ! 330: y1 = frame->y; ! 331: x2 = x1 + frame->width + mindim; ! 332: y2 = y1 + frame->height + mindim; ! 333: mouse = FALSE; ! 334: left = FALSE; ! 335: } ! 336: else if ( (left == FALSE) && (event.type == ButtonReleased) && ! 337: ( button == DefaultButton)) { ! 338: x1 = frame->x; ! 339: y1 = frame->y; ! 340: x2 = x1 + frame->width + mindim; ! 341: y2 = y1 + frame->height + mindim; ! 342: stop = TRUE; ! 343: } ! 344: else if ( (left == TRUE) && (event.type == ButtonPressed) && ! 345: ( button == HereButton)) { ! 346: force = TRUE; ! 347: left = FALSE; ! 348: } ! 349: else if ( (left == FALSE) && (event.type == ButtonReleased) && ! 350: ( button == HereButton)) { ! 351: stop = TRUE; ! 352: } ! 353: else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw); ! 354: } ! 355: else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw); ! 356: if (change_cursor) { ! 357: if ((x2 >= x1) && (y2 >= y1) && ! 358: current_cursor != CURSOR_LR) { ! 359: XGrabMouse ( RootWindow, lr, events ); ! 360: current_cursor = CURSOR_LR; ! 361: } ! 362: else if ((x2 >= x1) && (y2 < y1) && ! 363: current_cursor != CURSOR_UR) { ! 364: XGrabMouse ( RootWindow, ur, events); ! 365: current_cursor = CURSOR_UR; ! 366: } ! 367: else if ((x2 < x1) && (y2 >= y1) && ! 368: current_cursor != CURSOR_LL) { ! 369: XGrabMouse ( RootWindow, ll, events); ! 370: current_cursor = CURSOR_LL; ! 371: } ! 372: else if ((x2 < x1) && (y2 < y1) && ! 373: (current_cursor != CURSOR_UL)) { ! 374: XGrabMouse ( RootWindow, ul, events); ! 375: current_cursor = CURSOR_UL; ! 376: } ! 377: } ! 378: if (force) { /* we force the default box */ ! 379: x1 = x2; ! 380: y1 = y2; ! 381: x2 = x1 + frame->width + mindim; ! 382: y2 = y1 + frame->height + mindim; ! 383: } ! 384: ! 385: if (left) { ! 386: x1 = x2; ! 387: y1 = y2; ! 388: } ! 389: width = max (abs (x2 - x1), minwidth); ! 390: ! 391: if (x2 < x1) x2 = x1 - width; ! 392: else x2 = x1 + width; ! 393: ! 394: height = max (abs (y2 - y1), minheight); ! 395: if (y2 < y1) y2 = y1 - height; ! 396: else y2 = y1 + height; ! 397: } ! 398: if (freeze) XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1); ! 399: XUngrabMouse(); ! 400: ! 401: if (save != 0) { ! 402: XUnmapTransparent (pop); ! 403: XPixmapPut (RootWindow, 0, 0, 0, 0, ! 404: popw + 2 * pbw, poph + 2 * pbw, ! 405: save, GXcopy, AllPlanes); ! 406: XFreePixmap (save); ! 407: } ! 408: XDestroyWindow (pop); ! 409: if (freeze) XUngrabServer(); ! 410: XCloseFont (pfninfo); ! 411: XFreeCursor (ur); ! 412: XFreeCursor (ul); ! 413: XFreeCursor (lr); ! 414: XFreeCursor (ll); ! 415: XFreePixmap (backmap); ! 416: XFreePixmap (bdrmap); ! 417: frame->x = min(x1, x2); ! 418: frame->y = min(y1, y2); ! 419: frame->width = width - mindim; ! 420: frame->height = height - mindim; ! 421: makeit: XCreateWindows(RootWindow, frame, 1); ! 422: /* store default name of the window and set the resize hint */ ! 423: XStoreName(frame->self, prompt); ! 424: XSetResizeHint(frame->self, minwidth, minheight, 1, 1); ! 425: XSync(1); /* get rid of any extraneous events */ ! 426: return (frame->self); ! 427: } ! 428:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.