home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / sun / volume2 / refresh < prev    next >
Text File  |  1990-05-29  |  9KB  |  524 lines

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