changeset 97267:248808aeee3e

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)
author Adrian Robert <Adrian.B.Robert@gmail.com>
date Mon, 04 Aug 2008 16:57:44 +0000
parents 80acedef7417
children 43c0581b11aa
files src/ChangeLog src/lisp.h src/menu.c src/nsmenu.m src/s/darwin.h src/syssignal.h src/xdisp.c
diffstat 7 files changed, 51 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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  <cyd@stupidchicken.com>
 
--- 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
 
--- 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)
                 {
--- 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;
 
--- 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
--- 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 <pthread.h>
 /* If defined, asynchronous signals delivered to a non-main thread are
    forwarded to the main thread.  */
--- 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