Tk: setting window class

M

Marcin Simonides

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"...).
 
H

Hidetoshi NAGAI

From: Marcin Simonides <[email protected]>
Subject: Tk: setting window class
Date: Wed, 1 Aug 2007 06:09:47 +0900
Message-ID: said:
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.
 
M

Marcin Simonides

Hidetoshi said:
From: Marcin Simonides <[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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,731
Latest member
MarcyGipso

Latest Threads

Top