
    ;OOf$                     ~   d dl mZmZ 	 d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	ej                  dk(  rdZddlmZ d dlmZ ndZd dlZd dlZd dlZd d	lmZ d d
lmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z#m$Z$  e%       Z& G d dee      Z' G d de	jP                        Z)d Z*e+dk(  r e*        yy)    )divisionprint_functionNntT   )win32)byrefF)util)escape)
BaseScreenRealTerminalUPDATE_PALETTE_ENTRYAttrSpecUNPRINTABLE_TRANS_TABLEINPUT_DESCRIPTORS_CHANGED)signals)PYTHON3bytesB)PopenPIPEc                   T    e Zd Zeej
                  f fd	Zd Zd Z	 	 d*dZ	d+dZ
d+dZd Zd	 Zd,d
Zd Zd Zd ZdZdZd, fd	Z fdZd Zd Zd-dZd ZdZd Zd ZdZdZdZd Z d Z!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.d&Z/d' Z0d( Z1d) Z2 xZ3S )/Screenc                    t         t        |           i | _        i | _        t        j                  | t        | j                         d| _	        d| _
        g | _        d| _        | j                          d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t2        j4                  j7                  dd      | _        | j8                  j;                  d       | _        | j8                  d	k(  | _        | j8                  j;                  d
       | _         | jC                  ddd       d| _"        tF        jF                  | _$        || _%        |tL        u r3tN        rtQ        jR                         \  }| _*        ntV        jX                  }|| _-        tQ        jR                         \  | _.        | _/        | j\                  ja                  d       y)z]Initialize a screen that directly prints escape codes to an output
        terminal.
           Tr   NFTERM xtermlinuxscreendefault)1superr   __init___pal_escape_pal_attrspecr   connect_signalr   _on_update_palette_entrycolorshas_underline	_keyqueueprev_input_resizeset_input_timeouts
screen_buf_screen_buf_canvas_resizedmaxrowgpm_mevgpm_event_pending_mouse_tracking_enabledlast_bstate_setup_G1_done
_rows_used_cyosenvirongetterm
startswithfg_bright_is_boldbg_bright_is_blinkback_color_eraseregister_palette_entry_next_timeoutsignalsignal_handler_setter_term_output_fileSTDIN
IS_WINDOWSsocket
socketpair_send_inputsysstdin_term_input_file_resize_pipe_rd_resize_pipe_wrsetblocking)selfinputoutput	__class__s      R/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/urwid/raw_display.pyr"   zScreen.__init__=   s    	fd$&t%9))	+!!"!"&!&',$#JJNN62.	%)YY%9%9'%B!B#'99#7$(II$8$8$B B##T9Y?!%+]]" "(E>*0*;*;*='t'		 % 6<5F5F5H2d2((/    c                 d    t        | j                  d      r| j                  j                         S y)zReturns the fileno of the input stream, or None if it doesn't have one.  A stream without a fileno can't participate in whatever.
        filenoN)hasattrrK   rV   rO   s    rS   _input_filenozScreen._input_filenok   s,     4(((3((//11rT   c                     |dddddd| j                         }|| j                  |<   | j                  |      | j                  |<   y )Nr   r            )r   r   X         )r'   r$   _attrspec_to_escaper#   )rO   name	attrspecsas       rS   r&   zScreen._on_update_palette_entrys   sK    !a13DKK@A#$4 !%!9!9!!<rT   Nc                     || _         |9| j                  || _        n%t        | j                  | j                         | _        || _        || _        y)a  
        Set the get_input timeout values.  All values are in floating
        point numbers of seconds.

        max_wait -- amount of time in seconds to wait for input when
            there is no input pending, wait forever if None
        complete_wait -- amount of time in seconds to wait when
            get_input detects an incomplete escape sequence at the
            end of the available input
        resize_wait -- amount of time in seconds to wait for more input
            after receiving two screen resize requests in a row to
            stop Urwid from consuming 100% cpu during a gradual
            window resize operation
        N)max_waitr@   mincomplete_waitresize_wait)rO   rf   rh   ri   s       rS   r+   zScreen.set_input_timeoutsy   sN      !!!)%-"%(););T]]%K"*&rT   c                     | j                   s$| j                  j                  t        d             d| _         d| _        y)V
        frame -- will always be None when the GLib event loop is being used.
        RTN)r.   rM   sendr   r,   rO   signumframes      rS   _sigwinch_handlerzScreen._sigwinch_handler   s1     }}  %%af-rT   c                 h    | j                          | j                          | j                  dd       y)rk   N)stopstartrq   rn   s      rS   _sigcont_handlerzScreen._sigcont_handler   s&    
 			

