diff lwlib/lwlib-Xaw.c @ 442:abe6d1db359e r21-2-36

Import from CVS: tag r21-2-36
author cvs
date Mon, 13 Aug 2007 11:35:02 +0200
parents 84b14dcb0985
children 98528da0b7fc
line wrap: on
line diff
--- a/lwlib/lwlib-Xaw.c	Mon Aug 13 11:33:40 2007 +0200
+++ b/lwlib/lwlib-Xaw.c	Mon Aug 13 11:35:02 2007 +0200
@@ -33,21 +33,21 @@
 #include <X11/Shell.h>
 
 #ifdef LWLIB_SCROLLBARS_ATHENA
-#include ATHENA_INCLUDE(Scrollbar.h)
+#include ATHENA_Scrollbar_h_
 #endif
 #ifdef LWLIB_DIALOGS_ATHENA
-#include ATHENA_INCLUDE(Dialog.h)
-#include ATHENA_INCLUDE(Form.h)
-#include ATHENA_INCLUDE(Command.h)
-#include ATHENA_INCLUDE(Label.h)
+#include ATHENA_Dialog_h_
+#include ATHENA_Form_h_
+#include ATHENA_Command_h_
+#include ATHENA_Label_h_
 #endif
 #ifdef LWLIB_WIDGETS_ATHENA
-#include ATHENA_INCLUDE(Toggle.h)
+#include ATHENA_Toggle_h_
 #include "xlwradio.h"
 #include "xlwcheckbox.h"
 #include "xlwgauge.h"
 #ifndef NEED_MOTIF
-#include ATHENA_INCLUDE(AsciiText.h)
+#include ATHENA_AsciiText_h_
 #endif
 #endif
 #include <X11/Xatom.h>
@@ -69,8 +69,8 @@
 	  || XtIsSubclass (widget, labelWidgetClass)
 	  || XtIsSubclass (widget, toggleWidgetClass)
 	  || XtIsSubclass (widget, gaugeWidgetClass)
-#if 0
-	  || XtIsSubclass (widget, textWidgetClass)
+#ifndef NEED_MOTIF
+	  || XtIsSubclass (widget, asciiTextWidgetClass)
 #endif
 #endif
 	  );
@@ -126,9 +126,6 @@
 xaw_update_one_widget (widget_instance *instance, Widget widget,
 		       widget_value *val, Boolean deep_p)
 {
-  if (val->args && val->args->nargs)
-    XtSetValues (widget, val->args->args, val->args->nargs);
-
   if (0)
     ;
 #ifdef LWLIB_SCROLLBARS_ATHENA
@@ -137,6 +134,13 @@
       xaw_update_scrollbar (instance, widget, val);
     }
 #endif
+#ifdef LWLIB_WIDGETS_ATHENA
+#ifndef NEED_MOTIF
+  else if (XtIsSubclass (widget, asciiTextWidgetClass))
+      {
+      }
+#endif
+#endif
 #ifdef LWLIB_DIALOGS_ATHENA
   else if (XtIsSubclass (widget, dialogWidgetClass))
       {
@@ -175,6 +179,7 @@
 	}
 #endif /* ! LWLIB_DIALOGS_ATHENA3D */
 
+      lw_remove_accelerator_spec (val->value);
       XtSetArg (al [0], XtNlabel,     val->value);
       XtSetArg (al [1], XtNsensitive, val->enabled);
       /* Force centered button text.  See above. */
@@ -193,6 +198,9 @@
 #endif /* LWLIB_WIDGETS_ATHENA */
     }
 #endif /* LWLIB_DIALOGS_ATHENA */
+  /* Lastly update our global arg values. */
+  if (val->args && val->args->nargs)
+    XtSetValues (widget, val->args->args, val->args->nargs);
 }
 
 void
@@ -220,11 +228,19 @@
 #ifndef NEED_MOTIF
   else if (XtIsSubclass (widget, asciiTextWidgetClass))
     {
-      Arg al [1];
+      Arg al [2];
+      String buf = 0;
+      XtSetArg (al [0], XtNstring, &buf);
+      XtGetValues (widget, al, 1);
+
       if (val->value)
-	free (val->value);
-      XtSetArg (al [0], XtNstring, &val->value);
-      XtGetValues (widget, al, 1);
+	{
+	  free (val->value);
+	  val->value = 0;
+	}
+      /* I don't think this causes a leak. */
+      if (buf)
+	val->value = strdup (buf);
       val->edited = True;
     }
 #endif
