]> code.delx.au - gnu-emacs/blobdiff - lwlib/lwlib.c
(idlwave-completion-help-info): Add defvar.
[gnu-emacs] / lwlib / lwlib.c
index 4e7e807f80d2e326ed8dae6334cc10794e42a4c2..39b9400c5c861399af3e27a6e17ac658c4fb1b9a 100644 (file)
@@ -3,46 +3,38 @@
 
 This file is part of the Lucid Widget Library.
 
 
 This file is part of the Lucid Widget Library.
 
-The Lucid Widget Library is free software; you can redistribute it and/or 
+The Lucid Widget Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 The Lucid Widget Library is distributed in the hope that it will be useful,
 modify it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 The Lucid Widget Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of 
+but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 #ifdef NeXT
 #undef __STRICT_BSD__ /* ick */
 #endif
 
 
 #ifdef NeXT
 #undef __STRICT_BSD__ /* ick */
 #endif
 
-#include <stdlib.h>
-#include <unistd.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "../src/lisp.h"
+
 #include <sys/types.h>
 #include <sys/types.h>
-#include <string.h>
 #include <stdio.h>
 #include <ctype.h>
 #include "lwlib-int.h"
 #include "lwlib-utils.h"
 #include <X11/StringDefs.h>
 
 #include <stdio.h>
 #include <ctype.h>
 #include "lwlib-int.h"
 #include "lwlib-utils.h"
 #include <X11/StringDefs.h>
 
-#if defined(__GNUC__) && !defined(alloca)
-#define alloca __builtin_alloca
-#endif
-
-#if ((!__GNUC__) && !defined(__hpux)) && !defined(_AIX)
-#include <alloca.h>
-#endif
-
-#if defined(_AIX)
-#pragma alloca
-#endif
-
 #if defined (USE_LUCID)
 #include "lwlib-Xlw.h"
 #endif
 #if defined (USE_LUCID)
 #include "lwlib-Xlw.h"
 #endif
@@ -53,33 +45,90 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define USE_XAW
 #endif /* not USE_MOTIF && USE_LUCID */
 #endif
 #define USE_XAW
 #endif /* not USE_MOTIF && USE_LUCID */
 #endif
-#if defined (USE_OLIT)
-#include "lwlib-Xol.h"
-#endif
 #if defined (USE_XAW)
 #if defined (USE_XAW)
+#include <X11/Xaw/Paned.h>
 #include "lwlib-Xaw.h"
 #endif
 
 #include "lwlib-Xaw.h"
 #endif
 
-#if !defined (USE_LUCID) && !defined (USE_MOTIF) && !defined (USE_OLIT)
-ERROR!  At least one of USE_LUCID, USE_MOTIF or USE_OLIT must be defined.
+#if !defined (USE_LUCID) && !defined (USE_MOTIF)
+ #error  At least one of USE_LUCID or USE_MOTIF must be defined.
 #endif
 
 #endif
 
-#if defined (USE_MOTIF) && defined (USE_OLIT)
-ERROR! no more than one of USE_MOTIF and USE_OLIT may be defined.
+#ifndef max
+#define max(x, y) ((x) > (y) ? (x) : (y))
 #endif
 
 /* List of all widgets managed by the library. */
 static widget_info*
 all_widget_info = NULL;
 
 #endif
 
 /* List of all widgets managed by the library. */
 static widget_info*
 all_widget_info = NULL;
 
-\f/* Forward declarations */
-static void
-instanciate_widget_instance (/* widget_instance* instance */);
+#ifdef USE_MOTIF
+char *lwlib_toolkit_type = "motif";
+#else
+char *lwlib_toolkit_type = "lucid";
+#endif
+
+static widget_value *merge_widget_value P_ ((widget_value *,
+                                            widget_value *,
+                                            int, int *));
+static void instantiate_widget_instance P_ ((widget_instance *));
+static int my_strcasecmp P_ ((char *, char *));
+static void safe_free_str P_ ((char *));
+static void free_widget_value_tree P_ ((widget_value *));
+static widget_value *copy_widget_value_tree P_ ((widget_value *,
+                                                change_type));
+static widget_info *allocate_widget_info P_ ((char *, char *, LWLIB_ID,
+                                             widget_value *,
+                                             lw_callback, lw_callback,
+                                             lw_callback, lw_callback));
+static void free_widget_info P_ ((widget_info *));
+static void mark_widget_destroyed P_ ((Widget, XtPointer, XtPointer));
+static widget_instance *allocate_widget_instance P_ ((widget_info *,
+                                                     Widget, Boolean));
+static void free_widget_instance P_ ((widget_instance *));
+static widget_info *get_widget_info P_ ((LWLIB_ID, Boolean));
+static widget_instance *get_widget_instance P_ ((Widget, Boolean));
+static widget_instance *find_instance P_ ((LWLIB_ID, Widget, Boolean));
+static Boolean safe_strcmp P_ ((char *, char *));
+static Widget name_to_widget P_ ((widget_instance *, char *));
+static void set_one_value P_ ((widget_instance *, widget_value *, Boolean));
+static void update_one_widget_instance P_ ((widget_instance *, Boolean));
+static void update_all_widget_values P_ ((widget_info *, Boolean));
+static void initialize_widget_instance P_ ((widget_instance *));
+static widget_creation_function find_in_table P_ ((char *, widget_creation_entry *));
+static Boolean dialog_spec_p P_ ((char *));
+static void destroy_one_instance P_ ((widget_instance *));
+static void lw_pop_all_widgets P_ ((LWLIB_ID, Boolean));
+static Boolean get_one_value P_ ((widget_instance *, widget_value *));
+static void show_one_widget_busy P_ ((Widget, Boolean));
+
+void
+lwlib_memset (address, value, length)
+     char *address;
+     int value;
+     size_t length;
+{
+  int i;
+
+  for (i = 0; i < length; i++)
+    address[i] = value;
+}
+
+void
+lwlib_bcopy (from, to, length)
+     char *from;
+     char *to;
+     int length;
+{
+  int i;
 
 
+  for (i = 0; i < length; i++)
+    to[i] = from[i];
+}
 \f/* utility functions for widget_instance and widget_info */
 \f/* utility functions for widget_instance and widget_info */
-static char *
+char *
 safe_strdup (s)
 safe_strdup (s)
