fix: separate atomacos import from AppKit to avoid disabling all macOS features

The original change removed atomacos from dependencies but left it
bundled in the same try/except as AppKit.  Without atomacos installed,
the ImportError made MACOS_LIBS_AVAILABLE=False, silently disabling
every macOS feature (screenshots, window control, etc.) even though
they never use atomacos.

- Split import into independent try/except blocks
- Guard get_accessibility_tree() with ATOMACOS_AVAILABLE
- Condense redundant comments in requirements files
- Tighten README note into a blockquote
This commit is contained in:
xlrrrr 2026-04-16 20:31:26 +08:00
parent 457cc12324
commit 7f109fef31
4 changed files with 13 additions and 12 deletions

View file

@ -40,11 +40,7 @@ Set `"mode": "server"` in `openspace/config/config_grounding.json`:
pip install pyobjc-core pyobjc-framework-cocoa pyobjc-framework-quartz
```
`atomacos` is not included in the default macOS dependency set right now because
its published releases require `pyautogui<0.9.42`, which conflicts with
OpenSpace's `pyautogui>=0.9.54`. OpenSpace will still run without it, but the
macOS accessibility-tree features will stay unavailable until that upstream
constraint is resolved.
> **Note:** `atomacos` is excluded because it requires `pyautogui<0.9.42` (appears unmaintained). Accessibility-tree features are currently unavailable.
**Permissions required** (macOS will prompt automatically on first run):
- **Accessibility** (for GUI control)

View file

@ -5,11 +5,16 @@ from openspace.utils.logging import Logger
try:
import AppKit
import atomacos
MACOS_LIBS_AVAILABLE = True
except ImportError:
MACOS_LIBS_AVAILABLE = False
try:
import atomacos
ATOMACOS_AVAILABLE = True
except ImportError:
ATOMACOS_AVAILABLE = False
logger = Logger.get_logger(__name__)
_warning_shown = False
@ -21,8 +26,9 @@ class MacOSAdapter:
if not MACOS_LIBS_AVAILABLE and not _warning_shown:
logger.warning("macOS libraries are not fully installed, some features may not be available")
logger.info("To install missing libraries, run: pip install pyobjc-core pyobjc-framework-Cocoa pyobjc-framework-quartz")
logger.info("Note: atomacos is currently optional because its published versions conflict with pyautogui>=0.9.54")
_warning_shown = True
if not ATOMACOS_AVAILABLE:
logger.debug("atomacos not installed; accessibility-tree features unavailable (conflicts with pyautogui>=0.9.54)")
self.available = MACOS_LIBS_AVAILABLE
def capture_screenshot_with_cursor(self, output_path: str) -> bool:
@ -164,6 +170,8 @@ class MacOSAdapter:
"""
if not MACOS_LIBS_AVAILABLE:
return {'error': 'macOS accessibility libraries not available'}
if not ATOMACOS_AVAILABLE:
return {'error': 'atomacos is not installed; accessibility-tree features require it'}
try:
# Get frontmost application
@ -178,7 +186,6 @@ class MacOSAdapter:
logger.info(f"Getting accessibility tree: {app_name} ({bundle_id})")
# Use atomacos to get application reference
try:
if bundle_id:
app_ref = atomacos.getAppRefByBundleId(bundle_id)

View file

@ -8,8 +8,7 @@ requests>=2.32.0
# pyobjc-core>=12.0; sys_platform == 'darwin'
# pyobjc-framework-cocoa>=12.0; sys_platform == 'darwin'
# pyobjc-framework-quartz>=12.0; sys_platform == 'darwin'
# atomacos is intentionally excluded for now: atomacos 3.2+/3.3 requires
# pyautogui<0.9.42, which conflicts with OpenSpace's pyautogui>=0.9.54.
# atomacos excluded: requires pyautogui<0.9.42, conflicts with >=0.9.54
# # Linux-specific dependencies (local server)
# python-xlib>=0.33; sys_platform == 'linux'

View file

@ -19,8 +19,7 @@ requests>=2.32.0
# pyobjc-core>=12.0; sys_platform == 'darwin'
# pyobjc-framework-cocoa>=12.0; sys_platform == 'darwin'
# pyobjc-framework-quartz>=12.0; sys_platform == 'darwin'
# atomacos is intentionally excluded for now: atomacos 3.2+/3.3 requires
# pyautogui<0.9.42, which conflicts with OpenSpace's pyautogui>=0.9.54.
# atomacos excluded: requires pyautogui<0.9.42, conflicts with >=0.9.54
# # Linux-specific dependencies (local server)
# python-xlib>=0.33; sys_platform == 'linux'