/* * $XConsortium: xset.c,v 1.52 89/07/17 17:55:00 jim Exp $ */ #include /* Copyright Massachusetts Institute of Technology 1985 */ #ifndef lint static char *rcsid_xset_c = "$XConsortium: xset.c,v 1.52 89/07/17 17:55:00 jim Exp $"; #endif #include #include #include #include /* #include [Doesn't exist yet 5-14-87] %*/ #include #include #include #include #ifdef MITMISC #include #endif #define ON 1 #define OFF 0 #define SERVER_DEFAULT (-1) #define DONT_CHANGE -2 #define ALL -1 #define TIMEOUT 1 #define INTERVAL 2 #define PREFER_BLANK 3 #define ALLOW_EXP 4 #define nextarg(i, argv) \ argv[i]; \ if (i >= argc) \ break; \ char *progName; int local_xerror(); main(argc, argv) int argc; char **argv; { register char *arg; register int i; int percent; int acc_num, acc_denom, threshold; int key, auto_repeat_mode; XKeyboardControl values; unsigned long pixels[512]; caddr_t colors[512]; XColor def; int numpixels = 0; char *disp = NULL; Display *dpy; Bool hasargs = False; progName = argv[0]; for (i = 1; i < argc; i++) { arg = argv[i]; if (strcmp (arg, "-display") == 0 || strcmp (arg, "-d") == 0) { if (++i >= argc) usage ("missing argument to -display", NULL); disp = argv[i]; } else { hasargs = True; } } if (!hasargs) { usage (NULL, NULL); /* replace with window interface */ } dpy = XOpenDisplay(disp); /* Open display and check for success */ if (dpy == NULL) { fprintf(stderr, "%s: unable to open display \"%s\"\n", argv[0], XDisplayName (disp)); exit(1); } XSetErrorHandler (local_xerror); for (i = 1; i < argc; ) { arg = argv[i++]; if (strcmp (arg, "-display") == 0 || strcmp (arg, "-d") == 0) { ++i; /* already dealt with */ continue; } else if (*arg == '-' && *(arg + 1) == 'c'){ /* Does arg start with "-c"? */ set_click(dpy, 0); /* If so, turn click off and */ } else if (*arg == 'c') { /* Well, does it start with "c", then? */ percent = SERVER_DEFAULT; /* Default click volume. */ if (i >= argc) { set_click (dpy, percent); /* set click to default */ break; } arg = nextarg(i, argv); if (strcmp(arg, "on") == 0) { /* Let click be default. */ i++; } else if (strcmp(arg, "off") == 0) { percent = 0; /* Turn it off. */ i++; } else if (isnumber(arg, 100)) { percent = atoi(arg); /* Set to spec. volume */ i++; } set_click(dpy, percent); } else if (strcmp(arg, "-b") == 0) { set_bell_vol(dpy, 0); /* Then turn off bell. */ } else if (strcmp(arg, "b") == 0) { percent = SERVER_DEFAULT; /* Set bell to default. */ if (i >= argc) { set_bell_vol (dpy, percent); /* set bell to default */ break; } arg = nextarg(i, argv); if (strcmp(arg, "on") == 0) { /* Let it stay that way. */ set_bell_vol(dpy, percent); i++; } else if (strcmp(arg, "off") == 0) { percent = 0; /* Turn the bell off. */ set_bell_vol(dpy, percent); i++; } else if (isnumber(arg, 100)) { /* If volume is given: */ percent = atoi(arg); /* set bell appropriately.*/ set_bell_vol(dpy, percent); i++; arg = nextarg(i, argv); if (isnumber(arg, 20000)) { /* If pitch is given: */ set_bell_pitch(dpy, atoi(arg)); /* set the bell. */ i++; arg = nextarg(i, argv); if (isnumber(arg, 1000)) { /* If duration is given: */ set_bell_dur(dpy, atoi(arg)); /* set the bell. */ i++; } } } else set_bell_vol (dpy, percent); /* set bell to default */ } #ifdef MITMISC else if (strcmp(arg, "bc") == 0) { int dummy; if (XMITMiscQueryExtension(dpy, &dummy, &dummy)) XMITMiscSetBugMode(dpy, True); else fprintf(stderr, "server does not have extension for bc option\n"); } else if (strcmp(arg, "-bc") == 0) { int dummy; if (XMITMiscQueryExtension(dpy, &dummy, &dummy)) XMITMiscSetBugMode(dpy, False); else fprintf(stderr, "server does not have extension for -bc option\n"); } #endif else if (strcmp(arg, "fp") == 0) { /* set font path */ if (i >= argc) { arg = "default"; } else { arg = nextarg(i, argv); } set_font_path(dpy, arg, 1, 0, 0); /* special argument */ i++; } else if (strcmp(arg, "fp=") == 0) { /* unconditionally set */ if (i >= argc) { usage ("missing fp= argument", NULL); } else { arg = nextarg(i, argv); } set_font_path(dpy, arg, 0, 0, 0); /* not special, set */ i++; } else if (strcmp(arg, "+fp") == 0) { /* set font path */ if (i >= argc) usage ("missing +fp argument", NULL); arg = nextarg(i, argv); set_font_path(dpy, arg, 0, 1, 0); /* not special, prepend */ i++; } else if (strcmp(arg, "fp+") == 0) { /* set font path */ if (i >= argc) usage ("missing fp+ argument", NULL); arg = nextarg(i, argv); set_font_path(dpy, arg, 0, 0, 1); /* not special, append */ i++; } else if (strcmp(arg, "-fp") == 0) { /* set font path */ if (i >= argc) usage ("missing -fp argument", NULL); arg = nextarg(i, argv); set_font_path(dpy, arg, 0, -1, 0); /* not special, preremove */ i++; } else if (strcmp(arg, "fp-") == 0) { /* set font path */ if (i >= argc) usage ("missing fp- argument", NULL); arg = nextarg(i, argv); set_font_path(dpy, arg, 0, 0, -1); /* not special, postremove */ i++; } else if (strcmp(arg, "-led") == 0) { /* Turn off one or all LEDs */ values.led_mode = OFF; values.led = ALL; /* None specified */ arg = nextarg(i, argv); if (isnumber(arg, 32) && atoi(arg) > 0) { values.led = atoi(arg); i++; } set_led(dpy, values.led, values.led_mode); } else if (strcmp(arg, "led") == 0) { /* Turn on one or all LEDs */ values.led_mode = ON; values.led = ALL; if (i >= argc) { set_led (dpy, values.led, values.led_mode); /* set led to def */ break; } arg = nextarg(i, argv); if (strcmp(arg, "on") == 0) { i++; } else if (strcmp(arg, "off") == 0) { /* ...except in this case. */ values.led_mode = OFF; i++; } else if (isnumber(arg, 32) && atoi(arg) > 0) { values.led = atoi(arg); i++; } set_led(dpy, values.led, values.led_mode); } /* Set pointer (mouse) settings: Acceleration and Threshold. */ else if (strcmp(arg, "m") == 0 || strcmp(arg, "mouse") == 0) { acc_num = SERVER_DEFAULT; /* restore server defaults */ acc_denom = SERVER_DEFAULT; threshold = SERVER_DEFAULT; if (i >= argc){ set_mouse(dpy, acc_num, acc_denom, threshold); break; } arg = argv[i]; if (strcmp(arg, "default") == 0) { i++; } else if (*arg >= '0' && *arg <= '9') { acc_num = atoi(arg); /* Set acceleration to user's tastes. */ i++; if (i >= argc) { set_mouse(dpy, acc_num, acc_denom, threshold); break; } arg = argv[i]; if (*arg >= '0' && *arg <= '9') { threshold = atoi(arg); /* Set threshold as user specified. */ i++; } } set_mouse(dpy, acc_num, acc_denom, threshold); } else if (strcmp(arg, "s") == 0) { if (i >= argc) { set_saver(dpy, ALL, 0); /* Set everything to default */ break; } arg = argv[i]; if (strcmp(arg, "blank") == 0) { /* Alter blanking preference. */ set_saver(dpy, PREFER_BLANK, PreferBlanking); i++; } else if (strcmp(arg, "noblank") == 0) { /* Ditto. */ set_saver(dpy, PREFER_BLANK, DontPreferBlanking); i++; } else if (strcmp(arg, "expose") == 0) { /* Alter exposure preference. */ set_saver(dpy, ALLOW_EXP, AllowExposures); i++; } else if (strcmp(arg, "noexpose") == 0) { /* Ditto. */ set_saver(dpy, ALLOW_EXP, DontAllowExposures); i++; } else if (strcmp(arg, "off") == 0) { set_saver(dpy, TIMEOUT, 0); /* Turn off screen saver. */ i++; if (i >= argc) break; arg = argv[i]; if (strcmp(arg, "off") == 0) { set_saver(dpy, INTERVAL, 0); i++; } } else if (strcmp(arg, "default") == 0 || strcmp(arg, "on") == 0) { /* Leave as default. */ set_saver(dpy, ALL, 0); i++; } else if (*arg >= '0' && *arg <= '9') { /* Set as user wishes. */ set_saver(dpy, TIMEOUT, atoi(arg)); i++; if (i >= argc) break; arg = argv[i]; if (*arg >= '0' && *arg <= '9') { set_saver(dpy, INTERVAL, atoi(arg)); i++; } } } else if (strcmp(arg, "-r") == 0) { /* Turn off one or all autorepeats */ auto_repeat_mode = OFF; key = ALL; /* None specified */ arg = argv[i]; if (i < argc) if (isnumber(arg, 255)) { key = atoi(arg); i++; } set_repeat(dpy, key, auto_repeat_mode); } else if (strcmp(arg, "r") == 0) { /* Turn on one or all autorepeats */ auto_repeat_mode = ON; key = ALL; /* None specified */ arg = argv[i]; if (i < argc) if (strcmp(arg, "on") == 0) { i++; } else if (strcmp(arg, "off") == 0) { /* ...except in this case. */ auto_repeat_mode = OFF; i++; } else if (isnumber(arg, 255)) { key = atoi(arg); i++; } set_repeat(dpy, key, auto_repeat_mode); } else if (strcmp(arg, "p") == 0) { if (i + 1 >= argc) usage ("missing argument to p", NULL); arg = argv[i]; if (*arg >= '0' && *arg <= '9') pixels[numpixels] = atoi(arg); else usage ("invalid pixel number %s", arg); i++; colors[numpixels] = argv[i]; i++; numpixels++; } else if (strcmp(arg, "-k") == 0) { set_lock(dpy, OFF); } else if (strcmp(arg, "k") == 0) { set_lock(dpy, ON); } else if (strcmp(arg, "q") == 0 || strcmp(arg, "-q") == 0) { query(dpy); } else usage ("unknown option %s", arg); } if (numpixels) set_pixels(dpy, pixels, colors, numpixels); XCloseDisplay (dpy); exit(0); /* Done. We can go home now. */ } isnumber(arg, maximum) char *arg; int maximum; { register char *p; if (arg[0] == '-' && arg[1] == '1' && arg[2] == '\0') return(1); for (p=arg; isdigit(*p); p++); if (*p || atoi(arg) > maximum) return(0); return(1); } /* These next few functions do the real work (xsetting things). */ set_click(dpy, percent) Display *dpy; int percent; { XKeyboardControl values; values.key_click_percent = percent; XChangeKeyboardControl(dpy, KBKeyClickPercent, &values); return; } set_bell_vol(dpy, percent) Display *dpy; int percent; { XKeyboardControl values; values.bell_percent = percent; XChangeKeyboardControl(dpy, KBBellPercent, &values); return; } set_bell_pitch(dpy, pitch) Display *dpy; int pitch; { XKeyboardControl values; values.bell_pitch = pitch; XChangeKeyboardControl(dpy, KBBellPitch, &values); return; } set_bell_dur(dpy, duration) Display *dpy; int duration; { XKeyboardControl values; values.bell_duration = duration; XChangeKeyboardControl(dpy, KBBellDuration, &values); return; } /* * Set, add, or subtract the path according to before and after flags: * * before after action * * 0 0 FontPath := path * -1 0 FontPath := current - path * 0 -1 FontPath := current - path * 1 0 FontPath := path + current * 0 1 FontPath := current + path */ set_font_path(dpy, path, special, before, after) Display *dpy; char *path; int special, before, after; { char **directoryList = NULL; int ndirs = 0; char **currentList = NULL; int ncurrent = 0; char **newList = NULL; int nnew = 0; if (special) { if (strcmp (path, "default") == 0) { XSetFontPath (dpy, NULL, 0); return; } if (strcmp (path, "rehash") == 0) { currentList = XGetFontPath (dpy, &ncurrent); if (!currentList) { fprintf (stderr, "%s: unable to get current font path.\n", progName); return; } XSetFontPath (dpy, currentList, ncurrent); XFreeFontPath (currentList); return; } /* * for now, fall though and process keyword and directory list for * compatibility with previous versions. */ } /* * parse the path list. If before or after is non-zero, we'll need * the current value. */ if (before != 0 || after != 0) { currentList = XGetFontPath (dpy, &ncurrent); if (!currentList) { fprintf (stderr, "%s: unable to get old font path.\n", progName); before = after = 0; } } { /* count the number of directories in path */ register char *cp = path; ndirs = 1; while ((cp = index (cp, ',')) != NULL) { ndirs++; cp++; } } directoryList = (char **) malloc (ndirs*sizeof (char *)); if (!directoryList) error ("out of memory for font path directory list"); { /* mung the path and set directoryList pointers */ int i = 0; char *cp = path; directoryList[i++] = cp; while ((cp = index (cp, ',')) != NULL) { directoryList[i++] = cp + 1; *cp++ = '\0'; } if (i != ndirs) { fprintf (stderr, "%s: internal error, only parsed %d of %d directories.\n", progName, i, ndirs); exit (1); } } /* * now we have have parsed the input path, so we can set it */ if (before == 0 && after == 0) { XSetFontPath (dpy, directoryList, ndirs); } /* if adding to list, build a superset */ if (before > 0 || after > 0) { int nnew = ndirs + ncurrent; char **newList = (char **) malloc (nnew * sizeof (char *)); if (!newList) error ("out of memory"); if (before > 0) { /* new + current */ bcopy ((char *) directoryList, (char *) newList, (unsigned) (ndirs*sizeof (char *))); bcopy ((char *) currentList, (char *) (newList + ndirs), (unsigned) (ncurrent*sizeof (char *))); XSetFontPath (dpy, newList, nnew); } else if (after > 0) { bcopy ((char *) currentList, (char *) newList, (unsigned) (ncurrent*sizeof (char *))); bcopy ((char *) directoryList, (char *) (newList + ncurrent), (unsigned) (ndirs*sizeof (char *))); XSetFontPath (dpy, newList, nnew); } free ((char *) newList); } /* if deleting from list, build one the same size */ if (before < 0 || after < 0) { int i, j; int nnew = 0; char **newList = (char **) malloc (ncurrent * sizeof (char *)); if (!newList) error ("out of memory"); for (i = 0; i < ncurrent; i++) { for (j = 0; j < ndirs; j++) { if (strcmp (currentList[i], directoryList[j]) == 0) break; } /* if we ran out, then insert into new list */ if (j == ndirs) newList[nnew++] = currentList[i]; } if (nnew == ncurrent) { fprintf (stderr, "%s: warning, no entries deleted from font path.\n", progName); } XSetFontPath (dpy, newList, nnew); free ((char *) newList); } if (directoryList) free ((char *) directoryList); if (currentList) XFreeFontPath (currentList); return; } set_led(dpy, led, led_mode) Display *dpy; int led, led_mode; { XKeyboardControl values; values.led_mode = led_mode; if (led != ALL) { values.led = led; XChangeKeyboardControl(dpy, KBLed | KBLedMode, &values); } else { XChangeKeyboardControl(dpy, KBLedMode, &values); } return; } set_mouse(dpy, acc_num, acc_denom, threshold) Display *dpy; int acc_num, acc_denom, threshold; { int do_accel = True, do_threshold = True; if (acc_num == DONT_CHANGE) /* what an incredible crock... */ do_accel = False; if (threshold == DONT_CHANGE) do_threshold = False; if (acc_num < 0) /* shouldn't happen */ acc_num = SERVER_DEFAULT; if (acc_denom <= 0) /* prevent divide by zero */ acc_denom = SERVER_DEFAULT; if (threshold < 0) threshold = SERVER_DEFAULT; XChangePointerControl(dpy, do_accel, do_threshold, acc_num, acc_denom, threshold); return; } set_saver(dpy, mask, value) Display *dpy; int mask, value; { int timeout, interval, prefer_blank, allow_exp; XGetScreenSaver(dpy, &timeout, &interval, &prefer_blank, &allow_exp); if (mask == TIMEOUT) timeout = value; if (mask == INTERVAL) interval = value; if (mask == PREFER_BLANK) prefer_blank = value; if (mask == ALLOW_EXP) allow_exp = value; if (mask == ALL) { /* "value" is ignored in this case. (defaults) */ timeout = SERVER_DEFAULT; interval = SERVER_DEFAULT; prefer_blank = DefaultBlanking; allow_exp = DefaultExposures; } XSetScreenSaver(dpy, timeout, interval, prefer_blank, allow_exp); return; } set_repeat(dpy, key, auto_repeat_mode) Display *dpy; int key, auto_repeat_mode; { XKeyboardControl values; values.auto_repeat_mode = auto_repeat_mode; if (key != ALL) { values.key = key; XChangeKeyboardControl(dpy, KBKey | KBAutoRepeatMode, &values); } else { XChangeKeyboardControl(dpy, KBAutoRepeatMode, &values); } return; } set_pixels(dpy, pixels, colors, numpixels) Display *dpy; unsigned long pixels[512]; caddr_t colors[512]; int numpixels; { XColor def; int scr = DefaultScreen (dpy); Visual *visual = DefaultVisual (dpy, scr); Colormap cmap = DefaultColormap (dpy, scr); unsigned long max_cells = DisplayCells(dpy, scr); XVisualInfo viproto, *vip; int nvisuals = 0; char *visual_type = NULL; int i; viproto.visualid = XVisualIDFromVisual (visual); vip = XGetVisualInfo (dpy, VisualIDMask, &viproto, &nvisuals); if (!vip || nvisuals != 1) { fprintf (stderr, "%s: got %d visual info structures for visual 0x%lx\n", progName, nvisuals, viproto.visualid); return; } switch (vip->class) { case GrayScale: case PseudoColor: break; case TrueColor: visual_type = "TrueColor"; /* fall through */ case DirectColor: max_cells *= max_cells * max_cells; break; case StaticGray: visual_type = "StaticGray"; break; case StaticColor: visual_type = "StaticColor"; break; default: fprintf (stderr, "%s: unknown visual class type %d\n", progName, vip->class); numpixels = 0; } if (visual_type) { fprintf (stderr, "%s: cannot set pixel values in read-only %s visuals\n", progName, visual_type); } else { for (i = 0; i < numpixels; i++) { def.pixel = pixels[i]; if (def.pixel >= max_cells) fprintf(stderr, "%s: pixel value %d out of colormap range 0 through %d\n", progName, def.pixel, max_cells - 1); else { if (XParseColor (dpy, cmap, colors[i], &def)) XStoreColor(dpy, cmap, &def); else fprintf (stderr, "%s: invalid color \"%s\"\n", progName, colors[i]); } } } XFree ((char *) vip); return; } set_lock(dpy, onoff) Display *dpy; Bool onoff; { XModifierKeymap *mods; mods = XGetModifierMapping(dpy); if (onoff) mods = XInsertModifiermapEntry(mods, XK_Caps_Lock, LockMapIndex); else mods = XDeleteModifiermapEntry(mods, XK_Caps_Lock, LockMapIndex); XSetModifierMapping(dpy, mods); return; } char *on_or_off (val, onval, onstr, offval, offstr, buf) int val, onval, offval; char *onstr, *offstr; char buf[]; { if (val == onval) return onstr; else if (val == offval) return offstr; buf[0] = '\0'; sprintf (buf, "<%d>", val); return buf; } /* This is the information-getting function for telling the user what the * current "xsettings" are. */ query(dpy) Display *dpy; { int scr = DefaultScreen (dpy); XKeyboardState values; int acc_num, acc_denom, threshold; int timeout, interval, prefer_blank, allow_exp; char **font_path; int npaths; int i, j; char buf[20]; /* big enough for 16 bit number */ XGetKeyboardControl(dpy, &values); XGetPointerControl(dpy, &acc_num, &acc_denom, &threshold); XGetScreenSaver(dpy, &timeout, &interval, &prefer_blank, &allow_exp); font_path = XGetFontPath(dpy, &npaths); printf ("Keyboard Control:\n"); printf (" auto repeat: %s key click percent: %d LED mask: %08lx\n", on_or_off (values.global_auto_repeat, AutoRepeatModeOn, "on", AutoRepeatModeOff, "off", buf), values.key_click_percent, values.led_mask); printf (" auto repeating keys: "); for (i = 0; i < 4; i++) { if (i) printf (" "); for (j = 0; j < 8; j++) { printf ("%02x", (unsigned char)values.auto_repeats[i*8 + j]); } printf ("\n"); } printf (" bell percent: %d bell pitch: %d bell duration: %d\n", values.bell_percent, values.bell_pitch, values.bell_duration); printf ("Pointer Control:\n"); printf (" acceleration: %d = %d / %d threshold: %d\n", acc_denom != 0 ? (acc_num / acc_denom) : 0, acc_num, acc_denom, threshold); printf ("Screen Saver:\n"); printf (" prefer blanking: %s ", on_or_off (prefer_blank, PreferBlanking, "yes", DontPreferBlanking, "no", buf)); printf ("allow exposures: %s\n", on_or_off (allow_exp, AllowExposures, "yes", DontAllowExposures, "no", buf)); printf (" timeout: %d cycle: %d\n", timeout, interval); printf ("Colors:\n"); printf (" default colormap: 0x%lx BlackPixel: %d WhitePixel: %d\n", DefaultColormap (dpy, scr), BlackPixel (dpy, scr), WhitePixel (dpy, scr)); printf ("Font Path:\n"); if (npaths) { printf( " %s", *font_path++ ); for( --npaths; npaths; npaths-- ) printf( ",%s", *font_path++ ); printf( "\n" ); } else { printf (" (empty)\n"); } #ifdef MITMISC { int dummy; if (XMITMiscQueryExtension(dpy, &dummy, &dummy)) { if (XMITMiscGetBugMode(dpy)) printf ("Bug Mode: compatibility mode is enabled\n"); else printf ("Bug Mode: compatibility mode is disabled\n"); } } #endif return; } /* This is the usage function */ usage (fmt, arg) char *fmt; char *arg; { if (fmt) { fprintf (stderr, "%s: ", progName); fprintf (stderr, fmt, arg); fprintf (stderr, "\n\n"); } fprintf (stderr, "usage: %s [-display host:dpy] option ...\n", progName); fprintf (stderr, " To turn bell off:\n"); fprintf (stderr, "\t-b b off b 0\n"); fprintf (stderr, " To set bell volume, pitch and duration:\n"); fprintf (stderr, "\t b [vol [pitch [dur]]] b on\n"); #ifdef MITMISC fprintf (stderr, " To disable bug compatibility mode:\n"); fprintf (stderr, "\t-bc\n"); fprintf (stderr, " To enable bug compatibility mode:\n"); fprintf (stderr, "\tbc\n"); #endif fprintf (stderr, " To turn keyclick off:\n"); fprintf (stderr, "\t-c c off c 0\n"); fprintf (stderr, " To set keyclick volume:\n"); fprintf (stderr, "\t c [0-100] c on\n"); fprintf (stderr, " To set the font path:\n" ); fprintf (stderr, "\t fp= path[,path...]\n" ); fprintf (stderr, " To restore the default font path:\n"); fprintf (stderr, "\t fp default\n"); fprintf (stderr, " To have the server reread font databases:\n"); fprintf (stderr, "\t fp rehash\n"); fprintf (stderr, " To remove elements from font path:\n"); fprintf (stderr, "\t-fp path[,path...] fp- path[,path...]\n"); fprintf (stderr, " To prepend or append elements to font path:\n"); fprintf (stderr, "\t+fp path[,path...] fp+ path[,path...]\n"); fprintf (stderr, " To set LED states off or on:\n"); fprintf (stderr, "\t-led [1-32] led off\n"); fprintf (stderr, "\t led [1-32] led on\n"); fprintf (stderr, " To set mouse acceleration and threshold:\n"); fprintf (stderr, "\t m [acc [thr]] m default\n"); fprintf (stderr, " To set pixel colors:\n"); fprintf (stderr, "\t p pixel_value color_name\n"); fprintf (stderr, " To turn auto-repeat off or on:\n"); fprintf (stderr, "\t-r [keycode] r off\n"); fprintf (stderr, "\t r [keycode] r on\n"); fprintf (stderr, " For screen-saver control:\n"); fprintf (stderr, "\t s [timeout [cycle]] s default s on\n"); fprintf (stderr, "\t s blank s noblank s off\n"); fprintf (stderr, "\t s expose s noexpose\n"); fprintf (stderr, " For status information: q or query\n"); exit(0); } error( message ) char *message; { fprintf( stderr, "%s: %s\n", progName, message ); exit( 1 ); } int local_xerror (dpy, rep) Display *dpy; XErrorEvent *rep; { char dummy[10]; char *errname = NULL; if (rep->request_code == X_StoreColors) { switch (rep->error_code) { case BadAccess: errname = "BadAccess, pixel not allocated read/write"; break; case BadValue: errname = "BadValue, invalid pixel number"; break; } } if (errname) { fprintf (stderr, "%s: error in storing color: %s\n", progName, errname); } else { XmuPrintDefaultErrorMessage (dpy, rep, stderr); } return (0); }