-     char *s;
+     const char *s;
 {
   char *result;
   if (! s) return 0;
 {
   char *result;
   if (! s) return 0;
@@ -136,12 +185,12 @@ malloc_widget_value ()
       wv = (widget_value *) malloc (sizeof (widget_value));
       malloc_cpt++;
     }
       wv = (widget_value *) malloc (sizeof (widget_value));
       malloc_cpt++;
     }
-  memset (wv, 0, sizeof (widget_value));
+  lwlib_memset ((void*) wv, 0, sizeof (widget_value));
   return wv;
 }
 
   return wv;
 }
 
-/* this is analagous to free().  It frees only what was allocated
-   by malloc_widget_value(), and no substructures. 
+/* this is analogous to free().  It frees only what was allocated
+   by malloc_widget_value(), and no substructures.
  */
 void
 free_widget_value (wv)
  */
 void
 free_widget_value (wv)
@@ -179,7 +228,7 @@ free_widget_value_tree (wv)
 
   if (wv->toolkit_data && wv->free_toolkit_data)
     {
 
   if (wv->toolkit_data && wv->free_toolkit_data)
     {
-      free (wv->toolkit_data);
+      XtFree (wv->toolkit_data);
       wv->toolkit_data = (void *) 0xDEADBEEF;
     }
 
       wv->toolkit_data = (void *) 0xDEADBEEF;
     }
 
@@ -202,7 +251,7 @@ copy_widget_value_tree (val, change)
      change_type change;
 {
   widget_value* copy;
      change_type change;
 {
   widget_value* copy;
-  
+
   if (!val)
     return NULL;
   if (val == (widget_value *) 1)
   if (!val)
     return NULL;
   if (val == (widget_value *) 1)
@@ -212,10 +261,13 @@ copy_widget_value_tree (val, change)
   copy->name = safe_strdup (val->name);
   copy->value = safe_strdup (val->value);
   copy->key = safe_strdup (val->key);
   copy->name = safe_strdup (val->name);
   copy->value = safe_strdup (val->value);
   copy->key = safe_strdup (val->key);
+  copy->help = val->help;
   copy->enabled = val->enabled;
   copy->enabled = val->enabled;
+  copy->button_type = val->button_type;
   copy->selected = val->selected;
   copy->edited = False;
   copy->change = change;
   copy->selected = val->selected;
   copy->edited = False;
   copy->change = change;
+  copy->this_one_change = change;
   copy->contents = copy_widget_value_tree (val->contents, change);
   copy->call_data = val->call_data;
   copy->next = copy_widget_value_tree (val->next, change);
   copy->contents = copy_widget_value_tree (val->contents, change);
   copy->call_data = val->call_data;
   copy->next = copy_widget_value_tree (val->next, change);
@@ -225,7 +277,8 @@ copy_widget_value_tree (val, change)
 }
 
 static widget_info *
 }
 
 static widget_info *
-allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb, post_activate_cb)
+allocate_widget_info (type, name, id, val, pre_activate_cb,
+                     selection_cb, post_activate_cb, highlight_cb)
      char* type;
      char* name;
      LWLIB_ID id;
      char* type;
      char* name;
      LWLIB_ID id;
@@ -233,6 +286,7 @@ allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb, post_a
      lw_callback pre_activate_cb;
      lw_callback selection_cb;
      lw_callback post_activate_cb;
      lw_callback pre_activate_cb;
      lw_callback selection_cb;
      lw_callback post_activate_cb;
+     lw_callback highlight_cb;
 {
   widget_info* info = (widget_info*)malloc (sizeof (widget_info));
   info->type = safe_strdup (type);
 {
   widget_info* info = (widget_info*)malloc (sizeof (widget_info));
   info->type = safe_strdup (type);
@@ -243,6 +297,7 @@ allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb, post_a
   info->pre_activate_cb = pre_activate_cb;
   info->selection_cb = selection_cb;
   info->post_activate_cb = post_activate_cb;
   info->pre_activate_cb = pre_activate_cb;
   info->selection_cb = selection_cb;
   info->post_activate_cb = post_activate_cb;
+  info->highlight_cb = highlight_cb;
   info->instances = NULL;
 
   info->next = all_widget_info;
   info->instances = NULL;
 
   info->next = all_widget_info;
@@ -258,7 +313,7 @@ free_widget_info (info)
   safe_free_str (info->type);
   safe_free_str (info->name);
   free_widget_value_tree (info->val);
   safe_free_str (info->type);
   safe_free_str (info->name);
   free_widget_value_tree (info->val);
-  memset ((void*)info, 0xDEADBEEF, sizeof (widget_info));
+  lwlib_memset ((void*)info, 0xDEADBEEF, sizeof (widget_info));
   free (info);
 }
 
   free (info);
 }
 
@@ -275,21 +330,29 @@ mark_widget_destroyed (widget, closure, call_data)
     instance->widget = NULL;
 }
 
     instance->widget = NULL;
 }
 
+/* The messy #ifdef PROTOTYPES here and elsewhere are prompted by a
+   flood of warnings about argument promotion from proprietary ISO C
+   compilers.  (etags still only makes one entry for each function.)  */
 static widget_instance *
 static widget_instance *
+#ifdef PROTOTYPES
+allocate_widget_instance (widget_info* info, Widget parent, Boolean pop_up_p)
+#else
 allocate_widget_instance (info, parent, pop_up_p)
      widget_info* info;
      Widget parent;
      Boolean pop_up_p;
 allocate_widget_instance (info, parent, pop_up_p)
      widget_info* info;
      Widget parent;
      Boolean pop_up_p;
