Contents in release-21-2 at 1999-06-30-19.
[chise/xemacs-chise.git.1] / src / gui-x.c
index f176a57..e35e65e 100644 (file)
@@ -35,11 +35,10 @@ Boston, MA 02111-1307, USA.  */
 #include "device.h"
 #include "frame.h"
 #include "gui.h"
+#include "redisplay.h"
 #include "opaque.h"
 
-#ifdef HAVE_POPUPS
 Lisp_Object Qmenu_no_selection_hook;
-#endif
 
 /* we need a unique id for each popup menu, dialog box, and scrollbar */
 static unsigned int lwlib_id_tick;
@@ -59,8 +58,6 @@ xmalloc_widget_value (void)
 }
 
 \f
-#ifdef HAVE_POPUPS
-
 struct mark_widget_value_closure
 {
   void (*markobj) (Lisp_Object);
@@ -259,7 +256,10 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
       arg = Qmenu_no_selection_hook;
     }
   else
-    get_gui_callback (data, &fn, &arg);
+    {
+      MARK_SUBWINDOWS_CHANGED;
+      get_gui_callback (data, &fn, &arg);
+    }
 
   /* This is the timestamp used for asserting focus so we need to get an
      up-to-date value event if no events has been dispatched to emacs
@@ -315,139 +315,44 @@ menu_separator_style (CONST char *s)
   return NULL;
 }
 
-/* set menu accelerator key to first underlined character in menu name */
-
-Lisp_Object
-menu_name_to_accelerator (char *name)
-{
-  while (*name) {
-    if (*name=='%') {
-      ++name;
-      if (!(*name))
-       return Qnil;
-      if (*name=='_' && *(name+1))
-       {
-         int accelerator = (int) (unsigned char) (*(name+1));
-         return make_char (tolower (accelerator));
-       }
-    }
-    ++name;
-  }
-  return Qnil;
-}
 
 /* This does the dirty work.  gc_currently_forbidden is 1 when this is called.
  */
-
 int
