
    jj                    H   U d dl 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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d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZm Z  d d
l!m"Z"m#Z# ddl$m%Z%m&Z&m'Z' ejP                  rd dl)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ dZ0 e1d      Z2dZ3i ddd e1d      ddde2de2 dde2 dde2 dde2 d d!e2 d"d#e2 d$d%e2 d&d'e2 d(d)e2 d*d+e2 d,d-e2 d.d/e2 d0d1e2 d2e2 d3e2 d4e2 d5e2 d6e2 d7e2 d8e2 d9e2 d:e2 d;e2 d<e2 d=d>Z4e2 d?e2 d@e2 dAe2 dBe2 dCe2 dDe2 dEe2 dFe2 dGdH	Z5 G dI dJejl                        Z7 G dK dLejl                        Z8i dM e8dddN       dO e8dddP       dQ e8dddR       dS e8dddT       dU e8dddV       dW e8dddX       dY e8dddZ       d[ e8ddd\       d] e8d^dd_       d` e8dd da       db e8dd dc       dd e8ddde       df e8dddg       dh e8dddi       dj e8dddk       dl e7dmdS      dn e8d d do        e8dddp        e7dmdQ       e7dmd]       e8dd dq        e8dd dr        e8dd ds        e8dd dt        e8dd du        e8dd dv        e8d^d dw        e8d d dx        e8d d dy        e7dmd[      dzZ9d{e:d|<   dZ;d}e:d~<   d^Z<de:d<    edd       G d d             Z= G d d      Z> G d de      Z? G d de#      Z@y)    )annotationsN)deque)suppress)	dataclass)
event_looputil)Canvas)AttrSpecRealTerminal)ALT_DEC_SPECIAL_CHARSDEC_SPECIAL_CHARS)SizingWidget   )_BASIC_COLORS_color_desc_256_color_desc_true)CallableIterableMappingSequence)Literal          enter	backspace   tab	escupz[Adownz[Brightz[Cleftz[Dhomez[1~insertz[2~deletez[3~endz[4~page upz[5~	page downz[6~begin pastez[200~	end pastez[201~f1z[[Az[[Bz[[Cz[[Dz[[Ez[17~z[18~z[19~z[20~z[21~z[23~z[24~)f2f3f4f5f6f7f8f9f10f11f12OAOBOCODOPOQOROSz[15~)	r#   r$   r%   r&   r/   r0   r1   r2   r3   c                  "    e Zd ZU ded<   ded<   y)CSIAliasstr
alias_markbytesaliasN__name__
__module____qualname____annotations__ r   T/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/urwid/vterm.pyrD   rD   g   s    OLr   rD   c                  ,    e Zd ZU ded<   ded<   ded<   y)
CSICommandintnum_argsdefaultz3Callable[[TermCanvas, list[int], bool], typing.Any]callbackNrI   rN   r   rO   rQ   rQ   l   s    MLAAr   rQ      @c                ,    | j                  |d         S Nr   )chars)insert_charssnumberqs      rO   <lambda>r_   z       VAY0O r      Ac                2    | j                  d|d    d      S Nr   T)relativemove_cursorr\   rowsr^   s      rO   r_   r_   {   s    ammAQxRVm.W r      Bc                0    | j                  d|d   d      S rc   re   rg   s      rO   r_   r_   |   s    ammAtAwQUm.V r      Cc                0    | j                  |d   dd      S rc   re   r\   colsr^   s      rO   r_   r_   }   s    ammDGQQUm.V r      Dc                2    | j                  |d    dd      S rc   re   rm   s      rO   r_   r_   ~   s    ammT!WHaRVm.W r      Ec                0    | j                  d|d   d      S Nr   T
relative_yre   rg   s      rO   r_   r_      s    ammAtAwSWm.X r      Fc                2    | j                  d|d    d      S rs   re   rg   s      rO   r_   r_      s    ammAQxTXm.Y r      Gc                6    | j                  |d   dz
  dd      S )Nr   r   Trt   re   )r\   colr^   s      rO   r_   r_      s    Q]]3q6A:qUY]-Z r      H   c                >    | j                  |d   dz
  |d   dz
        S )Nr   r   re   )r\   x_yr^   s      rO   r_   r_      s"    Q]]3q6A:s1vPQz-R r      Jc                *    | j                  |d         S Nr   )csi_erase_displayr\   moder^   s      rO   r_   r_          a.A.A$q'.J r      Kc                *    | j                  |d         S r   )csi_erase_liner   s      rO   r_   r_      s    a.>.>tAw.G r      Lc                ,    | j                  |d         S Nr   )lines)insert_linesr[   s      rO   r_   r_      r`   r      Mc                ,    | j                  |d         S r   )remove_linesr[   s      rO   r_   r_      r`   r      Pc                ,    | j                  |d         S rX   )remove_charsr[   s      rO   r_   r_      r`   r      Xc                    | j                  | j                  | j                  d   |d   z   dz
  | j                  d   f      S Nr   r   )eraseterm_cursorr[   s      rO   r_   r_      s?    QWWQ]]Q]]15Eq	5QTU5UWXWdWdefWg4hi r      arH      cc                $    | j                  |      S N)csi_get_device_attributesr\   noner^   s      rO   r_   r_      s    a.I.I!.L r   c                6    | j                  d|d   dz
  d      S )Nr   r   T)
relative_xre   )r\   rowr^   s      rO   r_   r_      s    Q]]1c!fqjUY]-Z r   c                *    | j                  |d         S r   )csi_clear_tabstopr   s      rO   r_   r_      r   r   c                &    | j                  ||      S r   csi_set_modesr\   modesr^   s      rO   r_   r_      s    qua/H r   c                *    | j                  ||d      S )NTresetr   r   s      rO   r_   r_      s    quat/T r   c                $    | j                  |      S r   )csi_set_attr)r\   attrsr^   s      rO   r_   r_      s    q~~e/D r   c                *    | j                  |d         S r   )csi_status_reportr   s      rO   r_   r_      r   r   c                *    | j                  |d         S r   )csi_set_keyboard_ledsr   s      rO   r_   r_      s    a.E.Ed1g.N r   c                2    | j                  |d   |d         S r   )csi_set_scroll)r\   t_br^   s      rO   r_   r_      s    Q-=-=c!fc!f-M r   c                "    | j                         S r   )save_cursorr   s      rO   r_   r_      s    ammo r   c                "    | j                         S r   )restore_cursorr   s      rO   r_   r_      s    a.>.>.@ r   )   d   e   f   g   h   l   m   n   q   r   s   u   `z"dict[bytes, CSIAlias | CSICommand]CSI_COMMANDSz
Literal[1]CHARSET_DEFAULTz
Literal[2]CHARSET_UTF8TF)eqorderc                      e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   d	Z
ded
<   d	Zded<   dZded<   eZded<   ddZy)	TermModesFbooldisplay_ctrlr(   lfnlkeys_decckmreverse_videoconstrain_scrollingTautowrapvisible_cursorbracketed_pastezLiteral[1, 2]main_charsetc                    d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        t        | _	        y )NFT)
r   r(   r   r   r   r   r   r   r   r   selfs    rO   r   zTermModes.reset   sK    !	 !"#( " ,r   NreturnNone)rJ   rK   rL   r   rM   r(   r   r   r   r   r   r   r   r   r   r   rN   r   rO   r   r      sr     L$FDD$ KM4 %%HdND!OT! #2L-1,r   r   c                  Z    e Zd ZU dZdddddZded<   ddZdd	Zdd
ZddZ	ddZ
ddZy)TermCharset)_g_sgr_mappingactivecurrentN0U)rT   vt100ibmpcuserz&typing.ClassVar[dict[str, str | None]]MAPPINGc                b    ddg| _         d| _        d| _        d | _        | j	                  d       y )NrT   r   Fr   )r   r   r   r   activater   s    rO   __init__zTermCharset.__init__   s7    

 " #'ar   c                Z    || j                   |<   | j                  | j                         y)z1
        Redefine G'g' with new mapping.
        gN)r   r   r   )r   r   charsets      rO   definezTermCharset.define   s#     
$r   c                n    || _         | j                  j                  | j                  |   d      | _        y)z2
        Activate the given charset slot.
        N)r   r   getr   r   )r   r   s     rO   r   zTermCharset.activate   s+     ||''
D9r   c                    d| _         y)zA
        Set graphics rendition mapping to IBM PC CP437.
        TN)r   r   s    rO   set_sgr_ibmpczTermCharset.set_sgr_ibmpc   s     !r   c                J    d| _         | j                  | j                         y)zC
        Reset graphics rendition mapping to IBM PC CP437.
        Fr   N)r   r   r   r   s    rO   reset_sgr_ibmpczTermCharset.reset_sgr_ibmpc   s     "$r   c                    | j                   s| j                  | j                     dk(  rQt        j                  |j                  d            x}dk\  rd| _        t        |   j                  d      S d| _        |S |S )Nr   cp437r   r   r   )	r   r   r   r   finddecoder   r   encode)r   chardec_poss      rO   apply_mappingzTermCharset.apply_mapping   sn     4 ?,11$++g2FGGAM",W5<<WEEDLKr   r   )r   rR   r   rE   r   r   )r   rR   r   r   )r   rG   r   rG   )rJ   rK   rL   	__slots__r   rM   r   r   r   r   r   r   rN   r   rO   r   r      sB    ;I 	7G3 %:!%	r   r   c                      e Zd ZdZd< fdZd=d>dZd?dZd@dAdZd?dZdBdCdZ	dDdEdZ
dFdGd	ZdHdId
ZdHdJdZdKdZdLdZdMdZdNdZdOdMdZdPdZdNdZd?dZdQdZdRdZdSdZd=dTdZdBdUdZdBdVdZd?dZd?dZ	 	 	 dW	 	 	 	 	 	 	 	 	 	 	 dXdZdYdZdFdZdZ dBd[dZ!dBd[d Z"d\d]d!Z#dBdVd"Z$d?d#Z%d^d$Z&	 	 	 d_	 	 	 	 	 	 	 d`d%Z'dadbd&Z(dadcd'Z)dadcd(Z*	 	 	 	 	 	 ddd)Z+	 	 	 	 	 	 	 	 	 	 	 	 ded*Z,dfd+Z-dBdgd,Z.dBdhd-Z/	 	 	 	 	 	 	 	 	 	 did.Z0dBdjd/Z1dkdld0Z2dmdnd1Z3dod2Z4dpd3Z5dqd4Z6dqd5Z7dmdrd6Z8dFdsd7Z9dtd8Z:dtd9Z;	 	 	 	 	 du	 	 	 	 	 	 	 	 	 dvd:Z<dwd;Z= xZ>S )x
TermCanvasFc                   t         |           ||c| _        | _        || _        |j
                  | _        d| _        t        d      | _	        d| _
        d | _        t               | _        d| _        d| j                  d<   d| _        d| _        d| _        d | _        t)               | _        d | _        d | _        d| _        d| _        | j                  d	z
  | _        g | _        g | _        | j;                          y )
