Forum: Ruby Tk: setting window class

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
40caa7d562f4c348efe949638918d367?d=identicon&s=25 Marcin Simonides (cinek)
on 2007-07-31 23:09
I need to set (or at least have a sensible value of) X window class for
all application's windows, so that I can identify them for window
manager (FVWM in this case, this is irrelevant though).

What can I do to achieve this?


Here's what I've been able to learn so far:

The TkRoot window has class name derived from script file name (which is
satisfactory for me) but TkToplevel instances have class name of
TopLevel and resource IDs w00001, w00002 etc (I belive that using
resource names would be possible in FVWM, so a way of setting this could
solve my problem).

In documentation that I found:
http://www.jbrowse.com/text/rubytk_en.html#label:18
there is a definition:

TkToplevel.new(parent=nil, keys=nil)
TkToplevel.new(parent=nil, screen=nil, classname=nil, keys=nil)

but calling TkToplevel.new(@parent, nil, 'MyClass') doesn't set the
window's class.


I apologize if this has been covered on the list before but searching
for this topic is a bit difficult (I mean with keywords like "tktoplevel
window class ruby"...).
--
Marcin Simonides
E4f967492dbd03c526cc9b397e68021d?d=identicon&s=25 Hidetoshi NAGAI (Guest)
on 2007-08-01 19:14
(Received via mailing list)
From: Marcin Simonides <marcin@studio4plus.com>
Subject: Tk: setting window class
Date: Wed, 1 Aug 2007 06:09:47 +0900
Message-ID: <5e0a5efdd2d9eb4334c51c94b16debdb@ruby-forum.com>
> In documentation that I found:
> http://www.jbrowse.com/text/rubytk_en.html#label:18
> there is a definition:
>
> TkToplevel.new(parent=nil, keys=nil)
> TkToplevel.new(parent=nil, screen=nil, classname=nil, keys=nil)
>
> but calling TkToplevel.new(@parent, nil, 'MyClass') doesn't set the
> window's class.

I'm very sorry. That is a bug. The 'classname' argument doesn't work.
Instead of that argument, please use one of the followings:

(1) t = TkToplevel.new(parent, :class=>'MyClass')
      or
    t = TkToplevel.new(parent, :classname=>'MyClass')

(2) class MyClass < TkToplevel; end; t = MyClass.new(@parent)

If you want to use the widget name on the resource DB,
please use 'widgetname' option.
For example,

  TkOptionDB.add('*mytop*background', 'yellow')
  t = TkToplevel.new(parent, :widgetname=>'mytop')

'classname' option and 'widgetname' option are available only on the
Hash argument of TkToplevel.new or TkFrame.new method.
Those cannot be changed after construction.
It means that those option cannot be set in the block argument of
'new' method.

Please see also an example of TkOptionDB (ext/tk/sample/tkoptdb.rb
on the Ruby source tree).
That includes how to give and treat procedures on the resource DB.
40caa7d562f4c348efe949638918d367?d=identicon&s=25 Marcin Simonides (cinek)
on 2007-08-01 20:51
Hidetoshi NAGAI wrote:
> From: Marcin Simonides <marcin@studio4plus.com>
[...]
>> In documentation that I found:
>> http://www.jbrowse.com/text/rubytk_en.html#label:18
>> there is a definition:
>>
>> TkToplevel.new(parent=nil, keys=nil)
>> TkToplevel.new(parent=nil, screen=nil, classname=nil, keys=nil)
>>
>> but calling TkToplevel.new(@parent, nil, 'MyClass') doesn't set the
>> window's class.
>
> I'm very sorry. That is a bug. The 'classname' argument doesn't work.
> Instead of that argument, please use one of the followings:
>
> (1) t = TkToplevel.new(parent, :class=>'MyClass')
>       or
>     t = TkToplevel.new(parent, :classname=>'MyClass')

Thanks. This works.

> (2) class MyClass < TkToplevel; end; t = MyClass.new(@parent)
>
> If you want to use the widget name on the resource DB,
> please use 'widgetname' option.
[...]

I only need to identify application's windows in WM so that I can apply
specific styles and functions to them.
But I'll keep this part about DB options in mind.
--
Marcin Simonides
This topic is locked and can not be replied to.