Annotation of researchv9/X11/src/X.V11R1/clients/xterm/misc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.