]> git.eshelyaron.com Git - emacs.git/commitdiff
(frame_vector): New static variable.
authorRichard M. Stallman <rms@gnu.org>
Fri, 7 Apr 1995 03:39:07 +0000 (03:39 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 7 Apr 1995 03:39:07 +0000 (03:39 +0000)
(syms_of_xmenu): staticpro it.
(frame_vector_add_frame): New function.
(set_frame_menubar): Use frame_vector; use index as the widget id.
(free_frame_menubar): Likewise.  Remove the frame from frame_vector.
(menubar_selection_callback): Use frame_vector to turn id into frame.

src/xmenu.c

index 02b66b1b85b559e2c2fc99e4dbd3a601534342f1..f6e593044cef855974393821a30d685b6d74b72e 100644 (file)
@@ -151,6 +151,47 @@ static int menu_items_submenu_depth;
    Xt on behalf of one of the widget sets.  */
 static int popup_activated_flag;
 
+/* This holds a Lisp vector
+   which contains frames that have menu bars.
+   Each frame that has a menu bar is found at some index in this vector
+   and the menu bar widget refers to the frame through that index.  */
+static Lisp_Object frame_vector;
+\f
+/* Return the index of FRAME in frame_vector.
+   If FRAME isn't in frame_vector yet, put it in,
+   lengthening the vector if necessary.  */
+
+static int
+frame_vector_add_frame (f)
+     FRAME_PTR *f;
+{
+  int length = XVECTOR (frame_vector)->size;
+  int i, empty = -1;
+  Lisp_Object new, frame;
+
+  XSETFRAME (frame, f);
+
+  for (i = 0; i < length; i++)
+    {
+      if (EQ (frame, XVECTOR (frame_vector)->contents[i]))
+       return i;
+      if (NILP (XVECTOR (frame_vector)->contents[i]))
+       empty = i;
+    }
+
+  if (empty >= 0)
+    {
+      XVECTOR (frame_vector)->contents[empty] = frame;
+      return empty;
+    }
+
+  new = Fmake_vector (make_number (length * 2), Qnil);
+  bcopy (XVECTOR (frame_vector)->contents,
+        XVECTOR (new)->contents, sizeof (Lisp_Object) * length);
+  
+  XVECTOR (frame_vector)->contents[length] = frame;
+  return length;
+}
 \f
 /* Initialize the menu_items structure if we haven't already done so.
    Also mark it as currently empty.  */
@@ -1060,7 +1101,7 @@ menubar_selection_callback (widget, id, client_data)
      XtPointer client_data;
 {
   Lisp_Object prefix;
-  FRAME_PTR f = (FRAME_PTR) id;
+  FRAME_PTR f = XFRAME (XVECTOR (frame_vector)->contents[id]);
   Lisp_Object vector;
   Lisp_Object *subprefix_stack;
   int submenu_depth = 0;
@@ -1378,10 +1419,12 @@ set_frame_menubar (f, first_time)
      int first_time;
 {
   Widget menubar_widget = f->display.x->menubar_widget;
-  int id = (int) f;
-  Lisp_Object tail, items;
+  Lisp_Object tail, items, frame;
   widget_value *wv, *first_wv, *prev_wv = 0;
   int i;
+  int id;
+
+  id = frame_vector_add_frame (f);
 
   BLOCK_INPUT;
 
@@ -1493,12 +1536,13 @@ free_frame_menubar (f)
   int id;
 
   menubar_widget = f->display.x->menubar_widget;
-  id = (int) f;
   
   if (menubar_widget)
     {
+      id = frame_vector_add_frame (f);
       BLOCK_INPUT;
       lw_destroy_all_widgets (id);
+      XVECTOR (frame_vector)->contents[id] = Qnil;
       UNBLOCK_INPUT;
     }
 }
@@ -2352,6 +2396,9 @@ syms_of_xmenu ()
   widget_id_tick = (1<<16);    
 #endif
 
+  staticpro (&frame_vector);
+  frame_vector = Fmake_vector (make_number (10), Qnil);
+
   defsubr (&Sx_popup_menu);
   defsubr (&Sx_popup_dialog);
 }