新井です。

>>> From: Koji Arai <JCA02266 / nifty.ne.jp>
>>> Date: 15 Dec 1999 00:02:26 +0900
>>> Subject: [ruby-dev:8652] Re: [PATCH] Ruby/Tk

> 新井です。
> 
> > > 新井です。
> > 
> > > @screen -> @visual という修正も含んでるので1.4でもあててください。
> > 
> > あう、もう1箇所あった。
> 
> ぐぐぅ、よく見てませんでした、まだありました。

第4弾です。しくしく。

以前の私のパッチで

  @classname = keys.delete('classname')

としてしまいましたが keys に該当キーがない場合インスタンス変
数に問答無用でnilが入ってしまうので

  @classname = keys.delete('classname') if keys.key?('classname')

とちゃんとチェックするようにしました。こうしないと、

  require "tk"
  p TkToplevel.new(nil, ":0.0", "Hoge", {})

で、screenとclassnameの指定が消えてしまう。しくしく。

以下の修正も行いました。

・TkComm::uninstall_cmd("rb_out cXXXX")が通らなかった。
・Tk::Wm#aspect が wm grid コマンドを呼んでいた。
・Tk::Wm#frame が返すリソースIDを数値にした
・Tk::Wm#geometry が["WxH+X+Y"]という配列を返していた
  (文字列で良いのですよね?)
・Tk::Wm#group をパスではなくウィジェットオブジェクトを返すようにした
・Tk::Wm#maxsize が引数なしのとき設定値を返さなかった
・Tk::Wm#sizefrom が配列を返していた。(本来は "program"、"user"または"")
・Tk::Wm#transient をパスではなくウィジェットオブジェクトを返すようにした。
・TkWinfo.atom が winfo atom コマンドを呼んでいなかった。ついでに数値を
  返すようにした。
・TkWinfo.atomname が winfo atomname コマンドを呼んでいなかった。
・TkWinfo.cells が winfo cells コマンドを呼んでいなかった。
・TkWinfo.colormapfull を 追加
・TkWinfo.geometry が["WxH+X+Y"]という配列を返していた。
  (Tk::Wmと同じ。配列に意味はないはず・・ですよね?2つもあると自信なくなる)
・TkWinfo.id が number()で数値を返そうとしてたが、winfo id の戻り値は
  "0xXXXXXX" な16進文字列なので .hex するようにした。
・TkWinfo.interps が コマンド
    winfo -displayof path interps
  を呼んでいたが以下のように "interps" を先に書かないとダメだった
    winfo interps -displayof path
・TkWinfo.manager を追加
・TkWinfo.appname で winfo name の戻り値をbool()していた。
  (これの戻り値はウィジェットのパスの要素またはアプリケーション名)
・TkWinfo.server を追加
・TkWinfo.visualid、visualsavailable を追加
・TkWinfo.vrootheigh*t*  "t" がなかった

以上、結構でかいですがパッチつくりました。

1点迷っているのが TkWinfo.id と Tk::Wm#frame が現状通り文字
列"0xXXXXXX" を返した方が都合がいいような気がすることです。

パッチで実装したTkWinfo.visualsavailable の仕様もちょっと気
になる。

どう思います?>永井さん(指名するやつ ^^;)

最近、TkWinfo と Tk::Wm のマニュアルを書いたのでこの辺のパッ
チができたのでした。


