betters3tui 0.2.7 → 0.2.8
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/CHANGELOG.md +9 -0
- data/lib/betters3tui.rb +73 -5
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f163b7db0b942399b20d4282c2f1f211a3f29b22d91c3e96d8cec144aa974725
|
|
4
|
+
data.tar.gz: 0d32d3a731580847b1a2cc36430c564876c90dc62f59957018f5c211ae965b9c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2c1f146b0ac1cb24726186f5dc9627d1bbf473181bc786a4690b7a82e8ee670926eb91ac9bb2e813e0ac48c25ef360b2030574eb0549521d636f58950ccad7e5
|
|
7
|
+
data.tar.gz: 5de653abe8d434b5379320142c0b5c148b23ed470cd50ee6960edd911dde7a7d2d1a10bc3001d9b0b57354603a89219f1e056f419c21d610c0dac552cf2abf99
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.2.8] - 2026-02-28
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Windows navigation support** - Fixed keyboard navigation not working on Windows by implementing Windows Console API support
|
|
9
|
+
- Added cross-platform terminal setup/cleanup (`setup_terminal`/`cleanup_terminal`)
|
|
10
|
+
- Implemented Windows-specific `read_char` method for proper key input handling
|
|
11
|
+
- Console mode is now properly saved and restored on Windows platforms
|
|
12
|
+
|
|
5
13
|
## [0.2.7] - 2026-02-28
|
|
6
14
|
|
|
7
15
|
### Fixed
|
|
@@ -39,6 +47,7 @@ All notable changes to this project will be documented in this file.
|
|
|
39
47
|
- File download capability
|
|
40
48
|
- Interactive keyboard navigation
|
|
41
49
|
|
|
50
|
+
[0.2.8]: https://github.com/adiprnm/betters3tui/compare/v0.2.7...v0.2.8
|
|
42
51
|
[0.2.7]: https://github.com/adiprnm/betters3tui/compare/v0.2.6...v0.2.7
|
|
43
52
|
[0.2.6]: https://github.com/adiprnm/betters3tui/compare/v0.2.5...v0.2.6
|
|
44
53
|
[0.1.1]: https://github.com/adiprnm/betters3tui/compare/v0.1.0...v0.1.1
|
data/lib/betters3tui.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
|
-
VERSION = "0.2.
|
|
4
|
+
VERSION = "0.2.8"
|
|
5
5
|
|
|
6
6
|
require "json"
|
|
7
7
|
require "aws-sdk-s3"
|
|
@@ -103,8 +103,38 @@ class S3Browser
|
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
def setup_terminal
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
if windows?
|
|
107
|
+
require 'io/console'
|
|
108
|
+
@console_mode = nil
|
|
109
|
+
begin
|
|
110
|
+
# Get the Windows console handle and save current mode
|
|
111
|
+
kernel32 = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L')
|
|
112
|
+
@stdout_handle = kernel32.call(-11) # STD_OUTPUT_HANDLE = -11
|
|
113
|
+
@stdin_handle = kernel32.call(-10) # STD_INPUT_HANDLE = -10
|
|
114
|
+
|
|
115
|
+
# Save and set console input mode
|
|
116
|
+
get_mode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'I')
|
|
117
|
+
set_mode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'I')
|
|
118
|
+
|
|
119
|
+
mode_buf = [0].pack('L')
|
|
120
|
+
get_mode.call(@stdin_handle, mode_buf)
|
|
121
|
+
@original_console_mode = mode_buf.unpack1('L')
|
|
122
|
+
|
|
123
|
+
# Enable window input, disable line input and echo
|
|
124
|
+
new_mode = 0x0080 | 0x0008 # ENABLE_WINDOW_INPUT | ENABLE_PROCESSED_INPUT
|
|
125
|
+
set_mode.call(@stdin_handle, new_mode)
|
|
126
|
+
|
|
127
|
+
# Set output mode for virtual terminal processing
|
|
128
|
+
get_mode.call(@stdout_handle, mode_buf)
|
|
129
|
+
@original_stdout_mode = mode_buf.unpack1('L')
|
|
130
|
+
set_mode.call(@stdout_handle, @original_stdout_mode | 0x0004) # ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
|
131
|
+
rescue LoadError
|
|
132
|
+
# Fall back to basic mode
|
|
133
|
+
end
|
|
134
|
+
else
|
|
135
|
+
@original_stty = `stty -g 2>/dev/null`.chomp
|
|
136
|
+
system("stty -echo -icanon raw 2>/dev/null")
|
|
137
|
+
end
|
|
108
138
|
print Tui::ANSI::ALT_SCREEN_ON
|
|
109
139
|
print Tui::ANSI::HIDE
|
|
110
140
|
$stdout.flush
|
|
@@ -114,10 +144,29 @@ class S3Browser
|
|
|
114
144
|
print Tui::ANSI::ALT_SCREEN_OFF
|
|
115
145
|
print Tui::ANSI::SHOW
|
|
116
146
|
print Tui::ANSI::RESET
|
|
117
|
-
|
|
147
|
+
if windows?
|
|
148
|
+
begin
|
|
149
|
+
if @stdin_handle && @original_console_mode
|
|
150
|
+
set_mode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'I')
|
|
151
|
+
set_mode.call(@stdin_handle, @original_console_mode)
|
|
152
|
+
end
|
|
153
|
+
if @stdout_handle && @original_stdout_mode
|
|
154
|
+
set_mode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'I')
|
|
155
|
+
set_mode.call(@stdout_handle, @original_stdout_mode)
|
|
156
|
+
end
|
|
157
|
+
rescue
|
|
158
|
+
# Ignore errors during cleanup
|
|
159
|
+
end
|
|
160
|
+
else
|
|
161
|
+
system("stty #{@original_stty} 2>/dev/null") if @original_stty && !@original_stty.empty?
|
|
162
|
+
end
|
|
118
163
|
$stdout.flush
|
|
119
164
|
end
|
|
120
165
|
|
|
166
|
+
def windows?
|
|
167
|
+
RUBY_PLATFORM =~ /mswin|mingw|cygwin/
|
|
168
|
+
end
|
|
169
|
+
|
|
121
170
|
def render
|
|
122
171
|
screen = Tui::Screen.new
|
|
123
172
|
|
|
@@ -508,7 +557,7 @@ class S3Browser
|
|
|
508
557
|
end
|
|
509
558
|
|
|
510
559
|
def handle_input
|
|
511
|
-
char =
|
|
560
|
+
char = read_char
|
|
512
561
|
return unless char
|
|
513
562
|
|
|
514
563
|
if @delete_confirm_mode
|
|
@@ -523,6 +572,25 @@ class S3Browser
|
|
|
523
572
|
end
|
|
524
573
|
end
|
|
525
574
|
|
|
575
|
+
def read_char
|
|
576
|
+
if windows?
|
|
577
|
+
require 'io/console'
|
|
578
|
+
# On Windows, use console API for proper key reading
|
|
579
|
+
# Try to get a single character without echo
|
|
580
|
+
begin
|
|
581
|
+
# Use IO#raw if available (Ruby 2.4+)
|
|
582
|
+
$stdin.raw do
|
|
583
|
+
return $stdin.getch
|
|
584
|
+
end
|
|
585
|
+
rescue
|
|
586
|
+
# Fallback for older Ruby versions
|
|
587
|
+
return $stdin.getch
|
|
588
|
+
end
|
|
589
|
+
else
|
|
590
|
+
$stdin.getc
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
|
|
526
594
|
def handle_search_input(char)
|
|
527
595
|
case char
|
|
528
596
|
when "\e"
|