NFi'  )maxlenr   r   )r   r   Ncursorr   r   r   )superr   widthheightwidget
term_modesr   	has_focusr   scrollback_bufferscrolling_uputf8_eat_bytes	bytearrayutf8_bufferescbufcoordsr   within_escape
parsestateattrspecr   r   saved_cursorsaved_attrsis_rotten_cursorscrollregion_startscrollregion_endtabstopstermr   )r   r	  r
  r  	__class__s       rO   r   zTermCanvas.__init__  s    "'
DK & 1 1
Y^fkYl*.$; ,H,2")-"}48GK %"# $a#%KM	

r   c                .   || j                   d   }|| j                   d   }| j                  ||      | _         | j                  rI| j                  j                  r3| j
                  | j                  |z
  k  r||| j
                  z   f| _        yd| _        y)z
        Set terminal cursor to x/y and update canvas cursor. If one or both axes
        are omitted, use the values of the current position.
        Nr   r   )r   constrain_coordsr  r   r   r  r
  r  )r   xys      rO   set_term_cursorzTermCanvas.set_term_cursor.  s    
 9  #A9  #A00A6>>djj77D<M<MPTP[P[^_P_<_a$"3"334DKDKr   c                :    d| _         | j                  dz
  | _        y)z?
        Reset scrolling region to full terminal size.
        r   r   N)r  r
  r  r   s    rO   reset_scrollzTermCanvas.reset_scroll?  s     #$ $ar   c                2   |rd| _         | j                          y|| j                  dz  }|s| }t        | j                        }| xj                   |z  c_         | j                   |kD  r|| _         n| j                   dk  rd| _         | j                          y)z
        Scroll the scrolling buffer up (up=True) or down (up=False) the given
        amount of lines or half the screen height.

        If just 'reset' is True, set the scrollbuffer view to the current
        terminal content.
        r   Nr|   )r  r$  r
  lenr  )r   r#   r   r   	maxscrolls        rO   scroll_bufferzTermCanvas.scroll_bufferF  s      !D  "=KK1$EFE../	U"y( )D" !Dr   c                   d| _         d| _        d| _        d| _        t	               | _        d| _        d| _        d| _        | j                          | j                          | j                  j                          | j                          y)z%
        Reset the terminal.
        r   Fr   N)r  r  r  r  r   r   r  r  r  r&  init_tabstopsr   r   clearr   s    rO   r   zTermCanvas.resetc  sw     ""}  % 	

 	

r   c                    t        | j                  d      \  }}|dkD  r|dz  }|rNt        | j                        |k  r5| j                  j	                  d       t        | j                        |k  r4y y dg|z  | _        y )N   r   r   )divmodr	  r(  r  append)r   extendtablenmods       rO   r,  zTermCanvas.init_tabstops}  so    TZZ+7aKFdmm$v-$$V, dmm$v- $Hv-DMr   c                   |r3t        t        | j                              D ]  }d| j                  |<    y || j                  d   }t	        |d      \  }}|r| j                  |xx   d|z   z  cc<   y | j                  |xx   d|z  z  cc<   y Nr   r/  r   )ranger(  r  r   r0  )r   r"  remover-  r    divr4  s          rO   set_tabstopzTermCanvas.set_tabstop  s    S/0 '%&c"'9  #A!Q<SMM#AH+-MM#!s(*r   c                r    || j                   d   }t        |d      \  }}| j                  |   d|z  z  dkD  S r6  )r   r0  r  )r   r"  r9  r4  s       rO   
is_tabstopzTermCanvas.is_tabstop  sC    9  #A!Q<Sc"a3h/144r   c                @    | j                  |      g| j                  z  S r   )
empty_charr	  r   r   s     rO   
empty_linezTermCanvas.empty_line  s    %&33r   c                H    | j                   | j                  j                  |fS r   )r  r   r   r?  s     rO   r>  zTermCanvas.empty_char  s    t||33T::r   c                r    | j                   dk  s| j                  dk  ry |D ]  }| j                  |        y r   )r	  r
  addbyte)r   databytes      rO   addstrzTermCanvas.addstr  s6    ::?dkkQ. 	DLL	r   c                   | j                   \  }}|| j                  kD  rQt        | j                        D ]8  }| j                  |xx   | j                         g|| j                  z
  z  z  cc<   : nH|| j                  k  r9t        | j                        D ]!  }| j                  |   d| | j                  |<   # || _        || j                  kD  rt        | j                  |      D ]}  }	 | j                  j                         }| j                  t        |      z
  x}dkD  r|| j                         g|z  z  }n|d| j                   }| j                  j                  d|        n^|| j                  k  rOt        || j                        D ]6  }| j                  j                  | j                  j                  d             8 || _        | j                          | j                  ||      \  }}| j!                  ||       | j#                  d       y# t        $ rB | j                  j                  | j                                | xj                  dz  c_        Y zw xY w)zD
        Resize the terminal to the given width and height.
        Nr   r   T)r2  )r   r	  r7  r
  r  r>  r  pop
