diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-18 22:53:06 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-18 22:53:06 +0200 |
commit | 55241fa2e0a623c6f3f3f9c6e430d72bc10858bc (patch) | |
tree | fc8334e2cfd277eb237c1d35f902f2ebda19addb /libbb | |
parent | b9e35dc15dbf8aa22dbc260d121ad8f7a34017de (diff) | |
download | busybox-w32-55241fa2e0a623c6f3f3f9c6e430d72bc10858bc.tar.gz busybox-w32-55241fa2e0a623c6f3f3f9c6e430d72bc10858bc.tar.bz2 busybox-w32-55241fa2e0a623c6f3f3f9c6e430d72bc10858bc.zip |
lineedit: limit ASK_TERMINAL to the case when we can't find out the width
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/lineedit.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 3905b8cc4..a62ab6d29 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
@@ -149,6 +149,7 @@ struct lineedit_statics { | |||
149 | CHAR_T delbuf[DELBUFSIZ]; /* a place to store deleted characters */ | 149 | CHAR_T delbuf[DELBUFSIZ]; /* a place to store deleted characters */ |
150 | #endif | 150 | #endif |
151 | #if ENABLE_FEATURE_EDITING_ASK_TERMINAL | 151 | #if ENABLE_FEATURE_EDITING_ASK_TERMINAL |
152 | smallint unknown_width; | ||
152 | smallint sent_ESC_br6n; | 153 | smallint sent_ESC_br6n; |
153 | #endif | 154 | #endif |
154 | 155 | ||
@@ -1610,14 +1611,16 @@ static void ask_terminal(void) | |||
1610 | * poll([{fd=0, events=POLLIN}], 1, 4294967295) = 1 ([{fd=0, revents=POLLIN}]) | 1611 | * poll([{fd=0, events=POLLIN}], 1, 4294967295) = 1 ([{fd=0, revents=POLLIN}]) |
1611 | * read(0, "\n", 1) = 1 <-- oh crap, user's input got in first | 1612 | * read(0, "\n", 1) = 1 <-- oh crap, user's input got in first |
1612 | */ | 1613 | */ |
1613 | struct pollfd pfd; | 1614 | if (S.unknown_width) { /* only if window size is not known */ |
1614 | 1615 | struct pollfd pfd; | |
1615 | pfd.fd = STDIN_FILENO; | 1616 | |
1616 | pfd.events = POLLIN; | 1617 | pfd.fd = STDIN_FILENO; |
1617 | if (safe_poll(&pfd, 1, 0) == 0) { | 1618 | pfd.events = POLLIN; |
1618 | S.sent_ESC_br6n = 1; | 1619 | if (safe_poll(&pfd, 1, 0) == 0) { |
1619 | fputs("\033" "[6n", stdout); | 1620 | S.sent_ESC_br6n = 1; |
1620 | fflush_all(); /* make terminal see it ASAP! */ | 1621 | fputs("\033" "[6n", stdout); |
1622 | fflush_all(); /* make terminal see it ASAP! */ | ||
1623 | } | ||
1621 | } | 1624 | } |
1622 | } | 1625 | } |
1623 | #else | 1626 | #else |
@@ -1763,11 +1766,13 @@ static void cmdedit_setwidth(unsigned w, int redraw_flg) | |||
1763 | 1766 | ||
1764 | static void win_changed(int nsig) | 1767 | static void win_changed(int nsig) |
1765 | { | 1768 | { |
1769 | int sv_errno = errno; | ||
1766 | unsigned width; | 1770 | unsigned width; |
1767 | get_terminal_width_height(0, &width, NULL); | 1771 | IF_FEATURE_EDITING_ASK_TERMINAL(S.unknown_width =) get_terminal_width_height(0, &width, NULL); |
1768 | cmdedit_setwidth(width, nsig /* - just a yes/no flag */); | 1772 | cmdedit_setwidth(width, nsig /* - just a yes/no flag */); |
1769 | if (nsig == SIGWINCH) | 1773 | if (nsig == SIGWINCH) |
1770 | signal(SIGWINCH, win_changed); /* rearm ourself */ | 1774 | signal(SIGWINCH, win_changed); /* rearm ourself */ |
1775 | errno = sv_errno; | ||
1771 | } | 1776 | } |
1772 | 1777 | ||
1773 | static int lineedit_read_key(char *read_key_buffer) | 1778 | static int lineedit_read_key(char *read_key_buffer) |