Page MenuHomePhabricator

Stop Fusion360 from arbitrarily stealing focus on MacOS
Closed, ResolvedPublic

Description

My considered review of Fusion 360 is "not that bad", but some of the bad parts are bad in an absurd sort of way. Here's Fusion 360's UI floating over every other window while I'm writing this task, for example:

Screen Shot 2023-02-04 at 7.47.22 AM.png (278×766 px, 44 KB)

One particular issue is that Fusion 360 will randomly steal focus from other applications. The Fusion 360 application itself doesn't come to the foreground, your current application just loses focus because an invisible Fusion 360 background process decides it wants the OS to focus on nothing.

First, copy/paste something called "Python" from something called "StackOverflow" to prove Fusion 360 is the culprit:

focus_stealer.py
#!/usr/bin/python

from AppKit import NSWorkspace
import time

old_app = ''

while 1:
    new_app = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName']
    if new_app != old_app:
      print("Focus taken by %s." % new_app)
    old_app = new_app
    time.sleep(1)
$ /usr/bin/python focus_stealer.py
Focus taken by Terminal.
Focus taken by Safari.
...

Now we wait.

Event Timeline

epriestley created this task.

It stopped doing it as soon as I started watching it. But just wait, I'll catch it in the act. >_> <_<

...
Focus taken by Safari.
Focus taken by ADPClientService.
Focus taken by Safari.
...

Hey there little buddy, why are you touching that?

ADPClientService is a (currently) non-essential background service that collects juicy user data to send to Autodesk, since there's no way they could be expected to make ends meet on just $545/year licenses alone. You can find lots of threads about how to disable it in various Autodesk products, but none of these instructions appear to work in the current version of Fusion 360.

I claim this is the only sensible place a control to disable this service could appear:

Screen Shot 2023-02-06 at 9.15.55 PM.png (805×1 px, 171 KB)

None of these controls affect the service and selecting the minimum level of data collection does not disable the service.

The service can be located in the process list:

$ ps auxwww | grep -i adpclient
epriestley       23139   0.0  0.1 409407504  12064   ??  S     9:12PM   0:00.59 /Users/epriestley/Library/Application Support/Autodesk/ADPSDK/bin/ADPClientService.app/Contents/MacOS/ADPClientService ...

Moving the .app aside (e.g., to .disabled.app) is insufficient to disable it, since Fusion 360 regenerates it on startup. Note also that exiting Fusion 360 does not necessarily cause ADPClientService to exit.

A sufficient (although not necessarily minimal) strategy for rendering the binary inert appears to be:

  • Destroy or rename the actual binary (.../Contents/MacOS/ADPClientService), e.g. to ADPClientService.disabled.
  • Quit Fusion 360.
  • Kill the ADPClientService process.
  • Relaunch Fusion 360.
  • Identify the new ADPClientService process binary (e.g. .../Autodesk Fusion 360.app/Contents/Frameworks/ADP/ADPClientService.app/Contents/MacOS/ADPClientService).
  • Destroy or rename that binary.
  • Quit Fusion 360.
  • Kill the ADPClientService process.
  • Relaunch Fusion 360.

This will stop Fusion 360 from stealing focus until the next update, during which Fusion 360 will restore ADPClientService. Fusion 360 updates approximately five times per day.