Class: RubyInstaller::Runtime::ConsoleUi
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
| Inherits: | Object |
| Defined in: | lib/ruby_installer/runtime/console_ui.rb |
Constant Summary
-
ENABLE_EXTENDED_FLAGS =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 1700x0080 -
ENABLE_MOUSE_INPUT =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 1680x0010 -
ENABLE_PROCESSED_INPUT =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 1670x0001 -
ENABLE_QUICK_EDIT_MODE =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 1690x0040 -
ENABLE_VIRTUAL_TERMINAL_INPUT =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 1710x200 -
STD_INPUT_HANDLE =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 165-10
-
STD_OUTPUT_HANDLE =
# File 'lib/ruby_installer/runtime/console_ui.rb', line 166-11
Class Method Summary
- .new ⇒ ConsoleUi constructor
Instance Attribute Summary
- #widget rw
Instance Method Summary
- #run!
- #set_consolemode
- #unset_consolemode
-
#call_with_console_handle(win32func, *args)
private
Calling Win32API with console handle is reported to fail after executing some external command.
- #getconsolemode private
- #handle_key_input(str) private
- #main_loop private
- #register_stdin private
- #register_term_size_change private
- #setconsolemode(mode) private
Constructor Details
.new ⇒ ConsoleUi
# File 'lib/ruby_installer/runtime/console_ui.rb', line 175
def initialize @GetStdHandle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') @GetConsoleMode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'L') @SetConsoleMode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'L') @ev_r, @ev_w = IO.pipe.map(&:binmode) set_consolemode register_term_size_change register_stdin at_exit do unset_consolemode end end
Instance Attribute Details
#widget (rw)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 173
attr_accessor :
Instance Method Details
#call_with_console_handle(win32func, *args) (private)
Calling Win32API with console handle is reported to fail after executing some external command. We need to refresh console handle and retry the call again.
# File 'lib/ruby_installer/runtime/console_ui.rb', line 214
private def call_with_console_handle(win32func, *args) val = win32func.call(@hConsoleHandle, *args) return val if val != 0 @hConsoleHandle = @GetStdHandle.call(STD_INPUT_HANDLE) win32func.call(@hConsoleHandle, *args) end
#getconsolemode (private)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 222
private def getconsolemode mode = +"\0\0\0\0" call_with_console_handle(@GetConsoleMode, mode) mode.unpack1('L') end
#handle_key_input(str) (private)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 271
private def handle_key_input(str) case str when "\e[D", "\xE0K".b # cursor left .cursor(:left) when "\e[A", "\xE0H".b # cursor up .cursor(:up) when "\e[C", "\xE0M".b # cursor right .cursor(:right) when "\e[B", "\xE0P".b # cursor down .cursor(:down) when "\r" # enter unset_consolemode do .select end when /\e\x5b<0;(\d+);(\d+)m/ # Mouse left button up if .click($1.to_i - 1, $2.to_i - 2) .repaint unset_consolemode do .select end end end .repaint end
#main_loop (private)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 296
private def main_loop str = +"" while char=@ev_r.read(1) case char when "\x01" .repaint when "\x02" strlen = @ev_r.read(1).unpack1("C") str = @ev_r.read(strlen) handle_key_input(str) .repaint else raise "unexpected event: #{char.inspect}" end end end
#register_stdin (private)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 253
private def register_stdin Thread.new do str = +"" c = IO.console while char=c.read(1) str << char next if !str.valid_encoding? || str == "\e" || str == "\e[" || str == "\xE0" || str.match(/\A\e\x5b<[^Mm]*\z/) @ev_w.write [2, str.size, str].pack("CCa*") str = +"" end end end
#register_term_size_change (private)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 232
private def register_term_size_change if RUBY_PLATFORM =~ /mingw|mswin/ con = IO.console old_size = con.winsize Thread.new do loop do new_size = con.winsize if old_size != new_size old_size = new_size @ev_w.write "\x01" end sleep 1 end end else Signal.trap('SIGWINCH') do @ev_w.write "\x01" end end end
#run!
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 314
def run! .repaint main_loop end
#set_consolemode
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 192
def set_consolemode @hConsoleHandle = @GetStdHandle.call(STD_INPUT_HANDLE) @base_console_input_mode = getconsolemode setconsolemode(ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS | ENABLE_VIRTUAL_TERMINAL_INPUT) end
#setconsolemode(mode) (private)
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 228
private def setconsolemode(mode) call_with_console_handle(@SetConsoleMode, mode) end
#unset_consolemode
[ GitHub ]# File 'lib/ruby_installer/runtime/console_ui.rb', line 198
def unset_consolemode if @base_console_input_mode setconsolemode(@base_console_input_mode | ENABLE_EXTENDED_FLAGS) @base_console_input_mode = nil if block_given? begin yield ensure set_consolemode end end end end