IndexErrorr1  r@  r  r(  r(   r&  r!  r$  r,  )r   r	  r
  r"  r#  _y	last_linepaddings           rO   resizezTermCanvas.resize  s    14::4;;' K		!!2 3utzz7I JJKTZZ4;;' 4#yy|FU3		!4 
DKKDKK0 / $ 6 6 : : <I  $zzC	N::Ga?$//"3!4w!>>I ),DJJ 7I		  I./  dkk!FDKK0 @&&--diimmA.>?@ $$Q*1Q" 	$'5 " II$$T__%67))Q.)	s   (HAIIc                    | j                   j                  t        k7  ry|dk(  rd}nd}|dk(  rd}n|dk(  rd}n
|d	k(  rd
}nd}| j                  j	                  ||       y)zF
        Set G0 or G1 according to 'char' and modifier 'mod'.
        N   (r   r      0r      Ur   r   r   rT   )r   r   r   r   r   )r   r   r4  r   csets        rO   set_g01zTermCanvas.set_g01  sg     ::""o5$;AA4<DT\DT\DDAt$r   c                   | j                   j                  d      }g }| j                   |rdndd j                  d      D ]  }	 t        |      }|j                  |       ! t        |   x}t        |t              rt        |j                     }n=t        |t              r|}n*|d   dk(  rt        t        | j                     }nt        | }|\  }}	}
t        |      |k  r |j                  |	       t        |      |k  r t        t        |            D ]  }||   	||   dk(  s|	||<    t        t              5   |
| ||       ddd       yy# t        $ r d}Y w xY w# 1 sw Y   yxY w)zL
        Parse ECMA-48 CSI (Control Sequence Introducer) sequences.
           ?r   r   N   ;rH   )r  
startswithsplitrR   
ValueErrorr1  r   
isinstancerD   rH   rQ   r(  r7  r   )r   r   qmarkr  argnumcmd_csi_cmdnumber_of_argsdefault_valuecmdis               rO   	parse_csizTermCanvas.parse_csi  sx    &&t,;;Eqq2399$? 	C#h MM#	 !&&D3$)&24::&>D*-aG#&x'<'<=$d+18.NM3f+.m, f+.3v;' .!9$q	Q -F1I. *% )D&%() )# 4  ,) )s   E=E$E! E!$E-c                n   |dk(  r|dk(  r| j                          y|dk(  r6|dk(  rt        | j                  _        y|dv rt        | j                  _        yy|dv r| j                  ||       y|dk(  r| j                  d	       y|d
k(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r| j                          y|dk(  r#| j                  j                  t         d       y|dk(  r| j                  d       y|dk(  r| j                  d       yy)z;
        Parse escape sequences which are not CSI.
           #   8   %rV   s   G8>   rO     )r   Treversero   r   rq   r{      Z[?6c   7)
with_attrsN)decalnr   r   r   r   rS  linefeedr   newliner:  r  respondESCr   r   )r   r   r4  s      rO   parse_noncsizTermCanvas.parse_noncsi  s    $;44<KKMD[t|*9

'*6

'  L LLs#T\MM$M'T\MMOT\JJLT\LLNT\T\KK3%t-T\-T\40 r   c                    |j                  d      r<| j                  j                  |j                         j	                  d      d          yy)z1
        Parse operating system command.
        )rV  s   0;s   2;;r|   N)rW  r  	set_titler   	partition)r   bufs     rO   	parse_osczTermCanvas.parse_osc9  s>     >>./KK!!#**,"8"8"=a"@A 0r   c                   | j                   dk(  rO|t        v r| j                  |       d| _         n|dv s| j                  s|dk(  r| xj                  |z  c_        y | j                   dk(  r|dk(  rd| _        d| _         y | j                   dk(  r1|dk(  r,| j	                  | j                  j                  d	             nx| j                   dk(  rZ| j                  d
d  |z   t         dj                  d      k(  r/| j	                  | j                  d d
 j                  d	             n| j                   dk(  r4| j                  j                  d      rt        | j                        dk(  rn| j                   dk(  r| j                  s|dk(  rn| j                   dk(  r| xj                  |z  c_        y | j                   dk(  r|dk(  rd| _        d| _         y | j                   dk(  r|dv r|| _        d| _         y | j                   dk(  r| j                  || j                         n|dv r| j                  |       | j                          y )Nr   r   s   0123456789;rU     ]r   r|      rP  \z	iso8859-1r   r/     R   [>   rf  rh  rO  ri     >
   rn  rg     =   >ro   rq   r{   r   rl  r   )r  r   rd  r  r{  lstriprt  r   rW  r(  ru  leave_escaper?  s     rO   parse_escapezTermCanvas.parse_escapeA  s   ??a|#t$"#'t#__!ddlDKDO__!demNN4;;--d34__!dkk"#&6&=C5ARARS^A_&_NN4;;s+22489__!dkk&<&<T&Bs4;;GW[\G\__!$++$$,__!KK4K__!ddlDKDO__!d.F&FDKDO__!dDKK0QQd#r   c                .    d| _         d| _        d| _        y )NFr   r   )r  r  r  r   s    rO   r  zTermCanvas.leave_escapeo  s    "r   c                4    d}|dz  r|dz  }|dz  }|dz  r|S )z
        Process startbyte and return the number of bytes following it to get a
        valid UTF-8 multibyte sequence.

        bytenum -- an integer ordinal
        r   @   r   rN   )r   bytenumlengths      rO   get_utf8_lenzTermCanvas.get_utf8_lent  s2     nMGaKF n r   c                   | j                   j                  t        k(  st        j                         dk(  r|dk\  r(| j                  |      | _        t        |g      | _        yd|cxk  rdk  rn n| j                  | j                  dkD  r1| xj                  dz  c_        | j                  j                  |       yd| _        | j                  t        |g      z   j                  dd      x}r%|j                  t        j                         d      }n!yd| _        t        |g      }nt        |g      }| j                  |       y)	z
        Parse main charset and add the processed byte(s) to the terminal state
        machine.

        byte -- an integer ordinal
        utf8   N   r   utf-8ignorereplace)r   r   r   r   get_encodingr  r  r  r  r1  rG   r   r   process_char)r   rE  sequencer   s       rO   rC  zTermCanvas.addbyte  s    ::""l2d6G6G6IV6St|&*&7&7&=##,dV#4 t"d"t':':'F&&*''1,'$$++D1 '+# $ 0 05$= @HHRZ[[8[#??4+<+<+>	JD &*#dV}$=D$r   c                   | j                   \  }}t        |t              r|j                  dd      }| j                  j
                  }|t        k(  r| j                  dk7  rd| _        y|s|dk(  r| j                          y|s!|dk(  r| j                  j                  d       y|s!|dk(  r| j                  j                  d       y|s<|d	v r8| j                          | j                  j                  r| j                          yy|s|d
k(  r| j                          y|s!|dk(  r|dkD  r| j                  |dz
  |       yy|s/|dk(  r*| j                  dk7  r| j                   j#                          y|s|dv r| j%                          y|s|dv ry| j                  r| j'                  |       y|s|dk(  rd| _        d| _        d| _        y| j+                  |       y)ze
        Process a single character (single- and multi-byte).

        char -- a byte string
        r   littler|   T      r      s   
   	   r~  s   s       r   N)r   rZ  rR   to_bytesr   r   ESC_Br  r  carriage_returnr   r   rq  r   r    r$  r  beepr  r  r  push_cursor)r   r   r"  r#  dcs        rO   r  zTermCanvas.process_char  s    1dC ==H-DZZ$$5=T__1!%D  "LL!!!$LL!!!$	)MMOzz$$& HHJ1u$$QUA. $//Q*> KK++d#!%DDKDOT"r   c                    || j                   d   }|| j                   d   }| j                  ||      \  }}| j                  | j                  j                  |f| j
                  |   |<   y)z~
        Set character of either the current cursor position
        or a position given by 'x' and/or 'y' to 'char'.
        Nr   r   )r   r!  r  r   r   r  r   r   r"  r#  s       rO   set_charzTermCanvas.set_char  sj    
 9  #A9  #A$$Q*1==$,,*>*>E		!Qr   c                T   || j                   k\  r| j                   dz
  }n|dk  rd}| j                  j                  r@|s>|| j                  kD  r| j                  }||fS || j                  k  r| j                  }||fS || j
                  k\  r| j
                  dz
  }||fS |dk  rd}||fS )z
        Checks if x/y are within the terminal and returns the corrected version.
        If 'ignore_scrolling' is set, constrain within the full size of the
        screen and not within scrolling region.
        r   r   )r	  r   r   r  r  r
  )r   r"  r#  ignore_scrollings       rO   r!  zTermCanvas.constrain_coords  s     

