X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/d2d699ac519599385b2865627db065c0fbfd38f3..e147461d406b00eb9b0281d35cf512e7a69f6601:/src/nsmenu.m diff --git a/src/nsmenu.m b/src/nsmenu.m index 1ae2a34ab9..24842241f3 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -1,5 +1,5 @@ /* NeXT/Open/GNUstep and MacOSX Cocoa menu and toolbar module. - Copyright (C) 2007-2013 Free Software Foundation, Inc. + Copyright (C) 2007-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -366,7 +366,7 @@ ns_update_menubar (struct frame *f, bool deep_p, EmacsMenu *submenu) } else { - [menu fillWithWidgetValue: first_wv->contents setDelegate:YES]; + [menu fillWithWidgetValue: first_wv->contents frame: f]; } } @@ -504,9 +504,11 @@ void x_activate_menubar (struct frame *f) { #ifdef NS_IMPL_COCOA +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ns_update_menubar (f, true, nil); ns_check_pending_open_menu (); #endif +#endif } @@ -527,6 +529,7 @@ x_activate_menubar (struct frame *f) /* override designated initializer */ - initWithTitle: (NSString *)title { + frame = 0; if ((self = [super initWithTitle: title])) [self setAutoenablesItems: NO]; return self; @@ -562,7 +565,9 @@ extern NSString *NSMenuDidBeginTrackingNotification; /* Update menu in menuNeedsUpdate only while tracking menus. */ trackingMenu = ([notification name] == NSMenuDidBeginTrackingNotification ? 1 : 0); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 if (! trackingMenu) ns_check_menu_open (nil); +#endif } #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 @@ -570,7 +575,7 @@ extern NSString *NSMenuDidBeginTrackingNotification; { ++trackingMenu; -#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_6 +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 // On 10.6 we get repeated calls, only the one for NSSystemDefined is "real". if ([[NSApp currentEvent] type] != NSSystemDefined) return; #endif @@ -725,10 +730,10 @@ extern NSString *NSMenuDidBeginTrackingNotification; - (void)fillWithWidgetValue: (void *)wvptr { - [self fillWithWidgetValue: wvptr setDelegate:NO]; + [self fillWithWidgetValue: wvptr frame: (struct frame *)nil]; } -- (void)fillWithWidgetValue: (void *)wvptr setDelegate: (BOOL)set +- (void)fillWithWidgetValue: (void *)wvptr frame: (struct frame *)f { widget_value *wv = (widget_value *)wvptr; @@ -743,11 +748,13 @@ extern NSString *NSMenuDidBeginTrackingNotification; if (wv->contents) { - EmacsMenu *submenu = [[EmacsMenu alloc] initWithTitle: [item title]]; + EmacsMenu *submenu; + + if (f) + submenu = [[EmacsMenu alloc] initWithTitle: [item title] frame:f]; + else + submenu = [[EmacsMenu alloc] initWithTitle: [item title]]; -#ifdef NS_IMPL_COCOA - if (set) [submenu setDelegate: submenu]; -#endif [self setSubmenu: submenu forItem: item]; [submenu fillWithWidgetValue: wv->contents]; [submenu release]; @@ -826,6 +833,8 @@ ns_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, ptrdiff_t specpdl_count = SPECPDL_INDEX (); widget_value *wv, *first_wv = 0; + block_input (); + p.x = x; p.y = y; /* now parse stage 2 as in ns_update_menubar */ @@ -1028,6 +1037,7 @@ ns_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, popup_activated_flag = 0; [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow]; + unblock_input (); return tem; } @@ -1044,8 +1054,10 @@ free_frame_tool_bar (struct frame *f) Under NS we just hide the toolbar until it might be needed again. -------------------------------------------------------------------------- */ { + EmacsView *view = FRAME_NS_VIEW (f); block_input (); - [[FRAME_NS_VIEW (f) toolbar] setVisible: NO]; + view->wait_for_tool_bar = NO; + [[view toolbar] setVisible: NO]; FRAME_TOOLBAR_HEIGHT (f) = 0; unblock_input (); } @@ -1061,6 +1073,7 @@ update_frame_tool_bar (struct frame *f) NSWindow *window = [view window]; EmacsToolbar *toolbar = [view toolbar]; + if (view == nil || toolbar == nil) return; block_input (); #ifdef NS_IMPL_COCOA @@ -1086,7 +1099,7 @@ update_frame_tool_bar (struct frame *f) /* Check if this is a separator. */ if (EQ (TOOLPROP (TOOL_BAR_ITEM_TYPE), Qt)) { - /* Skip separators. Newer OSX don't show them, and on GNUStep they + /* Skip separators. Newer OSX don't show them, and on GNUstep they are wide as a button, thus overflowing the toolbar most of the time. */ continue; @@ -1166,9 +1179,13 @@ update_frame_tool_bar (struct frame *f) FRAME_TOOLBAR_HEIGHT (f) = NSHeight ([window frameRectForContentRect: NSMakeRect (0, 0, 0, 0)]) - FRAME_NS_TITLEBAR_HEIGHT (f); - if (FRAME_TOOLBAR_HEIGHT (f) < 0) // happens if frame is fullscreen. - FRAME_TOOLBAR_HEIGHT (f) = 0; - unblock_input (); + if (FRAME_TOOLBAR_HEIGHT (f) < 0) // happens if frame is fullscreen. + FRAME_TOOLBAR_HEIGHT (f) = 0; + + if (view->wait_for_tool_bar && FRAME_TOOLBAR_HEIGHT (f) > 0) + [view setNeedsDisplay: YES]; + + unblock_input (); } @@ -1232,7 +1249,7 @@ update_frame_tool_bar (struct frame *f) { /* 1) come up w/identifier */ NSString *identifier - = [NSString stringWithFormat: @"%u", [img hash]]; + = [NSString stringWithFormat: @"%lu", (unsigned long)[img hash]]; [activeIdentifiers addObject: identifier]; /* 2) create / reuse item */ @@ -1442,7 +1459,7 @@ pop_down_menu (void *arg) Lisp_Object -ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header) +ns_popup_dialog (Lisp_Object position, Lisp_Object header, Lisp_Object contents) { id dialog; Lisp_Object window, tem, title; @@ -1860,11 +1877,11 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header) while (popup_activated_flag) { NSTimer *tmo = nil; - EMACS_TIME next_time = timer_check (); + struct timespec next_time = timer_check (); - if (EMACS_TIME_VALID_P (next_time)) + if (timespec_valid_p (next_time)) { - double time = EMACS_TIME_TO_DOUBLE (next_time); + double time = timespectod (next_time); tmo = [NSTimer timerWithTimeInterval: time target: self selector: @selector (timeout_handler:) @@ -1909,34 +1926,6 @@ DEFUN ("ns-reset-menu", Fns_reset_menu, Sns_reset_menu, 0, 0, 0, } -DEFUN ("x-popup-dialog", Fx_popup_dialog, Sx_popup_dialog, 2, 3, 0, - doc: /* Pop up a dialog box and return user's selection. -POSITION specifies which frame to use. -This is normally a mouse button event or a window or frame. -If POSITION is t, it means to use the frame the mouse is on. -The dialog box appears in the middle of the specified frame. - -CONTENTS specifies the alternatives to display in the dialog box. -It is a list of the form (DIALOG ITEM1 ITEM2...). -Each ITEM is a cons cell (STRING . VALUE). -The return value is VALUE from the chosen item. - -An ITEM may also be just a string--that makes a nonselectable item. -An ITEM may also be nil--that means to put all preceding items -on the left of the dialog box and all following items on the right. -\(By default, approximately half appear on each side.) - -If HEADER is non-nil, the frame title for the box is "Information", -otherwise it is "Question". - -If the user gets rid of the dialog box without making a valid choice, -for instance using the window manager, then this produces a quit and -`x-popup-dialog' does not return. */) - (Lisp_Object position, Lisp_Object contents, Lisp_Object header) -{ - return ns_popup_dialog (position, contents, header); -} - DEFUN ("menu-or-popup-active-p", Fmenu_or_popup_active_p, Smenu_or_popup_active_p, 0, 0, 0, doc: /* Return t if a menu or popup dialog is active. */) (void) @@ -1954,11 +1943,10 @@ void syms_of_nsmenu (void) { #ifndef NS_IMPL_COCOA - /* Don't know how to keep track of this in Next/Open/Gnustep. Always + /* Don't know how to keep track of this in Next/Open/GNUstep. Always update menus there. */ trackingMenu = 1; #endif - defsubr (&Sx_popup_dialog); defsubr (&Sns_reset_menu); defsubr (&Smenu_or_popup_active_p);