Tk: setting window class

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 S.

Hidetoshi NAGAI wrote:

From: Marcin S. [email protected]
[…]

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 S.

From: Marcin S. [email protected]
Subject: Tk: setting window class
Date: Wed, 1 Aug 2007 06:09:47 +0900
Message-ID: [email protected]

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(‘mytopbackground’, ‘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.