summaryrefslogtreecommitdiff
path: root/src/nsmenu.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/nsmenu.m')
-rw-r--r--src/nsmenu.m89
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 ();
}