On Tue, Sep 20, 2005 at 08:57:01AM -0500, Matt Garman wrote:
> 
> I've recently started to learn the Xlib API (mostly for fun).
> 
> I'm seeing some strange behavior with my simple tutorial programs,
> so I'm trying different window managers (to see if the problems are
> me or the window manager).  However, in FVWM, the attached program
> only draws a "transparent" window.  The background of the window is
> the same as the root window, and none of the text shows up.
>
> Under enlightenment 0.16.7.2 and fluxbox 0.9.14 the text shows up.
> 
> Any thoughts?

You're drawing into the window too early.  After mapping it you
have to wait for the first Expose event before you can start
drawing. (See below).

> #include <string.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <X11/Xlib.h>
> #include <unistd.h>
> 
> int main(int argc, char* argv[])
> {
>     Display *dpy = NULL;
>     Window window;
>     char* display_name = NULL;
>     XFontStruct* font_info;
>     char* font_name = "10x20";
>     GC gc;
>     XGCValues values;
>     unsigned long valuemask = 0;
>     int screen_num = 0;
> 
> 
>     /* create display */
>     display_name = getenv("DISPLAY");
>     dpy = XOpenDisplay(display_name);
>     if (!dpy) {
>         fprintf(stderr, "Can't open display '%s'!\n",
>                 display_name);
>     }
>     screen_num = DefaultScreen(dpy);
> 
>     /* create window */
>     window = XCreateWindow( dpy, DefaultRootWindow(dpy), 0, 0, 400, 400, 0,
>             CopyFromParent, CopyFromParent, CopyFromParent, 0, 0);
>     XMapWindow(dpy, window);
>     XFlush(dpy);
> 
>     /* create graphics context (gc) */
>     gc = XCreateGC(dpy, window, valuemask, &values);
>     if (gc < 0) {
>         fprintf(stderr, "XCreateGC() failure!\n");
>     }
>     XSetForeground(dpy, gc, WhitePixel(dpy, screen_num));
>     XSetBackground(dpy, gc, BlackPixel(dpy, screen_num));
>     XSetLineAttributes(dpy, gc, 10, LineSolid, CapButt, JoinBevel);
>     XSetFillStyle(dpy, gc, FillSolid);
> 
>     /* set font */
>     font_info = XLoadQueryFont(dpy, font_name);
>     if (!font_info) {
>         fprintf(stderr, "XLoadQueryFont() failed for '%s'\n", font_name);
>     }
>     XSetFont(dpy, gc, font_info->fid);
> 
>     XSync(dpy, False);

Add something like

  {
    XEvent e;
    XWindowEvent(dpy, window, ExposureMask, &e);
  }

here.  In a real application you should wait for the Expose event
in the event loop instead of waiting for a specific event.

>     /* draw! draw! draw! */
>     XDrawString(dpy, window, gc, 0, 0, "Hello World", strlen("Hello World"));
>     XFillRectangle(dpy, window, gc, 60, 150, 50, 60);
> 
>     XFlush(dpy);
> 
>     sleep(10);
> 
>     XCloseDisplay(dpy);
> 
>     return 0;
> }

Ciao

Dominik ^_^  ^_^

 --
Dominik Vogt, [EMAIL PROTECTED]

Attachment: signature.asc
Description: Digital signature

Reply via email to