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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b13d24016c4f50d3be32d0a0bbfa4fb4d8c91f56495685a49092ee8e6e4f911a
4
- data.tar.gz: 4199b5be43510913de44129abe16408a26c07e4e2188113f5952dd0bbcb58a22
3
+ metadata.gz: a8ec62837a88937101e8bc44c44114e7b3c49f1df33e597683bd18470b916a01
4
+ data.tar.gz: 04b29d82622aa2abfb9e612ed4f74e8122ccb3b39c8799343f901676f973f52b
5
5
  SHA512:
6
- metadata.gz: 84de15bb7f6ed01c1b95e7e548d8e452e120d15296ff64bc7118ba1a02d0298086d2cc1fc1ceb7dfcdc691eeac55e654e2d2fe0992e36d25dc57404c770d06ff
7
- data.tar.gz: c77412cda9fb4a998d2a369e8021566e9a341f433c38195cc8dc70e00aabc500cb5cda6caf69bc80670111eb71bbf49e7cf618a7ed2d2591798a3ead31ed6860
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.getch
10
-
14
+ c = $stdin.getc
11
15
 
12
- # 2) If it's ESC, grab any quick trailing bytes
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
- seq << $stdin.read_nonblock(16)
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‑TAB
46
+ # 4) ShiftTAB
29
47
  return "S-TAB" if seq == "\e[Z"
30
48
 
31
- # 5) Legacy single‑char shift‑arrows (your old working ones)
49
+ # 5) Legacy singlechar shiftarrows (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‑arrows (e.g. ESC [1;2A )
57
+ # 6) CSI style shiftarrows (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
- begin
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
- # (so stray underline, scroll regions, etc. can’t leak out)
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
- # restore wrap, then also reset SGR and scroll-region one more time
367
- diff_buf << "\e[#{o_row};#{o_col}H\e[?7h\e[0m\e[r"
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.1
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-12 00:00:00.000000000 Z
11
+ date: 2026-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard