diff options
Diffstat (limited to 'src/nsterm.m')
-rw-r--r-- | src/nsterm.m | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/nsterm.m b/src/nsterm.m index b8dd8bc8ad2..0e8fc56fdd9 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -6963,7 +6963,8 @@ if (cols > 0 && rows > 0) { /* When making the frame visible for the first time or if there is just one screen, we want to constrain. Other times not. */ - NSUInteger nr_screens = [[NSScreen screens] count]; + NSArray *screens = [NSScreen screens]; + NSUInteger nr_screens = [screens count], nr_eff_screens = 0, i; struct frame *f = ((EmacsView *)[self delegate])->emacsframe; NSTRACE (constrainFrameRect); NSTRACE_RECT ("input", frameRect); @@ -6971,6 +6972,31 @@ if (cols > 0 && rows > 0) if (ns_menu_bar_should_be_hidden ()) return frameRect; + if (nr_screens == 1) + return [super constrainFrameRect:frameRect toScreen:screen]; + +#ifdef NS_IMPL_COCOA +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 + // If separate spaces is on, it is like each screen is independent. There is + // no spanning of frames across screens. + if ([NSScreen screensHaveSeparateSpaces]) + return [super constrainFrameRect:frameRect toScreen:screen]; +#endif +#endif + + for (i = 0; i < nr_screens; ++i) + { + NSScreen *s = [screens objectAtIndex: i]; + NSRect scrrect = [s frame]; + NSRect intersect = NSIntersectionRect (frameRect, scrrect); + + if (intersect.size.width > 0 || intersect.size.height > 0) + ++nr_eff_screens; + } + + if (nr_eff_screens == 1) + return [super constrainFrameRect:frameRect toScreen:screen]; + /* The default implementation does two things 1) ensure that the top of the rectangle is below the menu bar (or below the top of the screen) and 2) resizes windows larger than the screen. As we |