[comp.windows.x] Picture fields and Text Widgets

argv@turnpike.Eng.Sun.COM (Dan Heller) (11/30/90)

In article emuleomo@paul.rutgers.edu (Emuleomo) writes:
> Hi Xworld,
interesting thought :-)

> I need the ability to force every letter typed into a text widget to 
> UPPERCASE or force the text widget to accept only digits 0-9, or to coerce
> data entry to be a telephone number in the style (999) 999-9999 etc..
> I need this to be done AS THE USER ENTERS THE DIGITS. So that the user
> can enter 8005551212 and it will appear as (800) 555-1212.
> Can this be done?

    text_w = XtVaCreateManagedWidget("name", xmTextWidgetClass, parent,
	XmNverifyBell, False,  /* shouldn't this be the default? */
	... /* fill in other resource-values here */
	NULL);
    ...
    XtAddCallback(text_w, XmNmodifyVerifyCallback, my_func, "data");
    ...

void
my_func(text_w, data, cbs)
Widget  textsw;
int *file_saved;
XmTextVerifyCallbackStruct *cbs;
{
    char c;

    if (cbs->reason == XmCR_MODIFYING_TEXT_VALUE) {
	c = cbs->text->ptr[0];
	if (isupper(c))
	    cbs->doit = True; /* already upper case, let it go */
	else {
	    /* don't let the text widget do this one - we'll handle it */ 
	    cbs->doit = False;
	    XmTextInsert(text_w, cbs->currInsert, toupper(c));
	}
    }
}

You can figure out the rest.  Note, #include <ctype.h> for the
isupper() and toupper() macros.

> Please E-mail.
stay tuned to the newsgroup :-)
--
dan
----------------------------------------------------
O'Reilly && Associates   argv@sun.com / argv@ora.com
Opinions expressed reflect those of the author only.