1#
2# tk/wm.rb : methods for wm command
3#
4require 'tk'
5
6module Tk
7  module Wm
8    #include TkComm
9    extend TkCore
10
11    TkCommandNames = ['wm'.freeze].freeze
12
13    TOPLEVEL_METHODCALL_OPTKEYS = {}
14
15    def Wm.aspect(win, *args)
16      if args.length == 0
17        list(tk_call_without_enc('wm', 'aspect', win.epath))
18      else
19        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
20        tk_call('wm', 'aspect', win.epath, *args)
21        win
22      end
23    end
24    def aspect(*args)
25      Wm.aspect(self, *args)
26    end
27    alias wm_aspect aspect
28    TOPLEVEL_METHODCALL_OPTKEYS['aspect'] = 'aspect'
29
30    def Wm.attributes(win, slot=nil,value=TkComm::None)
31      if slot == nil
32        lst = tk_split_list(tk_call('wm', 'attributes', win.epath))
33        info = {}
34        while key = lst.shift
35          info[key[1..-1]] = lst.shift
36        end
37        info
38      elsif slot.kind_of? Hash
39        tk_call('wm', 'attributes', win.epath, *hash_kv(slot))
40        win
41      elsif value == TkComm::None
42        tk_call('wm', 'attributes', win.epath, "-#{slot}")
43      else
44        tk_call('wm', 'attributes', win.epath, "-#{slot}", value)
45        win
46      end
47    end
48    def attributes(slot=nil,value=TkComm::None)
49      Wm.attributes(self, slot, value)
50    end
51    alias wm_attributes attributes
52    TOPLEVEL_METHODCALL_OPTKEYS['attributes'] = 'attributes'
53
54    def Wm.client(win, name=TkComm::None)
55      if name == TkComm::None
56        tk_call('wm', 'client', win.epath)
57      else
58        name = '' if name == nil
59        tk_call('wm', 'client', win.epath, name)
60        win
61      end
62    end
63    def client(name=TkComm::None)
64      Wm.client(self, name)
65    end
66    alias wm_client client
67    TOPLEVEL_METHODCALL_OPTKEYS['client'] = 'client'
68
69    def Wm.colormapwindows(win, *args)
70      if args.size == 0
71        list(tk_call_without_enc('wm', 'colormapwindows', win.epath))
72      else
73        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
74        tk_call_without_enc('wm', 'colormapwindows', win.epath, *args)
75        win
76      end
77    end
78    def colormapwindows(*args)
79      Wm.colormapwindows(self, *args)
80    end
81    alias wm_colormapwindows colormapwindows
82    TOPLEVEL_METHODCALL_OPTKEYS['colormapwindows'] = 'colormapwindows'
83
84    def Wm.command(win, value=nil)
85      if value
86        tk_call('wm', 'command', win.epath, value)
87        win
88      else
89        #procedure(tk_call('wm', 'command', win.epath))
90        tk_call('wm', 'command', win.epath)
91      end
92    end
93    def wm_command(value=nil)
94      Wm.command(self, value)
95    end
96    TOPLEVEL_METHODCALL_OPTKEYS['wm_command'] = 'wm_command'
97
98    def Wm.deiconify(win, ex = true)
99      if ex
100        tk_call_without_enc('wm', 'deiconify', win.epath)
101      else
102        Wm.iconify(win)
103      end
104      win
105    end
106    def deiconify(ex = true)
107      Wm.deiconify(self, ex)
108    end
109    alias wm_deiconify deiconify
110
111    def Wm.focusmodel(win, mode = nil)
112      if mode
113        tk_call_without_enc('wm', 'focusmodel', win.epath, mode)
114        win
115      else
116        tk_call_without_enc('wm', 'focusmodel', win.epath)
117      end
118    end
119    def focusmodel(mode = nil)
120      Wm.focusmodel(self, mode)
121    end
122    alias wm_focusmodel focusmodel
123    TOPLEVEL_METHODCALL_OPTKEYS['focusmodel'] = 'focusmodel'
124
125    def Wm.forget(win)
126      # Tcl/Tk 8.5+
127      # work with dockable frames
128      tk_call_without_enc('wm', 'forget', win.epath)
129      win
130    end
131    def wm_forget
132      Wm.forget(self)
133    end
134
135    def Wm.frame(win)
136      tk_call_without_enc('wm', 'frame', win.epath)
137    end
138    def frame
139      Wm.frame(self)
140    end
141    alias wm_frame frame
142
143    def Wm.geometry(win, geom=nil)
144      if geom
145        tk_call_without_enc('wm', 'geometry', win.epath, geom)
146        win
147      else
148        tk_call_without_enc('wm', 'geometry', win.epath)
149      end
150    end
151    def geometry(geom=nil)
152      Wm.geometry(self, geom)
153    end
154    alias wm_geometry geometry
155    TOPLEVEL_METHODCALL_OPTKEYS['geometry'] = 'geometry'
156
157    def Wm.grid(win, *args)
158      if args.size == 0
159        list(tk_call_without_enc('wm', 'grid', win.epath))
160      else
161        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
162        tk_call_without_enc('wm', 'grid', win.epath, *args)
163        win
164      end
165    end
166    def wm_grid(*args)
167      Wm.grid(self, *args)
168    end
169    TOPLEVEL_METHODCALL_OPTKEYS['wm_grid'] = 'wm_grid'
170
171    def Wm.group(win, leader = nil)
172      if leader
173        tk_call('wm', 'group', win.epath, leader)
174        win
175      else
176        window(tk_call('wm', 'group', win.epath))
177      end
178    end
179    def group(leader = nil)
180      Wm.group(self, leader)
181    end
182    alias wm_group group
183    TOPLEVEL_METHODCALL_OPTKEYS['group'] = 'group'
184
185    def Wm.iconbitmap(win, bmp=nil)
186      if bmp
187        tk_call_without_enc('wm', 'iconbitmap', win.epath, bmp)
188        win
189      else
190        image_obj(tk_call_without_enc('wm', 'iconbitmap', win.epath))
191      end
192    end
193    def iconbitmap(bmp=nil)
194      Wm.iconbitmap(self, bmp)
195    end
196    alias wm_iconbitmap iconbitmap
197    TOPLEVEL_METHODCALL_OPTKEYS['iconbitmap'] = 'iconbitmap'
198
199    def Wm.iconphoto(win, *imgs)
200      if imgs.empty?
201        win.instance_eval{
202          @wm_iconphoto = nil unless defined? @wm_iconphoto
203          return @wm_iconphoto
204        }
205      end
206
207      imgs = imgs[0] if imgs.length == 1 && imgs[0].kind_of?(Array)
208      tk_call_without_enc('wm', 'iconphoto', win.epath, *imgs)
209      win.instance_eval{ @wm_iconphoto = imgs  }
210      win
211    end
212    def iconphoto(*imgs)
213      Wm.iconphoto(self, *imgs)
214    end
215    alias wm_iconphoto iconphoto
216    TOPLEVEL_METHODCALL_OPTKEYS['iconphoto'] = 'iconphoto'
217
218    def Wm.iconphoto_default(win, *imgs)
219      imgs = imgs[0] if imgs.length == 1 && imgs[0].kind_of?(Array)
220      tk_call_without_enc('wm', 'iconphoto', win.epath, '-default', *imgs)
221      win
222    end
223    def iconphoto_default(*imgs)
224      Wm.iconphoto_default(self, *imgs)
225    end
226    alias wm_iconphoto_default iconphoto_default
227
228    def Wm.iconify(win, ex = true)
229      if ex
230        tk_call_without_enc('wm', 'iconify', win.epath)
231      else
232        Wm.deiconify(win)
233      end
234      win
235    end
236    def iconify(ex = true)
237      Wm.iconify(self, ex)
238    end
239    alias wm_iconify iconify
240
241    def Wm.iconmask(win, bmp=nil)
242      if bmp
243        tk_call_without_enc('wm', 'iconmask', win.epath, bmp)
244        win
245      else
246        image_obj(tk_call_without_enc('wm', 'iconmask', win.epath))
247      end
248    end
249    def iconmask(bmp=nil)
250      Wm.iconmask(self, bmp)
251    end
252    alias wm_iconmask iconmask
253    TOPLEVEL_METHODCALL_OPTKEYS['iconmask'] = 'iconmask'
254
255    def Wm.iconname(win, name=nil)
256      if name
257        tk_call('wm', 'iconname', win.epath, name)
258        win
259      else
260        tk_call('wm', 'iconname', win.epath)
261      end
262    end
263    def iconname(name=nil)
264      Wm.iconname(self, name)
265    end
266    alias wm_iconname iconname
267    TOPLEVEL_METHODCALL_OPTKEYS['iconname'] = 'iconname'
268
269    def Wm.iconposition(win, *args)
270      if args.size == 0
271        list(tk_call_without_enc('wm', 'iconposition', win.epath))
272      else
273        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
274        tk_call_without_enc('wm', 'iconposition', win.epath, *args)
275        win
276      end
277    end
278    def iconposition(*args)
279      Wm.iconposition(self, *args)
280    end
281    alias wm_iconposition iconposition
282    TOPLEVEL_METHODCALL_OPTKEYS['iconposition'] = 'iconposition'
283
284    def Wm.iconwindow(win, iconwin = nil)
285      if iconwin
286        tk_call_without_enc('wm', 'iconwindow', win.epath, iconwin)
287        win
288      else
289        w = tk_call_without_enc('wm', 'iconwindow', win.epath)
290        (w == '')? nil: window(w)
291      end
292    end
293    def iconwindow(iconwin = nil)
294      Wm.iconwindow(self, iconwin)
295    end
296    alias wm_iconwindow iconwindow
297    TOPLEVEL_METHODCALL_OPTKEYS['iconwindow'] = 'iconwindow'
298
299    def Wm.manage(win)
300      # Tcl/Tk 8.5+ feature
301      tk_call_without_enc('wm', 'manage', win.epath)
302      win
303    end
304    def wm_manage
305      Wm.manage(self)
306    end
307=begin
308    def Wm.manage(win, use_id = nil)
309      # Tcl/Tk 8.5+ feature
310      # --------------------------------------------------------------
311      # In the future release, I want to support to embed the 'win'
312      # into the container which has window-id 'use-id'.
313      # It may give users frexibility on controlling their GUI.
314      # However, it may be difficult for current Tcl/Tk (Tcl/Tk8.5.1),
315      # because it seems to require to modify Tcl/Tk's source code.
316      # --------------------------------------------------------------
317      if use_id
318        tk_call_without_enc('wm', 'manage', win.epath, '-use', use_id)
319      else
320        tk_call_without_enc('wm', 'manage', win.epath)
321      end
322      win
323    end
324=end
325
326    def Wm.maxsize(win, *args)
327      if args.size == 0
328        list(tk_call_without_enc('wm', 'maxsize', win.epath))
329      else
330        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
331        tk_call_without_enc('wm', 'maxsize', win.epath, *args)
332        win
333      end
334    end
335    def maxsize(*args)
336      Wm.maxsize(self, *args)
337    end
338    alias wm_maxsize maxsize
339    TOPLEVEL_METHODCALL_OPTKEYS['maxsize'] = 'maxsize'
340
341    def Wm.minsize(win, *args)
342      if args.size == 0
343        list(tk_call_without_enc('wm', 'minsize', win.epath))
344      else
345        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
346        tk_call_without_enc('wm', 'minsize', win.path, *args)
347        win
348      end
349    end
350    def minsize(*args)
351      Wm.minsize(self, *args)
352    end
353    alias wm_minsize minsize
354    TOPLEVEL_METHODCALL_OPTKEYS['minsize'] = 'minsize'
355
356    def Wm.overrideredirect(win, mode=TkComm::None)
357      if mode == TkComm::None
358        bool(tk_call_without_enc('wm', 'overrideredirect', win.epath))
359      else
360        tk_call_without_enc('wm', 'overrideredirect', win.epath, mode)
361        win
362      end
363    end
364    def overrideredirect(mode=TkComm::None)
365      Wm.overrideredirect(self, mode)
366    end
367    alias wm_overrideredirect overrideredirect
368    TOPLEVEL_METHODCALL_OPTKEYS['overrideredirect'] = 'overrideredirect'
369
370    def Wm.positionfrom(win, who=TkComm::None)
371      if who == TkComm::None
372        r = tk_call_without_enc('wm', 'positionfrom', win.epath)
373        (r == "")? nil: r
374      else
375        tk_call_without_enc('wm', 'positionfrom', win.epath, who)
376        win
377      end
378    end
379    def positionfrom(who=TkComm::None)
380      Wm.positionfrom(self, who)
381    end
382    alias wm_positionfrom positionfrom
383    TOPLEVEL_METHODCALL_OPTKEYS['positionfrom'] = 'positionfrom'
384
385    def Wm.protocol(win, name=nil, cmd=nil, &b)
386      if cmd
387        tk_call_without_enc('wm', 'protocol', win.epath, name, cmd)
388        win
389      elsif b
390        tk_call_without_enc('wm', 'protocol', win.epath, name, proc(&b))
391        win
392      elsif name
393        result = tk_call_without_enc('wm', 'protocol', win.epath, name)
394        (result == "")? nil : tk_tcl2ruby(result)
395      else
396        tk_split_simplelist(tk_call_without_enc('wm', 'protocol', win.epath))
397      end
398    end
399    def protocol(name=nil, cmd=nil, &b)
400      Wm.protocol(self, name, cmd, &b)
401    end
402    alias wm_protocol protocol
403
404    def Wm.protocols(win, kv=nil)
405      unless kv
406        ret = {}
407        Wm.protocol(win).each{|name|
408          ret[name] = Wm.protocol(win, name)
409        }
410        return ret
411      end
412
413      unless kv.kind_of?(Hash)
414        fail ArgumentError, 'expect a hash of protocol=>command'
415      end
416      kv.each{|k, v| Wm.protocol(win, k, v)}
417      win
418    end
419    def protocols(kv=nil)
420      Wm.protocols(self, kv)
421    end
422    alias wm_protocols protocols
423    TOPLEVEL_METHODCALL_OPTKEYS['protocols'] = 'protocols'
424
425    def Wm.resizable(win, *args)
426      if args.length == 0
427        list(tk_call_without_enc('wm', 'resizable', win.epath)).map!{|e| bool(e)}
428      else
429        args = args[0] if args.length == 1 && args[0].kind_of?(Array)
430        tk_call_without_enc('wm', 'resizable', win.epath, *args)
431        win
432      end
433    end
434    def resizable(*args)
435      Wm.resizable(self, *args)
436    end
437    alias wm_resizable resizable
438    TOPLEVEL_METHODCALL_OPTKEYS['resizable'] = 'resizable'
439
440    def Wm.sizefrom(win, who=TkComm::None)
441      if who == TkComm::None
442        r = tk_call_without_enc('wm', 'sizefrom', win.epath)
443        (r == "")? nil: r
444      else
445        tk_call_without_enc('wm', 'sizefrom', win.epath, who)
446        win
447      end
448    end
449    def sizefrom(who=TkComm::None)
450      Wm.sizefrom(self, who)
451    end
452    alias wm_sizefrom sizefrom
453    TOPLEVEL_METHODCALL_OPTKEYS['sizefrom'] = 'sizefrom'
454
455    def Wm.stackorder(win)
456      list(tk_call('wm', 'stackorder', win.epath))
457    end
458    def stackorder
459      Wm.stackorder(self)
460    end
461    alias wm_stackorder stackorder
462
463    def Wm.stackorder_isabove(win, target)
464      bool(tk_call('wm', 'stackorder', win.epath, 'isabove', target))
465    end
466    def Wm.stackorder_is_above(win, target)
467      Wm.stackorder_isabove(win, target)
468    end
469    def stackorder_isabove(target)
470      Wm.stackorder_isabove(self, target)
471    end
472    alias stackorder_is_above stackorder_isabove
473    alias wm_stackorder_isabove stackorder_isabove
474    alias wm_stackorder_is_above stackorder_isabove
475
476    def Wm.stackorder_isbelow(win, target)
477      bool(tk_call('wm', 'stackorder', win.epath, 'isbelow', target))
478    end
479    def Wm.stackorder_is_below(win, target)
480      Wm.stackorder_isbelow(win, target)
481    end
482    def stackorder_isbelow(target)
483      Wm.stackorder_isbelow(self, target)
484    end
485    alias stackorder_is_below stackorder_isbelow
486    alias wm_stackorder_isbelow stackorder_isbelow
487    alias wm_stackorder_is_below stackorder_isbelow
488
489    def Wm.state(win, st=nil)
490      if st
491        tk_call_without_enc('wm', 'state', win.epath, st)
492        win
493      else
494        tk_call_without_enc('wm', 'state', win.epath)
495      end
496    end
497    def state(st=nil)
498      Wm.state(self, st)
499    end
500    alias wm_state state
501    TOPLEVEL_METHODCALL_OPTKEYS['state'] = 'state'
502
503    def Wm.title(win, str=nil)
504      if str
505        tk_call('wm', 'title', win.epath, str)
506        win
507      else
508        tk_call('wm', 'title', win.epath)
509      end
510    end
511    def title(str=nil)
512      Wm.title(self, str)
513    end
514    alias wm_title title
515    TOPLEVEL_METHODCALL_OPTKEYS['title'] = 'title'
516
517    def Wm.transient(win, master=nil)
518      if master
519        tk_call_without_enc('wm', 'transient', win.epath, master)
520        win
521      else
522        window(tk_call_without_enc('wm', 'transient', win.epath))
523      end
524    end
525    def transient(master=nil)
526      Wm.transient(self, master)
527    end
528    alias wm_transient transient
529    TOPLEVEL_METHODCALL_OPTKEYS['transient'] = 'transient'
530
531    def Wm.withdraw(win, ex = true)
532      if ex
533        tk_call_without_enc('wm', 'withdraw', win.epath)
534      else
535        Wm.deiconify(win)
536      end
537      win
538    end
539    def withdraw(ex = true)
540      Wm.withdraw(self, ex)
541    end
542    alias wm_withdraw withdraw
543  end
544
545  module Wm_for_General
546    Wm.instance_methods.each{|m|
547      if (m = m.to_s) =~ /^wm_(.*)$/
548        eval "def #{m}(*args, &b); Tk::Wm.#{$1}(self, *args, &b); end"
549      end
550    }
551  end
552end
553