summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbinoam P. Marques Jr <abinoam@gmail.com>2023-01-06 19:16:29 -0300
committerGitHub <noreply@github.com>2023-01-06 19:16:29 -0300
commit8e5f773e9e4180f30f850a6ec364a082b8bc8f3f (patch)
tree7a436aee021704aaacff5fb94cb304d0fe6f04ef
parent7755f1f3f3b80e4c1c48446ea8234eaf954e6538 (diff)
parent75010bcf9047dec765429adaa5dbec1cfc66a0af (diff)
downloadhighline-8e5f773e9e4180f30f850a6ec364a082b8bc8f3f.tar.gz
Merge pull request #259 from abinoam/issue_236
Handle Ctrl-C when Question#echo = false (raw_no_echo_mode)
-rw-r--r--lib/highline.rb1
-rw-r--r--lib/highline/io_console_compatible.rb2
-rw-r--r--lib/highline/terminal/io_console.rb2
-rwxr-xr-xtest/test_highline.rb14
4 files changed, 17 insertions, 2 deletions
diff --git a/lib/highline.rb b/lib/highline.rb
index 3e60cd3..47df4be 100644
--- a/lib/highline.rb
+++ b/lib/highline.rb
@@ -538,6 +538,7 @@ class HighLine
terminal.raw_no_echo_mode_exec do
loop do
character = terminal.get_character
+ raise Interrupt if character == "\u0003"
break unless character
break if ["\n", "\r"].include? character
diff --git a/lib/highline/io_console_compatible.rb b/lib/highline/io_console_compatible.rb
index 7ff06f5..7fa388c 100644
--- a/lib/highline/io_console_compatible.rb
+++ b/lib/highline/io_console_compatible.rb
@@ -13,7 +13,7 @@ require "tempfile"
#
module IOConsoleCompatible
- def getch
+ def getch(min:nil, time:nil, intr: nil)
getc
end
diff --git a/lib/highline/terminal/io_console.rb b/lib/highline/terminal/io_console.rb
index d28ee0d..9374f09 100644
--- a/lib/highline/terminal/io_console.rb
+++ b/lib/highline/terminal/io_console.rb
@@ -27,7 +27,7 @@ class HighLine
# (see Terminal#get_character)
def get_character
- input.getch # from ruby io/console
+ input.getch(intr: true) # from ruby io/console
rescue Errno::ENOTTY
input.getc
end
diff --git a/test/test_highline.rb b/test/test_highline.rb
index 8de8551..a5c4e26 100755
--- a/test/test_highline.rb
+++ b/test/test_highline.rb
@@ -1300,6 +1300,20 @@ class TestHighLine < Minitest::Test
assert_equal("maçã", answer)
end
+ def test_echo_false_with_ctrl_c_interrupts
+ @input << "String with a ctrl-c at the end \u0003 \n"
+ @input.rewind
+ @answer = nil
+
+ assert_raises(Interrupt) do
+ @answer = @terminal.ask("Type: ") do |q|
+ q.echo = false
+ end
+ end
+
+ assert_nil @answer
+ end
+
def test_range_requirements
@input << "112\n-541\n28\n"
@input.rewind