]> code.delx.au - gnu-emacs/blobdiff - lwlib/lwlib.c
(streq, strneq): Use == NULL rather than !.
[gnu-emacs] / lwlib / lwlib.c
index 20f7682cfd4f9f2e4f8ccc681f415f5487d8c1e3..981c92e568654d36e10f43725b2853478fbe6f6c 100644 (file)
@@ -15,31 +15,24 @@ 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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #ifdef NeXT
 #undef __STRICT_BSD__ /* ick */
 #endif
 
-#include <stdlib.h>
-#include <unistd.h>
 #include <sys/types.h>
-#include <string.h>
 #include <stdio.h>
-#include <X11/StringDefs.h>
-#include "lwlib-internal.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(AIXV3)
-#include <alloca.h>
-#endif
-
-#if defined(AIXV3)
-#pragma alloca
+#ifdef __osf__
+#include <string.h>
+#include <stdlib.h>
+extern long *xmalloc();
 #endif
 
 #if defined (USE_LUCID)
@@ -47,10 +40,17 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif
 #if defined (USE_MOTIF)
 #include "lwlib-Xm.h"
+#else /* not USE_MOTIF */
+#if defined (USE_LUCID)
+#define USE_XAW
+#endif /* not USE_MOTIF && USE_LUCID */
 #endif
 #if defined (USE_OLIT)
 #include "lwlib-Xol.h"
 #endif
+#if defined (USE_XAW)
+#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.
@@ -60,17 +60,48 @@ ERROR!  At least one of USE_LUCID, USE_MOTIF or USE_OLIT must be defined.
 ERROR! no more than one of USE_MOTIF and USE_OLIT may be defined.
 #endif
 
+#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;
 
+#ifdef USE_MOTIF
+char *lwlib_toolkit_type = "motif";
+#else
+char *lwlib_toolkit_type = "lucid";
+#endif
 \f/* Forward declarations */
 static void
-instanciate_widget_instance (widget_instance* instance);
+instantiate_widget_instance (/* widget_instance* instance */);
 
+lwlib_memset (address, value, length)
+     char *address;
+     int value;
+     int length;
+{
+  int i;
+
+  for (i = 0; i < length; i++)
+    address[i] = value;
+}
+
+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 */
-static char *
-safe_strdup (char* s)
+char *
+safe_strdup (s)
+     char *s;
 {
   char *result;
   if (! s) return 0;
@@ -81,13 +112,36 @@ safe_strdup (char* s)
   return result;
 }
 
+/* Like strcmp but ignore differences in case.  */
+
+static int
+my_strcasecmp (s1, s2)
+     char *s1, *s2;
+{
+  while (1)
+    {
+      int c1 = *s1++;
+      int c2 = *s2++;
+      if (isupper (c1))
+       c1 = tolower (c1);
+      if (isupper (c2))
+       c2 = tolower (c2);
+      if (c1 != c2)
+       return (c1 > c2 ? 1 : -1);
+      if (c1 == 0)
+       return 0;
+    }
+}
+
 static void
-safe_free_str (char* s)
+safe_free_str (s)
+     char *s;
 {
   if (s) free (s);
 }
 
 static widget_value *widget_value_free_list = 0;
+static int malloc_cpt = 0;
 
 widget_value *
 malloc_widget_value ()
@@ -102,12 +156,13 @@ malloc_widget_value ()
   else
     {
       wv = (widget_value *) malloc (sizeof (widget_value));
+      malloc_cpt++;
     }
-  memset (wv, 0, sizeof (widget_value));
+  lwlib_memset (wv, 0, sizeof (widget_value));
   return wv;
 }
 
-/* this is analagous to free().  It frees only what was allocated
+/* this is analogous to free().  It frees only what was allocated
    by malloc_widget_value(), and no substructures. 
  */
 void
