3

I have an application where a borderless window is shown and hidden, using orderOut and orderFront. When it is visible, I want the it to become the key window when the mouse moves over it. So far I've done this:

  • In awakeFromNib I have set its first responder to itself.
  • In the window's constructor I set accepts mouse events to YES.
  • In the mouseMoved method, I use makeKeyAndOrderToFront.

My problem is, that this only works the first time I move the mouse over the window. After that, it doesn't receive any mouseOver events. I've tried checking the firstResponder but as far as I can tell it never changes from the window.

Any ideas what I can do to get this working?

DanieL
  • 31
  • 2

2 Answers2

4

You need to add a tracking area if you want to receive mouseMoved events (I assume that's what you mean as Cocoa has no such thing as a mouseOver event).

I wrote a little app called Shroud which does something similar — it hides a borderless window which covers the menu bar when you move the mouse over it. The code is simple enough it might be useful as an example.

Nicholas Riley
  • 43,532
  • 6
  • 101
  • 124
3

Here's an example written with the help of @NicholasRiley's answer:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self.view frame] options:NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveAlways owner:self userInfo:nil];
[self.view addTrackingArea:area];

-(void)mouseEntered:(NSEvent *)theEvent {
    NSLog(@"mouseEntered");
}

-(void)mouseExited:(NSEvent *)theEvent {
    NSLog(@"mouseExited");
}
Community
  • 1
  • 1
Daniel Storm
  • 18,301
  • 9
  • 84
  • 152