hiebeler@TURING.CS.RPI.EDU (Dave Hiebeler) (04/20/89)
Here is a small program to demonstrate the problem with
backing_store. I pretty much cut away everything except
the bare minimum, although there are still probably a few
things in there that don't need to be.
I hope this problem is reproducable. If it only happens on the
server here at RPI, well, the sysadmin probably won't be terribly
happy about that.
If someone runs this on a Sun 3/50 running SunOS 3.5 and X11R3,
I'd like to know if it works (and also whether or not the 2 lines
if (!pWin->firstChild)
return;
are in .../server/dix/window.c at the beginning of UnmapSubwindows().
/*
* demo.c
*
* On a Sun 3/50 running SunOS 3.5, this works on an X11R3 server
* that has not had the "fix2" patch to window.c installed, but
* does not work on a server which has had "fix2" installed.
* The symptoms are that when you scroll part of the image away,
* then scroll it back, the image is erased (until you click on
* the redraw button).
*
* Click on the redraw button to generate the original image.
*
* compile with:
* cc -g demo.c -o demo -lXaw -lXmu -lXt -lX11
*
*/
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Box.h>
#include <X11/Command.h>
#include <X11/Scroll.h>
#include <X11/Viewport.h>
#include <stdio.h>
#include <sys/types.h>
#define XSIZE 1152
#define YSIZE 900
#define NODE_SIZE 48
Window draw_window;
GC graphics_context, inverse_graphics_context, line_gc;
XFontStruct *myfont;
Font myFont;
XColor black, white;
Display *display;
Widget
control_rootwidget, /* top level control-panel widget */
control_box, /* main box with important buttons */
quit_widget,
redraw_widget,
draw_rootwidget, /* top level drawing-area widget */
draw_viewport,
draw_box; /* box to draw stuff in */
void quit_proc(), network_proc(), init_control_box(), init_draw_box(),
redraw_proc(), draw_line();
void
quit(s)
char *s;
{
fprintf(stderr,"%s\n",s);
exit(1);
}
main(argc, argv)
int argc;
char **argv;
{
Arg args[10], /* generic argument list */
get_args[10]; /* used to get argument lists */
XGCValues xgcvals; /* GC values */
Colormap cmap;
XSetWindowAttributes attributes[1];
/* Start up top level stuff */
control_rootwidget = XtInitialize(argv[0],"demo",NULL,0,&argc,argv);
display = XtDisplay(control_rootwidget);
/* Get the font for drawing */
myFont = XLoadFont(display,"9x15");
draw_rootwidget = XtCreateApplicationShell("Xmessenger.draw",
topLevelShellWidgetClass,
NULL,0);
/* Set up default colors */
cmap = DefaultColormap(display,DefaultScreen(display));
XParseColor(display,cmap,"White",&white);
XParseColor(display,cmap,"Black",&black);
XAllocColor(display,cmap,&white);
XAllocColor(display,cmap,&black);
xgcvals.foreground = black.pixel;
xgcvals.background = white.pixel;
graphics_context = XtGetGC(control_rootwidget,GCForeground|GCBackground,
&xgcvals);
xgcvals.foreground = white.pixel;
xgcvals.background = black.pixel;
inverse_graphics_context = XtGetGC(control_rootwidget,
GCForeground|GCBackground,
&xgcvals);
xgcvals.foreground = black.pixel;
xgcvals.background = white.pixel;
line_gc = XtGetGC(control_rootwidget,GCForeground|GCBackground,
&xgcvals);
init_control_box();
init_draw_box();
/* Ok, let's realize the main toplevel stuff and start looping */
XtRealizeWidget(control_rootwidget);
XtRealizeWidget(draw_rootwidget);
/* Set backing_store on the draw_box */
attributes[0].backing_store = Always;
XChangeWindowAttributes(display,XtWindow(draw_box),
CWBackingStore,attributes);
draw_window = XtWindow(draw_box);
XtMainLoop();
}
void
init_control_box()
{
Arg args[10], get_args[10];
/* Start creating the stuff in the main control-box */
XtSetArg(args[0],XtNwidth,(XtArgVal)110);
XtSetArg(args[1],XtNheight,(XtArgVal)40);
control_box = XtCreateManagedWidget("control_box",compositeWidgetClass,
control_rootwidget,args,2);
XtSetArg(args[0],XtNx,(XtArgVal)5);
XtSetArg(args[1],XtNy,(XtArgVal)5);
XtSetArg(args[2],XtNforeground,(XtArgVal)0);
XtSetArg(args[3],XtNbackground,(XtArgVal)1);
quit_widget = XtCreateManagedWidget("quit",commandWidgetClass,
control_box,args,4);
XtAddCallback(quit_widget,XtNcallback,quit_proc,NULL);
XtSetArg(get_args[0],XtNwidth,0);
XtGetValues(quit_widget,get_args,1);
XtSetArg(args[0],XtNx,(XtArgVal)get_args[0].value+10);
XtSetArg(args[1],XtNy,(XtArgVal)5);
redraw_widget = XtCreateManagedWidget("redraw",commandWidgetClass,
control_box,args,2);
XtAddCallback(redraw_widget,XtNcallback,redraw_proc,NULL);
}
void
init_draw_box()
{
Arg args[10], get_args[10];
/* Now for the drawing viewport */
XtSetArg(args[0],XtNheight,(XtArgVal)500);
XtSetArg(args[1],XtNwidth,(XtArgVal)500);
XtSetArg(args[2],XtNallowHoriz,(XtArgVal)True);
XtSetArg(args[3],XtNallowVert,(XtArgVal)True);
draw_viewport = XtCreateManagedWidget("draw_viewport",
viewportWidgetClass,
draw_rootwidget, args, 4);
/* Then, the drawing box */
XtSetArg(args[0],XtNwidth,(XtArgVal)XSIZE);
XtSetArg(args[1],XtNheight,(XtArgVal)YSIZE);
draw_box = XtCreateManagedWidget("draw_box",boxWidgetClass,
draw_viewport,args,3);
}
void
redraw_proc()
{
int y;
for (y=0; y<880; y += 20)
draw_line(10,y,1000,y);
}
void
draw_line(x0,y0,x1,y1)
int x0,y0,x1,y1;
{
XDrawLine(XtDisplay(draw_rootwidget),draw_window,
graphics_context,x0,y0,x1,y1);
}
void
quit_proc(w,a,b)
Widget w;
caddr_t a,b;
{
exit(0);
}