On May 13, 2008, at 12:11 PM, Dennis Munsie wrote:

I have an app right now that I've added a fullscreen mode to.  RIght
now it works for fullscreen when I go to fullscreen on the main
display.  If I attempt to do this on the secondary display, I get a
blank screen.

I think one problem is probably the way I am identifying which screen
to use -- I use [NSWindow screen] to find where my current window is
and use that to capture the screen and place a new fullscreen window
over it.  One potential problem I see is when the window spans across
two displays -- how do I reasonably choose which screen to display it
on?  What screen does [NSWindow screen] return?

So to recap -- this code currently works correctly in the case when
the _mainWindow is on the primary display.  The code does not work
correctly when it is on a secondary display.  And I haven't tested the
case where the code spans displays -- I am assuming that it just flat
out doesn't work :)

here is the code from my enterFullscreen method -- mostly pulled from
sample code off developer.apple.com:

-(void)enterFullscreen
{
        NSScreen *windowScreen = [_mainWindow screen];
        NSDictionary *screenInfo = [windowScreen deviceDescription];
        NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
        
        // capture the screen
CGDirectDisplayID displayID = (CGDirectDisplayID)[screenID longValue];
        CGDisplayErr err = CGDisplayCapture(displayID);
        if(err == CGDisplayNoErr) {
                if(!_fullscreenWindow) {
           // Create the full-screen window.
           NSRect winRect = [windowScreen frame];
           _fullscreenWindow = [[NSWindow alloc]
initWithContentRect:winRect styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered defer:NO screen:windowScreen];
                        
           // Establish the window attributes.
           [_fullscreenWindow setReleasedWhenClosed:NO];
[_fullscreenWindow setDisplaysWhenScreenProfileChanges:YES];
           [_fullscreenWindow setDelegate:self];                        
       }

                // move our view over to the fullscreen window
                [_mainWindow setContentView:nil];
                [_fullscreenWindow setContentView:_mainView];
                [_mainWindow setNeedsDisplay:YES];
                
       // The window has to be above the level of the shield window.
       int32_t     shieldLevel = CGShieldingWindowLevel();
       [_fullscreenWindow setLevel:shieldLevel];
                
       // Show the window.
       [_fullscreenWindow makeKeyAndOrderFront:self];
                
                _fullscreenFlag = YES;
        }
}


Ack. Do not expect to use AppKit with a captured display. I really wish all those archived code examples out there would just vanish; just leads to more folks doing this.

Anyhow, if you really must capture the display using the CG APIs, please note that there's different mechanisms for getting data onto the screen. Search cocoa-dev and quartz-dev for the details on why you cannot use AppKit with captured displays.

If you must use AppKit, you can always use a call to SetSystemUIMode (to hide menu bar and dock). Then, enumerate all screens and put up "blanking" windows on each one. Then, put up your "content" window over a particular blanking one. See the child window APIs for how you can ensure that the content window is never brought forward over the blanking one.

This latter approach is what I've done for the past few years and has worked great.

___________________________________________________________
Ricky A. Sharp         mailto:[EMAIL PROTECTED]
Instant Interactive(tm)   http://www.instantinteractive.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to