/*ARGSUSED*/ static void CommandCallback( Widget w, /* unused */ XtPointer cl_data, XtPointer call_data ) { XmCommandWidget client_data = (XmCommandWidget) cl_data ; XmCommandCallbackStruct cb; char *str; /****************/ cb.reason = XmCR_COMMAND_CHANGED; cb.event = ((XmAnyCallbackStruct *) call_data)->event ; /* get char* string from text and convert to XmString type */ str = XmTextFieldGetString (client_data->selection_box.text); cb.value = XmStringGenerate(str, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL); XtFree (str); cb.length = XmStringLength (cb.value); XtCallCallbackList ((Widget) client_data, client_data->command.value_changed_callback, &cb); XmStringFree (cb.value); return ; }
/* ** Convert a compound string to a C style null terminated string. ** Returned string must be freed by the caller. */ char *GetXmStringText(XmString fromString) { XmStringContext context; char *text, *toPtr, *toString, *fromPtr; XmStringCharSet charset; XmStringDirection direction; Boolean separator; /* Malloc a buffer large enough to hold the string. XmStringLength should always be slightly longer than necessary, but won't be shorter than the equivalent null-terminated string */ toString = XtMalloc(XmStringLength(fromString)); /* loop over all of the segments in the string, copying each segment into the output string and converting separators into newlines */ XmStringInitContext(&context, fromString); toPtr = toString; while (XmStringGetNextSegment(context, &text, &charset, &direction, &separator)) { for (fromPtr=text; *fromPtr!='\0'; fromPtr++) *toPtr++ = *fromPtr; if (separator) *toPtr++ = '\n'; } /* terminate the string, free the context, and return the string */ *toPtr++ = '\0'; XmStringFreeContext(context); return toString; }
char* iupmotConvertString(XmString str) { XmStringContext context; char *text, *p, *buf; unsigned int length; XmStringComponentType type; if (!XmStringInitContext (&context, str)) return NULL; buf = iupStrGetMemory(XmStringLength(str)); /* always greatter than strlen */ /* p keeps a running pointer through buf as text is read */ p = buf; while ((type = XmStringGetNextTriple(context, &length, (XtPointer)&text)) != XmSTRING_COMPONENT_END) { switch (type) { case XmSTRING_COMPONENT_TEXT: memcpy(p, text, length); p += length; *p = 0; break; case XmSTRING_COMPONENT_TAB: *p++ = '\t'; *p = 0; break; case XmSTRING_COMPONENT_SEPARATOR: *p++ = '\n'; *p = 0; break; } XtFree(text); } XmStringFreeContext(context); return buf; }
/*ARGSUSED*/ void _XmCommandReturn( Widget wid, XEvent *event, String *params, /* unused */ Cardinal *numParams ) /* unused */ { XmCommandWidget w = (XmCommandWidget) wid ; XmCommandCallbackStruct cb; XmString tmpXmString; String tmpString; Arg argv[5] ; Cardinal argc ; int count ; /****************/ /* if an error has been sent to the history list, remove it now */ if (w->command.error) { XmListDeletePos (w->selection_box.list, 0); /* delete error msg */ XmListDeletePos (w->selection_box.list, 0); /* delete blank line */ w->command.error = FALSE; XmListSetBottomPos (w->selection_box.list, 0); } /* update the history: - get text, check null/empty */ /* - create XmString from text */ /* - increment local list count */ /* - add to history list */ /* - delete first element if too */ /* many items (maxItemCount) */ /* - position list to end */ /* - reset selection list ptr */ /* - reset command to "" */ tmpString = XmTextFieldGetString (w->selection_box.text); if ((tmpString == NULL) || (strcmp(tmpString, "") == 0)) { if (tmpString) XtFree(tmpString); return; } argc = 0 ; XtSetArg( argv[argc], XmNitemCount, &count) ; ++argc ; XtGetValues( SB_List( w), argv, argc) ; /* if already at max items, remove first item in list */ if (count >= w->command.history_max_items) { XmListDeletePos (w->selection_box.list, 1); if (w->selection_box.list_selected_item_position > 0) w->selection_box.list_selected_item_position--; } tmpXmString = XmStringGenerate(tmpString, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL); XmListAddItemUnselected (w->selection_box.list, tmpXmString, 0); XmListSetBottomPos (w->selection_box.list, 0); XmTextFieldSetString (w->selection_box.text, ""); /* call the users command entered callback */ cb.reason = XmCR_COMMAND_ENTERED; cb.event = event; cb.value = tmpXmString; cb.length = XmStringLength (tmpXmString); XtCallCallbackList ((Widget) w, w->command.callback, &cb); XmStringFree (tmpXmString); XtFree (tmpString); return ; }
/*ARGSUSED*/ static void ListCallback( Widget w, /* unused */ XtPointer client_data, XtPointer call_data ) { XmListCallbackStruct * listCB = (XmListCallbackStruct *) call_data ; XmCommandCallbackStruct cmdCB ; XmCommandWidget cmdWid = (XmCommandWidget) client_data ; char * text_value ; Arg argv[5] ; Cardinal argc ; int count ; XmString tmpXmString ; /*********** reset is not used ************ Boolean reset = FALSE ; ****************/ argc = 0 ; XtSetArg( argv[argc], XmNitemCount, &count) ; ++argc ; XtGetValues( SB_List( cmdWid), argv, argc) ; if( !count ) { return ; } if( cmdWid->command.error ) { if( (listCB->item_position == (count - 1)) || ( (listCB->item_position == count) && (listCB->reason != XmCR_DEFAULT_ACTION)) ) { /* Selection or default action on the blank line, or selection on * error message. Restore previous selection and return. */ XmListDeselectPos( SB_List( cmdWid), listCB->item_position) ; if( cmdWid->selection_box.list_selected_item_position ) { XmListSelectPos( SB_List( cmdWid), cmdWid->selection_box.list_selected_item_position, FALSE) ; } return ; } XmListDeletePos( SB_List( cmdWid), 0) ; /* Delete error message.*/ XmListDeletePos( SB_List( cmdWid), 0) ; /* Delete blank line.*/ cmdWid->command.error = FALSE ; if( count <= 2 ) { /* List only contained error message and blank line. */ cmdWid->selection_box.list_selected_item_position = 0 ; return ; } count -= 2 ; if( (listCB->item_position > count) && (listCB->reason == XmCR_DEFAULT_ACTION) ) { /* Default action on the error message line. Restore previous * selection, clear text area, and return. */ if( cmdWid->selection_box.list_selected_item_position ) { XmListSelectPos( SB_List( cmdWid), cmdWid->selection_box.list_selected_item_position, FALSE) ; } XmTextFieldSetString( cmdWid->selection_box.text, "") ; return ; } } if( listCB->reason == XmCR_DEFAULT_ACTION ) { /* If we are already at max items, remove first item. */ if( count >= cmdWid->command.history_max_items ) { XmListDeletePos( cmdWid->selection_box.list, 1) ; if( cmdWid->selection_box.list_selected_item_position > 0 ) { cmdWid->selection_box.list_selected_item_position-- ; } } tmpXmString = XmStringCopy( listCB->item) ; XmListAddItemUnselected( cmdWid->selection_box.list, tmpXmString, 0) ; XmListSetBottomPos( cmdWid->selection_box.list, 0) ; XmTextFieldSetString( cmdWid->selection_box.text, "") ; /* Call the users command entered callback. */ cmdCB.reason = XmCR_COMMAND_ENTERED ; cmdCB.event = NULL ; cmdCB.value = tmpXmString ; cmdCB.length = XmStringLength( tmpXmString) ; XtCallCallbackList( (Widget) cmdWid, cmdWid->command.callback, &cmdCB) ; XmStringFree( tmpXmString) ; } else /* listCB->reason is BROWSE_SELECT or SINGLE_SELECT */ { /* Update the text widget to relect the latest list selection. */ cmdWid->selection_box.list_selected_item_position = listCB->item_position ; if((text_value = _XmStringGetTextConcat( listCB->item)) != NULL) { XmTextFieldSetString( SB_Text( cmdWid), text_value) ; XmTextFieldSetInsertionPosition( SB_Text( cmdWid), XmTextFieldGetLastPosition( SB_Text( cmdWid))) ; XtFree( text_value) ; } } return ; }
static void _XmCommandCallback(Widget w, XtPointer client, XtPointer call) { XmCommandCallbackStruct cbs; XmAnyCallbackStruct *p = (XmAnyCallbackStruct *)call; XmListCallbackStruct *l = (XmListCallbackStruct *) call; XmCommandWidget cw = (XmCommandWidget)XtParent(w); char *t; if (client != C_ACT) cw = (XmCommandWidget)XtParent(XtParent(w)); DEBUGOUT(_LtDebug(__FILE__, (Widget)cw, "_XmCommandCallback [%s]\n", (client == C_ACT) ? "TextField Activate" : "List Selection")); /* * In the cases of TextField Activate and List DefaultAction, we need to * call a callback ourselves. * In the List SingleSelect case, just make the list item show up in * TextField. */ if (client == C_ACT) { cbs.reason = XmCR_COMMAND_ENTERED; cbs.event = p->event; t = XmTextFieldGetString(w); cbs.value = XmStringCreateSimple(t); cbs.length = (t == NULL) ? 0 : strlen(t); XtFree(t); XtCallCallbackList((Widget)cw, cw->command.callback, &cbs); } if (client == C_LIST_SELECT) { if (!XmStringGetLtoR(l->item, XmFONTLIST_DEFAULT_TAG, &t)) { return; } XmTextFieldSetString(SB_Text(cw), t); cbs.value = XmStringCreateSimple(t); XtFree(t); return; } if (client == C_LIST_DOUBLE) { cbs.reason = XmCR_COMMAND_ENTERED; cbs.event = l->event; cbs.value = l->item; cbs.length = XmStringLength(l->item); XtCallCallbackList((Widget)cw, cw->command.callback, &cbs); } /* If we have an error condition, remove it */ if (Com_Error(cw)) { Com_Error(cw) = False; XmListDeletePos(SB_List(cw), 0); } /* We need to blindly insert now. */ XmListAddItemUnselected(SB_List(cw), cbs.value, 0); /* 0 is at the end */ /* * If #items in list is larger than HistoryMaxItems, remove the first * This code will actually delete more than just the first item, in case * some sick programmer decides to manually cram more items in the list * than XmNhistoryMaxItems allows */ if (List_ItemCount(SB_List(cw)) > Com_HistoryMaxItems(cw)) { DEBUGOUT(_LtDebug(__FILE__, (Widget)cw, "_XmCommandCallback: List too long; removing %d items" " from list\n", List_ItemCount(SB_List(cw)) - Com_HistoryMaxItems(cw))); XmListDeleteItemsPos(SB_List(cw), List_ItemCount(SB_List(cw)) - Com_HistoryMaxItems(cw), 1); } if (client != C_LIST_DOUBLE) /* FIX ME - I think this is right ! */ { XmStringFree(cbs.value); } /* Clear the text field */ XmTextFieldSetString(SB_Text(cw), ""); }