suggestion: unique widget names on customized menus

Daverdo daverdo at comcast.net
Thu Sep 6 03:14:48 CEST 2007


Hello,

I am new to nedit.  It is an excellent editor.  I have been using my own 
Motif editor for over 10 years.  I was attracted nedit's syntax 
highlighting and tags support.  Nedit is a very intuitive editor.

I would like to make a suggestion.  I would like to change the 
background colors on the popup menu pushbuttons that I created.  
Unfortunately, they are all named "cmd".  A small change to userCmds.c 
will give each widget its own name, which will allow setting colors via 
a X resource file.

The code is below.  Basically, it uses the argument 'name' to 
createUserMenuItem() to create a name for XtVaCreateWidget(). The new 
function, create_widget_name(), will filter non-alpha/non-digit 
characters which may cause trouble in a resource file.

Opinions?

-David



/*
 * Create a widget name by taking alpha and digit characters
 * from name.
 */
static char *
create_widget_name(char *buffer, int size, const char *name)
{
    char *b = buffer;
   
    while (*name && (b - buffer) < size)
    {
        if (isalnum((int)*name) || *name == '_')
        {
            *b++ = *name;
        }
        name++;
    }
   
    *b = '\0';
   
    /* In case nothing is copied to buffer... */
    if (b == buffer)
    {
        strncpy(buffer, "cmd", size);
        buffer[size - 1] = '\0';
    }
   
    return buffer;
}

static Widget createUserMenuItem(Widget menuPane, char *name, 
menuItemRec *f,
    int index, XtCallbackProc cbRtn, XtPointer cbArg)
{
    XmString st1, st2;
    char accText[MAX_ACCEL_LEN];
    Widget btn;
    char name_buf[128];
   
    generateAcceleratorString(accText, f->modifiers, f->keysym);
    st1=XmStringCreateSimple(name);
    st2=XmStringCreateSimple(accText);
    btn = XtVaCreateWidget(
            create_widget_name(name_buf, sizeof(name_buf), name),
            xmPushButtonWidgetClass, menuPane,
            XmNlabelString, st1,
            XmNacceleratorText, st2,
            XmNmnemonic, f->mnemonic,
            XmNuserData, index+10, NULL);
    XtAddCallback(btn, XmNactivateCallback, cbRtn, cbArg);
    XmStringFree(st1);
    XmStringFree(st2);
    return btn;
}







More information about the Develop mailing list