diff --git a/.gitignore b/.gitignore index 8d5b911..318fa0f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ dist/' docs/_build __pycache__/ *.py[cod] +*.egg-info diff --git a/accessible_output2/__init__.py b/accessible_output2/__init__.py index e5c4868..482d189 100644 --- a/accessible_output2/__init__.py +++ b/accessible_output2/__init__.py @@ -1,48 +1,59 @@ -from __future__ import absolute_import -import ctypes -import os -import types -from platform_utils import paths - - -def load_library(libname, cdll=False): - if paths.is_frozen(): - libfile = os.path.join( - paths.embedded_data_path(), "accessible_output2", "lib", libname - ) - else: - libfile = os.path.join(paths.module_path(), "lib", libname) - if not os.path.exists(libfile): - _cxfreeze_libfile = os.path.join( - paths.embedded_data_path(), "lib", "accessible_output2", "lib", libname - ) - if os.path.exists(_cxfreeze_libfile): - libfile = _cxfreeze_libfile - if cdll: - return ctypes.cdll[libfile] - return ctypes.windll[libfile] - - -def get_output_classes(): - from . import outputs - - module_type = types.ModuleType - classes = [ - m.output_class - for m in outputs.__dict__.values() - if isinstance(m, module_type) and hasattr(m, "output_class") - ] - return sorted(classes, key=lambda c: c.priority) - - -def find_datafiles(): - import platform - from glob import glob - import accessible_output2 - - if platform.system() != "Windows": - return [] - path = os.path.join(accessible_output2.__path__[0], "lib", "*.dll") - results = glob(path) - dest_dir = os.path.join("accessible_output2", "lib") - return [(dest_dir, results)] +from __future__ import absolute_import +import ctypes +import os +import sys +import types +from platform_utils import paths + + +def _get_nuitka_binary_dir(): + """Get Nuitka onefile extraction directory if running under Nuitka.""" + import __main__ + return getattr(__main__, "__nuitka_binary_dir", None) + + +def load_library(libname, cdll=False): + # Check for Nuitka onefile first - it extracts to a temp directory + nuitka_dir = _get_nuitka_binary_dir() + if nuitka_dir: + libfile = os.path.join(nuitka_dir, "accessible_output2", "lib", libname) + elif paths.is_frozen(): + libfile = os.path.join( + paths.embedded_data_path(), "accessible_output2", "lib", libname + ) + else: + libfile = os.path.join(paths.module_path(), "lib", libname) + if not os.path.exists(libfile): + _cxfreeze_libfile = os.path.join( + paths.embedded_data_path(), "lib", "accessible_output2", "lib", libname + ) + if os.path.exists(_cxfreeze_libfile): + libfile = _cxfreeze_libfile + if cdll: + return ctypes.cdll[libfile] + return ctypes.windll[libfile] + + +def get_output_classes(): + from . import outputs + + module_type = types.ModuleType + classes = [ + m.output_class + for m in outputs.__dict__.values() + if isinstance(m, module_type) and hasattr(m, "output_class") + ] + return sorted(classes, key=lambda c: c.priority) + + +def find_datafiles(): + import platform + from glob import glob + import accessible_output2 + + if platform.system() != "Windows": + return [] + path = os.path.join(accessible_output2.__path__[0], "lib", "*.dll") + results = glob(path) + dest_dir = os.path.join("accessible_output2", "lib") + return [(dest_dir, results)] diff --git a/accessible_output2/outputs/__init__.py b/accessible_output2/outputs/__init__.py index 5142a45..4fd3fae 100644 --- a/accessible_output2/outputs/__init__.py +++ b/accessible_output2/outputs/__init__.py @@ -28,7 +28,7 @@ def _load_com(*names): from . import system_access from . import dolphin from . import pc_talker - from . import zdsr + # import sapi4 diff --git a/accessible_output2/outputs/auto.py b/accessible_output2/outputs/auto.py index a6f7a24..e492584 100644 --- a/accessible_output2/outputs/auto.py +++ b/accessible_output2/outputs/auto.py @@ -51,7 +51,7 @@ def braille(self, *args, **kwargs): def output(self, *args, **kwargs): output = self.get_first_available_output() if output: - output.speak(*args, **kwargs) + output.output(*args, **kwargs) def is_system_output(self): """Returns True if this output is a system output.""" diff --git a/accessible_output2/outputs/base.py b/accessible_output2/outputs/base.py index 7d96dbc..964cda7 100644 --- a/accessible_output2/outputs/base.py +++ b/accessible_output2/outputs/base.py @@ -65,9 +65,9 @@ def output(self, text, **options): RuntimeError: If the requested output doesn't define either speak or braille. """ output = False - if self.speak(text, **options): + if self.speak(text, **options) is not False: output = True - if self.braille(text, **options): + if self.braille(text, **options) is not False: output = True if not output: raise RuntimeError( diff --git a/accessible_output2/outputs/zdsr.py b/accessible_output2/outputs/zdsr.py deleted file mode 100644 index 0d00123..0000000 --- a/accessible_output2/outputs/zdsr.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import absolute_import -import os -import platform -import ctypes - -from platform_utils import paths -from libloader import load_library -from .base import Output - - -class ZDSR(Output): - """Supports The ZDSR screen reader""" - - name = "ZDSR" - lib32 = "ZDSRAPI.dll" - lib64 = "ZDSRAPI_x64.dll" - is_loaded=False - argtypes = { - "speak": (ctypes.c_wchar_p,), - } - - def load(self): - self.lib.InitTTS(0,"") - self.is_loaded=True - - def is_active(self): - try: - if not self.is_loaded: self.load() - return self.lib.GetSpeakState() != 2 - except: - return False - - def speak(self, text, interrupt=False): - if not self.is_loaded: self.load() - self.lib.Speak(text,interrupt) - - def silence(self): - if not self.is_loaded: self.load() - self.lib.StopSpeak() - - -output_class = ZDSR diff --git a/setup.py b/setup.py index 83c29ab..10c8b09 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,10 @@ packages=find_packages(), package_data={"accessible_output2": ["lib/*"]}, zip_safe=False, - install_requires=["libloader", "platform_utils"], + install_requires=[ + "libloader", + "platform_utils @ git+https://github.com/accessibleapps/platform_utils.git" + ], extras_require={ ':sys_platform == "win32"': ["pywin32", "libloader"], ':sys_platform == "darwin"': ["appscript"],