Module HighLine::SystemExtensions
In: lib/highline/system_extensions.rb
HighLine\n[lib/highline.rb\nlib/highline/color_scheme.rb\nlib/highline/menu.rb\nlib/highline/question.rb\nlib/highline/system_extensions.rb] HighLine::SystemExtensions dot/f_6.png

Methods

Constants

JRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
CHARACTER_MODE = "Win32API"
STD_INPUT_HANDLE = -10   win32 console APIs
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12
ENABLE_PROCESSED_INPUT = 0x0001
ENABLE_LINE_INPUT = 0x0002
ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
ENABLE_ECHO_INPUT = 0x0004
ENABLE_WINDOW_INPUT = 0x0008
ENABLE_MOUSE_INPUT = 0x0010
ENABLE_INSERT_MODE = 0x0020
ENABLE_QUICK_EDIT_MODE = 0x0040
CHARACTER_MODE = "termios"
CHARACTER_MODE = "ncurses"   work correctly in JRuby manually installing the ffi-ncurses gem is the only way to get highline to operate correctly in JRuby. The ncurses library is only present on unix platforms so this is not a solution for using highline in JRuby on windows.
CHARACTER_MODE = "stty"

Public Instance methods

[Source]

     # File lib/highline/system_extensions.rb, line 94
 94:       def GetConsoleMode( console_handle )
 95:         @@apiGetConsoleMode ||= Win32API.new( "kernel32", "GetConsoleMode",
 96:         ['L', 'P'], 'I' )
 97: 
 98:         mode = ' ' * 4
 99:         @@apiGetConsoleMode.call(console_handle, mode)
100:         mode.unpack('L')[0]
101:       end

[Source]

     # File lib/highline/system_extensions.rb, line 110
110:       def GetConsoleScreenBufferInfo( console_handle )
111:         @@apiGetConsoleScreenBufferInfo ||=
112:         Win32API.new( "kernel32", "GetConsoleScreenBufferInfo",
113:         ['L', 'P'], 'L' )
114: 
115:         format = 'SSSSSssssSS'
116:         buf    = ([0] * format.size).pack(format)        
117:         @@apiGetConsoleScreenBufferInfo.call(console_handle, buf)
118:         buf.unpack(format)
119:       end

[Source]

    # File lib/highline/system_extensions.rb, line 87
87:       def GetStdHandle( handle_type )
88:         @@apiGetStdHandle ||= Win32API.new( "kernel32", "GetStdHandle",
89:         ['L'], 'L' )
90: 
91:         @@apiGetStdHandle.call( handle_type )
92:       end

windows savvy console echo toggler

[Source]

    # File lib/highline/system_extensions.rb, line 54
54:       def SetConsoleEcho( console_handle, on )
55:         mode = GetConsoleMode(console_handle)
56: 
57:         # toggle the console echo bit
58:         if on
59:           mode |=  ENABLE_ECHO_INPUT
60:         else
61:           mode &= ~ENABLE_ECHO_INPUT
62:         end
63: 
64:         ok = SetConsoleMode(console_handle, mode)    
65:       end

[Source]

     # File lib/highline/system_extensions.rb, line 103
103:       def SetConsoleMode( console_handle, mode )
104:         @@apiSetConsoleMode ||= Win32API.new( "kernel32", "SetConsoleMode",
105:         ['L', 'L'], 'I' )
106: 
107:         @@apiSetConsoleMode.call(console_handle, mode) != 0
108:       end

Windows savvy getc().

[Source]

    # File lib/highline/system_extensions.rb, line 33
33:       def get_character( input = STDIN )
34:         @stdin_handle ||= GetStdHandle(STD_INPUT_HANDLE)
35: 
36:         begin
37:           SetConsoleEcho(@stdin_handle, false)
38:           input.getbyte
39:         ensure
40:           SetConsoleEcho(@stdin_handle, true)
41:         end        
42:       end

Unix savvy getc(). (Second choice.)

WARNING: This method requires the external "stty" program!

[Source]

     # File lib/highline/system_extensions.rb, line 182
182:           def get_character( input = STDIN )
183:             raw_no_echo_mode
184: 
185:             begin
186:               input.getbyte
187:             ensure
188:               restore_mode
189:             end
190:           end

ncurses savvy getc(). (JRuby choice.)

[Source]

     # File lib/highline/system_extensions.rb, line 160
160:           def get_character( input = STDIN )
161:             FFI::NCurses.initscr
162:             FFI::NCurses.cbreak
163:             begin
164:               FFI::NCurses.curs_set 0
165:               input.getc
166:             ensure
167:               FFI::NCurses.endwin
168:             end
169:           end

Unix savvy getc(). (First choice.)

WARNING: This method requires the "termios" library!

[Source]

     # File lib/highline/system_extensions.rb, line 132
132:         def get_character( input = STDIN )
133:           old_settings = Termios.getattr(input)
134: 
135:           new_settings                     =  old_settings.dup
136:           new_settings.c_lflag             &= ~(Termios::ECHO | Termios::ICANON)
137:           new_settings.c_cc[Termios::VMIN] =  1
138: 
139:           begin
140:             Termios.setattr(input, Termios::TCSANOW, new_settings)
141:             input.getbyte
142:           ensure
143:             Termios.setattr(input, Termios::TCSANOW, old_settings)
144:           end
145:         end

Switched the input mode to raw and disables echo.

WARNING: This method requires the external "stty" program!

[Source]

     # File lib/highline/system_extensions.rb, line 197
197:           def raw_no_echo_mode
198:             @state = `stty -g`
199:             system "stty raw -echo cbreak isig"
200:           end

Restores a previously saved input mode.

WARNING: This method requires the external "stty" program!

[Source]

     # File lib/highline/system_extensions.rb, line 207
207:           def restore_mode
208:             system "stty #{@state}"
209:           end

A Windows savvy method to fetch the console columns, and rows.

[Source]

    # File lib/highline/system_extensions.rb, line 45
45:       def terminal_size
46:         stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE)
47: 
48:         bufx, bufy, curx, cury, wattr, left, top, right, bottom, maxx, maxy =
49:         GetConsoleScreenBufferInfo(stdout_handle)
50:         return right - left + 1, bottom - top + 1
51:       end

A ncurses savvy method to fetch the console columns, and rows.

[Source]

     # File lib/highline/system_extensions.rb, line 216
216:         def terminal_size
217:           size = [80, 40]
218:           FFI::NCurses.initscr
219:           begin
220:             size = FFI::NCurses.getmaxyx(stdscr).reverse
221:           ensure
222:             FFI::NCurses.endwin
223:           end
224:           size
225:         end

A Unix savvy method using stty that to fetch the console columns, and rows. … stty does not work in JRuby

[Source]

     # File lib/highline/system_extensions.rb, line 229
229:         def terminal_size
230:           if /solaris/ =~ RUBY_PLATFORM and
231:             `stty` =~ /\brows = (\d+).*\bcolumns = (\d+)/
232:             [$2, $1].map { |c| x.to_i }
233:           else
234:             `stty size`.split.map { |x| x.to_i }.reverse
235:           end
236:         end

[Validate]