?

QAUA::))2B4((()) !t T,,,++ !t DKKKK!O !t Q!tr   c                b   | j                   \  }}|rA|dcxk  r| j                  k  rn nns|| j                  k(  r| j                  d       nQ|dz  }nK|| j                  dz
  cxk\  r| j                  kD  rn nn%|| j                  k(  r| j                          n|dz  }| j                  ||       y)zw
        Move the cursor down (or up if reverse is True) one line but don't reset
        horizontal position.
        r   Trj  r   N)r   r  scrollr
  r  r$  )r   rk  r"  r#  s       rO   rq  zTermCanvas.linefeed  s    
 1A////d---D)QDKK!O;d&;&;;d+++QQ"r   c                B    | j                  d| j                  d          y r   )r$  r   r   s    rO   r  zTermCanvas.carriage_return  s    Q 0 0 34r   c                D    | j                          | j                          y)z?
        Do a carriage return followed by a line feed.
        N)r  rq  r   s    rO   rr  zTermCanvas.newline  s     	r   c                    |rdx}}|r|| j                   d   z  }|r|| j                   d   z  }n%| j                  j                  r|| j                  z  }| j	                  ||       y)z
        Move cursor to position x/y while constraining terminal sizes.
        If 'relative' is True, x/y is relative to the current cursor
        position. 'relative_x' and 'relative_y' is the same but just with
        the corresponding axis.
        Tr   r   N)r   r   r   r  r$  )r   r"  r#  r   ru   rd   s         rO   rf   zTermCanvas.move_cursor  sn     &**J!!!$$A!!!$$AZZ++(((AQ"r   c                    |U| j                   j                  |      }| j                  j                  r| j	                  |       n| j                  |       | j                  ||       y)zS
        Push one character to current position and advance cursor to x/y.
        N)r   )r   r   r   r(   rZ   r  r$  r  s       rO   	push_charzTermCanvas.push_char9  sX     <<--d3Dzz  !!t!,d#Q"r   c                
   | j                   \  }}| j                  j                  r|dz   | j                  k\  r'| j                  sd| _        | j                  |||       y|dz  }|| j                  k\  rE| j                  r9|| j                  k\  r| j                          n|dz  }d}| j                  d|       | j                  |||       d| _        y|dz   | j                  k  r|dz  }d| _        | j                  |||       y)z
        Move cursor one character forward wrapping lines as needed.
        If 'char' is given, put the character into the former position.
        r   Tr   FN)	r   r   r   r	  r  r  r  r  r$  r  s       rO   r  zTermCanvas.push_cursorF  s    
 1::1u

"4+@+@ )-%tQ*Q

?t'<'<D111QA((A.tQ*(-%1utzz!Q$)D!NN4A&r   c                    t        | j                        | _        |rDt        j                  | j                        t        j                  | j
                        f| _        y y r   )tupler   r  copyr  r   r  )r   ro  s     rO   r   zTermCanvas.save_cursork  sD    !$"2"23 $		$-- 8$))DLL:QRD r   c                   | j                   y | j                   \  }}| j                  ||       |r]| j                  Pt        j                  | j                  d         t        j                  | j                  d         c| _        | _        y y y r   )r  r$  r  r  r  r   )r   ro  r"  r#  s       rO   r   zTermCanvas.restore_cursorp  s    $  1Q"$**6+/99T5E5Ea5H+I499UYUeUefgUhKi'DM4< 7:r   c                    | j                   \  }}|| j                  dz
  k  r;| j                  d       |dz  }| j                  |      rn|| j                  dz
  k  r;d| _        | j                  ||       y)zg
        Moves cursor to the next 'tabstop' filling everything in between
        with spaces.
        r       FN)r   r	  r  r<  r  r$  )r   tabstopr"  r#  s       rO   r    zTermCanvas.tabz  ss    
 1$**q. MM$FAq! $**q.  !&Q"r   c                   |rZ| j                   j                  | j                         | j                   j                  | j                  | j                                y| j                   j                  | j                        }| j                  j                  |       | j                   j                  | j                  | j                                y)z
        Append a new line at the bottom and put the topmost line into the
        scrollback buffer.

        If reverse is True, do exactly the opposite, but don't save into
        scrollback buffer.
        N)r  rH  r  r(   r  r@  r  r1  )r   rk  killeds      rO   r  zTermCanvas.scroll  s     IIMM$//0IIT44doo6GHYY]]4#:#:;F""))&1IIT22DOO4EFr   c                t    t        | j                        D ]   }| j                  d      | j                  |<   " y)zB
        DEC screen alignment test: Fill screen with E's.
        rq   N)r7  r
  r@  r  r   r   s     rO   rp  zTermCanvas.decaln  s2     % 	3C!__T2DIIcN	3r   c                >    | j                         | j                  |<   y)zZ
        Blank a single line at the specified row, without modifying other lines.
        N)r@  r  r  s     rO   