@@ -116,12 +171,24 @@ free_widget_value (wv)
 {
   if (wv->free_list)
     abort ();
-  wv->free_list = widget_value_free_list;
-  widget_value_free_list = wv;
+
+  if (malloc_cpt > 25)
+    {
+      /* When the number of already allocated cells is too big,
+        We free it.  */
+      free (wv);
+      malloc_cpt--;
+    }
+  else
+    {
+      wv->free_list = widget_value_free_list;
+      widget_value_free_list = wv;
+    }
 }
 
 static void
-free_widget_value_tree (widget_value* wv)
+free_widget_value_tree (wv)
+     widget_value *wv;
 {
   if (!wv)
     return;
@@ -134,7 +201,7 @@ free_widget_value_tree (widget_value* wv)
 
   if (wv->toolkit_data && wv->free_toolkit_data)
     {
-      free (wv->toolkit_data);
+      XtFree (wv->toolkit_data);
       wv->toolkit_data = (void *) 0xDEADBEEF;
     }
 
@@ -152,7 +219,9 @@ free_widget_value_tree (widget_value* wv)
 }
 
 static widget_value *
-copy_widget_value_tree (widget_value* val, change_type change)
+copy_widget_value_tree (val, change)
+     widget_value* val;
+     change_type change;
 {
   widget_value* copy;
   
@@ -169,6 +238,7 @@ copy_widget_value_tree (widget_value* val, change_type 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);
@@ -178,9 +248,14 @@ copy_widget_value_tree (widget_value* val, change_type change)
 }
 
 static widget_info *
-allocate_widget_info (char* type, char* name, LWLIB_ID id, widget_value* val,
-                     lw_callback pre_activate_cb, lw_callback selection_cb,
-                     lw_callback post_activate_cb)
+allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb, post_activate_cb)
+     char* type;
+     char* name;
+     LWLIB_ID id;
+     widget_value* val;
+     lw_callback pre_activate_cb;
+     lw_callback selection_cb;
+     lw_callback post_activate_cb;
 {
   widget_info* info = (widget_info*)malloc (sizeof (widget_info));
   info->type = safe_strdup (type);
@@ -200,17 +275,21 @@ allocate_widget_info (char* type, char* name, LWLIB_ID id, widget_value* val,
 }
 
 static void
-free_widget_info (widget_info* info)
+free_widget_info (info)
+     widget_info* info;
 {
   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);
 }
 
 static void
-mark_widget_destroyed (Widget widget, XtPointer closure, XtPointer call_data)
+mark_widget_destroyed (widget, closure, call_data)
+     Widget widget;
+     XtPointer closure;
+     XtPointer call_data;
 {
   widget_instance* instance = (widget_instance*)closure;
 
@@ -220,7 +299,10 @@ mark_widget_destroyed (Widget widget, XtPointer closure, XtPointer call_data)
 }
 
 static widget_instance *
