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; > } > } > /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ > >