# HG changeset patch # User Adrian Robert # Date 1217869064 0 # Node ID 248808aeee3ee405599e8acc2d5ca75c650d12d9 # Parent 80acedef7417f3c6c81b1419e75884cdf9e60f5f fix popup menu selection return (menu.c); add use of popup_activated under NS (nsmenu.m, xdisp.c); improve comments (lisp.h, s/darwin.h); use FORWARD_SIGNAL_TO_MAIN_THREAD (syssignal.h) diff -r 80acedef7417 -r 248808aeee3e src/ChangeLog --- a/src/ChangeLog Mon Aug 04 14:39:27 2008 +0000 +++ b/src/ChangeLog Mon Aug 04 16:57:44 2008 +0000 @@ -4,6 +4,18 @@ * keyboard.h: Comment an #endif. + * lisp.h (have_menus_p): Adjust comment. + + * menu.c (find_and_return_menu_selection): Fix comparison with + client_data. + + * nsmenu.m (popup_activated_flag): New variable. + (popup_activated): New function. + (menu-or-popup-active-p): New exported lisp definition. + (ns_popup_menu): Set popup_activated_flag. Call discard_menu_items() + when popup done. + (ns_popup_dialog): Set popup_activated_flag. + * nsterm.m (EmacsView -converstationIdentifier): Use NSInteger version for GNUstep (handled by conditional typedef in nsterm.m). (ns_get_color): Remove special-casing for "darkblue", "dark blue" (now @@ -13,11 +25,17 @@ * sysselect.h: Conditionalize init_process undef on DARWIN_OS. + * syssignal.h (FORWARD_SIGNAL_TO_MAIN_THREAD): Do it also under NS. + + * xdisp.c (redisplay_internal, note_mouse_highlight): Under NS, + shortcircuit if popup_activated like GTK and X toolkit. + * m/inter386.h: Change DARWIN to DARWIN_OS. * s/darwin.h: Add #define DARWIN_OS. Get rid of C_SWITCH_SYSTEM def. Change LIBS_MACGUI to LIBS_NSGUI. Move temacs-conditionalized defs - closer to C_SWITCH_SYSTEM_TEMACS so usage is understood. + closer to C_SWITCH_SYSTEM_TEMACS so usage is understood. Expand + comment on NO_SOCK_SIGIO. 2008-08-03 Chong Yidong diff -r 80acedef7417 -r 248808aeee3e src/lisp.h --- a/src/lisp.h Mon Aug 04 14:39:27 2008 +0000 +++ b/src/lisp.h Mon Aug 04 16:57:44 2008 +0000 @@ -3332,7 +3332,7 @@ #endif #ifdef HAVE_MENUS -/* Defined in (x|w32)fns.c... */ +/* Defined in (x|w32)fns.c, nsfns.m... */ extern int have_menus_p P_ ((void)); #endif diff -r 80acedef7417 -r 248808aeee3e src/menu.c --- a/src/menu.c Mon Aug 04 14:39:27 2008 +0000 +++ b/src/menu.c Mon Aug 04 16:57:44 2008 +0000 @@ -1005,7 +1005,7 @@ { entry = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_VALUE]; - if ((int) (EMACS_INT)client_data == i) + if ((int) (EMACS_INT)client_data == &XVECTOR (menu_items)->contents[i]/*i*/) { if (keymaps != 0) { diff -r 80acedef7417 -r 248808aeee3e src/nsmenu.m --- a/src/nsmenu.m Mon Aug 04 14:39:27 2008 +0000 +++ b/src/nsmenu.m Mon Aug 04 16:57:44 2008 +0000 @@ -65,6 +65,9 @@ extern long context_menu_value; EmacsMenu *mainMenu, *svcsMenu; +/* Nonzero means a menu is currently active. */ +static int popup_activated_flag; + /* NOTE: toolbar implementation is at end, following complete menu implementation. */ @@ -94,6 +97,13 @@ } +int +popup_activated () +{ + return popup_activated_flag; +} + + /* -------------------------------------------------------------------------- Update menubar. Three cases: 1) deep_p = 0, submenu = nil: Fresh switch onto a frame -- either set up @@ -592,6 +602,7 @@ return [NSString stringWithFormat: @"%c", tpos[2]]; } + - (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr { NSMenuItem *item; @@ -1117,10 +1128,13 @@ free_menubar_widget_value_tree (first_wv); unbind_to (specpdl_count2, Qnil); + popup_activated_flag = 1; tem = [pmenu runMenuAt: p forFrame: f keymaps: keymaps]; + popup_activated_flag = 0; [[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow]; UNBLOCK_INPUT; + discard_menu_items (); unbind_to (specpdl_count, Qnil); UNGCPRO; @@ -1511,8 +1525,9 @@ p.y = (int)f->top_pos + (FRAME_LINE_HEIGHT (f) * f->text_lines)/2; dialog = [[EmacsDialogPanel alloc] initFromContents: contents isQuestion: isQ]; - + popup_activated_flag = 1; tem = [dialog runDialogAt: p]; + popup_activated_flag = 0; [dialog close]; @@ -1934,6 +1949,12 @@ 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. */) + () +{ + return popup_activated () ? Qt : Qnil; +} /* ========================================================================== @@ -1947,6 +1968,7 @@ defsubr (&Sx_popup_menu); defsubr (&Sx_popup_dialog); defsubr (&Sns_reset_menu); + defsubr (&Smenu_or_popup_active_p); staticpro (&menu_items); menu_items = Qnil; diff -r 80acedef7417 -r 248808aeee3e src/s/darwin.h --- a/src/s/darwin.h Mon Aug 04 14:39:27 2008 +0000 +++ b/src/s/darwin.h Mon Aug 04 16:57:44 2008 +0000 @@ -134,7 +134,10 @@ #define HAVE_SOCKETS /* This seems to help in Ctrl-G detection under Cocoa, however at the cost - of some quirks that may or may not bother a given user. */ + of some quirks that may or may not bother a given user. + It was earlier commented that "In Carbon, asynchronous I/O (using SIGIO) + can't be used for window events because they don't come from sockets, + even though it works fine on tty's. Uncertain about situation in Cocoa. */ #ifdef COCOA_EXPERIMENTAL_CTRL_G #define NO_SOCK_SIGIO #endif diff -r 80acedef7417 -r 248808aeee3e src/syssignal.h --- a/src/syssignal.h Mon Aug 04 14:39:27 2008 +0000 +++ b/src/syssignal.h Mon Aug 04 16:57:44 2008 +0000 @@ -19,7 +19,7 @@ extern void init_signals P_ ((void)); -#if defined (HAVE_GTK_AND_PTHREAD) +#if defined (HAVE_GTK_AND_PTHREAD) || defined (HAVE_NS) #include /* If defined, asynchronous signals delivered to a non-main thread are forwarded to the main thread. */ diff -r 80acedef7417 -r 248808aeee3e src/xdisp.c --- a/src/xdisp.c Mon Aug 04 14:39:27 2008 +0000 +++ b/src/xdisp.c Mon Aug 04 16:57:44 2008 +0000 @@ -11349,7 +11349,7 @@ return; } -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) +#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) if (popup_activated ()) return; #endif @@ -23521,7 +23521,7 @@ struct buffer *b; /* When a menu is active, don't highlight because this looks odd. */ -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) +#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) if (popup_activated ()) return; #endif