blank_linezTermCanvas.blank_line  s     *		#r   c                >   || j                   }|dk(  rd}|| j                         }n#| j                  | j                  j                  |f}|\  }}|dkD  rH| j
                  |   j                  ||       | j
                  |   j                          |dz  }|dkD  rGyy)z
        Insert 'chars' number of either empty characters - or those specified by
        'char' - before 'position' (or the current position if not specified)
        pushing subsequent characters of the line to the right without wrapping.
        Nr   r   )r   r>  r  r   r   r  r(   rH  )r   positionrY   r   	char_specr"  r#  s          rO   rZ   zTermCanvas.insert_chars  s     ''HA:E<)I(<(<dCI1aiIIaL9-IIaLQJE air   c                    || j                   }|dk(  rd}|\  }}|dkD  rV| j                  |   j                  |       | j                  |   j                  | j	                                |dz  }|dkD  rUyy)z
        Remove 'chars' number of empty characters from 'position' (or the current
        position if not specified) pulling subsequent characters of the line to
        the left without joining any subsequent lines.
        Nr   r   )r   r  rH  r1  r>  )r   r  rY   r"  r#  s        rO   r   zTermCanvas.remove_chars  sv     ''HA:E1aiIIaLQIIaL 12QJE air   c                   || j                   d   }n| j                  }|dk(  rd}|dkD  r[| j                  j                  || j	                                | j                  j                  | j                         |dz  }|dkD  rZyy)z
        Insert 'lines' of empty lines after the specified row, pushing all
        subsequent lines to the bottom. If no 'row' is specified, the current
        row is used.
        Nr   r   )r   r  r  r(   r@  rH  r  r   r   r   s      rO   r   zTermCanvas.insert_lines  sz     ;""1%C))CA:EaiIIS$//"34IIMM$//0QJE air   c                   || j                   d   }n| j                  }|dk(  rd}|dkD  r[| j                  j                  |       | j                  j	                  | j
                  | j                                |dz  }|dkD  rZyy)z
        Remove 'lines' number of lines at the specified row, pulling all
        subsequent lines to the top. If no 'row' is specified, the current row
        is used.
        Nr   r   )r   r  r  rH  r(   r  r@  r  s      rO   r   zTermCanvas.remove_lines  sz     ;""1%C))CA:EaiIIMM#IIT22DOO4EFQJE air   c                    | j                   | \  }} | j                   | \  }}||k(  r5t        ||dz         D ]"  }| j                         | j                  |   |<   $ y|}||k  r||k(  r<t        || j                        D ]"  }| j                         | j                  |   |<   $ nJ||k(  r4t        |dz         D ]"  }| j                         | j                  |   |<   $ n| j                  |       |dz  }||k  ryy)aB  
        Erase a region of the terminal. The 'start' tuple (x, y) defines the
        starting position of the erase, while end (x, y) the last position.

        For example if the terminal size is 4x3, start=(1, 1) and end=(1, 2)
        would erase the following region:

        ....
        .XXX
        XX..
        r   N)r!  r7  r>  r  r	  r  )	r   startr*   sxsyexeyr"  r#  s	            rO   r   zTermCanvas.erase  s     '&&.B&&&,B 82rAv& 5#'??#4		"a 5 2gBwr4::. 8A&*oo&7DIIaLO8brAv 8A&*oo&7DIIaLO8 "FA 2gr   c                   d}|}|t        |      k  rg||   }d|cxk  rdk  rn n|dz
  }t        d|      }n,d|cxk  rdk  rn n|dz
  }t        d|      }nd|cxk  rdk  rn n|dz
  d	z   }t        d|      }nd
