betters3tui 0.2.7 → 0.2.9

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