--- tk.rb.org Tue Dec 21 05:44:53 1999 +++ tk.rb Mon Dec 20 05:44:51 1999 @@ -235,7 +235,7 @@ module TkComm return format("rb_out %s", id); end def uninstall_cmd(id) - id = $1 if /rb_out (c\d+)/ + id = $1 if /rb_out (c\d+)/ =~ id Tk_CMDTBL[id] = nil end private :install_cmd, :uninstall_cmd @@ -575,8 +575,8 @@ module Tk module Wm include TkComm def aspect(*args) - w = window(tk_call('wm', 'grid', path, *args)) - w.split.collect{|s|s.to_i} if args.length == 0 + w = tk_call('wm', 'aspect', path, *args) + list(w) if args.length == 0 end def client(name=None) tk_call 'wm', 'client', path, name @@ -594,17 +594,18 @@ module Tk tk_call 'wm', 'focusmodel', path, *args end def frame - tk_call 'wm', 'frame', path + tk_call('wm', 'frame', path).hex end def geometry(*args) - list(tk_call('wm', 'geometry', path, *args)) + tk_call('wm', 'geometry', path, *args) end def grid(*args) w = tk_call('wm', 'grid', path, *args) list(w) if args.size == 0 end def group(*args) - tk_call 'wm', 'group', path, *args + w = tk_call 'wm', 'group', path, *args + window(w) if args.size == 0 end def iconbitmap(*args) tk_call 'wm', 'iconbitmap', path, *args @@ -628,7 +629,7 @@ module Tk end def maxsize(*args) w = tk_call('wm', 'maxsize', path, *args) - list(w) if not args.size == 0 + list(w) if args.size == 0 end def minsize(*args) w = tk_call('wm', 'minsize', path, *args) @@ -661,7 +662,7 @@ module Tk end end def sizefrom(*args) - list(tk_call('wm', 'sizefrom', path, *args)) + tk_call('wm', 'sizefrom', path, *args) end def state tk_call 'wm', 'state', path @@ -670,7 +671,7 @@ module Tk tk_call 'wm', 'title', path, *args end def transient(*args) - tk_call 'wm', 'transient', path, *args + window(tk_call 'wm', 'transient', path, *args) end def withdraw tk_call 'wm', 'withdraw', path @@ -1063,19 +1064,19 @@ module TkWinfo include Tk extend Tk def TkWinfo.atom(name) - tk_call 'winfo', name + number(tk_call 'winfo', 'atom', name) end def winfo_atom(name) TkWinfo.atom name end def TkWinfo.atomname(id) - tk_call 'winfo', id + tk_call 'winfo', 'atomname', id end def winfo_atomname(id) TkWinfo.atomname id end def TkWinfo.cells(window) - number(tk_call('winfo', window.path)) + number(tk_call('winfo', 'cells', window.path)) end def winfo_cells TkWinfo.cells self @@ -1093,6 +1094,12 @@ module TkWinfo def winfo_classname TkWinfo.classname self end + def TkWinfo.colormapfull(window) + bool(tk_call('winfo', 'colormapfull', window.path)) + end + def winfo_colormapfull + TkWinfo.colormapfull self + end def TkWinfo.containing(rootX, rootY) path = tk_call('winfo', 'containing', rootX, rootY) window(path) @@ -1119,7 +1126,7 @@ module TkWinfo TkWinfo.fpixels self, number end def TkWinfo.geometry(window) - list(tk_call('winfo', 'geometry', window.path)) + tk_call('winfo', 'geometry', window.path) end def winfo_geometry TkWinfo.geometry self @@ -1131,15 +1138,15 @@ module TkWinfo TkWinfo.height self end def TkWinfo.id(window) - number(tk_call('winfo', 'id', window.path)) + tk_call('winfo', 'id', window.path).hex end def winfo_id TkWinfo.id self end def TkWinfo.interps(window=nil) if window - tk_split_simplelist(tk_call('winfo', '-displayof', window.path, - 'interps')) + tk_split_simplelist(tk_call('winfo', 'interps', + '-displayof', window.path)) else tk_split_simplelist(tk_call('winfo', 'interps')) end @@ -1153,8 +1160,14 @@ module TkWinfo def winfo_mapped? TkWinfo.mapped? self end + def TkWinfo.manager(window) + tk_call('winfo', 'manager', window.path) + end + def winfo_manager + TkWinfo.manager self + end def TkWinfo.appname(window) - bool(tk_call('winfo', 'name', window.path)) + tk_call('winfo', 'name', window.path) end def winfo_appname TkWinfo.appname self @@ -1255,6 +1268,12 @@ module TkWinfo def winfo_screenwidth TkWinfo.screenwidth self end + def TkWinfo.server(window) + tk_call 'winfo', 'server', window.path + end + def winfo_server + TkWinfo.server self + end def TkWinfo.toplevel(window) window(tk_call('winfo', 'toplevel', window.path)) end @@ -1267,7 +1286,25 @@ module TkWinfo def winfo_visual TkWinfo.visual self end - def TkWinfo.vrootheigh(window) + def TkWinfo.visualid(window) + tk_call 'winfo', 'visualid', window.path + end + def winfo_visualid + TkWinfo.visualid self + end + def TkWinfo.visualsavailable(window) + begin + v = tk_call('winfo', 'visualsavailable', window.path, "includeids") + rescue RuntimeError + # for Tk4.0 + v = tk_call('winfo', 'visualsavailable', window.path) + end + list(v) + end + def winfo_visualsavailable + TkWinfo.visualsavailable self + end + def TkWinfo.vrootheight(window) number(tk_call('winfo', 'vrootheight', window.path)) end def winfo_vrootheight @@ -1874,12 +1911,12 @@ class TkToplevel<TkWindow @classname = classname if keys.kind_of? Hash keys = keys.dup - @classname = keys.delete('classname') - @colormap = keys.delete('colormap') - @container = keys.delete('container') - @screen = keys.delete('screen') - @use = keys.delete('use') - @visual = keys.delete('visual') + @classname = keys.delete('classname') if keys.key?('classname') + @colormap = keys.delete('colormap') if keys.key?('colormap') + @container = keys.delete('container') if keys.key?('container') + @screen = keys.delete('screen') if keys.key?('screen') + @use = keys.delete('use') if keys.key?('use') + @visual = keys.delete('visual') if keys.key?('visual') end super(parent, keys) end @@ -1910,10 +1947,10 @@ class TkFrame<TkWindow def initialize(parent=nil, keys=nil) if keys.kind_of? Hash keys = keys.dup - @classname = keys.delete('classname') - @colormap = keys.delete('colormap') - @container = keys.delete('container') - @visual = keys.delete('visual') + @classname = keys.delete('classname') if keys.key?('classname') + @colormap = keys.delete('colormap') if keys.key?('colormap') + @container = keys.delete('container') if keys.key?('container') + @visual = keys.delete('visual') if keys.key?('visual') end super(parent, keys) end