class Pry::TerminalInfo

def self.actual_screen_size

def self.actual_screen_size
  [
    # Some readlines also provides get_screen_size.
    # Readline comes before IO#winsize because jruby sometimes defaults winsize to [25, 80]
    readline_screen_size,
    # io/console adds a winsize method to IO streams.
    # rescue nil for jruby 1.7.0 [jruby/jruby#354]
    $stdout.tty? && $stdout.respond_to?(:winsize) && ($stdout.winsize rescue nil),
    # Otherwise try to use the environment (this may be out of date due
    # to window resizing, but it's better than nothing).
    [ENV["LINES"] || ENV["ROWS"], ENV["COLUMNS"]],
    # If the user is running within ansicon, then use the screen size
    # that it reports (same caveats apply as with ROWS and COLUMNS)
    ENV['ANSICON'] =~ /\((.*)x(.*)\)/ && [$2, $1],
  ].detect do |(_, cols)|
    cols.to_i > 0
  end
end

def self.readline_screen_size

def self.readline_screen_size
  Readline.get_screen_size if Readline.respond_to?(:get_screen_size)
rescue Java::JavaLang::NullPointerException
  # This rescue won't happen on jrubies later than:
  #     https://github.com/jruby/jruby/pull/436
  nil
end

def self.screen_size

If the window size cannot be determined, return nil.

Return a pair of [rows, columns] which gives the size of the window.
def self.screen_size
  rows, cols = actual_screen_size
  if rows && cols
    [rows.to_i, cols.to_i]
  else
    nil
  end
end