home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!snorkelwacker!tut.cis.ohio-state.edu!rutgers!aramis.rutgers.edu!dartagnan.rutgers.edu!mcgrew
- From: mcgrew@dartagnan.rutgers.edu (Charles Mcgrew)
- Newsgroups: comp.sources.sun
- Subject: v02i015: Refresh example
- Message-ID: <May.29.15.10.46.1990.18895@dartagnan.rutgers.edu>
- Date: 29 May 90 19:10:49 GMT
- Organization: Rutgers Univ., New Brunswick, N.J.
- Lines: 513
- Approved: mcgrew@aramis.rutgers.edu
-
- Submitted-by: david@sun.com (indignation, dread, and nausea)
- Posting-number: Volume 2, Issue 15
- Archive-name: refresh
-
-
- In article <49779@bbn.COM> you write:
- >I need an application (runnable in any window cmdtool/shelltool/vttool)
- >that can refresh the complete display.
-
- #! /bin/sh
- # This is a shar archive. Extract with sh, not csh.
- # The rest of this file will extract:
- # refresh.c
- echo extracting - refresh.c
- sed 's/^X//' > refresh.c << '/*EOF'
- X#if !defined(lint) && !defined(NOID)
- Xstatic char rcsID[] =
- X "$Header: refresh.c,v 1.3 88/12/14 19:42:20 david Exp $";
- X#endif
- X
- X/*
- X * refresh/kill SunView desktop and/or print root window/screen name
- X *
- X * refresh [-krsw] [window|fb]
- X *
- X * -k kill
- X * -r refresh even if doing something else
- X * -s print screen name
- X * -w print root window name
- X *
- X * If no arg specified defaults to $WINDOW_PARENT, then /dev/fb.
- X */
- X
- X/* cc -O -o refresh refresh.c -lsuntool -lsunwindow -lpixrect */
- X
- X#include <sys/types.h>
- X#include <stdio.h>
- X#include <sunwindow/rect.h>
- X#include <sunwindow/win_screen.h>
- X
- Xstatic char *winname, *scrname;
- X
- Xstatic int smatch();
- X
- Xmain(argc, argv)
- X int argc;
- X char *argv[];
- X
- X{
- X int c;
- X int kill = 0, print = 0, refresh = 1, screen = 0;
- X int winfd;
- X
- X extern int optind;
- X extern char *basename(), *emalloc(), *getenv();
- X
- X#ifndef MERGE
- X setprogname(argv[0]);
- X#endif
- X
- X while ((c = getopt(argc, argv, "kprsw")) != EOF)
- X switch (c) {
- X case 'k':
- X kill++;
- X refresh = 0;
- X break;
- X case 'p':
- X case 'w':
- X print++;
- X refresh = 0;
- X break;
- X case 'r':
- X refresh++;
- X break;
- X case 's':
- X screen++;
- X refresh = 0;
- X break;
- X default:
- X error("usage: @P [-krsw] [window|fb]");
- X }
- X
- X winname = getenv("WINDOW_PARENT");
- X scrname = "/dev/fb";
- X
- X if (argc > optind) {
- X if ((scrname = argv[optind])[0] != '/') {
- X scrname = emalloc(strlen(scrname) + 6);
- X sprintf(scrname, "/dev/%s", argv[optind]);
- X }
- X
- X winname = strncmp(basename(scrname), "win", 3) == 0 ?
- X scrname : 0;
- X }
- X
- X if (winname) {
- X scrname = 0;
- X (void) smatch(winfd = winopen(winname));
- X (void) close(winfd);
- X }
- X else {
- X if (win_enumall(smatch) == -1)
- X error("window enumeration error@m");
- X
- X if (!winname)
- X error("cannot find root window on %s", scrname);
- X }
- X
- X if (print)
- X printf("%s\n", winname);
- X
- X if (screen)
- X printf("%s\n", scrname);
- X
- X if (refresh || kill)
- X winfd = winopen(winname);
- X
- X if (refresh)
- X wmgr_refreshwindow(winfd);
- X
- X if (kill)
- X win_screendestroy(winfd);
- X
- X exit(0);
- X}
- X
- Xstatic int
- Xsmatch(fd)
- X int fd;
- X{
- X struct screen screen;
- X char *estrdup();
- X
- X (void) win_screenget(fd, &screen);
- X
- X if (scrname == 0 ||
- X strncmp(scrname, screen.scr_fbname, SCR_NAMESIZE) == 0) {
- X winname = estrdup(screen.scr_rootname);
- X scrname = estrdup(screen.scr_fbname);
- X return 1;
- X }
- X
- X return 0;
- X}
- X
- Xstatic int
- Xwinopen(name)
- X char *name;
- X{
- X int fd;
- X
- X if ((fd = open(name, 0, 0)) < 0)
- X error("cannot open window %s@m", name);
- X return fd;
- X}
- X
- X/* Library functions */
- X
- X#define NOID
- X
- X#if !defined(lint) && !defined(NOID)
- Xstatic char rcsID[] =
- X "$Header: basename.c,v 1.1 87/11/06 12:52:46 david Exp $";
- X#endif
- X
- Xchar *
- Xbasename(path)
- X char *path;
- X{
- X register char *p = path, c;
- X
- X if (!p)
- X return "";
- X
- X while (c = *p++)
- X if (c == '/')
- X path = p;
- X
- X return path;
- X}
- X
- X#if !defined(lint) && !defined(NOID)
- Xstatic char rcsID[] =
- X "$Header: estrdup.c,v 1.1 88/11/25 23:52:53 david Exp $";
- X#endif
- X
- Xchar *
- Xestrdup(s)
- X char *s;
- X{
- X register char *p;
- X register int len;
- X char *emalloc();
- X
- X len = strlen(s) + 1;
- X p = emalloc(len);
- X bcopy(s, p, len);
- X
- X return p;
- X}
- X
- X#if !defined(lint) && !defined(NOID)
- Xstatic char rcsID[] =
- X "$Header: progname.c,v 1.1 87/11/06 12:57:17 david Exp $";
- X#endif
- X
- Xchar *_progname;
- Xextern char *basename();
- X
- Xsetprogname(name)
- X char *name;
- X{
- X _progname = basename(name);
- X}
- X
- Xchar *
- Xgetprogname(name)
- X{
- X return _progname ? _progname : "";
- X}
- X/* $Header: error.h,v 1.1 88/11/25 23:52:34 david Exp $ */
- X
- X#ifndef error_h
- X#define error_h
- X
- Xstruct _Err {
- X int exit;
- X FILE *file;
- X int perror;
- X int stat;
- X} _Err;
- X
- X#endif error_h
- X/* $Header: errdata.c,v 1.1 88/11/25 23:51:51 david Exp $ */
- X
- X#include <stdio.h>
- X/*#include "error.h"*/
- X
- Xstruct _Err _Err = {
- X 1, /* exit */
- X stderr, /* file */
- X 0, /* perror */
- X 1, /* stat */
- X};
- X
- X#if !defined(lint) && !defined(NOID)
- Xstatic char rcsID[] =
- X "$Header: error.c,v 1.4 88/11/25 23:52:16 david Exp $";
- X#endif
- X
- X
- X/*
- X * error("format" [, arg ...])
- X *
- X * exit @e
- X * no exit @w
- X * no newline @c
- X * perror here @M
- X * trailing perror @m
- X * no trailing perror @n
- X * progname here @P
- X * leading progname @p
- X * no leading progname @q
- X * stdout @>
- X * stderr @!
- X */
- X
- X#include <stdio.h>
- X#include <varargs.h>
- X/*#include "error.h"*/
- X
- X#ifdef sparc
- X#include <alloca.h>
- X#endif
- X
- Xextern int errno;
- Xextern int sys_nerr;
- Xextern char *sys_errlist[];
- Xextern char *malloc(), *alloca();
- Xextern char *strcpy();
- X
- Xextern char *getprogname();
- X
- X/*VARARGS*/
- Xerror(va_alist)
- X va_dcl
- X{
- X va_list ap;
- X char *fmt;
- X int res;
- X
- X va_start(ap);
- X fmt = va_arg(ap, char *);
- X res = verror(fmt, ap);
- X va_end(ap);
- X return res;
- X}
- X
- X/*VARARGS1*/
- Xverror(fmt, ap)
- X register char *fmt;
- X va_list ap;
- X{
- X char *newfmt;
- X int errnum = errno;
- X int quit = _Err.exit;
- X FILE *f = _Err.file;
- X int newlen;
- X /* +1 = don't perror, 0 = trailing, -1 = embedded */
- X int noerr = (!_Err.perror || errnum == 0);
- X int err = 0;
- X int nonl = 0;
- X int noprog = 0, prog = 0;
- X register char *p, c;
- X int errlen;
- X char *errstr;
- X int proglen;
- X char *progname;
- X
- X if (!fmt)
- X fmt = "unknown error";
- X
- X /* pass 1 -- compute length of new format string */
- X
- X newlen = 1; /* for trailing null */
- X p = fmt;
- X
- X while (c = *p++) {
- X if (c != '@') {
- X newlen++;
- X continue;
- X }
- X
- X switch (c = *p++) {
- X case 'c':
- X nonl = 1;
- X break;
- X case 'e':
- X quit = 0;
- X break;
- X case 'w':
- X quit = 1;
- X break;
- X case 'M':
- X err++;
- X noerr = -1;
- X break;
- X case 'm':
- X noerr = 0;
- X break;
- X case 'n':
- X noerr = 1;
- X break;
- X case 'P':
- X prog++;
- X noprog = -1;
- X break;
- X case 'p':
- X noprog = 0;
- X break;
- X case 'q':
- X noprog = 1;
- X break;
- X case '>':
- X case '!':
- X break;
- X case 0:
- X p--;
- X /* fall through */
- X case '@':
- X newlen++;
- X break;
- X default:
- X newlen += 2;
- X break;
- X }
- X }
- X
- X if (noprog <= 0) {
- X proglen = strlen(progname = getprogname());
- X
- X newlen += proglen * prog;
- X }
- X
- X if (noerr <= 0) {
- X errlen = errnum < sys_nerr ?
- X strlen(errstr = sys_errlist[errnum]) :
- X sizeof "Error -2000000000";
- X
- X newlen += errlen * err;
- X }
- X
- X /* allocate new format string */
- X
- X /* special case, null format */
- X if (newlen == 0)
- X p = "";
- X /* first try malloc */
- X else if (!(p = malloc((unsigned) newlen)))
- X /* if malloc fails try alloca */
- X if (p = alloca((unsigned) newlen))
- X newlen = 0;
- X /* if alloca fails use format as is */
- X else {
- X /* make sure progname or error is printed */
- X if (prog)
- X noprog = 0;
- X if (err)
- X noerr = 0;
- X }
- X newfmt = p;
- X
- X /* pass 2: build new format string */
- X
- X while (c = *fmt++) {
- X if (c != '@') {
- X *p++ = c;
- X continue;
- X }
- X switch (c = *fmt++) {
- X case 'c':
- X break;
- X case 'e':
- X break;
- X case 'w':
- X break;
- X case 'M':
- X if (errnum < sys_nerr)
- X strcpy(p, errstr);
- X else
- X sprintf(p, "_Error %d", errnum);
- X while (*p)
- X p++;
- X break;
- X case 'm':
- X break;
- X case 'n':
- X break;
- X case 'P':
- X strcpy(p, progname);
- X p += proglen;
- X break;
- X case 'p':
- X break;
- X case 'q':
- X break;
- X case '>':
- X case '!':
- X break;
- X case 0:
- X fmt--;
- X /* fall through */
- X case '@':
- X *p++ = '@';
- X break;
- X default:
- X *p++ = '@';
- X *p++ = c;
- X break;
- X }
- X }
- X *p = 0;
- X
- X if (!noprog)
- X fprintf(f, "%s: ", progname);
- X
- X vfprintf(f, newfmt, ap);
- X
- X if (!noerr)
- X if (errnum < sys_nerr)
- X fprintf(f, " (%s)", errstr);
- X else
- X fprintf(f, " (_Error %d)", errnum);
- X
- X if (!nonl)
- X putc('\n', f);
- X
- X if (quit)
- X exit(_Err.stat);
- X
- X if (newlen)
- X free(newfmt);
- X
- X errno = errnum;
- X return 0;
- X}
- X
- X#if !defined(lint) && !defined(NOID)
- Xstatic char rcsID[] =
- X "$Header: emalloc.c,v 1.4 88/11/25 23:51:46 david Exp $";
- X#endif
- X
- X/*
- X * emalloc.c -- allocate memory, quit on failure
- X */
- X
- Xchar *
- Xemalloc(size)
- X unsigned size;
- X{
- X char *p;
- X extern char *malloc();
- X
- X if (p = malloc(size))
- X return p;
- X
- X error("cannot allocate %u bytes", size);
- X /*NOTREACHED*/
- X}
- /*EOF
- exit
- --
- David DiGiacomo, Sun Microsystems, Mt. View, CA sun!david david@eng.sun.com
-