-button_item_to_widget_value (Lisp_Object desc, widget_value *wv,
+button_item_to_widget_value (Lisp_Object gui_item, widget_value *wv,
                             int allow_text_field_p, int no_keys_p)
 {
   /* !!#### This function has not been Mule-ized */
   /* This function cannot GC because gc_currently_forbidden is set when
      it's called */
-  Lisp_Object name       = Qnil;
-  Lisp_Object callback   = Qnil;
-  Lisp_Object suffix     = Qnil;
-  Lisp_Object active_p   = Qt;
-  Lisp_Object include_p  = Qt;
-  Lisp_Object selected_p = Qnil;
-  Lisp_Object keys       = Qnil;
-  Lisp_Object style      = Qnil;
-  Lisp_Object config_tag = Qnil;
-  Lisp_Object accel = Qnil;
-  int length = XVECTOR_LENGTH (desc);
-  Lisp_Object *contents = XVECTOR_DATA (desc);
-  int plist_p;
-  int selected_spec = 0, included_spec = 0;
-
-  if (length < 2)
-    signal_simple_error ("Button descriptors must be at least 2 long", desc);
-
-  /* length 2:         [ "name" callback ]
-     length 3:         [ "name" callback active-p ]
-     length 4:         [ "name" callback active-p suffix ]
-                  or   [ "name" callback keyword  value  ]
-     length 5+:                [ "name" callback [ keyword value ]+ ]
-   */
-  plist_p = (length >= 5 || (length > 2 && KEYWORDP (contents [2])));
-
-  if (!plist_p && length > 2)
-    /* the old way */
-    {
-      name = contents [0];
-      callback = contents [1];
-      active_p = contents [2];
-      if (length == 4)
-       suffix = contents [3];
-    }
-  else
-    {
-      /* the new way */
-      int i;
-      if (length & 1)
-       signal_simple_error (
-               "Button descriptor has an odd number of keywords and values",
-                            desc);
-
-      name = contents [0];
-      callback = contents [1];
-      for (i = 2; i < length;)
-       {
-         Lisp_Object key = contents [i++];
-         Lisp_Object val = contents [i++];
-         if (!KEYWORDP (key))
-           signal_simple_error_2 ("Not a keyword", key, desc);
-
-         if      (EQ (key, Q_active))   active_p   = val;
-         else if (EQ (key, Q_suffix))   suffix     = val;
-         else if (EQ (key, Q_keys))     keys       = val;
-         else if (EQ (key, Q_style))    style      = val;
-         else if (EQ (key, Q_selected)) selected_p = val, selected_spec = 1;
-         else if (EQ (key, Q_included)) include_p  = val, included_spec = 1;
-         else if (EQ (key, Q_config))   config_tag = val;
-         else if (EQ (key, Q_accelerator))
-           {
-             if ( SYMBOLP (val)
-                  || CHARP (val))
-               accel = val;
-             else
-               signal_simple_error ("Bad keyboard accelerator", val);
-           }
-         else if (EQ (key, Q_filter))
-           signal_simple_error(":filter keyword not permitted on leaf nodes", desc);
-         else
-           signal_simple_error_2 ("Unknown menu item keyword", key, desc);
-       }
-    }
+  struct Lisp_Gui_Item* pgui = XGUI_ITEM (gui_item);
+
+  if (!NILP (pgui->filter))
+    signal_simple_error(":filter keyword not permitted on leaf nodes", gui_item);
 
 #ifdef HAVE_MENUBARS
-  if ((!NILP (config_tag) && NILP (Fmemq (config_tag, Vmenubar_configuration)))
-      || (included_spec && NILP (Feval (include_p))))
+  if (!gui_item_included_p (gui_item, Vmenubar_configuration))
     {
       /* the include specification says to ignore this item. */
       return 0;
     }
 #endif /* HAVE_MENUBARS */
 
-  CHECK_STRING (name);
-  wv->name = (char *) XSTRING_DATA (name);
-
-  if (NILP (accel))
-    accel = menu_name_to_accelerator (wv->name);
-  wv->accel = LISP_TO_VOID (accel);
+  CHECK_STRING (pgui->name);
+  wv->name = (char *) XSTRING_DATA (pgui->name);
+  wv->accel = LISP_TO_VOID (gui_item_accelerator (gui_item));
 
-  if (!NILP (suffix))
+  if (!NILP (pgui->suffix))
     {
       CONST char *const_bogosity;
       Lisp_Object suffix2;
 
       /* Shortcut to avoid evaluating suffix each time */
-      if (STRINGP (suffix))
-       suffix2 = suffix;
+      if (STRINGP (pgui->suffix))
+       suffix2 = pgui->suffix;
       else
        {
-         suffix2 = Feval (suffix);
+         suffix2 = Feval (pgui->suffix);
          CHECK_STRING (suffix2);
        }
 
@@ -456,10 +361,11 @@ button_item_to_widget_value (Lisp_Object desc, widget_value *wv,
       wv->value = xstrdup (wv->value);
     }
 
-  wv_set_evalable_slot (wv->enabled, active_p);
-  wv_set_evalable_slot (wv->selected, selected_p);
+  wv_set_evalable_slot (wv->enabled, pgui->active);
+  wv_set_evalable_slot (wv->selected, pgui->selected);
 
-  wv->call_data = LISP_TO_VOID (callback);
+  if (!NILP (pgui->callback))
+    wv->call_data = LISP_TO_VOID (pgui->callback);
 
   if (no_keys_p
 #ifdef HAVE_MENUBARS
@@ -467,28 +373,28 @@ button_item_to_widget_value (Lisp_Object desc, widget_value *wv,
 #endif
       )
     wv->key = 0;
-  else if (!NILP (keys))       /* Use this string to generate key bindings */
+  else if (!NILP (pgui->keys)) /* Use this string to generate key bindings */
     {
-      CHECK_STRING (keys);
-      keys = Fsubstitute_command_keys (keys);
-      if (XSTRING_LENGTH (keys) > 0)
-       wv->key = xstrdup ((char *) XSTRING_DATA (keys));
+      CHECK_STRING (pgui->keys);
+      pgui->keys = Fsubstitute_command_keys (pgui->keys);
+      if (XSTRING_LENGTH (pgui->keys) > 0)
+       wv->key = xstrdup ((char *) XSTRING_DATA (pgui->keys));
       else
        wv->key = 0;
     }
-  else if (SYMBOLP (callback)) /* Show the binding of this command. */
+  else if (SYMBOLP (pgui->callback))   /* Show the binding of this command. */
     {
       char buf [1024];
       /* #### Warning, dependency here on current_buffer and point */
-      where_is_to_char (callback, buf);
+      where_is_to_char (pgui->callback, buf);
       if (buf [0])
        wv->key = xstrdup (buf);
       else
        wv->key = 0;
     }
 
-  CHECK_SYMBOL (style);
-  if (NILP (style))
+  CHECK_SYMBOL (pgui->style);
+  if (NILP (pgui->style))
     {
       /* If the callback is nil, treat this item like unselectable text.
         This way, dashes will show up as a separator. */
@@ -515,13 +421,13 @@ button_item_to_widget_value (Lisp_Object desc, widget_value *wv,
            wv->type = BUTTON_TYPE;
        }
     }
-  else if (EQ (style, Qbutton))
+  else if (EQ (pgui->style, Qbutton))
     wv->type = BUTTON_TYPE;
-  else if (EQ (style, Qtoggle))
+  else if (EQ (pgui->style, Qtoggle))
     wv->type = TOGGLE_TYPE;
-  else if (EQ (style, Qradio))
+  else if (EQ (pgui->style, Qradio))
     wv->type = RADIO_TYPE;
-  else if (EQ (style, Qtext))
+  else if (EQ (pgui->style, Qtext))
     {
       wv->type = TEXT_TYPE;
 #if 0
@@ -530,19 +436,18 @@ button_item_to_widget_value (Lisp_Object desc, widget_value *wv,
 #endif
     }
   else
-    signal_simple_error_2 ("Unknown style", style, desc);
+    signal_simple_error_2 ("Unknown style", pgui->style, gui_item);
 
   if (!allow_text_field_p && (wv->type == TEXT_TYPE))
-    signal_simple_error ("Text field not allowed in this context", desc);
+    signal_simple_error ("Text field not allowed in this context", gui_item);
 
-  if (selected_spec && EQ (style, Qtext))
+  if (!NILP (pgui->selected) && EQ (pgui->style, Qtext))
     signal_simple_error (
-         ":selected only makes sense with :style toggle, radio or button",
-                        desc);
+                        ":selected only makes sense with :style toggle, radio or button",
+                        gui_item);
   return 1;
 }
 
-#endif /* HAVE_POPUPS */
 
 /* This is a kludge to make sure emacs can only link against a version of
    lwlib that was compiled in the right way.  Emacs references symbols which
@@ -600,9 +505,7 @@ sanity_check_lwlib (void)
 void
 syms_of_gui_x (void)
 {
-#ifdef HAVE_POPUPS
   defsymbol (&Qmenu_no_selection_hook, "menu-no-selection-hook");
-#endif
 }
 
 void
@@ -610,7 +513,6 @@ vars_of_gui_x (void)
 {
   lwlib_id_tick = (1<<16);     /* start big, to not conflict with Energize */
 
-#ifdef HAVE_POPUPS
   popup_up_p = 0;
 
   Vpopup_callbacks = Qnil;
@@ -625,7 +527,6 @@ without a selection having been made.
 */ );
 #endif
   Fset (Qmenu_no_selection_hook, Qnil);
-#endif /* HAVE_POPUPS */
 
   /* this makes only safe calls as in emacs.c */
   sanity_check_lwlib ();