@@ -329,8 +345,8 @@
 static Boolean actions_initted = False;
 
 static Widget
-make_dialog (CONST char* name, Widget parent, Boolean pop_up_p,
-	     CONST char* shell_title, CONST char* icon_name,
+make_dialog (const char* name, Widget parent, Boolean pop_up_p,
+	     const char* shell_title, const char* icon_name,
              Boolean text_input_slot,
 	     Boolean radio_box, Boolean list,
 	     int left_buttons, int right_buttons)
@@ -438,8 +454,8 @@
   Widget parent = instance->parent;
   Widget widget;
   Boolean pop_up_p = instance->pop_up_p;
-  CONST char *shell_name = 0;
-  CONST char *icon_name = 0;
+  const char *shell_name = 0;
+  const char *icon_name = 0;
   Boolean text_input_slot = False;
   Boolean radio_box = False;
   Boolean list = False;
@@ -776,6 +792,8 @@
   /* Do it again for arguments that have no effect until the widget is realized. */
   ac = 0;
   lw_add_value_args_to_args (val, al, &ac);
+  if (ac > 20)
+    abort (); /* #### need assert macro in lwlib */
   XtSetValues (label, al, ac);
 
   return label;
@@ -788,7 +806,7 @@
   int ac = 0;
   Widget scale = 0;
   widget_value* val = instance->info->val;
-
+#if 0		/* This looks too awful, although more correct. */
   if (!val->call_data)
     {
       XtSetArg (al [ac], XtNsensitive, False);		ac++;
@@ -797,6 +815,10 @@
     {
       XtSetArg (al [ac], XtNsensitive, val->enabled);		ac++;
     }
+#else
+  XtSetArg (al [ac], XtNsensitive, True);		ac++;
+#endif
+
   XtSetArg (al [ac], XtNmappedWhenManaged, FALSE);	ac++;
   XtSetArg (al [ac], XtNorientation, XtorientHorizontal);	ac++;
   XtSetArg (al [ac], XtNhighlightThickness, (Dimension)0);ac++;
@@ -817,6 +839,7 @@
 }
 
 #ifndef NEED_MOTIF
+#define TEXT_BUFFER_SIZE 128
 static Widget
 xaw_create_text_field (widget_instance *instance)
 {
@@ -825,22 +848,36 @@
   Widget text = 0;
   widget_value* val = instance->info->val;
 
-  XtSetArg (al [ac], XtNsensitive, val->enabled && val->call_data);		ac++;
+  XtSetArg (al [ac], XtNsensitive, val->enabled);		ac++;
   XtSetArg (al [ac], XtNmappedWhenManaged, FALSE);	ac++;
   XtSetArg (al [ac], XtNhighlightThickness, (Dimension)0);	ac++;
   XtSetArg (al [ac], XtNtype, XawAsciiString);		ac++;
   XtSetArg (al [ac], XtNeditType, XawtextEdit);		ac++;
+  XtSetArg (al [ac], XtNuseStringInPlace, False);		ac++;
+#if 0
+  XtSetArg (al [ac], XtNlength, TEXT_BUFFER_SIZE);	ac++;
+#endif
+  if (val->value)
+    {
+      XtSetArg (al [ac], XtNstring, val->value);		ac++;
+    }
 
   /* add any args the user supplied for creation time */
   lw_add_value_args_to_args (val, al, &ac);
 
   text = XtCreateManagedWidget (val->name, asciiTextWidgetClass,
 				      instance->parent, al, ac);
+
+  /* add the callback */
+  if (val->call_data)
+    XtAddCallback (text, XtNgetValue, xaw_generic_callback, (XtPointer)instance);
+
   XtManageChild (text);
 
   return text;
 }
 #endif
+
 #endif /* LWLIB_WIDGETS_ATHENA */
 
 widget_creation_entry