home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / sun / volume02 / refresh < prev    next >
Encoding:
Internet Message Format  |  1991-08-27  |  9.3 KB

  1. From decwrl!shlump.nac.dec.com!decuac!haven!aplcen!uakari.primate.wisc.edu!zaphod.mps.ohio-state.edu!pacific.mps.ohio-state.edu!tut.cis.ohio-state.edu!rutgers!aramis.rutgers.edu!dartagnan.rutgers.edu!mcgrew Tue May 29 17:55:56 PDT 1990
  2. Article 113 of comp.sources.sun:
  3. Path: decwrl!shlump.nac.dec.com!decuac!haven!aplcen!uakari.primate.wisc.edu!zaphod.mps.ohio-state.edu!pacific.mps.ohio-state.edu!tut.cis.ohio-state.edu!rutgers!aramis.rutgers.edu!dartagnan.rutgers.edu!mcgrew
  4. From: mcgrew@dartagnan.rutgers.edu (Charles Mcgrew)
  5. Newsgroups: comp.sources.sun
  6. Subject: v02i015:  Refresh example
  7. Message-ID: <May.29.15.10.46.1990.18895@dartagnan.rutgers.edu>
  8. Date: 29 May 90 19:10:49 GMT
  9. Organization: Rutgers Univ., New Brunswick, N.J.
  10. Lines: 513
  11. Approved: mcgrew@aramis.rutgers.edu
  12.  
  13. Submitted-by: david@sun.com (indignation, dread, and nausea)
  14. Posting-number: Volume 2, Issue 15
  15. Archive-name: refresh
  16.  
  17.  
  18. In article <49779@bbn.COM> you write:
  19. >I need an application (runnable in any window cmdtool/shelltool/vttool)
  20. >that can refresh the complete display.
  21.  
  22. #! /bin/sh
  23. # This is a shar archive.  Extract with sh, not csh.
  24. # The rest of this file will extract:
  25. #  refresh.c
  26. echo extracting - refresh.c
  27. sed 's/^X//' > refresh.c << '/*EOF'
  28. X#if !defined(lint) && !defined(NOID)
  29. Xstatic char rcsID[] = 
  30. X    "$Header: refresh.c,v 1.3 88/12/14 19:42:20 david Exp $";
  31. X#endif
  32. X
  33. X/*
  34. X * refresh/kill SunView desktop and/or print root window/screen name
  35. X *
  36. X * refresh [-krsw] [window|fb]
  37. X *
  38. X * -k kill
  39. X * -r refresh even if doing something else
  40. X * -s print screen name
  41. X * -w print root window name
  42. X *
  43. X * If no arg specified defaults to $WINDOW_PARENT, then /dev/fb.
  44. X */
  45. X
  46. X/* cc -O -o refresh refresh.c -lsuntool -lsunwindow -lpixrect */
  47. X
  48. X#include <sys/types.h>
  49. X#include <stdio.h>
  50. X#include <sunwindow/rect.h>
  51. X#include <sunwindow/win_screen.h>
  52. X
  53. Xstatic char *winname, *scrname;
  54. X
  55. Xstatic int smatch();
  56. X
  57. Xmain(argc, argv)
  58. X    int argc;
  59. X    char *argv[];
  60. X
  61. X{
  62. X    int c;
  63. X    int kill = 0, print = 0, refresh = 1, screen = 0;
  64. X    int winfd;
  65. X
  66. X    extern int optind;
  67. X    extern char *basename(), *emalloc(), *getenv();
  68. X
  69. X#ifndef MERGE
  70. X    setprogname(argv[0]);
  71. X#endif
  72. X
  73. X    while ((c = getopt(argc, argv, "kprsw")) != EOF)
  74. X        switch (c) {
  75. X        case 'k':
  76. X            kill++;
  77. X            refresh = 0;
  78. X            break;
  79. X        case 'p':
  80. X        case 'w':
  81. X            print++;
  82. X            refresh = 0;
  83. X            break;
  84. X        case 'r':
  85. X            refresh++;
  86. X            break;
  87. X        case 's':
  88. X            screen++;
  89. X            refresh = 0;
  90. X            break;
  91. X        default:
  92. X            error("usage: @P [-krsw] [window|fb]");
  93. X        }
  94. X
  95. X    winname = getenv("WINDOW_PARENT");
  96. X    scrname = "/dev/fb";
  97. X
  98. X    if (argc > optind) {
  99. X        if ((scrname = argv[optind])[0] != '/') {
  100. X            scrname = emalloc(strlen(scrname) + 6);
  101. X            sprintf(scrname, "/dev/%s", argv[optind]);
  102. X        }
  103. X
  104. X        winname = strncmp(basename(scrname), "win", 3) == 0 ?
  105. X             scrname : 0;
  106. X    }
  107. X
  108. X    if (winname) {
  109. X        scrname = 0;
  110. X        (void) smatch(winfd = winopen(winname));
  111. X        (void) close(winfd);
  112. X    }
  113. X    else {
  114. X        if (win_enumall(smatch) == -1)
  115. X            error("window enumeration error@m");
  116. X
  117. X        if (!winname)
  118. X            error("cannot find root window on %s", scrname);
  119. X    }
  120. X
  121. X    if (print)
  122. X        printf("%s\n", winname);
  123. X
  124. X    if (screen)
  125. X        printf("%s\n", scrname);
  126. X
  127. X    if (refresh || kill)
  128. X        winfd = winopen(winname);
  129. X
  130. X    if (refresh)
  131. X        wmgr_refreshwindow(winfd);
  132. X
  133. X    if (kill)
  134. X        win_screendestroy(winfd);
  135. X
  136. X    exit(0);
  137. X}
  138. X
  139. Xstatic int
  140. Xsmatch(fd)
  141. X    int fd;
  142. X{
  143. X    struct screen screen;
  144. X    char *estrdup();
  145. X
  146. X    (void) win_screenget(fd, &screen);
  147. X
  148. X    if (scrname == 0 ||
  149. X        strncmp(scrname, screen.scr_fbname, SCR_NAMESIZE) == 0) {
  150. X        winname = estrdup(screen.scr_rootname);
  151. X        scrname = estrdup(screen.scr_fbname);
  152. X        return 1;
  153. X    }
  154. X
  155. X    return 0;
  156. X}
  157. X
  158. Xstatic int
  159. Xwinopen(name)
  160. X    char *name;
  161. X{
  162. X    int fd;
  163. X
  164. X    if ((fd = open(name, 0, 0)) < 0)
  165. X        error("cannot open window %s@m", name);
  166. X    return fd;
  167. X}
  168. X
  169. X/* Library functions */
  170. X
  171. X#define    NOID
  172. X
  173. X#if !defined(lint) && !defined(NOID)
  174. Xstatic char rcsID[] = 
  175. X    "$Header: basename.c,v 1.1 87/11/06 12:52:46 david Exp $";
  176. X#endif
  177. X
  178. Xchar *
  179. Xbasename(path)
  180. X    char *path;
  181. X{
  182. X    register char *p = path, c;
  183. X
  184. X    if (!p)
  185. X        return "";
  186. X
  187. X    while (c = *p++)
  188. X        if (c == '/')
  189. X            path = p;
  190. X
  191. X    return path;
  192. X}
  193. X
  194. X#if !defined(lint) && !defined(NOID)
  195. Xstatic char rcsID[] = 
  196. X    "$Header: estrdup.c,v 1.1 88/11/25 23:52:53 david Exp $";
  197. X#endif
  198. X
  199. Xchar *
  200. Xestrdup(s)
  201. X    char *s;
  202. X{
  203. X    register char *p;
  204. X    register int len;
  205. X    char *emalloc();
  206. X
  207. X    len = strlen(s) + 1;
  208. X    p = emalloc(len); 
  209. X    bcopy(s, p, len);
  210. X
  211. X    return p;
  212. X}
  213. X
  214. X#if !defined(lint) && !defined(NOID)
  215. Xstatic char rcsID[] = 
  216. X    "$Header: progname.c,v 1.1 87/11/06 12:57:17 david Exp $";
  217. X#endif
  218. X
  219. Xchar *_progname;
  220. Xextern char *basename();
  221. X
  222. Xsetprogname(name)
  223. X    char *name;
  224. X{
  225. X    _progname = basename(name);
  226. X}
  227. X
  228. Xchar *
  229. Xgetprogname(name)
  230. X{
  231. X    return _progname ? _progname : "";
  232. X}
  233. X/* $Header: error.h,v 1.1 88/11/25 23:52:34 david Exp $ */
  234. X
  235. X#ifndef    error_h
  236. X#define    error_h
  237. X
  238. Xstruct _Err {
  239. X    int exit;
  240. X    FILE *file;
  241. X    int perror;
  242. X    int stat;
  243. X} _Err;
  244. X
  245. X#endif error_h
  246. X/* $Header: errdata.c,v 1.1 88/11/25 23:51:51 david Exp $ */
  247. X
  248. X#include <stdio.h>
  249. X/*#include "error.h"*/
  250. X
  251. Xstruct _Err _Err = {
  252. X    1,        /* exit */
  253. X    stderr,        /* file */
  254. X    0,        /* perror */
  255. X    1,        /* stat */
  256. X};
  257. X
  258. X#if !defined(lint) && !defined(NOID)
  259. Xstatic char rcsID[] = 
  260. X    "$Header: error.c,v 1.4 88/11/25 23:52:16 david Exp $";
  261. X#endif
  262. X
  263. X
  264. X/*
  265. X * error("format" [, arg ...])
  266. X *
  267. X * exit            @e
  268. X * no exit        @w
  269. X * no newline        @c
  270. X * perror here        @M
  271. X * trailing perror    @m
  272. X * no trailing perror    @n
  273. X * progname here    @P
  274. X * leading progname    @p
  275. X * no leading progname    @q
  276. X * stdout        @>
  277. X * stderr        @!
  278. X */
  279. X
  280. X#include <stdio.h>
  281. X#include <varargs.h>
  282. X/*#include "error.h"*/
  283. X
  284. X#ifdef sparc
  285. X#include <alloca.h>
  286. X#endif
  287. X
  288. Xextern int errno;
  289. Xextern int sys_nerr;
  290. Xextern char *sys_errlist[];
  291. Xextern char *malloc(), *alloca();
  292. Xextern char *strcpy();
  293. X
  294. Xextern char *getprogname();
  295. X    
  296. X/*VARARGS*/
  297. Xerror(va_alist)
  298. X    va_dcl
  299. X{
  300. X    va_list ap;
  301. X    char *fmt;
  302. X    int res;
  303. X
  304. X    va_start(ap);
  305. X    fmt = va_arg(ap, char *);
  306. X    res = verror(fmt, ap);
  307. X    va_end(ap);
  308. X    return res;
  309. X}
  310. X    
  311. X/*VARARGS1*/
  312. Xverror(fmt, ap)
  313. X    register char *fmt;
  314. X    va_list ap;
  315. X{
  316. X    char *newfmt;
  317. X    int errnum = errno;
  318. X    int quit = _Err.exit;
  319. X    FILE *f = _Err.file;
  320. X    int newlen;
  321. X    /* +1 = don't perror, 0 = trailing, -1 = embedded */
  322. X    int noerr = (!_Err.perror || errnum == 0);
  323. X     int err = 0;
  324. X    int nonl = 0;
  325. X    int noprog = 0, prog = 0;
  326. X    register char *p, c;
  327. X    int errlen;
  328. X    char *errstr;
  329. X    int proglen;
  330. X    char *progname;
  331. X
  332. X    if (!fmt)
  333. X        fmt = "unknown error";
  334. X
  335. X    /* pass 1 -- compute length of new format string */
  336. X
  337. X    newlen = 1;    /* for trailing null */
  338. X    p = fmt;
  339. X
  340. X    while (c = *p++) {
  341. X        if (c != '@') {
  342. X            newlen++;
  343. X            continue;
  344. X        }
  345. X
  346. X        switch (c = *p++) {
  347. X        case 'c':
  348. X            nonl = 1;
  349. X            break;
  350. X        case 'e':
  351. X            quit = 0;
  352. X            break;
  353. X        case 'w':
  354. X            quit = 1;
  355. X            break;
  356. X        case 'M':
  357. X            err++;
  358. X            noerr = -1;
  359. X            break;
  360. X        case 'm':
  361. X            noerr = 0;
  362. X            break;
  363. X        case 'n':
  364. X            noerr = 1;
  365. X            break;
  366. X        case 'P':
  367. X            prog++;
  368. X            noprog = -1;
  369. X            break;
  370. X        case 'p':
  371. X            noprog = 0;
  372. X            break;
  373. X        case 'q':
  374. X            noprog = 1;
  375. X            break;
  376. X        case '>':
  377. X        case '!':
  378. X            break;
  379. X        case 0:
  380. X            p--;
  381. X            /* fall through */
  382. X        case '@':
  383. X            newlen++;
  384. X            break;
  385. X        default:
  386. X            newlen += 2;
  387. X            break;
  388. X        }
  389. X    }
  390. X
  391. X    if (noprog <= 0) {
  392. X        proglen = strlen(progname = getprogname());
  393. X
  394. X        newlen += proglen * prog;
  395. X    }
  396. X
  397. X    if (noerr <= 0) {
  398. X        errlen = errnum < sys_nerr ? 
  399. X            strlen(errstr = sys_errlist[errnum]) :
  400. X             sizeof "Error -2000000000";
  401. X
  402. X        newlen += errlen * err;
  403. X    }
  404. X
  405. X    /* allocate new format string */
  406. X
  407. X    /* special case, null format */
  408. X    if (newlen == 0)
  409. X        p = "";
  410. X    /* first try malloc */
  411. X    else if (!(p = malloc((unsigned) newlen)))
  412. X        /* if malloc fails try alloca */
  413. X        if (p = alloca((unsigned) newlen))
  414. X            newlen = 0;
  415. X        /* if alloca fails use format as is */
  416. X        else {
  417. X            /* make sure progname or error is printed */
  418. X            if (prog)
  419. X                noprog = 0;
  420. X            if (err)
  421. X                noerr = 0;
  422. X        }
  423. X    newfmt = p;
  424. X
  425. X    /* pass 2: build new format string */
  426. X
  427. X    while (c = *fmt++) {
  428. X        if (c != '@') {
  429. X            *p++ = c;
  430. X            continue;
  431. X        }
  432. X        switch (c = *fmt++) {
  433. X        case 'c':
  434. X            break;
  435. X        case 'e':
  436. X            break;
  437. X        case 'w':
  438. X            break;
  439. X        case 'M':
  440. X            if (errnum < sys_nerr)
  441. X                strcpy(p, errstr);
  442. X            else
  443. X                sprintf(p, "_Error %d", errnum);
  444. X            while (*p)
  445. X                p++;
  446. X            break;
  447. X        case 'm':
  448. X            break;
  449. X        case 'n':
  450. X            break;
  451. X        case 'P':
  452. X            strcpy(p, progname);
  453. X            p += proglen;
  454. X            break;
  455. X        case 'p':
  456. X            break;
  457. X        case 'q':
  458. X            break;
  459. X        case '>':
  460. X        case '!':
  461. X            break;
  462. X        case 0:
  463. X            fmt--;
  464. X            /* fall through */
  465. X        case '@':
  466. X            *p++ = '@';
  467. X            break;
  468. X        default:
  469. X            *p++ = '@';
  470. X            *p++ = c;
  471. X            break;
  472. X        }
  473. X    }
  474. X    *p = 0;
  475. X
  476. X    if (!noprog)
  477. X        fprintf(f, "%s: ", progname);
  478. X
  479. X    vfprintf(f, newfmt, ap);
  480. X
  481. X    if (!noerr)
  482. X        if (errnum < sys_nerr)
  483. X            fprintf(f, " (%s)", errstr);
  484. X        else
  485. X            fprintf(f, " (_Error %d)", errnum);
  486. X
  487. X    if (!nonl)
  488. X        putc('\n', f);
  489. X
  490. X    if (quit)
  491. X        exit(_Err.stat);
  492. X
  493. X    if (newlen)
  494. X        free(newfmt);
  495. X
  496. X    errno = errnum;
  497. X    return 0;
  498. X}
  499. X
  500. X#if !defined(lint) && !defined(NOID)
  501. Xstatic char rcsID[] =
  502. X    "$Header: emalloc.c,v 1.4 88/11/25 23:51:46 david Exp $";
  503. X#endif
  504. X
  505. X/*
  506. X * emalloc.c -- allocate memory, quit on failure
  507. X */
  508. X
  509. Xchar *
  510. Xemalloc(size)
  511. X    unsigned size;
  512. X{
  513. X    char *p;
  514. X    extern char *malloc();
  515. X
  516. X    if (p = malloc(size))
  517. X        return p;
  518. X
  519. X    error("cannot allocate %u bytes", size);
  520. X    /*NOTREACHED*/
  521. X}
  522. /*EOF
  523. exit
  524. -- 
  525. David DiGiacomo, Sun Microsystems, Mt. View, CA  sun!david david@eng.sun.com
  526.  
  527.  
  528.