Tk Source Code

View Ticket
Login
Ticket UUID: e02aac5cab6a9a1c8f6a27582ec21dd356ee601b
Title: Grab documentation does not have caveats for windows & mac
Type: Bug Version: trunk
Submitter: oehhar Created on: 2017-02-20 08:06:47
Subsystem: 56. [grab] Assigned To: nobody
Priority: 5 Medium Severity: Minor
Status: Open Last Modified: 2019-01-09 13:40:17
Resolution: None Closed By: nobody
    Closed on:
Description:

Grab does not work as described when running under windows 7 x64. In response to my question about grab on comp.lang.tcl, it was stated that it also would not work as described on mac's either.

Exactly how grab works on windows & macs should be described in the man page for grab.

This was the TCL ticket here http://core.tcl.tk/tcl/info/4915cf6c4f704430.

The discussion on comp.lang.tcl that originally prompted this ticket is https://groups.google.com/d/msg/comp.lang.tcl/jRF7NwcURp4/J_lme2tYAQAJ

User Comments: marc_culler (claiming to be Marc Culler) added on 2019-01-09 13:40:17:

As of commit 1edd8b7a the documentation now describes the behavior on macs.


fvogel added on 2019-01-05 18:31:39:

X-referencing to [b94c17d280].


cjmcdonald added on 2018-07-10 10:08:34:

There is another difference in grab behaviour on Windows. The grab command was changed there so that if one toplevel window in an application has a (non-global) grab then it is not possible to deiconify or raise another toplevel window from the same application in front of it.

I think that the change was ill-advised. It's caused more problems than it solved; it's introduced an unexpected and unsafe linkage between the grab state and toplevel deiconify and raise; and it's increased inconsistency in behaviour between Windows & Unix. See tickets [2896605], [3414089], [3009450]. However, if we're stuck with this behaviour on Windows then at least it should be documented in the grab page.


fvogel added on 2018-07-09 20:37:30:

From what I gather in that c.l.t. discussion:

- global grabs never work on Windows and macOS. grab will force focus on the requested window within the Tk application but has no effect on other windows
- global grabs may not work on Linux either since the wm or desktop preferences can reject it

Moreover, what I see in the test suite output on macOS is that requests for local grabs are always transformed into global grabs on this platorm, which can rather easily be seen in the source code.

For the records, here is the output when exercising grab.test with current core-8-6-branch on macOS (the failures are all due to the local --> global silent switch in the source code):

==== grab-2.2 Tk_GrabObjCmd, grab status gives correct status FAILED
==== Contents of test case:

    set curr [grab current .]
    if { [string length $curr] > 0 } {
	grab release $curr
    }
    grab .
    grab status .

---- Result was:
global
---- Result should have been (exact matching):
local
==== grab-2.2 FAILED



==== grab-4.1 Tk_GrabObjCmd, grab release releases grab FAILED
==== Contents of test case:

    set curr [grab current .]
    if { [string length $curr] > 0 } {
	grab release $curr
    }
    grab .
    set result [grab status .]
    grab release .
    lappend result [grab status .]
    grab -global .
    lappend result [grab status .]
    grab release .
    lappend result [grab status .]

---- Result was:
global none global none
---- Result should have been (exact matching):
local none global none
==== grab-4.1 FAILED



==== grab-5.1 Tk_GrabObjCmd, grab set FAILED
==== Contents of test case:

    set curr [grab current .]
    if { [string length $curr] > 0 } {
	grab release $curr
    }
    grab set .
    list [grab current .] [grab status .]

---- Result was:
. global
---- Result should have been (exact matching):
. local
==== grab-5.1 FAILED