diff src/gui.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 501cfd01ee6d
children e804706bfb8c
line wrap: on
line diff
--- a/src/gui.c	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/gui.c	Mon Aug 13 11:20:41 2007 +0200
@@ -27,16 +27,13 @@
 #include "lisp.h"
 #include "gui.h"
 #include "elhash.h"
-#include "buffer.h"
 #include "bytecode.h"
 
 Lisp_Object Q_active, Q_suffix, Q_keys, Q_style, Q_selected;
 Lisp_Object Q_filter, Q_config, Q_included, Q_key_sequence;
-Lisp_Object Q_accelerator, Q_label, Q_callback, Q_callback_ex, Q_value;
+Lisp_Object Q_accelerator, Q_label, Q_callback;
 Lisp_Object Qtoggle, Qradio;
 
-static Lisp_Object parse_gui_item_tree_list (Lisp_Object list);
-
 #ifdef HAVE_POPUPS
 
 /* count of menus/dboxes currently up */
@@ -53,9 +50,9 @@
 #endif /* HAVE_POPUPS */
 
 int
-separator_string_p (const char *s)
+separator_string_p (CONST char *s)
 {
-  const char *p;
+  CONST char *p;
   char first;
 
   if (!s || s[0] == '\0')
@@ -74,17 +71,11 @@
 void
 get_gui_callback (Lisp_Object data, Lisp_Object *fn, Lisp_Object *arg)
 {
-  if (EQ (data, Qquit))
-    {
-      *fn = Qeval;
-      *arg = list3 (Qsignal, list2 (Qquote, Qquit), Qnil);
-      Vquit_flag = Qt;
-    }
-  else if (SYMBOLP (data)
-	   || (COMPILED_FUNCTIONP (data)
-	       && XCOMPILED_FUNCTION (data)->flags.interactivep)
-	   || (CONSP (data) && (EQ (XCAR (data), Qlambda))
-	       && !NILP (Fassq (Qinteractive, Fcdr (Fcdr (data))))))
+  if (SYMBOLP (data)
+      || (COMPILED_FUNCTIONP (data)
+	  && XCOMPILED_FUNCTION (data)->flags.interactivep)
+      || (EQ (XCAR (data), Qlambda)
+	  && !NILP (Fassq (Qinteractive, Fcdr (Fcdr (data))))))
     {
       *fn = Qcall_interactively;
       *arg = data;
@@ -106,17 +97,35 @@
 }
 
 /*
+ * Initialize the gui_item structure by setting all (GC-protected)
+ * fields to their default values. The defaults are t for :active and
+ * :included values, and nil for others.
+ */
+void
+gui_item_init (struct gui_item *pgui_item)
+{
+  pgui_item->name     = Qnil;
+  pgui_item->callback = Qnil;
+  pgui_item->suffix   = Qnil;
+  pgui_item->active   = Qt;
+  pgui_item->included = Qt;
+  pgui_item->config   = Qnil;
+  pgui_item->filter   = Qnil;
+  pgui_item->style    = Qnil;
+  pgui_item->selected = Qnil;
+  pgui_item->keys     = Qnil;
+}
+
+/*
  * Add a value VAL associated with keyword KEY into PGUI_ITEM
  * structure. If KEY is not a keyword, or is an unknown keyword, then
  * error is signaled.
  */
 void
-gui_item_add_keyval_pair (Lisp_Object gui_item,
-			  Lisp_Object key, Lisp_Object val,
+gui_item_add_keyval_pair (struct gui_item *pgui_item,
+			  Lisp_Object key, Lisp_Object val, 
 			  Error_behavior errb)
 {
-  Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
-
   if (!KEYWORDP (key))
     signal_simple_error_2 ("Non-keyword in gui item", key, pgui_item->name);
 
@@ -128,55 +137,11 @@
   else if (EQ (key, Q_style))	 pgui_item->style    = val;
   else if (EQ (key, Q_selected)) pgui_item->selected = val;
   else if (EQ (key, Q_keys))	 pgui_item->keys     = val;
-  else if (EQ (key, Q_callback)) pgui_item->callback = val;
-  else if (EQ (key, Q_callback_ex)) pgui_item->callback_ex = val;
-  else if (EQ (key, Q_value))	 pgui_item->value     = val;
-  else if (EQ (key, Q_key_sequence)) ;   /* ignored for FSF compatibility */
+  else if (EQ (key, Q_callback))	 pgui_item->callback     = val;
+  else if (EQ (key, Q_key_sequence)) ;   /* ignored for FSF compatability */
   else if (EQ (key, Q_label)) ;   /* ignored for 21.0 implement in 21.2  */
-  else if (EQ (key, Q_accelerator))
-    {
-      if (SYMBOLP (val) || CHARP (val))
-	pgui_item->accelerator = val;
-      else if (ERRB_EQ (errb, ERROR_ME))
-	signal_simple_error ("Bad keyboard accelerator", val);
-    }
   else if (ERRB_EQ (errb, ERROR_ME))
-    signal_simple_error_2 ("Unknown keyword in gui item", key,
-			   pgui_item->name);
-}
-
-void
-gui_item_init (Lisp_Object gui_item)
-{
-  Lisp_Gui_Item *lp = XGUI_ITEM (gui_item);
-
-  lp->name     = Qnil;
-  lp->callback = Qnil;
-  lp->callback_ex = Qnil;
-  lp->suffix   = Qnil;
-  lp->active   = Qt;
-  lp->included = Qt;
-  lp->config   = Qnil;
-  lp->filter   = Qnil;
-  lp->style    = Qnil;
-  lp->selected = Qnil;
-  lp->keys     = Qnil;
-  lp->accelerator     = Qnil;
-  lp->value = Qnil;
-}
-
-Lisp_Object
-allocate_gui_item (void)
-{
-  Lisp_Gui_Item *lp = alloc_lcrecord_type (Lisp_Gui_Item, &lrecord_gui_item);
-  Lisp_Object val;
-
-  zero_lcrecord (lp);
-  XSETGUI_ITEM (val, lp);
-
-  gui_item_init (val);
-
-  return val;
+    signal_simple_error_2 ("Unknown keyword in gui item", key, pgui_item->name);
 }
 
 /*
@@ -184,14 +149,12 @@
  * function extracts the description of the item into the PGUI_ITEM
  * structure.
  */
-static Lisp_Object
-make_gui_item_from_keywords_internal (Lisp_Object item,
-				      Error_behavior errb)
+static void
+gui_parse_item_keywords_internal (Lisp_Object item, struct gui_item *pgui_item,
+				  Error_behavior errb)
 {
   int length, plist_p, start;
   Lisp_Object *contents;
-  Lisp_Object gui_item = allocate_gui_item ();
-  Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
 
   CHECK_VECTOR (item);
   length = XVECTOR_LENGTH (item);
@@ -218,7 +181,7 @@
       pgui_item->callback = contents [1];
       start = 2;
     }
-  else
+  else 
     start =1;
 
   if (!plist_p && length > 2)
@@ -241,54 +204,21 @@
 	{
 	  Lisp_Object key = contents [i++];
 	  Lisp_Object val = contents [i++];
-	  gui_item_add_keyval_pair (gui_item, key, val, errb);
+	  gui_item_add_keyval_pair (pgui_item, key, val, errb);
 	}
     }
-  return gui_item;
-}
-
-Lisp_Object
-gui_parse_item_keywords (Lisp_Object item)
-{
-  return make_gui_item_from_keywords_internal (item, ERROR_ME);
-}
-
-Lisp_Object
-gui_parse_item_keywords_no_errors (Lisp_Object item)
-{
-  return make_gui_item_from_keywords_internal (item, ERROR_ME_NOT);
 }
 
-/* convert a gui item into plist properties */
 void
-gui_add_item_keywords_to_plist (Lisp_Object plist, Lisp_Object gui_item)
+gui_parse_item_keywords (Lisp_Object item, struct gui_item *pgui_item)
 {
-  Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
+  gui_parse_item_keywords_internal (item, pgui_item, ERROR_ME);
+}
 
-  if (!NILP (pgui_item->callback))
-    Fplist_put (plist, Q_callback, pgui_item->callback);
-  if (!NILP (pgui_item->callback_ex))
-    Fplist_put (plist, Q_callback_ex, pgui_item->callback_ex);
-  if (!NILP (pgui_item->suffix))
-    Fplist_put (plist, Q_suffix, pgui_item->suffix);
-  if (!NILP (pgui_item->active))
-    Fplist_put (plist, Q_active, pgui_item->active);
-  if (!NILP (pgui_item->included))
-    Fplist_put (plist, Q_included, pgui_item->included);
-  if (!NILP (pgui_item->config))
-    Fplist_put (plist, Q_config, pgui_item->config);
-  if (!NILP (pgui_item->filter))
-    Fplist_put (plist, Q_filter, pgui_item->filter);
-  if (!NILP (pgui_item->style))
-    Fplist_put (plist, Q_style, pgui_item->style);
-  if (!NILP (pgui_item->selected))
-    Fplist_put (plist, Q_selected, pgui_item->selected);
-  if (!NILP (pgui_item->keys))
-    Fplist_put (plist, Q_keys, pgui_item->keys);
-  if (!NILP (pgui_item->accelerator))
-    Fplist_put (plist, Q_accelerator, pgui_item->accelerator);
-  if (!NILP (pgui_item->value))
-    Fplist_put (plist, Q_value, pgui_item->value);
+void
+gui_parse_item_keywords_no_errors (Lisp_Object item, struct gui_item *pgui_item)
+{
+  gui_parse_item_keywords_internal (item, pgui_item, ERROR_ME_NOT);
 }
 
 /*
@@ -296,51 +226,13 @@
  * if any
  */
 int
-gui_item_active_p (Lisp_Object gui_item)
+gui_item_active_p (CONST struct gui_item *pgui_item)
 {
   /* This function can call lisp */
 
   /* Shortcut to avoid evaluating Qt each time */
-  return (EQ (XGUI_ITEM (gui_item)->active, Qt)
-	  || !NILP (Feval (XGUI_ITEM (gui_item)->active)));
-}
-
-/* set menu accelerator key to first underlined character in menu name */
-Lisp_Object
-gui_item_accelerator (Lisp_Object gui_item)
-{
-  Lisp_Gui_Item *pgui = XGUI_ITEM (gui_item);
-
-  if (!NILP (pgui->accelerator))
-    return pgui->accelerator;
-
-  else
-    return gui_name_accelerator (pgui->name);
-}
-
-Lisp_Object
-gui_name_accelerator (Lisp_Object nm)
-{
-  Bufbyte *name = XSTRING_DATA (nm);
-
-  while (*name)
-    {
-      if (*name == '%')
-	{
-	  ++name;
-	  if (!(*name))
-	    return Qnil;
-	  if (*name == '_' && *(name + 1))
-	    {
-	      Emchar accelerator = charptr_emchar (name + 1);
-	      /* #### bogus current_buffer dependency */
-	      return make_char (DOWNCASE (current_buffer, accelerator));
-	    }
-	}
-	INC_CHARPTR (name);
-    }
-  return make_char (DOWNCASE (current_buffer,
-			      charptr_emchar (XSTRING_DATA (nm))));
+  return (EQ (pgui_item->active, Qt)
+	  || !NILP (Feval (pgui_item->active)));
 }
 
 /*
@@ -348,13 +240,13 @@
  * if any
  */
 int
-gui_item_selected_p (Lisp_Object gui_item)
+gui_item_selected_p (CONST struct gui_item *pgui_item)
 {
   /* This function can call lisp */
 
   /* Shortcut to avoid evaluating Qt each time */
-  return (EQ (XGUI_ITEM (gui_item)->selected, Qt)
-	  || !NILP (Feval (XGUI_ITEM (gui_item)->selected)));
+  return (EQ (pgui_item->selected, Qt)
+	  || !NILP (Feval (pgui_item->selected)));
 }
 
 /*
@@ -363,10 +255,9 @@
  * configuration variable
  */
 int
-gui_item_included_p (Lisp_Object gui_item, Lisp_Object conflist)
+gui_item_included_p (CONST struct gui_item *pgui_item, Lisp_Object conflist)
 {
   /* This function can call lisp */
-  Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
 
   /* Evaluate :included first. Shortcut to avoid evaluating Qt each time */
   if (!EQ (pgui_item->included, Qt)
@@ -398,13 +289,11 @@
  * buffer.
  */
 unsigned int
-gui_item_display_flush_left (Lisp_Object gui_item,
-			     char *buf, Bytecount buf_len)
+gui_item_display_flush_left  (CONST struct gui_item *pgui_item,
+			      char* buf, Bytecount buf_len)
 {
-  /* This function can call lisp */
   char *p = buf;
   Bytecount len;
-  Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
 
   /* Copy item name first */
   CHECK_STRING (pgui_item->name);
@@ -447,33 +336,29 @@
  * buffer.
  */
 unsigned int
-gui_item_display_flush_right (Lisp_Object gui_item,
-			      char *buf, Bytecount buf_len)
+gui_item_display_flush_right (CONST struct gui_item *pgui_item,
+			      char* buf, Bytecount buf_len)
 {
-  Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
   *buf = 0;
 
-#ifdef HAVE_MENUBARS
   /* Have keys? */
   if (!menubar_show_keybindings)
     return 0;
-#endif
 
   /* Try :keys first */
   if (!NILP (pgui_item->keys))
     {
       CHECK_STRING (pgui_item->keys);
-      if (XSTRING_LENGTH (pgui_item->keys) + 1 > buf_len)
+      if (XSTRING_LENGTH (pgui_item->keys) > buf_len)
 	signal_too_long_error (pgui_item->name);
-      memcpy (buf, XSTRING_DATA (pgui_item->keys),
-	      XSTRING_LENGTH (pgui_item->keys) + 1);
+      strcpy (buf, (CONST char *) XSTRING_DATA (pgui_item->keys));
       return XSTRING_LENGTH (pgui_item->keys);
     }
 
   /* See if we can derive keys out of callback symbol */
   if (SYMBOLP (pgui_item->callback))
     {
-      char buf2[1024]; /* #### */
+      char buf2 [1024];
       Bytecount len;
 
       where_is_to_char (pgui_item->callback, buf2);
@@ -489,52 +374,27 @@
 }
 #endif /* HAVE_WINDOW_SYSTEM */
 
-static Lisp_Object
-mark_gui_item (Lisp_Object obj)
+Lisp_Object
+mark_gui_item (struct gui_item* p, void (*markobj) (Lisp_Object))
 {
-  Lisp_Gui_Item *p = XGUI_ITEM (obj);
-
-  mark_object (p->name);
-  mark_object (p->callback);
-  mark_object (p->callback_ex);
-  mark_object (p->config);
-  mark_object (p->suffix);
-  mark_object (p->active);
-  mark_object (p->included);
-  mark_object (p->config);
-  mark_object (p->filter);
-  mark_object (p->style);
-  mark_object (p->selected);
-  mark_object (p->keys);
-  mark_object (p->accelerator);
-  mark_object (p->value);
+  markobj (p->name);
+  markobj (p->callback);
+  markobj (p->suffix);
+  markobj (p->active);
+  markobj (p->included);
+  markobj (p->config);
+  markobj (p->filter);
+  markobj (p->style);
+  markobj (p->selected);
+  markobj (p->keys);
 
   return Qnil;
 }
 
-static unsigned long
-gui_item_hash (Lisp_Object obj, int depth)
+int
+gui_item_hash (Lisp_Object hashtable, struct gui_item* g, int slot)
 {
-  Lisp_Gui_Item *p = XGUI_ITEM (obj);
-
-  return HASH2 (HASH6 (internal_hash (p->name, depth + 1),
-		       internal_hash (p->callback, depth + 1),
-		       internal_hash (p->callback_ex, depth + 1),
-		       internal_hash (p->suffix, depth + 1),
-		       internal_hash (p->active, depth + 1),
-		       internal_hash (p->included, depth + 1)),
-		HASH6 (internal_hash (p->config, depth + 1),
-		       internal_hash (p->filter, depth + 1),
-		       internal_hash (p->style, depth + 1),
-		       internal_hash (p->selected, depth + 1),
-		       internal_hash (p->keys, depth + 1),
-		       internal_hash (p->value, depth + 1)));
-}
-
-int
-gui_item_id_hash (Lisp_Object hashtable, Lisp_Object gitem, int slot)
-{
-  int hashid = gui_item_hash (gitem, 0);
+  int hashid = HASH2 (internal_hash (g->callback, 0), internal_hash (g->name, 0));
   int id = GUI_ITEM_ID_BITS (hashid, slot);
   while (!NILP (Fgethash (make_int (id),
 			  hashtable, Qnil)))
@@ -544,177 +404,9 @@
   return id;
 }
 
-static int
-gui_item_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
-{
-  Lisp_Gui_Item *p1 = XGUI_ITEM (obj1);
-  Lisp_Gui_Item *p2 = XGUI_ITEM (obj2);
-
-  if (!(internal_equal (p1->name, p2->name, depth + 1)
-	&&
-	internal_equal (p1->callback, p2->callback, depth + 1)
-	&&
-	internal_equal (p1->callback_ex, p2->callback_ex, depth + 1)
-	&&
-	EQ (p1->suffix, p2->suffix)
-	&&
-	EQ (p1->active, p2->active)
-	&&
-	EQ (p1->included, p2->included)
-	&&
-	EQ (p1->config, p2->config)
-	&&
-	EQ (p1->filter, p2->filter)
-	&&
-	EQ (p1->style, p2->style)
-	&&
-	EQ (p1->selected, p2->selected)
-	&&
-	EQ (p1->accelerator, p2->accelerator)
-	&&
-	EQ (p1->keys, p2->keys)
-	&&
-	EQ (p1->value, p2->value)))
-    return 0;
-  return 1;
-}
-
-static void
-print_gui_item (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
-{
-  Lisp_Gui_Item *g = XGUI_ITEM (obj);
-  char buf[20];
-
-  if (print_readably)
-    error ("printing unreadable object #<gui-item 0x%x>", g->header.uid);
-
-  write_c_string ("#<gui-item ", printcharfun);
-  sprintf (buf, "0x%x>", g->header.uid);
-  write_c_string (buf, printcharfun);
-}
-
-static Lisp_Object
-copy_gui_item (Lisp_Object gui_item)
-{
-  Lisp_Object  ret = allocate_gui_item ();
-  Lisp_Gui_Item *lp, *g = XGUI_ITEM (gui_item);
-
-  lp = XGUI_ITEM (ret);
-  lp->name     = g->name;
-  lp->callback = g->callback;
-  lp->callback_ex = g->callback_ex;
-  lp->suffix   = g->suffix;
-  lp->active   = g->active;
-  lp->included = g->included;
-  lp->config   = g->config;
-  lp->filter   = g->filter;
-  lp->style    = g->style;
-  lp->selected = g->selected;
-  lp->keys     = g->keys;
-  lp->accelerator     = g->accelerator;
-  lp->value = g->value;
-
-  return ret;
-}
-
-Lisp_Object
-copy_gui_item_tree (Lisp_Object arg)
-{
-  if (CONSP (arg))
-    {
-      Lisp_Object rest = arg = Fcopy_sequence (arg);
-      while (CONSP (rest))
-	{
-	  XCAR (rest) = copy_gui_item_tree (XCAR (rest));
-	  rest = XCDR (rest);
-	}
-      return arg;
-    }
-  else if (GUI_ITEMP (arg))
-    return copy_gui_item (arg);
-  else 
-    return arg;
-}
-
-/* parse a glyph descriptor into a tree of gui items.
-
-   The gui_item slot of an image instance can be a single item or an
-   arbitrarily nested hierarchy of item lists. */
-
-static Lisp_Object
-parse_gui_item_tree_item (Lisp_Object entry)
-{
-  Lisp_Object ret = entry;
-  struct gcpro gcpro1;
-
-  GCPRO1 (ret);
-
-  if (VECTORP (entry))
-    {
-      ret = gui_parse_item_keywords_no_errors (entry);
-    }
-  else if (STRINGP (entry))
-    {
-      CHECK_STRING (entry);
-    }
-  else
-    signal_simple_error ("item must be a vector or a string", entry);
-
-  RETURN_UNGCPRO (ret);
-}
-
-Lisp_Object
-parse_gui_item_tree_children (Lisp_Object list)
-{
-  Lisp_Object rest, ret = Qnil, sub = Qnil;
-  struct gcpro gcpro1, gcpro2;
-
-  GCPRO2 (ret, sub);
-  CHECK_CONS (list);
-  /* recursively add items to the tree view */
-  LIST_LOOP (rest, list)
-    {
-      if (CONSP (XCAR (rest)))
-	sub = parse_gui_item_tree_list (XCAR (rest));
-      else
-	sub = parse_gui_item_tree_item (XCAR (rest));
-
-      ret = Fcons (sub, ret);
-    }
-  /* make the order the same as the items we have parsed */
-  RETURN_UNGCPRO (Fnreverse (ret));
-}
-
-static Lisp_Object
-parse_gui_item_tree_list (Lisp_Object list)
-{
-  Lisp_Object ret;
-  struct gcpro gcpro1;
-  CHECK_CONS (list);
-  /* first one can never be a list */
-  ret = parse_gui_item_tree_item (XCAR (list));
-  GCPRO1 (ret);
-  ret = Fcons (ret, parse_gui_item_tree_children (XCDR (list)));
-  RETURN_UNGCPRO (ret);
-}
-
-static void
-finalize_gui_item (void* header, int for_disksave)
-{
-}
-
-DEFINE_LRECORD_IMPLEMENTATION ("gui-item", gui_item,
-			       mark_gui_item, print_gui_item,
-			       finalize_gui_item, gui_item_equal,
-			       gui_item_hash,
-			       0,
-			       Lisp_Gui_Item);
-
 void
 syms_of_gui (void)
 {
-  INIT_LRECORD_IMPLEMENTATION (gui_item);
-
   defkeyword (&Q_active,   ":active");
   defkeyword (&Q_suffix,   ":suffix");
   defkeyword (&Q_keys,     ":keys");
@@ -727,8 +419,6 @@
   defkeyword (&Q_accelerator, ":accelerator");
   defkeyword (&Q_label, ":label");
   defkeyword (&Q_callback, ":callback");
-  defkeyword (&Q_callback_ex, ":callback-ex");
-  defkeyword (&Q_value, ":value");
 
   defsymbol (&Qtoggle, "toggle");
   defsymbol (&Qradio, "radio");