diff options
Diffstat (limited to 'src/nsmenu.m')
-rw-r--r-- | src/nsmenu.m | 89 |
1 files changed, 66 insertions, 23 deletions
diff --git a/src/nsmenu.m b/src/nsmenu.m index 24aa5a0ac11..bb0dd2634d8 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -73,7 +73,7 @@ free_frame_menubar (struct frame *f) id menu = [NSApp mainMenu]; for (int i = [menu numberOfItems] - 1 ; i >= 0; i--) { - NSMenuItem *item = [menu itemAtIndex:i]; + NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i]; NSString *title = [item title]; if ([ns_app_name isEqualToString:title]) @@ -358,8 +358,12 @@ ns_update_menubar (struct frame *f, bool deep_p) if (i < [menu numberOfItems]) { NSString *titleStr = [NSString stringWithUTF8String: wv->name]; - NSMenuItem *item = [menu itemAtIndex:i]; - submenu = (EmacsMenu*)[item submenu]; + NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i]; + submenu = (EmacsMenu *)[item submenu]; + +#ifdef NS_IMPL_GNUSTEP + [submenu close]; +#endif [item setTitle:titleStr]; [submenu setTitle:titleStr]; @@ -368,8 +372,10 @@ ns_update_menubar (struct frame *f, bool deep_p) else submenu = [menu addSubmenuWithTitle: wv->name]; +#ifdef NS_IMPL_COCOA if ([[submenu title] isEqualToString:@"Help"]) [NSApp setHelpMenu:submenu]; +#endif if (deep_p) [submenu fillWithWidgetValue: wv->contents]; @@ -380,6 +386,12 @@ ns_update_menubar (struct frame *f, bool deep_p) while (i < [menu numberOfItems]) { /* Remove any extra items. */ +#ifdef NS_IMPL_GNUSTEP + NSMenuItem *item = (NSMenuItem *)[menu itemAtIndex:i]; + EmacsMenu *submenu = (EmacsMenu *)[item submenu]; + [submenu close]; +#endif + [menu removeItemAtIndex:i]; } @@ -472,7 +484,7 @@ set_frame_menubar (struct frame *f, bool deep_p) if (menu_separator_name_p (wv->name)) { - item = [NSMenuItem separatorItem]; + item = (NSMenuItem *)[NSMenuItem separatorItem]; } else { @@ -534,7 +546,7 @@ set_frame_menubar (struct frame *f, bool deep_p) needsUpdate = YES; } - +#ifdef NS_IMPL_COCOA typedef struct { const char *from, *to; } subst_t; @@ -591,17 +603,18 @@ prettify_key (const char *key) xfree (buf); return SSDATA (result); } +#endif /* NS_IMPL_COCOA */ - (void)fillWithWidgetValue: (void *)wvptr { widget_value *first_wv = (widget_value *)wvptr; - NSFont *menuFont = [NSFont menuFontOfSize:0]; NSDictionary *attributes = nil; #ifdef NS_IMPL_COCOA /* Cocoa doesn't allow multi-key sequences in its menu display, so work around it by using tabs to split the title into two columns. */ + NSFont *menuFont = [NSFont menuFontOfSize:0]; NSDictionary *font_attribs = @{NSFontAttributeName: menuFont}; CGFloat maxNameWidth = 0; CGFloat maxKeyWidth = 0; @@ -672,9 +685,9 @@ prettify_key (const char *key) - (EmacsMenu *)addSubmenuWithTitle: (const char *)title { NSString *titleStr = [NSString stringWithUTF8String: title]; - NSMenuItem *item = [self addItemWithTitle: titleStr - action: (SEL)nil /*@selector (menuDown:) */ - keyEquivalent: @""]; + NSMenuItem *item = (NSMenuItem *)[self addItemWithTitle: titleStr + action: (SEL)nil + keyEquivalent: @""]; EmacsMenu *submenu = [[EmacsMenu alloc] initWithTitle: titleStr]; [self setSubmenu: submenu forItem: item]; [submenu release]; @@ -711,6 +724,44 @@ prettify_key (const char *key) : Qnil; } +#ifdef NS_IMPL_GNUSTEP +- (void) close +{ + /* Close all the submenus. This has the unfortunate side-effect of + breaking tear-off menus, however if we don't do this then we get + a crash when the menus are removed during updates. */ + for (int i = 0 ; i < [self numberOfItems] ; i++) + { + NSMenuItem *item = [self itemAtIndex:i]; + if ([item hasSubmenu]) + [(EmacsMenu *)[item submenu] close]; + } + + [super close]; +} + +/* GNUstep seems to have a number of required methods in + NSMenuDelegate that are optional in Cocoa. */ + +- (void) menuWillOpen:(NSMenu *)menu +{ +} + +- (void) menuDidClose:(NSMenu *)menu +{ +} + +- (NSRect)confinementRectForMenu:(NSMenu *)menu + onScreen:(NSScreen *)screen +{ + return NSZeroRect; +} + +- (void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item +{ +} +#endif + @end /* EmacsMenu */ @@ -940,12 +991,11 @@ free_frame_tool_bar (struct frame *f) NSTRACE ("free_frame_tool_bar"); block_input (); - view->wait_for_tool_bar = NO; /* Note: This triggers an animation, which calls windowDidResize repeatedly. */ f->output_data.ns->in_animation = 1; - [[view toolbar] setVisible: NO]; + [[[view window] toolbar] setVisible: NO]; f->output_data.ns->in_animation = 0; unblock_input (); @@ -958,12 +1008,12 @@ update_frame_tool_bar (struct frame *f) -------------------------------------------------------------------------- */ { int i, k = 0; - EmacsView *view = FRAME_NS_VIEW (f); - EmacsToolbar *toolbar = [view toolbar]; + NSWindow *window = [FRAME_NS_VIEW (f) window]; + EmacsToolbar *toolbar = (EmacsToolbar *)[window toolbar]; NSTRACE ("update_frame_tool_bar"); - if (view == nil || toolbar == nil) return; + if (window == nil || toolbar == nil) return; block_input (); #ifdef NS_IMPL_COCOA @@ -1039,10 +1089,10 @@ update_frame_tool_bar (struct frame *f) #undef TOOLPROP } - if (![toolbar isVisible]) + if ([toolbar isVisible] != FRAME_EXTERNAL_TOOL_BAR (f)) { f->output_data.ns->in_animation = 1; - [toolbar setVisible: YES]; + [toolbar setVisible: FRAME_EXTERNAL_TOOL_BAR (f)]; f->output_data.ns->in_animation = 0; } @@ -1069,13 +1119,6 @@ update_frame_tool_bar (struct frame *f) [newDict release]; } #endif - - if (view->wait_for_tool_bar && FRAME_TOOLBAR_HEIGHT (f) > 0) - { - view->wait_for_tool_bar = NO; - [view setNeedsDisplay: YES]; - } - unblock_input (); } |