-allocate_widget_instance (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;
 {
   widget_instance* instance =
     (widget_instance*)malloc (sizeof (widget_instance));
@@ -230,7 +312,7 @@ allocate_widget_instance (widget_info* info, Widget parent, Boolean pop_up_p)
   instance->next = info->instances;
   info->instances = instance;
 
-  instanciate_widget_instance (instance);
+  instantiate_widget_instance (instance);
 
   XtAddCallback (instance->widget, XtNdestroyCallback,
                 mark_widget_destroyed, (XtPointer)instance);
@@ -238,14 +320,17 @@ allocate_widget_instance (widget_info* info, Widget parent, Boolean pop_up_p)
 }
 
 static void
-free_widget_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 *
-get_widget_info (LWLIB_ID id, Boolean remove_p)
+get_widget_info (id, remove_p)
+     LWLIB_ID id;
+     Boolean remove_p;
 {
   widget_info* info;
   widget_info* prev;
@@ -266,8 +351,19 @@ get_widget_info (LWLIB_ID id, Boolean remove_p)
   return NULL;
 }
 
+/* Internal function used by the library dependent implementation to get the
+   widget_value for a given widget in an instance */
+widget_info *
+lw_get_widget_info (id)
+     LWLIB_ID id;
+{
+  return get_widget_info (id, 0);
+}
+
 static widget_instance *
-get_widget_instance (Widget widget, Boolean remove_p)
+get_widget_instance (widget, remove_p)
+     Widget widget;
+     Boolean remove_p;
 {
   widget_info* info;
   widget_instance* instance;
@@ -291,7 +387,10 @@ get_widget_instance (Widget widget, Boolean remove_p)
 }
 
 static widget_instance*
-find_instance (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;
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
@@ -307,18 +406,14 @@ find_instance (LWLIB_ID id, Widget parent, Boolean pop_up_p)
 \f
 /* utility function for widget_value */
 static Boolean
-safe_strcmp (char* s1, char* s2)
+safe_strcmp (s1, s2)
+     char* s1;
+     char* s2;
 {
   if (!!s1 ^ !!s2) return True;
   return (s1 && s2) ? strcmp (s1, s2) : s1 ? False : !!s2;
 }
 
-static int
-max (int i1, int i2)
-{
-  return i1 > i2 ? i1 : i2;
-}
-
 
 #if 0
 # define EXPLAIN(name, oc, nc, desc, a1, a2)                           \
@@ -340,9 +435,12 @@ max (int i1, int i2)
 
 
 static widget_value *
-merge_widget_value (widget_value* val1, widget_value* val2, int level)
+merge_widget_value (val1, val2, level)
+     widget_value* val1;
+     widget_value* val2;
+     int level;
 {
-  change_type change;
+  change_type change, this_one_change;
   widget_value* merged_next;
   widget_value* merged_contents;
 
@@ -414,20 +512,32 @@ merge_widget_value (widget_value* val1, widget_value* val2, int level)
       
       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);
-         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);
+#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;
     }
 
+  this_one_change = change;
+
   merged_next = merge_widget_value (val1->next, val2->next, level);
 
   if (val1->next && !merged_next)
@@ -446,12 +556,13 @@ merge_widget_value (widget_value* val1, widget_value* val2, int level)
 
   val1->next = merged_next;
 
+  val1->this_one_change = this_one_change;
   val1->change = change;
   
   if (change > NO_CHANGE && val1->toolkit_data)
     {
       if (val1->free_toolkit_data)
-       free (val1->toolkit_data);
+       XtFree (val1->toolkit_data);
       val1->toolkit_data = NULL;
     }
 
@@ -461,7 +572,9 @@ merge_widget_value (widget_value* val1, widget_value* val2, int level)
 \f
 /* modifying the widgets */
 static Widget
-name_to_widget (widget_instance* instance, char* name)
+name_to_widget (instance, name)
+     widget_instance* instance;
+     char* name;
 {
   Widget widget = NULL;
 
@@ -473,17 +586,22 @@ name_to_widget (widget_instance* instance, char* name)
   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);
       
       widget = XtNameToWidget (instance->widget, real_name);
+
+      free (real_name);
     }
   return widget;
 }
 
 static void
-set_one_value (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;
 {
   Widget widget = name_to_widget (instance, val->name);
   
@@ -500,12 +618,18 @@ set_one_value (widget_instance* instance, widget_value* val, Boolean deep_p)
 #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);
 #endif
     }
 }
 
 static void
-update_one_widget_instance (widget_instance* instance, Boolean deep_p)
+update_one_widget_instance (instance, deep_p)
+     widget_instance* instance;
+     Boolean deep_p;
 {
   widget_value *val;
 
@@ -519,7 +643,9 @@ update_one_widget_instance (widget_instance* instance, Boolean deep_p)
 }
 
 static void
-update_all_widget_values (widget_info* info, Boolean deep_p)
+update_all_widget_values (info, deep_p)
+     widget_info* info;
+     Boolean deep_p;
 {
   widget_instance* instance;
   widget_value* val;
@@ -532,7 +658,10 @@ update_all_widget_values (widget_info* info, Boolean deep_p)
 }
 
 void
