grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a BjŒjà�ã@süddlmZmZddlZddlZddlZddlZddlZzddlZddl Z ddl Z Wne yfYn0ddl m Z ddl mZddlmZmZmZmZmZmZddl mZddlmZmZmZddlmZmZGd d „d eeƒZd d „Ze d krøeƒdS)é)ÚdivisionÚprint_functionN)Úutil)Úescape)Ú BaseScreenÚ RealTerminalÚUPDATE_PALETTE_ENTRYÚAttrSpecÚUNPRINTABLE_TRANS_TABLEÚINPUT_DESCRIPTORS_CHANGED)Úsignals)ÚPYTHON3ÚbytesÚB)ÚPopenÚPIPEcszeZdZejejf‡fdd„ Zdd„Zdd„ZdTd d „Z dUd d „Z dVd d„Z dd„Z dd„Z dWdd„Zdd„Zdd„Zdd„ZdX‡fdd„ Z‡fdd„Zd d!„Zd"d#„ZdYd%d&„Zd'd(„Zd)Zd*d+„Zd,d-„ZdZdZd.d/„Zd0d1„ZdZd2d3„Zd4d5„Z d6d7„Z!d8d9„Z"d:d;„Z#dd?„Z%d@dA„Z&dBdC„Z'dDdE„Z(dFdG„Z)dHdI„Z*dJdK„Z+d[dLdM„Z,dNdO„Z-dPdQ„Z.dRdS„Z/‡Z0S)\ÚScreencstt|ƒ ¡i|_i|_t |t|j¡d|_ d|_ g|_ d|_ |  ¡d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tj dd¡|_|j d¡ |_|jd k|_|j d ¡ |_ | !dd d ¡d|_"t#j#|_$||_%||_&t '¡\|_(|_)t* *|j(t*j+tj,¡dS) z]Initialize a screen that directly prints escape codes to an output terminal. éTrNFÚTERMÚZxtermÚlinuxZscreenÚdefault)-ÚsuperrÚ__init__Ú _pal_escapeÚ _pal_attrspecr Zconnect_signalrÚ_on_update_palette_entryÚcolorsÚ has_underlineZ _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_eraseZregister_palette_entryÚ _next_timeoutÚsignalÚsignal_handler_setterÚ_term_output_fileÚ_term_input_fileÚpipeÚ_resize_pipe_rdÚ_resize_pipe_wrÚfcntlÚF_SETFLÚ O_NONBLOCK)ÚselfÚinputÚoutput©Ú __class__©ú7/usr/lib64/python3.9/site-packages/urwid/raw_display.pyr4sBÿ zScreen.__init__cCst|jdƒr|j ¡SdSdS)zŠReturns 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)Úhasattrr8rF©r?rDrDrEÚ _input_fileno]s  zScreen._input_filenocGs8|ddddddœ|j}||j|<| |¡|j|<dS)Nréééé)rrJéXéé)rrÚ_attrspec_to_escaper)r?ÚnameZ attrspecsÚarDrDrEres zScreen._on_update_palette_entryNçÀ?cCs@||_|dur0|jdur ||_nt|j|jƒ|_||_||_dS)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_waitr4ÚminÚ complete_waitÚ resize_wait)r?rUrWrXrDrDrEr ks zScreen.set_input_timeoutscCs(|jst |jtdƒ¡d|_d|_dS)úV frame -- will always be None when the GLib event loop is being used. ÚRTN)r#r,Úwriter;rr!©r?ZsignumÚframerDrDrEÚ_sigwinch_handler„szScreen._sigwinch_handlercCs | ¡| ¡| dd¡dS)rYN)ÚstopÚstartr^r\rDrDrEÚ_sigcont_handlerŽszScreen._sigcont_handlercCs$| tj|j¡| tj|j¡dS)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)r6r5ÚSIGWINCHr^ÚSIGCONTrarHrDrDrEÚ signal_init—szScreen.signal_initcCs$| tjtj¡| tjtj¡dS)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)r6r5rcÚSIG_DFLrbrHrDrDrEÚsignal_restore¢szScreen.signal_restoreTcCs*t|ƒ}||jkrdS| |¡||_dS)z£ Enable (or disable) mouse tracking. After calling this function get_input will include mouse click events along with keystrokes. N)Úboolr'Ú_mouse_tracking©r?ÚenablerDrDrEÚset_mouse_tracking­s   zScreen.set_mouse_trackingcCs2|r| tj¡| ¡n| tj¡| ¡dS©N)r[rZMOUSE_TRACKING_ONÚ_start_gpm_trackingZMOUSE_TRACKING_OFFÚ_stop_gpm_trackingrirDrDrErh»s    zScreen._mouse_trackingcCsjtj d¡sdStj dd¡ ¡ d¡s,dSts4dStgd¢ttdd�}t   |j   ¡t j tj ¡||_dS)Nú /usr/bin/mevrrr)roz-eZ158T)ÚstdinÚstdoutZ close_fds)r,ÚpathÚisfiler-r.Úlowerr0rrr<rqrFr=r>r%)r?ÚmrDrDrErmÃs  ÿzScreen._start_gpm_trackingcCs6|js dSt |jjtj¡t |jjd¡d|_dS©Nr)r%r,ÚkillÚpidr5ÚSIGINTÚwaitpidrHrDrDrErnÏs zScreen._stop_gpm_trackingcsž|r| tj¡d|_nd|_| ¡}|durNt |¡rNt |¡|_ t   |¡|  ¡||_ |j|_|jsx|j|d�|_t |t¡| |j¡tt|ƒ ¡S)zp Initialize the screen and input mode. alternate_buffer -- use alternate screen buffer Nr)rF)r[rZSWITCH_TO_ALTERNATE_BUFFERr*rIr,ÚisattyÚtermiosZ tcgetattrÚ_old_termios_settingsÚttyZ setcbreakrdÚ_alternate_bufferrUr4Z_signal_keys_setÚtty_signal_keysÚ_old_signal_keysr Ú emit_signalr rhr'rrÚ_start)r?Zalternate_bufferÚfdrBrDrErƒÖs      z Screen._startcsÔ| ¡t |t¡| ¡| ¡}|durHt |¡rHt  |tj |j ¡|  d¡d}|j rdtj}n|jdur|t d|j¡}| | tddƒ¡tj|tj¡| ¡|jrÂ|j|j|fŽtt|ƒ ¡dS)z% Restore the screen. NFrr)Úclearr r‚r rfrIr,r{r|Z tcsetattrZ TCSADRAINr}rhrrZRESTORE_NORMAL_BUFFERr$Úset_cursor_positionr[rQr ÚSIÚ SHOW_CURSORÚflushr�r€rrÚ_stop)r?r„Z move_cursorrBrDrErŠôs6   ÿÿþýÿz Screen._stopcCs|j |¡dS)z¡Write 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)r7r[)r?ÚdatarDrDrEr[sz Screen.writecCs|j ¡dS)z™Flush the output buffer. You may wish to override this if you're using something other than regular files for input and output. N)r7r‰rHrDrDrEr‰sz Screen.flushFcCsÎ|js J‚| |j¡| dd| ¡¡\}}|dgkr�|jr�| |j¡| dd| ¡¡\}}||7}|dgkrŸs ÿz(Screen.hook_event_loop..csg|]}ˆ |ˆ¡‘qSrD)Z watch_file)Ú.0r„)r›ÚwrapperrDrEÚ ¢óz*Screen.hook_event_loop..N)rGÚ_make_legacy_input_wrapperr—r˜)r?r›ržZfdsZhandlesrD©ržr›r?r¡rEÚhook_event_loop”s  zScreen.hook_event_loopcs‡‡‡‡fdd„‰ˆS)zs Support old Screen classes that still have a get_input_nonblocking and expect it to work. csJˆjrˆ ˆj¡dˆ_ˆ ¡\}}}|dur<ˆ |ˆ¡ˆ_ˆ||ƒdSrl)r™ršr�Úalarm)Útimeoutr“r”r¥rDrEr¡­s z2Screen._make_legacy_input_wrapper..wrapperrD)r?r›ržrDr¥rEr¤¨s z!Screen._make_legacy_input_wrappercCsR| ¡| ¡}|jr&|j|}d|_zt |jd¡q(WntyLYn0|S)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. NrJ)Ú_get_gpm_codesÚ_get_keyboard_codesÚ_partial_codesr,Úreadr:ÚOSError)r?ÚcodesrDrDrEr‘¹s  zScreen.get_available_raw_inputc sâˆjrˆrˆ ˆj¡dˆ_ˆ}g}z$ˆrFt ˆ|¡\}‰| |¡q&Wn\tjy¤t|ƒtˆƒ}|d|…} ˆˆ_‡‡‡‡fdd„} ˆr ˆ ˆj | ¡ˆ_Yn 0|} dˆ_ˆj rÆ|  d¡dˆ_ ˆrÖˆ|| ƒn|| fSdS)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. Ncs"dˆ_dˆ_ˆjˆˆˆdd�dS)NF)Ú wait_for_more)r™r«r�rD©ržr®r›r?rDrEÚ_parse_incomplete_inputðs ÿz3Screen.parse_input.._parse_incomplete_inputrŒF) r™ršrZprocess_keyqueueÚextendZMoreInputRequiredÚlenr«r§rWr#r’) r?r›ržr®r¯Zoriginal_codesZ processedÚrunÚkZprocessed_codesr±rDr°rEr�Ïs8  ÿ ÿ   zScreen.parse_inputcCs&g}| ¡}|dkrq"| |¡q|Srv)Ú_getch_nodelayr’)r?r®ÚcoderDrDrErªs  zScreen._get_keyboard_codesc Csbg}z$|jdur&|jr&| | ¡¡qWn4ty\}z|jddkrH‚WYd}~n d}~00|S)Nré )r%r&r²Ú_encode_gpm_eventÚIOErrorÚargs)r?r®ÚerDrDrEr©szScreen._get_gpm_codesc CsÎd}g}| ¡}|dur"| |¡|jdur>| |jj ¡¡z<|dur^t |g|¡\}}}nt |g||¡\}}}WqÊWq>tjyÆ}z2|jddkrœ‚|jr²g}WYd}~qÊWYd}~q>d}~00q>|S)NrrM) rIr’r%rqrFÚselectÚerrorr»r#)r?r¨Úreadyr–r„ÚwÚerrr¼rDrDrEr�s.  ÿ ÿ $zScreen._wait_for_input_readycCsV| |¡}|jdur*|jj ¡|vr*d|_| ¡}|durR||vrRtt |d¡ƒSdS)NTrJr�) r�r%rqrFr&rIÚordr,r¬)r?r¨r¿r„rDrDrEÚ_getch3s  z Screen._getchcsŽd|_|jj ¡ d¡}| d¡‰tˆƒdkrF| ¡t  |t ¡gS| d¡\}‰‰}‰}t | d¡ddƒ}t ˆ d¡dƒ‰t ˆ  ¡ d¡d ƒ‰t ˆ d¡dƒ‰t | d¡d  ¡dƒ}|j‰}g‰d ‰|d @räˆd O‰|d @rôˆd O‰|d @�rˆdO‰‡‡‡‡fdd„‰‡‡‡fdd„}|dk�sF|dk�sF|dk�rÀˆd @�rnˆd @d k�rnˆd ƒ|d O}ˆd@�r–ˆd@d k�r–ˆd ƒ|dO}ˆd @�r–ˆd @d k�r–ˆdƒ|d O}nÖ|dk�rˆd @�räˆd tjƒn2ˆd@�rþˆd tjƒnˆd @�r–ˆdtjƒn~ˆd @�rBˆd @�rBˆd tjƒ|dM}ˆd@�rlˆd@�rlˆd tjƒ|dM}ˆd @�r–ˆd @�r–ˆdtjƒ|dM}|dk�rˆd @�rˆd @�rˆd tjƒˆd@�räˆd@�räˆd tjƒˆd @�r„ˆd @�r„ˆdtjƒn||dk�r„ˆd @�r8ˆd @�r8ˆd tjdƒˆd@�r^ˆd@�r^ˆd tjdƒˆd @�r„ˆd @�r„ˆdtjdƒ||_ˆS)NFÚasciiú,éÚxr�rú rrJrMé éc s6|ˆO}ˆ dtdƒtdƒ|dˆdˆdg¡dS)Néú[ÚMé )r²rÂ)Úb)ÚlÚmodrÇÚyrDrEÚ append_buttonWsz/Screen._encode_gpm_event..append_buttoncspˆd@r$ˆd@r$ˆd|ƒ|dO}ˆd@rHˆd@rHˆd|ƒ|dO}ˆd@rlˆd@rlˆd|ƒ|dO}dS)NrMrJrrKrD)ÚflagÚnext)rÓrÏÚlastrDrEÚdetermine_button_release[s   z:Screen._encode_gpm_event..determine_button_releaseéé$é4rKé’éþÿÿÿéýÿÿÿéûÿÿÿé()r&r%rqÚreadlineÚdecodeÚsplitr³rnr r‚r ÚintÚlstripÚrstripr(rZMOUSE_DRAG_FLAGZMOUSE_RELEASE_FLAGZMOUSE_MULTIPLE_CLICK_FLAG)r?ÚsZevZignrurÕr×rD)rÓrÏrÐrÖrÑrÇrÒrEr¹=s~            zScreen._encode_gpm_eventcCs | d¡Srv)rÃrHrDrDrEr¶“szScreen._getch_nodelaycCs`d\}}z6t|jdƒr.partial_displayr�cs"ˆƒst dd¡Stjt ˆ¡Srv)rr†ÚCURSOR_HOME_COLÚmove_cursor_uprD©ÚcyrîrDrEÚset_cursor_homeÛs  ÿz+Screen.draw_screen..set_cursor_homecs ˆƒst d|¡St |ˆ¡Srv)rr†Úmove_cursor_down)rÒrñrDrEÚset_cursor_rowás z*Screen.draw_screen..set_cursor_rowcs^ˆƒst ||¡Sˆ|kr.set_cursor_positioncSs(t|ƒdkrdS|dd ¡r$dSdS)NrJFrrKT)r³Ústrip)ÚrowrDrDrEÚ is_blank_rowñs  z(Screen.draw_screen..is_blank_rowcs8|ˆjvrˆj|St|tƒr(ˆ |¡Sˆ tddƒ¡S)Nr)rÚ isinstancer rQ©rSrHrDrEÚattr_to_escapeøs    ÿz*Screen.draw_screen..attr_to_escapecs$ˆj ||¡}t|tƒo"|jp"|jSrl)rr.rúr ÚstandoutÚ underlinerûrHrDrEÚusing_standout_or_underlinesz7Screen.draw_screen..using_standout_or_underlinerrJFrÈTÚU)NÚ0rrözutf-8ÚreplacerM)(rŽZrowsr!r"rír#rZ HIDE_CURSORrQr r’Z CURSOR_HOMEr+Zcontentr³r*rr3råÚ _last_rowrúrÚ translater ÚreprZ IBMPC_OFFr‡ZIBMPC_ONZSOZ INSERT_ONZ INSERT_OFFZERASE_IN_LINE_RIGHTZcursorrˆr rár[r‰rºr»)!r?ZmaxresÚrZmaxcolr$ÚoZosbZsbrÒrórõr†rùrürÿZinsrøZwhitespace_at_endrSÚcsr´ZbackÚfirstZlastaZlastcsZinsertaZinsertcsZ inserttextZiasZicssrÇrÐr¼rD)ròrîr?rEÚ draw_screen¶sØ      "  ÿ$           ý     ÿ  zScreen.draw_screencCsR|dd…}|d\}}}t |dt|ƒ¡}t |dt|ƒ|d¡\}}|dkrÈ|} |d=|d\} } } t | dt| ƒ¡} || 7}t | dt| ƒ| d¡\}}| |d…}|rÆ| | | | d|…f¡nf||d…} ||} } t |d|¡} t |d|| d¡\}}|||…}|�r.| | | |d|…f¡| ||| f¡|||| | |ffS)aOn 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�rrJrÜ)rZ calc_widthr³Z calc_text_posr’)r?røZnew_rowZz_attrZz_csZ last_textZ last_colsZ last_offsZz_colZz_textZy_attrZy_csZ nlast_textZ nlast_colsZ nlast_offsZy_colZy_textrDrDrErnsJ  ÿÿ ÿ  ÿ  ÿÿ  ÿzScreen._last_rowcCsd|_d|_dS)zh Force the screen to be completely repainted on the next call to draw_screen(). NT)r!Zsetup_G1rHrDrDrEr…�sz Screen.clearcCs�|jdkr6tjd|jf}tjd|jf}||S|jrRd| ¡dd…}nd|jrdd|j}nR|jr²|jdkr¢|j rŽd |jd d }q°d |jd d }q¶d |jd }nd}d|j d|j d|j d|j d|jd|j}|j�rd| ¡dd…}nl|j�r$d|j}nX|j�rx|jdk�rh|j�rTd|jd d}nd |jd d}nd |jd}nd}tjd|||fS)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;%drrLz38;5;%déz1;%drÊéz%déZZ39z1;z3;z4;z5;z7;z9;z 48;2;%d;%d;%drÆz48;5;%dz5;%drßédZ49z [0;%s;%s%sm)r/rZESCZforeground_numberZbackground_numberZforeground_trueÚget_rgb_valuesZforeground_highZforeground_basicr1ZboldZitalicsrþZblinkrýZ strikethroughZbackground_trueZbackground_highZbackground_basicr2)r?rSÚfgÚbgÚstrDrDrErQ¦sH   ÿÿþþ  zScreen._attrspec_to_escapecCs–|dur|j}|dur|j}|dur*|j}||jkrL||jkrL||jkrLdS||_||_||_| ¡i|_|j ¡D]\}}|j|g|¢RŽqvdS)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)rr1rr…rZ_paletteÚitemsr)r?rZbright_is_boldrÚpÚvrDrDrEÚset_terminal_propertiesÚs" ÿzScreen.set_terminal_propertiescsZ|jdkrdS|jdkrd‰n|j‰‡fdd„‰‡fdd„ttˆdƒƒDƒ}| |¡dS) 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. rJNrPrOcs:ˆdkrtd|ddƒ}ntd|dˆƒ}| ¡dd…S)Nrzh%drrOrL)r r)ÚnZaspec)rrDrEÚ rgb_values sz9Screen.reset_default_terminal_palette..rgb_valuescsg|]}|fˆ|ƒ‘qSrDrD)r r)rrDrEr¢r£z9Screen.reset_default_terminal_palette..)rÚrangerVÚmodify_terminal_palette)r?ÚentriesrD)rrrEÚreset_default_terminal_paletteýs   z%Screen.reset_default_terminal_palettecCsd|jdkr2dd„|Dƒ}| dd |¡d¡n&dd„|Dƒ}| dd |¡d ¡| ¡d S) 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 cSs$g|]\}}}}d||||f‘qS)z %d;%d;%d;%drD©r ÚindexZredZgreenZbluerDrDrEr¢"s ÿz2Screen.modify_terminal_palette..z[3;ú;ú}cSs$g|]\}}}}d||||f‘qS)z%d;rgb:%02x/%02x/%02xrDrrDrDrEr¢&s ÿz]4;z\N)r/r[Újoinr‰)r?rZmodifyrDrDrErs ÿÿzScreen.modify_terminal_palettecCst|||jƒSrl)r r)r?rrrDrDrErŸ.r£zScreen.)NrTrT)N)N)T)T)F)T)NNN)1Ú__name__Ú __module__Ú __qualname__ÚsysrprqrrIrr r^rardrfrkrhrmrnrƒrŠr[r‰r•r—r˜rœr¦r™r«r¤r‘r�rªr©r�rÃr¹r¶rìrír rr…rQrrrr Ú __classcell__rDrDrBrEr3s^)ÿ      # K  8   V9/ 4ÿ #rcCsddl}| ¡dSrv)ÚdoctestZtestmod)r(rDrDrEÚ_test1sr)Ú__main__)!Z __future__rrr,r½rér&r5r<r|r~Ú ImportErrorZurwidrrZurwid.display_commonrrrr r r r Z urwid.compatr rrÚ subprocessrrrr)r#rDrDrDrEÚs: