Re: Fullscreen on secondary displays
Re: Fullscreen on secondary displays
- Subject: Re: Fullscreen on secondary displays
- From: Ricky Sharp <email@hidden>
- Date: Tue, 13 May 2008 15:23:12 -0500
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@hidden
Instant Interactive(tm) http://www.instantinteractive.com
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden