I've created a simple Cocoa-Application in XCode 4.6 with an NSPanel
instead of the default NSWindow
. When I enable the Non-Activating
option and start the application everything works fine:
The panel is displayed in front of everything else and when the mouse cursor hovers over the panel's edges it changes from a normal arrow-cursor to the appropriate resize-cursor, so the user knows that he can resize the panel.
This works fine as longs as I don't click on any other application as for example Safari or Finder.
From the moment I once give focus to another application, I can click on and hover over my panel as much as I want, the cursor style will not change anymore - it always stays an arrow and it's not possible to return to the normal behavior.
The panel stays selectable and in the front, you still can move and resize it,
but the mouse cursor stays an arrow all the time. You then cannot even change it
manually using something like: [[NSCursor crosshairCursor] set]
.
So I need to find a way to create a NSPanel
that keeps the normal
automatic-change-cursorstyle-when-hovering-over-panel-edges-behaviour
even when you give focus to another application.
I have already tried to use an customized NSPanel
-class,
where I have overwritten the canBecomeKeyWindow
and
canBecomeMainWindow
methods, so that they return YES
but even when I make my Panel KeyWindow
and MainWindow
...
[myPanel makeKeyAndOrderFront:self];
[myPanel makeMainWindow];
...it doesn't solve the cursor issue.
Would be great if someone could help me here :)
PS.: the Base SDK and the Deployment Target are set to 10.8 in my project
So I found out that the described issue has nothing to to with the panel's window-state. It really doesn't matter if it is set to key or to main, instead the cursor-problem (stays arrow all the time)is related to the application's activation state.
Everything works fine as long as the application that owns the panel is active but if you click on another application my application is deactivated and does not get activated again - even if you click on the panel - because the "non-activating
"-option is enabled.
The problem is that i need the "non activating
"-option because I am creating a status-bar-screen-capturing app that should be displayed and operate in front of everything else but without deactivating any running application. I could solve the cursor problem by
[NSApp activateIgnoringOtherApps];
but then taking a screenshot of a fullscreen video running in Safari would deactivate Safari and minimize the video, which I don't want.
I don’t think it’s possible through normal APIs to change the cursor when your app isn’t active. I’m pretty sure the window system doesn’t allow it: it’d be a violation of the boundaries between apps—if you try to set a cursor from the background, and the foreground app also tries to set a cursor, who would win?
Of course the system can do it (like when you take a screenshot with ⌘⇧4), because that’s in the window system itself.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With