Tk Source Code

View Ticket
Login
Ticket UUID: 1163496
Title: wm transient broken
Type: Bug Version: obsolete: 8.4.9
Submitter: kylebateman Created on: 2005-03-15 05:43:07
Subsystem: 67. Unix Window Operations Assigned To: dkf
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2010-01-06 16:30:42
Resolution: Fixed Closed By: dkf
    Closed on: 2010-01-06 09:30:42
Description:
 In tk 8.3.5, the "wm transient" command made a window
so it always stayed on top of its parent. In addition,
my window manager is configured to not put a title bar
on a transient window.

In Fedora 3, I am using tk 8.4.7 and my test window
does not seem to be getting marked as transient. It
doesn't stay on top of its parent and its title bar is
no longer suppressed.

I'm enclosing a test script. Just run the script and
then move the "." window to the same part of the screen
as the "HI" window. As I understand it, the "HI" window
should always stay on top of the "." window.
User Comments: dkf added on 2010-01-06 16:30:42:

allow_comments - 1

And 8.5 branch

dkf added on 2010-01-06 16:26:51:
Verified that this does indeed fix things. Fixed in HEAD

Test used to check follows:
test wm-transient-8.1 {transient to withdrawn window, Bug 1163496} -setup {
    deleteWindows
    set result {}
} -body {
    # Verifies that transients stay on top of their masters, even if they were
    # made transients when those masters were withdrawn.
    toplevel .t1; wm withdraw  .t1;     update
    toplevel .t2; wm transient .t2 .t1; update
    lappend result [winfo ismapped .t1] [winfo ismapped .t2]
    wm deiconify .t1; update
    lappend result [winfo ismapped .t1] [winfo ismapped .t2]
    raise .t1; update
    lappend result [lsearch -all -inline -glob [wm stackorder .] ".t?"]
} -cleanup {
    deleteWindows
} -result {0 0 1 1 {.t1 .t2}}

patthoyts added on 2010-01-06 07:04:15:
The following patch would appear to be sufficient.

Index: unix/tkUnixWm.c
===================================================================
RCS file: /cvsroot/tktoolkit/tk/unix/tkUnixWm.c,v
retrieving revision 1.77
diff -u -p -r1.77 tkUnixWm.c
--- unix/tkUnixWm.c9 Dec 2009 13:55:14 -00001.77
+++ unix/tkUnixWm.c5 Jan 2010 01:49:43 -0000
@@ -676,11 +676,10 @@ TkWmMapWindow(
     if (!Tk_IsMapped(wmPtr->masterPtr)) {
 wmPtr->withdrawn = 1;
 wmPtr->hints.initial_state = WithdrawnState;
-    } else {
-XSetTransientForHint(winPtr->display,
-wmPtr->wrapperPtr->window,
-wmPtr->masterPtr->wmInfoPtr->wrapperPtr->window);
     }
+    XSetTransientForHint(winPtr->display,
+    wmPtr->wrapperPtr->window,
+    wmPtr->masterPtr->wmInfoPtr->wrapperPtr->window);
 }
 
 wmPtr->flags |= WM_UPDATE_SIZE_HINTS;

kylebateman added on 2005-03-18 07:34:33:
Logged In: YES 
user_id=316877

Yup, that last post was from me, I just wasn't logged in.

nobody added on 2005-03-18 07:33:14:
Logged In: NO 

I can confirm that if I get the parent window to map before
creating the transients, that solves the problem.  In my
particular case, this is a suitable workaround.  Thanks for
the info--that helped.

Seems like it would still be nice to make this work right if
a solution is achievable.  For example, I notice that even
if I do:

after idle "wm transient ..."

Seemed like in order to get it to work, I had to do an
actual "update" before creating the child windows.

hobbs added on 2005-03-18 06:32:18:
Logged In: YES 
user_id=72656

Mo should comment on this.

jenglish added on 2005-03-18 05:40:02:
Logged In: YES 
user_id=68433

This looks like a race condition -- [wm transient .t .] is
being called before the main toplevel "." has been mapped. 
If you run the script from an interactive wish (after "."
has been mapped), or run "tkwait visibility ." before
creating .t, or anything else that ensures "." is mapped,
you'll get the expected behavior.

With that information, are you able to find a workaround in
your application?

This is related to changes made in 2002:

2002-05-27 (feature change) [wm transient .t .t] now raises
an error (dejong)
        *** POTENTIAL INCOMPATIBILITY ***

2002-06-12 (feature change) A transient toplevel now mirrors
state changes
in the master. (dejong)
        *** POTENTIAL INCOMPATIBILITY ***

See also CVS log entries for tkUnixWm.c r1.21 and r1.20.

Changing back to the 8.3 behavior would reintroduce whatever
problems the original changes were intended to fix.

kylebateman added on 2005-03-15 12:43:07:

File Added - 125662: test

Attachments: