]> code.delx.au - gnu-emacs/blobdiff - lwlib/lwlib.c
(ange-ftp-name-format): Don't match "/:" or "/.:".
[gnu-emacs] / lwlib / lwlib.c
index 1f858cbea3dcaa7ed18be9be317091110b6d9763..5dd4f1d8133af9864b5a6fd36b24fcda2db91887 100644 (file)
@@ -21,26 +21,17 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #undef __STRICT_BSD__ /* ick */
 #endif
 
-#include <stdlib.h>
-#include <unistd.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>
 
-#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)
@@ -48,10 +39,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.
@@ -61,16 +59,46 @@ 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 */);
 
+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 *
+char *
 safe_strdup (s)
      char *s;
 {
@@ -129,7 +157,7 @@ malloc_widget_value ()
       wv = (widget_value *) malloc (sizeof (widget_value));
       malloc_cpt++;
     }
-  memset (wv, 0, sizeof (widget_value));
+  lwlib_memset (wv, 0, sizeof (widget_value));
   return wv;
 }
 
@@ -251,7 +279,7 @@ free_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);
 }
 
@@ -293,7 +321,7 @@ static void
 free_widget_instance (instance)
      widget_instance* instance;
 {
-  memset ((void*)instance, 0xDEADBEEF, sizeof (widget_instance));
+  lwlib_memset ((void*)instance, 0xDEADBEEF, sizeof (widget_instance));
   free (instance);
 }
 
@@ -321,6 +349,15 @@ get_widget_info (id, 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, remove_p)
      Widget widget;
@@ -375,14 +412,6 @@ safe_strcmp (s1, 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)                           \
@@ -542,11 +571,13 @@ name_to_widget (instance, 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;
 }
@@ -572,6 +603,10 @@ set_one_value (instance, val, 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
     }
 }
@@ -741,6 +776,10 @@ instanciate_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)
     {
@@ -753,6 +792,10 @@ instanciate_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
@@ -878,6 +921,11 @@ destroy_one_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 */
        ;
@@ -947,7 +995,7 @@ lw_destroy_all_pop_ups ()
 }
 
 #ifdef USE_MOTIF
-extern Widget first_child (Widget);    /* garbage */
+extern Widget first_child (/* Widget */);      /* garbage */
 #endif
 
 Widget
@@ -995,19 +1043,34 @@ lw_pop_all_widgets (id, 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
        }
 }
@@ -1027,20 +1090,25 @@ lw_pop_down_all_widgets (id)
 }
 
 void
-lw_popup_menu (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
 }
 
@@ -1065,6 +1133,10 @@ get_one_value (instance, 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;
     }
@@ -1235,3 +1307,63 @@ lw_show_busy (w, 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)
+      && 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
+}