diff options
Diffstat (limited to 'sys/modules/syscons/snake/snake_saver.c')
-rw-r--r-- | sys/modules/syscons/snake/snake_saver.c | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/sys/modules/syscons/snake/snake_saver.c b/sys/modules/syscons/snake/snake_saver.c index 642e6b15b309e..efb76d505df73 100644 --- a/sys/modules/syscons/snake/snake_saver.c +++ b/sys/modules/syscons/snake/snake_saver.c @@ -25,12 +25,14 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: snake_saver.c,v 1.21 1999/01/11 03:18:52 yokota Exp $ + * $Id: snake_saver.c,v 1.18 1998/09/15 18:16:39 sos Exp $ */ #include <sys/param.h> #include <sys/systm.h> -#include <sys/module.h> +#include <sys/exec.h> +#include <sys/sysent.h> +#include <sys/lkm.h> #include <sys/malloc.h> #include <sys/kernel.h> #include <sys/sysctl.h> @@ -40,14 +42,15 @@ #include <saver.h> +MOD_MISC(snake_saver); + static char *message; static u_char **messagep; static int messagelen; static u_short *window; -static int blanked; -static int -snake_saver(video_adapter_t *adp, int blank) +static void +snake_saver(int blank) { static int dirx, diry; int f; @@ -58,11 +61,12 @@ snake_saver(video_adapter_t *adp, int blank) #define savs messagep if (blank) { - if (adp->va_mode_flags & V_INFO_GRAPHICS) - return EAGAIN; - if (blanked <= 0) { - window = (u_short *)adp->va_window; - fillw(((FG_LIGHTGREY|BG_BLACK)<<8) | scr_map[0x20], + if (!ISTEXTSC(scp)) + return; + if (scrn_blanked <= 0) { + scp->status |= SAVER_RUNNING; + window = (u_short *)(*biosvidsw.adapter)(scp->adp)->va_window; + fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], window, scp->xsize * scp->ysize); set_border(scp, 0); dirx = (scp->xpos ? 1 : -1); @@ -72,11 +76,16 @@ snake_saver(video_adapter_t *adp, int blank) savs[f] = (u_char *)window + 2 * (scp->xpos+scp->ypos*scp->xsize); *(savs[0]) = scr_map[*save]; - blanked = 1; + f = scp->ysize * scp->xsize + 5; + outb(crtc_addr, 14); + outb(crtc_addr+1, f >> 8); + outb(crtc_addr, 15); + outb(crtc_addr+1, f & 0xff); + scrn_blanked = 1; } - if (blanked++ < 4) - return 0; - blanked = 1; + if (scrn_blanked++ < 4) + return; + scrn_blanked = 1; *(savs[messagelen-1]) = scr_map[0x20]; for (f=messagelen-1; f > 0; f--) savs[f] = savs[f-1]; @@ -94,31 +103,48 @@ snake_saver(video_adapter_t *adp, int blank) *(savs[f]) = scr_map[save[f]]; } else { - blanked = 0; + if (scrn_blanked > 0) { + set_border(scp, scp->border); + scrn_blanked = 0; + scp->status &= ~SAVER_RUNNING; + } } - return 0; } static int -snake_init(video_adapter_t *adp) +snake_saver_load(struct lkm_table *lkmtp, int cmd) { + int err; + messagelen = strlen(ostype) + 1 + strlen(osrelease); message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); sprintf(message, "%s %s", ostype, osrelease); messagep = malloc(messagelen * sizeof *messagep, M_DEVBUF, M_WAITOK); - return 0; + + err = add_scrn_saver(snake_saver); + if (err != 0) { + free(message, M_DEVBUF); + free(messagep, M_DEVBUF); + } + return err; } static int -snake_term(video_adapter_t *adp) +snake_saver_unload(struct lkm_table *lkmtp, int cmd) { - free(message, M_DEVBUF); - free(messagep, M_DEVBUF); - return 0; -} + int err; -static scrn_saver_t snake_module = { - "snake_saver", snake_init, snake_term, snake_saver, NULL, -}; + err = remove_scrn_saver(snake_saver); + if (err == 0) { + free(message, M_DEVBUF); + free(messagep, M_DEVBUF); + } + return err; +} -SAVER_MODULE(snake_saver, snake_module); +int +snake_saver_mod(struct lkm_table *lkmtp, int cmd, int ver) +{ + MOD_DISPATCH(snake_saver, lkmtp, cmd, ver, + snake_saver_load, snake_saver_unload, lkm_nullcmd); +} |