#include <stdio.h> #include <X11/X.h> #include <X11/Xlib.h> #define NAME "red" main (argc, argv) char *argv[]; int argc; { XColor color_cell, truecolor; XSetWindowAttributes attributes; Visual *visual; int depth; int which_color,which_cell,which_plane; Display *display; Window win; GC gc; Colormap cmap; XEvent event; int screen; setbuf (stdout, NULL); setbuf (stderr, NULL); display = XOpenDisplay(NULL); screen = DefaultScreen(display); visual = DefaultVisual(display,screen); depth = DefaultDepth(display,screen); cmap= XDefaultColormap(display,screen); attributes.background_pixel = XWhitePixel(display,screen); attributes.border_pixel = XBlackPixel(display,screen); attributes.override_redirect = 1; win = XCreateWindow(display,XRootWindow(display,screen),0,0,507,426,5, depth, InputOutput,visual, CWBackPixel | CWBorderPixel | CWOverrideRedirect,&attributes); XSelectInput(display,win,ButtonPressMask+ KeyPressMask) ; gc=XCreateGC(display,win,NULL,NULL); XMapWindow(display,win); /* first by RGB values */ color_cell.flags= DoRed | DoGreen | DoBlue; color_cell.red = 10000; color_cell.green = 40000; color_cell.blue = 60000; if (XAllocColor(display,cmap,&color_cell)==0) fprintf("XAllocColor failed\n"); XSetForeground(display,gc,color_cell.pixel); XDrawImageString(display,win,gc,250,50,"RGB color",9); XFlush(display); /* now by name */ if (XAllocNamedColor(display,cmap, NAME, &color_cell, &truecolor) == 0) { fprintf(stderr, "Color '%s' unknown\n", NAME); } if (truecolor.red != color_cell.red || truecolor.green != color_cell.green || truecolor.blue != color_cell.blue) { fprintf(stderr, "Warning: %s color may be wrong\n", NAME); } XSetForeground(display,gc,color_cell.pixel); XDrawImageString(display,win,gc,250,80, "named color",11); XFlush(display); printf("now press button: \n"); do{ XNextEvent(display,&event); }while(event.type != ButtonPress); printf("closing display\n"); XCloseDisplay(display); exit(0); }
The following routine consults the database /usr/lib/X11/rgb.txt
which contains RGB info
on the named colors
Status XLookupColor(display,cmap,spec,screen_def,exact_def); char *spec; /* case ignored */ XColor *screen_def; /* RETURNS the values actually used in the colormap */ XColor *exact_def; /* RETURNS the closest color provided by the hardware*/useful little routines are
Status XParseColor(display,colormap,spec, screen_def) char *spec; /* name of colour or spec string */ /* a spec string must begin with a hash sign and then */ /* contain 3,6,9 or 12 hex digits with no spaces */ /* these are taken in groups of 1,2,3 or 4 respectively*/ /* to give the desired RGB value for the colour */ Color *screen_def; /* RETURN nearest RGB supported by hardware */ XQueryColor(display,cmap,def); XColor *def; /*supplies pixel value, RETURNS RGB */ XQueryColors(display,cmap,defs, ncolors); XColor defs[ncolors]; /*supplies pixel values, RETURNS RGB */X11R5 introduced a more sophisticated color system called Xcms which is beyond the scope of this handout.