+#endif
 {
   widget_instance* instance =
     (widget_instance*)malloc (sizeof (widget_instance));
 {
   widget_instance* instance =
     (widget_instance*)malloc (sizeof (widget_instance));
+  bzero (instance, sizeof *instance);
   instance->parent = parent;
   instance->pop_up_p = pop_up_p;
   instance->info = info;
   instance->next = info->instances;
   info->instances = instance;
 
   instance->parent = parent;
   instance->pop_up_p = pop_up_p;
   instance->info = info;
   instance->next = info->instances;
   info->instances = instance;
 
-  instanciate_widget_instance (instance);
+  instantiate_widget_instance (instance);
 
   XtAddCallback (instance->widget, XtNdestroyCallback,
                 mark_widget_destroyed, (XtPointer)instance);
 
   XtAddCallback (instance->widget, XtNdestroyCallback,
                 mark_widget_destroyed, (XtPointer)instance);
@@ -300,14 +363,18 @@ static void
 free_widget_instance (instance)
      widget_instance* instance;
 {
 free_widget_instance (instance)
      widget_instance* instance;
 {
-  memset ((void*)instance, 0xDEADBEEF, sizeof (widget_instance));
+  lwlib_memset ((void*)instance, 0xDEADBEEF, sizeof (widget_instance));
   free (instance);
 }
 
 static widget_info *
   free (instance);
 }
 
 static widget_info *
+#ifdef PROTOTYPES
+get_widget_info (LWLIB_ID id, Boolean remove_p)
+#else
 get_widget_info (id, remove_p)
      LWLIB_ID id;
      Boolean remove_p;
 get_widget_info (id, remove_p)
      LWLIB_ID id;
      Boolean remove_p;
+#endif
 {
   widget_info* info;
   widget_info* prev;
 {
   widget_info* info;
   widget_info* prev;
@@ -338,9 +405,13 @@ lw_get_widget_info (id)
 }
 
 static widget_instance *
 }
 
 static widget_instance *
+#ifdef PROTOTYPES
+get_widget_instance (Widget widget, Boolean remove_p)
+#else
 get_widget_instance (widget, remove_p)
      Widget widget;
      Boolean remove_p;
 get_widget_instance (widget, remove_p)
      Widget widget;
      Boolean remove_p;
+#endif
 {
   widget_info* info;
   widget_instance* instance;
 {
   widget_info* info;
   widget_instance* instance;
@@ -363,11 +434,25 @@ get_widget_instance (widget, remove_p)
   return (widget_instance *) 0;
 }
 
   return (widget_instance *) 0;
 }
 
+/* Value is a pointer to the widget_instance corresponding to
+   WIDGET, or null if WIDGET is not a lwlib widget.  */
+
+widget_instance *
+lw_get_widget_instance (widget)
+     Widget widget;
+{
+  return get_widget_instance (widget, False);
+}
+
 static widget_instance*
 static widget_instance*
+#ifdef PROTOTYPES
+find_instance (LWLIB_ID id, Widget parent, Boolean pop_up_p)
+#else
 find_instance (id, parent, pop_up_p)
      LWLIB_ID id;
      Widget parent;
      Boolean pop_up_p;
 find_instance (id, parent, pop_up_p)
      LWLIB_ID id;
      Widget parent;
      Boolean pop_up_p;
+#endif
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
@@ -391,14 +476,6 @@ safe_strcmp (s1, s2)
   return (s1 && s2) ? strcmp (s1, s2) : s1 ? False : !!s2;
 }
 
   return (s1 && s2) ? strcmp (s1, s2) : s1 ? False : !!s2;
 }
 
-static int
-max (i1, i2)
-     int i1;
-     int i2;
-{
-  return i1 > i2 ? i1 : i2;
-}
-
 
 #if 0
 # define EXPLAIN(name, oc, nc, desc, a1, a2)                           \
 
 #if 0
 # define EXPLAIN(name, oc, nc, desc, a1, a2)                           \
@@ -420,28 +497,33 @@ max (i1, i2)
 
 
 static widget_value *
 
 
 static widget_value *
-merge_widget_value (val1, val2, level)
+merge_widget_value (val1, val2, level, change_p)
      widget_value* val1;
      widget_value* val2;
      int level;
      widget_value* val1;
      widget_value* val2;
      int level;
+     int *change_p;
 {
 {
-  change_type change;
+  change_type change, this_one_change;
   widget_value* merged_next;
   widget_value* merged_contents;
 
   if (!val1)
     {
       if (val2)
   widget_value* merged_next;
   widget_value* merged_contents;
 
   if (!val1)
     {
       if (val2)
-       return copy_widget_value_tree (val2, STRUCTURAL_CHANGE);
+       {
+         *change_p = 1;
+         return copy_widget_value_tree (val2, STRUCTURAL_CHANGE);
+       }
       else
        return NULL;
     }
   if (!val2)
     {
       else
        return NULL;
     }
   if (!val2)
     {
+      *change_p = 1;
       free_widget_value_tree (val1);
       return NULL;
     }
       free_widget_value_tree (val1);
       return NULL;
     }
-  
+
   change = NO_CHANGE;
 
   if (safe_strcmp (val1->name, val2->name))
   change = NO_CHANGE;
 
   if (safe_strcmp (val1->name, val2->name))
@@ -468,6 +550,13 @@ merge_widget_value (val1, val2, level)
       safe_free_str (val1->key);
       val1->key = safe_strdup (val2->key);
     }
       safe_free_str (val1->key);
       val1->key = safe_strdup (val2->key);
     }
