home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume5 / floatbg / part01 next >
Text File  |  1989-09-24  |  11KB  |  362 lines

  1. Path: uunet!island!argv
  2. From: argv@island.uu.net (Dan Heller)
  3. Newsgroups: comp.sources.x
  4. Subject: v05i006: floatbg -- slowly modify the root window colors, Part01/01
  5. Message-ID: <1091@island.uu.net>
  6. Date: 24 Sep 89 18:01:06 GMT
  7. Organization: Island Graphics, Marin County, California
  8. Lines: 351
  9. Approved: island!argv@sun.com
  10.  
  11. Submitted-by: uunet!cwi.nl!rekers
  12. Posting-number: Volume 5, Issue 6
  13. Archive-name: floatbg/part01
  14.  
  15. #--------------------------------CUT HERE-------------------------------------
  16. #! /bin/sh
  17. #
  18. # This is a shell archive.  Save this into a file, edit it
  19. # and delete all lines above this comment.  Then give this
  20. # file to sh by executing the command "sh file".  The files
  21. # will be extracted into the current directory owned by
  22. # you with default permissions.
  23. #
  24. # The files contained herein are:
  25. #
  26. # -rw-r--r--  1 rekers       1890 Sep 22 13:53 README
  27. # -rw-r--r--  1 rekers        234 Sep 22 13:58 Makefile
  28. # -rw-r--r--  1 rekers        143 Sep 18 14:36 Imakefile
  29. # -rw-r--r--  1 rekers       4561 Sep 19 16:12 floatbg.c
  30. # -rw-r--r--  1 rekers       1413 Sep 22 13:56 floatbg.man
  31. #
  32. echo 'x - README'
  33. if test -f README; then echo 'shar: not overwriting README'; else
  34. sed 's/^X//' << '________This_Is_The_END________' > README
  35. XFloatbg is a little X-application that slowly modifies the color of
  36. Xthe root-window. You won't be able to see the color change, but after a
  37. Xquarter of an hour, you'll notice that it did change, however. 
  38. X
  39. XThe program does have a minimal processor time consumption, as it sleeps
  40. Xmost of the time and its computations are not complicated.
  41. XAfter having run for more than two hours, `ps ux' on my sparc reported the
  42. Xfollowing:
  43. XUSER       PID %CPU %MEM   SZ  RSS TT STAT START  TIME COMMAND
  44. Xrekers     849  0.0  0.7   52   80 p3 S    12:14   0:00 floatbg
  45. X
  46. XFloatbg doesn't use any window, button or menu, and it can only be stopped
  47. Xby killing it. This is a feature I don't like too much, but making a realy
  48. Xnice user interface is just too much for such a little joke...
  49. X
  50. XFloatbg starts with a random color and changes it deterministicly by moving
  51. Xthrough a hsv-model of colors.
  52. XIn the hsv-model, colors are described by three parameters:
  53. Xh = hue stands for the tint of a color
  54. X    (0 degrees is red, 60 = yellow, 120 = green, 180 = aquamarine, etc)
  55. Xs = saturations stands for the brightness of the color
  56. X    (0 = white, 1 = bright)
  57. Xv = value stands for the intensity of the color
  58. X    (0 = black, 1 = normal)
  59. X
  60. XEvery 10 seconds the hue is increased by 1 degree and the saturation is 
  61. Xchanged by a sinus over the hue. The value remains fixed.
  62. XThe default values are chosen such that all pastel tints are visited,
  63. Xbut these can of course be customized:
  64. Xusage: floatbg [options]
  65. X  where options are:
  66. X  -display <display>   or   -d <display>
  67. X  -help
  68. X  -value <float>   (default 0.87)
  69. X  -satmid <float>  (default 0.375)
  70. X  -satvar <float>  (default 0.125)
  71. X  -fase <float>    (default 0.25)
  72. X  value, (satmid-satvar) and (satmid+satvar) must be between 0 and 1
  73. X
  74. XFloatbg is free and yours!
  75. XI would like to hear about changes people made on it.
  76. X
  77. XAmsterdam, September 18, 1989.
  78. X                    Jan Rekers (email: rekers@cwi.nl)
  79. X
  80. ________This_Is_The_END________
  81. if test `wc -l < README` -ne 45; then
  82.     echo 'shar: README was damaged during transit (should have been 45 bytes)'
  83. fi
  84. fi        ; : end of overwriting check
  85. echo 'x - Makefile'
  86. if test -f Makefile; then echo 'shar: not overwriting Makefile'; else
  87. sed 's/^X//' << '________This_Is_The_END________' > Makefile
  88. X
  89. Xfloatbg: floatbg.o
  90. X    cc -O -o floatbg floatbg.o -lX11 -lm
  91. X
  92. Xfloatbg.o: floatbg.c
  93. X    cc -O -c floatbg.c
  94. X
  95. Xclean:
  96. X    rm -f floatbg floatbg.o floatbg.shar core a.out
  97. X
  98. Xshar:
  99. X    shar -h floatbg.shar README Makefile Imakefile floatbg.c floatbg.man
  100. ________This_Is_The_END________
  101. if test `wc -l < Makefile` -ne 12; then
  102.     echo 'shar: Makefile was damaged during transit (should have been 12 bytes)'
  103. fi
  104. fi        ; : end of overwriting check
  105. echo 'x - Imakefile'
  106. if test -f Imakefile; then echo 'shar: not overwriting Imakefile'; else
  107. sed 's/^X//' << '________This_Is_The_END________' > Imakefile
  108. X  LOCAL_LIBRARIES = $(XLIB)
  109. X             SRCS = floatbg.c
  110. X             OBJS = floatbg.o
  111. XSYSLAST_LIBRARIES = -lm
  112. X
  113. XComplexProgramTarget(floatbg)
  114. ________This_Is_The_END________
  115. if test `wc -l < Imakefile` -ne 6; then
  116.     echo 'shar: Imakefile was damaged during transit (should have been 6 bytes)'
  117. fi
  118. fi        ; : end of overwriting check
  119. echo 'x - floatbg.c'
  120. if test -f floatbg.c; then echo 'shar: not overwriting floatbg.c'; else
  121. sed 's/^X//' << '________This_Is_The_END________' > floatbg.c
  122. X/*
  123. X *    floatbg.c
  124. X *    author: Jan Rekers
  125. X *    purpose: This program slowly changes the color of the root window of X.
  126. X */
  127. X
  128. X#include <X11/Xlib.h>
  129. X#include <stdio.h>
  130. X
  131. X#define MaxColor     0xffff
  132. X#define MaxTime      0x7fff
  133. X#define pi        3.1415926535
  134. X#define default_sf_in_hf    .25
  135. X#define default_s_mid    .375
  136. X#define default_s_var    .125
  137. X#define default_v_val    .87
  138. X
  139. Xchar *program_name;
  140. XDisplay *dpy;
  141. Xint screen;
  142. XWindow root;
  143. X
  144. Xstruct hsv { float h,s,v; };
  145. Xstruct rgb { float r,g,b; };
  146. X
  147. Xvoid hsv2rgb(), ticks2hsv();
  148. Xfloat sf_in_hf = default_sf_in_hf;
  149. Xfloat s_mid = default_s_mid;
  150. Xfloat s_var = default_s_var;
  151. Xfloat v_val = default_v_val;
  152. X
  153. Xunsigned long GetMutableColor();
  154. Xvoid SetColor();
  155. Xlong time(), random();
  156. Xdouble atof();
  157. X
  158. Xusage()
  159. X{
  160. X    fprintf(stderr, "usage: %s [options]\n", program_name);
  161. X    fprintf(stderr, "  where options are:\n");
  162. X    fprintf(stderr, "  -display <display>   or   -d <display>\n");
  163. X    fprintf(stderr, "  -help\n");
  164. X    fprintf(stderr, "  -value <float>   (default %1.2f)\n", default_v_val);
  165. X    fprintf(stderr, "  -satmid <float>  (default %1.3f)\n", default_s_mid);
  166. X    fprintf(stderr, "  -satvar <float>  (default %1.3f)\n", default_s_var);
  167. X    fprintf(stderr, "  -fase <float>    (default %1.2f)\n", default_sf_in_hf);
  168. X    fprintf(stderr, "  value, (satmid-satvar) and (satmid+satvar) must be between 0 and 1\n");
  169. X    exit(1);
  170. X}
  171. X
  172. Xmain(argc, argv) 
  173. X    int argc;
  174. X    char **argv;
  175. X{
  176. X    char *display_name = NULL;
  177. X    unsigned long cmapentry;
  178. X    register int ticks;
  179. X    int i;
  180. X    struct hsv hsv;
  181. X    struct rgb rgb;
  182. X    extern char *optarg;
  183. X
  184. X    program_name=argv[0];
  185. X    for (i = 1; i < argc; i++) {
  186. X    if (!strcmp ("-display", argv[i]) || !strcmp ("-d", argv[i])) {
  187. X        if (++i>=argc) usage ();
  188. X        display_name = argv[i];
  189. X        continue;
  190. X    }
  191. X    if (!strcmp("-help", argv[i])) {
  192. X        usage();
  193. X    }
  194. X    if (!strcmp("-value", argv[i])) {
  195. X        if (++i>=argc) usage();
  196. X        v_val = atof(argv[i]);
  197. X        continue;
  198. X    }
  199. X    if (!strcmp("-satmid", argv[i])) {
  200. X        if (++i>=argc) usage();
  201. X        s_mid = atof(argv[i]);
  202. X        continue;
  203. X    }
  204. X    if (!strcmp("-satvar", argv[i])) {
  205. X        if (++i>=argc) usage();
  206. X        s_var = atof(argv[i]);
  207. X        continue;
  208. X    }
  209. X    if (!strcmp("-fase", argv[i])) {
  210. X        if (++i>=argc) usage();
  211. X        sf_in_hf = atof(argv[i]);
  212. X        continue;
  213. X    }
  214. X    usage();
  215. X    } 
  216. X
  217. X    if ( (v_val < 0) || (v_val > 1) ) usage();
  218. X    if ( ((s_mid - s_var) < 0) || ((s_mid + s_var) > 1) ) usage();
  219. X
  220. X    dpy = XOpenDisplay(display_name);
  221. X    if (!dpy) {
  222. X    fprintf(stderr, "%s:  unable to open display '%s'\n",
  223. X        program_name, XDisplayName (display_name));
  224. X    exit(1);
  225. X    }
  226. X    screen = DefaultScreen(dpy);
  227. X    root = RootWindow(dpy, screen);
  228. X
  229. X    srandom( (int)time(0L) );
  230. X    ticks = (int)random() % MaxTime;
  231. X
  232. X    cmapentry = GetMutableColor();
  233. X    XSetWindowBackground(dpy, root, cmapentry);
  234. X    XClearWindow(dpy, root);
  235. X    while ( 1 ) {
  236. X    ticks2hsv(ticks, &hsv);
  237. X    hsv2rgb(&hsv, &rgb);
  238. X    SetColor(cmapentry, &rgb);
  239. X    XFlush(dpy);
  240. X    ticks = ticks++ % MaxTime;
  241. X    sleep(10);
  242. X    }
  243. X}
  244. X
  245. Xunsigned long GetMutableColor ()
  246. X{
  247. X    XColor color;
  248. X    if (XAllocColorCells (dpy, DefaultColormap(dpy,screen),
  249. X              0, 0, 0, &color.pixel, 1) == NULL) {
  250. X    fprintf(stderr, "%s:  unable to allocate colorcells\n", program_name);
  251. X    exit(1); }
  252. X    return(color.pixel);
  253. X}
  254. X
  255. Xvoid SetColor (pixel, rgb)
  256. X    unsigned long pixel;
  257. X    struct rgb *rgb;
  258. X{
  259. X    XColor color;
  260. X    int red = (int) MaxColor * rgb->r;
  261. X    int green = (int) MaxColor * rgb->g;
  262. X    int blue = (int) MaxColor * rgb->b;
  263. X
  264. X    color.red = red; color.green = green; color.blue = blue;
  265. X    color.pixel = pixel;
  266. X    color.flags = DoRed|DoGreen|DoBlue;
  267. X    XStoreColor(dpy, DefaultColormap(dpy,screen), &color);
  268. X}
  269. X
  270. Xvoid ticks2hsv (ticks, hsv)
  271. X    int ticks;
  272. X    struct hsv *hsv;
  273. X{
  274. X    float s_fase, sin();
  275. X
  276. X    hsv->h = ticks % 360;
  277. X    s_fase = sf_in_hf * (pi / 180) * ticks;
  278. X    hsv->s = s_mid - (s_var * sin(s_fase));
  279. X    hsv->v = v_val;
  280. X}
  281. X
  282. Xvoid hsv2rgb (hsv, rgb)
  283. X    struct hsv *hsv;
  284. X    struct rgb *rgb;
  285. X{
  286. X    int i;
  287. X    float f, p, q, r, h, v;
  288. X
  289. X    v = hsv->v;
  290. X    if (hsv->s == 0) {
  291. X    rgb->r = v; rgb->g = v; rgb->b = v; }
  292. X    else {
  293. X    h = hsv->h / 60;
  294. X    i = (int) h;
  295. X    f = h - i;
  296. X    p = hsv->v * (1 - hsv->s);
  297. X    q = hsv->v * (1 - (hsv->s * f));
  298. X    r = hsv->v * (1 - (hsv->s * (1 - f)));
  299. X    switch (i) {
  300. X        case 0: rgb->r = v; rgb->g = r; rgb->b = p; break;
  301. X        case 1: rgb->r = q; rgb->g = v; rgb->b = p; break;
  302. X        case 2: rgb->r = p; rgb->g = v; rgb->b = r; break;
  303. X        case 3: rgb->r = p; rgb->g = q; rgb->b = v; break;
  304. X        case 4: rgb->r = r; rgb->g = p; rgb->b = v; break;
  305. X        case 5: rgb->r = v; rgb->g = p; rgb->b = q; break;
  306. X    }
  307. X    }
  308. X}
  309. ________This_Is_The_END________
  310. if test `wc -l < floatbg.c` -ne 187; then
  311.     echo 'shar: floatbg.c was damaged during transit (should have been 187 bytes)'
  312. fi
  313. fi        ; : end of overwriting check
  314. echo 'x - floatbg.man'
  315. if test -f floatbg.man; then echo 'shar: not overwriting floatbg.man'; else
  316. sed 's/^X//' << '________This_Is_The_END________' > floatbg.man
  317. X.TH floatbg 1X
  318. X.SH NAME
  319. Xfloatbg \- slowly modify the color of the X root window
  320. X.SH SYNTAX
  321. X\fBfloatbg\fP
  322. X[-display \fIdisplay\fP]
  323. X[-help]
  324. X[-value \fIfloat\fP] 
  325. X[-satmid \fIfloat\fP] 
  326. X[-satvar \fIfloat\fP] 
  327. X[-fase \fIfloat\fP] 
  328. X.SH DESCRIPTION
  329. XFloatbg is an X11 program that modifies the color of the root window
  330. Xin such a manner that you won't to see the color change,
  331. Xbut after a while you'll notice that it did change, however.
  332. X.PP
  333. XFloatbg starts with a random color and changes it deterministicly by moving
  334. Xthrough a hsv-model of colors.
  335. XIn the hsv-model, colors are described by three parameters:
  336. XHue stands for the tint of a color
  337. X(0 degrees is red, 60 = yellow, 120 = green, 180 = aquamarine, etc),
  338. Xsaturations stands for the brightness of the color
  339. X(0 = white, 1 = bright),
  340. Xand value stands for the intensity of the color
  341. X(0 = black, 1 = normal).
  342. X.PP
  343. XEvery 10 seconds the hue (tint) is increased by one degree
  344. Xand the saturation (brightness) is changed by a sinus over the hue.
  345. XThe shape of this sinus can be addapted with
  346. Xthe options -satmid, -satvar and -fase.
  347. XThe value (blackness) is fixed and can be set with the option -value.
  348. XThe default values are: 
  349. X\fIfloatbg -value .87 -satmid .375 -satvar .125 -fase .25\fP,
  350. Xand are such that all pastel tints are visited.
  351. X.SH BUGS
  352. XFloatbg doesn't use any window, button or menu,
  353. Xand it can only be stopped by killing it.
  354. X.SH AUTHOR
  355. XJan Rekers \- rekers@cwi.nl
  356. ________This_Is_The_END________
  357. if test `wc -l < floatbg.man` -ne 39; then
  358.     echo 'shar: floatbg.man was damaged during transit (should have been 39 bytes)'
  359. fi
  360. fi        ; : end of overwriting check
  361. exit 0
  362.