diff lwlib/lwlib-Xol.c @ 5628:f999ebca00da

entered into RCS
author Richard M. Stallman <rms@gnu.org>
date Tue, 18 Jan 1994 23:52:19 +0000
parents
children 0a94cd2c51c4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lwlib/lwlib-Xol.c	Tue Jan 18 23:52:19 1994 +0000
@@ -0,0 +1,317 @@
+#include "lwlib-Xol.h"
+#include <X11/StringDefs.h>
+#include <X11/IntrinsicP.h>
+#include <X11/CompositeP.h>
+#include <X11/Shell.h>
+#include <Xol/Menu.h>
+#include <Xol/OpenLook.h>
+#include <Xol/MenuButton.h>
+#include <Xol/OblongButt.h>
+#include <Xol/ControlAre.h>
+#include <Xol/Stub.h>
+#include <Xol/StaticText.h>
+
+/* forward declarations */
+static void
+update_menu_widget (widget_instance* instance, Widget widget,
+		    widget_value* val);
+
+/* Menu callbacks */
+static void
+pre_hook (Widget w, caddr_t client_data, caddr_t call_data)
+{
+  OlVirtualEvent ve = (OlVirtualEvent)call_data;
+  widget_instance* instance = (widget_instance*)client_data;
+
+  if (w->core.being_destroyed)
+    return;
+
+  if (XtParent (w) == instance->widget)
+    {
+      if (ve->xevent->type == ButtonPress && instance->info->pre_activate_cb)
+	instance->info->pre_activate_cb (instance->widget, instance->info->id,
+					 NULL);
+    }
+}
+
+static void
+post_hook (Widget w, caddr_t client_data, caddr_t call_data)
+{
+  widget_instance* instance = (widget_instance*)client_data;
+  
+  if (w->core.being_destroyed)
+    return;
+  
+  if (instance->info->post_activate_cb)
+    instance->info->post_activate_cb (w, instance->info->id, NULL);
+}
+
+static void
+pick_hook (Widget w, caddr_t client_data, caddr_t call_data)
+{
+  widget_instance* instance = 0;
+  widget_value* val = (widget_value*)client_data;
+
+  if (w->core.being_destroyed)
+    return;
+
+  XtVaGetValues (w, XtNuserData, &instance, 0);
+
+  if (!instance)
+    return;
+
+  if (instance->info->selection_cb && val && val->enabled
+      && !val->contents)
+    instance->info->selection_cb (w, instance->info->id, val->call_data);
+}
+
+/* creation functions */
+static Widget
+xol_create_menubar (widget_instance* instance)
+{
+  Widget widget =
+    XtVaCreateWidget (instance->info->name, controlAreaWidgetClass,
+		      instance->parent, 0);
+  return widget;
+}
+
+static Widget
+xol_create_popup_menu (widget_instance* instance)
+{
+  Widget popup_shell =
+    XtCreatePopupShell (instance->info->name, menuShellWidgetClass,
+			instance->parent, NULL, 0);
+  return popup_shell;
+}
+
+widget_creation_entry 
+xol_creation_table [] =
+{
+  {"menubar", xol_create_menubar},
+  {"popup", xol_create_popup_menu},
+  {NULL, NULL}
+};
+
+Widget 
+xol_create_dialog (widget_instance* instance)
+{
+  return NULL;
+}
+
+Boolean
+lw_olit_widget_p (Widget widget)
+{
+  return True;
+}
+
+/* update functions */
+static void
+destroy_all_children (Widget widget)
+{
+  Widget* children;
+  unsigned int number;
+  int i;
+
+  children = (Widget *) XtCompositeChildren (widget, &number);
+  if (children)
+    {
+      /* Unmanage all children and destroy them.  They will only be 
+       * really destroyed when we get out of DispatchEvent. */
+      for (i = 0; i < number; i++)
+	{
+	  Widget child = children [i];
+	  if (!child->core.being_destroyed)
+	    {
+	      XtUnmanageChild (child);
+	      XtDestroyWidget (child);
+	    }
+	}
+      XtFree (children);
+    }
+}
+
+static Boolean
+all_dashes_p (char* s)
+{
+  char* t;
+  for (t = s; *t; t++)
+    if (*t != '-')
+      return False;
+  return True;
+}
+
+static void
+make_menu_in_widget (widget_instance* instance, Widget widget,
+		     widget_value* val)
+{
+  widget_value* cur;
+  Widget button;
+  Arg al [256];
+  int ac;
+  String label;
+
+  for (cur = val; cur; cur = cur->next)
+    {    
+      ac = 0;
+      XtSetArg (al [ac], XtNsensitive, cur->enabled); ac++;
+      XtSetArg (al [ac], XtNuserData, instance); ac++;
+      XtSetArg (al [ac], XtNacceleratorText, cur->key); ac++;
+      
+/*      label = (char *) resource_string (widget, cur->name);*/
+      label = cur->name;
+      if (label)
+	{
+	  XtSetArg (al [ac], XtNlabel, label); ac++;
+	}
+
+      if (all_dashes_p (cur->name))
+	{
+	  /* no separator in OpenLook just make some space. */
+	  XtSetArg (al [ac], XtNheight, 5); ac++;
+	  XtSetArg (al [ac], XtNwidth, 5); ac++;
+	  button = XtCreateWidget (cur->name, stubWidgetClass, widget, al, ac);
+	}
+      else if (!cur->contents)
+	{
+	  if (!cur->call_data)
+	    button =
+	      XtCreateManagedWidget (cur->name, staticTextWidgetClass, widget,
+				     al, ac);
+	  else
+	    {
+	      button =
+		XtCreateManagedWidget (cur->name, oblongButtonWidgetClass,
+				       widget, al, ac);
+	      XtAddCallback (button, XtNselect, pick_hook, cur);
+	    }
+	}
+      else
+	{
+	  Widget menu = NULL;
+	  button =
+	    XtCreateManagedWidget (cur->name, menuButtonWidgetClass, widget,
+				   al, ac);
+	  XtVaGetValues (button, XtNmenuPane, &menu, 0);
+	  if (!menu)
+	    abort ();
+	  make_menu_in_widget (instance, menu, cur->contents);
+	  OlAddCallback (button, XtNconsumeEvent, pre_hook, instance);
+	}
+    }
+}
+
+static void
+update_one_menu_entry (widget_instance* instance, Widget widget,
+		       widget_value* val)
+{
+  Arg al [256];
+  int ac;
+  Widget menu;
+  widget_value* contents;
+
+  if (val->change == NO_CHANGE)
+    return;
+
+  /* update the sensitivity */
+  XtVaSetValues (widget, XtNsensitive, val->enabled, 0);
+
+  /* update the pulldown/pullaside as needed */
+  ac = 0;
+  menu = NULL;
+  XtVaGetValues (widget, XtNmenuPane, &menu, 0);
+  contents = val->contents;
+
+  if (!menu)
+    {
+      if (contents)
+	{
+	  /* in OLIT this woudl have to be a structural change on the
+	     button. */
+	  abort ();
+	}
+    }
+  else if (!contents)
+    {
+      /* in OLIT this woudl have to be a structural change on the button. */
+      abort ();
+    }
+  else if (contents->change != NO_CHANGE)
+    update_menu_widget (instance, menu, val);
+}
+
+static void
+update_menu_widget (widget_instance* instance, Widget widget,
+		    widget_value* val)
+
+{
+  if (val->change == STRUCTURAL_CHANGE
+      || val->contents->change == STRUCTURAL_CHANGE)
+    {
+      destroy_all_children (widget);
+      make_menu_in_widget (instance, widget, val->contents);
+    }
+  else
+    {
+      /* Update all the buttons of the composite widget in order. */
+      Widget* children;
+      unsigned int num_children;
+      int i;
+      widget_value* cur;
+      
+      children = (Widget *) XtCompositeChildren (widget, &num_children);
+      if (children)
+	{
+	  for (i = 0, cur = val->contents; i < num_children; i++)
+	    {
+	      if (!cur)
+		abort ();
+	      if (children [i]->core.being_destroyed
+		  || strcmp (XtName (children [i]), cur->name))
+		continue;
+	      update_one_menu_entry (instance, children [i], cur);
+	      cur = cur->next;
+	    }
+	  XtFree (children);
+	}
+      if (cur)
+	abort ();
+    }
+}
+
+void
+xol_update_one_widget (widget_instance* instance, Widget widget,
+		       widget_value* val, Boolean deep_p)
+{
+  Widget menu = widget;
+
+  if (XtIsShell (widget))
+    XtVaGetValues (widget, XtNmenuPane, &menu, 0);
+
+  update_menu_widget (instance, menu, val);
+}
+
+void
+xol_update_one_value (widget_instance* instance, Widget widget,
+		      widget_value* val)
+{
+  return;
+}
+
+void
+xol_pop_instance (widget_instance* instance, Boolean up)
+{
+}
+
+void
+xol_popup_menu (Widget widget)
+{
+  OlMenuPost (widget);
+}
+
+/* Destruction of instances */
+void
+xol_destroy_instance (widget_instance* instance)
+{
+  XtDestroyWidget (instance->widget);
+}
+