summaryrefslogtreecommitdiff
path: root/xrefresh.c
diff options
context:
space:
mode:
Diffstat (limited to 'xrefresh.c')
-rw-r--r--xrefresh.c366
1 files changed, 366 insertions, 0 deletions
diff --git a/xrefresh.c b/xrefresh.c
new file mode 100644
index 0000000..06500a3
--- /dev/null
+++ b/xrefresh.c
@@ -0,0 +1,366 @@
+/***********************************************************
+
+Copyright 1987, 1988, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * $Xorg: xrefresh.c,v 1.4 2001/02/09 02:05:56 xorgcvs Exp $
+ *
+ * Kitchen sink version, useful for clearing small areas and flashing the
+ * screen.
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <ctype.h>
+
+char *malloc();
+
+Window win;
+
+char *ProgramName;
+
+void Syntax ()
+{
+ fprintf (stderr, "usage: %s [-options] [geometry] [display]\n\n",
+ ProgramName);
+ fprintf (stderr, "where the available options are:\n");
+ fprintf (stderr, " -display host:dpy or -d\n");
+ fprintf (stderr, " -geometry WxH+X+Y or -g spec\n");
+ fprintf (stderr, " -black use BlackPixel\n");
+ fprintf (stderr, " -white use WhitePixel\n");
+ fprintf (stderr, " -solid colorname use the color indicated\n");
+ fprintf (stderr, " -root use the root background\n");
+ fprintf (stderr, " -none no background in window\n");
+ fprintf (stderr, "\nThe default is: %s -none\n\n", ProgramName);
+ exit (1);
+}
+
+static char *copystring (s)
+ register char *s;
+{
+ int len = (s ? strlen (s) : 0) + 1;
+ char *malloc();
+ char *retval;
+
+ retval = malloc (len);
+ if (!retval) {
+ fprintf (stderr, "%s: unable to allocate %d bytes for string.\n",
+ ProgramName, len);
+ exit (1);
+ }
+ (void) strcpy (retval, s);
+ return (retval);
+}
+
+/*
+ * The following parses options that should be yes or no; it returns -1, 0, 1
+ * for error, no, yes.
+ */
+
+static int parse_boolean_option (option)
+ register char *option;
+{
+ static struct _booltable {
+ char *name;
+ int value;
+ } booltable[] = {
+ { "off", 0 }, { "n", 0 }, { "no", 0 }, { "false", 0 },
+ { "on", 1 }, { "y", 1 }, { "yes", 1 }, { "true", 1 },
+ { NULL, -1 }};
+ register struct _booltable *t;
+ register char *cp;
+
+ for (cp = option; *cp; cp++) {
+ if (isascii (*cp) && isupper (*cp)) *cp = tolower (*cp);
+ }
+
+ for (t = booltable; t->name; t++) {
+ if (strcmp (option, t->name) == 0) return (t->value);
+ }
+ return (-1);
+}
+
+
+/*
+ * The following is a hack until XrmParseCommand is ready. It determines
+ * whether or not the given string is an abbreviation of the arg.
+ */
+
+static Bool isabbreviation (arg, s, minslen)
+ char *arg;
+ char *s;
+ int minslen;
+{
+ int arglen;
+ int slen;
+
+ /* exact match */
+ if (strcmp (arg, s) == 0) return (True);
+
+ arglen = strlen (arg);
+ slen = strlen (s);
+
+ /* too long or too short */
+ if (slen >= arglen || slen < minslen) return (False);
+
+ /* abbreviation */
+ if (strncmp (arg, s, slen) == 0) return (True);
+
+ /* bad */
+ return (False);
+}
+
+
+enum e_action {doDefault, doBlack, doWhite, doSolid, doNone, doRoot};
+
+struct s_pair {
+ char *resource_name;
+ enum e_action action;
+} pair_table[] = {
+ { "Black", doBlack },
+ { "White", doWhite },
+ { "None", doNone },
+ { "Root", doRoot },
+ { NULL, doDefault }};
+
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ Visual visual;
+ XSetWindowAttributes xswa;
+ int i;
+ char *displayname = NULL;
+ Display *dpy;
+ Colormap cmap;
+ enum e_action action = doDefault;
+ unsigned long mask;
+ int screen;
+ int x, y, width, height;
+ char *geom = NULL;
+ int geom_result;
+ int display_width, display_height;
+ char *solidcolor = NULL;
+ XColor cdef;
+
+ ProgramName = argv[0];
+
+ for (i = 1; i < argc; i++) {
+ char *arg = argv[i];
+
+ if (arg[0] == '-') {
+ if (isabbreviation ("-display", arg, 2)) {
+ if (++i >= argc) Syntax ();
+ displayname = argv[i];
+ continue;
+ } else if (isabbreviation ("-geometry", arg, 2)) {
+ if (++i >= argc) Syntax ();
+ geom = argv[i];
+ continue;
+ } else if (isabbreviation ("-black", arg, 2)) {
+ action = doBlack;
+ continue;
+ } else if (isabbreviation ("-white", arg, 2)) {
+ action = doWhite;
+ continue;
+ } else if (isabbreviation ("-solid", arg, 2)) {
+ if (++i >= argc) Syntax ();
+ solidcolor = argv[i];
+ action = doSolid;
+ continue;
+ } else if (isabbreviation ("-none", arg, 2)) {
+ action = doNone;
+ continue;
+ } else if (isabbreviation ("-root", arg, 2)) {
+ action = doRoot;
+ continue;
+ } else
+ Syntax ();
+ } else if (arg[0] == '=') /* obsolete */
+ geom = arg;
+ else
+ Syntax ();
+ }
+
+ if ((dpy = XOpenDisplay(displayname)) == NULL) {
+ fprintf (stderr, "%s: unable to open display '%s'\n",
+ ProgramName, XDisplayName (displayname));
+ exit (1);
+ }
+
+ if (action == doDefault) {
+ char *def;
+
+ if ((def = XGetDefault (dpy, ProgramName, "Solid")) != NULL) {
+ solidcolor = copystring (def);
+ action = doSolid;
+ } else {
+ struct s_pair *pp;
+
+ for (pp = pair_table; pp->resource_name != NULL; pp++) {
+ def = XGetDefault (dpy, ProgramName, pp->resource_name);
+ if (def && parse_boolean_option (def) == 1) {
+ action = pp->action;
+ }
+ }
+ }
+ }
+
+ if (geom == NULL) geom = XGetDefault (dpy, ProgramName, "Geometry");
+
+ screen = DefaultScreen (dpy);
+ display_width = DisplayWidth (dpy, screen);
+ display_height = DisplayHeight (dpy, screen);
+ x = y = 0;
+ width = display_width;
+ height = display_height;
+
+ if (DisplayCells (dpy, screen) <= 2 && action == doSolid) {
+ if (strcmp (solidcolor, "black") == 0)
+ action = doBlack;
+ else if (strcmp (solidcolor, "white") == 0)
+ action = doWhite;
+ else {
+ fprintf (stderr,
+ "%s: can't use colors on a monochrome display.\n",
+ ProgramName);
+ action = doNone;
+ }
+ }
+
+ if (geom)
+ geom_result = XParseGeometry (geom, &x, &y,
+ (unsigned int *)&width,
+ (unsigned int *)&height);
+ else
+ geom_result = NoValue;
+
+ /*
+ * For parsing geometry, we want to have the following
+ *
+ * = (0,0) for (display_width,display_height)
+ * =WxH+X+Y (X,Y) for (W,H)
+ * =WxH-X-Y (display_width-W-X,display_height-H-Y) for (W,H)
+ * =+X+Y (X,Y) for (display_width-X,display_height-Y)
+ * =WxH (0,0) for (W,H)
+ * =-X-Y (0,0) for (display_width-X,display_height-Y)
+ *
+ * If we let any missing values be taken from (0,0) for
+ * (display_width,display_height) we just have to deal with the
+ * negative offsets.
+ */
+
+ if (geom_result & XNegative) {
+ if (geom_result & WidthValue) {
+ x = display_width - width + x;
+ } else {
+ width = display_width + x;
+ x = 0;
+ }
+ }
+ if (geom_result & YNegative) {
+ if (geom_result & HeightValue) {
+ y = display_height - height + y;
+ } else {
+ height = display_height + y;
+ y = 0;
+ }
+ }
+
+ mask = 0;
+ switch (action) {
+ case doBlack:
+ xswa.background_pixel = BlackPixel (dpy, screen);
+ mask |= CWBackPixel;
+ break;
+ case doWhite:
+ xswa.background_pixel = WhitePixel (dpy, screen);
+ mask |= CWBackPixel;
+ break;
+ case doSolid:
+ cmap = DefaultColormap (dpy, screen);
+ if (XParseColor (dpy, cmap, solidcolor, &cdef) &&
+ XAllocColor (dpy, cmap, &cdef)) {
+ xswa.background_pixel = cdef.pixel;
+ mask |= CWBackPixel;
+ } else {
+ fprintf (stderr,"%s: unable to allocate color '%s'.\n",
+ ProgramName, solidcolor);
+ action = doNone;
+ }
+ break;
+ case doDefault:
+ case doNone:
+ xswa.background_pixmap = None;
+ mask |= CWBackPixmap;
+ break;
+ case doRoot:
+ xswa.background_pixmap = ParentRelative;
+ mask |= CWBackPixmap;
+ break;
+ }
+ xswa.override_redirect = True;
+ xswa.backing_store = NotUseful;
+ xswa.save_under = False;
+ mask |= (CWOverrideRedirect | CWBackingStore | CWSaveUnder);
+ visual.visualid = CopyFromParent;
+ win = XCreateWindow(dpy, DefaultRootWindow(dpy), x, y, width, height,
+ 0, DefaultDepth(dpy, screen), InputOutput, &visual, mask, &xswa);
+
+ /*
+ * at some point, we really ought to go walk the tree and turn off
+ * backing store; or do a ClearArea generating exposures on all windows
+ */
+ XMapWindow (dpy, win);
+ /* the following will free the color that we might have allocateded */
+ XCloseDisplay (dpy);
+ exit (0);
+}
+