|cxk  rdk  rn n|d
z
  d	z   }t        d|      }n|dv r|dz   t        |      k  r0||dz      dk(  r%||dz      }	t        d|      }|dk(  r|	}n|	}|dz  }n~|dz   t        |      k  rl||dz      dk(  r`||dz      dz  ||dz      d	z  z   ||dz      z   }	d}|dk(  r|	}n|	}|dz  }n-|dk(  rd}n$|dk(  rd}n|dk(  r,| j                  j                          d| j                  _        n|dv r,| j                  j                          d| j                  _        n|dk(  r|j                  d       n|dk(  r|j                  d       n|dk(  r|j                  d       nu|dk(  r|j                  d        n^|d!k(  r|j                  d       nG|d"k(  r|j                  d       n0|d#k(  r|j                  d        n|dk(  rdx}}|j                          |dz  }|t        |      k  rgd|v r|dk(  r|
|d	k  r|d	z  }d(d$}
 |
||      } |
||      }|rd%j                  |gt        |            }||cxk(  rd&k(  ry |rt        |||'      S t        ||      S ))z
        Parse SGI sequence and return an AttrSpec representing the sequence
        including all earlier sequences specified as 'fg', 'bg' and
        'attributes'.
        r      %      (   /   Z   a   r/  d   k   >   &   0   r|   r         r     r     '   N1   
   F>         Tbold	underlineblink   standout      r   c                n    | y| dkD  s|dk(  rt        |       S | dkD  s|dk(  rt        |       S t        |    S )NrT      r     r  )r   r   r   )colorcolorss     rO   
_defaulterz.TermCanvas.sgi_to_attrspec.<locals>._defaulter  sE    } s{fo'..rzVs]&u-- ''r   ,rT   )r  )r  
int | Noner  rR   r   rE   )r(  maxr   r   r   r   r   adddiscardr-  joinlistr
   )r   r   fgbg
attributesprev_colorsidxr  attrr  r  
decoded_fg
decoded_bgs                rO   sgi_to_attrspeczTermCanvas.sgi_to_attrspec%  s6    CJ:DTRBYRt!r!BYR t!r!BY]R##CZ!^R!7SZ'E#'Na,?!#'NE f-Frz""1HC1Ws5z)eC!Gn.A"37^r1eC!Gn6IJUSVYZSZ^[E"Frz""1HC,,.*/

'!**,*.

' v&{+w'z* "";/""7+"":.R  "1HCM CJP ZFbLR^Q!GB	(  F+
F+
:"AZ0@"ABJ0y0 1 J
6BB
J//r   c                   |d   dk(  rd| _         t               }| j                   dx}}nd| j                   j                  v rd}n9| j                   j                  }|dk\  r| j                   j                  dk(  r|dz  }d| j                   j
                  v rd}n9| j                   j                  }|dk\  r| j                   j                  dk(  r|dz  }dD ]*  }t        | j                   |      s|j                  |       , | j                  ||||| j                   r| j                   j                  nd      }| j                  j                  r| j                  |      | _         y|| _         y)	z)
        Set graphics rendition.
        r  r   NrT   r/  r  )r  r  r  r  r   )r  set
foregroundforeground_numberr  
backgroundbackground_numbergetattrr  r  r   r   reverse_attrspec)r   r   r  r  r  r  r  s          rO   r   zTermCanvas.csi_set_attr  sB    9> DMU
== NB DMM444]]447t}}33r9!GBDMM444]]447t}}33r9!GBB %t}}d3t$	% ''r2z[_[h[h4==CWCWnop::## 11(;DM$DMr   c                |   |t        dd      }|j                  j                  d      D cg c]  }|j                          }}d|v r6|r4|j	                  d       |j                  dj                  |            }|S d|vr4|s2|j                  d       |j                  dj                  |            }|S c c}w )zd
        Put standout mode to the 'attrspec' given and remove it if 'undo' is
        True.
        rT   r  r  )r  )r
   r  rX  stripr8  copy_modifiedr  r1  )r   r  undor  r   s        rO   r  zTermCanvas.reverse_attrspec  s    
 	95H&.&9&9&?&?&DEEE4LL$--%-AH  u$TLL$--%-AH Fs   B9c                    t        | j                        D ]]  }t        | j                        D ]C  }| j                  |   |   }| j	                  |d   |      }|g|dd | j                  |   |<   E _ y)zP
        Reverse video/scanmode (DECSCNM) by swapping fg and bg colors.
        r   r  r   N)r7  r
  r	  r  r  )r   r  r#  r"  r   r   s         rO   r   zTermCanvas.reverse_video  s}     t{{# 	5A4::& 5yy|A--d1gD-A#("448"4		!Q5	5r   c                p   |r|dk(  r|| j                   _        y|dk(  r| j                          y|dk(  r>| j                   j                  |k7  r| j                  |        || j                   _        y|dk(  r$|| j                   _        | j                  dd       y|dk(  r|| j                   _        y|dk(  r"|| j                   _        | j                          y|d	k(  r|| j                   _        yy|dk(  r|| j                   _	        y|d
k(  r|| j                   _
        y|dk(  r|| j                   _        yy)zC
        Helper method for csi_set_modes: set single mode.
        r   r  r  r     r   r  r  i  r     N)r   r   r-  r   r   r$  r   r   r   r   r(   r   )r   r   flagr[  r   s        rO   set_modezTermCanvas.set_mode  s    qy)-

&

::++t3&&H&5+/

(15

.$$Q*&*

#,0

)$$&-1

*  qy*.

'$(

!"&

 r   c                @    | }|D ]  }| j                  ||||        y)zX
        Set (DECSET/ECMA-48) or reset modes (DECRST/ECMA-48) if reset is True.
        N)r  )r   r   r[  r   r  r   s         rO   r   zTermCanvas.csi_set_modes  s,     y 	4DMM$eU3	4r   c                    |sd}|s| j                   }||cxk  r| j                   k  rTn y| j                  d|dz
  d      d   | _        | j                  d|dz
  d      d   | _        | j	                  dd       yy)z
        Set scrolling region, 'top' is the line number of first line in the
        scrolling region. 'bottom' is the line number of bottom line. If both
        are set to 0, the whole screen will be used (default).
        r   r   T)r  N)r
  r!  r  r  r$  )r   topbottoms      rO   r   zTermCanvas.csi_set_scroll  s     C[[F&4;;&&*&;&;AsQwY]&;&^_`&aD#$($9$9!VaZZ^$9$_`a$bD!  A&	 'r   c                d    |dk(  r| j                  d       y|dk(  r| j                  d       yy)zc
        Clear tabstop at current position or if 'mode' is 3, delete all
        tabstops.
        r   T)r8  r  )r-  N)r:  r   r   s     rO   r   zTermCanvas.csi_clear_tabstop  s9    
 19D)QY4( r   c                N    |s#| j                   j                  t         d       yy)zz
        Report device attributes (what are you?). In our case, we'll report
        ourself as a VT102 terminal.
        rm  N)r  rs  rt  )r   r[  s     rO   r   z$TermCanvas.csi_get_device_attributes'  s$    
 KK3%t- r   c                    |dk(  r#| j                   j                  t         d       y	|dk(  rA| j                  \  }}| j                   j                  t        d|dz   dd|dz   ddz          y	y	)
z
        Report various information about the terminal status.
        Information is queried by 'mode', where possible values are:
            5 -> device status report
            6 -> cursor position report
        r  z[0nr  [r   drw  RN)r  rs  rt  r   r   r   r"  r#  s       rO   r   zTermCanvas.csi_status_report/  sp     19KK3%s,QY##DAqKK!a%!AE!9A&> >? r   c                    | j                   \  }}|dk(  r,| j                  | j                   | j                  dz
  |f       y|dk(  r| j                  d|f||f       y|dk(  r| j                  |       yy)z
        Erase current line, modes are:
            0 -> erase from cursor to end of line.
            1 -> erase from start of line to cursor.
            2 -> erase whole line.
        r   r   r|   N)r   r   r	  r  r  s       rO   r   zTermCanvas.csi_erase_line=  sp     119JJt''$**q.!)<=QYJJ1v1v&QYOOA r   c                0   |dk(  r8| j                  | j                  | j                  dz
  | j                  dz
  f       |dk(  r2| j                  d| j                  d   dz
  | j                  d   f       y|dk(  r| j	                  | j                         yy)z
        Erase display, modes are:
            0 -> erase from cursor to end of display.
            1 -> erase from start to cursor.
            2 -> erase the whole display.
        r   r   r  r|   )r  N)r   r   r	  r
  r-  r  s     rO   r   zTermCanvas.csi_erase_displayM  s     19JJt''$**q.$++/)JK19JJv 0 0 3a 79I9I!9LMNQYJJd..J/ r   c                X    ddddd}||v r| j                   j                  ||          yy)a0  
        Set keyboard LEDs, modes are:
            0 -> clear all LEDs
            1 -> set scroll lock LED
            2 -> set num lock LED
            3 -> set caps lock LED

        This currently just emits a signal, so it can be processed by another
        widget or the main application.
        r-  scroll_locknum_lock	caps_lock)r   r   r|   r  N)r  leds)r   r   statess      rO   r   z TermCanvas.csi_set_keyboard_leds[  s;     	
 6>KKVD\* r   c                    t        | j                        D cg c]  }| j                          c}| _        || j	                  dd       y | j                  |  yc c}w )z
        Clears the whole terminal screen and resets the cursor position
        to (0, 0) or to the coordinates given by 'cursor'.
        Nr   )r7  r
  r@  r  r$  )r   r  _s      rO   r-  zTermCanvas.clearp  sQ    
 16dkk0BC1T__&C	>  A& D  &) Ds   Ac                    | j                   S r   )r	  r   s    rO   rn   zTermCanvas.cols|  s    zzr   c                    | j                   S r   )r
  r   s    rO   rh   zTermCanvas.rows  s    {{r   c              #    K   | j                   dk(  r| j                  E d {    y t        | j                  | j                   z    | j                          }g | j                  | j                  |   E d {    y 7 [7 wr   )r  r  slicer
  r  )r   	trim_lefttrim_toprn   rh   r  viewport_ranges          rO   contentzTermCanvas.content  sx      !yy  "T[[43D3D%D#EHYHYGYZN<//<$))<^LLL ! Ms"   BA=AB7A?8B?Bc                n    || u r"| j                         g| j                         z  S | j                         S r   )rn   rh   r0  )r   others     rO   content_deltazTermCanvas.content_delta  s.    D=IIK=499;..||~r   )r	  rR   r
  rR   r  Terminalr   r   )NN)r"  r  r#  r  r   r   r   )TFN)r#   r   r   r   r   r  r   r   F)r2  r   r   r   )NFF)r"  r  r8  r   r-  r   r   r   r   )r"  r  r   r   )r  )r   rG   r   z/list[tuple[AttrSpec | None, str | None, bytes]])r   rG   r   z)tuple[AttrSpec | None, str | None, bytes])rD  Iterable[int]r   r   r	  rR   r
  rR   r   r   )r   rG   r4  rG   r   r   )r   rG   r   r   )r   )rz  rG   r   r   )r  rR   r   rR   )rE  rR   r   r   )r   zint | bytesr   r   )r   rG   r"  r  r#  r  r   r   )r"  rR   r#  rR   r  r   r   tuple[int, int])rk  r   r   r   )FFF)r"  rR   r#  rR   r   r   ru   r   rd   r   r   r   )r   bytes | Noner"  rR   r#  rR   r   r   )r   r9  r   r   )ro  r   r   r   )r/  )r  rR   r   r   )r   rR   r   r   )Nr   N)r  tuple[int, int] | NonerY   rR   r   r9  r   r   )Nr   )r  r:  rY   rR   r   r   )r   r  r   rR   r   r   )r  'tuple[int, int] | tuple[int, int, bool]r*   r;  r   r   )r   Sequence[int]r  rR   r  rR   r  zset[str]r  rR   r   AttrSpec | None)r   r<  r   r   )r  r=  r  r   r   r
   )r  r   r   r   )
