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

The discussion on comp.lang.tcl that originally prompted this ticket is

From what I gather in 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 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):

<verbatim>
==== 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
</verbatim>