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Ä| |j¡| dd| ¡¡\}}|dgkr†|jr†| |j¡| dd| ¡¡\}}||7}|dgkr2qjq2|dd…dgkr†| d¡|dgkr˜d|_n|jdkr®|s®d|_nd|_|rÀ||fS|S)axReturn pending input as a list. raw_keys -- return raw keycodes as well as translated versions This function will immediately return all the input since the last time it was called. If there is no input pending it will wait before returning an empty list. The wait time may be configured with the set_input_timeouts function. If raw_keys is False (default) this function will return a list of keys pressed. If raw_keys is True this function will return a ( keys pressed, raw keycodes ) tuple instead. Examples of keys returned: * ASCII printable characters: " ", "a", "0", "A", "-", "/" * ASCII control characters: "tab", "enter" * Escape sequences: "up", "page up", "home", "insert", "f1" * Key combinations: "shift f1", "meta a", "ctrl b" * Window events: "window resize" When a narrow encoding is not enabled: * "Extended ASCII" characters: "\xa1", "\xb2", "\xfe" When a wide encoding is enabled: * Double-byte characters: "\xa1\xea", "\xb2\xd4" When utf8 encoding is enabled: * Unicode characters: u"\u00a5", u'\u253c" Examples of mouse events returned: * Mouse button press: ('mouse press', 1, 15, 13), ('meta mouse press', 2, 17, 23) * Mouse drag: ('mouse drag', 1, 16, 13), ('mouse drag', 1, 17, 13), ('ctrl mouse drag', 1, 18, 13) * Mouse button release: ('mouse release', 0, 18, 13), ('ctrl mouse release', 0, 17, 23) Nú window resizeéÿÿÿÿrKrJr)Ú_wait_for_input_readyr4Ú parse_inputÚget_available_raw_inputrrXÚappend)r?Zraw_keysÚkeysÚrawZraw2rDrDrEÚ get_input's$.     zScreen.get_inputcCsL|js gS|jg}| ¡}|dur,| |¡|jdurH| |jj ¡¡|S)aG Return a list of integer file descriptors that should be polled in external event loops to check for user input. Use this method if you are implementing your own event loop. This method is only called by `hook_event_loop`, so if you override that, you can safely ignore this. N)Ú_startedr:rIr‘r%rqrF)r?Úfd_listr„rDrDrEÚget_input_descriptorsrs   zScreen.get_input_descriptorsrDcCs2|jD]}| |¡q|jr.| |j¡d|_dS)z< Remove any hooks added by hook_event_loop. N)Ú_current_event_loop_handlesZremove_watch_fileÚ_input_timeoutÚ remove_alarm)r?Ú event_loopZhandlerDrDrEÚunhook_event_loop‰s    zScreen.unhook_event_loopcsNtˆdƒrˆ ˆˆ¡‰n‡‡‡fdd„‰ˆ ¡}‡‡fdd„|Dƒ}|ˆ_dS)a) Register the given callback with the event loop, to be called with new input whenever it's available. The callback should be passed a list of processed keys and a list of unprocessed keycodes. Subclasses may wish to use parse_input to wrap the callback. Úget_input_nonblockingcsˆ ˆˆˆ ¡¡Srl)r�r�rD)Úcallbackr›r?rDrEÚŸ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ÚUrözutf-8ÚreplacerM)%r!r"rír#rZ HIDE_CURSORrQr r‘Z CURSOR_HOMEr+Zcontentr³r*rr3råÚ _last_rowÚ translater Z IBMPC_OFFr‡ZIBMPC_ONZSOZ INSERT_ONZ INSERT_OFFZERASE_IN_LINE_RIGHTZcursorrˆrúrr 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írrr…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: