Date: Mon, 11 Dec 2000 20:30:19 +0200 From: Peter Pentchev <roam@orbitel.bg> To: Dag-Erling Smorgrav <des@ofug.org> Cc: hackers@FreeBSD.ORG Subject: Re: eye-candy hack - warp_saver changing direction :) Message-ID: <20001211203018.A449@ringworld.oblivion.bg> In-Reply-To: <xzphf4ariuz.fsf@flood.ping.uio.no>; from des@ofug.org on Mon, Dec 11, 2000 at 06:03:00PM %2B0100 References: <20001211161847.A606@ringworld.oblivion.bg> <xzpvgsrq759.fsf@flood.ping.uio.no> <20001211180346.C606@ringworld.oblivion.bg> <20001211185524.E606@ringworld.oblivion.bg> <xzphf4ariuz.fsf@flood.ping.uio.no>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Dec 11, 2000 at 06:03:00PM +0100, Dag-Erling Smorgrav wrote: > Peter Pentchev <roam@orbitel.bg> writes: > > SYSCTL_DECL(_kern_saver); > > SYSCTL_DECL is for declaring a node that's defined elsewhere. You > should use the following instead: > > SYSCTL_NODE(_kern, OID_AUTO, saver, CTLFLAG_RW, NULL, "Screensavers"); > > There's no substitute for reading src/sys/sys/sysctl.h. Yes, mea culpa :( All right then, here's a revised patch that: - adds a kern.saver.* sysctl subtree in syscons.c (I *think* this belongs there, it's not each and every screensaver's job to define the global sysctl tree); - defines 8 directions instead of just 2; - adds 4 sysctl's: warp_dir - current movement direction; warp_step - increment to warp_dir on each direction change; warp_period - how long before a direction change; warp_random - boolean flag for random direction changes. If warp_period is > 0, then each warp_period steps, the direction is changed by the following rules: - if warp_random is non-zero, the new direction is random; - if warp_random is zero, warp_dir = (warp_dir + warp_step) modulo 8. The 'standard' behavior is achieved by: warp_dir=0 warp_period=0 The currently default behavior (go round and round and round) is: warp_dir=0 warp_step=1 warp_period=100 warp_random=0 Left-and-right behavior: warp_dir=0 warp_step=4 warp_period=1000 warp_random=0 Random walk: warp_period=100 warp_random=1 G'luck, Peter -- If I were you, who would be reading this sentence? Patch against -current: Index: src/sys/dev/syscons/syscons.c =================================================================== RCS file: /home/ncvs/src/sys/dev/syscons/syscons.c,v retrieving revision 1.349 diff -u -r1.349 syscons.c --- src/sys/dev/syscons/syscons.c 2000/12/08 21:49:55 1.349 +++ src/sys/dev/syscons/syscons.c 2000/12/11 18:19:04 @@ -120,6 +120,8 @@ SYSCTL_INT(_machdep, OID_AUTO, enable_panic_key, CTLFLAG_RW, &enable_panic_key, 0, ""); +SYSCTL_NODE(_kern, OID_AUTO, saver, CTLFLAG_RW, NULL, "Console screensavers") + #define SC_CONSOLECTL 255 #define VIRTUAL_TTY(sc, x) (SC_DEV((sc), (x))->si_tty) Index: src/sys/modules/syscons/warp/warp_saver.c =================================================================== RCS file: /home/ncvs/src/sys/modules/syscons/warp/warp_saver.c,v retrieving revision 1.9 diff -u -r1.9 warp_saver.c --- src/sys/modules/syscons/warp/warp_saver.c 2000/06/25 09:39:11 1.9 +++ src/sys/modules/syscons/warp/warp_saver.c 2000/12/11 18:20:04 @@ -35,6 +35,7 @@ #include <sys/syslog.h> #include <sys/consio.h> #include <sys/fbio.h> +#include <sys/sysctl.h> #include <dev/fb/fbreg.h> #include <dev/fb/splashreg.h> @@ -58,19 +59,60 @@ /* the rest is zero-filled by the compiler */ }; +static int warp_dirs[8] = { + 1, /* E */ + SCRW+1, /* SE */ + SCRW, /* S */ + SCRW-1, /* SW */ + -1, /* W */ + -SCRW-1, /* NW */ + -SCRW, /* N */ + -SCRW+1 /* NE */ +}; +#define WARP_DIRCNT (sizeof(warp_dirs)/sizeof(warp_dirs[0])) + +static int warp_dir = 0, warp_step = 1, warp_period = 100; +static int warp_random = 0; + +/* Make use of syscons's screen saver subtree.. */ +SYSCTL_DECL(_kern_saver); +/* Add our sysctls there */ +SYSCTL_INT(_kern_saver, OID_AUTO, warp_dir, CTLFLAG_RW, &warp_dir, 0, "") +SYSCTL_INT(_kern_saver, OID_AUTO, warp_step, CTLFLAG_RW, &warp_step, 0, "") +SYSCTL_INT(_kern_saver, OID_AUTO, warp_period, CTLFLAG_RW, &warp_period, 0, "") +SYSCTL_INT(_kern_saver, OID_AUTO, warp_random, CTLFLAG_RW, &warp_random, 0, "") + static void -warp_update(void) +warp_update(int *pdir, int step, int period) { int i, j, k, n; + static int cur_state = 0; for (i = 1, k = 0, n = SPP*8; i < 5; i++, n /= 2) for (j = 0; j < n; j++, k++) { vid[star[k]] = 0; - star[k] += i; - if (star[k] > SCRW*SCRH) + + /* calculate the new position */ + star[k] += warp_dirs[*pdir]*i; + /* do not fall off the screen */ + if (star[k] >= SCRW*SCRH) star[k] -= SCRW*SCRH; + else if (star[k] < 0) + star[k] += SCRW*SCRH; + vid[star[k]] = i; } + + if ((period > 0) && (++cur_state >= period)) { + cur_state = 0; + + /* hope gcc is smart enough to optimize the %-by-power-of-two.. */ + /* (not that the random() call is less of a bottleneck :) */ + if (warp_random) + *pdir = random() % WARP_DIRCNT; + else + *pdir = (*pdir + step) % WARP_DIRCNT; + } } static int @@ -94,7 +136,7 @@ } /* update display */ - warp_update(); + warp_update(&warp_dir, warp_step, warp_period); } else { blanked = 0; .......................... ..and against 4.2-STABLE.. Index: src/sys/dev/syscons/syscons.c =================================================================== RCS file: /home/ncvs/src/sys/dev/syscons/syscons.c,v retrieving revision 1.336.2.3 diff -u -r1.336.2.3 syscons.c --- src/sys/dev/syscons/syscons.c 2000/10/29 16:59:27 1.336.2.3 +++ src/sys/dev/syscons/syscons.c 2000/12/11 17:41:30 @@ -118,6 +118,8 @@ SYSCTL_INT(_machdep, OID_AUTO, enable_panic_key, CTLFLAG_RW, &enable_panic_key, 0, ""); +SYSCTL_NODE(_kern, OID_AUTO, saver, CTLFLAG_RW, NULL, "Console screensavers") + #define SC_CONSOLECTL 255 #define VIRTUAL_TTY(sc, x) (SC_DEV((sc), (x))->si_tty) Index: src/sys/modules/syscons/warp/warp_saver.c =================================================================== RCS file: /home/ncvs/src/sys/modules/syscons/warp/warp_saver.c,v retrieving revision 1.7.2.1 diff -u -r1.7.2.1 warp_saver.c --- src/sys/modules/syscons/warp/warp_saver.c 2000/05/10 16:26:47 1.7.2.1 +++ src/sys/modules/syscons/warp/warp_saver.c 2000/12/11 17:42:06 @@ -36,6 +36,7 @@ #include <sys/consio.h> #include <sys/fbio.h> #include <sys/random.h> +#include <sys/sysctl.h> #include <dev/fb/fbreg.h> #include <dev/fb/splashreg.h> @@ -59,19 +60,60 @@ /* the rest is zero-filled by the compiler */ }; +static int warp_dirs[8] = { + 1, /* E */ + SCRW+1, /* SE */ + SCRW, /* S */ + SCRW-1, /* SW */ + -1, /* W */ + -SCRW-1, /* NW */ + -SCRW, /* N */ + -SCRW+1 /* NE */ +}; +#define WARP_DIRCNT (sizeof(warp_dirs)/sizeof(warp_dirs[0])) + +static int warp_dir = 0, warp_step = 1, warp_period = 100; +static int warp_random = 0; + +/* Make use of syscons's screen saver subtree.. */ +SYSCTL_DECL(_kern_saver); +/* Add our sysctls there */ +SYSCTL_INT(_kern_saver, OID_AUTO, warp_dir, CTLFLAG_RW, &warp_dir, 0, "") +SYSCTL_INT(_kern_saver, OID_AUTO, warp_step, CTLFLAG_RW, &warp_step, 0, "") +SYSCTL_INT(_kern_saver, OID_AUTO, warp_period, CTLFLAG_RW, &warp_period, 0, "") +SYSCTL_INT(_kern_saver, OID_AUTO, warp_random, CTLFLAG_RW, &warp_random, 0, "") + static void -warp_update(void) +warp_update(int *pdir, int step, int period) { int i, j, k, n; + static int cur_state = 0; for (i = 1, k = 0, n = SPP*8; i < 5; i++, n /= 2) for (j = 0; j < n; j++, k++) { vid[star[k]] = 0; - star[k] += i; - if (star[k] > SCRW*SCRH) + + /* calculate the new position */ + star[k] += warp_dirs[*pdir]*i; + /* do not fall off the screen */ + if (star[k] >= SCRW*SCRH) star[k] -= SCRW*SCRH; + else if (star[k] < 0) + star[k] += SCRW*SCRH; + vid[star[k]] = i; } + + if ((period > 0) && (++cur_state >= period)) { + cur_state = 0; + + /* hope gcc is smart enough to optimize the %-by-power-of-two.. */ + /* (not that the random() call is less of a bottleneck :) */ + if (warp_random) + *pdir = random() % WARP_DIRCNT; + else + *pdir = (*pdir + step) % WARP_DIRCNT; + } } static int @@ -95,7 +137,7 @@ } /* update display */ - warp_update(); + warp_update(&warp_dir, warp_step, warp_period); } else { blanked = 0; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001211203018.A449>