source: MondoRescue/branches/3.3/mindi-busybox/console-tools/resize.c@ 3901

Last change on this file since 3901 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 2.1 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * resize - set terminal width and height.
4 *
5 * Copyright 2006 Bernhard Reutner-Fischer
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
9/* no options, no getopt */
10
11//usage:#define resize_trivial_usage
12//usage: ""
13//usage:#define resize_full_usage "\n\n"
14//usage: "Resize the screen"
15
16#include "libbb.h"
17#include "common_bufsiz.h"
18
19#define ESC "\033"
20
21#define old_termios_p ((struct termios*)bb_common_bufsiz1)
22#define INIT_G() do { setup_common_bufsiz(); } while (0)
23
24static void
25onintr(int sig UNUSED_PARAM)
26{
27 tcsetattr(STDERR_FILENO, TCSANOW, old_termios_p);
28 _exit(EXIT_FAILURE);
29}
30
31int resize_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
32int resize_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
33{
34 struct termios new;
35 struct winsize w = { 0, 0, 0, 0 };
36 int ret;
37
38 INIT_G();
39
40 /* We use _stderr_ in order to make resize usable
41 * in shell backticks (those redirect stdout away from tty).
42 * NB: other versions of resize open "/dev/tty"
43 * and operate on it - should we do the same?
44 */
45
46 tcgetattr(STDERR_FILENO, old_termios_p); /* fiddle echo */
47 memcpy(&new, old_termios_p, sizeof(new));
48 new.c_cflag |= (CLOCAL | CREAD);
49 new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
50 bb_signals(0
51 + (1 << SIGINT)
52 + (1 << SIGQUIT)
53 + (1 << SIGTERM)
54 + (1 << SIGALRM)
55 , onintr);
56 tcsetattr(STDERR_FILENO, TCSANOW, &new);
57
58 /* save_cursor_pos 7
59 * scroll_whole_screen [r
60 * put_cursor_waaaay_off [$x;$yH
61 * get_cursor_pos [6n
62 * restore_cursor_pos 8
63 */
64 fprintf(stderr, ESC"7" ESC"[r" ESC"[999;999H" ESC"[6n");
65 alarm(3); /* Just in case terminal won't answer */
66//BUG: death by signal won't restore termios
67 scanf(ESC"[%hu;%huR", &w.ws_row, &w.ws_col);
68 fprintf(stderr, ESC"8");
69
70 /* BTW, other versions of resize recalculate w.ws_xpixel, ws.ws_ypixel
71 * by calculating character cell HxW from old values
72 * (gotten via TIOCGWINSZ) and recomputing *pixel values */
73 ret = ioctl(STDERR_FILENO, TIOCSWINSZ, &w);
74
75 tcsetattr(STDERR_FILENO, TCSANOW, old_termios_p);
76
77 if (ENABLE_FEATURE_RESIZE_PRINT)
78 printf("COLUMNS=%d;LINES=%d;export COLUMNS LINES;\n",
79 w.ws_col, w.ws_row);
80
81 return ret;
82}
Note: See TracBrowser for help on using the repository browser.