永井@知能.九工大です.

Ruby/Tk の bug fix および機能追加のための unofficial patch です.
ruby-1.1b9_29 からの差分になっています.

今回の機能追加は,

 ・trace variable 等の TkVariable への実装
 ・bind 情報を出力する bindinfo 等の実装
 ・bind におけるコマンド追加 (Tcl/Tk での '+' 付き指定) メソッドの追加
 ・bindtags の実装
 ・イベント処理の continue, break を実現するメソッドの追加

といったところです.
この最後の「イベント処理の continue, break 」は,
バインドタグ集合におけるバインド処理の流れを制御するものですが,
実装には次の方法をとっています.

 ・continue, break に対応する特別の例外を発生させる.
 ・tcltklib の ruby コマンドでこの例外を捕捉し,
   それに応じて TCL_CONTINUE, TCL_BREAK のリターンコードを Tk に返す.
 ・TkCore で callback 用に Tk 上に設定している rb_out で
   このリターンコードを catch し,そのままのコードで return する.

他にうまい方法が思いつかなかったので,こうしてます.(^_^;
次のようなものでテストしました.
-------------------------------------------------------------------
require 'tk'

test_mode = 1 ; # 0, 1, 2, or 3

Tk.bind(TkButton,'1',proc{p 'TkButton'; p 1111})
b = TkButton.new(nil,'text'=>'button').pack
p b.bindtags
b.bindtags(['kkk', 'all', '.', b, TkButton])
p b.bindtags
Tk.bind('kkk','1',proc{p 'kkk'})
Tk.root.geometry('100x100')

if test_mode == 0
  Tk.bind('.','1',proc{p '.'; p 1111})
  Tk.bind_append('.','1',proc{p '.'; p 'append'})
  Tk.bind('Tk','1',proc{p 'Tk'; p 2222})
  Tk.bind('all','1',proc{p 'all'})
elsif test_mode == 1
  Tk.bind('.','1',proc{p '.'; Tk.callback_continue; p 1111})
  Tk.bind_append('.','1',proc{p '.'; p 'append'})
  Tk.bind('Tk','1',proc{p 'Tk'; p 2222})
  Tk.bind('all','1',proc{p 'all'})
elsif test_mode == 2
  Tk.bind('.','1',proc{p '.'; p 1111})
  Tk.bind_append('.','1',proc{p '.'; p 'append'})
  Tk.bind('Tk','1',proc{p 'Tk'; Tk.callback_break; p 2222})
  Tk.bind('all','1',proc{p 'all'})
elsif test_mode == 3
  Tk.bind('.','1',proc{p '.'; Tk.callback_continue; p 1111})
  Tk.bind_append('.','1',proc{p '.'; p 'append'})
  Tk.bind('Tk','1',proc{p 'Tk'; Tk.callback_break; p 2222})
  Tk.bind('all','1',proc{p 'all'})
end

p Tk.bindinfo('.','1')
p Tk.bindinfo('.')
p Tk.bindinfo('Tk','1')
p Tk.bindinfo('Tk')
p Tk.bindinfo('all','1')
p Tk.bindinfo('all')

Tk.mainloop
-------------------------------------------------------------------

これで未実装で残っているのは,send と fileevent くらいかなと
思いますが,他にありますでしょうか?
send はともかく fileevent っているのかなという気はしています.
Ruby と Tk との間に内部的にファイル IO を生成するクラスでも
作るのなら fileevent が便利ということにもなりそうですが,
必要性を感じません.
多分,trace variable で十分なのではないかと思います.
というわけで,今の所,私は fileevent を実装するつもりはありません.
必要性があるようでしたら,お教えください.
send については,どういうメソッドにするかが決まれば
すぐに実装できるはずです.

現在,私があると便利だろうなと思っているのは,
Tk のバージョンの違いを吸収する TkFont クラス or モジュールです.
これについて,いいアイディアはありませんか?

その他,こういうのがあればというのがありましたら,ご提案ください.

-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp

begin 666 tkdiff_from_1.1b9_29.gz
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
MD1OPJ+&T%P / E6.M)<(EY9FY!0D =]+&D!\S$)7/I:EB4]V^I ],LO[^GF_>1
M+HF^[(3]@0.$!>,.E,8=TNRU=V4PUAX"WU5')QA?6P?P&1C\.HB_?\KC+$@B
M?.W^\%Z[![97T$9:ODPOEG(E?A#!55N#][7[@3VID14_OZ$3_\NFHTQ+@;,U
M64YW!VR2T-N#G-J5BZQLG31@@B05FH2XI$!EXFC4H_/L2@+>J0HE21X^B?14
MBU1X%;^1KUY6<E;M)#=$Y*M4R"+/M2/ KWEP17FK5-M<"8S"& 1*X$3M0TX!
MDX#\TK 04R' _+R^F1L0EKRZUR+J30W&%'@BN[G)4E>#K]GUA<3&:3?O&,K+
M?E)9D.H,/\X+(M6*)%\EE")6V;HTZP3(8SYS%=9*+<%@*VL]?(\$\<0IL272
M-,*&T?@$_Y>-<W,JEB&O;YP;1B&D<F1.-QJ%CDQP)\YDM3,F#,AR7G =[TSI
M/3M'/(.XP<D'6B7G4R$F_DI;FND<&(EP&GPE9G1))*;-X2F?0C9*(ASF^J(+
MI84Y62XD ?O.4'_\):;,,+)-\X XIG,90D![%&;)A^)!:C0E<&2C[S(]0;B4
MJS.!X(@W:E-3A0[IPL.8$#WI*WG?P515@I!%.O7C)'-+0Q(?LK6 7!9EPJ*0
M.ODH5I\\># K&?O_F/X?C^DK7-L7:XY\"13B4-HDP;X"%@HC"[XY=B,803/)
MHJ_O(!WNUU'PB%T5R*I .9&X.S09X5EA"JJ6#KWWS#MW\AE:MRRQ[I:$K5SI
MRHWKF;K;Q=%4B47D]9RTR???$\J6LGB"\>\6^PY*X@L2UJD+5]FE924L"&-1
M,4-6),AM@A?8X8L#TBZI5K@+1E!5 9%.BJG,O:$$:\'/HKC RYM<#X4*A+T@
MNK]JB7*W4I[4=6M"H< M'PVK 64=2%9#E0( ET!+OLB3HF X_E:P(R(BCQ1&
ME2S-EJXX?=M O**"??#,+H_'WRR=-Z:BBI>9C*R<D!NQBTV4'QQ=_H\#?Q0<
MD&N<RONV(\<!XS]7WKVQW9'M[@XN*U@=7%=07CZR[1.KMK&LVQ'R-;M!5O:3
M?S&%RPPR$9@2VI58S!2Q=94N.*6:9O8> 2Q=+!$)V68[@XAUB'I(_[ET0ZJ^
MG207[A7UR1-\2WAEQE\6P(D;K=?#5_]6I]\W.GWY[C^U>Y/OU\.WF.B ER[W
MS =W<D%C=NN-/:?)ZTSE56)";[)W=WS38/(JMHP%>_5W7KYMIIHK( ;Y9AF^
MD'3GG3)WZB79'W/'SMCFF.*&F%6R)SQ$^,A$^ #$P2?( KX5-/O&.?$5*7D1
MNK!#"!KLVB S^B6S04]LWOH$N./B7A*D)/$EQ Z_-C' 41X1/YTV3[K=W9[1
MV5'6\C[9;CR:T"@. [%3,=D $\_P(<+#)Z:#V&566.U#<\3V180[B7 %-;OF
M)VY*[& )(5)'/%JQ*);99H3\DUUNHIU><2M/@8.Z\PANBUU'<)5,AVN$-,P&
MWTS$'Z59SI?4=!S)-<>+V#OGTB2"5F+Y%LC4C4GPH'Q3TFHX/0V"^+D,)N%2
M:Y>[=&]7?9U]^O;MD+\*QVT_\CWYA]=O?GC[X=U9W:PKCQ(WYI(<RX#AK&%.
M0TK_1?F.B$3%_?T22,C=4A<.,$3PVI3+QF6P4L!=)Z0VU#&,"1_R6$0?,+\H
M>SZL3D>886!),Z1F&P8+CUY1+S6=LOWCPWRU\J+=[VJ"%5 0@6FHSZ^9GFR#
M31E*'')2%(1?0"CS*_$\:8Z[CY-KW($GOP@;[_3P*$/3ZEIMHS-(8BUB[XI(
MO<7M_2AE6&?E1\HFARS2O#*CGT8%5(D6U'&GKL.WL8MR,66X(D]^#.%AZNUR
M[S*BW\.UJV([,<PTY%NA#E6@S>MX8H_5B"[7D1%]DSIZ3+*<CCS,NCR5N[L=
M?(N+4993_>4RC@/_N;#!"M4YT8/H_DA629RG:H"'-<J8RUQJE5Z/6Z77QNU+
M)58YM2=ND)B&7ZRP#2,=/YR!I'T4$1[&(*$B:*E5^A:W2K\M9Q$YJQQ?4B<-
M&$7 *@HW6&O1?U%=A7=6W4R[RLHZ2J-290=MMJW!Z@Z2K8TY;7^"@LJ^H&IJ
M;-11M"G13SS)Z2;I*^LU%PTV -H[H-X(VHSHVRI)$CTC)ENV/.8G :T^B](>
MWY=2XK=W3AC@B^-PL_Z"\)NU@92OS Z0I<P.@\&*;#V!@GT<? 8K#&%Z!):H
M%,&B54D$BR>Y");TU0<KT:!$IUUKP'3:P]'**L])?[G)K4CS30[3<Q2L3.T>
M!]Z]_BI7HDKCPD!= 8UDLU) D@\+F)2TNI-J"=JJ"FX\O^C8_I4=E9]B[.9/
M,:;$N;.,_?WV7GJ6D2%$7\*#6!0B]7A6SXQFC-FF:.)4WRA"<'N4Q%27S=R:
MW3UCH*YL)?.@F,[EF:P*)Z-:]SBJV2H_JMGZFJ.:K<Q.T+L?J8S8J;7T%)++
M#*!O.%BYMM6&XY55SE6R5SCJP4IT8*_+-XJE2TN$/(+9VGP2CST^1W0GA25<
MZ5=Y"JWZ\3-44BM3\@]Q_&R%"W5SZGHQ#1_D]!G/Q<_:9WY\1\:@NJDND430
M@C 9ZN146K?-_SI#,AZHAT(UD'+#8=!#QY2A(/8EBB:;%F>!3@D5A0T^35@5
M\,0!_,)= V[@ZYLA'^(G_%*.^+T\XB>T.<#?V^\JA]?9=*Z7!_P&._;>4#'_
M%;+;,-EE--\HX#-SY(O_C09GP%IJ[W[>WI*T,+["'*E@;FN3N;'PS-:?92N#
M\/1WJM?DNB6?"<C#;.M=@!9*/,#J-ZMK=-KX)JEM[*3'-9)D!Z1AI_(F GQ@
M5,#7G);XW2G\?06@&:6C\]IL9V,;4*P<E>'9AA$9\UD,D9P1-JDT"LMS]E)>
M]4\B;!9]\QC>*C-C"N)\ (8^,D/V)OKB" 87I7\+X1$9@<] 'K:M@!3/^V<5
M+_I/CL**)H5122O*F1^64N>8<:@UGK^  0G*=-W$\R8+,5#!."I&JE8R3MTQ
MEO@KW:PS&XTJKBQL7)$\TF/X7]-W\UZ=?VT-5!(W?Y@:J$*TW:T(RA<":'Q6
M##"[S>@7_K)T!R8BU@!/1_>-3J]L1K*YL/E=H:XZ6+%!XI"_+3;R*,0*J!6H
M5:WA&OA*<0NXE$!7@D\R.U; $GO!NT:0!\6G-=L"UOR=C+5F^L/\P8R[..%^
5:<O.*6GV.+B2?U?@/PCWPDFE3@  
 
end