tT*rT   c                     | j                  t        j                  | j                         | j                  t        j                  | j
                         y)z
        Called in the startup of run wrapper to set the SIGWINCH
        and SIGCONT signal handlers.

        Override this function to call from main thread in threaded
        applications.
        N)rB   rA   SIGWINCHrq   SIGCONTru   rX   s    rS   signal_initzScreen.signal_init   s8     	""6??D4J4JK""6>>43H3HIrT   c                     | j                  t        j                  t        j                         | j                  t        j                  t        j                         y)z
        Called in the finally block of run wrapper to restore the
        SIGWINCH and SIGCONT signal handlers.

        Override this function to call from main thread in threaded
        applications.
        N)rB   rA   rx   SIG_DFLrw   rX   s    rS   signal_restorezScreen.signal_restore   s4     	""6>>6>>B""6??FNNCrT   c                 j    t        |      }|| j                  k(  ry| j                  |       || _        y)z
        Enable (or disable) mouse tracking.

        After calling this function get_input will include mouse
        click events along with keystrokes.
        N)boolr2   _mouse_trackingrO   enables     rS   set_mouse_trackingzScreen.set_mouse_tracking   s4     fT111V$'-$rT   c                     |r0| j                  t        j                         | j                          y | j                  t        j                         | j                          y N)writer
   MOUSE_TRACKING_ON_start_gpm_trackingMOUSE_TRACKING_OFF_stop_gpm_trackingr   s     rS   r   zScreen._mouse_tracking   sA    JJv//0$$&JJv001##%rT   c                    t         j                  j                  d      sy t         j                  j	                  dd      j                         j                  d      sy t        sy t        g dt        t        d      }t        j                  |j                  j                         t        j                  t         j                         || _        y )N/usr/bin/mevr   r   r   )r   z-e158T)rJ   stdout	close_fds)r7   pathisfiler8   r9   lowerr;   r   r   fcntlr   rV   F_SETFL
O_NONBLOCKr0   )rO   ms     rS   r   zScreen._start_gpm_tracking   s    ww~~n-zz~~fR(..0;;GD-T$AHHOO%u}}bmmDrT   c                     | j                   sy t        j                  | j                   j                  t        j
                         t        j                  | j                   j                  d       d | _         y Nr   )r0   r7   killpidrA   SIGINTwaitpidrX   s    rS   r   zScreen._stop_gpm_tracking   sG    ||
  &--0


4<<##Q'rT   c                    |r'| j                  t        j                         d| _        nd| _        | j	                         }|Jt        j                  |      r5t        s/t        j                  |      | _
        t        j                  |       t        rt        j                  t        j                        }t        j                  t        j                         }t        j"                         | _        t        j"                         | _        t        j(                  |t+        | j$                               t        j(                  |t+        | j&                               t        j"                  | j$                  j,                  t        j.                  z  t        j0                  z        }t        j"                  | j&                  j,                  t        j2                  z  t        j4                  z        }t        j6                  ||      }|st9        d      t        j6                  ||      }|sJ | j;                          || _        | j>                  | _         | jB                  st        s| jE                  |      | _#        tI        jJ                  | tL               | jO                  | jP                         tR        tT        |          S )zp
        Initialize the screen and input mode.

        alternate_buffer -- use alternate screen buffer
        Nr   zkError enabling virtual terminal processing, The console interface requires Windows 10 Build 10586 or above.)rV   ),r   r
   SWITCH_TO_ALTERNATE_BUFFERr5   rY   r7   isattyrE   termios	tcgetattr_old_termios_settingstty	setcbreakr   GetStdHandleSTD_OUTPUT_HANDLESTD_INPUT_HANDLEDWORD_dwOriginalOutMode_dwOriginalInModeGetConsoleModer   value"ENABLE_VIRTUAL_TERMINAL_PROCESSINGDISABLE_NEWLINE_AUTO_RETURNENABLE_WINDOW_INPUTENABLE_VIRTUAL_TERMINAL_INPUTSetConsoleModeRuntimeErrorry   _alternate_bufferrf   r@   _signal_keys_settty_signal_keys_old_signal_keysr   emit_signalr   r   r2   r!   r   _start)	rO   alternate_bufferfdhOuthIn	dwOutModedwInModeokrR   s	           rS   r   zScreen._start   s    JJv889"DODO!>biimJ)0):):2)>D&MM"%%e&=&=>D$$U%;%;<C&+kkmD#%*[[]D"  uT-D-D'EF  eD,B,B&CD ''--0X0XX[`[|[||~I{{&&,,u/H/HH5KnKnnH %%dI6B" $e f f%%c84BI2!1!]]$$Z$($8$8$8$CD!D";<T99:VT)++rT   c                 R   | j                          t        j                  | t               t        s| j                          | j                         }|Jt        j                  |      r5t        s/t        j                  |t        j                  | j                         | j                  d       d}| j                  rt        j                   }n,| j"                   t        j$                  d| j"                        }| j'                  | j)                  t+        dd            t        j,                  z   |z   t        j.                  z          | j1                          | j2                  r | j4                  | j2                  |fz     t        rt7        j8                  t6        j:                        }t7        j8                  t6        j<                        }t7        j>                  || j@                        }|sJ t7        j>                  || jB                        }|sJ tD        tF        |           y)z%
        Restore the screen.
        NFr   r   )%clearr   r   r   rE   r|   rY   r7   r   r   	tcsetattr	TCSADRAINr   r   r   r
   RESTORE_NORMAL_BUFFERr/   set_cursor_positionr   ra   r   SISHOW_CURSORflushr   r   r   r   r   r   r   r   r   r!   r   _stop)rO   r   move_cursorr   r   r   rR   s         rS   r   zScreen._stop  s    	

