Path: utzoo!mnetor!uunet!husc6!uwvax!romano!dave From: dave@romano.cs.wisc.edu (Dave Cohrs) Newsgroups: comp.windows.x Subject: Copying a Pixmap into a Window? Help? Message-ID: <5658@spool.cs.wisc.edu> Date: 29 Apr 88 21:39:14 GMT Sender: news@spool.cs.wisc.edu Reply-To: dave@romano.cs.wisc.edu (Dave Cohrs) Organization: U of Wisconsin CS Dept Lines: 146 Keywords: XCopyArea I feel like such a fool, but I can't seem to get XCopyArea() to work the way I think it should. Here's the scoop: - X11V2 - Sun4/110, SunOS3.2, B/W monitor, Type 3 Kbd Here's what I tried to do: A simple (stupid!) program that opens a window, reads a bitmap from an X11 format bitmap file, with XReadBitmapFile(), and XCopyArea()s that bitmap into the window, which just happens to be the same size as the bitmap. It all works fine up to the XCopyArea(), which seems to do nothing (i.e. The window remains the background color no matter what I do). Note: I was able to almost do what I wanted by setting the background_pixmap to the bitmap when I XCreateWindow()ed the window, but this has turned into a challenge. Anyway, here's the code. Pls don't complain about it's stupidity, unless it relates to the problem I'm having (yes, I know I'm not using the geometry spec; first I get it to work, then I make it pretty). Too bad there's not a standard Widget that does this. Dave Cohrs -----------------------------------Cut Here------------------------------------ #include #include #include #include #include char* myname; /* aka argv[0] */ void usage() { fprintf(stderr, "Usage: %s [ -geometry spec ] [ -display spec ] file\n", myname); exit(1); } main(argc, argv) int argc; char* argv[]; { Display *disp; char *geometry = NULL, *host = NULL; register int i; int screen; int border_wid = 2; char* filename = 0; Window bitwin; XSetWindowAttributes attrs; XSizeHints hints; XGCValues gcv; GC gc; unsigned long bg, fg; int invert = 0; Pixmap source = 0; int wid, hgt; int x_hot, y_hot; int my_x = 0, my_y = 0; myname = argv[0]; /* Parse command line */ for (i = 1; i < argc; i++) { char *arg = argv[i]; if (arg[0] == '-') { switch (arg[1]) { case 'd': /* -display host:dpy */ if (++i >= argc) usage (); host = argv[i]; continue; case 'g': /* -geometry geom */ if (++i >= argc) usage (); geometry = argv[i]; continue; case 'i': invert++; continue; default: usage (); } } else filename = argv[i]; } if(filename == NULL) usage(); if (!(disp = XOpenDisplay(host))) { fprintf(stderr, "%s: unable to open display '%s'\n", myname, XDisplayName(host)); exit (1); } screen = DefaultScreen(disp); if(invert) { fg = BlackPixel (disp, screen); bg = WhitePixel (disp, screen); } else { fg = WhitePixel (disp, screen); bg = BlackPixel (disp, screen); } if( XReadBitmapFile(disp, RootWindow(disp, screen), filename, &wid, &hgt, &source, &x_hot, &y_hot) != Success) { fprintf(stderr, "%s: cannot load bitmap file %s\n", myname, filename); exit(1); } attrs.background_pixel = bg; attrs.border_pixel = fg; attrs.cursor = XCreateFontCursor(disp, XC_top_left_arrow); bitwin = XCreateWindow( disp, RootWindow(disp, screen), my_x, my_y, wid, hgt, border_wid, CopyFromParent, CopyFromParent, CopyFromParent, CWBorderPixel | CWBackPixel | CWCursor, &attrs); XSetStandardProperties (disp, bitwin, "Bitmap Display", "showbitmap", None, argv, argc, &hints); XMapWindow(disp, bitwin); gcv.function = GXcopy; gcv.background = bg; gcv.foreground = fg; gcv.graphics_exposures = False; gc = XCreateGC(disp, bitwin, GCFunction | GCForeground | GCBackground | GCGraphicsExposures, &gcv); XCopyArea(disp, source, bitwin, gc, 0, 0, wid, hgt, 0, 0); XFlush(disp); while(1) sleep(100000); } -- Dave Cohrs +1 608 262-6617 UW-Madison Computer Sciences Department dave@cs.wisc.edu ...!{harvard,ihnp4,rutgers,ucbvax}!uwvax!dave