Annotation of 43BSDTahoe/new/X/xterm/misc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     $Source: /u1/X/xterm/RCS/misc.c,v $
        !             3:  *     $Header: misc.c,v 10.101 86/12/02 08:49:20 swick Exp $
        !             4:  */
        !             5: 
        !             6: #include <stdio.h>
        !             7: #include <setjmp.h>
        !             8: #include <signal.h>
        !             9: #include <ctype.h>
        !            10: #include <pwd.h>
        !            11: #include <sys/time.h>
        !            12: #include <sys/file.h>
        !            13: #include <X/Xlib.h>
        !            14: #include "scrollbar.h"
        !            15: #include "ptyx.h"
        !            16: #include "data.h"
        !            17: #include "error.h"
        !            18: #include "gray.ic"
        !            19: #include "hilite.ic"
        !            20: #include "icon.ic"
        !            21: #include "tek_icon.ic"
        !            22: #include "wait.ic"
        !            23: #include "waitmask.ic"
        !            24: #include "../cursors/left_ptr.cursor"
        !            25: #include "../cursors/left_ptr_mask.cursor"
        !            26: #include "../cursors/tcross.cursor"
        !            27: #include "../cursors/tcross_mask.cursor"
        !            28: #include "../cursors/xterm.cursor"
        !            29: #include "../cursors/xterm_mask.cursor"
        !            30: 
        !            31: #ifndef lint
        !            32: static char csrg_id[] = "@(#)misc.c    1.8\t(Berkeley/CSRG)\t9/18/87";
        !            33: static char sccs_id[] = "@(#)misc.c\tX10/6.6B\t1/9/87";
        !            34: #endif lint
        !            35: 
        !            36: xevents()
        !            37: {
        !            38:        XEvent reply;
        !            39:        register XEvent *rep = & reply;
        !            40:        register Screen *screen = &term.screen;
        !            41: 
        !            42:        if(screen->scroll_amt)
        !            43:                FlushScroll(screen);
        !            44:        XPending ();
        !            45:        do {
        !            46:                XNextEvent (&reply);
        !            47:                xeventpass(&reply);
        !            48:        } while (QLength() > 0);
        !            49: }
        !            50: 
        !            51: xeventpass(rep)
        !            52: register XEvent *rep;
        !            53: {
        !            54:        register Screen *screen = &term.screen;
        !            55:        register Window window = rep->window;
        !            56:        register Window w;
        !            57:        register int i;
        !            58: 
        !            59:        switch ((int)rep->type) {
        !            60:         case KeyPressed:
        !            61:                Input (&term.keyboard, &term.screen,
        !            62:                 (XKeyPressedEvent *)rep);
        !            63:                break;
        !            64: 
        !            65:         case ExposeWindow:
        !            66:                if(screen->sb && window == screen->sb->bar) {
        !            67: #ifdef DEBUG
        !            68:                        if(debug)
        !            69:                                fputs("ExposeWindow scrollbar\n", stderr);
        !            70: #endif DEBUG
        !            71:                        if(((XExposeEvent *)rep)->subwindow ==
        !            72:                         screen->sb->button) {
        !            73:                                screen->sb->buttonstate = -1;
        !            74:                                DrawButton(screen->sb);
        !            75:                        } else if(((XExposeEvent *)rep)->subwindow ==
        !            76:                         screen->sb->save) {
        !            77:                                screen->sb->savestate = -1;
        !            78:                                DrawSave(screen->sb);
        !            79:                        }
        !            80:                        break;
        !            81:                }
        !            82:                if (screen->active_icon) {
        !            83: #ifdef DEBUG
        !            84:                    fputs( "ExposeWindow icon\n", stderr );
        !            85: #endif DEBUG
        !            86:                    if (window == screen->iconVwin.window) {
        !            87:                        if (!screen->icon_show) {
        !            88:                            screen->mappedVwin = &screen->iconVwin;
        !            89:                            screen->icon_show = TRUE;
        !            90:                            screen->show = FALSE;
        !            91:                            screen->timer = 0;
        !            92:                            screen->holdoff = FALSE;
        !            93:                            if(screen->fullTwin.window)
        !            94:                                moveiconwindow( screen->fullTwin.window,
        !            95:                                                screen->fullVwin.window );
        !            96:                        }
        !            97:                        if (screen->TekEmu)
        !            98:                            VTUnselect();
        !            99:                        if (term.flags & ICONINPUT)
        !           100:                            reselectwindow(screen);
        !           101:                        else
        !           102:                            unselectwindow(screen, INWINDOW);
        !           103:                        screen->iconinput = FALSE;
        !           104:                        VTExpose(rep);
        !           105:                    } else if (window == screen->iconTwin.window) {
        !           106:                        if (!screen->icon_show) {
        !           107:                            screen->mappedTwin = &screen->iconTwin;
        !           108:                            screen->icon_show = TRUE;
        !           109:                            screen->Tshow = FALSE;
        !           110:                            screen->timer = 0;
        !           111:                            screen->holdoff = FALSE;
        !           112:                            if (screen->fullVwin.window)
        !           113:                                moveiconwindow( screen->fullVwin.window,
        !           114:                                                screen->fullTwin.window );
        !           115:                        }
        !           116:                        if (!screen->TekEmu)
        !           117:                            TekUnselect();
        !           118:                        if (term.flags & ICONINPUT)
        !           119:                            reselectwindow(screen);
        !           120:                        else
        !           121:                            unselectwindow(screen, INWINDOW);
        !           122:                        screen->iconinput = FALSE;
        !           123:                        TekExpose(rep);
        !           124:                        }
        !           125:                } else if (window == screen->iconVwin.window ||
        !           126:                           window == screen->iconTwin.window) {
        !           127: #ifdef DEBUG
        !           128:                        if(debug)
        !           129:                                fprintf(stderr, "ExposeWindow %s\n", window ==
        !           130:                                 screen->iconVwin.window ? "icon" : "Ticon");
        !           131: #endif DEBUG
        !           132:                        RefreshIcon(screen, window);
        !           133:                        break;
        !           134:                }
        !           135:                if(Titlebar(screen) || screen->icon_show) {
        !           136:                /* icon_show is a kludge as the titlebar exposure event
        !           137:                 * frequently arrives before the full window exposure event */
        !           138:                        if(window == screen->title.tbar) {
        !           139: #ifdef DEBUG
        !           140:                        if(debug)
        !           141:                                fputs("ExposeWindow title\n", stderr);
        !           142: #endif DEBUG
        !           143:                                VTTitleExpose((XExposeWindowEvent *)rep);
        !           144:                                break;
        !           145:                        } else if(window == screen->Ttitle.tbar) {
        !           146: #ifdef DEBUG
        !           147:                        if(debug)
        !           148:                                fputs("ExposeWindow Ttitle\n", stderr);
        !           149: #endif DEBUG
        !           150:                                TekTitleExpose((XExposeWindowEvent *)rep);
        !           151:                                break;
        !           152:                        }
        !           153:                }
        !           154:                if(window == screen->fullVwin.window) {
        !           155: #ifdef DEBUG
        !           156:                        if(debug)
        !           157:                                fputs("ExposeWindow VT\n", stderr);
        !           158: #endif DEBUG
        !           159:                        if(!screen->show) {
        !           160:                                screen->mappedVwin = &screen->fullVwin;
        !           161:                                if(screen->Ticonunmap) {
        !           162:                                        screen->Ticonunmap = FALSE;
        !           163:                                        XMapWindow( screen->fullTwin.window );
        !           164:                                        screen->Tshow = TRUE;
        !           165:                                        if(!screen->TekEmu) {
        !           166:                                            screen->holdoff = TRUE;
        !           167:                                            XUnmapTransparent(VWindow(screen));
        !           168:                                            XMapWindow(VWindow(screen));
        !           169:                                            break;
        !           170:                                        }
        !           171:                                } else {
        !           172:                                        screen->timer = 0;
        !           173:                                        screen->holdoff = FALSE;
        !           174:                                }
        !           175:                                screen->show = TRUE;
        !           176:                                reselectwindow(screen);
        !           177:                                if(screen->icon_show && screen->deiconwarp)
        !           178:                                    DeiconWarp(screen);
        !           179: 
        !           180:                                screen->icon_show = FALSE;
        !           181:                                screen->iconinput = FALSE;
        !           182:                        }
        !           183:                        VTExpose(rep);
        !           184:                } else if(window == screen->fullTwin.window) {
        !           185: #ifdef DEBUG
        !           186:                        if(debug)
        !           187:                                fputs("ExposeWindow Tek\n", stderr);
        !           188: #endif DEBUG
        !           189:                        if(!screen->Tshow) {
        !           190:                                screen->mappedTwin = &screen->fullTwin;
        !           191:                                if(screen->iconunmap) {
        !           192:                                        screen->iconunmap = FALSE;
        !           193:                                        XMapWindow( screen->fullVwin.window );
        !           194:                                        screen->show = TRUE;
        !           195:                                        if(screen->TekEmu) {
        !           196:                                            screen->holdoff = TRUE;
        !           197:                                            XUnmapTransparent(TWindow(screen));
        !           198:                                            XMapWindow(TWindow(screen));
        !           199:                                            break;
        !           200:                                        }
        !           201:                                } else {
        !           202:                                        screen->timer = 0;
        !           203:                                        screen->holdoff = FALSE;
        !           204:                                }
        !           205:                                screen->Tshow = TRUE;
        !           206:                                reselectwindow(screen);
        !           207:                                if(screen->icon_show && screen->deiconwarp)
        !           208:                                        DeiconWarp(screen);
        !           209:                                screen->icon_show = FALSE;
        !           210:                                screen->iconinput = FALSE;
        !           211:                        }
        !           212:                        TekExpose(rep);
        !           213:                }
        !           214:                break;
        !           215: 
        !           216:         case ExposeRegion:
        !           217:                if (!screen->active_icon && window == screen->iconVwin.window ||
        !           218:                           window == screen->iconTwin.window) {
        !           219: #ifdef DEBUG
        !           220:                        if(debug)
        !           221:                                fprintf(stderr, "ExposeRegion %s\n", window ==
        !           222:                                 screen->iconVwin.window ? "icon" : "Ticon");
        !           223: #endif DEBUG
        !           224:                        RefreshIcon(screen, window);
        !           225:                        break;
        !           226:                }
        !           227: #ifdef DEBUG
        !           228:                if(debug)
        !           229:                        fputs("ExposeRegion\n", stderr);
        !           230: #endif DEBUG
        !           231:                if (((XExposeWindowEvent *)rep)->detail == ExposeCopy &&
        !           232:                    screen->incopy <= 0) {
        !           233:                        screen->incopy = 1;
        !           234:                        if (screen->scrolls > 0)
        !           235:                                screen->scrolls--;
        !           236:                }
        !           237:                if (HandleExposure (screen, rep))
        !           238:                        screen->cursor_state = OFF;
        !           239:                break;
        !           240: 
        !           241:         case ExposeCopy:
        !           242: #ifdef DEBUG
        !           243:                        if(debug)
        !           244:                                fputs("ExposeCopy\n", stderr);
        !           245: #endif DEBUG
        !           246:                if (screen->incopy <= 0 && screen->scrolls > 0)
        !           247:                        screen->scrolls--;
        !           248:                if (screen->scrolls)
        !           249:                        screen->incopy = -1;
        !           250:                else
        !           251:                        screen->incopy = 0;
        !           252:                break;
        !           253: 
        !           254:         case ButtonPressed:
        !           255:                if (screen->incopy)
        !           256:                        CopyWait (screen);
        !           257:                if(window == screen->iconVwin.window) {
        !           258: #ifdef DEBUG
        !           259:                        if(debug)
        !           260:                                fputs("ButtonPressed icon\n", stderr);
        !           261: #endif DEBUG
        !           262:                        XUnmapWindow(window);
        !           263:                        if(screen->Ticonunmap && !screen->TekEmu) {
        !           264:                                screen->Ticonunmap = FALSE;
        !           265:                                XMapWindow(TWindow(screen));
        !           266:                                screen->Tshow = TRUE;
        !           267:                                screen->holdoff = TRUE;
        !           268:                        }
        !           269:                        XMapWindow(screen->fullVwin.window);
        !           270:                        break;
        !           271:                } else if(window == screen->iconTwin.window) {
        !           272: #ifdef DEBUG
        !           273:                        if(debug)
        !           274:                                fputs("ButtonPressed Ticon\n", stderr);
        !           275: #endif DEBUG
        !           276:                        XUnmapWindow(window);
        !           277:                        if(screen->iconunmap && screen->TekEmu) {
        !           278:                                screen->iconunmap = FALSE;
        !           279:                                XMapWindow(VWindow(screen));
        !           280:                                screen->show = TRUE;
        !           281:                                screen->holdoff = TRUE;
        !           282:                        }
        !           283:                        XMapWindow(screen->fullTwin.window);
        !           284:                        break;
        !           285:                }
        !           286:                /* drop through */
        !           287:         case ButtonReleased:
        !           288: #ifdef DEBUG
        !           289:                        if(debug)
        !           290:                                fputs("ButtonPressed or ButtonReleased\n",
        !           291:                                 stderr);
        !           292: #endif DEBUG
        !           293:                HandleButtons(&term, rep, screen->respond);
        !           294:                break;
        !           295: 
        !           296:         case UnmapWindow:              /* full windows */
        !           297:                if (window == screen->fullVwin.window) {
        !           298: #ifdef DEBUG
        !           299:                        if(debug)
        !           300:                                fputs("UnmapWindow VT\n", stderr);
        !           301: #endif DEBUG
        !           302:                        if (screen->fullVwin.titlebar)
        !           303:                                VTTitleUnhilite();
        !           304:                        screen->show = FALSE;
        !           305:                        if(screen->Tshow) {
        !           306:                                screen->Ticonunmap = TRUE;
        !           307:                                screen->Tshow = FALSE;
        !           308:                                XUnmapWindow( screen->fullTwin.window );
        !           309:                                SyncUnmap( screen->fullTwin.window,
        !           310:                                           TWINDOWEVENTS );
        !           311:                        }
        !           312:                } else if(window == screen->fullTwin.window) {
        !           313: #ifdef DEBUG
        !           314:                        if(debug)
        !           315:                                fputs("UnmapWindow Tek\n", stderr);
        !           316: #endif DEBUG
        !           317:                        if (screen->fullTwin.titlebar)
        !           318:                                TekTitleUnhilite();
        !           319:                        screen->Tshow = FALSE;
        !           320:                        if(screen->show) {
        !           321:                                screen->iconunmap = TRUE;
        !           322:                                screen->show = FALSE;
        !           323:                                XUnmapWindow( screen->fullVwin.window );
        !           324:                                SyncUnmap( screen->fullVwin.window,
        !           325:                                           WINDOWEVENTS );
        !           326:                        }
        !           327:                }
        !           328:                reselectwindow(screen);
        !           329:                screen->timer = 0;
        !           330:                break;
        !           331:         case EnterWindow:
        !           332:                if(screen->sb) {
        !           333:                        if(window == screen->sb->button) {
        !           334:                                if((i = GetButtonState(screen->sb)) !=
        !           335:                                 BUTTON_NORMAL)
        !           336:                                        SetButtonState(screen->sb, i | HILITED);
        !           337:                                break;
        !           338:                        } else if(window == screen->sb->bar)
        !           339:                                break;
        !           340:                }
        !           341:                if((window == VWindow(screen) || window == TWindow(screen)) &&
        !           342:                 (((XEnterWindowEvent *)rep)->detail & 0xff) !=
        !           343:                 IntoOrFromSubwindow) {
        !           344: #ifdef DEBUG
        !           345:                        if(debug)
        !           346:                                fprintf(stderr, "EnterWindow %s\n", window ==
        !           347:                                 VWindow(screen) ? "VT" : "Tek");
        !           348: #endif DEBUG
        !           349:                        screen->autowindow = window;
        !           350:                        DoEnterLeave(screen, EnterWindow);
        !           351:                }
        !           352:                break;
        !           353:         case LeaveWindow:
        !           354:                if(screen->sb) {
        !           355:                        if(window == screen->sb->button) {
        !           356:                                if((i = GetButtonState(screen->sb)) !=
        !           357:                                 BUTTON_NORMAL)
        !           358:                                        SetButtonState(screen->sb, i& ~HILITED);
        !           359:                                break;
        !           360:                        } else if(window == screen->sb->bar)
        !           361:                                break;
        !           362:                }
        !           363:                if((window == VWindow(screen) || window == TWindow(screen)) &&
        !           364:                 (((XEnterWindowEvent *)rep)->detail & 0xff) !=
        !           365:                 IntoOrFromSubwindow)
        !           366: #ifdef DEBUG
        !           367:                {
        !           368:                        if(debug)
        !           369:                                fprintf(stderr, "LeaveWindow %s\n", window ==
        !           370:                                 VWindow(screen) ? "VT" : "Tek");
        !           371: #endif DEBUG
        !           372:                        DoEnterLeave(screen, LeaveWindow);
        !           373: #ifdef DEBUG
        !           374:                }
        !           375: #endif DEBUG
        !           376:                break;
        !           377:         case FocusChange:
        !           378:                if(((XFocusChangeEvent *)rep)->detail == EnterWindow)
        !           379:                        selectwindow(screen, FOCUS);
        !           380:                else
        !           381:                        unselectwindow(screen, FOCUS);
        !           382:                break;
        !           383:         default:
        !           384:                break;
        !           385:        }
        !           386: }
        !           387: 
        !           388: selectwindow(screen, flag)
        !           389: register Screen *screen;
        !           390: register int flag;
        !           391: {
        !           392:        if(screen->TekEmu) {
        !           393:                TekSelect();
        !           394:                if(!Ttoggled)
        !           395:                        TCursorToggle(TOGGLE);
        !           396:                if(screen->cellsused) {
        !           397:                        screen->colorcells[2].pixel =
        !           398:                         screen->Tcursorcolor;
        !           399:                        XStoreColor(&screen->colorcells[2]);
        !           400:                }
        !           401:                screen->select |= flag;
        !           402:                if(!Ttoggled)
        !           403:                        TCursorToggle(TOGGLE);
        !           404:                return;
        !           405:        } else {
        !           406:                VTSelect();
        !           407:                if(screen->cursor_state &&
        !           408:                   (screen->cursor_col != screen->cur_col ||
        !           409:                    screen->cursor_row != screen->cur_row))
        !           410:                    HideCursor();
        !           411:                screen->select |= flag;
        !           412:                if(screen->cursor_state)
        !           413:                        ShowCursor();
        !           414:                return;
        !           415:        }
        !           416: }
        !           417: 
        !           418: unselectwindow(screen, flag)
        !           419: register Screen *screen;
        !           420: register int flag;
        !           421: {
        !           422:        register int i;
        !           423: 
        !           424:        screen->select &= ~flag;
        !           425:        if(!screen->select) {
        !           426:                if(screen->TekEmu) {
        !           427:                        TekUnselect();
        !           428:                        if(!Ttoggled)
        !           429:                                TCursorToggle(TOGGLE);
        !           430:                        if(screen->cellsused) {
        !           431:                                i = (term.flags & REVERSE_VIDEO) == 0;
        !           432:                                screen->colorcells[i].pixel =
        !           433:                                 screen->Tcursorcolor;
        !           434:                                XStoreColor(
        !           435:                                 &screen->colorcells[i]);
        !           436:                        }
        !           437:                        if(!Ttoggled)
        !           438:                                TCursorToggle(TOGGLE);
        !           439:                        return;
        !           440:                } else {
        !           441:                        VTUnselect();
        !           442:                        if(screen->cursor_state &&
        !           443:                         (screen->cursor_col != screen->cur_col ||
        !           444:                         screen->cursor_row != screen->cur_row))
        !           445:                                HideCursor();
        !           446:                        if(screen->cursor_state)
        !           447:                                ShowCursor();
        !           448:                        return;
        !           449:                }
        !           450:        }
        !           451: }
        !           452: 
        !           453: reselectwindow(screen)
        !           454: register Screen *screen;
        !           455: {
        !           456:        Window win;
        !           457:        int x, y;
        !           458: 
        !           459:        if(XQueryMouse(RootWindow, &x, &y, &win)) {
        !           460:                if(win && (win == VWindow(screen) || win == TWindow(screen))
        !           461:                       && (!screen->icon_show
        !           462:                           || (screen->active_icon && term.flags & ICONINPUT)))
        !           463:                        selectwindow(screen, INWINDOW);
        !           464:                else    unselectwindow(screen, INWINDOW);
        !           465:        }
        !           466: }
        !           467: 
        !           468: DeiconWarp(screen)
        !           469: register Screen *screen;
        !           470: {
        !           471:        if(screen->TekEmu)
        !           472:                XWarpMouse(TWindow(screen), TFullWidth(screen) / 2,
        !           473:                 TFullHeight(screen) / 2);
        !           474:        else
        !           475:                XWarpMouse(VWindow(screen), FullWidth(screen) / 2,
        !           476:                 FullHeight(screen) / 2);
        !           477: }
        !           478: 
        !           479: #define        ENTERLEAVE      500000L
        !           480: 
        !           481: DoEnterLeave(screen, type)
        !           482: register Screen *screen;
        !           483: int type;
        !           484: {
        !           485:        if (!screen->autoraise && !screen->holdoff) {
        !           486:            if (type == EnterWindow)
        !           487:                    selectwindow( screen, INWINDOW );
        !           488:            else    unselectwindow( screen, INWINDOW );
        !           489:            return;
        !           490:        }
        !           491: 
        !           492:        screen->timer = type;
        !           493:        if(!screen->holdoff)
        !           494:                Timer(ENTERLEAVE);
        !           495: }
        !           496: 
        !           497: Timer(val)
        !           498: long val;
        !           499: {
        !           500:        struct itimerval it;
        !           501: 
        !           502:        bzero(&it, sizeof(it));
        !           503:        it.it_value.tv_usec = val;
        !           504:        setitimer(ITIMER_REAL, &it, (struct itimerval *)0);
        !           505: }
        !           506: 
        !           507: /*
        !           508:  * Handle window select/unselect.
        !           509:  *
        !           510:  * We enter from a SIGALRM; X I/O may be in progress,
        !           511:  * so just set a flag which is polled in in_put().
        !           512:  */
        !           513: onalarm()
        !           514: {
        !           515:        register Screen *screen = &term.screen;
        !           516: 
        !           517:        if(screen->timer == 0 || screen->holdoff) {     /* extraneous alarm */
        !           518:                Timer(0L);
        !           519:                return;
        !           520:        }
        !           521:        doonalarmcode++;
        !           522: }
        !           523: 
        !           524: onalarmcode()
        !           525: {
        !           526:        register Screen *screen = &term.screen;
        !           527: 
        !           528:        if(screen->timer == EnterWindow) {
        !           529: #ifdef DEBUG
        !           530:                if(debug)
        !           531:                        fprintf(stderr, "onalarm: EnterWindow %s\n",
        !           532:                         screen->autoraise ? (screen->autowindow ==
        !           533:                         VWindow(screen) ? "VT" : "Tek") : "");
        !           534: #endif DEBUG
        !           535:                selectwindow(screen, INWINDOW);
        !           536:                if(screen->autoraise)
        !           537:                        XRaiseWindow(screen->autowindow);
        !           538:        } else  /* LeaveWindow */
        !           539: #ifdef DEBUG
        !           540:        {
        !           541:                if(debug)
        !           542:                        fputs("onalarm: LeaveWindow\n", stderr);
        !           543: #endif DEBUG
        !           544:                unselectwindow(screen, INWINDOW);
        !           545: #ifdef DEBUG
        !           546:        }
        !           547: #endif DEBUG
        !           548:        screen->timer = 0;
        !           549:        doonalarmcode = 0;
        !           550: }
        !           551: 
        !           552: Pixmap make_hilite(fg, bg)
        !           553: int fg, bg;
        !           554: {
        !           555:        extern Pixmap Make_tile();
        !           556: 
        !           557:        return(Make_tile(hilite_width, hilite_height, hilite_bits, fg,
        !           558:         bg));
        !           559: }
        !           560: 
        !           561: Pixmap make_gray()
        !           562: {
        !           563:        extern Pixmap Make_tile();
        !           564: 
        !           565:        return(Make_tile(gray_width, gray_height, gray_bits, BlackPixel,
        !           566:         WhitePixel));
        !           567: }
        !           568: 
        !           569: Cursor make_tcross(fg, bg, func)
        !           570: int fg, bg, func;
        !           571: {
        !           572:        return(XCreateCursor(tcross_width, tcross_height, tcross_bits,
        !           573:         tcross_mask_bits, tcross_x_hot, tcross_y_hot, fg, bg, func));
        !           574: }
        !           575: 
        !           576: Cursor make_xterm(fg, bg, func)
        !           577: int fg, bg, func;
        !           578: {
        !           579:        return(XCreateCursor(xterm_width, xterm_height, xterm_bits,
        !           580:         xterm_mask_bits, xterm_x_hot, xterm_y_hot, fg, bg, func));
        !           581: }
        !           582: 
        !           583: Cursor make_wait(fg, bg, func)
        !           584: int fg, bg, func;
        !           585: {
        !           586:        return(XCreateCursor(wait_width, wait_height, wait_bits, waitmask_bits,
        !           587:         wait_x_hot, wait_y_hot, fg, bg, func));
        !           588: }
        !           589: 
        !           590: Cursor make_arrow(fg, bg, func)
        !           591: int fg, bg, func;
        !           592: {
        !           593:        return(XCreateCursor(left_ptr_width, left_ptr_height, left_ptr_bits,
        !           594:         left_ptr_mask_bits, left_ptr_x_hot, left_ptr_y_hot, fg, bg, func));
        !           595: }
        !           596: 
        !           597: char *uniquesuffix(name)
        !           598: char *name;
        !           599: {
        !           600:        register int *np, *fp, i;
        !           601:        register Window *cp;
        !           602:        register int temp, j, k, exact, *number;
        !           603:        char *wname;
        !           604:        Window *children, parent;
        !           605:        int nchildren;
        !           606:        static char *suffix, sufbuf[10];
        !           607:        char *malloc();
        !           608: 
        !           609:        if(suffix)
        !           610:                return(suffix);
        !           611:        suffix = sufbuf;
        !           612:        if(!XQueryTree(RootWindow, &parent, &nchildren, &children) ||
        !           613:         nchildren < 1 || (number = (int *)malloc(nchildren * sizeof(int)))
        !           614:         == NULL)
        !           615:                return(suffix);
        !           616:        exact = FALSE;
        !           617:        i = strlen(name);
        !           618:        for(np = number, cp = children, j = nchildren ; j > 0 ; cp++, j--) {
        !           619:                if(!XFetchName(*cp, &wname) || wname == NULL)
        !           620:                        continue;
        !           621:                if(strncmp(name, wname, i) == 0) {
        !           622:                        if(wname[i] == 0 || strcmp(&wname[i], " (Tek)") == 0)
        !           623:                                exact = TRUE;
        !           624:                        else if(strncmp(&wname[i], " #", 2) == 0)
        !           625:                                *np++ = atoi(&wname[i + 2]);
        !           626:                }
        !           627:                free(wname);
        !           628:        }
        !           629:        free((char *)children);
        !           630:        if(exact) {
        !           631:                if(np <= number)
        !           632:                        strcpy(suffix, " #2");
        !           633:                else {
        !           634:                        exact = np - number;
        !           635:                        np = number;
        !           636:                        /* shell sort */
        !           637:                        for(i = exact / 2 ; i > 0 ; i /= 2)
        !           638:                                for(k = i ; k < exact ; k++)
        !           639:                                        for(j = k - i ; j >= 0 &&
        !           640:                                         np[j] > np[j + i] ; j -= i) {
        !           641:                                                temp = np[j];
        !           642:                                                np[j] = np[j + i];
        !           643:                                                np[j + i] = temp;
        !           644:                                        }
        !           645:                        /* make numbers unique */
        !           646:                        for(fp = np + 1, i = exact - 1 ; i > 0 ; fp++, i--)
        !           647:                                if(*fp != *np)
        !           648:                                        *++np = *fp;
        !           649:                        /* find least unique number */
        !           650:                        for(i = 2, fp = number ; fp <= np ; fp++) {
        !           651:                                if(i < *fp)
        !           652:                                        break;
        !           653:                                if(i == *fp)
        !           654:                                        i++;
        !           655:                        }
        !           656:                        sprintf(suffix, " #%d", i);
        !           657:                }
        !           658:        }
        !           659:        free((char *)number);
        !           660:        return(suffix);
        !           661: }
        !           662: 
        !           663: Bell()
        !           664: {
        !           665:        extern Terminal term;
        !           666:        register Screen *screen = &term.screen;
        !           667:        register Window w;
        !           668:        register int width, height, xorPixel;
        !           669: 
        !           670:        if (screen->audiblebell)
        !           671:                XFeep(0);
        !           672: 
        !           673:        if (screen->visualbell) {
        !           674:                if (screen->TekEmu) {
        !           675:                        if (screen->icon_show && !screen->active_icon) {
        !           676:                                w = screen->iconTwin.window;
        !           677:                                width = screen->iconTwin.width;
        !           678:                                height = screen->iconTwin.height;
        !           679:                        } else {
        !           680:                                w = TWindow(screen);
        !           681:                                width = TFullWidth(screen);
        !           682:                                height = TFullHeight(screen);
        !           683:                        }
        !           684:                } else {
        !           685:                        if (screen->icon_show && !screen->active_icon) {
        !           686:                                w = screen->iconVwin.window;
        !           687:                                width = screen->iconVwin.width;
        !           688:                                height = screen->iconVwin.height;
        !           689:                        } else {
        !           690:                                w = VWindow(screen);
        !           691:                                width = FullWidth(screen);
        !           692:                                height = FullHeight(screen);
        !           693:                        }
        !           694:                }
        !           695:                xorPixel = screen->foreground ^ screen->background;
        !           696:                XPixFill(w, 0, 0, width, height, xorPixel, 0, GXxor, AllPlanes);
        !           697:                XFlush();
        !           698:                usleep(screen->visbelldelay * 1000);
        !           699:                XPixFill(w, 0, 0, width, height, xorPixel, 0, GXxor, AllPlanes);
        !           700:        }
        !           701: }
        !           702: 
        !           703: Redraw()
        !           704: {
        !           705:        extern Terminal term;
        !           706:        register Screen *screen = &term.screen;
        !           707: 
        !           708:        if(VWindow(screen) && screen->show) {
        !           709:                VTExpose(NULL);
        !           710:                if(screen->scrollbar) {
        !           711:                        XClear(screen->sb->bar);
        !           712:                        XClear(screen->sb->region);
        !           713:                        screen->sb->buttonstate = -1;
        !           714:                        DrawButton(screen->sb);
        !           715:                        screen->sb->savestate = -1;
        !           716:                        DrawSave(screen->sb);
        !           717:                }
        !           718:                if(Titlebar(screen)) {
        !           719:                        XClear(screen->title.tbar);
        !           720:                        XClear(screen->title.left);
        !           721:                        XClear(screen->title.right);
        !           722:                        VTTitleExpose(NULL);
        !           723:                }
        !           724:        }
        !           725:        if(TWindow(screen) && screen->Tshow) {
        !           726:                TekExpose(NULL);
        !           727:                if(Titlebar(screen)) {
        !           728:                        XClear(screen->Ttitle.tbar);
        !           729:                        XClear(screen->Ttitle.left);
        !           730:                        XClear(screen->Ttitle.right);
        !           731:                        TekTitleExpose(NULL);
        !           732:                }
        !           733:        }
        !           734: }
        !           735: 
        !           736: IconInit(screen, bm, Tbm)
        !           737: register Screen *screen;
        !           738: char *bm, *Tbm;
        !           739: {
        !           740:        register int w;
        !           741: 
        !           742: again:
        !           743:        if(!bm && !Tbm) {       /* use default bitmaps */
        !           744:                screen->iconbitmap.bits = icon_bits;
        !           745:                screen->Ticonbitmap.bits = tek_icon_bits;
        !           746:                screen->bitmapwidth = screen->iconbitmap.width =
        !           747:                 screen->Ticonbitmap.width = icon_width;
        !           748:                screen->bitmapheight = screen->iconbitmap.height =
        !           749:                 screen->Ticonbitmap.height = icon_height;
        !           750:        } else if(bm && !*bm && Tbm && !*Tbm)   /* both empty means no bitmap */
        !           751:                screen->bitmapwidth = screen->bitmapheight = 0;
        !           752:        else {                  /* user defined bitmap(s) */
        !           753:                if(bm && *bm) {
        !           754:                        if((w = XReadBitmapFile(bm, &screen->iconbitmap.width,
        !           755:                         &screen->iconbitmap.height, &screen->iconbitmap.bits,
        !           756:                         NULL, NULL)) == 0) {
        !           757:                                /*
        !           758:                                 * Pretend there wasn't an icon specified
        !           759:                                 * and try for the default icon.
        !           760:                                 */
        !           761:                                fprintf(stderr, "%s: Can't open %s\n",
        !           762:                                 xterm_name, bm);
        !           763:                                bm = 0;
        !           764:                                goto again;
        !           765:                        } else if(w < 0) {
        !           766: syntaxerror:
        !           767:                                fprintf(stderr, "%s: Syntax error in %s\n",
        !           768:                                 xterm_name, bm);
        !           769:                                Exit(ERROR_SYNTAXBITMAP);
        !           770:                        }
        !           771:                        screen->bitmapwidth = screen->iconbitmap.width;
        !           772:                        screen->bitmapheight = screen->iconbitmap.height;
        !           773:                }
        !           774:                if(Tbm && *Tbm) {
        !           775:                        if((w = XReadBitmapFile(Tbm, &screen->Ticonbitmap.width,
        !           776:                         &screen->Ticonbitmap.height, &screen->Ticonbitmap.bits,
        !           777:                         NULL, NULL)) == 0) {
        !           778:                                /*
        !           779:                                 * Pretend there wasn't an icon specified
        !           780:                                 * and try for the default icon.
        !           781:                                 */
        !           782:                                fprintf(stderr, "%s: Can't open %s\n",
        !           783:                                    xterm_name, Tbm);
        !           784:                                Tbm = 0;
        !           785:                                goto again;
        !           786:                        } else if (w < 0)
        !           787:                                goto syntaxerror;
        !           788:                        if(screen->bitmapwidth < screen->Ticonbitmap.width)
        !           789:                                screen->bitmapwidth = screen->Ticonbitmap.width;
        !           790:                        if(screen->bitmapheight < screen->Ticonbitmap.height)
        !           791:                                screen->bitmapheight =
        !           792:                                 screen->Ticonbitmap.height;
        !           793:                }
        !           794:                if(!screen->iconbitmap.bits) {
        !           795:                        if(!screen->Ticonbitmap.bits) {
        !           796:                                screen->Ticonbitmap.bits = tek_icon_bits;
        !           797:                                screen->bitmapwidth = screen->Ticonbitmap.width
        !           798:                                 = icon_width;
        !           799:                                screen->bitmapheight =
        !           800:                                 screen->Ticonbitmap.height = icon_height;
        !           801:                        }
        !           802:                        screen->iconbitmap.bits = screen->Ticonbitmap.bits;
        !           803:                        screen->iconbitmap.width = screen->Ticonbitmap.width;
        !           804:                        screen->iconbitmap.height = screen->Ticonbitmap.height;
        !           805:                } else if(!screen->Ticonbitmap.bits) {
        !           806:                        if(!screen->iconbitmap.bits) {
        !           807:                                screen->iconbitmap.bits = icon_bits;
        !           808:                                screen->bitmapwidth = screen->iconbitmap.width
        !           809:                                 = icon_width;
        !           810:                                screen->bitmapheight =
        !           811:                                 screen->iconbitmap.height = icon_height;
        !           812:                        }
        !           813:                        screen->Ticonbitmap.bits = screen->iconbitmap.bits;
        !           814:                        screen->Ticonbitmap.width = screen->iconbitmap.width;
        !           815:                        screen->Ticonbitmap.height = screen->iconbitmap.height;
        !           816:                }
        !           817:        }
        !           818:        if((screen->winname = malloc(strlen(win_name) + 10)) == NULL)
        !           819:                Error(ERROR_WINNAME);
        !           820:        strcpy(screen->winname, win_name);
        !           821:        if (douniquesuffix)
        !           822:                strcat(screen->winname, uniquesuffix(win_name));
        !           823:        screen->winnamelen = strlen(screen->winname);
        !           824:        IconRecalc(screen);
        !           825: }
        !           826: 
        !           827: IconRecalc(screen)
        !           828: register Screen *screen;
        !           829: {
        !           830:        register int i, w;
        !           831: 
        !           832:        if (screen->active_icon) return;
        !           833: 
        !           834:        w = XQueryWidth(screen->winname, screen->titlefont->id);
        !           835:        if(screen->bitmapwidth > 0) {
        !           836:                if(screen->textundericon) {
        !           837:                        screen->icon_text_x = TITLEPAD;
        !           838:                        screen->icon_text_y = screen->bitmapheight +
        !           839:                         2 * TITLEPAD;
        !           840:                        screen->iconVwin.height = screen->bitmapheight +
        !           841:                          screen->titlefont->height + 3 * TITLEPAD;
        !           842:                        screen->iconbitmap.x = screen->Ticonbitmap.x =
        !           843:                         screen->iconbitmap.y = screen->Ticonbitmap.y =
        !           844:                         TITLEPAD;
        !           845:                        if((i = screen->bitmapwidth - w) >= 0) {
        !           846:                                screen->iconVwin.width = screen->bitmapwidth +
        !           847:                                 2 * TITLEPAD;
        !           848:                                screen->icon_text_x += i / 2;
        !           849:                        } else {
        !           850:                                screen->iconVwin.width = w + 2 * TITLEPAD;
        !           851:                                i = (-i) / 2;
        !           852:                                screen->iconbitmap.x += i;
        !           853:                                screen->Ticonbitmap.x += i;
        !           854:                        }
        !           855:                } else {
        !           856:                        screen->icon_text_x = screen->bitmapwidth +
        !           857:                         2 * TITLEPAD;
        !           858:                        screen->icon_text_y = TITLEPAD;
        !           859:                        screen->iconVwin.width = w + screen->bitmapwidth +
        !           860:                         3 * TITLEPAD;
        !           861:                        screen->iconbitmap.x = screen->Ticonbitmap.x =
        !           862:                         screen->iconbitmap.y = screen->Ticonbitmap.y =
        !           863:                         TITLEPAD;
        !           864:                        if((i = screen->bitmapheight -
        !           865:                         screen->titlefont->height) >= 0) {
        !           866:                                screen->iconVwin.height = screen->bitmapheight +
        !           867:                                 2 * TITLEPAD;
        !           868:                                screen->icon_text_y += i / 2;
        !           869:                        } else {
        !           870:                                screen->iconVwin.height = screen->titlefont->height
        !           871:                                 + 2 * TITLEPAD;
        !           872:                                i = (-i) / 2;
        !           873:                                screen->iconbitmap.y += i;
        !           874:                                screen->Ticonbitmap.y += i;
        !           875:                        }
        !           876:                }
        !           877:                if((i = screen->iconbitmap.width - screen->Ticonbitmap.width)
        !           878:                 >= 0)
        !           879:                        screen->Ticonbitmap.x += i / 2;
        !           880:                else
        !           881:                        screen->iconbitmap.x += (-i) / 2;
        !           882:                if((i = screen->iconbitmap.height - screen->Ticonbitmap.height)
        !           883:                 >= 0)
        !           884:                        screen->Ticonbitmap.y += i / 2;
        !           885:                else
        !           886:                        screen->iconbitmap.y += (-i) / 2;
        !           887:        } else {
        !           888:                screen->icon_text_x = TITLEPAD;
        !           889:                screen->iconVwin.width = w + 2 * TITLEPAD;
        !           890:                screen->iconVwin.height = screen->titlefont->height + 2 * TITLEPAD;
        !           891:        }
        !           892: 
        !           893:        if (screen->iconVwin.window)
        !           894:            XChangeWindow( screen->iconVwin.window, screen->iconVwin.width,
        !           895:                           screen->iconVwin.height );
        !           896: 
        !           897:        if (screen->iconTwin.window) {
        !           898:            screen->iconTwin.width = screen->iconVwin.width;
        !           899:            screen->iconTwin.height = screen->iconVwin.height;
        !           900:            XChangeWindow( screen->iconTwin.window, screen->iconTwin.width,
        !           901:                           screen->iconTwin.height );
        !           902:        }
        !           903: 
        !           904:        icon_box[0].x = screen->icon_text_x - 2;
        !           905:        icon_box[0].y = screen->icon_text_y - 2;
        !           906:        icon_box[3].x = -(icon_box[1].x = w + 3);
        !           907:        icon_box[4].y = -(icon_box[2].y = screen->titlefont->height + 3);
        !           908: }
        !           909: 
        !           910: RefreshIcon(screen, window)
        !           911: register Screen *screen;
        !           912: Window window;
        !           913: {
        !           914:        register BitmapBits *bb;
        !           915:        register int fg, bg;
        !           916: 
        !           917:        bb = screen->TekEmu ? &screen->Ticonbitmap : &screen->iconbitmap;
        !           918:        fg = screen->foreground;
        !           919:        bg = screen->background;
        !           920:        if(screen->bitmapwidth > 0)
        !           921:                XBitmapBitsPut(window, bb->x, bb->y, bb->width, bb->height,
        !           922:                 bb->bits, fg, bg, (Bitmap)0, GXcopy, AllPlanes);
        !           923:        XText(window, screen->icon_text_x, screen->icon_text_y,
        !           924:         screen->winname, screen->winnamelen, screen->titlefont->id, fg, bg);
        !           925:        screen->icon_show = TRUE;
        !           926:        if(screen->iconinput)
        !           927:                IconBox(screen);
        !           928: }
        !           929: 
        !           930: IconBox(screen)
        !           931: register Screen *screen;
        !           932: {
        !           933:        if (screen->active_icon) return;
        !           934: 
        !           935:        XDraw(screen->TekEmu ? screen->iconTwin.window : screen->iconVwin.window,
        !           936:         icon_box, NBOX, 1, 1, screen->foreground, GXcopy, AllPlanes);
        !           937: }
        !           938: 
        !           939: /*
        !           940:  * Move win1's icon window to where win2's icon window is.
        !           941:  */
        !           942: moveiconwindow(win1, win2)
        !           943: register Window win1, win2;
        !           944: {
        !           945:        WindowInfo wininfo1, wininfo2;
        !           946: 
        !           947:        XQueryWindow(win1, &wininfo1);
        !           948:        XQueryWindow(win2, &wininfo2);
        !           949:        if(wininfo1.assoc_wind && wininfo2.assoc_wind) {
        !           950:                XQueryWindow(wininfo2.assoc_wind, &wininfo2);
        !           951:                XMoveWindow(wininfo1.assoc_wind, wininfo2.x, wininfo2.y);
        !           952:        }
        !           953: }
        !           954: 
        !           955: IconGeometry(screen, ix, iy)
        !           956: register Screen *screen;
        !           957: register int *ix, *iy;
        !           958: {
        !           959:        register int i;
        !           960:        int w, h;
        !           961: 
        !           962:        if(icon_geom) {
        !           963:                i = XParseGeometry(icon_geom, ix, iy, &w, &h);
        !           964:                /*
        !           965:                 * XParseGeometry returns negative values in addition to
        !           966:                 * setting the bitmask.
        !           967:                 */
        !           968:                if((i & XValue) && (i & XNegative))
        !           969:                        *ix = DisplayWidth() + *ix - screen->iconVwin.width - 2 *
        !           970:                         screen->borderwidth;
        !           971:                if((i & YValue) && (i & YNegative))
        !           972:                        *iy = DisplayHeight() + *iy - screen->iconVwin.height - 2 *
        !           973:                         screen->borderwidth;
        !           974:        }
        !           975: }
        !           976: 
        !           977: InTitle(screen, window, x)
        !           978: register Screen *screen;
        !           979: Window window;
        !           980: int x;
        !           981: {
        !           982:        register int i, j;
        !           983: 
        !           984:        if(window == screen->title.tbar) {
        !           985:                i = (j = FullWidth(screen) / 2) - (screen->title.x -
        !           986:                 screen->title_n_size);
        !           987:                j = x - j;
        !           988:                if(j < 0)
        !           989:                        j = -j;
        !           990:                if(j < i) {
        !           991:                        XUnmapWindow(VWindow(screen));
        !           992:                        XMapWindow(screen->iconVwin.window);
        !           993:                        return(TRUE);
        !           994:                }
        !           995:        } else {
        !           996:                i = (j = TFullWidth(screen) / 2) - (screen->Ttitle.x -
        !           997:                 screen->title_n_size);
        !           998:                j = x - j;
        !           999:                if(j < 0)
        !          1000:                        j = -j;
        !          1001:                if(j < i) {
        !          1002:                        XUnmapWindow(TWindow(screen));
        !          1003:                        XMapWindow(screen->iconTwin.window);
        !          1004:                        return(TRUE);
        !          1005:                }
        !          1006:        }
        !          1007:        return(FALSE);
        !          1008: }
        !          1009: 
        !          1010: SyncUnmap(win, mask)
        !          1011: register Window win;
        !          1012: register int mask;
        !          1013: {
        !          1014:        XEvent ev;
        !          1015:        register XEvent *rep = &ev;
        !          1016: 
        !          1017:        do { /* ignore events through unmap */
        !          1018:                XWindowEvent(win, mask, rep);
        !          1019:        } while(rep->type != UnmapWindow);
        !          1020: }
        !          1021: 
        !          1022: StartLog(screen)
        !          1023: register Screen *screen;
        !          1024: {
        !          1025:        register char *cp;
        !          1026:        register int i;
        !          1027:        static char *log_default;
        !          1028:        char *malloc(), *rindex();
        !          1029:        extern logpipe();
        !          1030: 
        !          1031:        if(screen->logging || (screen->inhibit & I_LOG))
        !          1032:                return;
        !          1033:        if(screen->logfile == NULL || *screen->logfile == 0) {
        !          1034:                if(screen->logfile)
        !          1035:                        free(screen->logfile);
        !          1036:                if(log_default == NULL)
        !          1037:                        mktemp(log_default = log_def_name);
        !          1038:                if((screen->logfile = malloc(strlen(log_default) + 1)) == NULL)
        !          1039:                        return;
        !          1040:                strcpy(screen->logfile, log_default);
        !          1041:        }
        !          1042:        if(*screen->logfile == '|') {   /* exec command */
        !          1043:                int p[2];
        !          1044:                static char *shell;
        !          1045: 
        !          1046:                if(pipe(p) < 0 || (i = fork()) < 0)
        !          1047:                        return;
        !          1048:                if(i == 0) {    /* child */
        !          1049:                        close(p[1]);
        !          1050:                        dup2(p[0], 0);
        !          1051:                        close(p[0]);
        !          1052:                        dup2(fileno(stderr), 1);
        !          1053:                        dup2(fileno(stderr), 2);
        !          1054:                        close(fileno(stderr));
        !          1055:                        fileno(stderr) = 2;
        !          1056:                        close(screen->display->fd);
        !          1057:                        close(screen->respond);
        !          1058:                        if(!shell) {
        !          1059:                                register struct passwd *pw;
        !          1060:                                char *getenv(), *malloc();
        !          1061:                                struct passwd *getpwuid();
        !          1062: 
        !          1063:                                if(((cp = getenv("SHELL")) == NULL || *cp == 0)
        !          1064:                                 && ((pw = getpwuid(screen->uid)) == NULL ||
        !          1065:                                 *(cp = pw->pw_shell) == 0) ||
        !          1066:                                 (shell = malloc(strlen(cp) + 1)) == NULL)
        !          1067:                                        shell = "/bin/sh";
        !          1068:                                else
        !          1069:                                        strcpy(shell, cp);
        !          1070:                        }
        !          1071:                        signal(SIGHUP, SIG_DFL);
        !          1072:                        signal(SIGCHLD, SIG_DFL);
        !          1073:                        setgid(screen->gid);
        !          1074:                        setuid(screen->uid);
        !          1075:                        execl(shell, shell, "-c", &screen->logfile[1], 0);
        !          1076:                        fprintf(stderr, "%s: Can't exec `%s'\n", xterm_name,
        !          1077:                         &screen->logfile[1]);
        !          1078:                        exit(ERROR_LOGEXEC);
        !          1079:                }
        !          1080:                close(p[0]);
        !          1081:                screen->logfd = p[1];
        !          1082:                signal(SIGPIPE, logpipe);
        !          1083:        } else {
        !          1084:                if(access(screen->logfile, F_OK) == 0) {
        !          1085:                        if(access(screen->logfile, W_OK) < 0)
        !          1086:                                return;
        !          1087:                } else if(cp = rindex(screen->logfile, '/')) {
        !          1088:                        *cp = 0;
        !          1089:                        i = access(screen->logfile, W_OK);
        !          1090:                        *cp = '/';
        !          1091:                        if(i < 0)
        !          1092:                                return;
        !          1093:                } else if(access(".", W_OK) < 0)
        !          1094:                        return;
        !          1095:                if((screen->logfd = open(screen->logfile, O_WRONLY | O_APPEND |
        !          1096:                 O_CREAT, 0644)) < 0)
        !          1097:                        return;
        !          1098:                chown(screen->logfile, screen->uid, screen->gid);
        !          1099: 
        !          1100:        }
        !          1101:        screen->logstart = screen->TekEmu ? Tbptr : bptr;
        !          1102:        screen->logging = TRUE;
        !          1103: }
        !          1104: 
        !          1105: CloseLog(screen)
        !          1106: register Screen *screen;
        !          1107: {
        !          1108:        if(!screen->logging || (screen->inhibit & I_LOG))
        !          1109:                return;
        !          1110:        FlushLog(screen);
        !          1111:        close(screen->logfd);
        !          1112:        screen->logging = FALSE;
        !          1113: }
        !          1114: 
        !          1115: FlushLog(screen)
        !          1116: register Screen *screen;
        !          1117: {
        !          1118:        register char *cp;
        !          1119:        register int i;
        !          1120: 
        !          1121:        cp = screen->TekEmu ? Tbptr : bptr;
        !          1122:        if((i = cp - screen->logstart) > 0)
        !          1123:                write(screen->logfd, screen->logstart, i);
        !          1124:        screen->logstart = screen->TekEmu ? Tbuffer : buffer;
        !          1125: }
        !          1126: 
        !          1127: logpipe()
        !          1128: {
        !          1129:        register Screen *screen = &term.screen;
        !          1130: 
        !          1131:        if(screen->logging)
        !          1132:                CloseLog(screen);
        !          1133: }
        !          1134: 
        !          1135: do_osc(func)
        !          1136: int (*func)();
        !          1137: {
        !          1138:        register Screen *screen = &term.screen;
        !          1139:        register int mode, c;
        !          1140:        register char *cp;
        !          1141:        char buf[512];
        !          1142:        extern char *malloc();
        !          1143: 
        !          1144:        mode = 0;
        !          1145:        while(isdigit(c = (*func)()))
        !          1146:                mode = 10 * mode + (c - '0');
        !          1147:        cp = buf;
        !          1148:        while(isprint(c = (*func)()))
        !          1149:                *cp++ = c;
        !          1150:        *cp = 0;
        !          1151:        switch(mode) {
        !          1152:         case 0:        /* new title */
        !          1153:                Retitle(buf);
        !          1154:                break;
        !          1155:         case 46:       /* new log file */
        !          1156:                if((cp = malloc(strlen(buf) + 1)) == NULL)
        !          1157:                        break;
        !          1158:                strcpy(cp, buf);
        !          1159:                if(screen->logfile)
        !          1160:                        free(screen->logfile);
        !          1161:                screen->logfile = cp;
        !          1162:                break;
        !          1163: #ifdef CHANGEFONT
        !          1164:         case 47:       /* new screen font */
        !          1165:                if (VTChangeFont(screen, buf)) {
        !          1166:                        XChangeWindow (VWindow(screen),
        !          1167:                         FontWidth(screen) * (screen->max_col + 1) +
        !          1168:                         2 * screen->border + screen->scrollbar,
        !          1169:                         FontHeight(screen) * (screen->max_row + 1) +
        !          1170:                         screen->statusheight + Titlebar(screen)
        !          1171:                         + 2 * screen->border);
        !          1172:                        XSync(FALSE);   /* synchronize */
        !          1173:                        if(QLength() > 0)
        !          1174:                                xevents();
        !          1175:                }
        !          1176:                break;
        !          1177:        }
        !          1178: #endif
        !          1179: }
        !          1180: 
        !          1181: Retitle(name)
        !          1182: register char *name;
        !          1183: {
        !          1184:        register Screen *screen = &term.screen;
        !          1185:        register int w, i, j;
        !          1186:        char icon[512];
        !          1187: 
        !          1188:        free(screen->winname);
        !          1189:        if((screen->winname = malloc((screen->winnamelen = strlen(name)) + 1))
        !          1190:         == NULL)
        !          1191:                Error(ERROR_RTMALLOC1);
        !          1192:        strcpy(screen->winname, name);
        !          1193:        strcpy(icon, name);
        !          1194:        strcat(icon, " (icon)");
        !          1195:        IconRecalc(screen);
        !          1196:        if(screen->fullVwin.window) {
        !          1197:                XStoreName(screen->fullVwin.window, name);
        !          1198:                XStoreName(screen->iconVwin.window, icon);
        !          1199:                XChangeWindow(screen->iconVwin.window, screen->iconVwin.width,
        !          1200:                 screen->iconVwin.height);
        !          1201:                if(screen->title.tbar) {
        !          1202:                        w = FullWidth(screen);
        !          1203:                        screen->title.fullwidth = XQueryWidth(name,
        !          1204:                         screen->titlefont->id);
        !          1205:                        if((screen->title.width = i = screen->title.fullwidth)
        !          1206:                         > (j = w - 2 * (MINHILITE + screen->title_n_size + 1)))
        !          1207:                                screen->title.width = (i = j) +
        !          1208:                                 screen->title_n_size;
        !          1209:                        j = w - i - 2 * (screen->title_n_size + 1);
        !          1210:                        i = j / 2;
        !          1211:                        j -= i;
        !          1212:                        screen->title.x = i + 1 + screen->title_n_size;
        !          1213:                        screen->title.y = TITLEPAD;
        !          1214:                        XClear(screen->title.tbar);
        !          1215:                        XChangeWindow(screen->title.left, i,
        !          1216:                         screen->titlefont->height);
        !          1217:                        XConfigureWindow(screen->title.right, w - j - 1,
        !          1218:                         TITLEPAD, j, screen->titlefont->height);
        !          1219:                        VTTitleExpose((XExposeWindowEvent *)NULL);
        !          1220:                }
        !          1221:        }
        !          1222:        if(screen->fullTwin.window) {
        !          1223:                free(screen->Twinname);
        !          1224:                if((screen->Twinname = malloc((screen->Twinnamelen =
        !          1225:                 screen->winnamelen + 6) + 1)) == NULL)
        !          1226:                        Error(ERROR_RTMALLOC2);
        !          1227:                strcpy(screen->Twinname, name);
        !          1228:                strcat(screen->Twinname, " (Tek)");
        !          1229:                XStoreName(screen->fullTwin.window, screen->Twinname);
        !          1230:                XStoreName(screen->iconTwin.window, icon);
        !          1231:                XChangeWindow(screen->iconTwin.window, screen->iconTwin.width,
        !          1232:                 screen->iconTwin.height);
        !          1233:                if(screen->Ttitle.tbar) {
        !          1234:                        w = TFullWidth(screen);
        !          1235:                        screen->Ttitle.fullwidth = XQueryWidth(screen->Twinname,
        !          1236:                         screen->titlefont->id);
        !          1237:                        if((screen->Ttitle.width = i = screen->Ttitle.fullwidth)
        !          1238:                         > (j = w - 2 * (MINHILITE + screen->title_n_size + 1)))
        !          1239:                                screen->Ttitle.width = (i = j) +
        !          1240:                                 screen->title_n_size;
        !          1241:                        j = w - i - 2 * (screen->title_n_size + 1);
        !          1242:                        i = j / 2;
        !          1243:                        j -= i;
        !          1244:                        screen->Ttitle.x = i + 1 + screen->title_n_size;
        !          1245:                        screen->Ttitle.y = TITLEPAD;
        !          1246:                        XClear(screen->Ttitle.tbar);
        !          1247:                        XChangeWindow(screen->Ttitle.left, i,
        !          1248:                         screen->titlefont->height);
        !          1249:                        XConfigureWindow(screen->Ttitle.right, w - j - 1,
        !          1250:                         TITLEPAD, j, screen->titlefont->height);
        !          1251:                        TekTitleExpose((XExposeWindowEvent *)NULL);
        !          1252:                }
        !          1253:        }
        !          1254: }
        !          1255: 
        !          1256: Panic(s, a)
        !          1257: char   *s;
        !          1258: int a;
        !          1259: {
        !          1260: #ifdef DEBUG
        !          1261:        if(debug) {
        !          1262:                fprintf(stderr, "%s: PANIC!     ", xterm_name);
        !          1263:                fprintf(stderr, s, a);
        !          1264:                fputs("\r\n", stderr);
        !          1265:                fflush(stderr);
        !          1266:        }
        !          1267: #endif DEBUG
        !          1268: }
        !          1269: 
        !          1270: SysError (i)
        !          1271: int i;
        !          1272: {
        !          1273:        fprintf (stderr, "%s: Error %d, errno %d:", xterm_name, i, errno);
        !          1274:        perror ("");
        !          1275:        Cleanup(i);
        !          1276: }
        !          1277: 
        !          1278: Error (i)
        !          1279: int i;
        !          1280: {
        !          1281:        fprintf (stderr, "%s: Error %d\n", xterm_name, i);
        !          1282:        Cleanup(i);
        !          1283: }
        !          1284: 
        !          1285: /*
        !          1286:  * cleanup by sending SIGHUP to client processes
        !          1287:  */
        !          1288: Cleanup (code)
        !          1289: int code;
        !          1290: {
        !          1291: #ifdef notdef
        !          1292:        extern Terminal term;
        !          1293:        register Screen *screen;
        !          1294: 
        !          1295:        screen = &term.screen;
        !          1296:        if (screen->pid > 1)
        !          1297:                killpg(getpgrp(screen->pid), SIGHUP);
        !          1298: #endif
        !          1299:        Exit (code);
        !          1300: }
        !          1301: 
        !          1302: /*
        !          1303:  * sets the value of var to be arg in the Unix 4.2 BSD environment env.
        !          1304:  * Var should end with '=' (bindings are of the form "var=value").
        !          1305:  * This procedure assumes the memory for the first level of environ
        !          1306:  * was allocated using calloc, with enough extra room at the end so not
        !          1307:  * to have to do a realloc().
        !          1308:  */
        !          1309: Setenv (var, value)
        !          1310: register char *var, *value;
        !          1311: {
        !          1312:        extern char **environ;
        !          1313:        register int index = 0;
        !          1314:        register int len = strlen(var);
        !          1315: 
        !          1316:        while (environ [index] != NULL) {
        !          1317:            if (strncmp (environ [index], var, len) == 0) {
        !          1318:                /* found it */
        !          1319:                environ[index] = (char *)malloc (len + strlen (value) + 1);
        !          1320:                strcpy (environ [index], var);
        !          1321:                strcat (environ [index], value);
        !          1322:                return;
        !          1323:            }
        !          1324:            index ++;
        !          1325:        }
        !          1326: 
        !          1327: #ifdef DEBUG
        !          1328:        if (debug) fputs ("expanding env\n", stderr);
        !          1329: #endif DEBUG
        !          1330: 
        !          1331:        environ [index] = (char *) malloc (len + strlen (value) + 1);
        !          1332:        strcpy (environ [index], var);
        !          1333:        strcat (environ [index], value);
        !          1334:        environ [++index] = NULL;
        !          1335: }
        !          1336: 
        !          1337: /*
        !          1338:  * returns a pointer to the first occurrence of s2 in s1,
        !          1339:  * or NULL if there are none.
        !          1340:  */
        !          1341: char *strindex (s1, s2)
        !          1342: register char  *s1, *s2;
        !          1343: {
        !          1344:        register char   *s3;
        !          1345:        char            *index();
        !          1346: 
        !          1347:        while ((s3=index(s1, *s2)) != NULL) {
        !          1348:                if (strncmp(s3, s2, strlen(s2)) == 0)
        !          1349:                        return (s3);
        !          1350:                s1 = ++s3;
        !          1351:        }
        !          1352:        return (NULL);
        !          1353: }
        !          1354: 
        !          1355: xerror(d, ev)
        !          1356: Display *d;
        !          1357: register XErrorEvent *ev;
        !          1358: {
        !          1359:        fprintf(stderr, "%s: %s\n", xterm_name,
        !          1360:         XErrDescrip(ev->error_code));
        !          1361:        fprintf(stderr, "Request code %d, func %d, serial #%ld, window %ld\n",
        !          1362:         ev->request_code, ev->func, ev->serial, (long)ev->window);
        !          1363:        Exit(ERROR_XERROR);
        !          1364: }
        !          1365: 
        !          1366: xioerror(d)
        !          1367: Display *d;
        !          1368: {
        !          1369:        perror(xterm_name);
        !          1370:        Exit(ERROR_XIOERROR);
        !          1371: }

unix.superglobalmegacorp.com

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