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

1.1     ! root        1: /*
        !             2:  *     $Source: /u1/X/xterm/RCS/resize.c,v $
        !             3:  *     $Header: resize.c,v 10.101 86/12/02 10:35:30 swick Exp $
        !             4:  */
        !             5: 
        !             6: #ifndef lint
        !             7: static char *rcsid_resize_c = "$Header: resize.c,v 10.101 86/12/02 10:35:30 swick Exp $";
        !             8: #endif lint
        !             9: 
        !            10: #include <X/mit-copyright.h>
        !            11: 
        !            12: /* Copyright    Massachusetts Institute of Technology    1984  */
        !            13: 
        !            14: /* resize.c */
        !            15: 
        !            16: #include <stdio.h>
        !            17: #include <sgtty.h>
        !            18: #include <strings.h>
        !            19: #include <ctype.h>
        !            20: #include <sys/ioctl.h>
        !            21: #include <signal.h>
        !            22: #include <sys/time.h>
        !            23: 
        !            24: #ifndef lint
        !            25: static char sccs_id[] = "@(#)resize.c\tX10/6.6B\t12/26/86";
        !            26: #endif
        !            27: 
        !            28: #define        EMULATIONS      2
        !            29: #define        SUN             1
        !            30: #define        TIMEOUT         10
        !            31: #define        VT100           0
        !            32: 
        !            33: char *emuname[EMULATIONS] = {
        !            34:        "VT100",
        !            35:        "Sun",
        !            36: };
        !            37: char *myname;
        !            38: int stdsh;
        !            39: char *getsize[EMULATIONS] = {
        !            40:        "\0337\033[r\033[999;999H\033[6n",
        !            41:        "\033[18t",
        !            42: };
        !            43: #ifndef sun
        !            44: #ifdef TIOCSWINSZ
        !            45: char *getwsize[EMULATIONS] = {
        !            46:        0,
        !            47:        "\033[14t",
        !            48: };
        !            49: #endif TIOCSWINSZ
        !            50: #endif sun
        !            51: char *restore[EMULATIONS] = {
        !            52:        "\0338",
        !            53:        0,
        !            54: };
        !            55: char *setname = "";
        !            56: char *setsize[EMULATIONS] = {
        !            57:        0,
        !            58:        "\033[8;%s;%st",
        !            59: };
        !            60: struct sgttyb sgorig;
        !            61: char *size[EMULATIONS] = {
        !            62:        "\033[%d;%dR",
        !            63:        "\033[8;%d;%dt",
        !            64: };
        !            65: char sunname[] = "sunsize";
        !            66: int tty;
        !            67: FILE *ttyfp;
        !            68: #ifndef sun
        !            69: #ifdef TIOCSWINSZ
        !            70: char *wsize[EMULATIONS] = {
        !            71:        0,
        !            72:        "\033[4;%hd;%hdt",
        !            73: };
        !            74: #endif TIOCSWINSZ
        !            75: #endif sun
        !            76: 
        !            77: char *strindex (), *index (), *rindex();
        !            78: 
        !            79: main (argc, argv)
        !            80: char **argv;
        !            81: /*
        !            82:    resets termcap string to reflect current screen size
        !            83:  */
        !            84: {
        !            85:        register char *ptr, *env;
        !            86:        register int emu = VT100;
        !            87:        int rows, cols;
        !            88:        struct sgttyb sg;
        !            89:        char termcap [1024];
        !            90:        char newtc [1024];
        !            91:        char buf[BUFSIZ];
        !            92: #ifdef sun
        !            93: #ifdef TIOCSSIZE
        !            94:        struct ttysize ts;
        !            95: #endif TIOCSSIZE
        !            96: #else sun
        !            97: #ifdef TIOCSWINSZ
        !            98:        struct winsize ws;
        !            99: #endif TIOCSWINSZ
        !           100: #endif sun
        !           101:        char *getenv();
        !           102:        int onintr();
        !           103: 
        !           104:        if(ptr = rindex(myname = argv[0], '/'))
        !           105:                myname = ptr + 1;
        !           106:        if(strcmp(myname, sunname) == 0)
        !           107:                emu = SUN;
        !           108:        for(argv++, argc-- ; argc > 0 && **argv == '-' ; argv++, argc--) {
        !           109:                switch((*argv)[1]) {
        !           110:                 case 's':      /* Sun emulation */
        !           111:                        if(emu == SUN)
        !           112:                                Usage();        /* Never returns */
        !           113:                        emu = SUN;
        !           114:                        break;
        !           115:                 case 'u':      /* Bourne (Unix) shell */
        !           116:                        stdsh++;
        !           117:                        break;
        !           118:                 default:
        !           119:                        Usage();        /* Never returns */
        !           120:                }
        !           121:        }
        !           122:        if(argc == 2) {
        !           123:                if(!setsize[emu]) {
        !           124:                        fprintf(stderr,
        !           125:                         "%s: Can't set window size under %s emulation\n",
        !           126:                         myname, emuname[emu]);
        !           127:                        exit(1);
        !           128:                }
        !           129:                if(!checkdigits(argv[0]) || !checkdigits(argv[1]))
        !           130:                        Usage();        /* Never returns */
        !           131:        } else if(argc != 0)
        !           132:                Usage();        /* Never returns */
        !           133:        if((ttyfp = fopen("/dev/tty", "r+")) == NULL) {
        !           134:                fprintf(stderr, "%s: Can't open /dev/tty\n", myname);
        !           135:                exit(1);
        !           136:        }
        !           137:        tty = fileno(ttyfp);
        !           138:        if((env = getenv("TERMCAP")) && *env)
        !           139:                strcpy(termcap, env);
        !           140:        else {
        !           141:                if(!(env = getenv("TERM")) || !*env) {
        !           142:                        env = "xterm";
        !           143:                        if(stdsh)
        !           144:                                setname = "TERM=xterm;\n";
        !           145:                        else    setname = "setenv TERM xterm;\n";
        !           146:                }
        !           147:                if(tgetent (termcap, env) <= 0) {
        !           148:                        fprintf(stderr, "%s: Can't get entry \"%s\"\n",
        !           149:                         myname, env);
        !           150:                        exit(1);
        !           151:                }
        !           152:        }
        !           153: 
        !           154:        ioctl (tty, TIOCGETP, &sgorig);
        !           155:        sg = sgorig;
        !           156:        sg.sg_flags |= RAW;
        !           157:        sg.sg_flags &= ~ECHO;
        !           158:        signal(SIGINT, onintr);
        !           159:        signal(SIGQUIT, onintr);
        !           160:        signal(SIGTERM, onintr);
        !           161:        ioctl (tty, TIOCSETP, &sg);
        !           162: 
        !           163:        if (argc == 2) {
        !           164:                sprintf (buf, setsize[emu], argv[0], argv[1]);
        !           165:                write(tty, buf, strlen(buf));
        !           166:        }
        !           167:        write(tty, getsize[emu], strlen(getsize[emu]));
        !           168:        readstring(ttyfp, buf, size[emu]);
        !           169:        if(sscanf (buf, size[emu], &rows, &cols) != 2) {
        !           170:                fprintf(stderr, "%s: Can't get rows and columns\r\n", myname);
        !           171:                onintr();
        !           172:        }
        !           173:        if(restore[emu])
        !           174:                write(tty, restore[emu], strlen(restore[emu]));
        !           175: #ifdef sun
        !           176: #ifdef TIOCGSIZE
        !           177:        /* finally, set the tty's window size */
        !           178:        if (ioctl (tty, TIOCGSIZE, &ts) != -1) {
        !           179:                ts.ts_lines = rows;
        !           180:                ts.ts_cols = cols;
        !           181:                ioctl (tty, TIOCSSIZE, &ts);
        !           182:        }
        !           183: #endif TIOCGSIZE
        !           184: #else sun
        !           185: #ifdef TIOCGWINSZ
        !           186:        /* finally, set the tty's window size */
        !           187:        if(getwsize[emu]) {
        !           188:            /* get the window size in pixels */
        !           189:            write (tty, getwsize[emu], strlen (getwsize[emu]));
        !           190:            readstring(ttyfp, buf, wsize[emu]);
        !           191:            if(sscanf (buf, wsize[emu], &ws.ws_xpixel, &ws.ws_ypixel) != 2) {
        !           192:                fprintf(stderr, "%s: Can't get window size\r\n", myname);
        !           193:                onintr();
        !           194:            }
        !           195:            ws.ws_row = rows;
        !           196:            ws.ws_col = cols;
        !           197:            ioctl (tty, TIOCSWINSZ, &ws);
        !           198:        } else if (ioctl (tty, TIOCGWINSZ, &ws) != -1) {
        !           199:            /* we don't have any way of directly finding out
        !           200:               the current height & width of the window in pixels.  We try
        !           201:               our best by computing the font height and width from the "old"
        !           202:               struct winsize values, and multiplying by these ratios...*/
        !           203:            if (ws.ws_xpixel != 0)
        !           204:                ws.ws_xpixel = cols * (ws.ws_xpixel / ws.ws_col);
        !           205:            if (ws.ws_ypixel != 0)
        !           206:                ws.ws_ypixel = rows * (ws.ws_ypixel / ws.ws_row);
        !           207:            ws.ws_row = rows;
        !           208:            ws.ws_col = cols;
        !           209:            ioctl (tty, TIOCSWINSZ, &ws);
        !           210:        }
        !           211: #endif TIOCGWINSZ
        !           212: #endif sun
        !           213: 
        !           214:        ioctl (tty, TIOCSETP, &sgorig);
        !           215:        signal(SIGINT, SIG_DFL);
        !           216:        signal(SIGQUIT, SIG_DFL);
        !           217:        signal(SIGTERM, SIG_DFL);
        !           218: 
        !           219:        /* update termcap string */
        !           220:        /* first do columns */
        !           221:        if ((ptr = strindex (termcap, "co#")) == NULL) {
        !           222:                fprintf(stderr, "%s: No `co#'\n", myname);
        !           223:                exit (1);
        !           224:        }
        !           225:        strncpy (newtc, termcap, ptr - termcap + 3);
        !           226:        sprintf (newtc + strlen (newtc), "%d", cols);
        !           227:        ptr = index (ptr, ':');
        !           228:        strcat (newtc, ptr);
        !           229: 
        !           230:        /* now do lines */
        !           231:        if ((ptr = strindex (newtc, "li#")) == NULL) {
        !           232:                fprintf(stderr, "%s: No `li#'\n", myname);
        !           233:                exit (1);
        !           234:        }
        !           235:        strncpy (termcap, newtc, ptr - newtc + 3);
        !           236:        sprintf (termcap + ((int) ptr - (int) newtc + 3), "%d", rows);
        !           237:        ptr = index (ptr, ':');
        !           238:        strcat (termcap, ptr);
        !           239: 
        !           240:        if(stdsh)
        !           241:                printf ("%sTERMCAP='%s'\n",
        !           242:                 setname, termcap);
        !           243:        else    printf ("set noglob;\n%ssetenv TERMCAP '%s';\nunset noglob;\n",
        !           244:                 setname, termcap);
        !           245:        exit(0);
        !           246: }
        !           247: 
        !           248: char *strindex (s1, s2)
        !           249: /*
        !           250:    returns a pointer to the first occurrence of s2 in s1, or NULL if there are
        !           251:    none.
        !           252:  */
        !           253: register char *s1, *s2;
        !           254: {
        !           255:        register char *s3;
        !           256: 
        !           257:        while ((s3 = index (s1, *s2)) != NULL)
        !           258:        {
        !           259:                if (strncmp (s3, s2, strlen (s2)) == 0) return (s3);
        !           260:                s1 = ++s3;
        !           261:        }
        !           262:        return (NULL);
        !           263: }
        !           264: 
        !           265: checkdigits(str)
        !           266: register char *str;
        !           267: {
        !           268:        while(*str) {
        !           269:                if(!isdigit(*str))
        !           270:                        return(0);
        !           271:                str++;
        !           272:        }
        !           273:        return(1);
        !           274: }
        !           275: 
        !           276: readstring(fp, buf, str)
        !           277: register FILE *fp;
        !           278: register char *buf;
        !           279: char *str;
        !           280: {
        !           281:        register int i, last;
        !           282:        struct itimerval it;
        !           283:        int timeout();
        !           284: 
        !           285:        signal(SIGALRM, timeout);
        !           286:        bzero((char *)&it, sizeof(struct itimerval));
        !           287:        it.it_value.tv_sec = TIMEOUT;
        !           288:        setitimer(ITIMER_REAL, &it, (struct itimerval *)NULL);
        !           289:        if((*buf++ = getc(fp)) != *str) {
        !           290:                fprintf(stderr, "%s: unknown character, exiting.\r\n", myname);
        !           291:                onintr();
        !           292:        }
        !           293:        last = str[i = strlen(str) - 1];
        !           294:        while((*buf++ = getc(fp)) != last);
        !           295:        bzero((char *)&it, sizeof(struct itimerval));
        !           296:        setitimer(ITIMER_REAL, &it, (struct itimerval *)NULL);
        !           297:        *buf = 0;
        !           298: }
        !           299: 
        !           300: Usage()
        !           301: {
        !           302:        fprintf(stderr, strcmp(myname, sunname) == 0 ?
        !           303:         "Usage: %s [rows cols]\n" :
        !           304:         "Usage: %s [-u] [-s [rows cols]]\n", myname);
        !           305:        exit(1);
        !           306: }
        !           307: 
        !           308: timeout()
        !           309: {
        !           310:        fprintf(stderr, "%s: Time out occurred\r\n", myname);
        !           311:        onintr();
        !           312: }
        !           313: 
        !           314: onintr()
        !           315: {
        !           316:        ioctl (tty, TIOCSETP, &sgorig);
        !           317:        exit(1);
        !           318: }

unix.superglobalmegacorp.com

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