grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a BjŒjMÊã>@sZddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z zddl Z ddlZddlZWneyŽYn0ddlmZddlmZmZddlmZddlmZmZddlmZmZmZddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%e"d ƒZ&e'd ƒZ(e'd ƒe'd ƒe'd ƒe(e(de(de(de(de(de(de(de(de(de(de(de(de(de(de(de(de(de(de(d e(d!e(d"e(d#d$œZ)e(d%e(d&e(d'e(d(e(d)e(d*e(d+e(d,e(d-d.œ Z*e"d/ƒd0d0d1d2„fe"d3ƒd0d0d4d2„fe"d5ƒd0d0d6d2„fe"d7ƒd0d0d8d2„fe"d9ƒd0d0d:d2„fe"d;ƒd0d0dd2„fe"d?ƒd0d0d@d2„fe"dAƒdBd0dCd2„fe"dDƒd0ddEd2„fe"dFƒd0ddGd2„fe"dHƒd0d0dId2„fe"dJƒd0d0dKd2„fe"dLƒd0d0dMd2„fe"dNƒd0d0dOd2„fe"dPƒdQe"d7ƒfe"dRƒdddSd2„fe"dTƒd0d0dUd2„fe"dVƒdQe"d5ƒfe"dWƒdQe"dAƒfe"dXƒd0ddYd2„fe"dZƒd0dd[d2„fe"d\ƒd0dd]d2„fe"d^ƒd0dd_d2„fe"d`ƒd0ddad2„fe"dbƒd0ddcd2„fe"ddƒdBdded2„fe"dfƒdddgd2„fe"dhƒdddid2„fe"djƒdQe"d?ƒfiZ+d0Z,dBZ-Gdkdl„dle.ƒZ/Gdmdn„dne.ƒZ0Gdodp„dpe1ƒZ2Gdqdr„dreƒZ3Gdsdt„dteƒZ4dS)ué)ÚdivisionÚprint_functionN)Úutil)ÚDEC_SPECIAL_CHARSÚALT_DEC_SPECIAL_CHARS)ÚCanvas)ÚWidgetÚBOX)ÚAttrSpecÚ RealTerminalÚ _BASIC_COLORS)Úord2Úchr2ÚBÚbytesÚPYTHON3ÚxrangeÚéé éé z[Az[Bz[Cz[Dz[1~z[2~z[3~z[4~z[5~z[6~z[[Az[[Bz[[Cz[[Dz[[Ez[17~z[18~z[19~z[20~z[21~z[23~z[24~)ÚenterZ backspaceÚtabZescÚupÚdownÚrightÚleftÚhomeÚinsertÚdeleteÚendúpage upú page downÚf1Úf2Úf3Úf4Úf5Zf6Zf7Zf8Zf9Zf10Zf11Zf12ZOAZOBZOCZODÚOPZOQÚORZOSz[15~) rrrrr$r%r&r'r(ú@écCs|j|dd�S©Nr)Úchars)Ú insert_chars©ÚsÚnumberÚq©r4ú1/usr/lib64/python3.9/site-packages/urwid/vterm.pyÚgór6ÚAcCs|jd|d dd�S©NrT)Úrelative©Ú move_cursor©r1Úrowsr3r4r4r5r6hr7rcCs|jd|ddd�Sr9r;r=r4r4r5r6ir7ÚCcCs|j|dddd�Sr9r;©r1Úcolsr3r4r4r5r6jr7ÚDcCs|j|d ddd�Sr9r;r@r4r4r5r6kr7ÚEcCs|jd|ddd�S©NrT©Ú relative_yr;r=r4r4r5r6lr7ÚFcCs|jd|d dd�SrDr;r=r4r4r5r6mr7ÚGcCs|j|ddddd�S)Nrr,TrEr;)r1Úcolr3r4r4r5r6nr7ÚHécCs| |dd|dd¡S)Nr,rr;)r1Zx_yr3r4r4r5r6or7ÚJcCs| |d¡S©Nr)Úcsi_erase_display©r1Úmoder3r4r4r5r6pr7ÚKcCs| |d¡SrM)Úcsi_erase_linerOr4r4r5r6qr7ÚLcCs|j|dd�S©Nr)Úlines)Ú insert_linesr0r4r4r5r6rr7ÚMcCs|j|dd�SrT)Ú remove_linesr0r4r4r5r6sr7ÚPcCs|j|dd�Sr-)Ú remove_charsr0r4r4r5r6tr7ÚXcCs*| |j|jd|dd|jdf¡S©Nrr,)ÚeraseÚ term_cursorr0r4r4r5r6usÿÿÚaÚaliasÚccCs | |¡S©N)Úcsi_get_device_attributes©r1Znoner3r4r4r5r6yr7ÚdcCs|jd|dddd�S)Nrr,T)Ú relative_xr;)r1Úrowr3r4r4r5r6zr7ÚeÚfÚgcCs| |d¡SrM)Úcsi_clear_tabstoprOr4r4r5r6}r7ÚhcCs | ||¡Srb©Ú csi_set_modes©r1Úmodesr3r4r4r5r6~r7ÚlcCs|j||dd�S)NT©Úresetrmror4r4r5r6r7ÚmcCs | |¡Srb)Ú csi_set_attr)r1Úattrsr3r4r4r5r6€r7ÚncCs| |d¡SrM)Úcsi_status_reportrOr4r4r5r6�r7r3cCs| |d¡SrM)Úcsi_set_keyboard_ledsrOr4r4r5r6‚r7ÚrcCs| |d|d¡Sr\)Úcsi_set_scroll)r1Zt_br3r4r4r5r6ƒr7r1cCs| ¡Srb)Ú save_cursorrdr4r4r5r6„r7ÚucCs| ¡Srb)Úrestore_cursorrdr4r4r5r6…r7ú`c@seZdZdd„Zdd„ZdS)Ú TermModescCs | ¡dSrbrr©Úselfr4r4r5Ú__init__�szTermModes.__init__cCs:d|_d|_d|_d|_d|_d|_d|_d|_t|_ dS©NFT) Ú display_ctrlrÚlfnlÚ keys_decckmÚ reverse_videoÚconstrain_scrollingÚautowrapÚvisible_cursorÚCHARSET_DEFAULTÚ main_charsetr�r4r4r5rs�szTermModes.resetN)Ú__name__Ú __module__Ú __qualname__rƒrsr4r4r4r5r€Œsr€c@sJeZdZdddddœZdd„Zdd„Zd d „Zd d „Zd d„Zdd„Z dS)Ú TermCharsetNÚ0ÚU)ÚdefaultÚvt100ÚibmpcÚusercCsddg|_d|_| d¡dS)Nr”r•Fr)Ú_gÚ _sgr_mappingÚactivater�r4r4r5rƒ¨s þzTermCharset.__init__cCs||j|<|j|jd�dS)z1 Redefine G'g' with new mapping. ©rjN)r˜ršÚactive)r‚rjÚcharsetr4r4r5Údefine²s zTermCharset.definecCs ||_|j |j|d¡|_dS)z2 Activate the given charset slot. N)rœÚMAPPINGÚgetr˜Úcurrent)r‚rjr4r4r5rš¹szTermCharset.activatecCs d|_dS)zA Set graphics rendition mapping to IBM PC CP437. TN)r™r�r4r4r5Ú set_sgr_ibmpcÀszTermCharset.set_sgr_ibmpccCsd|_|j|jd�dS)zC Reset graphics rendition mapping to IBM PC CP437. Fr›N)r™ršrœr�r4r4r5Úreset_sgr_ibmpcÆszTermCharset.reset_sgr_ibmpccCsT|js|j|jdkrLt | d¡¡}|dkr@d|_tt|ƒSd|_|Sn|SdS)Nr–Úcp437rr’r“) r™r˜rœrÚfindÚdecoder¡Ústrr)r‚ÚcharZdec_posr4r4r5Ú apply_mappingÍs zTermCharset.apply_mapping) rŽr�r�rŸrƒržršr¢r£r©r4r4r4r5r‘ sü r‘csDeZdZdZdZdd„Z‡fdd„Z‡fdd„Z‡fd d „Z‡Z S) Ú TermScrollerzd List subclass that handles the terminal scrollback buffer, truncating it as necessary. i'cCst|ƒ|jkr| d¡dSrM)ÚlenÚSCROLLBACK_LINESÚpopr�r4r4r5ÚtruncàszTermScroller.trunccs| ¡tt|ƒ |¡dSrb)r®ÚsuperrªÚappend)r‚Úobj©Ú __class__r4r5r°äszTermScroller.appendcs| ¡tt|ƒ ||¡dSrb)r®r¯rªr)r‚Úidxr±r²r4r5rèszTermScroller.insertcs| ¡tt|ƒ |¡dSrb)r®r¯rªÚextend)r‚Úseqr²r4r5rµìszTermScroller.extend) rŽr�r�Ú__doc__r¬r®r°rrµÚ __classcell__r4r4r²r5rªÙs   rªc@s&eZdZdZdd„Zd|dd„Zdd„Zd}d d „Zd d „Zd~dd„Z ddd„Z d€dd„Z e dƒfdd„Z e dƒfdd„Zdd„Zdd„Zdd„Zdd „Zd�d!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd‚d/d0„Zdƒd1d2„Zd„d3d4„Zd5d6„Zd7d8„Zd…d9d:„Zd;d<„Z d†d=d>„Z!d‡d?d@„Z"dˆdAdB„Z#d‰dDdE„Z$dŠdFdG„Z%dHdI„Z&dJdK„Z'd‹dMdN„Z(dŒdOdP„Z)d�dQdR„Z*dŽdSdT„Z+dUdV„Z,dWdX„Z-dYdZ„Z.d�d[d\„Z/d�d]d^„Z0d_d`„Z1d‘dadb„Z2d’ddde„Z3d“dfdg„Z4dhdi„Z5djdk„Z6dldm„Z7dndo„Z8d”dpdq„Z9d•drds„Z:dtdu„Z;dvdw„ZdS)—Ú TermCanvasFcCs^t |¡|||_|_||_|j|_d|_tƒ|_ d|_ d|_ t ƒ|_ d|jd<| ¡dS)NFr)rrNÚcursor)rrƒÚwidthÚheightÚwidgetÚ term_modesrpÚ has_focusrªÚscrollback_bufferÚ scrolling_upÚutf8_eat_bytesrÚ utf8_bufferZcoordsrs)r‚r»r¼r½r4r4r5rƒós  zTermCanvas.__init__NcCsl|dur|jd}|dur$|jd}| ||¡|_|jrb|jjrb|j|j|krb|||jf|_nd|_dS)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. Nrr,)r^Úconstrain_coordsr¿rpr‹rÁr¼rº)r‚ÚxÚyr4r4r5Úset_term_cursors  ÿþzTermCanvas.set_term_cursorcCsd|_|jd|_dS)z? Reset scrolling region to full terminal size. rr,N)Úscrollregion_startr¼Úscrollregion_endr�r4r4r5Ú reset_scrollszTermCanvas.reset_scrollTcCsx|rd|_| ¡dS|dur(|jd}|s2| }t|jƒ}|j|7_|j|kr\||_n|jdkrld|_| ¡dS)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. rNrK)rÁrÇr¼r«rÀ)r‚rrsrUZ maxscrollr4r4r5Ú scroll_buffers    zTermCanvas.scroll_buffercCsZtƒ|_d|_d|_d|_tƒ|_d|_d|_d|_ |  ¡|  ¡|j   ¡| ¡dS)z% Reset the terminal. FrN)rÚescbufÚ within_escapeÚ parsestateÚattrspecr‘r�Ú saved_cursorÚ saved_attrsÚis_rotten_cursorrÊÚ init_tabstopsrprsÚclearr�r4r4r5rs<s zTermCanvas.resetcCsRt|jdƒ\}}|dkr |d7}|rBt|jƒ|krN|j d¡q$n dg||_dS)Nérr,)Údivmodr»r«Útabstopsr°)r‚rµZtablenÚmodr4r4r5rÓVszTermCanvas.init_tabstopscCs~|r&tt|jƒƒD]}d|j|<qdS|dur8|jd}t|dƒ\}}|rd|j|d|>M<n|j|d|>O<dS©NrrÕr,)rr«r×r^rÖ)r‚rÅÚremoverÔrÚdivrØr4r4r5Ú set_tabstopas  zTermCanvas.set_tabstopcCs6|dur|jd}t|dƒ\}}|j|d|>@dkSrÙ)r^rÖr×)r‚rÅrÛrØr4r4r5Ú is_tabstopps zTermCanvas.is_tabstopú cCs| |¡g|jSrb)Ú empty_charr»©r‚r¨r4r4r5Ú empty_linewszTermCanvas.empty_linecCs|j|jj|fSrb)rÏr�r¡ràr4r4r5rßzszTermCanvas.empty_charcCs4|jdks|jdkrdS|D]}| t|ƒ¡qdSrM)r»r¼Úaddbyter )r‚ÚdataÚbyter4r4r5Úaddstr}szTermCanvas.addstrc Cs¤|j\}}||jkrHt|jƒD]&}|j|| ¡g||j7<qn2||jkrzt|jƒD]}|j|d|…|j|<q\||_||jk�r6t|j|ƒD]š}z|j ¡}Wn4tyÞ|j  |  ¡¡|j d7_ Yq˜Yn0t |ƒ|jk�r|| ¡g|jt |ƒ7}n|d|j…}|d7}|j  d|¡q˜n4||jk�rjt||jƒD]}|j  |j d¡¡�qN||_| ¡| ||¡\}}| ||¡|jdd�dS)zD Resize the terminal to the given width and height. Nr,rT)rµ)r^r»rr¼ÚtermrßrÀr­Ú IndexErrorr°rárÉr«rrÊrÄrÇrÓ)r‚r»r¼rÅrÆÚ last_liner4r4r5Úresize…s>  &      ÿ  zTermCanvas.resizecCsr|jjtkrdS|tdƒkr"d}nd}|tdƒkr8d}n(|tdƒkrJd}n|td ƒkr\d }nd }|j ||¡dS) zF Set G0 or G1 according to 'char' and modifier 'mod'. Nú(rr,r’r•r“r–rQr—r”)rpr�rŒrr�rž)r‚r¨rØrjZcsetr4r4r5Úset_g01ºs     zTermCanvas.set_g01c Cs|j tdƒ¡}g}|j|r dp"dd… tdƒ¡D]2}z t|ƒ}WntyZd}Yn0| |¡q4t|du�rt|ddkr˜tt|d}nt|}|\}}} t|ƒ|krÂ| |¡qªt t|ƒƒD]$} || dusê|| dkrÎ||| <qÎz| |||ƒWnt�yYn0dS)zL Parse ECMA-48 CSI (Control Sequence Introducer) sequences. ú?r,rNú;r`) rÌÚ startswithrÚsplitÚintÚ ValueErrorr°Ú CSI_COMMANDSr«r) r‚r¨ÚqmarkrÌÚargZnumZcsi_cmdZnumber_of_argsZ default_valueÚcmdÚir4r4r5Ú parse_csiÑs,$        zTermCanvas.parse_csicCsN|tdƒkr$|tdƒkr$| ¡�n&|tdƒkr\|tdƒkrFt|j_n|tdƒvrZt|j_nî|tdƒkst|tdƒkr‚| ||¡nÈ|tdƒkrœ|jd d �n®|td ƒkr²| ¡n˜|td ƒkrÈ| ¡n‚|td ƒkrÞ|  ¡nl|tdƒkrô|  ¡nV|tdƒk�r|j   t d¡n6|tdƒk�r0|jd d�n|tdƒk�rJ|jd d�dS)z; Parse escape sequences which are not CSI. ú#Ú8ú%r+ZG8rêú)rWT©ÚreverserBrarCrJÚZú[?6cÚ7)Ú with_attrsN)rÚdecalnrŒrpr�Ú CHARSET_UTF8rëÚlinefeedrsÚnewlinerÜr½ÚrespondÚESCr|r~)r‚r¨rØr4r4r5Ú parse_noncsiôs2               zTermCanvas.parse_noncsicCsJ| tdƒ¡r$|j |dd…¡n"| tdƒ¡rF|j |dd…¡dS)z1 Parse operating system command. rír,Nz3;rK)rîrr½Ú set_title)r‚Úbufr4r4r5Ú parse_oscszTermCanvas.parse_oscc CsX|jdkr\|t ¡vr(| |¡d|_n0|tdƒvsF|jsX|tdƒkrX|j|7_dS�nð|jdkr„|tdƒkr„tƒ|_d|_dS|jdkr´|tdƒkr´| |j tdƒ¡¡�n˜|jdk�r|jd d…|tt d ƒk�r| |jdd … tdƒ¡¡�nJ|jdk�r4|j  td ƒ¡�r4t |jƒd k�r4�n|jdk�rX|j�sX|td ƒk�rXnô|jdk�rv|j|7_dS|jdk�r¢|tdƒk�r¢tƒ|_d|_dS|jdk�rà|tdƒtdƒtdƒtdƒfv�rà||_d|_dS|jdk�rü|  ||j¡nP|tdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒtdƒf v�rL|  |¡|  ¡dS)Nr,rz 0123456789;rìú]rKúr’éÿÿÿÿú\rYrÕÚRú[rúrørêrûérarBrCrJrWrþrrùú>ú=)rÎròÚkeysr÷rrÌrr Úlstriprrîr«rÚ leave_escaperàr4r4r5Ú parse_escapesJ   ," ÿ" . F zTermCanvas.parse_escapecCsd|_d|_tƒ|_dS)NFr)rÍrÎrrÌr�r4r4r5rKszTermCanvas.leave_escapecCs"d}|d@r|dK}|d7}q|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,r4)r‚ZbytenumÚlengthr4r4r5Ú get_utf8_lenPs  zTermCanvas.get_utf8_lencCsê|jjtkstjdkrÔ|dkr8| |¡|_t|ƒ|_dSd|krLdkrÄnnt|jdurÄ|jdkrˆ|jd8_|jt|ƒ7_dSd|_|jt|ƒ  dd¡}t |ƒdkr´dS|  tjd ¡}qÜd|_t|ƒ}nt|ƒ}|  |¡dS) z� Parse main charset and add the processed byte(s) to the terminal state machine. byte -- an integer ordinal Úutf8éÀNé€r,úutf-8ÚignorerÚreplace) rpr�rrZ_target_encodingrrÂrrÃr¦r«ÚencodeÚ process_char)r‚räZsequencer¨r4r4r5râ_s* ÿ  "   zTermCanvas.addbytecCsÀ|j\}}t|tƒrt|ƒ}|jj}|tdƒkrD|jdkrDd|_�nx|s`|tdƒkr`|  ¡�n\|s€|tdƒkr€|j   d¡�n<|s |tdƒkr |j   d¡�n|sÊ|td ƒvrÊ|  ¡|jj rÈ|  ¡nò|sä|td ƒkrä| ¡nØ|�s|td ƒk�r|dk�r¼| |d|¡n¨|�s@|td ƒk�r@|jdk�r@|j ¡n||�s^|td ƒv�r^| ¡n^|�st|tdƒv�rtnH|j�rˆ| |¡n4|�s²|tdƒk�r²d|_tƒ|_d|_n | |¡dS)ze Process a single character (single- and multi-byte). char -- a byte string úrKTú úrúr,z ú úr zzõ›N)r^Ú isinstancerðÚchrrpr…rrÎrÍÚcarriage_returnr�ršrr†rrÇr½ÚbeeprrrrÌÚ push_cursor)r‚r¨rÅrÆZdcr4r4r5r#ƒsD           zTermCanvas.process_charcCsR|dur|jd}|dur$|jd}| ||¡\}}|j|jj|f|j||<dS)z~ Set character of either the current cursor position or a position given by 'x' and/or 'y' to 'char'. Nrr,)r^rÄrÏr�r¡ræ©r‚r¨rÅrÆr4r4r5Úset_char²s   zTermCanvas.set_charcCs|||jkr|jd}n |dkr"d}|jjrR|sR||jkr@|j}qt||jkrt|j}n"||jkrh|jd}n |dkrtd}||fS)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»rpr‰rÉrÈr¼)r‚rÅrÆÚignore_scrollingr4r4r5rÄ¿s       zTermCanvas.constrain_coordscCsš|j\}}|rL|dkr$|jkr*qJnqŠ||jkrB|jdd�qŠ|d8}n>||jdkrh|jkrnqŠnn||jkr‚| ¡n|d7}| ||¡dS)zw Move the cursor down (or up if reverse is True) one line but don't reset horizontal position. rTrür,N)r^rÈÚscrollr¼rÉrÇ)r‚rýrÅrÆr4r4r5r×s      zTermCanvas.linefeedcCs| d|jd¡dSr\)rÇr^r�r4r4r5r-ïszTermCanvas.carriage_returncCs| ¡| ¡dS)z? Do a carriage return followed by a line feed. N)r-rr�r4r4r5ròszTermCanvas.newlinecCsT|r d}}|r|jd|}|r2|jd|}n|jjrD||j7}| ||¡dS)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. Trr,N)r^rpr‰rÈrÇ)r‚rÅrÆrfrFr:r4r4r5r<ùs zTermCanvas.move_cursorcCsD|dur4|j |¡}|jjr*|j|d�n | |¡| ||¡dS)zS Push one character to current position and advance cursor to x/y. N)r¨)r�r©rprr/r1rÇr0r4r4r5Ú push_chars   zTermCanvas.push_charcCsÄ|j\}}|jjr–|d|jkr<|js._defaulterú,r”) ÚaddÚdiscardr�r£rpr…r¢rÔr«ÚjoinÚlistr )r‚rvÚfgÚbgÚ attributesÚattrrPr4r4r5Úsgi_to_attrspecós\                      zTermCanvas.sgi_to_attrspeccCsÒ|ddkrd|_tƒ}|jdur,d}}nvd|jjvr>d}n|jj}|dkrV|d8}d|jjvrhd}n|jj}|dkr€|d8}dD]}t|j|ƒs–q„| |¡q„| ||||¡}|j j rÈ|  |¡|_n||_dS)z) Set graphics rendition. rrNr”rÕ)rHrBrKrM) rÏÚsetÚ foregroundZforeground_numberZ backgroundZbackground_numberÚgetattrrRrZrprˆÚreverse_attrspec)r‚rvrXrVrWrYrÏr4r4r5ru:s*       zTermCanvas.csi_set_attrcCsr|durtddƒ}dd„|j d¡Dƒ}d|vrL|rL| d¡d |¡|_n"d|vrn|sn| d¡d |¡|_|S)zd Put standout mode to the 'attrspec' given and remove it if 'undo' is True. Nr”cSsg|] }| ¡‘qSr4)Ústrip)Ú.0rVr4r4r5Ú fr7z/TermCanvas.reverse_attrspec..rQrM)r r\rïrÚrTr°)r‚rÏÚundorvr4r4r5r^_s      zTermCanvas.reverse_attrspeccCs`t|jƒD]P}t|jƒD]@}|j||}|j|d|d�}|f|dd…|j||<qq dS)zP Reverse video/scanmode (DECSCNM) by swapping fg and bg colors. r©rbr,N)rr¼r»rær^)r‚rbrÆrÅr¨rvr4r4r5rˆos zTermCanvas.reverse_videocCsÖ|rž|dkr||j_qÒ|dkr(| ¡qÒ|dkrT|jj|krJ|j| d�||j_qÒ|dkrr||j_| dd¡qÒ|dkr„||j_qÒ|dkrÒ||j_| ¡n4|dkr°||j_n"|d krÂ||j_ n|d krÒ||j_ d S) zC Helper method for csi_set_modes: set single mode. r,rrJrcérrLrOrIéN) rpr‡rÔrˆr‰rÇrŠr‹r…rr†)r‚rPÚflagrórsr4r4r5Úset_modeys.        zTermCanvas.set_modecCs$| }|D]}| ||||¡q dS)zX Set (DECSET/ECMA-48) or reset modes (DECRST/ECMA-48) if reset is True. N)rg)r‚rprórsrfrPr4r4r5rnšszTermCanvas.csi_set_modesrcCsx|dkr d}|dkr|j}||kr0|jkrtnn@|jd|ddd�d|_|jd|ddd�d|_| dd¡dS)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). rr,T)r2N)r¼rÄrÈrÉrÇ)r‚ÚtopZbottomr4r4r5r{£s  ÿþ ÿþzTermCanvas.csi_set_scrollcCs.|dkr|jdd�n|dkr*|jdd�dS)zc Clear tabstop at current position or if 'mode' is 3, delete all tabstops. rT)rÚr)rÔN)rÜ©r‚rPr4r4r5rk¸szTermCanvas.csi_clear_tabstopcCs|s|j td¡dS)zz Report device attributes (what are you?). In our case, we'll report ourself as a VT102 terminal. rÿN)r½rr)r‚rór4r4r5rcÂsz$TermCanvas.csi_get_device_attributescCsP|dkr|j td¡n2|dkrL|j\}}|j td|d|df¡dS)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 rJz[0nrdz[%d;%dRr,N)r½rrr^©r‚rPrÅrÆr4r4r5rxÊs  zTermCanvas.csi_status_reportcCs`|j\}}|dkr,| |j|jd|f¡n0|dkrJ| d|f||f¡n|dkr\| |¡dS)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. rr,rKN)r^r]r»r8rjr4r4r5rRØs zTermCanvas.csi_erase_linecCsj|dkr&| |j|jd|jdf¡|dkrP| d|jdd|jdf¡n|dkrf|j|jd�dS)z¸ Erase display, modes are: 0 -> erase from cursor to end of display. 1 -> erase from start to cursor. 2 -> erase the whole display. rr,)rrrK)rºN)r]r^r»r¼rÔrir4r4r5rNès "zTermCanvas.csi_erase_displaycCs*dddddœ}||vr&|j ||¡dS)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ÔZ scroll_lockZnum_lockZ caps_lock)rr,rKrN)r½Úleds)r‚rPZstatesr4r4r5ryös üz TermCanvas.csi_set_keyboard_ledscs>‡fdd„tˆjƒDƒˆ_|dur0ˆ dd¡n ˆj|ŽdS)zŒ Clears the whole terminal screen and resets the cursor position to (0, 0) or to the coordinates given by 'cursor'. csg|] }ˆ ¡‘qSr4)rá)r`rÅr�r4r5rar7z$TermCanvas.clear..Nr)rr¼rærÇ)r‚rºr4r�r5rÔ szTermCanvas.clearcCs|jSrb)r»r�r4r4r5rAszTermCanvas.colscCs|jSrb)r¼r�r4r4r5r>szTermCanvas.rowsccsT|jdkr|jD] }|Vqn2|j|j}||j|j |j …D] }|VqDdSrM)rÁrærÀr¼)r‚Z trim_leftZ trim_rightrAr>Zattr_mapÚliner r4r4r5Úcontents     zTermCanvas.contentcCs"||ur| ¡g| ¡S| ¡Srb)rAr>rm)r‚Úotherr4r4r5Ú content_delta'szTermCanvas.content_delta)NN)TFN)F)NFF)N)N)NN)F)F)FFF)N)F)F)rÕ)F)Nr,N)Nr,)Nr,)Nr,)F)F)F)rr)r)r)N)rrNNN)?rŽr�r�Z cacheablerƒrÇrÊrËrsrÓrÜrÝrrárßrårérër÷rr rrrrâr#r1rÄrr-rr<r4r/r|r~rr3rr8r/rZrVrXr]rZrur^rˆrgrnr{rkrcrxrRrNryrÔrAr>rmror4r4r4r5r¹ðs~    5#  /$/  ÿ  %       #G%  !    ÿ r¹c@s¸eZdZdZeegƒZgd¢Zd+dd„Zdd„Z d d „Z d d „Z d d„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd,dd„Zd d!„Zd"d#„Zd-d%d&„Zd'd(„Zd)d*„ZdS).ÚTerminalT)Úclosedr.rkÚtitleNrcCsŽt |¡|pd|_t|ptjƒ|_|p6|j dd¡g|_||_ d|_ d|_ g|_ t ƒ|_||_d|_d|_d|_d|_d|_d|_d|_dS)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. zctrl aZSHELLz/bin/shFN)rrƒÚescape_sequenceÚdictÚosÚenvironÚenvr ÚcommandÚencodingÚkeygrabÚlast_keyÚresponse_bufferr€r¾Ú main_loopÚmasterÚpidr»r¼rær¿Ú terminated)r‚rxrwr}rsryr4r4r5rƒ3s"!  zTerminal.__init__cCst|jdurdS|jj|jj}}|d|j_|d|j_|j |jjd|jjd¡\}}|||j_|j_||fS)z8Return the cursor coordinates for this terminal Nrr,)rær»r¼rÄr^)r‚ÚsizeZ orig_widthZ orig_heightrÅrÆr4r4r5Úget_cursor_coordsps     þzTerminal.get_cursor_coordsc CsÈ|j}d|d<t ¡\|_|_|jdkršt|jƒr„zBz | ¡Wn&tj  t   ¡¡tj  ¡Yn0Wt  d¡qšt  d¡0nt  |jd|j|¡|jdur¸t |jtjt j¡t |j¡dS)NZlinuxZTERMr)rwÚptyÚforkrr~ÚcallablerxÚsysÚstderrÚwriteÚ tracebackÚ format_excÚflushruÚ_exitÚexecvper}ÚfcntlZF_SETFLÚ O_NONBLOCKÚatexitÚregisterÚ terminate)r‚rwr4r4r5Úspawn†s     zTerminal.spawnc Csâ|jr dSd|_| ¡| d¡|jdkrÞ| dd¡tjtjtjtj tj fD]Z}z&t   |j|¡t   |jt j¡\}}Wnty’Yq¬Yn0|dkr q¬t d¡qPzt   |jd¡WntyÐYn0t  |j¡dS)NTFrgš™™™™™¹?)r€Ú remove_watchÚ change_focusrÚ set_termsizeÚsignalÚSIGHUPÚSIGCONTÚSIGINTÚSIGTERMÚSIGKILLruÚkillÚwaitpidÚWNOHANGÚOSErrorÚtimeÚsleepÚcloser~)r‚ZsigrÚstatusr4r4r5r’žs.    ÿ    zTerminal.terminatecCs| d¡dS)Nr.©Ú_emitr�r4r4r5r.ºsz Terminal.beepcCs| d|¡dS)Nrkr¥)r‚Úwhichr4r4r5rk½sz Terminal.ledscCs|j |¡dS)zF Respond to the underlying application with 'string'. N)r|r°©r‚Ústringr4r4r5rÀszTerminal.respondcCs*|jD]}t |j| d¡¡qg|_dS)NÚascii)r|rurˆr~r"r¨r4r4r5Úflush_responsesÆs zTerminal.flush_responsescCs(t d||dd¡}t |jtj|¡dS)NZHHHHr)ÚstructÚpackrŽZioctlr~ÚtermiosZ TIOCSWINSZ)r‚r»r¼Zwinsizer4r4r5r–ËszTerminal.set_termsizecCs~d}|jdur| ¡d}|j|kr2|j|kr2dS| ||¡|jsTt|||ƒ|_n|j ||¡||_||_|rz| ¡dSr„) rr“r»r¼r–rær¹réÚ add_watch)r‚r»r¼Zprocess_openedr4r4r5Ú touch_termÏs  zTerminal.touch_termcCs| d|¡dS)Nrrr¥)r‚rrr4r4r5r æszTerminal.set_titlecCsl|jr dS||_|jdur,||j_|j ¡|rPtƒ ¡|_tƒjdgdŽnt|dƒrhtƒj|jŽdS)z9 Ignore SIGINT if this widget has focus. NZ undefinedrJÚold_tios)r€r¿rærÇr Ztty_signal_keysr±Úhasattr)r‚r¿r4r4r5r•és    zTerminal.change_focusFcCs<|js6| |¡|\}}| ||¡|jdur6| ¡|jSrb)r€r•r°r}Úfeedræ)r‚r�Zfocusr»r¼r4r4r5Úrenderýs   zTerminal.rendercCs$|jdurdS|j |j|j¡dSrb)r}Z watch_filer~r³r�r4r4r5r¯ s zTerminal.add_watchcCs |jdurdS|j |j¡dSrb)r}Zremove_watch_filer~r�r4r4r5r”s zTerminal.remove_watchçð?c Csbzt |jggg|¡WqVWqtjyR}z|jddkr>‚WYd}~qd}~00q| ¡dS)NrrI)Úselectr~ÚerrorÚargsr³)r‚Útimeoutrhr4r4r5Ú wait_and_feedszTerminal.wait_and_feedc Csžt}zt |jd¡}WnPtyf}z8|jdkr6t}n|jtjkrPWYd}~dS‚WYd}~n d}~00|tkr†| ¡| d¡dS|j   |¡|  ¡dS)NirJrq) ÚEOFruÚreadr~r ÚerrnoZ EWOULDBLOCKr’r¦rærår«)r‚rãrhr4r4r5r³s    z Terminal.feedcCsú|jr |S|dkr*|\}}| ||¡dS|j|jkrN||jkrN||_d|_nÔ|jrp|j|krnd|_||_dSn²|dkr”|j ¡||_| ¡dS|dkr¼|jjdd�||_| ¡dS|j|jkrÜ||jkrÜ||_|S|j|kröd|_||_dS|j|du�s|dk�rd|_n ||_|S||_|jjdd�|  d ¡�rŒ|d   ¡�rnt t |d ƒt d ƒd ƒ}nt t |d ƒt d ƒd ƒ}n,|j j�r¬|tv�r¬t |¡}n t ||¡}|j j�rÔ|dk�rÔ|d7}t�rè| |jd¡}t |j|¡dS)Nz window resizeTFr"r#)rrrrzctrl rr_r,r8r%Ú r )r€r°r{rsrzrærËZ _invalidateZ _command_maprîÚislowerr,Úordr¾r‡ÚKEY_TRANSLATIONS_DECCKMr ÚKEY_TRANSLATIONSr†rr"ryrurˆr~)r‚r�Úkeyr»r¼r4r4r5Úkeypress3sj  ÿ   ÿ    zTerminal.keypress)NNNr)F)rµ)rŽr�r�Z _selectableÚ frozensetr Z_sizingZsignalsrƒr‚r“r’r.rkrr«r–r°r r•r´r¯r”rºr³rÄr4r4r4r5rp-s. ÿ =  rp)5Z __future__rrrur†r¡r6r½r¶r¬r—r�r‰rƒrŽr®Ú ImportErrorZurwidrZ urwid.escaperrZ urwid.canvasrZ urwid.widgetrr Zurwid.display_commonr r r Z urwid.compatr rrrrrr»r,rrÂrÁròrŒrÚobjectr€r‘rUrªr¹rpr4r4r4r5ÚsÖ     å÷Ø+9E