diff options
author | Ned Deily <nad@acm.org> | 2011-07-06 02:08:38 (GMT) |
---|---|---|
committer | Ned Deily <nad@acm.org> | 2011-07-06 02:08:38 (GMT) |
commit | 885b164bfe9907dcedc4c9260801bd59a790c0c5 (patch) | |
tree | 427c729c7fad932a0bbc7a9cb34ddfe16dfdeb6e /Lib/lib-tk | |
parent | 09f6ab0d0fd10dfadae3de5896805157e73323b0 (diff) | |
download | cpython-885b164bfe9907dcedc4c9260801bd59a790c0c5.zip cpython-885b164bfe9907dcedc4c9260801bd59a790c0c5.tar.gz cpython-885b164bfe9907dcedc4c9260801bd59a790c0c5.tar.bz2 |
Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
OS X window manager connection in tk tests, use OS X Application Services
API calls instead.
Diffstat (limited to 'Lib/lib-tk')
-rw-r--r-- | Lib/lib-tk/test/runtktests.py | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/Lib/lib-tk/test/runtktests.py b/Lib/lib-tk/test/runtktests.py index 19769ad..95e1728 100644 --- a/Lib/lib-tk/test/runtktests.py +++ b/Lib/lib-tk/test/runtktests.py @@ -10,41 +10,51 @@ import os import sys import unittest import importlib -import subprocess import test.test_support this_dir_path = os.path.abspath(os.path.dirname(__file__)) -_tk_available = None +_tk_unavailable = None def check_tk_availability(): """Check that Tk is installed and available.""" - global _tk_available - - if _tk_available is not None: - return - - if sys.platform == 'darwin': - # The Aqua Tk implementations on OS X can abort the process if - # being called in an environment where a window server connection - # cannot be made, for instance when invoked by a buildbot or ssh - # process not running under the same user id as the current console - # user. Instead, try to initialize Tk under a subprocess. - p = subprocess.Popen( - [sys.executable, '-c', 'import Tkinter; Tkinter.Button()'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stderr = test.test_support.strip_python_stderr(p.communicate()[1]) - if stderr or p.returncode: - raise unittest.SkipTest("tk cannot be initialized: %s" % stderr) - else: - import Tkinter - try: - Tkinter.Button() - except Tkinter.TclError as msg: - # assuming tk is not available - raise unittest.SkipTest("tk not available: %s" % msg) - - _tk_available = True + global _tk_unavailable + + if _tk_unavailable is None: + _tk_unavailable = False + if sys.platform == 'darwin': + # The Aqua Tk implementations on OS X can abort the process if + # being called in an environment where a window server connection + # cannot be made, for instance when invoked by a buildbot or ssh + # process not running under the same user id as the current console + # user. To avoid that, raise an exception if the window manager + # connection is not available. + from ctypes import cdll, c_int, pointer, Structure + from ctypes.util import find_library + + app_services = cdll.LoadLibrary(find_library("ApplicationServices")) + + if app_services.CGMainDisplayID() == 0: + _tk_unavailable = "cannot run without OS X window manager" + else: + class ProcessSerialNumber(Structure): + _fields_ = [("highLongOfPSN", c_int), + ("lowLongOfPSN", c_int)] + psn = ProcessSerialNumber() + psn_p = pointer(psn) + if ( (app_services.GetCurrentProcess(psn_p) < 0) or + (app_services.SetFrontProcess(psn_p) < 0) ): + _tk_unavailable = "cannot run without OS X gui process" + else: # not OS X + import Tkinter + try: + Tkinter.Button() + except Tkinter.TclError as msg: + # assuming tk is not available + _tk_unavailable = "tk not available: %s" % msg + + if _tk_unavailable: + raise unittest.SkipTest(_tk_unavailable) return def is_package(path): |