D";<!!>biimJb'"3"3T5O5OPU#!! 66K[[$ 444;; K

$$Xb_5ii   !	"
 	

   D  4#8#8B5#@B%%e&=&=>D$$U%;%;<C%%dD,C,CDBI2%%c4+A+ABBI2fd!#rT   c                 :    | j                   j                  |       y)zWrite some data to the terminal.

        You may wish to override this if you're using something other than
        regular files for input and output.
        N)rC   r   )rO   datas     rS   r   zScreen.writeF  s     	$$T*rT   c                 8    | j                   j                          y)zFlush the output buffer.

        You may wish to override this if you're using something other than
        regular files for input and output.
        N)rC   r   rX   s    rS   r   zScreen.flushN  s     	$$&rT   c                    | j                   sJ | j                  | j                         | j                  dd| j	                               \  }}|dgk(  rs| j
                  rg	 | j                  | j                         | j                  dd| j	                               \  }}||z  }|dgk7  rnL|dd dgk7  r|j                  d       |dgk(  rd| _        n | j
                  dk(  r
|sd| _        nd| _        |r||fS |S )ax  Return pending input as a list.

        raw_keys -- return raw keycodes as well as translated versions

        This function will immediately return all the input since the
        last time it was called.  If there is no input pending it will
        wait before returning an empty list.  The wait time may be
        configured with the set_input_timeouts function.

        If raw_keys is False (default) this function will return a list
        of keys pressed.  If raw_keys is True this function will return
        a ( keys pressed, raw keycodes ) tuple instead.

        Examples of keys returned:

        * ASCII printable characters:  " ", "a", "0", "A", "-", "/"
        * ASCII control characters:  "tab", "enter"
        * Escape sequences:  "up", "page up", "home", "insert", "f1"
        * Key combinations:  "shift f1", "meta a", "ctrl b"
        * Window events:  "window resize"

        When a narrow encoding is not enabled:

        * "Extended ASCII" characters:  "\xa1", "\xb2", "\xfe"

        When a wide encoding is enabled:

        * Double-byte characters:  "\xa1\xea", "\xb2\xd4"

        When utf8 encoding is enabled:

        * Unicode characters: u"\u00a5", u'\u253c"

        Examples of mouse events returned:

        * Mouse button press: ('mouse press', 1, 15, 13),
                              ('meta mouse press', 2, 17, 23)
        * Mouse drag: ('mouse drag', 1, 16, 13),
                      ('mouse drag', 1, 17, 13),
                      ('ctrl mouse drag', 1, 18, 13)
        * Mouse button release: ('mouse release', 0, 18, 13),
                                ('ctrl mouse release', 0, 17, 23)
        Nwindow resizer[   r   r   )_started_wait_for_input_readyr@   parse_inputget_available_raw_inputr*   ri   append)rO   raw_keyskeysrawraw2s        rS   	get_inputzScreen.get_inputV  s   X }}}""4#5#56$$T41M1M1OP	c /""t'='=**4+;+;<!--dD$:V:V:XY
