aboutsummaryrefslogtreecommitdiffstats
path: root/ext/io
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-11 20:10:34 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-11 20:10:34 +0000
commit65b11a04f10a2438f0d6ba263a78d16367c3aac0 (patch)
tree176775c7c4460a54457bab1c0cbb733d2c7811b6 /ext/io
parent896d04128112f0a3ee5f0bc6e3bfa9e1baf4cf51 (diff)
downloadruby-65b11a04f10a2438f0d6ba263a78d16367c3aac0.tar.gz
console.c: set winsize on Windows
* ext/io/console/console.c (console_set_winsize): retry shrinking window and screen buffer. [ruby-core:82741] [Bug #13888] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59844 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/io')
-rw-r--r--ext/io/console/console.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/ext/io/console/console.c b/ext/io/console/console.c
index 6f45537e27..e09213d383 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -531,6 +531,7 @@ console_set_winsize(VALUE io, VALUE size)
#if defined _WIN32
HANDLE wh;
int newrow, newcol;
+ BOOL ret;
#endif
VALUE row, col, xpixel, ypixel;
const VALUE *sz;
@@ -568,17 +569,21 @@ console_set_winsize(VALUE io, VALUE size)
if (!GetConsoleScreenBufferInfo(wh, &ws)) {
rb_syserr_fail(LAST_ERROR, "GetConsoleScreenBufferInfo");
}
- if ((ws.dwSize.X < newcol && (ws.dwSize.X = newcol, 1)) ||
- (ws.dwSize.Y < newrow && (ws.dwSize.Y = newrow, 1))) {
- if (!SetConsoleScreenBufferSize(wh, ws.dwSize)) {
- rb_syserr_fail(LAST_ERROR, "SetConsoleScreenBufferInfo");
- }
- }
+ ws.dwSize.X = newcol;
+ ret = SetConsoleScreenBufferSize(wh, ws.dwSize);
ws.srWindow.Left = 0;
ws.srWindow.Top = 0;
- ws.srWindow.Right = newcol;
- ws.srWindow.Bottom = newrow;
- if (!SetConsoleWindowInfo(wh, FALSE, &ws.srWindow)) {
+ ws.srWindow.Right = newcol-1;
+ ws.srWindow.Bottom = newrow-1;
+ if (!SetConsoleWindowInfo(wh, TRUE, &ws.srWindow)) {
+ rb_syserr_fail(LAST_ERROR, "SetConsoleWindowInfo");
+ }
+ /* retry when shrinking buffer after shrunk window */
+ if (!ret && !SetConsoleScreenBufferSize(wh, ws.dwSize)) {
+ rb_syserr_fail(LAST_ERROR, "SetConsoleScreenBufferInfo");
+ }
+ /* remove scrollbar if possible */
+ if (!SetConsoleWindowInfo(wh, TRUE, &ws.srWindow)) {
rb_syserr_fail(LAST_ERROR, "SetConsoleWindowInfo");
}
#endif