def getConsoleSize(self): """ Fetches the console width. Torn straight from http://stackoverflow.com/questions/566746/how-to-get-console-window-width-in-python """ def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except Exception: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except Exception: pass if not cr: try: cr = (env['LINES'], env['COLUMNS']) except Exception: cr = (25, 80) self.rows = int(cr[1]) self.cols = int(cr[0]) return self.rows, self.cols
def _getTerminalSize_linux(): def ioctl_GWINSZ(fd): try: import fcntl import termios import struct cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except Exception: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except Exception: pass if not cr: try: cr = (env['LINES'], env['COLUMNS']) except Exception: return None return int(cr[1]), int(cr[0])
def __get_size_linux__(): def ioctl_get_window_size(file_descriptor): try: import fcntl, termios, struct size = struct.unpack('hh', fcntl.ioctl(file_descriptor, termios.TIOCGWINSZ, "1234")) except: return DEFAULT_TERMINAL_SIZE return size size = ioctl_get_window_size(0) or ioctl_get_window_size(1) or ioctl_get_window_size(2) if not size: try: file_descriptor = os.open(os.ctermid(), os.O_RDONLY) size = ioctl_get_window_size(file_descriptor) os.close(file_descriptor) except: pass if not size: try: size = (os.environ["LINES"], os.environ["COLUMNS"]) except: return DEFAULT_TERMINAL_SIZE return int(size[1]), int(size[0])
def getTerminalSize(): ''' get terminal dimension functions ripped from stackoverflow http://stackoverflow.com/questions/566746/how-to-get-console-window-width-in-python ''' env = os.environ def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,'1234')) except: return return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) return int(cr[1]), int(cr[0])
def get_terminal_width(): """ Attempt to determine the current terminal size. """ dim = None try: def ioctl_gwinsz(fd): try: import fcntl import struct import termios cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except Exception: return return cr dim = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) if not dim: try: fd = os.open(os.ctermid(), os.O_RDONLY) dim = ioctl_gwinsz(fd) os.close(fd) except Exception: pass except Exception: pass if dim: return int(dim[1]) else: # This allows tests to run return 1000
def get_term_width(): """Tries to get the current terminal width, returns 80 if it cannot.""" env = os.environ def ioctl_try(os_fd): """Ask the fcntl module for the window size from the os_fd.""" try: return struct.unpack( str("hh"), fcntl.ioctl(os_fd, termios.TIOCGWINSZ, "1234") ) except Exception: # pokemon! return None termsize = ioctl_try(0) or ioctl_try(1) or ioctl_try(2) if not termsize: try: os_fd = os.open(os.ctermid(), os.O_RDONLY) termsize = ioctl_try(os_fd) os.close(os_fd) except Exception: pass if not termsize: try: termsize = (env["LINES"], env["COLUMNS"]) except (IndexError, KeyError): termsize = (25, 80) return int(termsize[1])
def _get_terminal_size_linux(): # pragma: no cover def ioctl_GWINSZ(fd): try: import fcntl import termios cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) return cr except: pass cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (os.environ["LINES"], os.environ["COLUMNS"]) except: return None return int(cr[1]), int(cr[0])
def getTerminalSize(): """ Devuelve el tamaño de la consola :return: Integer """ env = os.environ def ioctl_GWINSZ(fd): try: import fcntl # @UnresolvedImport import termios # @UnresolvedImport import struct cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) return int(cr[1]), int(cr[0])
def getTerminalSize(): from os import environ as env def ioctl_GWINSZ(fd): try: import fcntl import termios import struct import os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: return None return int(cr[1]), int(cr[0])
def _get_terminal_size_linux(): ''' From https://gist.github.com/jtriley/1108174 ''' def ioctl_GWINSZ(fd): try: import fcntl import termios cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) return cr except: pass cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (os.environ['LINES'], os.environ['COLUMNS']) except: return None return int(cr[1]), int(cr[0])
def _get_terminal_size_linux(): def ioctl_GWINSZ(fd): try: import fcntl # Is this required # import termios cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) return cr except: pass cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (os.environ['LINES'], os.environ['COLUMNS']) except: return None return int(cr[1]), int(cr[0])
def get_terminal_size(): env = os.environ def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (None, None) if cr[0]: row = int(cr[0]) else: row = None if cr[1]: col = int(cr[1]) else: col = None return (row, col)
def getTerminalSize(): """ returns (lines:int, cols:int) """ def ioctl_GWINSZ(fd): # These two imports are only present on POSIX systems, so they must be # guarded by a try block. import fcntl import termios return struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) # try stdin, stdout, stderr for fd in (0, 1, 2): try: return ioctl_GWINSZ(fd) except: pass # try os.ctermid() try: fd = os.open(os.ctermid(), os.O_RDONLY) try: return ioctl_GWINSZ(fd) finally: os.close(fd) except: pass # try environment variables try: return tuple(int(os.getenv(var)) for var in ("LINES", "COLUMNS")) except: pass # i give up. return default. return (25, 80)
def get_terminal_size(): ''' Gets width and height of terminal viewport ''' default_size = (30, 120) env = os.environ def ioctl_gwinsz(file_d): ''' Helper to get console size ''' try: sizes = struct.unpack( 'hh', fcntl.ioctl(file_d, termios.TIOCGWINSZ, '1234')) except Exception: sizes = default_size return sizes sizes = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) if not sizes: try: file_d = os.open(os.ctermid(), os.O_RDONLY) sizes = ioctl_gwinsz(file_d) os.close(file_d.fileno()) except Exception: pass if not sizes: try: sizes = (env['LINES'], env['COLUMNS']) except Exception: sizes = default_size return int(sizes[1]), int(sizes[0])
def getTerminalSize(): import os env = os.environ def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) ### Use get(key[, default]) instead of a try/catch #try: # cr = (env['LINES'], env['COLUMNS']) #except: # cr = (25, 80) return int(cr[1]), int(cr[0])
def getTerminalSize(): def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: import os try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if cr: return int(cr[1]), int(cr[0]) try: h, w = os.popen("stty size", "r").read().split() return int(w), int(h) except: pass return 80, 25
def _get_terminal_size_linux(): def ioctl_GWINSZ(fd): try: import fcntl import termios import struct import os cr = struct.unpack( 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr or cr == (0, 0): try: from os import environ as env cr = (env['LINES'], env['COLUMNS']) except: return None return int(cr[1]), int(cr[0])
def get_terminal_size(): """Returns a tuple (x, y) representing the width(x) and the height(x) in characters of the terminal window.""" def ioctl_GWINSZ(fd): try: import fcntl import termios import struct cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None if cr == (0, 0): return None if cr == (0, 0): return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) return int(cr[1]), int(cr[0])
def getTerminalSize(): def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (env['LINES'], env['COLUMNS']) except: cr = (25, 80) if forceWidth: cr = ( cr[0], forceWidth) if forceHeight: cr = ( forceHeight, cr[1]) return int(cr[1]), int(cr[0])
def get_terminal_size(): """ Returns the size of the current terminal in the form of (rows, cols). """ env = os.environ def ioctl_GWINSZ(fd): try: cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (env['LINES'], env['COLUMNS']) except: cr = (25, 80) return int(cr[0]), int(cr[1])
def getTerminalSize(): """ @rtype: tuple of (int,int) @return: Console dimensions as: width, height """ import os env = os.environ def ioctl_GWINSZ(fd): try: import fcntl, termios, struct, os cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) return int(cr[1]), int(cr[0])
def check_term_size(self): def check_term(tid): try: #Format should be Height, Width, X Pixels and Y Pixels #Can't figure out why, but TIOCGWINSZ requires an argument the size of what it's going to return #but doesn't actually modify it (which is how I'd write it)-- so if you want the (H) you give it #one short, (H,W) two shorts (H,W,X) three shorts and (H,W,X,Y) four shorts #Since I only care about the H,W I created a seed of two shorts hw = struct.unpack("HH", fcntl.ioctl(tid, termios.TIOCGWINSZ, self.seed)) except: return None return hw #Check the standard i/o's first hw = check_term(sys.stdin) or check_term(sys.stdout) or check_term(sys.stderr) if hw is None: try: #Try the controlling terminal tid = os.open(os.ctermid(), os.O_RDONLY) hw = check_term(tid) os.close(tid) except: try: #Try the env hw = (os.environ['LINES'], os.environ['COLUMNS']) except: #My default local windows size is 80x24 -- good enough for me! #I mean either way this is a pretty last ditch effort case #and hopefully shouldn't happen hw = (24, 80) return hw
def get_terminal_size(): env = os.environ def ioctl_GWINSZ(fd): try: import fcntl import termios import struct cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) return int(cr[1]), int(cr[0])
def getTerminalSize(): ''' max_x, max_y = getTerminalSize() ''' import os def ioctl_GWINSZ(fd): try: import fcntl, termios, struct cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: env = os.environ cr = (env['LINES'], env['COLUMNS']) except: cr = (25, 80) return int(cr[1]), int(cr[0])
def terminal_get_size(default_size=(25, 80)): """ Return (number of rows, number of columns) for the terminal, if they can be determined, or `default_size` if they can't. """ def ioctl_gwinsz(fd): # TABULATION FUNCTIONS try: # Discover terminal width import fcntl import termios import struct return struct.unpack( 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234') ) except Exception: return None # try open fds size = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) if not size: # ...then ctty try: fd = os.open(os.ctermid(), os.O_RDONLY) size = ioctl_gwinsz(fd) os.close(fd) except Exception: pass if not size: # env vars or finally defaults try: size = (os.environ.get('LINES'), os.environ.get('COLUMNS')) except Exception: return default_size return map(int, size)
def get_terminal_size(): ''' Determines and returns the current terminal's dimensions. ''' import os env = os.environ def ioctl_gwinsz(fd): try: import fcntl import termios import struct cr = struct.unpack( 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return return cr cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_gwinsz(fd) os.close(fd) except: pass if not cr: cr = (env.get('LINES', 25), env.get('COLUMNS', 80)) return int(cr[1]), int(cr[0])
def getTerminalSize(): """ returns (lines:int, cols:int) """ import os, struct def ioctl_GWINSZ(fd): import fcntl, termios return struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) # try stdin, stdout, stderr for fd in (0, 1, 2): try: return ioctl_GWINSZ(fd) except: pass # try os.ctermid() try: fd = os.open(os.ctermid(), os.O_RDONLY) try: return ioctl_GWINSZ(fd) finally: os.close(fd) except: pass # try `stty size` try: return tuple(int(x) for x in os.popen("stty size", "r").read().split()) except: pass # try environment variables try: return tuple(int(os.getenv(var)) for var in ("LINES", "COLUMNS")) except: pass # i give up. return default. return (25, 80)
def getTerminalSize(): if platform.system() != 'Linux': return 80, 20 import fcntl import termios env = os.environ def ioctl_GWINSZ(fd): try: cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) except: return 80, 20 return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (env['LINES'], env['COLUMNS']) except: cr = (25, 80) return int(cr[1]), int(cr[0])
def GetTermLines(): """Returns number of terminal lines.""" # fcntl isn't supported in Windows. try: import fcntl # pylint: disable=g-import-not-at-top import termios # pylint: disable=g-import-not-at-top except ImportError: return _DEFAULT_LINES def ioctl_GWINSZ(fd): # pylint: disable=invalid-name try: return struct.unpack( 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))[0] except: # pylint: disable=bare-except return 0 # Failure (so will retry on different file descriptor below). # Try to find a valid number of lines from termio for stdin, stdout, # or stderr, in that order. ioc = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not ioc: try: fd = os.open(os.ctermid(), os.O_RDONLY) ioc = ioctl_GWINSZ(fd) os.close(fd) except: # pylint: disable=bare-except pass if not ioc: ioc = os.environ.get('LINES', _DEFAULT_LINES) return int(ioc)
def get_terminal_size(): """Returns a tuple (x, y) representing the width(x) and the height(x) in characters of the terminal window.""" def ioctl_GWINSZ(fd): try: import fcntl, struct cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) except: return None return cr cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) if not cr: try: fd = os.open(os.ctermid(), os.O_RDONLY) cr = ioctl_GWINSZ(fd) os.close(fd) except: pass if not cr: try: cr = (env["LINES"], env["COLUMNS"]) except: cr = (25, 80) return int(cr[1]), int(cr[0])
def main(args=sys.argv): global screen_size args, items = parse_args(args[1:], options_spec, usage, help_text, '{} +kitten icat'.format(appname)) if args.print_window_size: screen_size_function.ans = None with open(os.ctermid()) as tty: ss = screen_size_function(tty)() print('{}x{}'.format(ss.width, ss.height), end='') raise SystemExit(0) if not sys.stdout.isatty(): sys.stdout = open(os.ctermid(), 'w') stdin_data = None if args.stdin == 'yes' or (not sys.stdin.isatty() and args.stdin == 'detect'): stdin_data = sys.stdin.buffer.read() if stdin_data: items.insert(0, stdin_data) sys.stdin.close() sys.stdin = open(os.ctermid(), 'r') screen_size = screen_size_function() signal.signal(signal.SIGWINCH, lambda signum, frame: setattr(screen_size, 'changed', True)) if screen_size().width == 0: if args.detect_support: raise SystemExit(1) raise SystemExit( 'Terminal does not support reporting screen sizes via the TIOCGWINSZ ioctl' ) try: args.place = parse_place(args.place) except Exception: raise SystemExit('Not a valid place specification: {}'.format(args.place)) if args.detect_support: if not detect_support(wait_for=args.detection_timeout, silent=True): raise SystemExit(1) print('file' if detect_support.has_files else 'stream', end='', file=sys.stderr) return if args.transfer_mode == 'detect': if not detect_support(wait_for=args.detection_timeout, silent=args.silent): raise SystemExit('This terminal emulator does not support the graphics protocol, use a terminal emulator such as kitty that does support it') else: detect_support.has_files = args.transfer_mode == 'file' errors = [] if args.clear: sys.stdout.buffer.write(clear_images_on_screen(delete_data=True)) if not items: return if not items: raise SystemExit('You must specify at least one file to cat') if args.place: if len(items) > 1 or (isinstance(items[0], str) and os.path.isdir(items[0])): raise SystemExit(f'The --place option can only be used with a single image, not {items}') sys.stdout.buffer.write(b'\0337') # save cursor url_pat = re.compile(r'(?:https?|ftp)://', flags=re.I) for item in items: try: process_single_item(item, args, url_pat) except NoImageMagick as e: raise SystemExit(str(e)) except ConvertFailed as e: raise SystemExit(str(e)) except OpenFailed as e: errors.append(e) if args.place: sys.stdout.buffer.write(b'\0338') # restore cursor if not errors: return for err in errors: print(err, file=sys.stderr) raise SystemExit(1)
from __future__ import print_function, division, absolute_import import contextlib import json import logging import os import sys from .progressbar import (Bar, ETA, FileTransferSpeed, Percentage, ProgressBar) from .utils import memoized try: tty = open(os.ctermid(), 'w') except (IOError, AttributeError): # apparently `os.ctermid` not available on Windows, and throws AttributeError tty = sys.stdout fetch_progress = ProgressBar(widgets=[ '', ' ', Percentage(), ' ', Bar(), ' ', ETA(), ' ', FileTransferSpeed() ], fd=tty) progress = ProgressBar(widgets=['[%-20s]' % '', '', Bar(), ' ', Percentage()], fd=tty)