dt
 /**  BCy?++O,/""%&D"##q(%&D"%&D"9rT   c                     | j                   sg S | j                  g}| j                         }||j                  |       | j                  3|j                  | j                  j
                  j                                |S )aG  
        Return a list of integer file descriptors that should be
        polled in external event loops to check for user input.

        Use this method if you are implementing your own event loop.

        This method is only called by `hook_event_loop`, so if you override
        that, you can safely ignore this.
        )r   rL   rY   r   r0   r   rV   )rO   fd_listr   s      rS   get_input_descriptorszScreen.get_input_descriptors  sk     }}I''(!>NN2<<#NN4<<..5578rT    c                    | j                   d| j                   _        d| _         | j                  D ]  }	 |j                  |        | j
                  r#|j                  | j
                         d| _        yy# t        $ r Y Rw xY w)z<
        Remove any hooks added by hook_event_loop.
        NT)_input_threadshould_exit_current_event_loop_handlesremove_watch_fileKeyError_input_timeoutremove_alarm)rO   
event_loophandles      rS   unhook_event_loopzScreen.unhook_event_loop  s     )-1D*!%D66 	F,,V4	 ##D$7$78"&D   s   A88	BBc                 H    t         r8t         j                   fd       _         j                  j	                          t         d      r j                        }n fd} j                         }|D cg c]  }j                  ||       }}| _	        yc c}w )a)  
        Register the given callback with the event loop, to be called with new
        input whenever it's available.  The callback should be passed a list of
        processed keys and a list of unprocessed keycodes.

        Subclasses may wish to use parse_input to wrap the callback.
        c                  &     j                  d      S r   )rq   rX   s   rS   <lambda>z(Screen.hook_event_loop.<locals>.<lambda>  s    4KaKabcKd rT   get_input_nonblockingc                  F    j                   j                               S r   )r   r   )callbackr   rO   s   rS   r   z(Screen.hook_event_loop.<locals>.<lambda>  s#    d..Hd&B&B&DF rT   N)
rE   ReadInputThreadrH   r   rt   rW   _make_legacy_input_wrapperr   
watch_filer   )rO   r   r   wrapperfdsr   handless   ```    rS   hook_event_loopzScreen.hook_event_loop  s     !01A1ACd!eD$$&40155j(KGFG((*@CD":((W5DD+2( Es   <Bc                       fdS )zs
        Support old Screen classes that still have a get_input_nonblocking and
        expect it to work.
        c                      j                   r"j                  j                          d _         j                         \  } }}| j                  |       _          ||       y r   )r   r   r   alarm)timeoutr   r   r   r   rO   r   s      rS   r   z2Screen._make_legacy_input_wrapper.<locals>.wrapper  sb    ""''(;(;<&*#!%!;!;!=GT3"&0&6&6w&H#T3rT   r   )rO   r   r   r   s   ```@rS   r   z!Screen._make_legacy_input_wrapper  s    
	  rT   c                     | j                         | j                         z   }| j                  r| j                  |z   }d| _        	 | j                  j	                  d       # t
        $ r Y |S w xY w)z
        Return any currently-available input.  Does not block.

        This method is only used by the default `hook_event_loop`
        implementation; you can safely ignore it if you implement your own.
        Nr   )_get_gpm_codes_get_keyboard_codes_partial_codesrL   recvOSError)rO   codess     rS   r   zScreen.get_available_raw_input  ss     ##%(@(@(BB''%/E"&D	,,11!4$ 		s   A! !	A.-A.c                      j                   r$r"j                   j                          d _         }g }	 r-t        j                  |      \  }|j	                  |       r-|}d _         j                  r|j                  d       d _
        r
 ||       y||fS # t        j                  $ rQ t        |      t              z
  }	|d|	 } _         fd}
r!j                   j                  |
       _         Y w xY w)a  
        Read any available input from get_available_raw_input, parses it into
        keys, and calls the given callback.

        The current implementation tries to avoid any assumptions about what
        the screen or event loop look like; it only deals with parsing keycodes
        and setting a timeout when an incomplete one is detected.

        `codes` should be a sequence of keycodes, i.e. bytes.  A bytearray is
        appropriate, but beware of using bytes, which only iterates as integers
        on Python 3.
        Nc                  L    d _         d _        j                   d       y )NF)wait_for_more)r   r   r   )r   r   r   rO   s   rS   _parse_incomplete_inputz3Screen.parse_input.<locals>._parse_incomplete_input*  s0    &*#&*#  %u ! FrT   r   F)r   r   r
   process_keyqueueextendr   MoreInputRequiredlenr   rh   r.   r   )rO   r   r   r   r  original_codes	processedrunprocessed_codeskr  s   ````       rS   r   zScreen.parse_input	  s    :##D$7$78"&D		'#44=*
U  % * -O"&D==_-!DMY0 o--9 '' 	A N#c%j0A,Ra0O"'DF
 &0&6&6&&(?'A#	As   .B& &A!D
	D
c                 \    g }	 | j                         }|dk  r	 |S |j                  |       *r   )_getch_nodelayr   )rO   r   codes      rS   r   zScreen._get_keyboard_codesA  s:    &&(Dax LL	 rT   c                     g }	 | j                   D| j                  r8|j                  | j                                | j                   | j                  r8|S # t        $ r}|j
                  d   dk7  r Y d }~|S d }~ww xY w)Nr      )r0   r1   r  _encode_gpm_eventIOErrorargs)rO   r   es      rS   r   zScreen._get_gpm_codesJ  s|    	,,*t/E/ET3356 ,,*t/E/E
   	vvayB 	s   AA 	A=A88A=c                    d }g }| j                         }||j                  |       | j                  3|j                  | j                  j                  j	                                	 	 |t        j
                  |g |      \  }}}	 |S t        j
                  |g ||      \  }}}	 |S # t
        j                  $ r1}|j                  d   dk7  r | j                  rg }Y d }~|S Y d }~nd }~ww xY w)Nr   r]   )	rY   r   r0   r   rV   selecterrorr  r.   )rO   r   readyr   r   werrr  s           rS   r   zScreen._wait_for_input_readyT  s    !>NN2<<#NN4<<..5578?"(--W#.KE!C
   #)--7G#5KE!C  << 66!9>==E ! s   )B( 	B( (C,;!C''C,c                 V   | j                  |      }| j                  -| j                  j                  j                         |v rd| _        | j                         }|M||v rIt        r$t        | j                  j                  d            S t        t        j                  |d            S y)NTr   r   )r   r0   r   rV   r1   rY   rE   ordrK   r   r7   read)rO   r   r  r   s       rS   _getchzScreen._getchm  s    **73<<#||""))+u4)-&!>bEk40055a8992772q>**rT   c                 t  	
 d| _         | j                  j                  j                         j	                  d      }|j                  d      	t        	      dk7  r,| j                          t        j                  | t               g S |j                  d      \  }}}t        |j                  d      d   d      }t        j                  d      d         t        j                         j                  d      d	         t        j                  d      d         t        |j                  d      d   j                         d      }| j                  x
}g 	d	|d
z  rdz  |dz  rdz  |dz  rdz  	fd
fd}|dk(  s
|dk(  s|dk(  rOdz  r
d
z  d	k(  r d	       |d
z  }dz  r
dz  d	k(  r d
       |dz  }d
z  r
dz  d	k(  r d       |dz  }n|dk(  r]dz  r d	t        j                   z          ndz  r d
t        j                   z          nd
z  r dt        j                   z          nxdz  r#
d
z  r d	t        j"                  z          |dz  }dz  r#
dz  r d
t        j"                  z          |dz  }d
z  r#
dz  r dt        j"                  z          |dz  }|dk(  rjdz  r
d
z  r d	t        j$                  z          dz  r
dz  r d
t        j$                  z          d
z  r
dz  r dt        j$                  z          nw|dk(  rrdz  r!
d
z  r d	t        j$                  dz  z          dz  r!
dz  r d
t        j$                  dz  z          d
z  r!
dz  r dt        j$                  dz  z          || _        	S )NFascii,   xr   r    r   r   r]   
      c           	      t    | z  } j                  dt        d      t        d      | dz   dz   dz   g       y )N   [M    )r  r  )blmodr%  ys    rS   append_buttonz/Screen._encode_gpm_event.<locals>.append_button  s9    HAHHr3s8SXqtQrT1R4ABrT   c                     dz  rdz  r d| z          dz  }dz  rdz  r d| z          dz  }dz  rdz  r d| z          dz  }y y y )Nr]   r   r   r[   r   )flagnextr2  r.  lasts     rS   determine_button_releasez:Screen._encode_gpm_event.<locals>.determine_button_release  sp    1uq4x)	1uq4x)	1uq4x)	 "urT      $   4   r[      (   )r1   r0   r   readlinedecodesplitr  r   r   r   r   intlstriprstripr3   r
   MOUSE_DRAG_FLAGMOUSE_RELEASE_FLAGMOUSE_MULTIPLE_CLICK_FLAG)rO   sevignr   r5  r7  r2  r.  r/  r6  r0  r%  r1  s          @@@@@@@rS   r  zScreen._encode_gpm_eventz  s   !&LL((*11':GGCLq6Q;##%&?@IggclAq#q!"((3-#R(b!#!!#&q)+b!#b!((*B0 &&&tq5SAXSr6cQhcq5SBYS	C		 8rRx281uQq"	1uQq"	1uQq"	3Y1uq6#9#99;Qq6#9#99;Qq6#9#99;1uq6#<#<<>1uq6#<#<<>1uq6#<#<<>81uq6#C#CCE1uq6#C#CCE1uq6#C#CCE2X1uq6#C#CA#EEG1uq6#C#CA#EEG1uq6#C#CA#EEGrT   c                 $    | j                  d      S r   )r   rX   s    rS   r  zScreen._getch_nodelay  s    {{1~rT   c                    d\  }}	 t        | j                  d      rt        r| j                  t        j                  k(  sJ t        j                  t
        j                        }t        j                         }t        j                  |t        |            }|dk(  r
t               |j                  j                  |j                  j                  }}nVt        j                   | j                  j#                         t$        j&                  d      }t)        j*                  d|      \  }}|| _        ||fS # t        $ r Y w xY w)z7Return the terminal dimensions (num columns, num rows).)   P   rV   r   z    hh)rW   rC   rE   rI   r   r   r   r   CONSOLE_SCREEN_BUFFER_INFOGetConsoleScreenBufferInfor   r  dwSizeYXr   ioctlrV   r   
TIOCGWINSZstructunpackr/   )rO   r1  r%  r   infor   bufs          rS   get_cols_rowszScreen.get_cols_rows  s    1	t--x811SZZ???"//0G0GHF ;;=D99&%+NBQw%i;;==$++--qA++d&<&<&C&C&E$+$6$6?C!==s3DAq !t	  		s   D$D6 6	EEc                     | j                   ry	 	 | j                  t        j                         | j	                          	 d| _         y# t
        $ r Y nw xY wI)zO
        Initialize the G1 character set to graphics mode if required.
        NT)r4   r   r
   DESIGNATE_G1_SPECIALr   r  rX   s    rS   	_setup_G1zScreen._setup_G1  sY     

6667

 #   s   /A 	AAc           	      	   !" |\  }} j                   sJ ||j                         k(  sJ  j                  r| j                  u ry j	                           j
                  ryt        j                   j                  t        dd            g} fd" "       s|j                  t        j                          j                  r j                  }ng }g } j                  !d}!"fd}	!"fd}
!"fd}d } fd	} fd
}d}|j                   |	              d!|j                         D ]  }|dz  }|r+|t        |      k  r||   |k(  r|j                  ||          6|j                  |        "       r| j                  kD  r ||      rf| _        |s "       r|j                   |d|             |!d}|rw|d   \  }}}|dd t!        d      k(  r; j"                  r/ ||      s'd}|dd |||j%                  t!        d            fgz   }n"||dz
  k(  r|dkD  r j'                  |      \  }}}d}dx}}|D ]  \  }}}t)        |t*              sJ |dk7  r|j-                  t.              }|s||k7  r|j                   ||             |}|s||k7  r|dv sJ t1        |             |dk(  r|j                  t        j2                         | |j                  t        j4                         nD|dk(  r |j                  t        j6                         n|j                  t        j8                         |}|j                  |       d} |r|\  }}} ||      }|dv sJ t1        |             t        j4                  }n&|dk(  rt        j6                  }nt        j8                  }|dz  ||t        j:                  |t        j<                  gz  }|dk(  r|j                  t        j2                         |s|j                  t        j>                          |j@                  2|j@                  \  }}| |||      t        jB                  gz  }| _         j
                  ry	 |D ];  }t)        |t*              rtD        r|jG                  dd      } jI                  |       =  jK                          | _        | _        y# tL        $ r} | jN                  d   dk7  r Y d} ~ 0d} ~ ww xY w)z"Paint screen with rendered canvas.Nr   c                        j                   d uS r   )r5   rX   s   rS   partial_displayz+Screen.draw_screen.<locals>.partial_display  s     ??$..rT   r   c                              st        j                  dd      S t         j                  t        j                         z   S r   )r
   r   CURSOR_HOME_COLmove_cursor_up)cyrb  s   rS   set_cursor_homez+Screen.draw_screen.<locals>.set_cursor_home!  s=    "$11!Q77**%%b)* +rT   c                 n            st        j                  d|       S t        j                  | z
        S r   )r
   r   move_cursor_down)r1  rf  rb  s    rS   set_cursor_rowz*Screen.draw_screen.<locals>.set_cursor_row'  s1    "$11!Q77**1r622rT   c                 P           st        j                  | |      S |kD  rBdt         j                  z   t        j                  |z
        z   t        j                  |       z   S dt         j                  z   t        j
                  |z
        z   t        j                  |       z   S )N)r
   r   rd  re  move_cursor_rightri  )r%  r1  rf  rb  s     rS   r   z/Screen.draw_screen.<locals>.set_cursor_position,  s    "$11!Q77Avv555))"q&12,,Q/0 1 6111''B/0((+, -rT   c                 P    t        |       dkD  ry| d   d   j                         ryy)Nr   Fr   r[   T)r  strip)rows    rS   is_blank_rowz(Screen.draw_screen.<locals>.is_blank_row7  s(    3x!|1vay rT   c                     | j                   v rj                   |    S t        | t              rj                  |       S j                  t        dd            S )Nr    )r#   
isinstancer   ra   rd   rO   s    rS   attr_to_escapez*Screen.draw_screen.<locals>.attr_to_escape>  s\    D$$$''**Ax(//22 ++9-/ /rT   c                     j                   j                  | |       } t        | t              xr | j                  xs | j
                  S r   )r$   r9   rs  r   standout	underlinert  s    rS   using_standout_or_underlinez7Screen.draw_screen.<locals>.using_standout_or_underlineH  s:    ""&&q!,Aa*J

0IakkJrT   r   r   Fr&  TU)N0rz  rl  zutf-8replacer]   )(r   rowsr,   r-   r_  r.   r
   HIDE_CURSORra   r   r   CURSOR_HOMEr6   contentr  r5   r   r>   rE  	_last_rowrs  r   	translater   repr	IBMPC_OFFr   IBMPC_ONSO	INSERT_ON
INSERT_OFFERASE_IN_LINE_RIGHTcursorr   r   rA  r   r   r  r  )#rO   maxresrmaxcolr/   oosbsbr1  rg  rj  r   rq  ru  ry  insrp  whitespace_at_endrd   csr  backfirstlastalastcsinsertainsertcs
inserttextiasicssr%  r/  r  rf  rb  s#   `                                @@rS   draw_screenzScreen.draw_screen  s    "}}}!!! ??qD$;$;;==!9!9(2b/!JK	/
  HHV''(??//CCXX	+	3
		-		/	K 	"#99; K	5CFAq3s8|A# 		3q6#IIcN  Q%8$"#O%,Q23 B % W
2sH#&4+@+@ ;A >(,%cr(q"cjj3.@&A%BBC&(]vz%)^^C%8NCsE!!EF" 2s!#u---9--(?@CEQJHH^A./EFbL!11;48;1}&"2"24z&))-s&//3&))-F#)* 25/(J$W-#33CT(^C3:!99D3Y!??D!99D&+$$j%%( (
 9HHV--. 334WK	5Z 88((CAa%a+""& &ADH==		 a'G)4A

1 JJL "#  	vvayA~ 	s   /AS 	S4S//S4c                    |dd }|d   \  }}}t        j                  |dt        |            }t        j                  |dt        |      |dz
        \  }}|dk(  ry|}	|d= |d   \  }
}}t        j                  |dt        |            }||z  }t        j                  |dt        |      |dz
        \  }}||d }|rt|j	                  |
||d| f       n\||d }	||}}
t        j                  |d|      }t        j                  |d||dz
        \  }}||| }|r|j	                  |
||d| f       |j	                  |||	f       |||z
  |
||ffS )a  On the last row we need to slide the bottom right character
        into place. Calculate the new line, attr and an insert sequence
        to do that.

        eg. last row:
        XXXXXXXXXXXXXXXXXXXXYZ

        Y will be drawn after Z, shifting Z into position.
        Nr   r   r   r<  )r	   
calc_widthr  calc_text_posr   )rO   rp  new_rowz_attrz_cs	last_text	last_cols	last_offsz_colz_texty_attry_cs
nlast_text
nlast_cols
nlast_offsy_coly_texts                    rS   r  zScreen._last_row  s    cr("%b'iOOIq#i.A	--i	NIaK)	5>F'*2w$FD*QJ!JZE $ 2 2:qJA!/J
,F{
+ - . yz*F!4DFAJ $ 2 29a:a<!)Jz)4Fkz* , - 	f-.efdF%;;;rT   c                      d| _         d| _        y)zh
        Force the screen to be completely repainted on the next
        call to draw_screen().
        NT)r,   setup_G1rX   s    rS   r   zScreen.clear  s    
 rT   c                 @   | j                   dk(  rGt        j                  d|j                  fz  z   }t        j                  d|j                  fz  z   }||z   S |j
                  rd|j                         dd z  }n|j                  rd|j                  z  }nh|j                  rZ|j                  dkD  r8| j                  rd	|j                  d
z
  dz   z  }n+d|j                  d
z
  dz   z  }nd|j                  dz   z  }nd}d|j                  z  d|j                  z  z   d|j                  z  z   d|j                  z  z   d|j                  z  z   d|j                  z  z   }|j                   rd|j                         dd z  }n|j"                  rd|j                  z  }nh|j$                  rZ|j                  dkD  r8| j&                  rd|j                  d
z
  dz   z  }n+d|j                  d
z
  dz   z  }nd|j                  dz   z  }nd}t        j                  d|d||dz   S )ao  
        Convert AttrSpec instance a to an escape sequence for the terminal

        >>> s = Screen()
        >>> s.set_terminal_properties(colors=256)
        >>> a2e = s._attrspec_to_escape
        >>> a2e(s.AttrSpec('brown', 'dark green'))
        '\x1b[0;33;42m'
        >>> a2e(s.AttrSpec('#fea,underline', '#d0d'))
        '\x1b[0;38;5;229;4;48;5;164m'
        fbtermz[1;%d}z[2;%d}z38;2;%d;%d;%dr   r\   z38;5;%d   z1;%dr(     z%dZ   39z1;z3;z4;z5;z7;z9;z48;2;%d;%d;%dr$  z48;5;%dz5;%dr?  d   49z[0;;r   )r:   r
   ESCforeground_numberbackground_numberforeground_trueget_rgb_valuesforeground_highforeground_basicr<   bolditalicsrx  blinkrw  strikethroughbackground_truebackground_highbackground_basicr=   )rO   rd   fgbgsts        rS   ra   zScreen._attrspec_to_escape  s    99 h!*=*=)???Bh!*=*=)???B7N 1#3#3#5a#:;BQ000B""Q&))1#6#6#:R#?@B!4!4q!82!=>BQ00256BQVVmdQYY..Q[[ !#'!''>2QZZ "&"89 !A$4$4$6q$;<RQ000B""Q&**1#6#6#:R#?@B !4!4q!83!>?BQ00256BzzRR888rT   c                 v   || j                   }|| j                  }|| j                  }|| j                   k(  r|| j                  k(  r|| j                  k(  ry|| _         || _        || _        | j                          i | _        | j
                  j                         D ]  \  }} | j                  |g|   y)a  
        colors -- number of colors terminal supports (1, 16, 88, 256, or 2**24)
            or None to leave unchanged
        bright_is_bold -- set to True if this terminal uses the bold
            setting to create bright colors (numbers 8-15), set to False
            if this Terminal can create bright colors without bold or
            None to leave unchanged
        has_underline -- set to True if this terminal can use the
            underline setting, False if it cannot or None to leave
            unchanged
        N)r'   r<   r(   r   r#   _paletteitemsr&   )rO   r'   bright_is_boldr(   pvs         rS   set_terminal_propertieszScreen.set_terminal_properties   s     >[[F!!33N  ..MT[[ ^t7M7M%M!3!33!/*

==&&( 	1CAa)D))!0a0	1rT   c                     | j                   dk(  ry| j                   dk(  rdn| j                   fd}t        t        d            D cg c]  }|f ||      z    }}| j                  |       yc c}w )z
        Attempt to set the terminal palette to default values as taken
        from xterm.  Uses number of colors from current
        set_terminal_properties() screen setting.
        r   Nr`   r_   c                 v    dk(  rt        d| z  dd      }nt        d| z  d      }|j                         d d S )Nr   zh%dr   r_   r\   )r   r  )naspecr'   s     rS   
rgb_valuesz9Screen.reset_default_terminal_palette.<locals>.rgb_valuesP  sD    | q"c2 q"f5'')"1--rT   )r'   rangerg   modify_terminal_palette)rO   r  r  entriesr'   s       @rS   reset_default_terminal_palettez%Screen.reset_default_terminal_paletteC  ss     ;;![[E!F[[F	. 27s637G1HIAA4*Q-'II$$W- Js   A3c                    | j                   dk(  rH|D cg c]  \  }}}}d||||fz   }}}}}| j                  ddj                  |      z   dz          nG|D cg c]  \  }}}}d||||fz   }}}}}| j                  ddj                  |      z   dz          | j                          y	c c}}}}w c c}}}}w )
a  
        entries - list of (index, red, green, blue) tuples.

        Attempt to set part of the terminal palette (this does not work
        on all terminals.)  The changes are sent as a single escape
        sequence so they should all take effect at the same time.

        0 <= index < 256 (some terminals will only have 16 or 88 colors)
        0 <= red, green, blue < 256
        r  z%d;%d;%d;%dz[3;r  }z%d;rgb:%02x/%02x/%02xz]4;z\N)r:   r   joinr   )rO   r  indexredgreenbluemodifys          rS   r  zScreen.modify_terminal_palette[  s     99 /68 8+E3t $uc5$&?? 8F 8JJy&!11#56 078 8+E3t .UD0II 8F 8JJy&!11(:;

88s   B0
B8
c                 0    t        ||| j                        S r   )r   r'   )rO   r  r  s      rS   r   zScreen.<lambda>t  s    HRT[[$A rT   )N      ?r  r   )T)F)NNN)4__name__
__module____qualname__rD   rI   r   r"   rY   r&   r+   rq   ru   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r\  r_  r  r  r   ra   r  r  r  r   __classcell__rR   s   @rS   r   r   <   s   "3:: ,0\= ?D'2+	J	D.&
 2,h)$X+'IV* #%'$3( MNN",6.p2Tl.#"u$p+<^19h CG1F.02 BHrT   r   c                   \     e Zd ZU dZdZdZeed<   ej                  ed<    fdZ	ddZ
 xZS )	r   zurwid Windows input readerTFr   _inputc                 >    || _         || _        t        |           y r   )r  _resizer!   r"   )rO   rP   resizerR   s      rS   r"   zReadInputThread.__init__}  s    rT   c                    t        j                  t         j                        }d}t        j                  d      }t         j                  |z  } |       }	 t        j
                  |t        |      |t        |             | j                  ry t        |j                        D ]  }||   }|j                  t         j                  j                  k(  rt|j                  j                  j                  sP| j                  j!                  |j                  j                  j"                  j$                  j'                  d             |j                  t         j                  j(                  k(  r| j+                          ی +)Ni   r   utf8)r   r   r   r   INPUT_RECORDReadConsoleInputWr   r   r  r   	EventType	KEY_EVENTEventKeyEventbKeyDownr  rm   uCharUnicodeCharencodeWINDOW_BUFFER_SIZE_EVENTr  )rO   r   MAXr  arrtypeinput_recordsiinps           rS   r  zReadInputThread.run  s     !7!78{{1~$$s*	##C})=sE$KP4::& 	#A&==EOO$=$==99--66 KK$$SYY%7%7%=%=%I%I%P%PQW%XY]]eoo&N&NNLLN		 rT   )returnN)r  r  r  rb   daemonr   r~   __annotations__rF   r"   r  r  r  s   @rS   r   r   w  s+    'DFKMM
rT   r   c                  ,    dd l } | j                          y r   )doctesttestmod)r  s    rS   _testr    s    OOrT   __main__),
__future__r   r   r7   r  rX  rI   rA   rF   	threadingrb   rE   r   r   ctypesr   r   r   r   urwidr	   r
   urwid.display_commonr   r   r   r   r   r   r   urwid.compatr   r   r   
subprocessr   r   objectrD   r   Threadr   r  r  r   rT   rS   <module>r     s   , 0 
   
    77d?JJ     * * "xBZ xBv! i&&  F Z	G rT   