turner@daisy.UUCP (D'arc Angel) (05/10/88)
awhile ago someone posted a program that did a XReadBitmapFile call, but
didn't display the bitmap. After some hacking I got it to work for the bitmaps
that were distributed as poskbitmaps. It should be taken as an example not
as a finished program.
---cut here---cut here---cut here---cut here---cut here---cut here---cut here--
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/cursorfont.h>
#include <stdio.h>
char* program_name; /* aka argv[0] */
Pixmap ReadBitmapFile();
Display *display;
Window root;
int screen;
void
usage()
{
fprintf(stderr,
"Usage: %s [ -geometry spec ] [ -display spec ] file\n", program_name);
exit(1);
}
main(argc, argv)
int argc;
char* argv[];
{
char *geometry = NULL, *host = NULL;
register int i;
int border_wid = 2;
char* filename = 0;
Window showindow;
XSetWindowAttributes attrs;
XSizeHints hints;
XGCValues gcv;
GC gc;
unsigned long bg, fg;
int invert = 0;
XEvent report;
Pixmap bitmap = 0, pixmap = 0;
int wid, hgt;
int x_hot, y_hot;
int my_x = 0, my_y = 0;
program_name = 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 (!(display = XOpenDisplay(host))) {
fprintf(stderr, "%s: unable to open display '%s'\n",
program_name, XDisplayName(host));
exit (1);
}
screen = DefaultScreen(display);
root = RootWindow(display, screen);
if(invert) {
bg = BlackPixel (display, screen);
fg = WhitePixel (display, screen);
} else {
bg = WhitePixel (display, screen);
fg = BlackPixel (display, screen);
}
bitmap = ReadBitmapFile(filename, &wid, &hgt, &x_hot, &y_hot);
showindow = XCreateWindow(
display, root,
my_x, my_y, wid, hgt,
border_wid, CopyFromParent, CopyFromParent, CopyFromParent,
CWBorderPixel | CWBackPixel, &attrs);
gcv.function = GXcopy;
gcv.background = bg;
gcv.foreground = fg;
gcv.graphics_exposures = False;
gc = XCreateGC(display, showindow,
GCFunction | GCForeground | GCBackground | GCGraphicsExposures, &gcv);
pixmap = XCreatePixmap(display, showindow, wid, hgt,
(unsigned int)DefaultDepth (display, screen));
XCopyPlane(display, bitmap, pixmap, gc, 0, 0, wid, hgt, 0, 0,
(unsigned long) 1);
XSelectInput(display, showindow, ExposureMask);
XSetStandardProperties (display, showindow, "Bitmap Display", "showbitmap",
None, argv, argc, &hints);
XMapWindow(display, showindow);
XCopyArea(display,
pixmap,
showindow,
gc,
0, 0,
wid, hgt,
0, 0);
XFlush(display);
XSelectInput(display, showindow,
(unsigned long)(ButtonPressMask|KeyPressMask));
while(report.type != ButtonPressMask & report.type != KeyPressMask)
XNextEvent(display, &report);
XFreePixmap(display, pixmap);
XFreePixmap(display, bitmap);
XFreeGC(display, gc);
}
Pixmap ReadBitmapFile(filename, width, height, x_hot, y_hot)
char *filename;
unsigned int *width, *height;
int *x_hot, *y_hot;
{
Pixmap bitmap;
int status;
status = XReadBitmapFile(display, root, filename, width,
height, &bitmap, x_hot, y_hot);
if (status == BitmapSuccess)
return(bitmap);
else if (status == BitmapOpenFailed)
fprintf(stderr, "%s: can't open file: %s\n", program_name, filename);
else if (status == BitmapFileInvalid)
fprintf(stderr, "%s: bad bitmap format file: %s\n",
program_name, filename);
else
fprintf(stderr, "%s: insufficient memory for bitmap: %s",
program_name, filename);
exit(1);
/*NOTREACHED*/
}
--
Laissez les bons temps rouler - Queen Ida
...{decwrl|ucbvax}!imagen!atari!daisy!turner (James M. Turner)
Daisy Systems, 700 E. Middlefield Rd, P.O. Box 7006,
Mountain View CA 94039-7006. (415)960-0123