macOS 26: Menu bar icon not showing for Python app running PySide6

Since macOS 26, including the latest 26.1, the menu bar icon does not show up for our app called Plover which is built with PySide6 (based on Qt 6) and runs via a relocatable python that is packaged into the app. The code is open source and can be found on GitHub. The latest release, including the notarized DMG, can be found here.

When running the .app via the command below, the menu bar icon does show up but the process that is running is python3.13 and not Plover:

/Applications/Plover.app/Contents/MacOS/Plover -l debug

When running the app by just clicking on the application icon, the process is Plover but the menu bar icon is not showing - also not in the settings (Menu Bar > Allow in the Menu Bar). Before macOS 26, the menu bar icon was always shown.

Some pointers to potentially relevant parts of our code:

This problem might be related to this thread, including the discussion around Qt not calling NSApplicationMain.

What I'm trying to figure out is whether this is a problem with macOS 26, Qt 6, PySide6, or our code.

Any pointers are highly appreciated!

Answered by DTS Engineer in 865756022
You'd need to be logged in into GitHub to see the download button.

Ah, OK. I do have a GitHub account but I don’t habitually leave myself signed in for… well… reasons.

I downloaded this build and installed it in a VM, just like a normal user would. Actually, I did that twice, once on a 15.7.1 VM and again on a 26.1 VM. AFAICT that’s reproducing the problem, in that:

  • On 15.7.1, I see your status menu item.
  • On 26.1, I don’t.

I poked around and was a little surprised to see just a single process in play here. I guess I misread your earlier description of the issue, in that I assumed that your main app spawned some sort of child process which ran the status item. However, AFAICT there’s just a single process running your main app. Is that right?

If so, that limits the scope of the weirdness. Clearly macOS 26 supports apps showing status items. That works for the vast majority of such apps. So, something about your specific app is triggering the issue.

I see two potential factors here:

  • The exec done by your plover_launcher.c trampoline.
  • All the third-party tooling that’s running within your process (Python itself, PySide6, Qt, and so on).

I think it’d be a good idea to split these apart, and I have suggestion for how to do that:

  1. Use Xcode to create a small AppKit-based test project that displays a status menu item using the AppKit API.
  2. Once you get that working, tweak the process so that the app’s main executable is a trampoline, based on plover_launcher.c, which execs the real main executable.

The result of this test will be useful because:

  • If it reproduces the problem then it rules out all the third-party tooling you’re using. This issue is solely triggered by your exec trampoline. You can then file a bug based on that.
  • OTOH, if this test app works then you’ve ruled out the trampoline as a potential cause, and so you have to look at your third-party tooling. In that case, filing a bug with Apple is less likely to get traction. OTOH, you have the advantage that the remaining code is mostly under your control, and so you can tweak the code in order to run more experiments.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

When privacy-related stuff fails mysteriously, the first thing I do is check that the main executable of the app is a Mach-O. Using a script as your main executable is a common source of weird TCC problems.

I did that with your app and I passed the test:

% file Plover.app/Contents/MacOS/Plover 
Plover.app/Contents/MacOS/Plover: Mach-O universal binary …

But then I decided to double check that your bundle references its main executable correctly:

% plutil -p Plover.app/Contents/Info.plist
{
  …
  "CFBundleExecutable" => "MacOS/Plover"
  …
}

Well, that’s not good. CFBundleExecutable is meant to be sure the executable name, not a path.

Please fix that, retest, and reply back here if you continue to have problems.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Thank you so much Quinn for looking into this!

I now changed the CFBundleExecutable to just Plover. The resulting DMG file can be downloaded from the Artifacts section here if you have a GitHub account.

Sadly, the behavior didn't change and the menu bar icon is still missing.

Sadly, the behavior didn't change

Bummer. But it’s a good fix nevertheless.

I was hoping to download your updated disk image so I see this in action. But the page you referenced doesn’t have a download link. I can copy the SHA-256 of the disk image, I just can’t download it. Do you need to do something at your end to enable the download?

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Thank you Quinn! You'd need to be logged in into GitHub to see the download button. I sent you the DMG via email in case you don't have a GitHub account.

You'd need to be logged in into GitHub to see the download button.

Ah, OK. I do have a GitHub account but I don’t habitually leave myself signed in for… well… reasons.

I downloaded this build and installed it in a VM, just like a normal user would. Actually, I did that twice, once on a 15.7.1 VM and again on a 26.1 VM. AFAICT that’s reproducing the problem, in that:

  • On 15.7.1, I see your status menu item.
  • On 26.1, I don’t.

I poked around and was a little surprised to see just a single process in play here. I guess I misread your earlier description of the issue, in that I assumed that your main app spawned some sort of child process which ran the status item. However, AFAICT there’s just a single process running your main app. Is that right?

If so, that limits the scope of the weirdness. Clearly macOS 26 supports apps showing status items. That works for the vast majority of such apps. So, something about your specific app is triggering the issue.

I see two potential factors here:

  • The exec done by your plover_launcher.c trampoline.
  • All the third-party tooling that’s running within your process (Python itself, PySide6, Qt, and so on).

I think it’d be a good idea to split these apart, and I have suggestion for how to do that:

  1. Use Xcode to create a small AppKit-based test project that displays a status menu item using the AppKit API.
  2. Once you get that working, tweak the process so that the app’s main executable is a trampoline, based on plover_launcher.c, which execs the real main executable.

The result of this test will be useful because:

  • If it reproduces the problem then it rules out all the third-party tooling you’re using. This issue is solely triggered by your exec trampoline. You can then file a bug based on that.
  • OTOH, if this test app works then you’ve ruled out the trampoline as a potential cause, and so you have to look at your third-party tooling. In that case, filing a bug with Apple is less likely to get traction. OTOH, you have the advantage that the remaining code is mostly under your control, and so you can tweak the code in order to run more experiments.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

That was fantastic advice, thank you so much Quinn!

I was able to create a minimal test project that reproduces the issue.

You were right, the trampoline C file is the problem.

And regarding your question: yes, it's only a single process that is launched by this trampoline C file.

I opened a corresponding bug ticket: FB21015611

I opened a corresponding bug ticket: FB21015611

Thanks.

On the one hand, that’s kinda annoying, because there’s probably nothing you can do about it. OTOH, at least you can stop chasing your tail.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

macOS 26: Menu bar icon not showing for Python app running PySide6
 
 
Q