|
Packit |
b099d7 |
/* $XConsortium: list.c /main/5 1995/07/15 20:46:14 drk $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <Xm/XmP.h>
|
|
Packit |
b099d7 |
#include <Xm/CSText.h>
|
|
Packit |
b099d7 |
#include <Xm/TransferP.h>
|
|
Packit |
b099d7 |
#include <errno.h>
|
|
Packit |
b099d7 |
#include "transfer.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MAXT 100
|
|
Packit |
b099d7 |
#define DEFSTR "<Deferred>"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
extern TransferDataRec datums[];
|
|
Packit |
b099d7 |
extern unsigned int num_datums;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmString GetItemValue(Widget);
|
|
Packit |
b099d7 |
static char GetDisplayFormatFromType(Widget, Atom);
|
|
Packit |
b099d7 |
static void setFormatAndMenu(char);
|
|
Packit |
b099d7 |
static void SetDisplayTypeFromType(Widget, Atom);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean global_set_defer = False;
|
|
Packit |
b099d7 |
static Atom global_set_type_spec = None;
|
|
Packit |
b099d7 |
static char global_read_format_spec = 'S';
|
|
Packit |
b099d7 |
static XtPointer global_value = NULL;
|
|
Packit |
b099d7 |
static Atom global_type = None;
|
|
Packit |
b099d7 |
static unsigned long global_length = 0;
|
|
Packit |
b099d7 |
static int global_format = 8;
|
|
Packit |
b099d7 |
static Boolean global_deferred = False;
|
|
Packit |
b099d7 |
static int current_selected_item = -1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Atom type = None;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
SetType(Widget w, char *in, XtPointer ignore)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (strlen(in) == 0)
|
|
Packit |
b099d7 |
global_set_type_spec = XmeGetEncodingAtom(w);
|
|
Packit |
b099d7 |
else if (strcmp(in, "NONE") == 0)
|
|
Packit |
b099d7 |
global_set_type_spec = None;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
global_set_type_spec = XInternAtom(XtDisplay(w), in, False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*******************************************************************
|
|
Packit |
b099d7 |
* FindRightButton
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* picks the correct button for the type option menu to display
|
|
Packit |
b099d7 |
* note that the names are ATOMNAME_button, so it prepends a
|
|
Packit |
b099d7 |
* '*' in front and '_button' after the name before looking up
|
|
Packit |
b099d7 |
* the button.
|
|
Packit |
b099d7 |
******************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Widget
|
|
Packit |
b099d7 |
FindRightButton(char* atom_string)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char buffer[80];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
strcpy(buffer, "*b_");
|
|
Packit |
b099d7 |
strcat(buffer, atom_string);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(XtNameToWidget(toplevel, buffer));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
* ListSelectItem
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* this is called when the user selects an item in the list. It takes
|
|
Packit |
b099d7 |
* the type of the item and decides how to display it in the CSText
|
|
Packit |
b099d7 |
* widget
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
ListSelectItem(Widget w, XtPointer ignore, XmListCallbackStruct *listcb)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int index = listcb -> item_position;
|
|
Packit |
b099d7 |
Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
|
|
Packit |
b099d7 |
XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
|
|
Packit |
b099d7 |
XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
|
|
Packit |
b099d7 |
XA_MOTIF_CS = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_COMPOUND_STRING, False),
|
|
Packit |
b099d7 |
XA_MOTIF_RT = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_RENDER_TABLE, False);
|
|
Packit |
b099d7 |
Widget mem = (Widget) NULL;
|
|
Packit |
b099d7 |
char *targetname, *typename;
|
|
Packit |
b099d7 |
XmString output, tmp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (index < 1 || index > num_datums) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
index --;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
current_selected_item = index;
|
|
Packit |
b099d7 |
global_type = type = datums[index].type;
|
|
Packit |
b099d7 |
global_value = datums[index].value;
|
|
Packit |
b099d7 |
global_length = datums[index].length;
|
|
Packit |
b099d7 |
global_format = datums[index].format;
|
|
Packit |
b099d7 |
global_deferred = datums[index].deferred;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* We create a big string and then place the string into
|
|
Packit |
b099d7 |
the display field */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Target */
|
|
Packit |
b099d7 |
/* output = XmStringGenerate("Target: \t", NULL, NULL, NULL); */
|
|
Packit |
b099d7 |
output = XmStringCreateLocalized("Target: ");
|
|
Packit |
b099d7 |
targetname = GetSafeAtom(XtDisplay(w), datums[index].target);
|
|
Packit |
b099d7 |
if (targetname == NULL) targetname = XtNewString("Unknown");
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized(targetname);
|
|
Packit |
b099d7 |
XtFree(targetname);
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, tmp);
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, XmStringSeparatorCreate());
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Type */
|
|
Packit |
b099d7 |
/* tmp = XmStringGenerate("Type: \t", NULL, NULL, NULL); */
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized("Type: ");
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, tmp);
|
|
Packit |
b099d7 |
typename = GetSafeAtom(XtDisplay(w), datums[index].type);
|
|
Packit |
b099d7 |
if (typename == NULL) typename = XtNewString("Unknown");
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized(typename);
|
|
Packit |
b099d7 |
XtFree(typename);
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, tmp);
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, XmStringSeparatorCreate());
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Value display */
|
|
Packit |
b099d7 |
/* tmp = XmStringGenerate("Value: \t", NULL, NULL, NULL); */
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized("Value: ");
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, tmp);
|
|
Packit |
b099d7 |
tmp = GetItemValue(text_display);
|
|
Packit |
b099d7 |
output = XmStringConcatAndFree(output, tmp);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Put value into display */
|
|
Packit |
b099d7 |
XmCSTextSetString(text_display, output);
|
|
Packit |
b099d7 |
XmStringFree(output);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*********************************************************************
|
|
Packit |
b099d7 |
* EditItem
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This is called from the Properties or New menu item. If param
|
|
Packit |
b099d7 |
* is 0 then this is a new item.
|
|
Packit |
b099d7 |
*********************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
EditItem(Widget w, int param, XtPointer ignore)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int index = current_selected_item;
|
|
Packit |
b099d7 |
Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
|
|
Packit |
b099d7 |
XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
|
|
Packit |
b099d7 |
XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
|
|
Packit |
b099d7 |
XA_MOTIF_CS = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_COMPOUND_STRING, False),
|
|
Packit |
b099d7 |
XA_MOTIF_RT = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_RENDER_TABLE, False);
|
|
Packit |
b099d7 |
Widget mem = (Widget) NULL;
|
|
Packit |
b099d7 |
char *targetname;
|
|
Packit |
b099d7 |
XmString tmp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (index >= num_datums) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
global_type = type = datums[index].type;
|
|
Packit |
b099d7 |
global_value = datums[index].value;
|
|
Packit |
b099d7 |
global_length = datums[index].length;
|
|
Packit |
b099d7 |
global_format = datums[index].format;
|
|
Packit |
b099d7 |
global_deferred = datums[index].deferred;
|
|
Packit |
b099d7 |
global_set_defer = global_deferred;
|
|
Packit |
b099d7 |
global_set_type_spec = global_type;
|
|
Packit |
b099d7 |
global_read_format_spec = 'S';
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (param != 0) {
|
|
Packit |
b099d7 |
/* Put name of target into display field */
|
|
Packit |
b099d7 |
targetname = GetSafeAtom(XtDisplay(w), datums[index].target);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (targetname == NULL) targetname = XtNewString("Unknown");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized(targetname);
|
|
Packit |
b099d7 |
XmCSTextSetString(text2, tmp);
|
|
Packit |
b099d7 |
XmStringFree(tmp);
|
|
Packit |
b099d7 |
tmp = GetItemValue(text1);
|
|
Packit |
b099d7 |
XmCSTextSetString(text1, tmp);
|
|
Packit |
b099d7 |
XmStringFree(tmp);
|
|
Packit |
b099d7 |
XtFree(targetname);
|
|
Packit |
b099d7 |
SetDisplayTypeFromType(text1, global_type);
|
|
Packit |
b099d7 |
global_read_format_spec = GetDisplayFormatFromType(text1, global_type);
|
|
Packit |
b099d7 |
setFormatAndMenu(global_read_format_spec);
|
|
Packit |
b099d7 |
XmToggleButtonGadgetSetState(defer, global_deferred, False);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized("");
|
|
Packit |
b099d7 |
XmCSTextSetString(text1, tmp);
|
|
Packit |
b099d7 |
XmCSTextSetString(text2, tmp);
|
|
Packit |
b099d7 |
SetDisplayTypeFromType(text1, XA_STRING);
|
|
Packit |
b099d7 |
setFormatAndMenu('S');
|
|
Packit |
b099d7 |
XmToggleButtonGadgetSetState(defer, False, False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static char
|
|
Packit |
b099d7 |
GetDisplayFormatFromType(Widget w, Atom type)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
|
|
Packit |
b099d7 |
XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
|
|
Packit |
b099d7 |
XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
|
|
Packit |
b099d7 |
XA_MOTIF_CS = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_COMPOUND_STRING, False),
|
|
Packit |
b099d7 |
XA_MOTIF_RT = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_RENDER_TABLE, False);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (type == XA_ATOM ||
|
|
Packit |
b099d7 |
type == XInternAtom(XtDisplay(w), "ATOM_PAIR", False) ||
|
|
Packit |
b099d7 |
type == XA_INTEGER || type == XA_PIXEL ||
|
|
Packit |
b099d7 |
type == XInternAtom(XtDisplay(w), "SPAN", False)) {
|
|
Packit |
b099d7 |
return('D');
|
|
Packit |
b099d7 |
} else if (type == XA_STRING) {
|
|
Packit |
b099d7 |
return('S');
|
|
Packit |
b099d7 |
} else if (type == XA_COMPOUND_TEXT) {
|
|
Packit |
b099d7 |
return('T');
|
|
Packit |
b099d7 |
} else if (type == XA_LOCALE_TEXT) {
|
|
Packit |
b099d7 |
return('L');
|
|
Packit |
b099d7 |
} else if (type == XA_DRAWABLE || type == XA_WINDOW ||
|
|
Packit |
b099d7 |
type == XA_COLORMAP) {
|
|
Packit |
b099d7 |
return('H');
|
|
Packit |
b099d7 |
} else if (type == XA_MOTIF_CS) {
|
|
Packit |
b099d7 |
return('C');
|
|
Packit |
b099d7 |
} else if (type == XmeGetEncodingAtom(w)) {
|
|
Packit |
b099d7 |
return('L');
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
return('H');
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SetDisplayTypeFromType(Widget w, Atom type)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
|
|
Packit |
b099d7 |
XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
|
|
Packit |
b099d7 |
XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
|
|
Packit |
b099d7 |
XA_MOTIF_CS = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_COMPOUND_STRING, False),
|
|
Packit |
b099d7 |
XA_MOTIF_RT = XInternAtom(XtDisplay(w),
|
|
Packit |
b099d7 |
XmS_MOTIF_RENDER_TABLE, False);
|
|
Packit |
b099d7 |
Widget mem;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (type == XA_ATOM ||
|
|
Packit |
b099d7 |
type == XInternAtom(XtDisplay(w), "ATOM_PAIR", False)) {
|
|
Packit |
b099d7 |
char str[80];
|
|
Packit |
b099d7 |
mem = FindRightButton("ATOM");
|
|
Packit |
b099d7 |
} else if (type == XA_INTEGER || type == XA_PIXEL) {
|
|
Packit |
b099d7 |
if (type == XA_INTEGER)
|
|
Packit |
b099d7 |
mem = FindRightButton("INTEGER");
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
mem = FindRightButton("PIXEL");
|
|
Packit |
b099d7 |
} else if (type == XInternAtom(XtDisplay(w), "SPAN", False)) {
|
|
Packit |
b099d7 |
mem = FindRightButton("SPAN");
|
|
Packit |
b099d7 |
} else if (type == XA_STRING) {
|
|
Packit |
b099d7 |
mem = FindRightButton("STRING");
|
|
Packit |
b099d7 |
} else if (type == XA_COMPOUND_TEXT) {
|
|
Packit |
b099d7 |
char *str;
|
|
Packit |
b099d7 |
mem = FindRightButton("COMPOUND_TEXT");
|
|
Packit |
b099d7 |
} else if (type == XA_LOCALE_TEXT) {
|
|
Packit |
b099d7 |
mem = FindRightButton("LOCALE_TEXT");
|
|
Packit |
b099d7 |
} else if (type == XA_DRAWABLE || type == XA_WINDOW ||
|
|
Packit |
b099d7 |
type == XA_COLORMAP) {
|
|
Packit |
b099d7 |
if (type == XA_DRAWABLE)
|
|
Packit |
b099d7 |
mem = FindRightButton("DRAWABLE");
|
|
Packit |
b099d7 |
else if (type == XA_COLORMAP)
|
|
Packit |
b099d7 |
mem = FindRightButton("COLORMAP");
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
mem = FindRightButton("WINDOW");
|
|
Packit |
b099d7 |
} else if (type == XA_MOTIF_CS) {
|
|
Packit |
b099d7 |
mem = FindRightButton("_MOTIF_COMPOUND_STRING");
|
|
Packit |
b099d7 |
} else if (type == XmeGetEncodingAtom(w)) {
|
|
Packit |
b099d7 |
mem = FindRightButton("LOCALE");
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
char *typestring;
|
|
Packit |
b099d7 |
char buffer[80];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
mem = FindRightButton("unknown");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typestring = GetSafeAtom(XtDisplay(w), type);
|
|
Packit |
b099d7 |
sprintf(buffer, "Unknown type %s (%d) found", typestring, type);
|
|
Packit |
b099d7 |
XFree(typestring);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (mem != (Widget) NULL)
|
|
Packit |
b099d7 |
XtVaSetValues(typeOM, XmNmenuHistory, mem, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
setFormatAndMenu(char in)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget mem = (Widget) NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (in == 'S') {
|
|
Packit |
b099d7 |
/* C String display */
|
|
Packit |
b099d7 |
mem = format_s;
|
|
Packit |
b099d7 |
} else if (in == 'L') {
|
|
Packit |
b099d7 |
/* Locale Text display */
|
|
Packit |
b099d7 |
mem = format_l;
|
|
Packit |
b099d7 |
} else if (in == 'T') {
|
|
Packit |
b099d7 |
/* Compound Text display */
|
|
Packit |
b099d7 |
mem = format_t;
|
|
Packit |
b099d7 |
} else if (in == 'C') {
|
|
Packit |
b099d7 |
/* Compound String display */
|
|
Packit |
b099d7 |
mem = format_cs;
|
|
Packit |
b099d7 |
} else if (in == 'D') {
|
|
Packit |
b099d7 |
/* Decimal display */
|
|
Packit |
b099d7 |
mem = format_id;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* Hex display */
|
|
Packit |
b099d7 |
mem = format_ih;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SetFormat(NULL, in, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (mem != (Widget) NULL)
|
|
Packit |
b099d7 |
XtVaSetValues(format_om, XmNmenuHistory, mem, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
char *output_buffer = NULL;
|
|
Packit |
b099d7 |
int output_buffer_max = 0;
|
|
Packit |
b099d7 |
int output_buffer_current = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void ClearOB()
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
output_buffer_current = 0;
|
|
Packit |
b099d7 |
if (output_buffer_max > 0)
|
|
Packit |
b099d7 |
output_buffer[0] = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
AppendOB(char *str)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int len;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
len = strlen(str);
|
|
Packit |
b099d7 |
while(len + output_buffer_current > output_buffer_max) {
|
|
Packit |
b099d7 |
if (output_buffer_max == 0) {
|
|
Packit |
b099d7 |
output_buffer_max = 256;
|
|
Packit |
b099d7 |
output_buffer = XtMalloc(output_buffer_max);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
output_buffer_max *= 2;
|
|
Packit |
b099d7 |
output_buffer = XtRealloc(output_buffer, output_buffer_max);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copy data */
|
|
Packit |
b099d7 |
for(i = 0; i <= len; i++)
|
|
Packit |
b099d7 |
output_buffer[output_buffer_current + i] = str[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Update end pointer */
|
|
Packit |
b099d7 |
output_buffer_current += len;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
SetFormat(Widget w, char in, XtPointer ignore)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int byte_length;
|
|
Packit |
b099d7 |
XmString strtmp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
global_read_format_spec = in;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static
|
|
Packit |
b099d7 |
XmString GetItemValue(Widget w)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int byte_length;
|
|
Packit |
b099d7 |
XmString strtmp;
|
|
Packit |
b099d7 |
char in;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
byte_length = global_length * global_format / 8;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
in = GetDisplayFormatFromType(w, global_type);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (in == 'S') {
|
|
Packit |
b099d7 |
/* C String display */
|
|
Packit |
b099d7 |
strtmp = XmStringCreateLocalized(global_value);
|
|
Packit |
b099d7 |
} else if (in == 'L') {
|
|
Packit |
b099d7 |
/* Locale Text display */
|
|
Packit |
b099d7 |
strtmp = XmStringCreateLocalized(global_value);
|
|
Packit |
b099d7 |
} else if (in == 'T') {
|
|
Packit |
b099d7 |
/* Compound Text display */
|
|
Packit |
b099d7 |
strtmp = XmCvtCTToXmString(global_value);
|
|
Packit |
b099d7 |
} else if (in == 'C') {
|
|
Packit |
b099d7 |
/* Compound String display */
|
|
Packit |
b099d7 |
strtmp = XmCvtByteStreamToXmString(global_value);
|
|
Packit |
b099d7 |
} else if (in == 'D') {
|
|
Packit |
b099d7 |
/* Decimal display */
|
|
Packit |
b099d7 |
int count, i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = byte_length / 4;
|
|
Packit |
b099d7 |
ClearOB();
|
|
Packit |
b099d7 |
for(i = 0; i < count; i++) {
|
|
Packit |
b099d7 |
char buf[32];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sprintf(buf, "%d ", ((int *) global_value)[i]);
|
|
Packit |
b099d7 |
AppendOB(buf);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
strtmp = XmStringCreateLocalized(output_buffer);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* Decimal display */
|
|
Packit |
b099d7 |
int count, i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = byte_length / 4;
|
|
Packit |
b099d7 |
ClearOB();
|
|
Packit |
b099d7 |
for(i = 0; i < count; i++) {
|
|
Packit |
b099d7 |
char buf[32];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sprintf(buf, "0x%x ", ((int *) global_value)[i]);
|
|
Packit |
b099d7 |
AppendOB(buf);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
strtmp = XmStringCreateLocalized(output_buffer);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(strtmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*******************************************************************
|
|
Packit |
b099d7 |
* SetValue
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* No, it's not a widget method. This SetValue implements an action
|
|
Packit |
b099d7 |
* which takes the current value in the interface and stores it away
|
|
Packit |
b099d7 |
* for that particular target. This allows arbitrary data to be stored
|
|
Packit |
b099d7 |
* into the data array for later transfer.
|
|
Packit |
b099d7 |
*******************************************************************/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
SetValue(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmString value;
|
|
Packit |
b099d7 |
XmString target_name;
|
|
Packit |
b099d7 |
char *type_widget_name;
|
|
Packit |
b099d7 |
char *display_format_widget_name;
|
|
Packit |
b099d7 |
char *target_string;
|
|
Packit |
b099d7 |
Widget mem_history;
|
|
Packit |
b099d7 |
Arg args[1];
|
|
Packit |
b099d7 |
int index;
|
|
Packit |
b099d7 |
int base;
|
|
Packit |
b099d7 |
Atom target;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
target_name = XmCSTextGetString(text2);
|
|
Packit |
b099d7 |
value = XmCSTextGetString(text1);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (global_set_type_spec == None) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get the target string from the XmString */
|
|
Packit |
b099d7 |
target_string = ConvertXmStringToString(target_name);
|
|
Packit |
b099d7 |
target = XInternAtom(XtDisplay(widget), target_string, False);
|
|
Packit |
b099d7 |
XtFree(target_string);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Find the index of this target, or add it to the end */
|
|
Packit |
b099d7 |
for(index = 0; index < num_datums; index++)
|
|
Packit |
b099d7 |
if (datums[index].target == target) break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Add to the end, if this is a new target */
|
|
Packit |
b099d7 |
if (index == num_datums) {
|
|
Packit |
b099d7 |
XmListAddItemUnselected(list, target_name, 0);
|
|
Packit |
b099d7 |
datums[index].target = target;
|
|
Packit |
b099d7 |
num_datums++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Handle deferred */
|
|
Packit |
b099d7 |
if (datums[index].deferred != global_set_defer) {
|
|
Packit |
b099d7 |
XmString new_item[1];
|
|
Packit |
b099d7 |
datums[index].deferred = global_set_defer;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (datums[index].deferred) {
|
|
Packit |
b099d7 |
char *buffer;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
buffer = XtMalloc(strlen(target_string) + 2 + strlen(DEFSTR));
|
|
Packit |
b099d7 |
strcpy(buffer, target_string);
|
|
Packit |
b099d7 |
strcat(buffer, "\t");
|
|
Packit |
b099d7 |
strcat(buffer, DEFSTR);
|
|
Packit |
b099d7 |
new_item[0] = XmStringGenerate(buffer, NULL, XmCHARSET_TEXT, NULL);
|
|
Packit |
b099d7 |
XtFree(buffer);
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
new_item[0] = XmStringCopy(target_name);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmListReplaceItemsPos(list, new_item, 1, index + 1);
|
|
Packit |
b099d7 |
XmListSelectPos(list, index + 1, False);
|
|
Packit |
b099d7 |
XmStringFree(new_item[0]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
datums[index].type = global_set_type_spec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Convert the value */
|
|
Packit |
b099d7 |
if (global_read_format_spec == 'S') {
|
|
Packit |
b099d7 |
datums[index].value = ConvertXmStringToString(value);
|
|
Packit |
b099d7 |
if (datums[index].value != NULL) {
|
|
Packit |
b099d7 |
datums[index].length = strlen(datums[index].value);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
datums[index].length = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
datums[index].format = 8;
|
|
Packit |
b099d7 |
} else if (global_read_format_spec == 'L') {
|
|
Packit |
b099d7 |
char *ctext;
|
|
Packit |
b099d7 |
char *ltext = NULL;
|
|
Packit |
b099d7 |
Atom COMPOUND_TEXT = XInternAtom(XtDisplay(widget),
|
|
Packit |
b099d7 |
XmSCOMPOUND_TEXT, False);
|
|
Packit |
b099d7 |
XTextProperty text_prop;
|
|
Packit |
b099d7 |
int status;
|
|
Packit |
b099d7 |
char ** values;
|
|
Packit |
b099d7 |
int num_values = 0;
|
|
Packit |
b099d7 |
int malloc_size = 0;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ctext = XmCvtXmStringToCT(value);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
text_prop.value = (unsigned char *) ctext;
|
|
Packit |
b099d7 |
text_prop.encoding = COMPOUND_TEXT;
|
|
Packit |
b099d7 |
text_prop.format = 8;
|
|
Packit |
b099d7 |
text_prop.nitems = strlen(ctext);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
status = XmbTextPropertyToTextList(XtDisplay(widget), &text_prop, &values,
|
|
Packit |
b099d7 |
&num_values);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree(ctext);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_values) {
|
|
Packit |
b099d7 |
for (i = 0; i < num_values ; i++)
|
|
Packit |
b099d7 |
malloc_size += strlen(values[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ltext = XtMalloc ((unsigned) malloc_size + 1);
|
|
Packit |
b099d7 |
ltext[0] = '\0';
|
|
Packit |
b099d7 |
for (i = 0; i < num_values ; i++)
|
|
Packit |
b099d7 |
strcat(ltext, values[i]);
|
|
Packit |
b099d7 |
XFreeStringList(values);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
ltext = XtNewString("");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
datums[index].value = ltext;
|
|
Packit |
b099d7 |
datums[index].length = malloc_size;
|
|
Packit |
b099d7 |
datums[index].format = 8;
|
|
Packit |
b099d7 |
} else if (global_read_format_spec == 'T') {
|
|
Packit |
b099d7 |
datums[index].value = XmCvtXmStringToCT(value);
|
|
Packit |
b099d7 |
if (datums[index].value != NULL) {
|
|
Packit |
b099d7 |
datums[index].length = strlen(datums[index].value);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
datums[index].length = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
datums[index].format = 8;
|
|
Packit |
b099d7 |
} else if (global_read_format_spec == 'C') {
|
|
Packit |
b099d7 |
datums[index].length =
|
|
Packit |
b099d7 |
XmCvtXmStringToByteStream(value,
|
|
Packit |
b099d7 |
(unsigned char **) &datums[index].value);
|
|
Packit |
b099d7 |
datums[index].format = 8;
|
|
Packit |
b099d7 |
} else if (global_read_format_spec == 'D' ||
|
|
Packit |
b099d7 |
global_read_format_spec == 'H') {
|
|
Packit |
b099d7 |
/* Doesn't matter, the numbers contain the base information.
|
|
Packit |
b099d7 |
We assume a string with whitespace separating the values. */
|
|
Packit |
b099d7 |
int max_values = 5;
|
|
Packit |
b099d7 |
long *array = (long *) XtMalloc(sizeof(long) * max_values);
|
|
Packit |
b099d7 |
int count = 0;
|
|
Packit |
b099d7 |
char *convert;
|
|
Packit |
b099d7 |
char *current;
|
|
Packit |
b099d7 |
char *end;
|
|
Packit |
b099d7 |
Boolean done = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
convert = ConvertXmStringToString(value);
|
|
Packit |
b099d7 |
current = convert;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (global_read_format_spec == 'H')
|
|
Packit |
b099d7 |
base = 16;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
base = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
while(! done) {
|
|
Packit |
b099d7 |
/* Realloc array if getting too big */
|
|
Packit |
b099d7 |
if (count >= max_values) {
|
|
Packit |
b099d7 |
max_values += 5;
|
|
Packit |
b099d7 |
array = (long *) XtRealloc((char*) array, sizeof(long) * max_values);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (current == 0) break;
|
|
Packit |
b099d7 |
/* Now grab the next number */
|
|
Packit |
b099d7 |
array[count++] = strtol(current, &end, base);
|
|
Packit |
b099d7 |
if (current == end || errno == ERANGE) {
|
|
Packit |
b099d7 |
done = True;
|
|
Packit |
b099d7 |
count--;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
current = end;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
datums[index].value = (XtPointer) array;
|
|
Packit |
b099d7 |
datums[index].length = count;
|
|
Packit |
b099d7 |
datums[index].format = 32;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringFree(target_name);
|
|
Packit |
b099d7 |
XmStringFree(value);
|
|
Packit |
b099d7 |
XmListSelectPos(list, index + 1, True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*******************************************************************
|
|
Packit |
b099d7 |
* RemoveValue
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This removes an element from the data array.
|
|
Packit |
b099d7 |
*******************************************************************/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
RemoveValue(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (current_selected_item < 0 ||
|
|
Packit |
b099d7 |
current_selected_item >= num_datums) {
|
|
Packit |
b099d7 |
XBell(XtDisplay(widget), 100);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Free current value pointed at */
|
|
Packit |
b099d7 |
XtFree(datums[current_selected_item].value);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
num_datums--;
|
|
Packit |
b099d7 |
/* Remove item from internal list */
|
|
Packit |
b099d7 |
for(i = current_selected_item; i < num_datums; i++)
|
|
Packit |
b099d7 |
datums[i] = datums[i + 1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Remove from screen display */
|
|
Packit |
b099d7 |
XmListDeletePos(list, current_selected_item + 1);
|
|
Packit |
b099d7 |
/* Now update the display with the new value */
|
|
Packit |
b099d7 |
if (current_selected_item < num_datums)
|
|
Packit |
b099d7 |
XmListSelectPos(list, current_selected_item + 1, True);
|
|
Packit |
b099d7 |
else if (num_datums > 0)
|
|
Packit |
b099d7 |
XmListSelectPos(list, current_selected_item, True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
deferCB(Widget widget, char *ignore,
|
|
Packit |
b099d7 |
XmToggleButtonCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char *targetname;
|
|
Packit |
b099d7 |
XmString new_item[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
global_set_defer = callback_data -> set;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmParseMapping table[2];
|
|
Packit |
b099d7 |
int table_size = -1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
char*
|
|
Packit |
b099d7 |
ConvertXmStringToString(XmString xmstr)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char *rvalue;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (table_size < 0) {
|
|
Packit |
b099d7 |
XmString tmp;
|
|
Packit |
b099d7 |
int nargs;
|
|
Packit |
b099d7 |
Arg args[10];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
table_size = 0;
|
|
Packit |
b099d7 |
tmp = XmStringComponentCreate(XmSTRING_COMPONENT_TAB, 0, NULL);
|
|
Packit |
b099d7 |
nargs = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[nargs], XmNincludeStatus, XmINSERT), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(args[nargs], XmNsubstitute, tmp), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(args[nargs], XmNpattern, "\t"), nargs++;
|
|
Packit |
b099d7 |
table[table_size++] = XmParseMappingCreate(args, nargs);
|
|
Packit |
b099d7 |
XmStringFree(tmp);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp = XmStringSeparatorCreate();
|
|
Packit |
b099d7 |
nargs = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[nargs], XmNincludeStatus, XmINSERT), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(args[nargs], XmNsubstitute, tmp), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(args[nargs], XmNpattern, "\n"), nargs++;
|
|
Packit |
b099d7 |
table[table_size++] = XmParseMappingCreate(args, nargs);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringFree(tmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
rvalue = (char *) XmStringUnparse(xmstr, NULL,
|
|
Packit |
b099d7 |
XmMULTIBYTE_TEXT, XmMULTIBYTE_TEXT,
|
|
Packit |
b099d7 |
table, table_size, XmOUTPUT_ALL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(rvalue);
|
|
Packit |
b099d7 |
}
|