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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/lib/betters3tui.rb +73 -5
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98a94ca0be3affeb0617f69182b5ec794b189ea5540b530346f2e5465db1b335
4
- data.tar.gz: eec66f2677f6562e2e527c6b0a9da890524aef821db1d1e8319bb18c94477ad1
3
+ metadata.gz: f163b7db0b942399b20d4282c2f1f211a3f29b22d91c3e96d8cec144aa974725
4
+ data.tar.gz: 0d32d3a731580847b1a2cc36430c564876c90dc62f59957018f5c211ae965b9c
5
5
  SHA512:
6
- metadata.gz: 35cfff2e92a797dae2c56441f30908dca5d01a7979508f327776a050428ce26a6fed12e793a33f523943edfa1fe47995d327e461bf6254942fe2e62e3a94d9d8
7
- data.tar.gz: b0341c937891c6c662508750aee3b1f12b7094d2b1c6ca1fdee6de786603b869f734d81606448842118fd20dcfb522f7279bc81b5584d7f72f12057aa8ec9ac2
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.7"
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
- @original_stty = `stty -g 2>/dev/null`.chomp
107
- system("stty -echo -icanon raw 2>/dev/null")
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
- system("stty #{@original_stty} 2>/dev/null") if @original_stty && !@original_stty.empty?
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 = $stdin.getc
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"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: betters3tui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adi Purnama