CGDisplayRegisterReconfigurationCallback not called when view in fullscreen

  • Anyone familiar with CGDisplayRegisterReconfigurationCallback callback and fullscreen when connecting and disconnecting an external monitor?
    I have written an application that places a custom NSView into fullscreen (using enterfullscreenmode with options) on an external monitor while the main window remains on the main (built-in screen).  The view enters and exits as expected but I was trying to cover all my bases and have the fullscreen exit gracefully if the external monitor is unplugged while my application is running.  In my research I came across CGDisplayRegisterReconfigurationCallback.  I implemented the callback as follows

    void TheDisplayReconfigurationCallBack ( CGDirectDisplayID display,
        CGDisplayChangeSummaryFlags flags,
        void *userInfo)
    {
        if (flags & kCGDisplayAddFlag) {
            NSLog (@"Display Added");
        }
        else if (kCGDisplayRemoveFlag) {
            NSLog (@"Display Removed");
      [[NSNotificationCenter defaultCenter] postNotificationName:@"ScreenDisconnected" object:nil];

    }
    }

    and called:

    CGDisplayRegisterReconfigurationCallback(TheDisplayReconfigurationCallBack, NULL);

    in a method in my implementation.

    When the application is not in fullscreen my application receives and the callback function works as expected.  However, when the view is in fullscreen the callback function is not called when the monitor is unplugged.  In fact the OS does not update the screen configuration until I exit fullscreen (through a test button I implemented on the main window).

    Any help would be appreciated I think I have exhausted all my google answers for CGDisplayRegisterReconfigurationCallback.

    Thanks
    Tom

    The applications runs on both 10.6 and 10.7.
  • On Jul 24, 2012, at 7:47 PM, Tom Hohensee wrote:

    > Anyone familiar with CGDisplayRegisterReconfigurationCallback callback and fullscreen when connecting and disconnecting an external monitor?
    > I have written an application that places a custom NSView into fullscreen (using enterfullscreenmode with options) on an external monitor while the main window remains on the main (built-in screen).  The view enters and exits as expected but I was trying to cover all my bases and have the fullscreen exit gracefully if the external monitor is unplugged while my application is running.  In my research I came across CGDisplayRegisterReconfigurationCallback.

    > When the application is not in fullscreen my application receives and the callback function works as expected.  However, when the view is in fullscreen the callback function is not called when the monitor is unplugged.  In fact the OS does not update the screen configuration until I exit fullscreen (through a test button I implemented on the main window).

    I suspect you're not receiving the callback because the display is captured.  The docs for -[NSView enterFullScreenMode:withOptions:] explain how to avoid capturing the display.

    Capturing the display means that you're taking over sole responsibility and access to it.  It also means that other apps won't be notified when that display's configuration is changed.  (For example, the Finder won't rearrange your desktop icons if the display is set to a low-resolution mode.)  It's not obvious to me that that would include preventing your own app from being informed when the display is disconnected, but apparently it does.

    You might file a bug with Apple.  Also, you might ask on the quartz-dev list.

    Regards,
    Ken
  • Ken
    You are right. I was capturing the screen.  Setting the presentation options in the options dictionary for enterFullScreenMode with options: did the trick.  However, with the presentation options set, I am only getting one view to show the other is blacked out (ie the view on the external monitor is shown but the main screen on the built-in display is black).  I have tried various presentation options but results are similar.

    Thanks
    Tom

    On Jul 24, 2012, at 8:09 PM, Ken Thomases wrote:

    > On Jul 24, 2012, at 7:47 PM, Tom Hohensee wrote:
    >
    >> Anyone familiar with CGDisplayRegisterReconfigurationCallback callback and fullscreen when connecting and disconnecting an external monitor?
    >> I have written an application that places a custom NSView into fullscreen (using enterfullscreenmode with options) on an external monitor while the main window remains on the main (built-in screen).  The view enters and exits as expected but I was trying to cover all my bases and have the fullscreen exit gracefully if the external monitor is unplugged while my application is running.  In my research I came across CGDisplayRegisterReconfigurationCallback.
    >
    >> When the application is not in fullscreen my application receives and the callback function works as expected.  However, when the view is in fullscreen the callback function is not called when the monitor is unplugged.  In fact the OS does not update the screen configuration until I exit fullscreen (through a test button I implemented on the main window).
    >
    > I suspect you're not receiving the callback because the display is captured.  The docs for -[NSView enterFullScreenMode:withOptions:] explain how to avoid capturing the display.
    >
    > Capturing the display means that you're taking over sole responsibility and access to it.  It also means that other apps won't be notified when that display's configuration is changed.  (For example, the Finder won't rearrange your desktop icons if the display is set to a low-resolution mode.)  It's not obvious to me that that would include preventing your own app from being informed when the display is disconnected, but apparently it does.
    >
    > You might file a bug with Apple.  Also, you might ask on the quartz-dev list.
    >
    > Regards,
    > Ken
    >
previous month july 2012 next month
MTWTFSS
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
Go to today