From b3f71fdeb101945ce6d971016278e1d8248035c1 Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Fri, 11 Jan 2013 06:21:06 -0600 Subject: [PATCH] winemac: Implement the Mac "Window" menu. --- dlls/winemac.drv/cocoa_app.m | 11 +++++++++++ dlls/winemac.drv/cocoa_window.m | 26 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index 28d2ad2ad9e..d869a0538e8 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -51,7 +51,18 @@ - (void) transformProcessToForeground [item setSubmenu:submenu]; [mainMenu addItem:item]; + submenu = [[[NSMenu alloc] initWithTitle:@"Window"] autorelease]; + [submenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""]; + [submenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; + [submenu addItem:[NSMenuItem separatorItem]]; + [submenu addItemWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""]; + item = [[[NSMenuItem alloc] init] autorelease]; + [item setTitle:@"Window"]; + [item setSubmenu:submenu]; + [mainMenu addItem:item]; + [self setMainMenu:mainMenu]; + [self setWindowsMenu:submenu]; } } diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 9d359ffa5d4..49dd31bd840 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -172,9 +172,17 @@ - (void) setMacDrvState:(const struct macdrv_window_state*)state else behavior |= NSWindowCollectionBehaviorManaged; if (state->excluded_by_cycle) + { behavior |= NSWindowCollectionBehaviorIgnoresCycle; + if ([self isVisible]) + [NSApp removeWindowsItem:self]; + } else + { behavior |= NSWindowCollectionBehaviorParticipatesInCycle; + if ([self isVisible]) + [NSApp addWindowsItem:self title:[self title] filename:NO]; + } [self setCollectionBehavior:behavior]; } @@ -196,6 +204,9 @@ - (BOOL) orderBelow:(WineWindow*)prev orAbove:(WineWindow*)next [latentParentWindow addChildWindow:self ordered:NSWindowAbove]; self.latentParentWindow = nil; } + + if (![self isExcludedFromWindowsMenu]) + [NSApp addWindowsItem:self title:[self title] filename:NO]; } return on_screen; @@ -206,6 +217,7 @@ - (void) doOrderOut self.latentParentWindow = [self parentWindow]; [latentParentWindow removeChildWindow:self]; [self orderOut:nil]; + [NSApp removeWindowsItem:self]; } - (BOOL) setFrameIfOnScreen:(NSRect)contentRect @@ -277,6 +289,18 @@ - (BOOL) canBecomeMainWindow return [self canBecomeKeyWindow]; } + - (BOOL) isExcludedFromWindowsMenu + { + return !([self collectionBehavior] & NSWindowCollectionBehaviorParticipatesInCycle); + } + + - (BOOL) validateMenuItem:(NSMenuItem *)menuItem + { + if ([menuItem action] == @selector(makeKeyAndOrderFront:)) + return [self isKeyWindow] || (!self.disabled && !self.noActivate); + return [super validateMenuItem:menuItem]; + } + /* * ---------- NSWindowDelegate methods ---------- @@ -372,6 +396,8 @@ void macdrv_set_cocoa_window_title(macdrv_window w, const unsigned short* title, titleString = @""; OnMainThreadAsync(^{ [window setTitle:titleString]; + if ([window isVisible] && ![window isExcludedFromWindowsMenu]) + [NSApp changeWindowsItem:window title:titleString filename:NO]; }); [pool release];