-lw_modify_all_widgets (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;
 {
   widget_info* info = get_widget_info (id, False);
   widget_value* new_val;
@@ -583,7 +712,8 @@ lw_modify_all_widgets (LWLIB_ID id, widget_value* val, Boolean deep_p)
 /* creating the widgets */
 
 static void
-initialize_widget_instance (widget_instance* instance)
+initialize_widget_instance (instance)
+     widget_instance* instance;
 {
   widget_value* val;
 
@@ -598,17 +728,20 @@ initialize_widget_instance (widget_instance* instance)
 
 
 static widget_creation_function
-find_in_table (char* type, widget_creation_entry* table)
+find_in_table (type, table)
+     char* type;
+     widget_creation_entry* table;
 {
   widget_creation_entry* cur;
   for (cur = table; cur->type; cur++)
-    if (!strcasecmp (type, cur->type))
+    if (!my_strcasecmp (type, cur->type))
       return cur->function;
   return NULL;
 }
 
 static Boolean
-dialog_spec_p (char* name)
+dialog_spec_p (name)
+     char* name;
 {
   /* return True if name matches [EILPQeilpq][1-9][Bb] or 
      [EILPQeilpq][1-9][Bb][Rr][1-9] */
@@ -641,7 +774,8 @@ dialog_spec_p (char* name)
 }
 
 static void
-instanciate_widget_instance (widget_instance* instance)
+instantiate_widget_instance (instance)
+     widget_instance* instance;
 {
   widget_creation_function function = NULL;
 
@@ -657,6 +791,10 @@ instanciate_widget_instance (widget_instance* instance)
   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);
+#endif
 
   if (!function)
     {
@@ -669,6 +807,10 @@ instanciate_widget_instance (widget_instance* instance)
          if (!function)
            function = xm_create_dialog;
 #endif
+#if defined (USE_XAW)
+         if (!function)
+           function = xaw_create_dialog;
+#endif
 #if defined (USE_OLIT)
          /* not yet */
 #endif
@@ -691,9 +833,14 @@ instanciate_widget_instance (widget_instance* instance)
 }
 
 void 
-lw_register_widget (char* type, char* name, LWLIB_ID id, widget_value* val,
-                   lw_callback pre_activate_cb, lw_callback selection_cb,
-                   lw_callback post_activate_cb)
+lw_register_widget (type, name, id, val, pre_activate_cb, selection_cb, post_activate_cb)
+     char* type;
+     char* name;
+     LWLIB_ID id;
+     widget_value* val;
+     lw_callback pre_activate_cb;
+     lw_callback selection_cb;
+     lw_callback post_activate_cb;
 {
   if (!get_widget_info (id, False))
     allocate_widget_info (type, name, id, val, pre_activate_cb, selection_cb,
@@ -701,7 +848,10 @@ lw_register_widget (char* type, char* name, LWLIB_ID id, widget_value* val,
 }
 
 Widget
-lw_get_widget (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;
 {
   widget_instance* instance;
   
@@ -710,7 +860,10 @@ lw_get_widget (LWLIB_ID id, Widget parent, Boolean pop_up_p)
 }
 
 Widget
-lw_make_widget (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;
 {
   widget_instance* instance;
   widget_info* info;
@@ -730,9 +883,16 @@ lw_make_widget (LWLIB_ID id, Widget parent, Boolean pop_up_p)
 }
 
 Widget
-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_create_widget (type, name, id, val, parent, pop_up_p, pre_activate_cb, selection_cb, post_activate_cb)
+     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_register_widget (type, name, id, val, pre_activate_cb, selection_cb,
                      post_activate_cb);
@@ -742,7 +902,8 @@ lw_create_widget (char* type, char* name, LWLIB_ID id, widget_value* val,
 \f
 /* destroying the widgets */
 static void
-destroy_one_instance (widget_instance* instance)
+destroy_one_instance (instance)
+     widget_instance* instance;
 {
   /* Remove the destroy callback on the widget; that callback will try to
      dereference the instance object (to set its widget slot to 0, since the
@@ -775,6 +936,11 @@ destroy_one_instance (widget_instance* instance)
       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);
+      else 
 #endif
        /* do not remove the empty statement */
        ;
@@ -784,7 +950,8 @@ destroy_one_instance (widget_instance* instance)
 }
 
 void
-lw_destroy_widget (Widget w)
+lw_destroy_widget (w)
+     Widget w;
 {
   widget_instance* instance = get_widget_instance (w, True);
   
@@ -800,7 +967,8 @@ lw_destroy_widget (Widget w)
 }
 
 void
-lw_destroy_all_widgets (LWLIB_ID id)
+lw_destroy_all_widgets (id)
+     LWLIB_ID id;
 {
   widget_info* info = get_widget_info (id, True);
   widget_instance* instance;
@@ -842,7 +1010,7 @@ lw_destroy_all_pop_ups ()
 }
 
 #ifdef USE_MOTIF
-extern Widget first_child (Widget);    /* garbage */
+extern Widget first_child (/* Widget */);      /* garbage */
 #endif
 
 Widget
@@ -879,7 +1047,9 @@ lw_raise_all_pop_up_widgets ()
 }
 
 static void
-lw_pop_all_widgets (LWLIB_ID id, Boolean up)
+lw_pop_all_widgets (id, up)
+     LWLIB_ID id;
+     Boolean up;
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
@@ -888,55 +1058,80 @@ lw_pop_all_widgets (LWLIB_ID id, Boolean up)
     for (instance = info->instances; instance; instance = instance->next)
       if (instance->pop_up_p && instance->widget)
        {
-         if (!XtIsRealized (instance->widget))
-           XtRealizeWidget (instance->widget);
 #if defined (USE_LUCID)
          if (lw_lucid_widget_p (instance->widget))
-           xlw_pop_instance (instance, up);
+           {
+             XtRealizeWidget (instance->widget);
+             xlw_pop_instance (instance, up);
+           }
 #endif
 #if defined (USE_MOTIF)
          if (lw_motif_widget_p (instance->widget))
-           xm_pop_instance (instance, up);
+           {
+             XtRealizeWidget (instance->widget);
+             xm_pop_instance (instance, up);
+           }
 #endif
 #if defined (USE_OLIT)
          if (lw_olit_widget_p (instance->widget))
-           xol_pop_instance (instance, up);
+           {
+             XtRealizeWidget (instance->widget);
+             xol_pop_instance (instance, up);
+           }
+#endif
+#if defined (USE_XAW)
+         if (lw_xaw_widget_p (instance->widget))
+           {
+             XtRealizeWidget (XtParent (instance->widget));
+             XtRealizeWidget (instance->widget);
+             xaw_pop_instance (instance, up);
+           }
 #endif
        }
 }
 
 void
-lw_pop_up_all_widgets (LWLIB_ID id)
+lw_pop_up_all_widgets (id)
+     LWLIB_ID id;
 {
   lw_pop_all_widgets (id, True);
 }
 
 void
-lw_pop_down_all_widgets (LWLIB_ID id)
+lw_pop_down_all_widgets (id)
+     LWLIB_ID id;
 {
   lw_pop_all_widgets (id, False);
 }
 
 void
-lw_popup_menu (Widget widget)
+lw_popup_menu (widget, event)
+     Widget widget;
+     XEvent *event;
 {
 #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))
-    xm_popup_menu (widget);
+    xm_popup_menu (widget, event);
 #endif
 #if defined (USE_OLIT)
   if (lw_olit_widget_p (widget))
-    xol_popup_menu (widget);
+    xol_popup_menu (widget, event);
+#endif
+#if defined (USE_XAW)
+  if (lw_xaw_widget_p (widget))
+    xaw_popup_menu (widget, event);
 #endif
 }
 
 \f/* get the values back */
 static Boolean
-get_one_value (widget_instance* instance, widget_value* val)
+get_one_value (instance, val)
+     widget_instance* instance;
+     widget_value* val;
 {
   Widget widget = name_to_widget (instance, val->name);
       
@@ -953,6 +1148,10 @@ get_one_value (widget_instance* instance, widget_value* val)
 #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);
 #endif
       return True;
     }
@@ -961,7 +1160,9 @@ get_one_value (widget_instance* instance, widget_value* val)
 }
 
 Boolean
-lw_get_some_values (LWLIB_ID id, widget_value* val_out)
+lw_get_some_values (id, val_out)
+     LWLIB_ID id;
+     widget_value* val_out;
 {
   widget_info* info = get_widget_info (id, False);
   widget_instance* instance;
@@ -983,7 +1184,8 @@ lw_get_some_values (LWLIB_ID id, widget_value* val_out)
 }
 
 widget_value*
-lw_get_all_values (LWLIB_ID id)
+lw_get_all_values (id)
+     LWLIB_ID id;
 {
   widget_info* info = get_widget_info (id, False);
   widget_value* val = info->val;
@@ -996,7 +1198,9 @@ lw_get_all_values (LWLIB_ID id)
 /* internal function used by the library dependent implementation to get the
    widget_value for a given widget in an instance */
 widget_value*
-lw_get_widget_value_for_widget (widget_instance* instance, Widget w)
+lw_get_widget_value_for_widget (instance, w)
+     widget_instance* instance;
+     Widget w;
 {
   char* name = XtName (w);
   widget_value* cur;
@@ -1007,24 +1211,27 @@ lw_get_widget_value_for_widget (widget_instance* instance, Widget w)
 }
 
 \f/* update other instances value when one thing changed */
+
+/* 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
-lw_internal_update_other_instances (Widget widget, XtPointer closure,
-                                   XtPointer call_data)
+lw_internal_update_other_instances (widget, closure, call_data)
+     Widget widget;
+     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;
 
-  /* never recurse as this could cause infinite recursions. */
-  if (updating)
+  /* Avoid possibly infinite recursion.  */
+  if (lwlib_updating)
     return;
 
   /* protect against the widget being destroyed */
@@ -1036,7 +1243,7 @@ lw_internal_update_other_instances (Widget widget, XtPointer closure,
   if (!info->instances->next)
     return;
 
-  updating = True;
+  lwlib_updating = True;
 
   for (val = info->val; val && strcmp (val->name, name); val = val->next);
 
@@ -1045,14 +1252,15 @@ lw_internal_update_other_instances (Widget widget, XtPointer closure,
       if (cur != instance)
        set_one_value (cur, val, True);
 
-  updating = False;
+  lwlib_updating = False;
 }
 
 
 \f/* get the id */
 
 LWLIB_ID
-lw_get_widget_id (Widget w)
+lw_get_widget_id (w)
+     Widget w;
 {
   widget_instance* instance = get_widget_instance (w, False);
 
@@ -1061,7 +1269,9 @@ lw_get_widget_id (Widget w)
 
 \f/* set the keyboard focus */
 void
-lw_set_keyboard_focus (Widget parent, Widget w)
+lw_set_keyboard_focus (parent, w)
+     Widget parent;
+     Widget w;
 {
 #if defined (USE_MOTIF)
   xm_set_keyboard_focus (parent, w);
@@ -1072,7 +1282,9 @@ lw_set_keyboard_focus (Widget parent, Widget w)
 
 \f/* Show busy */
 static void
-show_one_widget_busy (Widget w, Boolean flag)
+show_one_widget_busy (w, flag)
+     Widget w;
+     Boolean flag;
 {
   Pixel foreground = 0;
   Pixel background = 1;
@@ -1091,7 +1303,9 @@ show_one_widget_busy (Widget w, Boolean flag)
 }
 
 void
-lw_show_busy (Widget w, Boolean busy)
+lw_show_busy (w, busy)
+     Widget w;
+     Boolean busy;
 {
   widget_instance* instance = get_widget_instance (w, False);
   widget_info* info;
@@ -1109,3 +1323,64 @@ lw_show_busy (Widget w, Boolean busy)
        }
     }
 }
+
+/* This hack exists because Lucid/Athena need to execute the strange
+   function below to support geometry management. */
+void
+lw_refigure_widget (w, doit)
+     Widget w;
+     Boolean doit;
+{
+#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
+lw_allow_resizing (w, flag)
+     Widget w;
+     Boolean flag;
+{
+#if defined (USE_MOTIF)
+  xm_manage_resizing (w, flag);
+#endif
+}