XEmacs 21.2.32 "Kastor & Polydeukes".
[chise/xemacs-chise.git.1] / src / gui-x.c
index 7cb4f92..2099351 100644 (file)
@@ -213,6 +213,7 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
   Lisp_Object fn, arg;
   Lisp_Object data;
   Lisp_Object frame;
+  int update_subwindows_p = 0;
   struct device *d = get_device_from_display (XtDisplay (widget));
   struct frame *f = x_any_widget_or_parent_to_frame (d, widget);
 
@@ -245,7 +246,7 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
     }
   else
     {
-      MARK_SUBWINDOWS_STATE_CHANGED;
+      update_subwindows_p = 1;
       get_gui_callback (data, &fn, &arg);
     }
 
@@ -258,6 +259,11 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
   DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d);
 #endif
   signal_special_Xt_user_event (frame, fn, arg);
+  /* The result of this evaluation could cause other instances to change so 
+     enqueue an update callback to check this. */
+  if (update_subwindows_p)
+    signal_special_Xt_user_event (frame, Qeval,
+                                 list2 (Qupdate_widget_instances, frame));
 }
 
 #if 1
@@ -275,9 +281,9 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
 #endif
 
 char *
-menu_separator_style (CONST char *s)
+menu_separator_style (const char *s)
 {
-  CONST char *p;
+  const char *p;
   char first;
 
   if (!s || s[0] == '\0')
@@ -303,6 +309,30 @@ menu_separator_style (CONST char *s)
   return NULL;
 }
 
+char *
+strdup_and_add_accel (char *name)
+{
+  int i;
+  int found_accel = 0;
+
+  for (i=0; name[i]; ++i)
+    if (name[i] == '%' && name[i+1] == '_')
+      {
+       found_accel = 1;
+       break;
+      }
+
+  if (found_accel)
+    return xstrdup (name);
+  else
+    {
+      char *chars = (char *) alloca (strlen (name) + 3);
+      chars[0] = '%';
+      chars[1] = '_';
+      memcpy (chars+2, name, strlen (name) + 1);
+      return xstrdup (chars);
+    }
+}
 
 /* This does the dirty work.  gc_currently_forbidden is 1 when this is called.
  */
@@ -313,14 +343,14 @@ button_item_to_widget_value (Lisp_Object gui_item, widget_value *wv,
   /* !!#### This function has not been Mule-ized */
   /* This function cannot GC because gc_currently_forbidden is set when
      it's called */
-  struct Lisp_Gui_Item* pgui = 0;
+  Lisp_Gui_Item* pgui = 0;
 
   /* degenerate case */
   if (STRINGP (gui_item))
     {
       wv->type = TEXT_TYPE;
       wv->name = (char *) XSTRING_DATA (gui_item);
-      wv->name = xstrdup (wv->name);
+      wv->name = strdup_and_add_accel (wv->name);
       return 1;
     }
   else if (!GUI_ITEMP (gui_item))
@@ -339,6 +369,9 @@ button_item_to_widget_value (Lisp_Object gui_item, widget_value *wv,
     }
 #endif /* HAVE_MENUBARS */
 
+  if (!STRINGP (pgui->name))
+    pgui->name = Feval (pgui->name);
+
   CHECK_STRING (pgui->name);
   wv->name = (char *) XSTRING_DATA (pgui->name);
   wv->name = xstrdup (wv->name);
@@ -346,7 +379,7 @@ button_item_to_widget_value (Lisp_Object gui_item, widget_value *wv,
 
   if (!NILP (pgui->suffix))
     {
-      CONST char *const_bogosity;
+      const char *const_bogosity;
       Lisp_Object suffix2;
 
       /* Shortcut to avoid evaluating suffix each time */
@@ -358,7 +391,9 @@ button_item_to_widget_value (Lisp_Object gui_item, widget_value *wv,
          CHECK_STRING (suffix2);
        }
 
-      GET_C_STRING_FILENAME_DATA_ALLOCA (suffix2, const_bogosity);
+      TO_EXTERNAL_FORMAT (LISP_STRING, suffix2,
+                         C_STRING_ALLOCA, const_bogosity,
+                         Qfile_name);
       wv->value = (char *) const_bogosity;
       wv->value = xstrdup (wv->value);
     }
@@ -386,7 +421,7 @@ button_item_to_widget_value (Lisp_Object gui_item, widget_value *wv,
     }
   else if (SYMBOLP (pgui->callback))   /* Show the binding of this command. */
     {
-      char buf [1024];
+      char buf[1024]; /* #### */
       /* #### Warning, dependency here on current_buffer and point */
       where_is_to_char (pgui->callback, buf);
       if (buf [0])
@@ -466,17 +501,17 @@ gui_items_to_widget_values_1 (Lisp_Object items, widget_value* parent,
       wv = xmalloc_widget_value();
       if (parent)
        parent->contents = wv;
-      else 
+      else
        prev->next = wv;
       if (!button_item_to_widget_value (items, wv, 0, 1))
        {
          free_widget_value_tree (wv);
          if (parent)
            parent->contents = 0;
-         else 
+         else
            prev->next = 0;
        }
-      else 
+      else
        {
          wv->value = xstrdup (wv->name);       /* what a mess... */
        }
@@ -617,6 +652,8 @@ sanity_check_lwlib (void)
 void
 syms_of_gui_x (void)
 {
+  INIT_LRECORD_IMPLEMENTATION (popup_data);
+
   defsymbol (&Qmenu_no_selection_hook, "menu-no-selection-hook");
 }