r   z'Literal[1, 3, 4, 5, 6, 7, 20, 25, 2004]r  r   r[  r   r   r   r   r   )r   r6  r[  r   r   r   r   r   r  )r  rR   r  rR   r   r   )r   )r   zLiteral[0, 3])r[  r   r   r   )r   zLiteral[5, 6]r   r   )r   zLiteral[0, 1, 2]r   r   )r   zLiteral[0, 1, 2, 3]r   r   )r  r:  r   r   )r   rR   )r   r   NNN)
r-  rR   r.  rR   rn   r  rh   r  r   z>Iterable[list[tuple[object, Literal['0', 'U'] | None, bytes]]])r2  r	   )?rJ   rK   rL   	cacheabler   r$  r&  r*  r   r,  r:  r<  r@  r>  rF  rM  rS  rd  ru  r{  r  r  r  rC  r  r  r!  rq  r  rr  rf   r  r  r   r   r    r  rp  r  rZ   r   r   r   r   r  r   r  r   r  r   r   r   r   r   r   r   r   r-  rn   rh   r0  r3  __classcell__r  s   @rO   r  r    s   I%N"0:4	.+54;0(d%.!)J1>B,\
# J-#^F0#05 ! ## # 	#
 # # 
#6##'JS
k#"G 3+ ,0!	(  	
 
:&&&%6% 5% 
	%Nr0r0 r0 	r0
 r0 r0 
r0h%%N 5''5'' '' 	''
 '' 
''R4'").@ 0+*
*
 MM M 	M
 M 
HMr   r  c                      e Zd ZU dZ eej                  g      Zg dZde	d<   	 	 	 	 d	 	 	 	 	 	 	 	 	 d fdZ
ddZddZddZdd	Zdd
ZddZddZddZddZddZddZdddZddZddZd d!dZddZd"dZ xZS )#r4  T)closedr  r%  titlerM  ztyping.ClassVar[list[str]]signalsc                   t         |           |xs d| _        t        |xs t        j
                        | _        |xs | j                  j                  dd      g| _        || _	        d| _
        d| _        g | _        t               | _        ||| _        nt!        j"                         | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        y)a  
        A terminal emulator within a widget.

        ``command`` is the command to execute inside the terminal,
        provided as a list of the command followed by its arguments.
        If 'command' is None, the command is the current user's shell.
        You can also provide a callable instead of a command, which will be executed in the subprocess.

        ``env`` can be used to pass custom environment variables. If omitted,
        os.environ is used.

        ``main_loop`` should be provided, because the canvas state machine needs
        to act on input from the PTY master device. This object must have
        watch_file and remove_watch_file methods.

        ``escape_sequence`` is the urwid key symbol which should be used to break
        out of the terminal widget. If it's not specified, ``ctrl a`` is used.

        ``encoding`` specifies the encoding that is being used when local
        keypresses in Unicode are encoded into raw bytes. UTF-8 is used by default.
        Set this to the encoding of your terminal if you need to transmit
        characters to the spawned process in non-UTF8 encoding.
        Applies to Python 3.x only.

        .. note::

            If you notice your Terminal instance is not printing unicode glyphs
            correctly, make sure the global encoding for urwid is set to
            ``utf8`` with ``urwid.set_encoding("utf8")``. See
            :ref:`text-encodings` for more details.
        zctrl aSHELLz/bin/shFN)r  r   escape_sequencedictosenvironenvr   commandencodingkeygrablast_keyresponse_bufferr   r  	main_loopr   SelectEventLoopmasterpidr	  r
  r  r  
terminated)r   rL  rK  rQ  rG  rM  r  s         rO   r   zTerminal.__init__  s    N 	$3$?x)rzz*D488<<#C"D $(*,#+ &DN'779DN"&#!%
"&'+	r   c                   | j                   y| j                   j                  | j                   j                  }}|d   | j                   _        |d   | j                   _        | j                   j                  | j                   j                  d   | j                   j                  d         \  }}||c| j                   _        | j                   _        ||fS )z/Return the cursor coordinates for this terminalNr   r   )r  r	  r
  r!  r   )r   size
orig_widthorig_heightr"  r#  s         rO   get_cursor_coordszTerminal.get_cursor_coords  s    99 #'))//4993C3CK
q'		7		yy))II!!!$II!!!$
1
 -7)		)1vr   c                   | j                   }d|d<   t        j                         \  | _        | _        | j                  dk(  rkt        | j                        r(	 	 | j                          t        j                  d       n.t        j                   | j                  d   | j                  |       | j"                  =t%        j$                  | j                  t$        j&                  t        j(                         t+        j,                  | j.                         y # t        $ rS t        j                  j                  t        j                                t        j                  j                          Y w xY w# t        j                  d       w xY w)NlinuxTERMr   )rK  ptyforkrT  rS  callablerL  BaseExceptionsysstderrwrite	traceback
format_excflushrI  _exitexecvperQ  fcntlF_SETFL
O_NONBLOCKatexitregister	terminate)r   rK  s     rO   spawnzTerminal.spawn  s    hhF #
$+88q=% +
 HHQK

4<<?DLL#>>>!KKU]]BMMB' ) +

(()=)=)?@

((*+ HHQKs%   D AE2.E5 1E22E5 5Fc                   | j                   ry d| _         | j                          | j                  d       | j                  dkD  r*| j	                  dd       t
        j                  t
        j                  t
        j                  t
        j                  t
        j                  fD ]p  }	 t        j                  | j                  |       t        j                  | j                  t        j                        \  }}|dk(  r nt!        j"                  d       r t%        t              5  t        j                  | j                  d       d d d        t        j&                  | j(                         y y # t        $ r Y  ew xY w# 1 sw Y   :xY w)NTFr   g?)rU  remove_watchchange_focusrT  set_termsizesignalSIGHUPSIGCONTSIGINTSIGTERMSIGKILLrI  killwaitpidWNOHANGOSErrortimesleepr   closerS  )r   sigrT  _statuss       rO   ro  zTerminal.terminate  s   ??% 88a<a#v~~v}}fnnV\VdVde 	 GGDHHc*#%::dhh

#CLC !8

3	  '" (

488Q'( HHT[[!   ( (s   )AE1'!F1	E>=E>F
c                &    | j                  d       y )Nr  _emitr   s    rO   r  zTerminal.beep)  s    

6r   c                (    | j                  d|       y )Nr%  r  )r   whichs     rO   r%  zTerminal.leds,  s    

65!r   c                :    | j                   j                  |       y)zF
        Respond to the underlying application with 'string'.
        N)rP  r1  r   strings     rO   rs  zTerminal.respond/  s     	##F+r   c                    | j                   D ]1  }t        j                  | j                  |j	                  d             3 g | _         y )Nascii)rP  rI  rd  rS  r   r  s     rO   flush_responseszTerminal.flush_responses5  s:    ** 	:FHHT[[&--"89	:!r   c                    t        j                  d||dd      }t        j                  | j                  t
        j                  |       y )NHHHHr   )structpackrj  ioctlrS  termios
