
xYc           @  s  d  d l  m Z d  d l m Z m Z m Z m Z m Z m Z m	 Z	 m
 Z
 d  d l m Z d  d l m Z d  d l m Z d  d l m Z m Z m Z m Z m Z d  d l Z d  d l Z d f Z d	   Z e Z d
 Z d e f d     YZ d e f d     YZ  d f  d     YZ! d f  d     YZ" d   Z# e# e!  Z$ e# e"  Z% e& e$  e& e  k sit'  e& e%  e& e  k st'  d e( f d     YZ) d S(   i(   t   unicode_literals(   t   windllt   byreft   ArgumentErrort   c_chart   c_longt   c_ulongt   c_uintt   pointer(   t   DWORD(   t   Output(   t   ANSI_COLOR_NAMES(   t   CONSOLE_SCREEN_BUFFER_INFOt   STD_OUTPUT_HANDLEt   STD_INPUT_HANDLEt   COORDt
   SMALL_RECTNu   Win32Outputc         C  s   t  |  j d |  j d @B S(   uH  
    Turns a COORD object into a c_long.
    This will cause it to be passed by value instead of by reference. (That is what I think at least.)

    When runing ``ptipython`` is run (only with IPython), we often got the following error::

         Error in 'SetConsoleCursorPosition'.
         ArgumentError("argument 2: <class 'TypeError'>: wrong type",)
     argument 2: <class 'TypeError'>: wrong type

    It was solved by turning ``COORD`` parameters into a ``c_long`` like this.

    More info: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686025(v=vs.85).aspx
    i   i  (   R   t   Yt   X(   t   coord(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   _coord_byval   s    u!   prompt-toolkit-windows-output.logt   NoConsoleScreenBufferErrorc           B  s   e  Z d  Z d   Z RS(   u   
    Raised when the application is not running inside a Windows Console, but
    the user tries to instantiate Win32Output.
    c         C  sU   d t  j j d d  k } | r5 d t  j d } n d } t t |   j |  d  S(   Nu   xtermu   TERMu    u   Found %s, while expecting a Windows console. Maybe try to run this program using "winpty" or run it in cmd.exe instead. Or otherwise, in case of Cygwin, use the Python executable that is compiled for Cygwin.u2   No Windows console found. Are you running cmd.exe?(   t   ost   environt   gett   superR   t   __init__(   t   selft   xtermt   message(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR   0   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR   +   s   t   Win32Outputc           B  sF  e  Z d  Z e d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! d    Z" d!   Z# e$ d"    Z% RS(#   uW   
    I/O abstraction for rendering to Windows consoles.
    (cmd.exe and similar.)
    c         C  s   | |  _  g  |  _ | |  _ t j j t  |  _ t |  _	 t
   |  _ |  j   } | r` | j n d |  _ t r t t d  |  _ n  d  S(   Ni   u   ab(   t   use_complete_widtht   _buffert   stdoutR   t   kernel32t   GetStdHandleR   t   hconsolet   Falset   _in_alternate_screent   ColorLookupTablet   color_lookup_tablet   get_win32_screen_buffer_infot   wAttributest   default_attrst   _DEBUG_RENDER_OUTPUTt   opent   _DEBUG_RENDER_OUTPUT_FILENAMEt   LOG(   R   R$   R"   t   info(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR   D   s    				c         C  s   |  j  j   S(   u    Return file descriptor. (   R$   t   fileno(   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR4   V   s    c         C  s
   |  j  j S(   u"    Return encoding used for stdout. (   R$   t   encoding(   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR5   Z   s    c         C  s   |  j  j |  d  S(   N(   R#   t   append(   R   t   data(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   write^   s    c         C  s   |  j  |  d S(   u@    For win32, there is no difference between write and write_raw. N(   R8   (   R   R7   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt	   write_rawa   s    c         C  s   d d l  m } |  j   } |  j r4 | j j } n | j j | j j } | j j	 | j j
 d } | j j d } t | |  } | d | d |  S(   Ni(   t   Sizei   t   rowst   columns(   t   prompt_toolkit.layout.screenR:   R,   R"   t   dwSizeR   t   srWindowt   Rightt   Leftt   Bottomt   Topt   min(   R   R:   R3   t   widtht   heightt   maxwidth(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   get_sizee   s    	c         O  s)  |  j    t r |  j j d | j j d  d  |  j j d d j g  | D] } d | ^ qM  j d  d  |  j j d d j g  | D] } d t |  ^ q  j d  d  |  j j    n  y | | |   SWnE t k
 r$} t r%|  j j d | j | | f j d   q%n Xd S(   u2   
        Flush and call win API function.
        u   %ru   utf-8s   
s        u   , u       Error in %r %r %s
N(	   t   flushR/   R2   R8   R   t   encodet   joint   typeR   (   R   t   funct   at   kwt   it   e(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   _winapiz   s    
$AGc         C  sE   |  j    t   } t j j |  j t |   } | r; | St  d S(   u,   
        Return Screen buffer info.
        N(   RI   R   R   R%   t   GetConsoleScreenBufferInfoR'   R   R   (   R   t   sbinfot   success(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR,      s    
	c         C  s2   t  | t j  s t  |  j t j j |  d S(   u%   
        Set terminal title.
        N(   t
   isinstancet   sixt	   text_typet   AssertionErrorRR   R   R%   t   SetConsoleTitleW(   R   t   title(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt	   set_title   s    c         C  s   |  j  t j j d  d  S(   Nu    (   RR   R   R%   RZ   (   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   clear_title   s    c         C  s[   t  d d  } |  j   } | j j | j j } |  j d d d d  |  j | |  d  S(   Ni    t   rowt   column(   R   R,   R>   R   R   t   cursor_gotot   _erase(   R   t   startRT   t   length(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   erase_screen   s
    c         C  sZ   |  j    } | j } | j } | j | j | j | j | j j } |  j | |  d  S(   N(   R,   R>   t   dwCursorPositionR   R   Ra   (   R   RT   t   sizeRb   Rc   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt
   erase_down   s
    		(c         C  s?   |  j    } | j } | j j | j j } |  j | |  d S(   u	   
        N(   R,   Re   R>   R   Ra   (   R   RT   Rb   Rc   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   erase_end_of_line   s    	c         C  s   t    } |  j t j j |  j t d  t |  t |  t	 |   |  j
   } |  j t j j |  j | j | t |  t	 |   d  S(   Nt    (   R   RR   R   R%   t   FillConsoleOutputCharacterAR'   R   R	   R   R   R,   t   FillConsoleOutputAttributeR-   (   R   Rb   Rc   t   chars_writtenRT   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyRa      s    	!c         C  s#   |  j  t j j |  j |  j  d S(   u0    Reset the console foreground/background color. N(   RR   R   R%   t   SetConsoleTextAttributeR'   R.   (   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   reset_attributes   s    c   	      C  s   | \ } } } } } } } |  j  } | d  k	 rS | d @} | |  j j |  O} n  | d  k	 r | d @} | |  j j |  O} n  | r | d @| d @d >B| d @d ?B} n  |  j t j j |  j	 |  d  S(   Ni   i   i   i   iii (
   R.   t   NoneR+   t   lookup_fg_colort   lookup_bg_colorRR   R   R%   Rm   R'   (	   R   t   attrst   fgcolort   bgcolort   boldt	   underlinet   italict   blinkt   reverse(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   set_attributes   s    	

%c         C  s   d  S(   N(    (   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   disable_autowrap   s    c         C  s   d  S(   N(    (   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   enable_autowrap   s    i    c         C  s;   t  d | d |  } |  j t j j |  j t |   d  S(   Nt   xt   y(   R   RR   R   R%   t   SetConsoleCursorPositionR'   R   (   R   R^   R_   t   pos(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR`     s    c         C  sN   |  j    j } t | j | j |  } |  j t j j |  j	 t
 |   d  S(   N(   R,   Re   R   R   R   RR   R   R%   R   R'   R   (   R   t   amountt   srR   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt	   cursor_up  s    c         C  s   |  j  |  d  S(   N(   R   (   R   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   cursor_down  s    c         C  sW   |  j    j } t t d | j |  | j  } |  j t j j	 |  j
 t |   d  S(   Ni    (   R,   Re   R   t   maxR   R   RR   R   R%   R   R'   R   (   R   R   R   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   cursor_forward  s    "c         C  s   |  j  |  d  S(   N(   R   (   R   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   cursor_backward  s    c         C  s   |  j  s |  j j   d Sd j |  j   } t rc |  j j d | j d  d  |  j j   n  xP | D]H } t   } t	 j
 j |  j | d t |  d  } | d k sj t  qj Wg  |  _  d S(   u3   
        Write to output stream and flush.
        Nu    u   %ru   utf-8s   
i   i    (   R#   R$   RI   RK   R/   R2   R8   RJ   R	   R   R%   t   WriteConsoleWR'   R   Ro   RY   (   R   R7   t   bt   writtent   retval(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyRI     s    	!	'c         C  s$   |  j    } | j j | j j d S(   Ni   (   R,   R?   RB   Re   R   (   R   R3   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   get_rows_below_cursor_position4  s    c         C  s   |  j    } | j } | j } t   } d | _ | j | j | _ | j | j } d | j | j k  ox | d k  n r | j | _ n t	 | | j  | _ | j | | _ |  j
 t j j |  j t t |   d S(   u   
        To be called before drawing the prompt. This should scroll the console
        to left, with the cursor at the bottom (if possible).
        i    i   N(   R,   R?   Re   R   RA   R@   RB   RC   R   R   RR   R   R%   t   SetConsoleWindowInfoR'   t   TrueR   (   R   R3   R   t
   cursor_post   resultt
   win_height(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   scroll_buffer_to_prompt8  s    				*c         C  sx   |  j  st d } d } |  j t j j | | Bt d  d t d  d  } |  j t j j |  | |  _ t	 |  _  n  d S(   u0   
        Go to alternate screen buffer.
        I       i   @i    i   N(
   R)   RR   R   R%   t   CreateConsoleScreenBufferR	   Ro   t   SetConsoleActiveScreenBufferR'   R   (   R   t   GENERIC_READt   GENERIC_WRITEt   handle(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   enter_alternate_screenT  s    		c         C  si   |  j  re |  j t j j t  } |  j t j j |  |  j t j j |  j  | |  _ t	 |  _  n  d S(   u6   
        Make stdout again the active buffer.
        N(
   R)   RR   R   R%   R&   R   R   t   CloseHandleR'   R(   (   R   R$   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   quit_alternate_screend  s    		c         C  sd   d } t  j j t  } t   } |  j t  j j | t |   |  j t  j j | | j	 | B d  S(   Ni   (
   R   R%   R&   R   R	   RR   t   GetConsoleModeR   t   SetConsoleModet   value(   R   t   ENABLE_MOUSE_INPUTR   t   original_mode(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   enable_mouse_supporto  s
    	c         C  se   d } t  j j t  } t   } |  j t  j j | t |   |  j t  j j | | j	 | @ d  S(   Ni   (
   R   R%   R&   R   R	   RR   R   R   R   R   (   R   R   R   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   disable_mouse_supportw  s
    	c         C  s   d  S(   N(    (   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   hide_cursor  s    c         C  s   d  S(   N(    (   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   show_cursor  s    c         C  s8   t  j j   } d } t  j j | d d t |   d S(   u$  
        Call win32 API to refresh the whole Window.

        This is sometimes necessary when the application paints background
        for completion menus. When the menu disappears, it leaves traces due
        to a bug in the Windows Console. Sending a repaint request solves it.
        i   N(   R   R%   t   GetConsoleWindowt   user32t   RedrawWindowRo   R   (   t   clsR   t   RDW_INVALIDATE(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   win32_refresh_window  s    
(&   R   R   R    R(   R   R4   R5   R8   R9   RH   RR   R,   R\   R]   Rd   Rg   Rh   Ra   Rn   Rz   R{   R|   R`   R   R   R   R   RI   R   R   R   R   R   R   R   R   t   classmethodR   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR!   ?   sD   							"																									t   FOREGROUND_COLORc           B  s>   e  Z d  Z d Z d Z d Z d Z d Z d Z d Z	 d Z
 RS(	   i    i   i   i   i   i   i   i   i   (   R   R   t   BLACKt   BLUEt   GREENt   CYANt   REDt   MAGENTAt   YELLOWt   GRAYt	   INTENSITY(    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR     s   t   BACKROUND_COLORc           B  s>   e  Z d  Z d Z d Z d Z d Z d Z d Z d Z	 d Z
 RS(	   i    i   i    i0   i@   iP   i`   ip   i   (   R   R   R   R   R   R   R   R   R   R   R   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR     s   c         C  s   i |  j  d 6|  j  d 6|  j  |  j Bd 6|  j d 6|  j |  j Bd 6|  j d 6|  j d 6|  j d 6|  j d	 6|  j d
 6|  j d 6|  j |  j Bd 6|  j |  j Bd 6|  j |  j Bd 6|  j |  j Bd 6|  j |  j Bd 6|  j |  j Bd 6S(   uJ    Create a table that maps the 16 named ansi colors to their Windows code. u   ansidefaultu	   ansiblacku   ansidarkgrayu   ansilightgrayu	   ansiwhiteu   ansidarkredu   ansidarkgreenu	   ansibrownu   ansidarkblueu
   ansipurpleu   ansitealu   ansiredu	   ansigreenu
   ansiyellowu   ansiblueu   ansifuchsiau   ansiturquoise(	   R   R   R   R   R   R   R   R   R   (   t	   color_cls(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   _create_ansi_color_dict  s$    








R*   c           B  sJ   e  Z d  Z d   Z e d    Z d   Z d   Z d   Z d   Z	 RS(   u8   
    Inspired by pygments/formatters/terminal256.py
    c         C  s   |  j    |  _ i  |  _ d  S(   N(   t   _build_color_tablet   _win32_colorst
   best_match(   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR     s    c          C  s   t  }  t } d d d |  j | j f d d d |  j | j f d d d |  j | j f d d d |  j | j f d d d |  j | j f d d d |  j | j f d d d |  j | j f d d d |  j	 | j	 f d d d |  j |  j
 B| j | j
 Bf d d d |  j |  j
 B| j | j
 Bf d d d |  j |  j
 B| j | j
 Bf d d d |  j |  j
 B| j | j
 Bf d d d |  j |  j
 B| j | j
 Bf d d d |  j |  j
 B| j | j
 Bf d d d |  j |  j
 B| j | j
 Bf d d d |  j	 |  j
 B| j	 | j
 Bf g S(   u<   
        Build an RGB-to-256 color conversion table
        i    i   i   iD   i   (   R   R   R   R   R   R   R   R   R   R   R   (   t   FGt   BG(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR     s$    &&&&&&&c         C  s   d } d } d } xy |  j  D]n \ } } }	 }
 } | | } | | } | |	 } | | | | | | } | | k  r |
 } | } | } q q W| | f S(   Ni  i   i    i i (   R   (   R   t   rt   gR   t   distancet   fg_matcht   bg_matcht   r_t   g_t   b_t   fg_t   bg_t   rdt   gdt   bdt   d(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   _closest_color  s    


c         C  s   |  j  j | d   } | d  k r y t t |  d  } Wn t k
 rS d } n X| d ?d @} | d ?d @} | d @} |  j | | |  } | |  j  | <n  | S(   Ni   i    i   i   (   R   R   Ro   t   intt   strt
   ValueErrorR   (   R   t   colort   indexest   rgbR   R   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   _color_indexes  s    

c         C  s)   | t  k r t  | S|  j |  d Sd S(   u   
        Return the color for use in the
        `windll.kernel32.SetConsoleTextAttribute` API call.

        :param fg_color: Foreground as text. E.g. 'ffffff' or 'red'
        i    N(   t   FG_ANSI_COLORSR   (   R   t   fg_color(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyRp     s    c         C  s)   | t  k r t  | S|  j |  d Sd S(   u   
        Return the color for use in the
        `windll.kernel32.SetConsoleTextAttribute` API call.

        :param bg_color: Background as text. E.g. 'ffffff' or 'red'
        i   N(   t   BG_ANSI_COLORSR   (   R   t   bg_color(    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyRq   !  s    (
   R   R   R    R   t   staticmethodR   R   R   Rp   Rq   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyR*     s   				(*   t
   __future__R    t   ctypesR   R   R   R   R   R   R   R   t   ctypes.wintypesR	   t   prompt_toolkit.rendererR
   t   prompt_toolkit.stylesR   t   prompt_toolkit.win32_typesR   R   R   R   R   R   RW   t   __all__R   R(   R/   R1   t	   ExceptionR   R!   R   R   R   R   R   t   setRY   t   objectR*   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/terminal/win32_output.pyt   <module>   s,   :(		 W	