+  if (! EQ (val1->help, val2->help))
+    {
+      EXPLAIN (val1->name, change, VISIBLE_CHANGE, "help change",
+              val1->help, val2->help);
+      change = max (change, VISIBLE_CHANGE);
+      val1->help = val2->help;
+    }
   if (val1->enabled != val2->enabled)
     {
       EXPLAIN (val1->name, change, VISIBLE_CHANGE, "enablement change",
   if (val1->enabled != val2->enabled)
     {
       EXPLAIN (val1->name, change, VISIBLE_CHANGE, "enablement change",
@@ -475,6 +564,13 @@ merge_widget_value (val1, val2, level)
       change = max (change, VISIBLE_CHANGE);
       val1->enabled = val2->enabled;
     }
       change = max (change, VISIBLE_CHANGE);
       val1->enabled = val2->enabled;
     }
+  if (val1->button_type != val2->button_type)
+    {
+      EXPLAIN (val1->name, change, VISIBLE_CHANGE, "button type change",
+              val1->button_type, val2->button_type);
+      change = max (change, VISIBLE_CHANGE);
+      val1->button_type = val2->button_type;
+    }
   if (val1->selected != val2->selected)
     {
       EXPLAIN (val1->name, change, VISIBLE_CHANGE, "selection change",
   if (val1->selected != val2->selected)
     {
       EXPLAIN (val1->name, change, VISIBLE_CHANGE, "selection change",
@@ -493,25 +589,38 @@ merge_widget_value (val1, val2, level)
   if (level > 0)
     {
       merged_contents =
   if (level > 0)
     {
       merged_contents =
-       merge_widget_value (val1->contents, val2->contents, level - 1);
-      
+       merge_widget_value (val1->contents, val2->contents, level - 1,
+                           change_p);
+
       if (val1->contents && !merged_contents)
        {
       if (val1->contents && !merged_contents)
        {
-         EXPLAIN (val1->name, change, INVISIBLE_CHANGE, "(contents gone)",
+         /* This used to say INVISIBLE_CHANGE,
+            but it is visible and vitally important when
+            the contents of the menu bar itself are entirely deleted.
+
+            But maybe it doesn't matter.  This fails to fix the bug.  */
+         EXPLAIN (val1->name, change, STRUCTURAL_CHANGE, "(contents gone)",
                   0, 0);
                   0, 0);
-         change = max (change, INVISIBLE_CHANGE);
+         change = max (change, STRUCTURAL_CHANGE);
        }
       else if (merged_contents && merged_contents->change != NO_CHANGE)
        {
          EXPLAIN (val1->name, change, INVISIBLE_CHANGE, "(contents change)",
                   0, 0);
          change = max (change, INVISIBLE_CHANGE);
        }
       else if (merged_contents && merged_contents->change != NO_CHANGE)
        {
          EXPLAIN (val1->name, change, INVISIBLE_CHANGE, "(contents change)",
                   0, 0);
          change = max (change, INVISIBLE_CHANGE);
+#if 0 /* This was replaced by the August 9 1996 change in lwlib-Xm.c.  */
+#ifdef USE_MOTIF
+         change = max (merged_contents->change, change);
+#endif
+#endif
        }
        }
-      
+
       val1->contents = merged_contents;
     }
 
       val1->contents = merged_contents;
     }
 
-  merged_next = merge_widget_value (val1->next, val2->next, level);
+  this_one_change = change;
+
+  merged_next = merge_widget_value (val1->next, val2->next, level, change_p);
 
   if (val1->next && !merged_next)
     {
 
   if (val1->next && !merged_next)
     {
@@ -529,12 +638,14 @@ merge_widget_value (val1, val2, level)
 
   val1->next = merged_next;
 
 
   val1->next = merged_next;
 
+  val1->this_one_change = this_one_change;
   val1->change = change;
   val1->change = change;
-  
+
   if (change > NO_CHANGE && val1->toolkit_data)
     {
   if (change > NO_CHANGE && val1->toolkit_data)
     {
+      *change_p = 1;
       if (val1->free_toolkit_data)
       if (val1->free_toolkit_data)
-       free (val1->toolkit_data);
+       XtFree (val1->toolkit_data);
       val1->toolkit_data = NULL;
     }
 
       val1->toolkit_data = NULL;
     }
 
@@ -558,23 +669,29 @@ name_to_widget (instance, name)
   else
     {
       int length = strlen (name) + 2;
   else
     {
       int length = strlen (name) + 2;
-      char* real_name = (char *) alloca (length);
+      char* real_name = (char *) xmalloc (length);
       real_name [0] = '*';
       strcpy (real_name + 1, name);
       real_name [0] = '*';
       strcpy (real_name + 1, name);
-      
+
       widget = XtNameToWidget (instance->widget, real_name);
       widget = XtNameToWidget (instance->widget, real_name);
+
+      free (real_name);
     }
   return widget;
 }
 
 static void
     }
   return widget;
 }
 
 static void
+#ifdef PROTOTYPES
+set_one_value (widget_instance* instance, widget_value* val, Boolean deep_p)
+#else
 set_one_value (instance, val, deep_p)
      widget_instance* instance;
      widget_value* val;
      Boolean deep_p;
 set_one_value (instance, val, deep_p)
      widget_instance* instance;
      widget_value* val;
      Boolean deep_p;
+#endif
 {
   Widget widget = name_to_widget (instance, val->name);
 {
   Widget widget = name_to_widget (instance, val->name);
-  
+
   if (widget)
     {
 #if defined (USE_LUCID)
   if (widget)
     {
 #if defined (USE_LUCID)
@@ -585,10 +702,6 @@ set_one_value (instance, val, deep_p)
       if (lw_motif_widget_p (instance->widget))
        xm_update_one_widget (instance, widget, val, deep_p);
 #endif
       if (lw_motif_widget_p (instance->widget))
        xm_update_one_widget (instance, widget, val, deep_p);
 #endif
-#if defined (USE_OLIT)
-      if (lw_olit_widget_p (instance->widget))
-       xol_update_one_widget (instance, widget, val, deep_p);
-#endif
 #if defined (USE_XAW)
       if (lw_xaw_widget_p (instance->widget))
        xaw_update_one_widget (instance, widget, val, deep_p);
 #if defined (USE_XAW)
       if (lw_xaw_widget_p (instance->widget))
        xaw_update_one_widget (instance, widget, val, deep_p);
@@ -597,9 +710,13 @@ set_one_value (instance, val, deep_p)
 }
 
 static void
 }
 
 static void
+#ifdef PROTOTYPES
+update_one_widget_instance (widget_instance* instance, Boolean deep_p)
+#else
 update_one_widget_instance (instance, deep_p)
      widget_instance* instance;
      Boolean deep_p;
 update_one_widget_instance (instance, deep_p)
      widget_instance* instance;
      Boolean deep_p;
+#endif
 {
   widget_value *val;
 
 {
   widget_value *val;
 
@@ -613,9 +730,13 @@ update_one_widget_instance (instance, deep_p)
 }
 
 static void
 }
 
 static void
+#ifdef PROTOTYPES
+update_all_widget_values (widget_info* info, Boolean deep_p)
+#else
 update_all_widget_values (info, deep_p)
      widget_info* info;
      Boolean deep_p;
 update_all_widget_values (info, deep_p)
      widget_info* info;
      Boolean deep_p;
+#endif
 {
   widget_instance* instance;
   widget_value* val;
 {
   widget_instance* instance;
   widget_value* val;
@@ -627,11 +748,15 @@ update_all_widget_values (info, deep_p)
     val->change = NO_CHANGE;
 }
 
     val->change = NO_CHANGE;
 }
 
-void
+int
+#ifdef PROTOTYPES
+lw_modify_all_widgets (LWLIB_ID id, widget_value* val, Boolean deep_p)
+#else
 lw_modify_all_widgets (id, val, deep_p)
      LWLIB_ID id;
      widget_value* val;
      Boolean deep_p;
 lw_modify_all_widgets (id, val, deep_p)
      LWLIB_ID id;
      widget_value* val;
      Boolean deep_p;
+#endif
 {
   widget_info* info = get_widget_info (id, False);
   widget_value* new_val;
 {
   widget_info* info = get_widget_info (id, False);
   widget_value* new_val;
@@ -640,9 +765,10 @@ lw_modify_all_widgets (id, val, deep_p)
   widget_value* prev;
   widget_value* next;
   int          found;
   widget_value* prev;
   widget_value* next;
   int          found;
+  int change_p = 0;
 
   if (!info)
 
   if (!info)
-    return;
+    return 0;
 
   for (new_val = val; new_val; new_val = new_val->next)
     {
 
   for (new_val = val; new_val; new_val = new_val->next)
     {
@@ -655,7 +781,8 @@ lw_modify_all_widgets (id, val, deep_p)
            found = True;
            next = cur->next;
            cur->next = NULL;
            found = True;
            next = cur->next;
            cur->next = NULL;
-           cur = merge_widget_value (cur, new_val, deep_p ? 1000 : 1);
+           cur = merge_widget_value (cur, new_val, deep_p ? 1000 : 1,
+                                     &change_p);
            if (prev)
              prev->next = cur ? cur : next;
            else
            if (prev)
              prev->next = cur ? cur : next;
            else
@@ -671,11 +798,13 @@ lw_modify_all_widgets (id, val, deep_p)
            prev->next = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE);
          else
            info->val = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE);
            prev->next = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE);
          else
            info->val = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE);
+         change_p = 1;
        }
       new_val->next = next_new_val;
     }
 
   update_all_widget_values (info, deep_p);
        }
       new_val->next = next_new_val;
     }
 
   update_all_widget_values (info, deep_p);
+  return change_p;
 }
 
 \f
 }
 
 \f
@@ -713,11 +842,11 @@ static Boolean
 dialog_spec_p (name)
      char* name;
 {
 dialog_spec_p (name)
      char* name;
 {
-  /* return True if name matches [EILPQeilpq][1-9][Bb] or 
+  /* return True if name matches [EILPQeilpq][1-9][Bb] or
      [EILPQeilpq][1-9][Bb][Rr][1-9] */
   if (!name)
     return False;
      [EILPQeilpq][1-9][Bb][Rr][1-9] */
   if (!name)
     return False;
-  
+
   switch (name [0])
     {
     case 'E': case 'I': case 'L': case 'P': case 'Q':
   switch (name [0])
     {
     case 'E': case 'I': case 'L': case 'P': case 'Q':
@@ -737,14 +866,14 @@ dialog_spec_p (name)
        }
       else
        return False;
        }
       else
        return False;
-    
+
     default:
       return False;
     }
 }
 
 static void
     default:
       return False;
     }
 }
 
 static void
