|
|
1.1 root 1: #include <X/mit-copyright.h>
2:
3: /* Copyright Massachusetts Institute of Technology 1984 */
4:
5: /* resize.c */
6:
7: #include <stdio.h>
8: #include <sgtty.h>
9: #include <strings.h>
10: #include <sys/ioctl.h>
11:
12: #ifndef lint
13: static char *rcsid_resize_c = "$Header: resize.c,v 10.5 86/02/01 16:06:55 tony Rel $";
14: #endif
15:
16: char *myname;
17:
18: char *strindex (), *index (), *rindex();
19:
20: main (argc, argv)
21: char **argv;
22: /*
23: resets termcap string to reflect current screen size
24: */
25: {
26: int rows, cols;
27: char *size = "\0337\033[r\033[999;999H\033[6n";
28: struct sgttyb sg, sgorig;
29: char termcap [1024];
30: char newtc [1024];
31: char *setname = "";
32: register char *ptr, *env;
33: char *getenv();
34: #ifdef TIOCSWINSZ
35: struct winsize ws;
36: #endif
37: tgetent (termcap, "xterm");
38:
39: if(ptr = rindex(myname = argv[0], '/'))
40: myname = ptr + 1;
41: if((env = getenv("TERMCAP")) && *env)
42: strcpy(termcap, env);
43: else {
44: if(!(env = getenv("TERM")) || !*env) {
45: env = "xterm";
46: setname = "setenv TERM xterm;\n";
47: }
48: if(tgetent (termcap, env) <= 0) {
49: fprintf(stderr, "%s: Can't get entry \"%s\"\n",
50: myname, env);
51: exit(1);
52: }
53: }
54:
55: ioctl ( 0, TIOCGETP, &sgorig);
56: sg = sgorig;
57: sg.sg_flags |= RAW;
58: ioctl ( 0, TIOCSETP, &sg);
59:
60: write ( 0, size, strlen (size));
61: scanf ("\033[%d;%dR", &rows, &cols);
62: write ( 0, "\0338", 2);
63:
64: ioctl ( 0, TIOCSETP, &sgorig);
65:
66: /* update termcap string */
67: /* first do columns */
68: if ((ptr = strindex (termcap, "co#")) == NULL) {
69: fprintf(stderr, "%s: No `co#'\n", myname);
70: exit (1);
71: }
72: strncpy (newtc, termcap, ptr - termcap + 3);
73: sprintf (newtc + strlen (newtc), "%d", cols);
74: ptr = index (ptr, ':');
75: strcat (newtc, ptr);
76:
77: /* now do lines */
78: if ((ptr = strindex (newtc, "li#")) == NULL) {
79: fprintf(stderr, "%s: No `li#'\n", myname);
80: exit (1);
81: }
82: strncpy (termcap, newtc, ptr - newtc + 3);
83: sprintf (termcap + ((int) ptr - (int) newtc + 3), "%d", rows);
84: ptr = index (ptr, ':');
85: strcat (termcap, ptr);
86:
87: printf ("set noglob;\n%ssetenv TERMCAP '%s';\nunset noglob;\n",
88: setname, termcap);
89: #ifdef TIOCGWINSZ
90: /* finally, set the tty's window size */
91: if (ioctl (0, TIOCGWINSZ, &ws) != -1) {
92: /* we don't have any way of directly finding out
93: the current height & width of the window in pixels. We try
94: our best by computing the font height and width from the "old"
95: struct winsize values, and multiplying by these ratios...*/
96: if (ws.ws_xpixel != 0)
97: ws.ws_xpixel = cols*(ws.ws_xpixel/ws.ws_col);
98: if (ws.ws_ypixel != 0)
99: ws.ws_ypixel = rows*(ws.ws_ypixel/ws.ws_row);
100: ws.ws_row = rows;
101: ws.ws_col = cols;
102: ioctl (0, TIOCSWINSZ, &ws);
103: }
104: #endif
105: exit(0);
106: }
107:
108: char *strindex (s1, s2)
109: /*
110: returns a pointer to the first occurrence of s2 in s1, or NULL if there are
111: none.
112: */
113: char *s1, *s2;
114: {
115: char *s3;
116:
117: while ((s3 = index (s1, *s2)) != NULL)
118: {
119: if (strncmp (s3, s2, strlen (s2)) == 0) return (s3);
120: s1 = ++s3;
121: }
122: return (NULL);
123: }
124:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.