[comp.windows.x] viewport widget bug?

rusty@BOSCO.BERKELEY.EDU (04/15/88)

I can't seem to get a 1 line ascii text widget to work.  It mostly
works except when I use the return key then things get screwed up.
Try compiling the following program and then fiddle the scroll bar and
watch the value show up in the text window above.  You can also type
something directly into the text window.  Then type a return into the
text window and then fiddle the scroll bar again.  Not so good.  Am I
doing something wrong or is this a bug?


# include <X11/Intrinsic.h>
# include <X11/StringDefs.h>
# include <X11/AsciiText.h>
# include <X11/Scroll.h>
# include <X11/Form.h>
# include <stdio.h>

/* BEGIN BUG */
/*
 * the following should have been in Text.h but
 * it only appears in TextP.h
 */
typedef struct {
	int	firstPos;
	int	length;
	char	*ptr;
	Atom	format;
} XtTextBlock, *XtTextBlockPtr;
/* END BUG */

# define THUMB_WIDTH	50
# define TEXT_LEN	6

static Widget		thumb_text;

static char		thumb_text_buf[128];

static Arg		thumb_scroll_args[] = {
	{ XtNorientation,	(XtArgVal) XtorientHorizontal },
	{ XtNlength,		(XtArgVal) THUMB_WIDTH },
	{ XtNvertDistance,	(XtArgVal) 0 }
};

static Arg		thumb_text_args[] = {
	{ XtNstring,		(XtArgVal) thumb_text_buf },
	{ XtNeditType,		(XtArgVal) XttextEdit },
	{ XtNlength,		(XtArgVal) TEXT_LEN },
	{ XtNwidth,		(XtArgVal) THUMB_WIDTH },
};

static void
thumb_proc(w, closure, top)
	Widget		w;
	caddr_t		closure;
	float		top;
{
	char			buf[128];
	XtTextPosition		end;
	XtTextBlock		text;

	end = strlen(thumb_text_buf);
	sprintf(buf, "%d", (int) (top * 1000.0));
	text.ptr = &buf[0];
	text.length = strlen(buf);
	text.firstPos = 0;

	XtTextReplace(thumb_text, (XtTextPosition) 0, end, &text);
}

main(argc, argv)
	int		argc;
	char		**argv;
{
	Widget		top_shell;
	Widget		thumb_form;
	Widget		thumb_scroll;
	Arg		arg;

	top_shell = XtInitialize(NULL, "xsetq", NULL, 0, &argc, argv );
	if (argc != 1)
		syntax();

	thumb_form = XtCreateManagedWidget("form", formWidgetClass,
					   top_shell,
					   (ArgList) NULL, 0);

	thumb_text = XtCreateManagedWidget("text", asciiStringWidgetClass,
					   thumb_form,
					   (ArgList) thumb_text_args,
					   XtNumber(thumb_text_args));

	thumb_scroll = XtCreateManagedWidget("scrollbar", scrollbarWidgetClass,
					     thumb_form,
					     (ArgList) thumb_scroll_args,
					     XtNumber(thumb_scroll_args));
	XtAddCallback(thumb_scroll, XtNthumbProc, thumb_proc, (caddr_t) NULL);
	XtSetArg(arg, XtNfromVert, thumb_text);
	XtSetValues(thumb_scroll, &arg, 1);

	XtRealizeWidget(top_shell);
	XtMainLoop();
}

syntax() {
	fprintf(stderr, "usage: text_bug\n");
	exit(1);
}

swick@ATHENA.MIT.EDU (Ralph R. Swick) (04/22/88)

As currently implemented, the text widget is always willing to
scroll vertically, regardless of it's height.  I am planning to
add a parameter to control this.

If you type ^P or resize your shell vertically, you will see
the text again.