]> git.eshelyaron.com Git - emacs.git/commitdiff
fix popup menu selection return (menu.c); add use of popup_activated under NS (nsmenu...
authorAdrian Robert <Adrian.B.Robert@gmail.com>
Mon, 4 Aug 2008 16:57:44 +0000 (16:57 +0000)
committerAdrian Robert <Adrian.B.Robert@gmail.com>
Mon, 4 Aug 2008 16:57:44 +0000 (16:57 +0000)
src/ChangeLog
src/lisp.h
src/menu.c
src/nsmenu.m
src/s/darwin.h
src/syssignal.h
src/xdisp.c

index b6ef8670e751e02d7cced59b18c30ee2943b6887..f4ad592bb33b1f224d631e4782cadc01797695e2 100644 (file)
@@ -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
 
        * 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  <cyd@stupidchicken.com>
 
index cd9d0f5585aedde8e5fc48aae0f1a757f1a274e7..0e9c8b7c79906c95475784f68daa4a110787280e 100644 (file)
@@ -3332,7 +3332,7 @@ EXFUN (Fmsdos_downcase_filename, 1);
 #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
 
index e3882dbd965aa9de70ba3656a8580f12de46d3dc..13deec59450f64c5223bacd066d8a8c8fe1da718 100644 (file)
@@ -1005,7 +1005,7 @@ find_and_return_menu_selection (FRAME_PTR f, int keymaps, void *client_data)
         {
           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)
                 {
index 822aa94efa9a56915d953c782d9b21e5e7935125..b4e8dbc91431308f107366e916517f1bc6449f71 100644 (file)
@@ -65,6 +65,9 @@ extern Lisp_Object Voverriding_local_map, Voverriding_local_map_menu_flag,
 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 @@ free_frame_menubar (struct frame *f)
 }
 
 
+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 @@ name_is_separator (name)
   return [NSString stringWithFormat: @"%c", tpos[2]];
 }
 
+
 - (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr
 {
   NSMenuItem *item;
@@ -1117,10 +1128,13 @@ ns_popup_menu (Lisp_Object position, Lisp_Object menu)
   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 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header)
   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 @@ for instance using the window manager, then this produces a quit and
   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 @@ syms_of_nsmenu ()
   defsubr (&Sx_popup_menu);
   defsubr (&Sx_popup_dialog);
   defsubr (&Sns_reset_menu);
+  defsubr (&Smenu_or_popup_active_p);
   staticpro (&menu_items);
   menu_items = Qnil;
 
index e71eb15ff03e223552006f2c0c05efcb145045d2..4dcf8bb5fdd3d0e0c533f49756763c5ab379b645 100644 (file)
@@ -134,7 +134,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #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
index 21df63959f50c2403778079b2f43bb0d6d9b9206..56988be6b7853d780cb8f813418bed662c58c232 100644 (file)
@@ -19,7 +19,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 extern void init_signals P_ ((void));
 
-#if defined (HAVE_GTK_AND_PTHREAD)
+#if defined (HAVE_GTK_AND_PTHREAD) || defined (HAVE_NS)
 #include <pthread.h>
 /* If defined, asynchronous signals delivered to a non-main thread are
    forwarded to the main thread.  */
index 431541c608d0a8af1b636ce5cb2d6d4c97af3677..bc6545b5fd857e7965ae95e1cb78f91d3d52e0a3 100644 (file)
@@ -11349,7 +11349,7 @@ redisplay_internal (preserve_echo_area)
        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 @@ note_mouse_highlight (f, x, y)
   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