Cocoa Application with Menubar but no Dock Icon / switch menu - objective-c

This is yet one more of those "how to switch from running with a dock icon to running without one" questions with a twist.. I don't want the dock icon but I do want a menu bar when the application is at the front. Is that possible?
Running an application with LSUIElement set to 1 in the plist will launch the application without a dock icon, not showing up in the command-tab switch list and without a menu.
You can switch from that mode to the "normal" mode with all three switched on via SetSystemModeUI from 10.2 onwards and via NSApplication setApplicationActivationPolicy since 10.6, but crucially there is no way back to the previous mode (go figure).
So one way around this would be to launch with LSUIElement = 1 and then activate the menu bar when the application gets the focus and deactivate it on the application losing the focus.. alas I can't find a way of doing that.
Can anybody help?
Best regards,
Frank

I too was looking for a solution, but it turned out to be quite simple:
In the project file Info.plist need to add the key
"Application is agent (UIElement)" = YES

Unfortunately, this is not possible. You can only transform the process type in one direction (from a background app to a foreground app) and not the other way.

Related

Menubar App: Desktop Switch Bug

I have build a cocoa mac application which is a menubar app. When you click it, it opens a NSWindow.
The problem:
1. When I open the menubar app on Desktop1.
2. Then go to Desktop2 and open the app by clicking the menubar icon, the app opens, but the desktop moves back to Desktop1 !
It's a rather tricky thing.
I appreciate your help !
Thanks
Try setting your window collection behavior to NSWindowCollectionBehaviorCanJoinAllSpaces so that, well, it isn't restrained to a single desktop.
[newWindow setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
NSWindowCollectionBehaviorMoveToActiveSpace should also work, but is a little more finicky.

Graphics error with NSStatusItem

My application uses NSStatusItem to be visible to the user.
So I set 'Application is agent (UIElement)' to YES, which basically hides the menu bar of the application, and hides the icon from the dock.
Now, I didn't delete the menu bar, so I can still react to shortcuts like cmd+W to close the preference window, or cmd+q to quit the application. The problem is, that anytime I use such a command, the menubar get's messed up.
I've noticed that other Apps which run in the background, like Growl 2, have the same issue.
I have no idea how to fix this.
Hopefully someone of you can help me
I'm running Mountain Lion.
thanks!
HINT
It probably has something to do with the 10.8 SKD. I have never noticed this issue before in any application.
How about move the whole Window menu to be Application menu submenu and then hide it?
You will still receive shortcuts and the highlited menu will be the application menu that is by anyway there (i suppose so, how else you will open preferences window? also shortcut?).

Use LSUIElement (aka no Dock icon) but retain the "File, Edit, View" menubar?

I want my app to have:
Menubar extra icon (by the clock)
App Menubar ("File, Edit, View, Etc")
I do not want my app to have:
Dock Icon
Is this possible? I am deploying for 10.6 and 10.7 via the Mac App Store if that matters.
Setting LSUIElement in the info.plist file removes the dock icon, but it also removes the menubar.
NSApplication's setActivationPolicy might be what you are after.
[NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
Please note the discussion:
Currently, NSApplicationActivationPolicyNone and
NSApplicationActivationPolicyAccessory may be changed to
NSApplicationActivationPolicyRegular, but other modifications are not
supported.Needs links to running application
As per NSApplicationActivationPolicyAccessory's documentation you may need to programmatically ensure that the menu bar appears.
You could create two "separate" applications. One that has a dock icon and menu items,the other one has just the icon by the clock.
When you click on the icon by the clock it launches the dock application. When you close the dock application the 'background' application stays running.
If that model will work for you then that's the way to go. But I would weigh that effort against what File-Edit-View will do for you.

menubar app behavior vs full screen app spaces (mac os 10.7/lion)

When you have an app in fullscreen mode (in a fullscreen space) the menubar is hidden unless you "nudge" the top of the screen. However if you hit the spotlight hotkey the menubar politely shifts down into the screen with the spotlight search bar. Excellent.
I am migrating a statusbar/faceless application that I wish to have emulate this spotlight's menubar handling. Under snow leopard the app responds to a system hotkey by displaying a menu (it has a NSStatusBar item and I call popUpStatusItemMenu). Under Lion when the app is in fullscreen mode/space however, the menubar remains hidden for the fullscreen app (note however that the hot key IS bringing up the statusbar item and using the keyboard I can activate individual actions on the menu -- I just can't see the menu pop up).
To reiterate - anyone know how spotlight (under lion) displays the menubar in response to a hotkey? Or should I be asking when a better way to handle my UI would be under Lion?
thanks,
I feel reasonably certain that Spotlight is using private interfaces to change the presentation mode of the login session. You can change the presentation mode for an application using -[NSApplication setPresentationOptions:] (or the deprecated-but-still-available Carbon equivalent SetSystemUIMode()), but these explicitly only propagate to the login session from the “frontmost faceful application”.
I suggest filing a suggestion for an API to request that certain UI elements (menu bar, dock) are shown if they’re currently in autohide mode from the background.

Custom behavior when clicking application icon in the Mac OS X dock

I am trying to modify the default behavior when clicking the icon of a running application in the dock. By default it brings the main window of the application to the foreground.
I would like to perform a custom operation when the icon is clicked.
Any idea to achieve this?
Implement applicationShouldHandleReopen:hasVisibleWindows: in the app delegate; see the explanation there.