3 § fØHã@s&dZddlZddlZddlZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdUZdVZdWZdXZdYZdZZ ej!dkr¬d_Z"eeee fZ#nddZ"eeeefZ#e$d!d"„e%e&e"ƒƒDƒƒZ'd#Z(Gd$d%„d%ƒZ)e%de&e"ƒ>ƒZ*d&d"„e*DƒZ+d'd(„Z,e,e*ƒZ-gZ.xNe*D]FZ/dZ0x0e%e&e"ƒƒD] Z1de1>e/@�r6e0e#e1OZ0�q6We.j2e0ƒ�q WGd)d*„d*ƒZ3d|Z4e3fde)fe&e4ƒdZ5e$dDd"„e%e&e4ƒƒDƒƒZ6ej7dEƒZ8ej7dFƒZ9dGdH„Z:dIdJ„Z;iZe?dOk�r"ddPl@mAZAeAdQddRdS�ddTlBmCZCeCe>ƒdS)}a˜ MultiCall - a class which inherits its methods from a Tkinter widget (Text, for example), but enables multiple calls of functions per virtual event - all matching events will be called, not only the most specific one. This is done by wrapping the event functions - event_add, event_delete and event_info. MultiCall recognizes only a subset of legal event sequences. Sequences which are not recognized are treated by the original Tk handling mechanism. A more-specific event will be called before a less-specific event. The recognized sequences are complete one-event sequences (no emacs-style Ctrl-X Ctrl-C, no shortcuts like <3>), for all types of events. Key/Button Press/Release events can have modifiers. The recognized modifiers are Shift, Control, Option and Command for Mac, and Control, Alt, Shift, Meta/M for other platforms. For all events which were handled by MultiCall, a new member is added to the event instance passed to the binded functions - mc_type. This is one of the event type constants defined in this module (such as MC_KEYPRESS). For Key/Button events (which are handled by MultiCall and may receive modifiers), another member is added - mc_state. This member gives the state of the recognized modifiers, as a combination of the modifier constants also defined in this module (for example, MC_SHIFT). Using these members is absolutely portable. The order by which events are called is defined by these rules: 1. A more-specific event will be called before a less-specific event. 2. A recently-binded event will be called before a previously-binded event, unless this conflicts with the first rule. Each function will be called at most once for each event. éNééééééééé é é é é éééééééééÚdarwinÚShiftÚControlÚOptionÚCommandÚAltÚMetaÚMcCs"g|]}t|D] }||f‘qqS©)Ú _modifiers)Ú.0ÚnumberÚnamer r ú6/opt/alt/python36/lib64/python3.6/idlelib/multicall.pyú 7sr&zapplication has been destroyedc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú _SimpleBindercCs8||_dt|dd|_||_||_g|_d|_dS)Nú)ÚtypeÚ_typesÚsequenceÚwidgetÚ widgetinstÚ bindedfuncsÚ handlerid)Úselfr*r-r.r r r%Ú__init__Js z_SimpleBinder.__init__cCs>|js.|j|jfdd„}|jj|j|j|ƒ|_|jj|ƒdS)NcSsT||_i}xDtt|ƒdddƒD],}||}||kr d||<||ƒ}|r |Sq WdS)NrTéÿÿÿÿr3)Úmc_typeÚrangeÚlen)ÚeventÚlr4Ú wascalledÚiÚfuncÚrr r r%ÚhandlerTsz#_SimpleBinder.bind..handler)r0r/r*r-Úbindr.r,Úappend)r1Útripletr;r=r r r%r>Rs   z_SimpleBinder.bindcCs2|jj|ƒ|js.|jj|j|j|jƒd|_dS)N)r/Úremover-Úunbindr.r,r0)r1r@r;r r r%rBbs z_SimpleBinder.unbindcCsZ|jrVy|jj|j|j|jƒWn4tjk rT}zt|jdkrD‚WYdd}~XnXdS)Nr) r0r-rBr.r,ÚtkinterÚTclErrorÚAPPLICATION_GONEÚargs)r1Úer r r%Ú__del__hs z_SimpleBinder.__del__N)Ú__name__Ú __module__Ú __qualname__r2r>rBrHr r r r%r'Isr'cs(g|] ‰dj‡fdd„ttƒDƒƒ‘qS)Úc3s*|]"\}}d|>ˆ@r|ddVqdS)rrú-Nr )r"r:Úm)Úsr r%ú wsz.)ÚjoinÚ enumerater!)r"r )rOr%r&wscsPdd„}g}x>|D]6‰tt‡fdd„|Dƒƒƒ}|j|dd�|j|ƒqW|S)z•For each item of states return a list containing all combinations of that item with individual bits reset, sorted by the number of set bits. cSs(d}x|r"t|dƒ\}}||7}qW|S)znumber of bits set in n base 2rr)Údivmod)ÚnZnbZremr r r%Únbits€s  zexpand_substates..nbitsc3s|]}ˆ|@VqdS)Nr )r"Úx)Ústater r%rP‰sz#expand_substates..T)ÚkeyÚreverse)ÚlistÚsetÚsortr?)ZstatesrUZ statelistZ substatesr )rWr%Úexpand_substates|s r]c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) Ú_ComplexBindercCs||||j|jfdd„}|S)Nc Ss¶dg|dd…<||_||_i}d}xZ|D]R}xFtt|ƒdddƒD].} || } | |krBd|| <|| |ƒ}|rBPqBW|r(Pq(Wg|dd…<x|D] } | ƒq�Wg|dd…<|r²|SdS)NTrr3r3)r4Úmc_stater5r6) r7Úlistsr4r_ÚishandlerrunningÚdoafterhandlerr9r<r8r:r;Úfr r r%r=¢s*      z0_ComplexBinder.__create_handler..handler)rarb)r1r`r4r_r=r r r%Z__create_handler¡s z_ComplexBinder.__create_handlercs´|ˆ_t|dˆ_|ˆ_|ˆ_ddd„tDƒiˆ_gˆ_gˆ_gˆ_ xhtD]`}‡fdd„t |Dƒ}ˆj ||t |ƒ}dt |ˆjd}ˆjj|ˆjjˆj||ƒfƒqLWdS)NrcSsg|]}g‘qSr r )r"rOr r r%r&Ãsz+_ComplexBinder.__init__..csg|]}ˆjd|‘qS)N)r/)r"r:)r1r r%r&Ïsr(r))r*r+Útypenamer-r.Ú_statesr/Ú handleridsrarbÚ_state_subsetsÚ_ComplexBinder__create_handlerÚ _state_codesÚ _state_namesr?r>)r1r*r-r.rOr`r=Úseqr )r1r%r2¾s z_ComplexBinder.__init__csȈdˆjkršdd„tDƒˆjˆd<xrtD]j‰‡‡fdd„ˆddfDƒ}ˆj|ˆjtˆƒ}dtˆˆjˆdf}ˆjj|ˆj j ˆj ||ƒfƒq,W‡‡‡fdd„}ˆj s¸|ƒn ˆj j|ƒdS)NrcSsg|]}g‘qSr r )r"rOr r r%r&×sz'_ComplexBinder.bind..cs(g|] }tˆD]}ˆj||‘qqSr )rgr/)r"Údetailr:)rOr1r r%r&Ùsz <%s%s-%s>csˆjˆdˆdjˆƒS)Nrr)r/r?r )r;r1r@r r%Úász%_ComplexBinder.bind..)r/rerhr*rirjrdrfr?r-r>r.rarb)r1r@r;r`r=rkÚdoitr )r;rOr1r@r%r>Õs    z_ComplexBinder.bindcs.‡‡‡fdd„}ˆjs|ƒn ˆjj|ƒdS)NcsˆjˆdˆdjˆƒS)Nrr)r/rAr )r;r1r@r r%rmèsz'_ComplexBinder.unbind..)rarbr?)r1r@r;rnr )r;r1r@r%rBçsz_ComplexBinder.unbindcCsdx^|jD]T\}}y|jj|j||ƒWqtjk rZ}zt|jdkrJ‚WYdd}~XqXqWdS)Nr)rfr-rBr.rCrDrErF)r1rkÚidrGr r r%rHîs z_ComplexBinder.__del__N)rIrJrKrhr2r>rBrHr r r r%r^™s r^ÚKeyPressÚKeyÚ KeyReleaseÚ ButtonPressÚButtonÚ ButtonReleaseÚActivateÚ CirculateÚColormapÚ ConfigureÚ DeactivateÚDestroyÚEnterÚExposeÚFocusInÚFocusOutÚGravityÚLeaveÚMapÚMotionÚ MouseWheelÚPropertyÚReparentÚUnmapÚ VisibilitycCs"g|]}t|D] }||f‘qqSr )r+)r"r#r$r r r%r&sz^\w+$z^[1-5]$cCs| s|ddks|d dkr"dS|dd …jdƒ}d}x.|rf|dtkrf|dt|d>O}|d=q:W|rŒ|dtkrŒt|d}|d=ndSt|tkr®|s¤|r¨dSd}nP|dd„d DƒkrÆt}nt}|sÔd}n*t|ƒdkoì|j|dƒ�rú|d}ndS|||fS)a-Get a string which should describe an event sequence. If it is successfully parsed as one, return a tuple containing the state (as an int), the event type (as an index of _types), and the detail - None if none, or a string if there is one. If the parsing is unsuccessful, return None. rr(rr)NrMcSsg|] }t|‘qSr )Ú _type_names)r"rOr r r%r&$sz#_parse_sequence..rprrr3r3)rprr) ÚsplitÚ_modifier_namesr‰Ú_binder_classesr'Ú _keysym_reÚ _button_rer6Úmatch)r,ZwordsZ modifiersr*rlZtype_rer r r%Ú_parse_sequence s0    r�cCs`|dr8dt|dt|ddd|ddSdt|dt|dddSdS)Nrr(rrrMr))rjr+)r@r r r%Ú_triplet_to_sequence2s0r‘cs0ˆtkrtˆSG‡fdd„dˆƒ}|tˆ<|S)z©Return a MultiCall class which inherits its methods from the given widget class (for example, Tkinter.Text). This is used instead of a templating mechanism. csbeZdZ‡fdd„Zd‡fdd„ Zd‡fdd„ Z‡fdd „Z‡fd d „Zd‡fd d „ Zdd„Z dS)z#MultiCallCreator..MultiCallcs:ˆjˆf|ž|Žiˆ_‡‡fdd„tttƒƒDƒˆ_dS)Ncsg|]}t||ˆˆƒ‘qSr )rŒ)r"r:)r1r-r r%r&Ksz@MultiCallCreator..MultiCall.__init__..)r2Ú_MultiCall__eventinfor5r6r+Ú_MultiCall__binders)r1rFÚkwargs)r-)r1r%r2Es z,MultiCallCreator..MultiCall.__init__Ncsàt|ƒtkrÐt|ƒdkrÐ|dd…dkrÐ|dd…dkrÐ||jkrÂ|j|}|ddk r„x*|dD]}|j|dj||dƒqbW||d<|ddk rÐx6|dD]}|j|dj||ƒq¢Wn|gg|j|<ˆj||||ƒS)Nrz<>rréþÿÿÿ)r*Ústrr6r’r“rBr>)r1r,r;ÚaddZeir@)r-r r%r>Ns     z(MultiCallCreator..MultiCall.bindcs˜t|ƒtkrŠt|ƒdkrŠ|dd…dkrŠ|dd…dkrŠ||jkrŠ|j|\}}|dk rŠx"|D]}|j|dj||ƒq^Wd|j|d<ˆj|||ƒS)Nrz<>rrr•)r*r–r6r’r“rB)r1r,Zfuncidr;Útripletsr@)r-r r%rB`s   z*MultiCallCreator..MultiCall.unbindcs€||jkrdgg|j|<|j|\}}xT|D]L}t|ƒ}|dkrPˆj|||ƒq,|dk rn|j|dj||ƒ|j|ƒq,WdS)Nr)r’r�Ú event_addr“r>r?)r1ÚvirtualÚ sequencesr;r˜rkr@)r-r r%r™ks  z-MultiCallCreator..MultiCall.event_addcsv||jkrdS|j|\}}xT|D]L}t|ƒ}|dkrFˆj|||ƒq"|dk rd|j|dj||ƒ|j|ƒq"WdS)Nr)r’r�Ú event_deleter“rBrA)r1ršr›r;r˜rkr@)r-r r%rœ|s  z0MultiCallCreator..MultiCall.event_deletecsF|dks||jkrˆj||ƒSttt|j|dƒƒˆj||ƒSdS)Nr)r’Ú event_infoÚtupleÚmapr‘)r1rš)r-r r%r�Šs  z.MultiCallCreator..MultiCall.event_infocSs„x~|jD]t}|j|\}}|rx\|D]T}y|j|dj||ƒWq$tjk rv}zt|jdkrf‚WYdd}~Xq$Xq$WqWdS)Nrr)r’r“rBrCrDrErF)r1ršr;r˜r@rGr r r%rH’s  z+MultiCallCreator..MultiCall.__del__)NNN)N)N) rIrJrKr2r>rBr™rœr�rHr )r-r r%Ú MultiCallBs   r )Ú_multicall_dict)r-r r )r-r%ÚMultiCallCreator:s [r¢csÖtj|ƒ}|jdƒtt|jƒjdƒdd…ƒ\}}|jd||dfƒttjƒ|ƒ‰ˆj ƒdgf‡fdd„ }|d ƒ|d ƒ|d ƒ|d ƒ|d ƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒdS)NzTest MultiCallú+rz+%d+%dé¯rcsH‡fdd„}ˆjd|d|ƒˆjd|dˆƒ|dd7<dS)Ncs tˆƒdS)N)Úprint)r7)rkr r%r=©sz-_multi_call..bindseq..handlerz <>rr)r>r™)rkrTr=)Útext)rkr%Úbindseq¨s z_multi_call..bindseqzz z zzzzz zz zz) rCZToplevelÚtitlerŸÚintZgeometryrŠr¢ZTextZpack)ÚparentÚtoprVÚyr§r )r¦r%Ú _multi_call¡s&   r­Ú__main__)Úmainzidlelib.idle_test.test_mainmenuF)Ú verbosityÚexit)Úrunrrr é é@逩r©r©r©r)r¶r·r¸r¹©r©r©r©rr)rºr»r¼r½©rprq©rr©rsrt©ru©rv©rw©rx©ry©rz©r{©r|©r}©r~©r©r€©r�©r‚©rƒ©r„©r…©r†©r‡©rˆ)r¾r¿rÀrÁrÂrÃrÄrÅrÆrÇrÈrÉrÊrËrÌrÍrÎrÏrÐrÑrÒrÓrÔ)DÚ__doc__ÚreÚsysrCZ MC_KEYPRESSZ MC_KEYRELEASEZMC_BUTTONPRESSZMC_BUTTONRELEASEZ MC_ACTIVATEZ MC_CIRCULATEZ MC_COLORMAPZ MC_CONFIGUREZ MC_DEACTIVATEZ MC_DESTROYZMC_ENTERZ MC_EXPOSEZ MC_FOCUSINZ MC_FOCUSOUTZ MC_GRAVITYZMC_LEAVEZMC_MAPZ MC_MOTIONZ MC_MOUSEWHEELZ MC_PROPERTYZ MC_REPARENTZMC_UNMAPZ MC_VISIBILITYZMC_SHIFTZ MC_CONTROLZMC_ALTZMC_METAZ MC_OPTIONZ MC_COMMANDÚplatformr!Z_modifier_masksÚdictr5r6r‹rEr'rerjr]rgrirOr<r:r?r^r+rŒr‰Úcompiler�rŽr�r‘r¡r¢r­rIZunittestr¯Zidlelib.idle_test.htestr²r r r r%Ús–   - `  'g