diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 1995-02-05 23:44:25 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 1995-02-05 23:44:25 +0000 |
| commit | 768483b7619cd49f1b729e4a3c544d592681c434 (patch) | |
| tree | 3a14f91309f409926afa675e66ff9105010d2c0f /sys/dev/syscons | |
| parent | 5b07358347b632b80492ba70a2a9cd4403c00dea (diff) | |
Notes
Diffstat (limited to 'sys/dev/syscons')
| -rw-r--r-- | sys/dev/syscons/syscons.c | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 4cef4eee1cb93..5a44b5dfd25fd 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -211,6 +211,7 @@ static scr_stat *cur_console; static scr_stat *new_scp, *old_scp; static term_stat kernel_console; static default_attr *current_default; +static char init_done = FALSE; static char switch_in_progress = FALSE; static char blink_in_progress = FALSE; static char write_in_progress = FALSE; @@ -225,7 +226,7 @@ static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab); #if ASYNCH static u_char kbd_reply = 0; #endif -static int delayed_next_scr; +static int delayed_next_scr = FALSE; static int configuration = 0; /* current setup */ static long scrn_blank_time = 0; /* screen saver timeout value */ static int scrn_blanked = FALSE; /* screen saver active flag */ @@ -485,7 +486,7 @@ static scr_stat if (unit > MAXCONS || unit < 0) return(NULL); - if (unix == MAXCONS) + if (unit == MAXCONS) return console[0]; return console[unit]; } @@ -690,7 +691,10 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p) if (SAVER(data)->num < 0 || SAVER(data)->num >= NUM_SCRN_SAVERS) return EIO; - SCRN_SAVER(FALSE); + if (scrn_blanked) { + SCRN_SAVER(FALSE); + cur_console->status |= UPDATE_SCREEN; + } scrn_saver = SAVER(data)->num; scrn_blank_time = SAVER(data)->time; return 0; @@ -810,9 +814,10 @@ set_mouse_pos: /* make screensaver happy */ if (scp == cur_console) { scrn_time_stamp = time.tv_sec; - if (scrn_blanked) - scp->status |= UPDATE_SCREEN; + if (scrn_blanked) { SCRN_SAVER(FALSE); + scp->status |= UPDATE_SCREEN; + } } return 0; } @@ -894,8 +899,6 @@ set_mouse_pos: sizeof(u_short), M_DEVBUF, M_NOWAIT); if (scp == cur_console) set_mode(scp); - else - scp->scr_buf = scp->scr_buf; clear_screen(scp); if (tp->t_winsize.ws_col != scp->xsize || tp->t_winsize.ws_row != scp->ysize) { @@ -1533,7 +1536,7 @@ scrn_timer() scr_stat *scp = cur_console; /* should we just return ? */ - if ((scp->status & UNKNOWN_MODE) || blink_in_progress) { + if ((scp->status&UNKNOWN_MODE) || blink_in_progress || switch_in_progress) { timeout((timeout_func_t)scrn_timer, 0, hz/10); return; } @@ -1548,13 +1551,13 @@ scrn_timer() if ((scp->status & MOUSE_ENABLED) && ((scp->status & UPDATE_MOUSE) || (scp->status & UPDATE_SCREEN))) draw_mouse_image(scp); + /* update cursor image */ - if (scp->status & CURSOR_ENABLED) { - if ((configuration & BLINK_CURSOR) && (cursor_blinkrate++ & 0x04)) - draw_cursor(scp, FALSE); - else - draw_cursor(scp, TRUE); - } + if (scp->status & CURSOR_ENABLED) + draw_cursor(scp, + !(configuration&BLINK_CURSOR) || !(cursor_blinkrate++&0x04)); + + /* signal update done */ scp->status &= ~UPDATE_SCREEN; } if (scrn_blank_time && (time.tv_sec>scrn_time_stamp+scrn_blank_time)) @@ -1574,12 +1577,12 @@ static int switch_scr(scr_stat *scp, u_int next_scr) { if (switch_in_progress && - (cur_console->proc != pfind(cur_console->pid))) + (cur_console->proc != pfind(cur_console->pid))) switch_in_progress = FALSE; if (next_scr >= MAXCONS || switch_in_progress - || (cur_console->smode.mode == VT_AUTO - && cur_console->status & UNKNOWN_MODE)) { + || (cur_console->smode.mode == VT_AUTO && + cur_console->status & UNKNOWN_MODE)) { do_bell(scp, BELL_PITCH, BELL_DURATION); return EINVAL; } @@ -1603,6 +1606,7 @@ switch_scr(scr_stat *scp, u_int next_scr) wakeup((caddr_t)&new_scp->smode); if (new_scp == old_scp) { switch_in_progress = FALSE; + delayed_next_scr = FALSE; return 0; } @@ -2113,8 +2117,7 @@ static inline void draw_cursor(scr_stat *scp, int show) { if (show && !(scp->status & CURSOR_SHOWN)) { - u_short cursor_image = - *(Crtat + (cur_console->cursor_pos - cur_console->scr_buf)); + u_short cursor_image = *(Crtat + (scp->cursor_pos - scp->scr_buf)); scp->cursor_saveunder = cursor_image; if (configuration & CHAR_CURSOR) @@ -2130,8 +2133,7 @@ draw_cursor(scr_stat *scp, int show) cursor_image &= 0xf0ff; } } - *(Crtat + (cur_console->cursor_pos - cur_console->scr_buf)) = - cursor_image; + *(Crtat + (scp->cursor_pos - scp->scr_buf)) = cursor_image; scp->status |= CURSOR_SHOWN; } if (!show && (scp->status & CURSOR_SHOWN)) { @@ -2246,16 +2248,13 @@ outloop: static void scinit(void) { - -static char init_done = 0; - u_short volatile *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was; unsigned hw_cursor; int i; if (init_done) return; - init_done = 1; + init_done = TRUE; /* * Crtat initialized to point to MONO buffer, if not present change * to CGA_BUF offset. ONLY ADD the difference since locore.s adds @@ -2371,10 +2370,10 @@ init_scp(scr_stat *scp) static void scput(u_char c) { - scr_stat *scp = console[0]; + scr_stat *scp; term_stat save; - scinit(); + scp = console[0]; save = scp->term; scp->term = kernel_console; current_default = &kernel_default; @@ -2384,9 +2383,12 @@ scput(u_char c) kernel_console = scp->term; current_default = &user_default; scp->term = save; - if (scp == cur_console) + if ((scp->scr_buf != Crtat) && (scp == cur_console)) { bcopyw(scp->scr_buf, Crtat, scp->xsize*scp->ysize*sizeof(u_short)); + scp->status &= ~CURSOR_SHOWN; + draw_cursor(scp, TRUE); + } } static u_char @@ -2966,7 +2968,8 @@ special_80x60: special_modetable[2] = 0x08; case M_VGA_C80x30: bcopyw(video_mode_ptr+(64*M_VGA_C80x25),&special_modetable, 64); special_80x30: special_modetable[19] = 0x4f; -special_480l: special_modetable[16] = 0x08; +special_480l: special_modetable[9] |= 0xc0; + special_modetable[16] = 0x08; special_modetable[17] = 0x3e; special_modetable[26] = 0xea; special_modetable[28] = 0xdf; @@ -3331,6 +3334,8 @@ blink_screen(scr_stat *scp) else { scp->status |= UPDATE_SCREEN; blink_in_progress = FALSE; + if (delayed_next_scr) + switch_scr(scp, delayed_next_scr - 1); } } |
