o =?hH@sdZddlZddlZddlZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZd ZdZdZdZ ej!dkrVdZ"eeee fZ#ndZ"eeeefZ#e$dd e%e&e"DZ'd!Z(Gd"d#d#Z)e%de&e">Z*d$d e*DZ+d%d&Z,e,e*Z-gZ.e*D]Z/dZ0e%e&e"D]Z1de1>e/@re0e#e1OZ0qe.2e0qGd'd(d(Z3d)Z4e3fde)fe&e4dZ5e$d*d e%e&e4DZ6e7d+Z8e7d,Z9d-d.Z:d/d0Z;iZe?d5kr dd6l@mAZAeAd7dd8d9dd:lBmCZCeCe>dSdS);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)ZShiftZControl)ZOption)ZCommand)r)ZAltr)ZMetaMcC"g|] }t|D]}||fqqS) _modifiers.0Znumbernamer r 8/opt/alt/python310/lib64/python3.10/idlelib/multicall.py 7 r&zapplication has been destroyedc@s,eZdZddZddZddZddZd S) _SimpleBindercCs8||_dt|dd|_||_||_g|_d|_dS)N)type_typessequencewidget widgetinst bindedfuncs handlerid)selfr+r.r/r r r%__init__Js  z_SimpleBinder.__init__cCs>|js|j|jfdd}|j|j|j||_|j|dS)NcSsT||_i}tt|dddD]}||}||vr'd||<||}|r'|SqdS)NrT)mc_typerangelen)eventlr5 wascalledifuncrr r r%handlerTsz#_SimpleBinder.bind..handler)r1r0r+r.bindr/r-append)r2tripletr<r>r r r%r?Rs  z_SimpleBinder.bindcCs6|j||js|j|j|j|jd|_dSdSN)r0remover.unbindr/r-r1)r2rAr<r r r%rDbs  z_SimpleBinder.unbindc Cs`|jr.z|j|j|j|jWdStjy-}zt|jdvr"WYd}~dSd}~wwdSNr) r1r.rDr/r-tkinterTclErrorAPPLICATION_GONEargs)r2er r r%__del__hs z_SimpleBinder.__del__N)__name__ __module__ __qualname__r3r?rDrKr r r r%r(Is  r(cs(g|]dfddttDqS)c3s,|]\}}d|>@r|ddVqdS)rr-Nr )r#r;msr r% ws  z.)join enumerater!)r#r rRr%r&ws  csLdd}g}|D]ttfdd|D}|j|dd||q|S)zFor 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}|rt|d\}}||7}|s|S)znumber of bits set in n base 2rr)divmod)nZnbZremr r r%nbitss zexpand_substates..nbitsc3s|]}|@VqdSrBr )r#xstater r%rTsz#expand_substates..T)keyreverse)listsetsortr@)ZstatesrYZ statelistZ substatesr r[r%expand_substates|s rbc@s4eZdZddZddZddZddZd d Zd S) _ComplexBindercCs||||j|jfdd}|S)Nc Ssdg|dd<||_||_i}d}|D])}tt|dddD]} || } | |vr7d|| <|| |}|r7nq|r<nqg|dd<|D]} | qEg|dd<|rU|SdS)NTrr4)r5mc_stater6r7) r8listsr5rdishandlerrunningdoafterhandlerr:r=r9r;r<fr r r%r>s0   z0_ComplexBinder.__create_handler..handler)rfrg)r2rer5rdr>r r r%Z__create_handlers  z_ComplexBinder.__create_handlerc s|_t|d_|_|_dddtDi_g_g_g_ tD]0}fddt |D} ||t |}dt |jd}j|jj||fq%dS)NrcSg|]}gqSr r r#rSr r r%r&z+_ComplexBinder.__init__..csg|] }jd|qSrB)r0r#r;r2r r%r&sr)r*)r+r,typenamer.r/_statesr0 handleridsrfrg_state_subsets_ComplexBinder__create_handler _state_codes _state_namesr@r?)r2r+r.r/rSrer>seqr rmr%r3s  z_ComplexBinder.__init__c sdjvrKddtDjd<tD]5fddddfD}|jt}dtjdf}j|j j ||fqfdd}j s[|dSj |dS)NrcSrir r rjr r r%r&rkz'_ComplexBinder.bind..cs(g|]}tD] }j||qqSr )rqr0)r#detailr;)rSr2r r%r&s z <%s%s-%s>cjddSNrr)r0r@r r<r2rAr r%z%_ComplexBinder.bind..)r0rorrr+rsrtrnrpr@r.r?r/rfrg)r2rAr<rer>rudoitr )r<rSr2rAr%r?s"     z_ComplexBinder.bindcs0fdd}js|dSj|dS)Ncrwrx)r0rCr ryr r%rzr{z'_ComplexBinder.unbind..)rfrgr@)r2rAr<r|r ryr%rDs z_ComplexBinder.unbindc Cs`|jD]*\}}z |j|j||Wqtjy-}zt|jdvr#WYd}~qd}~wwdSrE)rpr.rDr/rFrGrHrI)r2ruidrJr r r%rKs z_ComplexBinder.__del__N)rLrMrNrrr3r?rDrKr r r r%rcs  rc))KeyPressZKey) KeyRelease)Z ButtonPressZButton)Z ButtonRelease)ZActivate)Z Circulate)ZColormap)Z Configure)Z Deactivate)ZDestroy)ZEnter)ZExpose)ZFocusIn)ZFocusOut)ZGravity)ZLeave)ZMap)ZMotion)Z MouseWheel)ZProperty)ZReparent)ZUnmap)Z VisibilitycCrr )r,r"r r r%r&r'z^\w+$z^[1-5]$cCs|r|ddks|ddkrdS|ddd}d}|r8|dtvr8|dt|d>O}|d=|r8|dtvs#|rJ|dtvrJt|d}|d=ndSt|tur[|sV|rXdSd}n'|dd d Dvrgt}nt}|snd}nt|dkr||dr|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)r4r*NrrPcSsg|]}t|qSr ) _type_namesrjr r r%r&$sz#_parse_sequence..)r~r) split_modifier_namesr_binder_classesr( _keysym_re _button_rer7match)r-ZwordsZ modifiersr+rvZtype_rer r r%_parse_sequence s2    rcCs\|drdt|dt|ddd|ddSdt|dt|dddS)Nrr)rrrPr*)rtr,)rAr r r%_triplet_to_sequence2s"$rcs0tvrtSGfddd}|t<|S)zReturn a MultiCall class which inherits its methods from the given widget class (for example, Tkinter.Text). This is used instead of a templating mechanism. csreZdZeejs JfddZdfdd Zdfdd Zfdd Z fd d Z dfd d Z ddZ dS)z#MultiCallCreator..MultiCallcs@jg|Ri|i_fddtttD_dS)Ncsg|] }t||qSr )rrl)r2r.r r%r&Ksz@MultiCallCreator..MultiCall.__init__..)r3_MultiCall__eventinfor6r7r,_MultiCall__binders)r2rIkwargsr.rmr%r3Es    z,MultiCallCreator..MultiCall.__init__Ncst|turdt|dkrd|dddkrd|dddkrd||jvr]|j|}|ddur@|dD]}|j|d||dq0||d<|ddur\|dD] }|j|d||qNn|gg|j|<||||S)Nr<<>>rr)r+strr7rrrDr?)r2r-r<addZeirArr r%r?Ns       z(MultiCallCreator..MultiCall.bindcst|turCt|dkrC|dddkrC|dddkrC||jvrC|j|\}}|durC|D] }|j|d||q.d|j|d<|||S)Nrrrrrr)r+rr7rrrD)r2r-Zfuncidr<tripletsrArr r%rD`s  z*MultiCallCreator..MultiCall.unbindcs|||jvr dgg|j|<|j|\}}|D]&}t|}|dur'|||q|dur6|j|d||||qdSNr)rr event_addrr?r@r2virtual sequencesr<rrurArr r%rks  z-MultiCallCreator..MultiCall.event_addcsr||jvrdS|j|\}}|D]&}t|}|dur"|||q|dur1|j|d||||qdSr)rr event_deleterrDrCrrr r%r|s  z0MultiCallCreator..MultiCall.event_deletecsB|dus ||jvr||Sttt|j|d||Sr)r event_infotuplemapr)r2rrr r%rs   z.MultiCallCreator..MultiCall.event_infoc Ss||jD]8}|j|\}}|r;|D]*}z |j|d||Wqtjy:}zt|jdvr0WYd}~qd}~wwqdS)Nrr)rrrDrFrGrHrI)r2rr<rrArJr r r%rKs  z+MultiCallCreator..MultiCall.__del__)NNNrB) rLrMrN issubclassrFZMiscr3r?rDrrrrKr rr r% MultiCallBs    r)_multicall_dict)r.rr rr%MultiCallCreator:s [rcst|}|dtt|ddd\}}|d||dfttj| dgffdd }|d |d |d |d |d |d|d|d|d|d|d|ddS)NzTest MultiCall+rz+%d+%drcsHfdd}d|d|d|d|dd7<dS)Ncs tdSrB)print)r8rur r%r>s z-_multi_call..bindseq..handlerz <>rr)r?r)rurXr>textrr%bindseqs z_multi_call..bindseqzz z zzzzz zz zz) rFZTopleveltitlerintZgeometryrrZTextZpack)parenttoprZyrr rr% _multi_calls&    r__main__)mainzidlelib.idle_test.test_mainmenuF) verbosityexit)run)D__doc__resysrFZ 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_COMMANDplatformr!Z_modifier_masksdictr6r7rrHr(rortrbrqrsrSr=r;r@rcr,rrcompilerrrrrrrrLZunittestrZidlelib.idle_test.htestrr r r r%sl    -   _    'g