diff options
| author | Kazutaka YOKOTA <yokota@FreeBSD.org> | 1997-07-15 14:43:27 +0000 |
|---|---|---|
| committer | Kazutaka YOKOTA <yokota@FreeBSD.org> | 1997-07-15 14:43:27 +0000 |
| commit | 870521063a1da7a1190bbab5d7012d28b51f325e (patch) | |
| tree | 23748b207ede38b66627b04ca2d48fe4739aa6fb | |
| parent | 16684c0e200e87aed321eade0ee7ab2a02304f65 (diff) | |
Notes
| -rw-r--r-- | sys/dev/syscons/syscons.c | 130 | ||||
| -rw-r--r-- | sys/dev/syscons/syscons.h | 4 | ||||
| -rw-r--r-- | sys/i386/isa/syscons.c | 130 | ||||
| -rw-r--r-- | sys/i386/isa/syscons.h | 4 | ||||
| -rw-r--r-- | sys/isa/syscons.c | 130 | ||||
| -rw-r--r-- | sys/isa/syscons.h | 4 |
6 files changed, 291 insertions, 111 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 71dc2b0916a0..31d2b26d6f50 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -25,7 +25,7 @@ * (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: syscons.c,v 1.223 1997/07/09 14:10:19 brian Exp $ + * $Id: syscons.c,v 1.224 1997/07/14 03:36:50 yokota Exp $ */ #include "sc.h" @@ -118,7 +118,7 @@ static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0; static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab); static int delayed_next_scr = FALSE; static long scrn_blank_time = 0; /* screen saver timeout value */ - int scrn_blanked = FALSE; /* screen saver active flag */ + int scrn_blanked = 0; /* screen saver active flag */ static long scrn_time_stamp; u_char scr_map[256]; u_char scr_rmap[256]; @@ -144,7 +144,7 @@ static u_short mouse_or_mask[16] = { }; static void none_saver(int blank) { } -void (*current_saver)(int blank) = none_saver; +static void (*current_saver)(int blank) = none_saver; int (*sc_user_ioctl)(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) = NULL; @@ -192,6 +192,7 @@ static scr_stat *alloc_scp(void); static void init_scp(scr_stat *scp); static int get_scr_num(void); static timeout_t scrn_timer; +static void stop_scrn_saver(void (*saver)(int)); static void clear_screen(scr_stat *scp); static int switch_scr(scr_stat *scp, u_int next_scr); static void exchange_scr(void); @@ -821,11 +822,7 @@ scintr(int unit) u_char *cp; /* make screensaver happy */ - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_time_stamp = mono_time.tv_sec; /* * Loop while there is still input to get from the keyboard. @@ -919,11 +916,9 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */ if (*(int *)data < 0) return EINVAL; - scrn_blank_time = *(int*)data; - if ((scrn_blank_time == 0) && scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_blank_time = *(int *)data; + if (scrn_blank_time == 0) + scrn_time_stamp = mono_time.tv_sec; return 0; case CONS_CURSORTYPE: /* set cursor type blink/noblink */ @@ -1089,11 +1084,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return EINVAL; } /* make screensaver happy */ - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_time_stamp = mono_time.tv_sec; return 0; } @@ -1363,8 +1354,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return 0; case KDSBORDER: /* set border color of this (virtual) console */ - if (!crtc_vga) - return ENXIO; scp->border = *data; if (scp == cur_console) set_border(scp->border); @@ -1691,8 +1680,20 @@ sccnputc(dev_t dev, int c) int sccngetc(dev_t dev) { - int s = spltty(); /* block scintr while we poll */ - int c = scgetc(SCGETC_CN); + int s = spltty(); /* block scintr and scrn_timer while we poll */ + int c; + + /* + * Stop the screen saver if necessary. + * What if we have been running in the screen saver code... XXX + */ + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); + + c = scgetc(SCGETC_CN); + + /* make sure the screen saver won't be activated soon */ + scrn_time_stamp = mono_time.tv_sec; splx(s); return(c); } @@ -1703,7 +1704,11 @@ sccncheckc(dev_t dev) int c, s; s = spltty(); + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); c = scgetc(SCGETC_CN | SCGETC_NONBLOCK); + if (c != NOKEY) + scrn_time_stamp = mono_time.tv_sec; splx(s); return(c == NOKEY ? -1 : c); /* c == -1 can't happen */ } @@ -1766,7 +1771,12 @@ scrn_timer(void *arg) return; } - if (!scrn_blanked) { + /* should we stop the screen saver? */ + if (mono_time.tv_sec <= scrn_time_stamp + scrn_blank_time) + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); + + if (scrn_blanked <= 0) { /* update screen image */ if (scp->start <= scp->end) { sc_bcopy(scp->scr_buf + scp->start, Crtat + scp->start, @@ -1827,12 +1837,52 @@ scrn_timer(void *arg) scp->end = 0; scp->start = scp->xsize*scp->ysize; } - if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time)) + + /* should we activate the screen saver? */ + if ((scrn_blank_time != 0) + && (mono_time.tv_sec > scrn_time_stamp + scrn_blank_time)) (*current_saver)(TRUE); + timeout(scrn_timer, NULL, hz / 25); splx(s); } +int +add_scrn_saver(void (*this_saver)(int)) +{ + if (current_saver != none_saver) + return EBUSY; + current_saver = this_saver; + return 0; +} + +int +remove_scrn_saver(void (*this_saver)(int)) +{ + if (current_saver != this_saver) + return EINVAL; + + /* + * In order to prevent `current_saver' from being called by + * the timeout routine `scrn_timer()' while we manipulate + * the saver list, we shall set `current_saver' to `none_saver' + * before stopping the current saver, rather than blocking by `splXX()'. + */ + current_saver = none_saver; + if (scrn_blanked > 0) + stop_scrn_saver(this_saver); + + return 0; +} + +static void +stop_scrn_saver(void (*saver)(int)) +{ + (*saver)(FALSE); + scrn_time_stamp = mono_time.tv_sec; + mark_all(cur_console); +} + static void clear_screen(scr_stat *scp) { @@ -2367,7 +2417,7 @@ scan_esc(scr_stat *scp, u_char c) break; case 'A': /* set display border color */ - if ((scp->term.num_param == 1) && crtc_vga) { + if (scp->term.num_param == 1) { scp->border=scp->term.param[0] & 0xff; if (scp == cur_console) set_border(scp->border); @@ -2456,13 +2506,9 @@ ansi_put(scr_stat *scp, u_char *buf, int len) u_char *ptr = buf; /* make screensaver happy */ - if (scp == cur_console) { - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(scp); - } - } + if (scp == cur_console) + scrn_time_stamp = mono_time.tv_sec; + write_in_progress++; outloop: if (scp->term.esc) { @@ -3466,10 +3512,22 @@ setup_mode: void set_border(u_char color) { - inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x11); outb(ATC, color); - inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x20); /* enable Palette */ + switch (crtc_type) { + case KD_EGA: + case KD_VGA: + inb(crtc_addr + 6); /* reset flip-flop */ + outb(ATC, 0x11); outb(ATC, color); + inb(crtc_addr + 6); /* reset flip-flop */ + outb(ATC, 0x20); /* enable Palette */ + break; + case KD_CGA: + outb(crtc_addr + 5, color & 0x0f); /* color select register */ + break; + case KD_MONO: + case KD_HERCULES: + default: + break; + } } static void diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h index 7d46410a37ba..78703f7ec94a 100644 --- a/sys/dev/syscons/syscons.h +++ b/sys/dev/syscons/syscons.h @@ -25,7 +25,7 @@ * (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: syscons.h,v 1.29 1997/05/15 05:43:59 yokota Exp $ + * $Id: syscons.h,v 1.30 1997/06/29 15:11:40 yokota Exp $ */ #ifndef _I386_ISA_SYSCONS_H_ @@ -196,5 +196,7 @@ void set_border(u_char color); void set_mode(scr_stat *scp); void copy_font(int operation, int font_type, char* font_image); void load_palette(char *palette); +int add_scrn_saver(void (*this)(int)); +int remove_scrn_saver(void (*this)(int)); #endif /* !_I386_ISA_SYSCONS_H_ */ diff --git a/sys/i386/isa/syscons.c b/sys/i386/isa/syscons.c index 71dc2b0916a0..31d2b26d6f50 100644 --- a/sys/i386/isa/syscons.c +++ b/sys/i386/isa/syscons.c @@ -25,7 +25,7 @@ * (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: syscons.c,v 1.223 1997/07/09 14:10:19 brian Exp $ + * $Id: syscons.c,v 1.224 1997/07/14 03:36:50 yokota Exp $ */ #include "sc.h" @@ -118,7 +118,7 @@ static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0; static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab); static int delayed_next_scr = FALSE; static long scrn_blank_time = 0; /* screen saver timeout value */ - int scrn_blanked = FALSE; /* screen saver active flag */ + int scrn_blanked = 0; /* screen saver active flag */ static long scrn_time_stamp; u_char scr_map[256]; u_char scr_rmap[256]; @@ -144,7 +144,7 @@ static u_short mouse_or_mask[16] = { }; static void none_saver(int blank) { } -void (*current_saver)(int blank) = none_saver; +static void (*current_saver)(int blank) = none_saver; int (*sc_user_ioctl)(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) = NULL; @@ -192,6 +192,7 @@ static scr_stat *alloc_scp(void); static void init_scp(scr_stat *scp); static int get_scr_num(void); static timeout_t scrn_timer; +static void stop_scrn_saver(void (*saver)(int)); static void clear_screen(scr_stat *scp); static int switch_scr(scr_stat *scp, u_int next_scr); static void exchange_scr(void); @@ -821,11 +822,7 @@ scintr(int unit) u_char *cp; /* make screensaver happy */ - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_time_stamp = mono_time.tv_sec; /* * Loop while there is still input to get from the keyboard. @@ -919,11 +916,9 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */ if (*(int *)data < 0) return EINVAL; - scrn_blank_time = *(int*)data; - if ((scrn_blank_time == 0) && scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_blank_time = *(int *)data; + if (scrn_blank_time == 0) + scrn_time_stamp = mono_time.tv_sec; return 0; case CONS_CURSORTYPE: /* set cursor type blink/noblink */ @@ -1089,11 +1084,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return EINVAL; } /* make screensaver happy */ - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_time_stamp = mono_time.tv_sec; return 0; } @@ -1363,8 +1354,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return 0; case KDSBORDER: /* set border color of this (virtual) console */ - if (!crtc_vga) - return ENXIO; scp->border = *data; if (scp == cur_console) set_border(scp->border); @@ -1691,8 +1680,20 @@ sccnputc(dev_t dev, int c) int sccngetc(dev_t dev) { - int s = spltty(); /* block scintr while we poll */ - int c = scgetc(SCGETC_CN); + int s = spltty(); /* block scintr and scrn_timer while we poll */ + int c; + + /* + * Stop the screen saver if necessary. + * What if we have been running in the screen saver code... XXX + */ + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); + + c = scgetc(SCGETC_CN); + + /* make sure the screen saver won't be activated soon */ + scrn_time_stamp = mono_time.tv_sec; splx(s); return(c); } @@ -1703,7 +1704,11 @@ sccncheckc(dev_t dev) int c, s; s = spltty(); + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); c = scgetc(SCGETC_CN | SCGETC_NONBLOCK); + if (c != NOKEY) + scrn_time_stamp = mono_time.tv_sec; splx(s); return(c == NOKEY ? -1 : c); /* c == -1 can't happen */ } @@ -1766,7 +1771,12 @@ scrn_timer(void *arg) return; } - if (!scrn_blanked) { + /* should we stop the screen saver? */ + if (mono_time.tv_sec <= scrn_time_stamp + scrn_blank_time) + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); + + if (scrn_blanked <= 0) { /* update screen image */ if (scp->start <= scp->end) { sc_bcopy(scp->scr_buf + scp->start, Crtat + scp->start, @@ -1827,12 +1837,52 @@ scrn_timer(void *arg) scp->end = 0; scp->start = scp->xsize*scp->ysize; } - if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time)) + + /* should we activate the screen saver? */ + if ((scrn_blank_time != 0) + && (mono_time.tv_sec > scrn_time_stamp + scrn_blank_time)) (*current_saver)(TRUE); + timeout(scrn_timer, NULL, hz / 25); splx(s); } +int +add_scrn_saver(void (*this_saver)(int)) +{ + if (current_saver != none_saver) + return EBUSY; + current_saver = this_saver; + return 0; +} + +int +remove_scrn_saver(void (*this_saver)(int)) +{ + if (current_saver != this_saver) + return EINVAL; + + /* + * In order to prevent `current_saver' from being called by + * the timeout routine `scrn_timer()' while we manipulate + * the saver list, we shall set `current_saver' to `none_saver' + * before stopping the current saver, rather than blocking by `splXX()'. + */ + current_saver = none_saver; + if (scrn_blanked > 0) + stop_scrn_saver(this_saver); + + return 0; +} + +static void +stop_scrn_saver(void (*saver)(int)) +{ + (*saver)(FALSE); + scrn_time_stamp = mono_time.tv_sec; + mark_all(cur_console); +} + static void clear_screen(scr_stat *scp) { @@ -2367,7 +2417,7 @@ scan_esc(scr_stat *scp, u_char c) break; case 'A': /* set display border color */ - if ((scp->term.num_param == 1) && crtc_vga) { + if (scp->term.num_param == 1) { scp->border=scp->term.param[0] & 0xff; if (scp == cur_console) set_border(scp->border); @@ -2456,13 +2506,9 @@ ansi_put(scr_stat *scp, u_char *buf, int len) u_char *ptr = buf; /* make screensaver happy */ - if (scp == cur_console) { - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(scp); - } - } + if (scp == cur_console) + scrn_time_stamp = mono_time.tv_sec; + write_in_progress++; outloop: if (scp->term.esc) { @@ -3466,10 +3512,22 @@ setup_mode: void set_border(u_char color) { - inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x11); outb(ATC, color); - inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x20); /* enable Palette */ + switch (crtc_type) { + case KD_EGA: + case KD_VGA: + inb(crtc_addr + 6); /* reset flip-flop */ + outb(ATC, 0x11); outb(ATC, color); + inb(crtc_addr + 6); /* reset flip-flop */ + outb(ATC, 0x20); /* enable Palette */ + break; + case KD_CGA: + outb(crtc_addr + 5, color & 0x0f); /* color select register */ + break; + case KD_MONO: + case KD_HERCULES: + default: + break; + } } static void diff --git a/sys/i386/isa/syscons.h b/sys/i386/isa/syscons.h index 7d46410a37ba..78703f7ec94a 100644 --- a/sys/i386/isa/syscons.h +++ b/sys/i386/isa/syscons.h @@ -25,7 +25,7 @@ * (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: syscons.h,v 1.29 1997/05/15 05:43:59 yokota Exp $ + * $Id: syscons.h,v 1.30 1997/06/29 15:11:40 yokota Exp $ */ #ifndef _I386_ISA_SYSCONS_H_ @@ -196,5 +196,7 @@ void set_border(u_char color); void set_mode(scr_stat *scp); void copy_font(int operation, int font_type, char* font_image); void load_palette(char *palette); +int add_scrn_saver(void (*this)(int)); +int remove_scrn_saver(void (*this)(int)); #endif /* !_I386_ISA_SYSCONS_H_ */ diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c index 71dc2b0916a0..31d2b26d6f50 100644 --- a/sys/isa/syscons.c +++ b/sys/isa/syscons.c @@ -25,7 +25,7 @@ * (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: syscons.c,v 1.223 1997/07/09 14:10:19 brian Exp $ + * $Id: syscons.c,v 1.224 1997/07/14 03:36:50 yokota Exp $ */ #include "sc.h" @@ -118,7 +118,7 @@ static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0; static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab); static int delayed_next_scr = FALSE; static long scrn_blank_time = 0; /* screen saver timeout value */ - int scrn_blanked = FALSE; /* screen saver active flag */ + int scrn_blanked = 0; /* screen saver active flag */ static long scrn_time_stamp; u_char scr_map[256]; u_char scr_rmap[256]; @@ -144,7 +144,7 @@ static u_short mouse_or_mask[16] = { }; static void none_saver(int blank) { } -void (*current_saver)(int blank) = none_saver; +static void (*current_saver)(int blank) = none_saver; int (*sc_user_ioctl)(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) = NULL; @@ -192,6 +192,7 @@ static scr_stat *alloc_scp(void); static void init_scp(scr_stat *scp); static int get_scr_num(void); static timeout_t scrn_timer; +static void stop_scrn_saver(void (*saver)(int)); static void clear_screen(scr_stat *scp); static int switch_scr(scr_stat *scp, u_int next_scr); static void exchange_scr(void); @@ -821,11 +822,7 @@ scintr(int unit) u_char *cp; /* make screensaver happy */ - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_time_stamp = mono_time.tv_sec; /* * Loop while there is still input to get from the keyboard. @@ -919,11 +916,9 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */ if (*(int *)data < 0) return EINVAL; - scrn_blank_time = *(int*)data; - if ((scrn_blank_time == 0) && scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_blank_time = *(int *)data; + if (scrn_blank_time == 0) + scrn_time_stamp = mono_time.tv_sec; return 0; case CONS_CURSORTYPE: /* set cursor type blink/noblink */ @@ -1089,11 +1084,7 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return EINVAL; } /* make screensaver happy */ - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(cur_console); - } + scrn_time_stamp = mono_time.tv_sec; return 0; } @@ -1363,8 +1354,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) return 0; case KDSBORDER: /* set border color of this (virtual) console */ - if (!crtc_vga) - return ENXIO; scp->border = *data; if (scp == cur_console) set_border(scp->border); @@ -1691,8 +1680,20 @@ sccnputc(dev_t dev, int c) int sccngetc(dev_t dev) { - int s = spltty(); /* block scintr while we poll */ - int c = scgetc(SCGETC_CN); + int s = spltty(); /* block scintr and scrn_timer while we poll */ + int c; + + /* + * Stop the screen saver if necessary. + * What if we have been running in the screen saver code... XXX + */ + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); + + c = scgetc(SCGETC_CN); + + /* make sure the screen saver won't be activated soon */ + scrn_time_stamp = mono_time.tv_sec; splx(s); return(c); } @@ -1703,7 +1704,11 @@ sccncheckc(dev_t dev) int c, s; s = spltty(); + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); c = scgetc(SCGETC_CN | SCGETC_NONBLOCK); + if (c != NOKEY) + scrn_time_stamp = mono_time.tv_sec; splx(s); return(c == NOKEY ? -1 : c); /* c == -1 can't happen */ } @@ -1766,7 +1771,12 @@ scrn_timer(void *arg) return; } - if (!scrn_blanked) { + /* should we stop the screen saver? */ + if (mono_time.tv_sec <= scrn_time_stamp + scrn_blank_time) + if (scrn_blanked > 0) + stop_scrn_saver(current_saver); + + if (scrn_blanked <= 0) { /* update screen image */ if (scp->start <= scp->end) { sc_bcopy(scp->scr_buf + scp->start, Crtat + scp->start, @@ -1827,12 +1837,52 @@ scrn_timer(void *arg) scp->end = 0; scp->start = scp->xsize*scp->ysize; } - if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time)) + + /* should we activate the screen saver? */ + if ((scrn_blank_time != 0) + && (mono_time.tv_sec > scrn_time_stamp + scrn_blank_time)) (*current_saver)(TRUE); + timeout(scrn_timer, NULL, hz / 25); splx(s); } +int +add_scrn_saver(void (*this_saver)(int)) +{ + if (current_saver != none_saver) + return EBUSY; + current_saver = this_saver; + return 0; +} + +int +remove_scrn_saver(void (*this_saver)(int)) +{ + if (current_saver != this_saver) + return EINVAL; + + /* + * In order to prevent `current_saver' from being called by + * the timeout routine `scrn_timer()' while we manipulate + * the saver list, we shall set `current_saver' to `none_saver' + * before stopping the current saver, rather than blocking by `splXX()'. + */ + current_saver = none_saver; + if (scrn_blanked > 0) + stop_scrn_saver(this_saver); + + return 0; +} + +static void +stop_scrn_saver(void (*saver)(int)) +{ + (*saver)(FALSE); + scrn_time_stamp = mono_time.tv_sec; + mark_all(cur_console); +} + static void clear_screen(scr_stat *scp) { @@ -2367,7 +2417,7 @@ scan_esc(scr_stat *scp, u_char c) break; case 'A': /* set display border color */ - if ((scp->term.num_param == 1) && crtc_vga) { + if (scp->term.num_param == 1) { scp->border=scp->term.param[0] & 0xff; if (scp == cur_console) set_border(scp->border); @@ -2456,13 +2506,9 @@ ansi_put(scr_stat *scp, u_char *buf, int len) u_char *ptr = buf; /* make screensaver happy */ - if (scp == cur_console) { - scrn_time_stamp = time.tv_sec; - if (scrn_blanked) { - (*current_saver)(FALSE); - mark_all(scp); - } - } + if (scp == cur_console) + scrn_time_stamp = mono_time.tv_sec; + write_in_progress++; outloop: if (scp->term.esc) { @@ -3466,10 +3512,22 @@ setup_mode: void set_border(u_char color) { - inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x11); outb(ATC, color); - inb(crtc_addr+6); /* reset flip-flop */ - outb(ATC, 0x20); /* enable Palette */ + switch (crtc_type) { + case KD_EGA: + case KD_VGA: + inb(crtc_addr + 6); /* reset flip-flop */ + outb(ATC, 0x11); outb(ATC, color); + inb(crtc_addr + 6); /* reset flip-flop */ + outb(ATC, 0x20); /* enable Palette */ + break; + case KD_CGA: + outb(crtc_addr + 5, color & 0x0f); /* color select register */ + break; + case KD_MONO: + case KD_HERCULES: + default: + break; + } } static void diff --git a/sys/isa/syscons.h b/sys/isa/syscons.h index 7d46410a37ba..78703f7ec94a 100644 --- a/sys/isa/syscons.h +++ b/sys/isa/syscons.h @@ -25,7 +25,7 @@ * (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: syscons.h,v 1.29 1997/05/15 05:43:59 yokota Exp $ + * $Id: syscons.h,v 1.30 1997/06/29 15:11:40 yokota Exp $ */ #ifndef _I386_ISA_SYSCONS_H_ @@ -196,5 +196,7 @@ void set_border(u_char color); void set_mode(scr_stat *scp); void copy_font(int operation, int font_type, char* font_image); void load_palette(char *palette); +int add_scrn_saver(void (*this)(int)); +int remove_scrn_saver(void (*this)(int)); #endif /* !_I386_ISA_SYSCONS_H_ */ |
