[前][次][番号順一覧][スレッド一覧]

ruby-changes:57879

From: Nobuyoshi <ko1@a...>
Date: Tue, 24 Sep 2019 16:20:54 +0900 (JST)
Subject: [ruby-changes:57879] 10e3267c31 (master): [ruby/io-console] Made cursor position 0-origin

https://git.ruby-lang.org/ruby.git/commit/?id=10e3267c31

From 10e3267c31c4c976d79e00bca484094f1a87dc65 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Tue, 24 Sep 2019 15:53:58 +0900
Subject: [ruby/io-console] Made cursor position 0-origin

https://github.com/ruby/io-console/commit/9377e37295

diff --git a/ext/io/console/console.c b/ext/io/console/console.c
index 1d6ebc8..2604715 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -1109,6 +1109,7 @@ console_cursor_pos(VALUE io) https://github.com/ruby/ruby/blob/trunk/ext/io/console/console.c#L1109
     VALUE query = rb_str_new_cstr("\e[6n");
     VALUE resp = console_vt_response(1, &query, io);
     VALUE row, column, term;
+    unsigned int r, c;
     if (!RB_TYPE_P(resp, T_ARRAY) || RARRAY_LEN(resp) != 3) return Qnil;
     term = RARRAY_AREF(resp, 2);
     if (!RB_TYPE_P(term, T_STRING) || RSTRING_LEN(term) != 1) return Qnil;
@@ -1116,13 +1117,17 @@ console_cursor_pos(VALUE io) https://github.com/ruby/ruby/blob/trunk/ext/io/console/console.c#L1117
     row = RARRAY_AREF(resp, 0);
     column = RARRAY_AREF(resp, 1);
     rb_ary_resize(resp, 2);
+    r = NUM2UINT(row) - 1;
+    c = NUM2UINT(column) - 1;
+    RARRAY_ASET(resp, 0, INT2NUM(r));
+    RARRAY_ASET(resp, 1, INT2NUM(c));
     return resp;
 }
 
 static VALUE
 console_goto(VALUE io, VALUE y, VALUE x)
 {
-    rb_io_write(io, rb_sprintf("\x1b[%d;%dH", NUM2UINT(y), NUM2UINT(x)));
+    rb_io_write(io, rb_sprintf("\x1b[%d;%dH", NUM2UINT(y)+1, NUM2UINT(x)+1));
     return io;
 }
 
@@ -1223,7 +1228,7 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ext/io/console/console.c#L1228
 console_clear_screen(VALUE io)
 {
     console_erase_screen(io, INT2FIX(2));
-    console_goto(io, INT2FIX(1), INT2FIX(1));
+    console_goto(io, INT2FIX(0), INT2FIX(0));
     return io;
 }
 
diff --git a/test/io/console/test_io_console.rb b/test/io/console/test_io_console.rb
index db3814d..c81d80f 100644
--- a/test/io/console/test_io_console.rb
+++ b/test/io/console/test_io_console.rb
@@ -281,6 +281,26 @@ defined?(PTY) and defined?(IO.console) and TestIO_Console.class_eval do https://github.com/ruby/ruby/blob/trunk/test/io/console/test_io_console.rb#L281
     set_winsize_teardown
   end
 
+  def test_cursor_position
+    run_pty("#{<<~"begin;"}\n#{<<~'end;'}") do |r, w, _|
+      begin;
+        con = IO.console
+        p con.cursor
+        con.cursor_down(3); con.puts
+        con.cursor_right(4); con.puts
+        con.cursor_left(2); con.puts
+        con.cursor_up(1); con.puts
+      end;
+      assert_equal("\e[6n", r.readpartial(5))
+      w.print("\e[12;34R"); w.flush
+      assert_equal([11, 33], eval(r.gets))
+      assert_equal("\e[3B", r.gets.chomp)
+      assert_equal("\e[4C", r.gets.chomp)
+      assert_equal("\e[2D", r.gets.chomp)
+      assert_equal("\e[1A", r.gets.chomp)
+    end
+  end
+
   unless IO.console
     def test_close
       assert_equal(["true"], run_pty("IO.console.close; p IO.console.fileno >= 0"))
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]