changeset 58214:aaad85fd645c

* xfns.c (Fx_file_dialog): Call x_menu_in_use and x_menu_set_in_use. Record unwind with clean_up_file_dialog.
author Jan Djärv <jan.h.d@swipnet.se>
date Sun, 14 Nov 2004 09:59:02 +0000
parents 5201ea9b1985
children 8f529503ae83
files src/xfns.c
diffstat 1 files changed, 40 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfns.c	Sun Nov 14 06:31:12 2004 +0000
+++ b/src/xfns.c	Sun Nov 14 09:59:02 2004 +0000
@@ -5105,6 +5105,23 @@
   *result = XmCR_CANCEL;
 }
 
+static Lisp_Object
+clean_up_file_dialog (arg)
+     Lisp_Object arg;
+{
+  struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
+  Widget dialog = (Widget) p->pointer;
+
+  /* Clean up.  */
+  BLOCK_INPUT;
+  XtUnmanageChild (dialog);
+  XtDestroyWidget (dialog);
+  x_menu_set_in_use (0);
+  UNBLOCK_INPUT;
+
+  return Qnil;
+}
+
 
 DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 2, 5, 0,
        doc: /* Read file name, prompting with PROMPT in directory DIR.
@@ -5126,6 +5143,10 @@
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
 
   GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file);
+
+  if (x_menu_in_use ())
+    error ("Trying to use a menu from within a menu-entry");
+
   CHECK_STRING (prompt);
   CHECK_STRING (dir);
 
@@ -5208,13 +5229,16 @@
       XmStringFree (default_xmstring);
     }
 
+  record_unwind_protect (clean_up_file_dialog, make_save_value (dialog, 0));
+
   /* Process events until the user presses Cancel or OK.  */
   result = 0;
   while (result == 0)
     {
       XEvent event;
+      x_menu_wait_for_event (0);
       XtAppNextEvent (Xt_app_con, &event);
-      (void) x_dispatch_event (&event, FRAME_X_DISPLAY (f) );
+      (void) x_dispatch_event (&event, FRAME_X_DISPLAY (f));
     }
 
   /* Get the result.  */
@@ -5232,9 +5256,6 @@
   else
     file = Qnil;
 
-  /* Clean up.  */
-  XtUnmanageChild (dialog);
-  XtDestroyWidget (dialog);
   UNBLOCK_INPUT;
   UNGCPRO;
 
@@ -5249,6 +5270,15 @@
 
 #ifdef USE_GTK
 
+static Lisp_Object
+clean_up_dialog (arg)
+     Lisp_Object arg;
+{
+  x_menu_set_in_use (0);
+
+  return Qnil;
+}
+
 DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 2, 5, 0,
        doc: /* Read file name, prompting with PROMPT in directory DIR.
 Use a file selection dialog.  Select DEFAULT-FILENAME in the dialog's file
@@ -5261,16 +5291,21 @@
   FRAME_PTR f = SELECTED_FRAME ();
   char *fn;
   Lisp_Object file = Qnil;
-  int count = specpdl_ptr - specpdl;
+  int count = SPECPDL_INDEX ();
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
   char *cdef_file;
 
   GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file);
+
+  if (x_menu_in_use ())
+    error ("Trying to use a menu from within a menu-entry");
+
   CHECK_STRING (prompt);
   CHECK_STRING (dir);
 
   /* Prevent redisplay.  */
   specbind (Qinhibit_redisplay, Qt);
+  record_unwind_protect (clean_up_dialog, Qnil);
 
   BLOCK_INPUT;