diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-11 20:10:34 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-11 20:10:34 +0000 |
commit | 65b11a04f10a2438f0d6ba263a78d16367c3aac0 (patch) | |
tree | 176775c7c4460a54457bab1c0cbb733d2c7811b6 /ext/io/console/console.c | |
parent | 896d04128112f0a3ee5f0bc6e3bfa9e1baf4cf51 (diff) |
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/console/console.c')
-rw-r--r-- | ext/io/console/console.c | 23 |
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 |