#include	<string.h>
#include	<Xm/Text.h>
#include	<Xm/RowColumn.h>
#include	<Xm/PushB.h>

char *program_name;

char *ReadFile(char *filename);
void ResetWidth(Widget text);

int	main(int ac, char *av[])
{
    Widget top, text;
    char *contents;
    XtAppContext app;
    Arg	text_arg[] = {
	{ XmNeditMode, XmMULTI_LINE_EDIT },
	{ XmNrows, 25 },
	{ XmNcolumns, 80 },
    };

    program_name = strrchr(av[0], '/');
    if (!program_name)
	program_name = av[0];
    else
	program_name++;
    if (ac < 2) {
	fprintf(stderr, "usage: %s <file>.\n", program_name);
    	exit(1);
    }

    XtSetLanguageProc(NULL, NULL, NULL);
    top = XtAppInitialize(&app, "Sample", NULL, 0,
			  &ac, av, NULL, NULL, 0);
    text = XmCreateScrolledText(top, "text",
			text_arg, XtNumber(text_arg));
/*
    ResetWidth(text);
    */
    XtManageChild(text);

    contents = ReadFile(av[1]);
    if (!contents)
	exit(1);
    XmTextSetString(text, contents);
    XtFree(contents);

    XtRealizeWidget(top);
    XtAppMainLoop(app);
}

#include	<Xm/Text.h>
#include	<Xm/TextP.h>
#include	<Xm/TextF.h>
#include	<Xm/TextFP.h>

void
ResetWidth(Widget text)
{
    XmFontList fontlist;
    short cols;
    OutputData data;
    int width;
    static XmString xms = NULL;

    if (!xms)
	xms = XmStringCreate("0", XmFONTLIST_DEFAULT_TAG);
    XtVaGetValues(text,
		  XmNfontList, &fontlist,
		  NULL);
    width = XmStringWidth(fontlist, xms);

    printf("%d\n", width);
    data = ((XmTextRec *)text)->text.output->data;
    cols = data->columns;
    data->averagecharwidth = width;
    data->tabwidth = width * 8;
    XtVaSetValues(text,
		  XmNwidth,
		  width * cols + data->leftmargin + data->rightmargin,
		  NULL);
}

#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/stat.h>

char *
ReadFile(char *filename)
{
    struct stat st;
    FILE *fp;
    char *buf;

    stat(filename, &st);
    if (!(st.st_mode & S_IFREG)) {
    	fprintf(stderr, "%s: %s is not a regular file.\n",
		program_name, filename);
	return NULL;
    }
    fp = fopen(filename, "r");
    if (!fp) {
	fprintf(stderr, "%s: Can't open %s.",
		program_name, filename);
	return NULL;
    }
    buf = (char *)XtMalloc(st.st_size + 1);
    fread(buf, sizeof(char), st.st_size, fp);
    buf[st.st_size] = '\0';
    return buf;
}