TIOCSWINSZ)r   r	  r
  winsizes       rO   rt  zTerminal.set_termsize:  s2    ++ffeQ:DKK!3!3W=r   c                   d}| j                   | j                          d}| j                  |k(  r| j                  |k(  ry | j	                  ||       | j
                  st        |||       | _        n| j
                  j                  ||       || _        || _        |r| j                          | j                  d||f       y )NFTrM  )
rT  rp  r	  r
  rt  r  r  rM  	add_watchr  )r   r	  r
  process_openeds       rO   
touch_termzTerminal.touch_term>  s    88JJL!N::4;;&#8%(yy"5&$7DIIIUF+
NN

8eV_-r   c                (    | j                  d|       y )NrC  r  )r   rC  s     rO   rx  zTerminal.set_titleW  s    

7E"r   c                l   | j                   ry|| _        | j                  +|| j                  _        | j                  j                          |r9t	               j                         | _         t	               j
                  dgdz    yt        | d      r" t	               j
                  | j                    yy)z9
        Ignore SIGINT if this widget has focus.
        N	undefinedr  old_tios)rU  r  r  r$  r   tty_signal_keysr  hasattr)r   r  s     rO   rs  zTerminal.change_focusZ  s     ??"99 "+DIIII%%'(N::<DM*LN**k]Q->@T:&*LN**DMM: 'r   c                    | j                   sD| j                  |       |\  }}| j                  ||       | j                  | j	                          | j
                  S r   )rU  rs  r  rQ  feedr  )r   rW  focusr	  r
  s        rO   renderzTerminal.renderm  sK    e$ ME6OOE6*~~%		yyr   c                ~    | j                   y | j                   j                  | j                  | j                         y r   )rQ  
watch_filerS  r  r   s    rO   r  zTerminal.add_watchy  s+    >>!!!$++tyy9r   c                h    | j                   y | j                   j                  | j                         y r   )rQ  remove_watch_filerS  r   s    rO   rr  zTerminal.remove_watch~  s%    >>!((5r   c                    t        j                         5 }|j                  | j                  t         j                         |j                  |       d d d        | j                          y # 1 sw Y   xY wr   )	selectorsDefaultSelectorrn  rS  
EVENT_READselectr  )r   timeoutselectors      rO   wait_and_feedzTerminal.wait_and_feed  sV    &&( 	%Hdkk9+?+?@OOG$	%
 				% 	%s   <A**A3c                   t         }	 t        j                  | j                  d      }|t         k(  r"| j                          | j                  d       y | j                  j                  |       | j                          y # t        $ rQ}|j
                  t
        j                  k(  rt         }n#|j
                  t
        j                  k(  rY d }~y  Y d }~d }~ww xY w)Ni   rB  )EOFrI  readrS  r~  errnoEIOEWOULDBLOCKro  r  r  rF  r  )r   rD  es      rO   r  zTerminal.feed  s    	774;;-D 3;NNJJx 		  	ww%))#E---	 	s    A? ?	CACCCc                z   | j                   r|S |dv r| j                  j                  rn|| _        y |dk(  r|\  }}| j	                  ||       y | j                  |cxk(  r| j
                  k(  rn n|| _        d| _        n| j                  r| j
                  |k(  rd| _        || _        y |dk(  r2| j                  j                          || _        | j                          y |dk(  r4| j                  j                  d       || _        | j                          y | j                  | j
                  k(  r|| j
                  k7  r	|| _        |S | j
                  |k(  rd| _        || _        y | j                  |   |dk(  rd| _        n	|| _        |S || _        | j                  j                  d	       |j                  d
      ra|d   j                         r't        t        |d         t        d      z
  dz         }net        t        |d         t        d      z
  dz         }n>| j                  j                  r|t         v r
t         |   }nt"        j%                  ||      }| j                  j&                  r
|dk(  r|dz  }t)        j*                  | j,                  |j/                  | j0                  d             y )N>   r.   r-   zwindow resizeTFr+   r,   )r#   r   r   zctrl r  ar   Ar   
r  )rU  r  r   rO  r  rG  rN  r  r*  _invalidate_command_maprW  islowerchrordr   KEY_TRANSLATIONS_DECCKMKEY_TRANSLATIONSr   r   rI  rd  rS  r   rM  )r   rW  keyr	  r
  s        rO   keypresszTerminal.keypress  s`   ??J.... #/! ME6OOE6*==C74#7#77DMDL\\##s*$ #i		'') #  "k!		''5'1 #  "}} 4 44@T@T9T #
##s*# #  %-  $ !$
		d+>>'"2w #c"g,S1A56#c"g,S1A56**s6M/M-c2&**34 ??C4K4KC
cjjABr   )NNNr  )
rL  z7Sequence[str | bytes] | Callable[[], typing.Any] | NonerK  z4Mapping[str, str] | Iterable[tuple[str, str]] | NonerQ  zevent_loop.EventLoop | NonerG  
str | NonerM  rE   )rW  r8  r   r:  r   )r  z8Literal['clear', 'scroll_lock', 'num_lock', 'caps_lock']r   r   )r  rE   r   r   r7  r5  )rW  r8  r  r   r   r  )g      ?)r  floatr   r   )rW  r8  r  rE   r   r  )rJ   rK   rL   _selectable	frozensetr   BOX_sizingrD  rM   r   rZ  rp  ro  r  r%  rs  r  rt  r  rx  rs  r  r  rr  r  r  r  r?  r@  s   @rO   r4  r4    s    K%G*WG'W
 EI15&*D HD  BD  /	D 
 $D  D L*(2"2","
>.2#;&
:
6
,Rr   r4  )A
__future__r   rm  r  r  rj  rI  r^  r  ru  r  rb  r  r  re  typingcollectionsr   
contextlibr   dataclassesr   urwidr   r   urwid.canvasr	   urwid.displayr
   r   urwid.display.escaper   r   urwid.widgetr   r   display.commonr   r   r   TYPE_CHECKINGcollections.abcr   r   r   r   typing_extensionsr   r  r  rt  r  r  r  
NamedTuplerD   rQ   r   rM   r   r   r   r   r  r4  rN   r   rO   <module>r     s  , #     	 
    
       ! "  0 I ' L L	EE)		"gTS 
4 
3	
 	SE* se2J uBZ se2J se3K Sk Sk 
cU#; #c{ C5 cU%=  C5!" 	SE+#$ E+E+E+E+E,E,E,E,U$<U$<U$<9 @ E*e2JuBZe2JE*E*E*E*E,
 v   
B"" B*4 	*QO
P*4 	*QW
X*4 	*QV
W*4 	*QV
W*4 	*QW
X*4 	*QX
Y*4 	*QY
Z*4 	*QZ
[*4  	*QR
S!*4" 	*QJ
K#*4$ 	*QG
H%*4& 	*QO
P'*4( 	*QO
P)*4* 	*QO
P+*4, 	*		i-*46 	(7D
!7*48 	*QL
M9*4: QZ
[
7D
!
7D
!
QJ
K
QH
I
QT
U
QD
E
QJ
K
QN
O
QM
N
Q=
>
Q@
A
7D
!S*40 *X   j  d% , , !,D< <~O Od$]v ]r   