rcurses 6.2.1 → 6.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rcurses/input.rb +28 -11
- data/lib/rcurses/pane.rb +4 -11
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a8ec62837a88937101e8bc44c44114e7b3c49f1df33e597683bd18470b916a01
|
|
4
|
+
data.tar.gz: 04b29d82622aa2abfb9e612ed4f74e8122ccb3b39c8799343f901676f973f52b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 11e14e44a0d5f2bd92d25e16c57607b7e1ceb0e367cfa750c3b27b290e08340c1ab43b4bd828a1e41a473cf83debb5824ca6fddbd5e0788a6981c05fb58adb2a
|
|
7
|
+
data.tar.gz: 99a4f5780497f82311dccf81d56b99865a6bbefc5d47a8fcfa3723790c7ba6184876bccd04795aa424ff68d6005c413211a693bfcf42ee7798f3da04b530bd81
|
data/lib/rcurses/input.rb
CHANGED
|
@@ -2,33 +2,51 @@ module Rcurses
|
|
|
2
2
|
module Input
|
|
3
3
|
def getchr(t = nil, flush: true)
|
|
4
4
|
begin
|
|
5
|
+
# Reinforce raw mode on every call. External programs (e.g. hyperlist)
|
|
6
|
+
# can leave the terminal in cooked/echo mode; raw! fixes it without
|
|
7
|
+
# the save/restore cycle of getch's raw{} block.
|
|
8
|
+
$stdin.raw!
|
|
5
9
|
# 1) Read a byte (with optional timeout)
|
|
10
|
+
# Use IO.select for timeout (clean syscall, no background thread).
|
|
6
11
|
if t
|
|
7
12
|
return nil unless IO.select([$stdin], nil, nil, t)
|
|
8
13
|
end
|
|
9
|
-
c = $stdin.
|
|
10
|
-
|
|
14
|
+
c = $stdin.getc
|
|
11
15
|
|
|
12
|
-
|
|
16
|
+
|
|
17
|
+
# 2) If it's ESC, read escape sequence byte-by-byte
|
|
18
|
+
# (greedy read_nonblock can swallow the NEXT keypress)
|
|
13
19
|
seq = c
|
|
14
20
|
if c == "\e"
|
|
15
21
|
if IO.select([$stdin], nil, nil, 0.05)
|
|
16
22
|
begin
|
|
17
|
-
|
|
23
|
+
b = $stdin.read_nonblock(1)
|
|
24
|
+
seq << b
|
|
25
|
+
# CSI sequence: \e[ ... (letter or ~)
|
|
26
|
+
# SS3 sequence: \eO (one more byte)
|
|
27
|
+
if b == '[' || b == 'O'
|
|
28
|
+
while IO.select([$stdin], nil, nil, 0.05)
|
|
29
|
+
b = $stdin.read_nonblock(1)
|
|
30
|
+
seq << b
|
|
31
|
+
# CSI terminates on a letter (A-Z, a-z) or ~
|
|
32
|
+
# SS3 terminates after one char
|
|
33
|
+
break if b =~ /[A-Za-z~]/
|
|
34
|
+
end
|
|
35
|
+
end
|
|
18
36
|
rescue IO::WaitReadable, EOFError
|
|
19
37
|
end
|
|
20
38
|
end
|
|
21
39
|
end
|
|
22
|
-
|
|
23
|
-
|
|
40
|
+
|
|
41
|
+
|
|
24
42
|
|
|
25
43
|
# 3) Single ESC alone
|
|
26
44
|
return "ESC" if seq == "\e"
|
|
27
45
|
|
|
28
|
-
# 4) Shift
|
|
46
|
+
# 4) Shift‐TAB
|
|
29
47
|
return "S-TAB" if seq == "\e[Z"
|
|
30
48
|
|
|
31
|
-
# 5) Legacy single
|
|
49
|
+
# 5) Legacy single‐char shift‐arrows (your old working ones)
|
|
32
50
|
case seq
|
|
33
51
|
when "\e[a" then return "S-UP"
|
|
34
52
|
when "\e[b" then return "S-DOWN"
|
|
@@ -36,11 +54,11 @@ module Rcurses
|
|
|
36
54
|
when "\e[d" then return "S-LEFT"
|
|
37
55
|
end
|
|
38
56
|
|
|
39
|
-
# 6) CSI style shift
|
|
57
|
+
# 6) CSI style shift‐arrows (e.g. ESC [1;2A )
|
|
40
58
|
if m = seq.match(/\A\e\[\d+;2([ABCD])\z/)
|
|
41
59
|
return { 'A' => "S-UP", 'B' => "S-DOWN", 'C' => "S-RIGHT", 'D' => "S-LEFT" }[m[1]]
|
|
42
60
|
end
|
|
43
|
-
|
|
61
|
+
|
|
44
62
|
# 6b) CSI style ctrl-arrows (e.g. ESC [1;5A )
|
|
45
63
|
if m = seq.match(/\A\e\[\d+;5([ABCD])\z/)
|
|
46
64
|
return { 'A' => "C-UP", 'B' => "C-DOWN", 'C' => "C-RIGHT", 'D' => "C-LEFT" }[m[1]]
|
|
@@ -137,4 +155,3 @@ module Rcurses
|
|
|
137
155
|
end
|
|
138
156
|
end
|
|
139
157
|
end
|
|
140
|
-
|
data/lib/rcurses/pane.rb
CHANGED
|
@@ -225,16 +225,9 @@ module Rcurses
|
|
|
225
225
|
@y = [[1, @y].max, @max_h - @h + 1].min
|
|
226
226
|
end
|
|
227
227
|
|
|
228
|
-
|
|
229
|
-
o_row, o_col = pos
|
|
230
|
-
rescue => e
|
|
231
|
-
# Fallback cursor position
|
|
232
|
-
o_row, o_col = 1, 1
|
|
233
|
-
end
|
|
234
|
-
|
|
228
|
+
# Save cursor with ANSI save (no stdin read needed)
|
|
235
229
|
# Hide cursor, disable auto-wrap, reset all SGR and scroll margins
|
|
236
|
-
|
|
237
|
-
STDOUT.print "\e[?25l\e[?7l\e[0m\e[r"
|
|
230
|
+
STDOUT.print "\e7\e[?25l\e[?7l\e[0m\e[r"
|
|
238
231
|
|
|
239
232
|
fmt = [@fg.to_s, @bg.to_s].join(',')
|
|
240
233
|
|
|
@@ -363,8 +356,8 @@ module Rcurses
|
|
|
363
356
|
end
|
|
364
357
|
end
|
|
365
358
|
|
|
366
|
-
#
|
|
367
|
-
diff_buf << "\
|
|
359
|
+
# Restore cursor, re-enable wrap, reset SGR and scroll-region
|
|
360
|
+
diff_buf << "\e8\e[?7h\e[0m\e[r"
|
|
368
361
|
begin
|
|
369
362
|
print diff_buf
|
|
370
363
|
rescue => e
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rcurses
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.2.
|
|
4
|
+
version: 6.2.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Geir Isene
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-03-
|
|
11
|
+
date: 2026-03-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: clipboard
|