May be this is not the way to submit a problem report, but I got lost with
sourceforge.net/bugs. I am thankful for either help with the problem,
or help with submitting it to the right place.
> "Tab" Problem
> =============
>
> 1. Problem Description
> ----------------------
> In a widget hierarchy we unmanage some widget which has children
> that are still managed. The unmanaged widget including its
> (possibly still managed) children disappears from our view
> which is what we want.
> But if we use "tab" to move through the fields, then the
> managed children of our unmanaged widget are still being
> tabbed through.
> I tested this on 386 lesstif-0.89.9-126 and lesstif-0.92.0-1.
> The commercial X versions on AIX, Solaris and HP tab only
> through visible fields.
>
> 2. Problem Category
> -------------------
> This problem falls into the category of behavior problems.
> It can easily be circumvented by using the pointing device
> to focus a specific field.
>
> 3. Sample Code
> --------------
> In order to show the problem I have created a sample program
> which has a toggle widget to manage/unmanage a scrolled
> text field. The application exhibiting this problem has a
> much more complex widget hierarchy and although it would be
> easy to fix my sample code, it is much more difficult to find
> a way around in a larger widget hierarchy.
>
> /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
> #include <Xm/Xm.h>
> #include <Xm/XmAll.h>
>
> void ChangeIndirect(Widget w, XtPointer client_data,
> XmToggleButtonCallbackStruct *call_data);
> void dumpWidgetTree(Widget w);
>
> Widget ParmShell, b_text;
>
> main (int argc, char **argv)
> {
> XtAppContext ParmApp;
> Widget PSform,
> b_indirect;
> XmString temp_string;
> int n;
> Arg args[20];
>
> /* Create the application */
> ParmShell = XtVaAppInitialize(&ParmApp, "Tab Test", NULL, 0,
> &argc, argv, NULL, NULL);
>
> /* Create the form */
> n=0;
> XtSetArg(args[n], XmNwidth, 300);n++;
> XtSetArg(args[n], XmNheight, 150);n++;
> PSform = XmCreateForm(ParmShell, "PSform", args, n);
> XtManageChild(PSform);
>
> /* Create the indirect toggle button */
> temp_string=XmStringLtoRCreate("Indirect", XmSTRING_DEFAULT_CHARSET);
> n=0;
> XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);n++;
> XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);n++;
> XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);n++;
> XtSetArg(args[n], XmNheight, 75);n++;
> XtSetArg(args[n], XmNlabelString, temp_string);n++;
> b_indirect = XmCreateToggleButton(PSform, "Toggle", args, n);
> XmStringFree(temp_string);
> XtAddCallback (b_indirect, XmNvalueChangedCallback,(void *)ChangeIndirect,
> NULL);
>
> XtManageChild(b_indirect);
>
> /* Create the intermediate destination text field */
> temp_string=XmStringLtoRCreate("Intermediate Dest", XmSTRING_DEFAULT_CHARSET);
> n=0;
> XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);n++;
> XtSetArg(args[n], XmNtopWidget, b_indirect);n++;
> XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);n++;
> XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);n++;
> XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);n++;
> XtSetArg(args[n], XmNlabelString, temp_string);n++;
> XtSetArg(args[n], XmNscrollVertical, False);n++;
> XtSetArg(args[n], XmNscrollHorizontal, False);n++;
> b_text = XmCreateScrolledText(PSform, "LabelIndirect", args, n);
> XmStringFree(temp_string);
> n=0;
> XtSetArg(args[n], XmNeditMode, XmSINGLE_LINE_EDIT);n++;
> XtSetValues(b_text,args,n);
> XtManageChild(b_text);
>
> XtRealizeWidget(ParmShell);
> dumpWidgetTree(ParmShell);
> XtAppMainLoop(ParmApp);
> }
>
> void ChangeIndirect(Widget w, XtPointer client_data,
> XmToggleButtonCallbackStruct *call_data)>
> {
> /* The parent is chosen on purpose to exhibit the problem */
> if (XtIsManaged(XtParent(b_text)))
> XtUnmanageChild(XtParent(b_text));
> else
> XtManageChild(XtParent(b_text));
> dumpWidgetTree(ParmShell);
> }
> /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
> /*******************************************************************************
> * dumpWidgetTree( Widget w )
> *
> * This function will recursively descend throught the Widget tree
> * and print the children and their pointer addresses.
> *
> * Jeremy Jameson 5/17/95
> *
> * Function added to debug LessTif port for Linux S/390. Found on
> * http://www.essi.fr/~buffa/cours/X11_Motif/motif-faq/part9/faq-doc-35.html
> * Heinz Sporri, 27 Jan 2001, modified to better print the tree.
> *
> *******************************************************************************/
>
> void dumpWidgetTree( Widget w )
> {
> WidgetList list = NULL;
> Cardinal num_children = 0;
> int i;
> static int n = 0;
> Widget child;
> XmNavigationType NavTyp;
> char TextNavigationType[5]="NTSEU";
> static char* indent =
> "-----------------------------------------------------------------------------";
> char tmp[256];
> int w_class;
>
> *tmp = 0;
> if ( n == 0 )
> {
> printf ( "Widget tree dump. Abbreviations in order of appearance:\n");
> printf ( " M: Mananged widget, m: Unmanaged widget\n");
> printf ( " T: Traversable, t: non traversable\n");
> printf ( " Navigation type: N NONE, T TAB, S STICKY, E EXCLUSIVE\n");
> printf ( " U Undefined for the widget\n");
> }
>
> if ( n >= strlen( indent ) +1 )
> {
> printf(
> "ERROR:Widget tree is too deep, not enough indent string ( < %d )!\n",
> n );
> n = 0;
> return;
> }
>
> strncpy( tmp, indent, n );
> tmp[n] = 0;
>
> XtVaGetValues(w,
> XmNnavigationType, &NavTyp,
> NULL);
> switch (NavTyp) {
> case XmNONE: i=0; break;
> case XmTAB_GROUP: i=1; break;
> case XmSTICKY_TAB_GROUP: i=2; break;
> case XmEXCLUSIVE_TAB_GROUP: i=3; break;
> default: i=4; break;
> }
> w_class = (int)XtClass(w);
>
> printf( "%s> %s %s %c %d wdgt %s - %#x, class %d",
> tmp,
> XtIsManaged(w) ? "M" : "m",
> XmIsTraversable(w) ? "T" : "t",
> TextNavigationType[i], NavTyp,
> XtName( w ), w, w_class );
>
> if ( ! XtIsComposite( w ) )
> {
> printf(
> " no children\n");
> return;
> }
>
> XtVaGetValues( w,
> XmNchildren, &list,
> XmNnumChildren, &num_children,
> NULL );
>
> printf( " %d %s\n",
> num_children, num_children == 1 ? "child" : "children" );
>
> for ( i = 1; i <= num_children; i++ )
> {
> child = list[i-1];
> n += 3;
> dumpWidgetTree( child );
>
> n -= 3;
> }
> }
> /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
>
>