|
|
1.1 ! root 1: /* ! 2: * $Source: /orpheus/u1/X11/clients/xterm/RCS/misc.c,v $ ! 3: * $Header: misc.c,v 1.29 87/09/10 18:09:03 swick Exp $ ! 4: */ ! 5: ! 6: ! 7: #include <X11/copyright.h> ! 8: ! 9: /* ! 10: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 11: * ! 12: * All Rights Reserved ! 13: * ! 14: * Permission to use, copy, modify, and distribute this software and its ! 15: * documentation for any purpose and without fee is hereby granted, ! 16: * provided that the above copyright notice appear in all copies and that ! 17: * both that copyright notice and this permission notice appear in ! 18: * supporting documentation, and that the name of Digital Equipment ! 19: * Corporation not be used in advertising or publicity pertaining to ! 20: * distribution of the software without specific, written prior permission. ! 21: * ! 22: * ! 23: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 24: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 25: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 26: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 27: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 28: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 29: * SOFTWARE. ! 30: */ ! 31: ! 32: #include <stdio.h> ! 33: #include <setjmp.h> ! 34: #include <signal.h> ! 35: #include <ctype.h> ! 36: #include <pwd.h> ! 37: #include <strings.h> ! 38: #include <sys/time.h> ! 39: #include <sys/file.h> ! 40: #include <X11/Xlib.h> ! 41: #include <X11/Xutil.h> ! 42: #include <X11/Xatom.h> ! 43: #include <X11/Xtlib.h> ! 44: #include "ptyx.h" ! 45: #include "data.h" ! 46: #include "error.h" ! 47: #include <X11/cursorfont.h> ! 48: #include "gray.ic" ! 49: #include "hilite.ic" ! 50: #include "wait.ic" ! 51: #include "waitmask.ic" ! 52: ! 53: extern char *malloc(); ! 54: extern char *mktemp(); ! 55: extern void exit(); ! 56: extern void perror(); ! 57: extern void abort(); ! 58: ! 59: #ifndef lint ! 60: static char rcs_id[] = "$Header: misc.c,v 1.29 87/09/10 18:09:03 swick Exp $"; ! 61: #endif lint ! 62: ! 63: xevents() ! 64: { ! 65: XEvent event; ! 66: register TScreen *screen = &term.screen; ! 67: XtEventReturnCode returnCode; ! 68: ! 69: if(screen->scroll_amt) ! 70: FlushScroll(screen); ! 71: XPending (screen->display); ! 72: do { ! 73: if (waitingForTrackInfo) ! 74: return; ! 75: XNextEvent (screen->display, &event); ! 76: returnCode = XtDispatchEvent(&event); ! 77: switch (returnCode) { ! 78: case XteventHandled : ! 79: break; ! 80: case XteventNotHandled : ! 81: /* ||| ! 82: fprintf(stderr, "Event %d not handled for window %d (subwindow %d)\n", ! 83: (int)event.type, (int)event.window, (int)event.subwindow); ! 84: */ ! 85: break; ! 86: case XteventNoHandler : ! 87: /* ||| ! 88: fprintf(stderr, "Event %d no entry for window %d (subwindow %d)\n", ! 89: (int)event.type, (int)event.window, (int)event.subwindow); ! 90: */ ! 91: break; ! 92: } ! 93: } while (QLength(screen->display) > 0); ! 94: } ! 95: ! 96: /*ARGSUSED*/ ! 97: XtEventReturnCode EventDoNothing(event, eventdata) ! 98: XEvent *event; ! 99: caddr_t eventdata; ! 100: { ! 101: return (XteventHandled); ! 102: } ! 103: ! 104: /*ARGSUSED*/ ! 105: XtEventReturnCode HandleKeyPressed(event, eventdata) ! 106: XEvent *event; ! 107: caddr_t eventdata; ! 108: { ! 109: Input (&term.keyboard, &term.screen, (XKeyPressedEvent *)event); ! 110: return (XteventHandled); ! 111: } ! 112: /*ARGSUSED*/ ! 113: XtEventReturnCode HandleEnterWindow(event, eventdata) ! 114: register XEnterWindowEvent *event; ! 115: caddr_t eventdata; ! 116: { ! 117: register TScreen *screen = &term.screen; ! 118: ! 119: if (((event->detail) != NotifyInferior) ! 120: && event->mode == NotifyNormal ! 121: && event->focus) { ! 122: #ifdef DEBUG ! 123: if(debug) ! 124: fprintf(stderr, "EnterWindow %s\n", window == ! 125: VWindow(screen) ? "VT" : "Tek"); ! 126: #endif DEBUG ! 127: selectwindow(screen, INWINDOW); ! 128: } ! 129: return (XteventHandled); ! 130: } ! 131: ! 132: /*ARGSUSED*/ ! 133: XtEventReturnCode HandleLeaveWindow(event, eventdata) ! 134: register XEnterWindowEvent *event; ! 135: caddr_t eventdata; ! 136: { ! 137: register TScreen *screen = &term.screen; ! 138: ! 139: if (((event->detail) != NotifyInferior) ! 140: && event->mode == NotifyNormal ! 141: && event->focus) { ! 142: #ifdef DEBUG ! 143: if(debug) ! 144: fprintf(stderr, "LeaveWindow %s\n", window == ! 145: VWindow(screen) ? "VT" : "Tek"); ! 146: #endif DEBUG ! 147: unselectwindow(screen, INWINDOW); ! 148: } ! 149: return (XteventHandled); ! 150: } ! 151: ! 152: ! 153: /*ARGSUSED*/ ! 154: XtEventReturnCode HandleFocusChange(event, eventdata) ! 155: register XFocusChangeEvent *event; ! 156: caddr_t eventdata; ! 157: { ! 158: register TScreen *screen = &term.screen; ! 159: ! 160: if(event->type == FocusIn) ! 161: selectwindow(screen, FOCUS); ! 162: else ! 163: unselectwindow(screen, FOCUS); ! 164: return (XteventHandled); ! 165: } ! 166: ! 167: ! 168: ! 169: selectwindow(screen, flag) ! 170: register TScreen *screen; ! 171: register int flag; ! 172: { ! 173: if(screen->TekEmu) { ! 174: TekSelect(); ! 175: if(!Ttoggled) ! 176: TCursorToggle(TOGGLE); ! 177: if(screen->cellsused) { ! 178: screen->colorcells[2].pixel = ! 179: screen->Tcursorcolor; ! 180: XStoreColor(screen->display, ! 181: DefaultColormap(screen->display, ! 182: DefaultScreen(screen->display)), ! 183: &screen->colorcells[2]); ! 184: } ! 185: screen->select |= flag; ! 186: if(!Ttoggled) ! 187: TCursorToggle(TOGGLE); ! 188: return; ! 189: } else { ! 190: VTSelect(); ! 191: if(screen->cursor_state && ! 192: (screen->cursor_col != screen->cur_col || ! 193: screen->cursor_row != screen->cur_row)) ! 194: HideCursor(); ! 195: screen->select |= flag; ! 196: if(screen->cursor_state) ! 197: ShowCursor(); ! 198: return; ! 199: } ! 200: } ! 201: ! 202: unselectwindow(screen, flag) ! 203: register TScreen *screen; ! 204: register int flag; ! 205: { ! 206: register int i; ! 207: ! 208: screen->select &= ~flag; ! 209: if(!(screen->select)) { ! 210: if(screen->TekEmu) { ! 211: TekUnselect(); ! 212: if(!Ttoggled) ! 213: TCursorToggle(TOGGLE); ! 214: if(screen->cellsused) { ! 215: i = (term.flags & REVERSE_VIDEO) == 0; ! 216: screen->colorcells[i].pixel = ! 217: screen->Tcursorcolor; ! 218: XStoreColor(screen->display, ! 219: DefaultColormap(screen->display, ! 220: DefaultScreen(screen->display)), ! 221: &screen->colorcells[i]); ! 222: } ! 223: if(!Ttoggled) ! 224: TCursorToggle(TOGGLE); ! 225: } else { ! 226: VTUnselect(); ! 227: if(screen->cursor_state && ! 228: (screen->cursor_col != screen->cur_col || ! 229: screen->cursor_row != screen->cur_row)) ! 230: HideCursor(); ! 231: if(screen->cursor_state) ! 232: ShowCursor(); ! 233: } ! 234: } ! 235: } ! 236: ! 237: reselectwindow(screen) ! 238: register TScreen *screen; ! 239: { ! 240: Window root, win; ! 241: int rootx, rooty, x, y; ! 242: unsigned int mask; ! 243: ! 244: if(XQueryPointer( ! 245: screen->display, ! 246: DefaultRootWindow(screen->display), ! 247: &root, &win, ! 248: &rootx, &rooty, ! 249: &x, &y, ! 250: &mask)) { ! 251: if(win && (win == VWindow(screen) || win == TWindow(screen))) ! 252: selectwindow(screen, INWINDOW); ! 253: else unselectwindow(screen, INWINDOW); ! 254: } ! 255: } ! 256: ! 257: Pixmap Make_tile(width, height, bits, foreground, background, depth) ! 258: unsigned int width, height, depth; ! 259: Pixel foreground, background; ! 260: char *bits; ! 261: { ! 262: register GC gc; ! 263: register Pixmap pix; ! 264: register TScreen *screen = &term.screen; ! 265: XGCValues gcVals; ! 266: XImage tileimage; ! 267: GC XtGetGC(); ! 268: ! 269: pix = (Pixmap)XCreatePixmap(screen->display, ! 270: DefaultRootWindow(screen->display), width, height, depth); ! 271: gcVals.foreground = foreground; ! 272: gcVals.background = background; ! 273: gc = XCreateGC(screen->display, (Drawable) pix, ! 274: GCForeground+GCBackground, &gcVals); ! 275: tileimage.height = height; ! 276: tileimage.width = width; ! 277: tileimage.xoffset = 0; ! 278: tileimage.format = XYBitmap; ! 279: tileimage.data = bits; ! 280: tileimage.byte_order = LSBFirst; ! 281: tileimage.bitmap_unit = 8; ! 282: tileimage.bitmap_bit_order = LSBFirst; ! 283: tileimage.bitmap_pad = 8; ! 284: tileimage.bytes_per_line = (width+7)>>3; ! 285: tileimage.depth = 1; ! 286: XPutImage(screen->display, pix, gc, &tileimage, 0, 0, 0, 0, width, height); ! 287: /* done with gc */ ! 288: return(pix); ! 289: } ! 290: ! 291: ! 292: Pixmap make_gray(fg, bg, depth) ! 293: Pixel fg, bg; ! 294: { ! 295: return(Make_tile(gray_width, gray_height, gray_bits, fg, bg, depth)); ! 296: } ! 297: ! 298: /* ARGSUSED */ ! 299: Cursor make_tcross(fg, bg) ! 300: Pixel fg, bg; ! 301: { ! 302: register TScreen *screen = &term.screen; ! 303: Cursor c; ! 304: ! 305: c = XCreateFontCursor(screen->display, XC_tcross); ! 306: /* ! 307: XRecolorCursor(screen->display, c, PixelToColor(fg), PixelToColor(bg)); ! 308: */ ! 309: return(c); ! 310: } ! 311: ! 312: /* ARGSUSED */ ! 313: Cursor make_xterm(fg, bg) ! 314: unsigned long fg, bg; ! 315: { ! 316: register TScreen *screen = &term.screen; ! 317: Cursor c; ! 318: ! 319: c = XCreateFontCursor(screen->display, XC_xterm); ! 320: /* ! 321: XRecolorCursor(screen->display, c, PixelToColor(fg), PixelToColor(bg)); ! 322: */ ! 323: return(c); ! 324: } ! 325: ! 326: static XColor foreground = { 0L, 65535, 65535, 65535 }; ! 327: static XColor background = { 0L, 0, 0, 0 }; ! 328: ! 329: Cursor make_wait(fg, bg) ! 330: Pixel fg, bg; ! 331: { ! 332: register TScreen *screen = &term.screen; ! 333: Pixmap source, mask; ! 334: ! 335: source = Make_tile(wait_width, wait_height, wait_bits, fg, bg, 1); ! 336: mask = Make_tile(waitmask_width, waitmask_height, waitmask_bits, ! 337: fg, bg, 1); ! 338: /* ! 339: return(XCreatePixmapCursor(screen->display, source, mask, PixelToColor(fg), ! 340: PixelToColor(bg), wait_x_hot, wait_y_hot)); ! 341: */ ! 342: return(XCreatePixmapCursor(screen->display, source, mask, ! 343: &foreground, &background, wait_x_hot, wait_y_hot)); ! 344: } ! 345: ! 346: /* ARGSUSED */ ! 347: Cursor make_arrow(fg, bg) ! 348: unsigned long fg, bg; ! 349: ! 350: { ! 351: register TScreen *screen = &term.screen; ! 352: Cursor c; ! 353: ! 354: c = XCreateFontCursor(screen->display, XC_left_ptr); ! 355: /* ! 356: XRecolorCursor(screen->display, c, PixelToColor(fg), PixelToColor(bg)); ! 357: */ ! 358: return(c); ! 359: } ! 360: ! 361: char *uniquesuffix(name) ! 362: char *name; ! 363: { ! 364: register int *np, *fp, i; ! 365: register Window *cp; ! 366: register int temp, j, k, exact, *number; ! 367: char *wname; ! 368: Window *children, parent, root; ! 369: unsigned int nchildren; ! 370: static char *suffix, sufbuf[10]; ! 371: TScreen *screen = &term.screen; ! 372: char *malloc(); ! 373: ! 374: if(suffix) ! 375: return(suffix); ! 376: suffix = sufbuf; ! 377: if(!XQueryTree( ! 378: screen->display, ! 379: DefaultRootWindow(screen->display), ! 380: &root, &parent, ! 381: &children, &nchildren) || ! 382: nchildren < 1 || (number = (int *)malloc((unsigned)nchildren * sizeof(int))) ! 383: == NULL) ! 384: return(suffix); ! 385: exact = FALSE; ! 386: i = strlen(name); ! 387: for(np = number, cp = children, j = nchildren ; j > 0 ; cp++, j--) { ! 388: if(!XFetchName(screen->display, *cp, &wname) || wname == NULL) ! 389: continue; ! 390: if(strncmp(name, wname, i) == 0) { ! 391: if(wname[i] == 0 || XStrCmp(&wname[i], " (Tek)") == 0) ! 392: exact = TRUE; ! 393: else if(strncmp(&wname[i], " #", 2) == 0) ! 394: *np++ = atoi(&wname[i + 2]); ! 395: } ! 396: free(wname); ! 397: } ! 398: free((char *)children); ! 399: if(exact) { ! 400: if(np <= number) ! 401: strcpy(suffix, " #2"); ! 402: else { ! 403: exact = np - number; ! 404: np = number; ! 405: /* shell sort */ ! 406: for(i = exact / 2 ; i > 0 ; i /= 2) ! 407: for(k = i ; k < exact ; k++) ! 408: for(j = k - i ; j >= 0 && ! 409: np[j] > np[j + i] ; j -= i) { ! 410: temp = np[j]; ! 411: np[j] = np[j + i]; ! 412: np[j + i] = temp; ! 413: } ! 414: /* make numbers unique */ ! 415: for(fp = np + 1, i = exact - 1 ; i > 0 ; fp++, i--) ! 416: if(*fp != *np) ! 417: *++np = *fp; ! 418: /* find least unique number */ ! 419: for(i = 2, fp = number ; fp <= np ; fp++) { ! 420: if(i < *fp) ! 421: break; ! 422: if(i == *fp) ! 423: i++; ! 424: } ! 425: sprintf(suffix, " #%d", i); ! 426: } ! 427: } ! 428: free((char *)number); ! 429: return(suffix); ! 430: } ! 431: ! 432: Bell() ! 433: { ! 434: extern Terminal term; ! 435: register TScreen *screen = &term.screen; ! 436: register Pixel xorPixel = screen->foreground ^ screen->background; ! 437: XGCValues gcval; ! 438: GC visualGC; ! 439: ! 440: if(screen->visualbell) { ! 441: gcval.function = GXxor; ! 442: gcval.foreground = xorPixel; ! 443: visualGC = XtGetGC(screen->display, (XContext)NULL, ! 444: DefaultRootWindow(screen->display), ! 445: GCFunction+GCForeground, &gcval); ! 446: if(screen->TekEmu) { ! 447: XFillRectangle( ! 448: screen->display, ! 449: TWindow(screen), ! 450: visualGC, ! 451: 0, 0, ! 452: (unsigned) TFullWidth(screen), ! 453: (unsigned) TFullHeight(screen)); ! 454: XFlush(screen->display); ! 455: XFillRectangle( ! 456: screen->display, ! 457: TWindow(screen), ! 458: visualGC, ! 459: 0, 0, ! 460: (unsigned) TFullWidth(screen), ! 461: (unsigned) TFullHeight(screen)); ! 462: } else { ! 463: XFillRectangle( ! 464: screen->display, ! 465: VWindow(screen), ! 466: visualGC, ! 467: 0, 0, ! 468: (unsigned) FullWidth(screen), ! 469: (unsigned) FullHeight(screen)); ! 470: XFlush(screen->display); ! 471: XFillRectangle( ! 472: screen->display, ! 473: VWindow(screen), ! 474: visualGC, ! 475: 0, 0, ! 476: (unsigned) FullWidth(screen), ! 477: (unsigned) FullHeight(screen)); ! 478: } ! 479: } else ! 480: XBell(screen->display, 0); ! 481: } ! 482: ! 483: Redraw() ! 484: { ! 485: extern Terminal term; ! 486: register TScreen *screen = &term.screen; ! 487: XExposeEvent event; ! 488: ! 489: event.type = Expose; ! 490: event.display = screen->display; ! 491: event.x = 0; ! 492: event.y = 0; ! 493: event.width = DisplayWidth( ! 494: screen->display, DefaultScreen(screen->display)); ! 495: event.height =DisplayHeight( ! 496: screen->display, DefaultScreen(screen->display)); ! 497: event.count = 0; ! 498: ! 499: if(VWindow(screen)) { ! 500: extern XtEventReturnCode VTExpose(); ! 501: ! 502: event.window = VWindow(screen); ! 503: (void) VTExpose(&event, (caddr_t)NULL); ! 504: if(screen->scrollbar) { ! 505: RedrawScrollBar(screen->scrollWindow); ! 506: } ! 507: } ! 508: if(TWindow(screen) && screen->Tshow) { ! 509: event.window = TWindow(screen); ! 510: TekExpose(&event); ! 511: } ! 512: } ! 513: ! 514: SyncUnmap(win, mask) ! 515: register Window win; ! 516: register long int mask; ! 517: { ! 518: XEvent ev; ! 519: register XEvent *rep = &ev; ! 520: register TScreen *screen = &term.screen; ! 521: ! 522: do { /* ignore events through unmap */ ! 523: XWindowEvent(screen->display, win, mask, rep); ! 524: } while(rep->type != UnmapNotify); ! 525: } ! 526: ! 527: StartLog(screen) ! 528: register TScreen *screen; ! 529: { ! 530: register char *cp; ! 531: register int i; ! 532: static char *log_default; ! 533: char *malloc(), *rindex(); ! 534: extern logpipe(); ! 535: ! 536: if(screen->logging || (screen->inhibit & I_LOG)) ! 537: return; ! 538: if(screen->logfile == NULL || *screen->logfile == 0) { ! 539: if(screen->logfile) ! 540: free(screen->logfile); ! 541: if(log_default == NULL) ! 542: mktemp(log_default = log_def_name); ! 543: if((screen->logfile = malloc((unsigned)strlen(log_default) + 1)) == NULL) ! 544: return; ! 545: strcpy(screen->logfile, log_default); ! 546: } ! 547: if(*screen->logfile == '|') { /* exec command */ ! 548: int p[2]; ! 549: static char *shell; ! 550: ! 551: if(pipe(p) < 0 || (i = fork()) < 0) ! 552: return; ! 553: if(i == 0) { /* child */ ! 554: close(p[1]); ! 555: dup2(p[0], 0); ! 556: close(p[0]); ! 557: dup2(fileno(stderr), 1); ! 558: dup2(fileno(stderr), 2); ! 559: close(fileno(stderr)); ! 560: fileno(stderr) = 2; ! 561: close(screen->display->fd); ! 562: close(screen->respond); ! 563: if(!shell) { ! 564: register struct passwd *pw; ! 565: char *getenv(), *malloc(); ! 566: struct passwd *getpwuid(); ! 567: ! 568: if(((cp = getenv("SHELL")) == NULL || *cp == 0) ! 569: && ((pw = getpwuid(screen->uid)) == NULL || ! 570: *(cp = pw->pw_shell) == 0) || ! 571: (shell = malloc((unsigned) strlen(cp) + 1)) == NULL) ! 572: shell = "/bin/sh"; ! 573: else ! 574: strcpy(shell, cp); ! 575: } ! 576: signal(SIGHUP, SIG_DFL); ! 577: signal(SIGCHLD, SIG_DFL); ! 578: setgid(screen->gid); ! 579: setuid(screen->uid); ! 580: execl(shell, shell, "-c", &screen->logfile[1], 0); ! 581: fprintf(stderr, "%s: Can't exec `%s'\n", xterm_name, ! 582: &screen->logfile[1]); ! 583: exit(ERROR_LOGEXEC); ! 584: } ! 585: close(p[0]); ! 586: screen->logfd = p[1]; ! 587: signal(SIGPIPE, logpipe); ! 588: } else { ! 589: if(access(screen->logfile, F_OK) == 0) { ! 590: if(access(screen->logfile, W_OK) < 0) ! 591: return; ! 592: } else if(cp = rindex(screen->logfile, '/')) { ! 593: *cp = 0; ! 594: i = access(screen->logfile, W_OK); ! 595: *cp = '/'; ! 596: if(i < 0) ! 597: return; ! 598: } else if(access(".", W_OK) < 0) ! 599: return; ! 600: if((screen->logfd = open(screen->logfile, O_WRONLY | O_APPEND | ! 601: O_CREAT, 0644)) < 0) ! 602: return; ! 603: chown(screen->logfile, screen->uid, screen->gid); ! 604: ! 605: } ! 606: screen->logstart = screen->TekEmu ? Tbptr : bptr; ! 607: screen->logging = TRUE; ! 608: } ! 609: ! 610: CloseLog(screen) ! 611: register TScreen *screen; ! 612: { ! 613: if(!screen->logging || (screen->inhibit & I_LOG)) ! 614: return; ! 615: FlushLog(screen); ! 616: close(screen->logfd); ! 617: screen->logging = FALSE; ! 618: } ! 619: ! 620: FlushLog(screen) ! 621: register TScreen *screen; ! 622: { ! 623: register char *cp; ! 624: register int i; ! 625: ! 626: cp = screen->TekEmu ? Tbptr : bptr; ! 627: if((i = cp - screen->logstart) > 0) ! 628: write(screen->logfd, screen->logstart, i); ! 629: screen->logstart = screen->TekEmu ? Tbuffer : buffer; ! 630: } ! 631: ! 632: logpipe() ! 633: { ! 634: register TScreen *screen = &term.screen; ! 635: ! 636: if(screen->logging) ! 637: CloseLog(screen); ! 638: } ! 639: ! 640: ! 641: do_osc(func) ! 642: int (*func)(); ! 643: { ! 644: register TScreen *screen = &term.screen; ! 645: register int mode, c; ! 646: register char *cp; ! 647: char buf[512]; ! 648: extern char *malloc(); ! 649: ! 650: mode = 0; ! 651: while(isdigit(c = (*func)())) ! 652: mode = 10 * mode + (c - '0'); ! 653: cp = buf; ! 654: while(isprint(c = (*func)())) ! 655: *cp++ = c; ! 656: *cp = 0; ! 657: switch(mode) { ! 658: case 0: /* new icon name and title*/ ! 659: Changename(buf); ! 660: Changetitle(buf); ! 661: break; ! 662: ! 663: case 1: /* new icon name only */ ! 664: Changename(buf); ! 665: break; ! 666: ! 667: case 2: /* new title only */ ! 668: Changetitle(buf); ! 669: break; ! 670: ! 671: ! 672: case 46: /* new log file */ ! 673: if((cp = malloc((unsigned)strlen(buf) + 1)) == NULL) ! 674: break; ! 675: strcpy(cp, buf); ! 676: if(screen->logfile) ! 677: free(screen->logfile); ! 678: screen->logfile = cp; ! 679: break; ! 680: } ! 681: } ! 682: ! 683: Changename(name) ! 684: register char *name; ! 685: { ! 686: register TScreen *screen = &term.screen; ! 687: ! 688: free(screen->iconname); ! 689: if((screen->iconname = ! 690: malloc((unsigned)(screen->iconnamelen = strlen(name)) + 1)) == NULL) ! 691: Error(ERROR_CNMALLOC1); ! 692: strcpy(screen->iconname, name); ! 693: if(screen->fullVwin.window) { ! 694: XChangeProperty( ! 695: screen->display, ! 696: VWindow(screen), ! 697: XA_WM_ICON_NAME, XA_STRING, ! 698: 8, PropModeReplace, ! 699: (unsigned char *)name, screen->iconnamelen); ! 700: } ! 701: if(screen->fullTwin.window) { ! 702: free(screen->Ticonname); ! 703: if((screen->Ticonname = malloc((unsigned)(screen->Ticonnamelen = ! 704: screen->iconnamelen + 6) + 1)) == NULL) ! 705: Error(ERROR_CNMALLOC2); ! 706: strcpy(screen->Ticonname, name); ! 707: strcat(screen->Ticonname, " (Tek)"); ! 708: XChangeProperty( ! 709: screen->display, ! 710: VWindow(screen), ! 711: XA_WM_ICON_NAME, XA_STRING, 8, PropModeReplace, ! 712: (unsigned char *)screen->Ticonname, screen->Ticonnamelen); ! 713: } ! 714: } ! 715: ! 716: Changetitle(name) ! 717: register char *name; ! 718: { ! 719: register TScreen *screen = &term.screen; ! 720: ! 721: free(screen->titlename); ! 722: if((screen->titlename = ! 723: malloc((unsigned)(screen->titlenamelen = strlen(name)) + 1)) == NULL) ! 724: Error(ERROR_CNMALLOC1); ! 725: strcpy(screen->titlename, name); ! 726: if(screen->fullVwin.window) { ! 727: XStoreName(screen->display, VWindow(screen), name); ! 728: } ! 729: if(screen->fullTwin.window) { ! 730: free(screen->Ttitlename); ! 731: if((screen->Ttitlename = malloc((unsigned)(screen->Ttitlenamelen = ! 732: screen->titlenamelen + 6) + 1)) == NULL) ! 733: Error(ERROR_CNMALLOC2); ! 734: strcpy(screen->Ttitlename, name); ! 735: strcat(screen->Ttitlename, " (Tek)"); ! 736: XStoreName(screen->display, TWindow(screen), screen->Ttitlename); ! 737: } ! 738: } ! 739: ! 740: #ifndef DEBUG ! 741: /* ARGSUSED */ ! 742: #endif ! 743: Panic(s, a) ! 744: char *s; ! 745: int a; ! 746: { ! 747: #ifdef DEBUG ! 748: if(debug) { ! 749: fprintf(stderr, "%s: PANIC! ", xterm_name); ! 750: fprintf(stderr, s, a); ! 751: fputs("\r\n", stderr); ! 752: fflush(stderr); ! 753: } ! 754: #endif DEBUG ! 755: } ! 756: ! 757: SysError (i) ! 758: int i; ! 759: { ! 760: fprintf (stderr, "%s: Error %d, errno %d:\n", xterm_name, i, errno); ! 761: perror (""); ! 762: Cleanup(i); ! 763: } ! 764: ! 765: Error (i) ! 766: int i; ! 767: { ! 768: fprintf (stderr, "%s: Error %d\n", xterm_name, i); ! 769: Cleanup(i); ! 770: } ! 771: ! 772: /* ! 773: * cleanup by sending SIGHUP to client processes ! 774: */ ! 775: Cleanup (code) ! 776: int code; ! 777: { ! 778: #ifdef notdef ! 779: extern Terminal term; ! 780: register TScreen *screen; ! 781: ! 782: screen = &term.screen; ! 783: if (screen->pid > 1) ! 784: killpg(getpgrp(screen->pid), SIGHUP); ! 785: #endif ! 786: Exit (code); ! 787: } ! 788: ! 789: /* ! 790: * sets the value of var to be arg in the Unix 4.2 BSD environment env. ! 791: * Var should end with '=' (bindings are of the form "var=value"). ! 792: * This procedure assumes the memory for the first level of environ ! 793: * was allocated using calloc, with enough extra room at the end so not ! 794: * to have to do a realloc(). ! 795: */ ! 796: Setenv (var, value) ! 797: register char *var, *value; ! 798: { ! 799: extern char **environ; ! 800: register int index = 0; ! 801: register int len = strlen(var); ! 802: ! 803: while (environ [index] != NULL) { ! 804: if (strncmp (environ [index], var, len) == 0) { ! 805: /* found it */ ! 806: environ[index] = (char *)malloc ((unsigned)len + strlen (value) + 1); ! 807: strcpy (environ [index], var); ! 808: strcat (environ [index], value); ! 809: return; ! 810: } ! 811: index ++; ! 812: } ! 813: ! 814: #ifdef DEBUG ! 815: if (debug) fputs ("expanding env\n", stderr); ! 816: #endif DEBUG ! 817: ! 818: environ [index] = (char *) malloc ((unsigned)len + strlen (value) + 1); ! 819: (void) strcpy (environ [index], var); ! 820: strcat (environ [index], value); ! 821: environ [++index] = NULL; ! 822: } ! 823: ! 824: /* ! 825: * returns a pointer to the first occurrence of s2 in s1, ! 826: * or NULL if there are none. ! 827: */ ! 828: char *strindex (s1, s2) ! 829: register char *s1, *s2; ! 830: { ! 831: register char *s3; ! 832: char *index(); ! 833: ! 834: while ((s3=index(s1, *s2)) != NULL) { ! 835: if (strncmp(s3, s2, strlen(s2)) == 0) ! 836: return (s3); ! 837: s1 = ++s3; ! 838: } ! 839: return (NULL); ! 840: } ! 841: ! 842: /*ARGSUSED*/ ! 843: xerror(d, ev) ! 844: Display *d; ! 845: register XErrorEvent *ev; ! 846: { ! 847: char buffer[BUFSIZ]; ! 848: XGetErrorText(d, ev->error_code, buffer, BUFSIZ); ! 849: fprintf(stderr, "%s: %s\n", xterm_name, buffer); ! 850: fprintf(stderr, "Request code %d, minor code %d, serial #%ld, resource id %ld\n", ! 851: ev->request_code, ev->minor_code, ev->serial, (long)ev->resourceid); ! 852: _cleanup(); ! 853: abort(); ! 854: /* Exit(ERROR_XERROR); */ ! 855: } ! 856: ! 857: /*ARGSUSED*/ ! 858: xioerror(d) ! 859: Display *d; ! 860: { ! 861: perror(xterm_name); ! 862: Exit(ERROR_XIOERROR); ! 863: } ! 864: ! 865: XStrCmp(s1, s2) ! 866: char *s1, *s2; ! 867: { ! 868: if (s1 && s2) return(strcmp(s1, s2)); ! 869: if (s1 && *s1) return(1); ! 870: if (s2 && *s2) return(-1); ! 871: return(0); ! 872: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.