hrp@boring.cray.com (Hal Peterson) (07/28/89)
That's quick. I got this message from Peter Phillips in response to
my question about the getchar in x_open:
Return-Path: <pphillip@cs.ubc.ca>
Date: 25 Jul 89 17:03 -0700
From: Peter Phillips <pphillip@cs.ubc.ca>
To: Hal Peterson <hrp@cray.com>
Subject: getchar in x open: superfluous?
In gnu.ghostscript.bug, you wrote:
[my query deleted. -hrp]
The problem was explained by Dana Chee in comp.windows.x:
>Article 10377 of comp.windows.x:
>Path: ubc-cs!uw-beaver!cornell!mailrus!tut.cis.ohio-state.edu!unmvax!deimos.cis.ksu.edu!rutgers!bellcore!dana
>From: dana@dino.bellcore.com (Dana A. Chee)
>Newsgroups: comp.windows.x
>Subject: Re: Simple programming quiz
>Message-ID: <DANA.89Jun15063723@dino.bellcore.com>
>Date: 15 Jun 89 10:37:23 GMT
>References: <29675@ucbvax.BERKELEY.EDU>
>Sender: news@bellcore.bellcore.com
>Organization: Bellcore, Morristown, NJ USA
>Lines: 78
>In-reply-to: elf@gilan.Berkeley.EDU's message of 14 Jun 89 21:45:10 GMT
>
>In article <29675@ucbvax.BERKELEY.EDU> elf@gilan.Berkeley.EDU (Marc Singer) writes:
>
> Why does this apparently simple X program not work?
>
> ----------------------
>
> /* test.c
> */
> #include <X11/Xlib.h>
>
> static char szLabel[] = "Hi there.";
>
> main()
> {
> Display *display;
> Window xwnd;
> XSetWindowAttributes attrib;
> XGCValues xgcv;
> GC gc;
> char ch;
>
> display = XOpenDisplay(0);
>
> attrib.background_pixel = WhilePixel(display, 0);
> attrib.border_pixel = BlackPixel(display, 0);
> xwnd = XCreateWindow(display, RootWindow(display, 0),
> 10, 10, 500, 40,
> 2, CopyFromParent, InputOutput, CopyFromParent,
> CWBackPixel | CWBorderPixel | CWEventMask, &attrib);
>
>What's the event mask (attrib.event_mask = ?), since you set the flags
>saying you were going to set it? (for problem below, you need at least
>attrib.event_mask = Expose;)
[ oops. That should be "attrib.event_mask = ExposureMask" ]
>
>
> XMapWindow(display, xwnd);
> XFlush(display);
>
>Great, now wait for an expose event that says your window has been
>mapped. Until that comes, you are drawing on the window before it is
>being mapped and your strings and lines are going directly into the
>bit bucket. Add the following line (and define "Event event" above)
>
>XNextEvent(display, &event);
>
> /* xgcv.foreground = BlackPixel(display, 0); */
> /* xgcv.function = GXinvert; */
> /* xgcv.plane_mask = AllPlanes; */
> /* gc = XCreateGC(display, xwnd, GCForeground | GCFunction | GCPlaneMask,
> &xgcv); */
> gc = XCreateGC(display, xwnd, 0, 0);
> XDrawString(display, xwnd, gc, 10, 10, szLabel, strlen(szLabel));
> XDrawLine(display, xwnd, gc, 0, 0, 500, 40);
> /* XFillRectangle(display, xwnd, gc, 0, 0, 1000, 1000); */
> XFlush(display);
> ch = getchar();
> } /* main */
>
> ------------------
>
> I know that some of the attributes for the window and the GC are
> redundant. And I have tried specifying the visual and depth
> of the XCreateWindow explicitly. Still, why do I not get anything
> other than a background in the window?
>
> Marc Singer
> "When fullness is taken from fullness,
> fullness still remains."
> Invocation of the Isha Upanishad
>
>
>The great "Drawing in an unmapped window" error strikes again.
>
>--
> Dana Chee
> Bellcore
> MRE 2Q-250
> (201) 829-4488
> dana@bellcore.com
This is exactly ghostscript's problem. The fix, as outlined above, is
quite trivial. I send a patch to the author but it must have gotten lost.
It is a real bug if the server is slow and can't map the window on the screen
before ghostscript starts sending graphics requests. Here's a diff to
gdevx.c, version 1.2, that fixes the problem. It should be easy to apply
the same fix to 1.3.
[diff deleted. -hrp]
Hope this helps.
Peter Phillips <pphillip@cs.ubc.ca> (604)-228-4392
It helps quite a lot. Here are new diffs to the 1.3 gdevx.c that
insert the wait for the exposure event.
--
Hal Peterson Domain: hrp@cray.com
Cray Research Old style: hrp%cray.com@uc.msc.umn.edu
1440 Northland Dr. UUCP: uunet!cray!hrp
Mendota Hts, MN 55120 USA Telephone: +1 612 681 3145
========================================================================
*** gdevx-DIST.c Sun Jul 23 13:28:29 1989
--- gdevx.c Thu Jul 27 16:18:03 1989
***************
*** 166,171 ****
--- 166,172 ----
{ XSetWindowAttributes xswa;
int winW, winH;
int winX, winY;
+ XEvent event;
#ifdef DEBUG
if ( gs_debug['X'] )
{ extern int _Xdebug;
***************
*** 217,223 ****
xdev->ht.pixmap = (Pixmap)0;
xdev->ht.bits = 0;
xdev->fill_style = FillSolid;
! xswa.event_mask = 0;
xswa.background_pixel = xdev->black;
xdev->win = XCreateWindow(xdev->dpy, RootWindowOfScreen(xdev->scr),
winX, winY, winW, winH, 0,
--- 218,224 ----
xdev->ht.pixmap = (Pixmap)0;
xdev->ht.bits = 0;
xdev->fill_style = FillSolid;
! xswa.event_mask = ExposureMask;
xswa.background_pixel = xdev->black;
xdev->win = XCreateWindow(xdev->dpy, RootWindowOfScreen(xdev->scr),
winX, winY, winW, winH, 0,
***************
*** 227,232 ****
--- 228,235 ----
XChangeProperty(xdev->dpy, xdev->win, XA_WM_NAME, XA_STRING, 8,
PropModeReplace, "Ghostscript", 11);
XMapWindow(xdev->dpy, xdev->win);
+ XFlush(xdev->dpy);
+ XNextEvent(xdev->dpy, &event); /* Wait for exposure. */
xdev->ht.no_pixmap = XCreatePixmap(xdev->dpy, xdev->win, 1, 1,
DefaultDepthOfScreen(xdev->scr));
/* Set up a graphics context */