-instanciate_widget_instance (instance)
+instantiate_widget_instance (instance)
      widget_instance* instance;
 {
   widget_creation_function function = NULL;
      widget_instance* instance;
 {
   widget_creation_function function = NULL;
@@ -757,10 +886,6 @@ instanciate_widget_instance (instance)
   if (!function)
     function = find_in_table (instance->info->type, xm_creation_table);
 #endif
   if (!function)
     function = find_in_table (instance->info->type, xm_creation_table);
 #endif
-#if defined (USE_OLIT)
-  if (!function)
-    function = find_in_table (instance->info->type, xol_creation_table);
-#endif
 #if defined (USE_XAW)
   if (!function)
     function = find_in_table (instance->info->type, xaw_creation_table);
 #if defined (USE_XAW)
   if (!function)
     function = find_in_table (instance->info->type, xaw_creation_table);
@@ -780,13 +905,10 @@ instanciate_widget_instance (instance)
 #if defined (USE_XAW)
          if (!function)
            function = xaw_create_dialog;
 #if defined (USE_XAW)
          if (!function)
            function = xaw_create_dialog;
-#endif
-#if defined (USE_OLIT)
-         /* not yet */
 #endif
        }
     }
 #endif
        }
     }
-  
+
   if (!function)
     {
       printf ("No creation function for widget type %s\n",
   if (!function)
     {
       printf ("No creation function for widget type %s\n",
@@ -802,8 +924,9 @@ instanciate_widget_instance (instance)
   /*   XtRealizeWidget (instance->widget);*/
 }
 
   /*   XtRealizeWidget (instance->widget);*/
 }
 
-void 
-lw_register_widget (type, name, id, val, pre_activate_cb, selection_cb, post_activate_cb)
+void
+lw_register_widget (type, name, id, val, pre_activate_cb,
+                   selection_cb, post_activate_cb, highlight_cb)
      char* type;
      char* name;
      LWLIB_ID id;
      char* type;
      char* name;
      LWLIB_ID id;
@@ -811,33 +934,42 @@ lw_register_widget (type, name, id, val, pre_activate_cb, selection_cb, post_act
      lw_callback pre_activate_cb;
      lw_callback selection_cb;
      lw_callback post_activate_cb;
      lw_callback pre_activate_cb;
      lw_callback selection_cb;
      lw_callback post_activate_cb;
+     lw_callback highlight_cb;
 {
   if (!get_widget_info (id, False))
     allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb,
 {
   if (!get_widget_info (id, False))
     allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb,
-                         post_activate_cb);
+                         post_activate_cb, highlight_cb);
 }
 
 Widget
 }
 
 Widget
+#ifdef PROTOTYPES
+lw_get_widget (LWLIB_ID id, Widget parent, Boolean pop_up_p)
+#else
 lw_get_widget (id, parent, pop_up_p)
      LWLIB_ID id;
      Widget parent;
      Boolean pop_up_p;
 lw_get_widget (id, parent, pop_up_p)
      LWLIB_ID id;
      Widget parent;
      Boolean pop_up_p;
+#endif
 {
   widget_instance* instance;
 {
   widget_instance* instance;
-  
+
   instance = find_instance (id, parent, pop_up_p);
   return instance ? instance->widget : NULL;
 }
 
 Widget
   instance = find_instance (id, parent, pop_up_p);
   return instance ? instance->widget : NULL;
 }
 
 Widget
+#ifdef PROTOTYPES
+lw_make_widget (LWLIB_ID id, Widget parent, Boolean pop_up_p)
+#else
 lw_make_widget (id, parent, pop_up_p)
      LWLIB_ID id;
      Widget parent;
      Boolean pop_up_p;
 lw_make_widget (id, parent, pop_up_p)
      LWLIB_ID id;
      Widget parent;
      Boolean pop_up_p;
+#endif
 {
   widget_instance* instance;
   widget_info* info;
 {
   widget_instance* instance;
   widget_info* info;
-  
+
   instance = find_instance (id, parent, pop_up_p);
   if (!instance)
     {
   instance = find_instance (id, parent, pop_up_p);
   if (!instance)
     {
@@ -853,7 +985,14 @@ lw_make_widget (id, parent, pop_up_p)
 }
 
 Widget
 }
 
 Widget
-lw_create_widget (type, name, id, val, parent, pop_up_p, pre_activate_cb, selection_cb, post_activate_cb)
+#ifdef PROTOTYPES
+lw_create_widget (char* type, char* name, LWLIB_ID id, widget_value* val,
+                 Widget parent, Boolean pop_up_p,
+                 lw_callback pre_activate_cb, lw_callback selection_cb,
+                 lw_callback post_activate_cb, lw_callback highlight_cb)
+#else
+lw_create_widget (type, name, id, val, parent, pop_up_p, pre_activate_cb,
+                 selection_cb, post_activate_cb, highlight_cb)
      char* type;
      char* name;
      LWLIB_ID id;
      char* type;
      char* name;
      LWLIB_ID id;
@@ -863,12 +1002,14 @@ lw_create_widget (type, name, id, val, parent, pop_up_p, pre_activate_cb, select
      lw_callback pre_activate_cb;
      lw_callback selection_cb;
      lw_callback post_activate_cb;
      lw_callback pre_activate_cb;
      lw_callback selection_cb;
      lw_callback post_activate_cb;
+     lw_callback highlight_cb;
+#endif
 {
   lw_register_widget (type, name, id, val, pre_activate_cb, selection_cb,
 {
   lw_register_widget (type, name, id, val, pre_activate_cb, selection_cb,
-                     post_activate_cb);
+                     post_activate_cb, highlight_cb);
   return lw_make_widget (id, parent, pop_up_p);
 }
   return lw_make_widget (id, parent, pop_up_p);
 }
-                 
+
 \f
 /* destroying the widgets */
 static void
 \f
 /* destroying the widgets */
 static void
@@ -902,15 +1043,10 @@ destroy_one_instance (instance)
        xm_destroy_instance (instance);
       else
 #endif
        xm_destroy_instance (instance);
       else
 #endif
-#if defined (USE_OLIT)
-      if (lw_olit_widget_p (instance->widget))
-       xol_destroy_instance (instance);
-      else
-#endif
 #if defined (USE_XAW)
       if (lw_xaw_widget_p (instance->widget))
        xaw_destroy_instance (instance);
 #if defined (USE_XAW)
       if (lw_xaw_widget_p (instance->widget))
        xaw_destroy_instance (instance);
-      else 
+      else
 #endif
        /* do not remove the empty statement */
        ;
 #endif
        /* do not remove the empty statement */
        ;
@@ -924,7 +1060,7 @@ lw_destroy_widget (w)
      Widget w;
 {
   widget_instance* instance = get_widget_instance (w, True);
      Widget w;
 {
   widget_instance* instance = get_widget_instance (w, True);
-  
+
   if (instance)
     {
       widget_info *info = instance->info;
   if (instance)
     {
       widget_info *info = instance->info;
@@ -980,7 +1116,7 @@ lw_destroy_all_pop_ups ()
 }
 
 #ifdef USE_MOTIF
 }
 
 #ifdef USE_MOTIF
-extern Widget first_child (Widget);    /* garbage */
+extern Widget first_child (/* Widget */);      /* garbage */
 #endif
 
 Widget
 #endif
 
 Widget
@@ -1017,9 +1153,13 @@ lw_raise_all_pop_up_widgets ()
 }
 
 static void
 }
 
 static void
+#ifdef PROTOTYPES
+lw_pop_all_widgets (LWLIB_ID id, Boolean up)
+#else
 lw_pop_all_widgets (id, up)
      LWLIB_ID id;
      Boolean up;
 lw_pop_all_widgets (id, up)
      LWLIB_ID id;
      Boolean up;
+#endif
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
@@ -1042,13 +1182,6 @@ lw_pop_all_widgets (id, up)
              xm_pop_instance (instance, up);
            }
 #endif
              xm_pop_instance (instance, up);
            }
 #endif
-#if defined (USE_OLIT)
-         if (lw_olit_widget_p (instance->widget))
-           {
-             XtRealizeWidget (instance->widget);
-             xol_pop_instance (instance, up);
-           }
-#endif
 #if defined (USE_XAW)
          if (lw_xaw_widget_p (instance->widget))
            {
 #if defined (USE_XAW)
          if (lw_xaw_widget_p (instance->widget))
            {
@@ -1075,24 +1208,21 @@ lw_pop_down_all_widgets (id)
 }
 
 void
 }
 
 void
-lw_popup_menu (widget)
+lw_popup_menu (widget, event)
      Widget widget;
      Widget widget;
+     XEvent *event;
 {
 #if defined (USE_LUCID)
   if (lw_lucid_widget_p (widget))
 {
 #if defined (USE_LUCID)
   if (lw_lucid_widget_p (widget))
-    xlw_popup_menu (widget);
+    xlw_popup_menu (widget, event);
 #endif
 #if defined (USE_MOTIF)
   if (lw_motif_widget_p (widget))
 #endif
 #if defined (USE_MOTIF)
   if (lw_motif_widget_p (widget))
-    xm_popup_menu (widget);
-#endif
-#if defined (USE_OLIT)
-  if (lw_olit_widget_p (widget))
-    xol_popup_menu (widget);
+    xm_popup_menu (widget, event);
 #endif
 #if defined (USE_XAW)
   if (lw_xaw_widget_p (widget))
 #endif
 #if defined (USE_XAW)
   if (lw_xaw_widget_p (widget))
-    xaw_popup_menu (widget);
+    xaw_popup_menu (widget, event);
 #endif
 }
 
 #endif
 }
 
@@ -1103,7 +1233,7 @@ get_one_value (instance, val)
      widget_value* val;
 {
   Widget widget = name_to_widget (instance, val->name);
      widget_value* val;
 {
   Widget widget = name_to_widget (instance, val->name);
-      
+
   if (widget)
     {
 #if defined (USE_LUCID)
   if (widget)
     {
 #if defined (USE_LUCID)
@@ -1114,10 +1244,6 @@ get_one_value (instance, val)
       if (lw_motif_widget_p (instance->widget))
        xm_update_one_value (instance, widget, val);
 #endif
       if (lw_motif_widget_p (instance->widget))
        xm_update_one_value (instance, widget, val);
 #endif
-#if defined (USE_OLIT)
-      if (lw_olit_widget_p (instance->widget))
-       xol_update_one_value (instance, widget, val);
-#endif
 #if defined (USE_XAW)
       if (lw_xaw_widget_p (instance->widget))
        xaw_update_one_value (instance, widget, val);
 #if defined (USE_XAW)
       if (lw_xaw_widget_p (instance->widget))
        xaw_update_one_value (instance, widget, val);
@@ -1180,7 +1306,11 @@ lw_get_widget_value_for_widget (instance, w)
 }
 
 \f/* update other instances value when one thing changed */
 }
 
 \f/* update other instances value when one thing changed */
-/* This function can be used as a an XtCallback for the widgets that get 
+
+/* To forbid recursive calls */
+static Boolean lwlib_updating;
+
+/* This function can be used as a an XtCallback for the widgets that get
   modified to update other instances of the widgets.  Closure should be the
   widget_instance. */
 void
   modified to update other instances of the widgets.  Closure should be the
   widget_instance. */
 void
@@ -1189,17 +1319,14 @@ lw_internal_update_other_instances (widget, closure, call_data)
      XtPointer closure;
      XtPointer call_data;
 {
      XtPointer closure;
      XtPointer call_data;
 {
-  /* To forbid recursive calls */
-  static Boolean updating;
-  
   widget_instance* instance = (widget_instance*)closure;
   char* name = XtName (widget);
   widget_info* info;
   widget_instance* cur;
   widget_value* val;
 
   widget_instance* instance = (widget_instance*)closure;
   char* name = XtName (widget);
   widget_info* info;
   widget_instance* cur;
   widget_value* val;
 
-  /* never recurse as this could cause infinite recursions. */
-  if (updating)
+  /* Avoid possibly infinite recursion.  */
+  if (lwlib_updating)
     return;
 
   /* protect against the widget being destroyed */
     return;
 
   /* protect against the widget being destroyed */
@@ -1211,7 +1338,7 @@ lw_internal_update_other_instances (widget, closure, call_data)
   if (!info->instances->next)
     return;
 
   if (!info->instances->next)
     return;
 
-  updating = True;
+  lwlib_updating = True;
 
   for (val = info->val; val && strcmp (val->name, name); val = val->next);
 
 
   for (val = info->val; val && strcmp (val->name, name); val = val->next);
 
@@ -1220,7 +1347,7 @@ lw_internal_update_other_instances (widget, closure, call_data)
       if (cur != instance)
        set_one_value (cur, val, True);
 
       if (cur != instance)
        set_one_value (cur, val, True);
 
-  updating = False;
+  lwlib_updating = False;
 }
 
 
 }
 
 
@@ -1250,30 +1377,38 @@ lw_set_keyboard_focus (parent, w)
 
 \f/* Show busy */
 static void
 
 \f/* Show busy */
 static void
+#ifdef PROTOTYPES
+show_one_widget_busy (Widget w, Boolean flag)
+#else
 show_one_widget_busy (w, flag)
      Widget w;
      Boolean flag;
 show_one_widget_busy (w, flag)
      Widget w;
      Boolean flag;
+#endif
 {
   Pixel foreground = 0;
   Pixel background = 1;
   Widget widget_to_invert = XtNameToWidget (w, "*sheet");
   if (!widget_to_invert)
     widget_to_invert = w;
 {
   Pixel foreground = 0;
   Pixel background = 1;
   Widget widget_to_invert = XtNameToWidget (w, "*sheet");
   if (!widget_to_invert)
     widget_to_invert = w;
-  
+
   XtVaGetValues (widget_to_invert,
                 XtNforeground, &foreground,
                 XtNbackground, &background,
   XtVaGetValues (widget_to_invert,
                 XtNforeground, &foreground,
                 XtNbackground, &background,
-                0);
+                NULL);
   XtVaSetValues (widget_to_invert,
                 XtNforeground, background,
                 XtNbackground, foreground,
   XtVaSetValues (widget_to_invert,
                 XtNforeground, background,
                 XtNbackground, foreground,
-                0);
+                NULL);
 }
 
 void
 }
 
 void
+#ifdef PROTOTYPES
+lw_show_busy (Widget w, Boolean busy)
+#else
 lw_show_busy (w, busy)
      Widget w;
      Boolean busy;
 lw_show_busy (w, busy)
      Widget w;
      Boolean busy;
+#endif
 {
   widget_instance* instance = get_widget_instance (w, False);
   widget_info* info;
 {
   widget_instance* instance = get_widget_instance (w, False);
   widget_info* info;
@@ -1291,3 +1426,190 @@ lw_show_busy (w, busy)
        }
     }
 }
        }
     }
 }
