Commit 17c75eb5 authored by Ned Deily's avatar Ned Deily

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.
parents 804a4315 d7c142d3
import subprocess
import sys import sys
from test import support
import tkinter import tkinter
import unittest import unittest
_tk_available = None _tk_unavailable = None
def check_tk_availability(): def check_tk_availability():
"""Check that Tk is installed and available.""" """Check that Tk is installed and available."""
global _tk_available global _tk_unavailable
if _tk_available is not None:
return
if _tk_unavailable is None:
_tk_unavailable = False
if sys.platform == 'darwin': if sys.platform == 'darwin':
# The Aqua Tk implementations on OS X can abort the process if # The Aqua Tk implementations on OS X can abort the process if
# being called in an environment where a window server connection # being called in an environment where a window server connection
# cannot be made, for instance when invoked by a buildbot or ssh # cannot be made, for instance when invoked by a buildbot or ssh
# process not running under the same user id as the current console # process not running under the same user id as the current console
# user. Instead, try to initialize Tk under a subprocess. # user. To avoid that, raise an exception if the window manager
p = subprocess.Popen( # connection is not available.
[sys.executable, '-c', 'import tkinter; tkinter.Button()'], from ctypes import cdll, c_int, pointer, Structure
stdout=subprocess.PIPE, stderr=subprocess.PIPE) from ctypes.util import find_library
stderr = support.strip_python_stderr(p.communicate()[1])
if stderr or p.returncode: app_services = cdll.LoadLibrary(find_library("ApplicationServices"))
raise unittest.SkipTest("tk cannot be initialized: %s" % stderr)
if app_services.CGMainDisplayID() == 0:
_tk_unavailable = "cannot run without OS X window manager"
else: 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: try:
tkinter.Button() tkinter.Button()
except tkinter.TclError as msg: except tkinter.TclError as msg:
# assuming tk is not available # assuming tk is not available
raise unittest.SkipTest("tk not available: %s" % msg) _tk_unavailable = "tk not available: %s" % msg
_tk_available = True if _tk_unavailable:
raise unittest.SkipTest(_tk_unavailable)
return return
def get_tk_root(): def get_tk_root():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment