Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSPanel in "Non-Activating"-Mode does not always show correct cursors

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.

like image 385
jimmyorpheus Avatar asked Aug 08 '13 17:08

jimmyorpheus


1 Answers

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.

like image 144
Wil Shipley Avatar answered Oct 22 '22 19:10

Wil Shipley