+
+/* This hack exists because Lucid/Athena need to execute the strange
+   function below to support geometry management. */
+void
+#ifdef PROTOTYPES
+lw_refigure_widget (Widget w, Boolean doit)
+#else
+lw_refigure_widget (w, doit)
+     Widget w;
+     Boolean doit;
+#endif
+{
+#if defined (USE_XAW)
+  XawPanedSetRefigureMode (w, doit);
+#endif
+#if defined (USE_MOTIF)
+  if (doit)
+    XtManageChild (w);
+  else
+    XtUnmanageChild (w);
+#endif
+}
+
+/* Toolkit independent way of determining if an event window is in the
+   menubar. */
+Boolean
+lw_window_is_in_menubar (win, menubar_widget)
+     Window win;
+     Widget menubar_widget;
+{
+  return menubar_widget
+#if defined (USE_LUCID)
+      && XtWindow (menubar_widget) == win;
+#endif
+#if defined (USE_MOTIF)
+      && ((XtWindow (menubar_widget) == win)
+         || (XtWindowToWidget (XtDisplay (menubar_widget), win)
+             && (XtParent (XtWindowToWidget (XtDisplay (menubar_widget), win))
+                 == menubar_widget)));
+#endif
+}
+
+/* Motif hack to set the main window areas. */
+void
+lw_set_main_areas (parent, menubar, work_area)
+     Widget parent;
+     Widget menubar;
+     Widget work_area;
+{
+#if defined (USE_MOTIF)
+  xm_set_main_areas (parent, menubar, work_area);
+#endif
+}
+
+/* Manage resizing for Motif.  This disables resizing when the menubar
+   is about to be modified. */
+void
+#ifdef PROTOTYPES
+lw_allow_resizing (Widget w, Boolean flag)
+#else
+lw_allow_resizing (w, flag)
+     Widget w;
+     Boolean flag;
+#endif
+{
+#if defined (USE_MOTIF)
+  xm_manage_resizing (w, flag);
+#endif
+}
+
+
+/* Value is non-zero if LABEL is a menu separator.  If it is, *TYPE is
+   set to an appropriate enumerator of type enum menu_separator.
+   MOTIF_P non-zero means map separator types not supported by Motif
+   to similar ones that are supported.  */
+
+int
+lw_separator_p (label, type, motif_p)
+     char *label;
+     enum menu_separator *type;
+     int motif_p;
+{
+  int separator_p = 0;
+
+  if (strlen (label) >= 3
+      && bcmp (label, "--:", 3) == 0)
+    {
+      static struct separator_table
+      {
+       char *name;
+       enum menu_separator type;
+      }
+      separator_names[] =
+      {
+       {"space",                     SEPARATOR_NO_LINE},
+       {"noLine",                    SEPARATOR_NO_LINE},
+       {"singleLine",                SEPARATOR_SINGLE_LINE},
+       {"doubleLine",                SEPARATOR_DOUBLE_LINE},
+       {"singleDashedLine",          SEPARATOR_SINGLE_DASHED_LINE},
+       {"doubleDashedLine",          SEPARATOR_DOUBLE_DASHED_LINE},
+       {"shadowEtchedIn",            SEPARATOR_SHADOW_ETCHED_IN},
+       {"shadowEtchedOut",           SEPARATOR_SHADOW_ETCHED_OUT},
+       {"shadowEtchedInDash",        SEPARATOR_SHADOW_ETCHED_IN_DASH},
+       {"shadowEtchedOutDash",       SEPARATOR_SHADOW_ETCHED_OUT_DASH},
+       {"shadowDoubleEtchedIn",      SEPARATOR_SHADOW_DOUBLE_ETCHED_IN},
+       {"shadowDoubleEtchedOut",     SEPARATOR_SHADOW_DOUBLE_ETCHED_OUT},
+       {"shadowDoubleEtchedInDash",  SEPARATOR_SHADOW_DOUBLE_ETCHED_IN_DASH},
+       {"shadowDoubleEtchedOutDash", SEPARATOR_SHADOW_DOUBLE_ETCHED_OUT_DASH},
+       {0,0}
+      };
+
+      int i;
+
+      label += 3;
+      for (i = 0; separator_names[i].name; ++i)
+       if (strcmp (label, separator_names[i].name) == 0)
+         {
+           separator_p = 1;
+           *type = separator_names[i].type;
+
+           /* If separator type is not supported under Motif,
+              use a similar one.  */
+           if (motif_p && *type >= SEPARATOR_SHADOW_DOUBLE_ETCHED_IN)
+             *type -= 4;
+           break;
+         }
+    }
+  else if (strlen (label) > 3
+          && bcmp (label, "--", 2) == 0
+          && label[2] != '-')
+    {
+      /* Alternative, more Emacs-style names.  */
+      static struct separator_table
+      {
+       char *name;
+       enum menu_separator type;
+      }
+      separator_names[] =
+      {
+       {"space",                        SEPARATOR_NO_LINE},
+       {"no-line",                      SEPARATOR_NO_LINE},
+       {"single-line",                  SEPARATOR_SINGLE_LINE},
+       {"double-line",                  SEPARATOR_DOUBLE_LINE},
+       {"single-dashed-line",           SEPARATOR_SINGLE_DASHED_LINE},
+       {"double-dashed-line",           SEPARATOR_DOUBLE_DASHED_LINE},
+       {"shadow-etched-in",             SEPARATOR_SHADOW_ETCHED_IN},
+       {"shadow-etched-out",            SEPARATOR_SHADOW_ETCHED_OUT},
+       {"shadow-etched-in-dash",        SEPARATOR_SHADOW_ETCHED_IN_DASH},
+       {"shadow-etched-out-dash",       SEPARATOR_SHADOW_ETCHED_OUT_DASH},
+       {"shadow-double-etched-in",      SEPARATOR_SHADOW_DOUBLE_ETCHED_IN},
+       {"shadow-double-etched-out",     SEPARATOR_SHADOW_DOUBLE_ETCHED_OUT},
+       {"shadow-double-etched-in-dash", SEPARATOR_SHADOW_DOUBLE_ETCHED_IN_DASH},
+       {"shadow-double-etched-out-dash",SEPARATOR_SHADOW_DOUBLE_ETCHED_OUT_DASH},
+       {0,0}
+      };
+
+      int i;
+
+      label += 2;
+      for (i = 0; separator_names[i].name; ++i)
+       if (strcmp (label, separator_names[i].name) == 0)
+         {
+           separator_p = 1;
+           *type = separator_names[i].type;
+
+           /* If separator type is not supported under Motif,
+              use a similar one.  */
+           if (motif_p && *type >= SEPARATOR_SHADOW_DOUBLE_ETCHED_IN)
+             *type -= 4;
+           break;
+         }
+    }
+  else
+    {
+      /* Old-style separator, maybe.  It's a separator if it contains
+        only dashes.  */
+      while (*label == '-')
+       ++label;
+      separator_p = *label == 0;
+      *type = SEPARATOR_SHADOW_ETCHED_IN;
+    }
+
+  return separator_p;
+}
+
+/* arch-tag: 3d730f36-a441-4a71-9971-48ef3b5a4d9f
+   (do not change this comment) */