diff options
| -rw-r--r-- | ext/io/console/console.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/ext/io/console/console.c b/ext/io/console/console.c index 1f8b71fc86..ef3fe2eae5 100644 --- a/ext/io/console/console.c +++ b/ext/io/console/console.c @@ -1303,11 +1303,17 @@ static VALUE console_goto(VALUE io, VALUE y, VALUE x) { #ifdef _WIN32 - COORD pos; - int fd = GetWriteFD(io); - pos.X = NUM2UINT(x); - pos.Y = NUM2UINT(y); - if (!SetConsoleCursorPosition((HANDLE)rb_w32_get_osfhandle(fd), pos)) { + HANDLE h; + rb_console_size_t ws; + COORD *pos = &ws.dwCursorPosition; + + h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(io)); + if (!GetConsoleScreenBufferInfo(h, &ws)) { + rb_syserr_fail(LAST_ERROR, 0); + } + pos->X = NUM2UINT(x); + pos->Y = ws.srWindow.Top + NUM2UINT(y); + if (!SetConsoleCursorPosition(h, *pos)) { rb_syserr_fail(LAST_ERROR, 0); } #else |
