more chanegs

This commit is contained in:
Anthony Scopatz 2016-10-28 01:36:24 -04:00
parent 3f58ada638
commit 02c47c6192
2 changed files with 98 additions and 10 deletions

View file

@ -402,11 +402,11 @@ class PopenThread(threading.Thread):
""" """
if reader is None: if reader is None:
return 0 return 0
flags = winutils.ENABLE_ECHO_INPUT | winutils.ENABLE_LINE_INPUT | winutils.ENABLE_PROCESSED_INPUT #flags = winutils.ENABLE_ECHO_INPUT | winutils.ENABLE_LINE_INPUT | winutils.ENABLE_PROCESSED_INPUT
#flags = winutils.ENABLE_WINDOW_INPUT #flags = winutils.ENABLE_WINDOW_INPUT
if ON_WINDOWS and stdbuf is sys.__stdout__: #if ON_WINDOWS and stdbuf is sys.__stdout__:
mode = winutils.get_console_mode(output=True) # mode = winutils.get_console_mode(output=True)
print("ALT MODE FLAGS", mode, flags, mode & flags) # print("ALT MODE FLAGS", mode, flags, mode & flags)
# if mode & winutils.ENABLE_PROCESSED_OUTPUT == winutils.ENABLE_PROCESSED_OUTPUT: # if mode & winutils.ENABLE_PROCESSED_OUTPUT == winutils.ENABLE_PROCESSED_OUTPUT:
# self.in_alt_mode = True # self.in_alt_mode = True
# else: # else:

View file

@ -24,9 +24,9 @@ import sys
import subprocess import subprocess
import msvcrt import msvcrt
import ctypes import ctypes
from ctypes import c_ulong, c_char_p, c_int, c_void_p from ctypes import c_ulong, c_char_p, c_int, c_void_p, POINTER, byref
from ctypes.wintypes import (HANDLE, BOOL, DWORD, HWND, HINSTANCE, HKEY, from ctypes.wintypes import (HANDLE, BOOL, DWORD, HWND, HINSTANCE, HKEY,
LPDWORD, LPSTR, SHORT, LPWSTR, LPCWSTR) LPDWORD, LPSTR, SHORT, LPWSTR, LPCWSTR, WORD, SMALL_RECT)
from xonsh.lazyasd import lazyobject from xonsh.lazyasd import lazyobject
from xonsh import lazyimps # we aren't amagamated in this module. from xonsh import lazyimps # we aren't amagamated in this module.
@ -144,7 +144,7 @@ def sudo(executable, args=None):
# TODO: Some streams were redirected, we need to manually work them # TODO: Some streams were redirected, we need to manually work them
raise NotImplementedError("Redirection is not supported") raise NotImplementedError("Redirection is not supported")
if not ShellExecuteEx(ctypes.byref(execute_info)): if not ShellExecuteEx(byref(execute_info)):
raise ctypes.WinError() raise ctypes.WinError()
wait_and_close_handle(execute_info.hProcess) wait_and_close_handle(execute_info.hProcess)
@ -219,7 +219,7 @@ def get_console_mode(fd=1):
""" """
mode = DWORD() mode = DWORD()
hcon = STDHANDLES[fd] hcon = STDHANDLES[fd]
GetConsoleMode(hcon, ctypes.byref(mode)) GetConsoleMode(hcon, byref(mode))
return mode.value return mode.value
@ -250,6 +250,15 @@ def set_console_mode(mode, fd=1):
class COORD(ctypes.Structure): class COORD(ctypes.Structure):
"""Struct from the winapi, representing coordinates in the console.
Attributes
----------
X : int
Column position
Y : int
Row position
"""
_fields_ = [("X", SHORT), _fields_ = [("X", SHORT),
("Y", SHORT)] ("Y", SHORT)]
@ -293,7 +302,7 @@ def read_console_output_character(x=0, y=0, fd=1, buf=None, bufsize=1024):
buf = ctypes.c_wchar_p(" " * bufsize) buf = ctypes.c_wchar_p(" " * bufsize)
coord = COORD(x, y) coord = COORD(x, y)
n = DWORD() n = DWORD()
ReadConsoleOutputCharacter(hcon, buf, bufsize, coord, ctypes.byref(n)) ReadConsoleOutputCharacter(hcon, buf, bufsize, coord, byref(n))
return buf.value[:n.value] return buf.value[:n.value]
@ -305,4 +314,83 @@ def pread_console(fd, buffersize, offset, buf=None):
x = offset % col x = offset % col
y = offset // cols y = offset // cols
return read_console_output_character(x=x, y=y, fd=fd, buf=buf, return read_console_output_character(x=x, y=y, fd=fd, buf=buf,
bufsize=buffersize) bufsize=buffersize)
#
# The following piece has been forked from colorama.win32
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
#
class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
"""Struct from in wincon.h. See Windows API docs
for more details.
Attributes
----------
dwSize : COORD
Size of
dwCursorPosition : COORD
Current cursor location.
wAttributes : WORD
Flags for screen buffer.
srWindow : SMALL_RECT
Actual size of screen
dwMaximumWindowSize : COORD
Maximum window scrollback size.
"""
_fields_ = [
("dwSize", COORD),
("dwCursorPosition", COORD),
("wAttributes", WORD),
("srWindow", SMALL_RECT),
("dwMaximumWindowSize", COORD),
]
@lazyobject
def GetConsoleScreenBufferInfo():
"""Returns the windows version of the get screen buffer."""
gcsbi = ctypes.windll.kernel32.GetConsoleScreenBufferInfo
gcsbi.errcheck = check_zero
gcsbi.argtypes = (
HANDLE,
POINTER(CONSOLE_SCREEN_BUFFER_INFO),
)
gcsbi.restype = BOOL
return gcsbi
def get_console_screen_buffer_info(fd=1):
"""Returns an screen buffer info object for the relevant stdbuf.
Parameters
----------
fd : int, optional
Standard buffer file descriptor, 0 for stdin, 1 for stdout (default),
and 2 for stderr.
Returns
-------
csbi : CONSOLE_SCREEN_BUFFER_INFO
Information about the console screen buffer.
"""
hcon = STDHANDLES[fd]
csbi = CONSOLE_SCREEN_BUFFER_INFO()
GetConsoleScreenBufferInfo(hcon, byref(csbi))
return csbi
def get_cursor_position(fd=1):
"""Gets the current cursor position as an (x, y) tuple."""
csbi = get_console_screen_buffer_info(fd=fd)
coord = csbi.dwCursorPosition
return (coord.X, coord.Y)
def get_cursor_offset(fd=1):
"""Gets the current cursor position as a total offset value."""
csbi = get_console_screen_buffer_info(fd=fd)
pos = csbi.dwCursorPosition
size = csbi.dwSize
return (pos.Y * size.X) + pos.X