aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/syscons
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>1996-10-01 23:24:09 +0000
committerSøren Schmidt <sos@FreeBSD.org>1996-10-01 23:24:09 +0000
commitd58801b2ee1b6f51e22fd4a9fa1643fa0e0b1e44 (patch)
tree367a2accbca8940b6ecc5c95cfeeb3110b21ecc1 /sys/dev/syscons
parent7dae516d8596864a1b6e3a9219e4561d2b24dc3b (diff)
Notes
Diffstat (limited to 'sys/dev/syscons')
-rw-r--r--sys/dev/syscons/syscons.c66
1 files changed, 37 insertions, 29 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 6647c2407b57..84c8805407a2 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.173 1996/09/30 23:10:35 sos Exp $
+ * $Id: syscons.c,v 1.174 1996/10/01 07:38:14 jkh Exp $
*/
#include "sc.h"
@@ -77,7 +77,6 @@
#define COLD 0
#define WARM 1
-#define RUNNING 2
/* this may break on older VGA's but is usefull on real 32 bit systems */
#define bcopyw bcopy
@@ -103,6 +102,7 @@ static term_stat kernel_console;
static default_attr *current_default;
static int flags = 0;
static char init_done = COLD;
+static short sc_buffer[ROW*COL];
static char switch_in_progress = FALSE;
static char write_in_progress = FALSE;
static char blink_in_progress = FALSE;
@@ -414,7 +414,7 @@ scattach(struct isa_device *dev)
scp->scr_buf = (u_short *)malloc(scp->xsize*scp->ysize*sizeof(u_short),
M_DEVBUF, M_NOWAIT);
/* copy screen to buffer */
- bcopyw(Crtat, scp->scr_buf, scp->xsize * scp->ysize * sizeof(u_short));
+ bcopyw(sc_buffer, scp->scr_buf, scp->xsize * scp->ysize * sizeof(u_short));
scp->cursor_pos = scp->cursor_oldpos =
scp->scr_buf + scp->xpos + scp->ypos * scp->xsize;
scp->mouse_pos = scp->mouse_oldpos = scp->scr_buf;
@@ -426,9 +426,11 @@ scattach(struct isa_device *dev)
bzero(scp->history_head, scp->history_size*sizeof(u_short));
/* initialize cursor stuff */
- draw_cursor_image(scp);
- if (crtc_vga && (flags & CHAR_CURSOR))
- set_destructive_cursor(scp);
+ if (!(scp->status & UNKNOWN_MODE)) {
+ draw_cursor_image(scp);
+ if (crtc_vga && (flags & CHAR_CURSOR))
+ set_destructive_cursor(scp);
+ }
/* get screen update going */
scrn_timer();
@@ -448,15 +450,6 @@ scattach(struct isa_device *dev)
printf("CGA/EGA");
printf(" <%d virtual consoles, flags=0x%x>\n", MAXCONS, flags);
-#ifdef SC_SPLASH_SCREEN
- /*
- * Now put up a graphics image, and maybe cycle a
- * couble of palette entries for simple animation.
- * XXX should be in scinit, but but but....
- */
- toggle_splash_screen(cur_console);
-#endif
-
#if NAPM > 0
scp->r_hook.ah_fun = scresume;
scp->r_hook.ah_arg = NULL;
@@ -540,11 +533,12 @@ scopen(dev_t dev, int flag, int mode, struct proc *p)
return(EBUSY);
if (minor(dev) < MAXCONS && !console[minor(dev)]) {
console[minor(dev)] = alloc_scp();
+ }
#ifdef SC_SPLASH_SCREEN
- toggle_splash_screen(cur_console);
+ if (minor(dev) == 0)
+ toggle_splash_screen(cur_console); /* SOS XXX */
#endif
- }
- return((*linesw[tp->t_line].l_open)(dev, tp));
+ return ((*linesw[tp->t_line].l_open)(dev, tp));
}
int
@@ -1403,7 +1397,7 @@ sccnputc(dev_t dev, int c)
scp->term = kernel_console;
current_default = &kernel_default;
- if (scp->scr_buf == Crtat) {
+ if (scp->scr_buf == Crtat && !(scp->status & UNKNOWN_MODE)) {
remove_cursor_image(scp);
}
buf[0] = c;
@@ -1449,6 +1443,7 @@ static void
scrn_timer()
{
scr_stat *scp = cur_console;
+ int s = spltty();
/* should we just return ? */
if ((scp->status&UNKNOWN_MODE) || blink_in_progress || switch_in_progress) {
@@ -1490,8 +1485,12 @@ scrn_timer()
/* did cursor move since last time ? */
if (scp->cursor_pos != scp->cursor_oldpos) {
/* do we need to remove old cursor image ? */
- if ((scp->cursor_oldpos - scp->scr_buf) < scp->start ||
- ((scp->cursor_oldpos - scp->scr_buf) > scp->end)) {
+ if (((scp->cursor_oldpos - scp->scr_buf) < scp->start ||
+ ((scp->cursor_oldpos - scp->scr_buf) > scp->end)) &&
+ scp->cursor_pos != scp->mouse_oldpos &&
+ scp->cursor_pos != scp->mouse_oldpos+1 &&
+ scp->cursor_pos != scp->mouse_oldpos+scp->xsize &&
+ scp->cursor_pos != scp->mouse_oldpos+scp->xsize+1) {
remove_cursor_image(scp);
}
scp->cursor_oldpos = scp->cursor_pos;
@@ -1499,8 +1498,12 @@ scrn_timer()
}
else {
/* cursor didn't move, has it been overwritten ? */
- if (scp->cursor_pos - scp->scr_buf >= scp->start &&
- scp->cursor_pos - scp->scr_buf <= scp->end) {
+ if ((scp->cursor_pos - scp->scr_buf >= scp->start &&
+ scp->cursor_pos - scp->scr_buf <= scp->end) ||
+ scp->cursor_pos == scp->mouse_pos ||
+ scp->cursor_pos == scp->mouse_pos+1 ||
+ scp->cursor_pos == scp->mouse_pos+scp->xsize ||
+ scp->cursor_pos == scp->mouse_pos+scp->xsize+1) {
draw_cursor_image(scp);
} else {
/* if its a blinking cursor, we may have to update it */
@@ -1520,6 +1523,7 @@ scrn_timer()
if (scrn_blank_time && (time.tv_sec>scrn_time_stamp+scrn_blank_time))
(*current_saver)(TRUE);
timeout((timeout_func_t)scrn_timer, 0, hz/25);
+ splx(s);
}
static void
@@ -2308,8 +2312,8 @@ scinit(void)
current_default = &user_default;
console[0] = &main_console;
init_scp(console[0]);
- console[0]->scr_buf = console[0]->mouse_pos = Crtat;
- console[0]->cursor_pos = console[0]->cursor_oldpos = Crtat + hw_cursor;
+ console[0]->scr_buf = console[0]->mouse_pos = sc_buffer;
+ console[0]->cursor_pos = console[0]->cursor_oldpos = sc_buffer + hw_cursor;
console[0]->xpos = hw_cursor % COL;
console[0]->ypos = hw_cursor / COL;
cur_console = console[0];
@@ -2325,6 +2329,14 @@ scinit(void)
for (i=0; i<sizeof(scr_map); i++) {
scr_map[i] = scr_rmap[i] = i;
}
+
+#ifdef SC_SPLASH_SCREEN
+ /*
+ * Now put up a graphics image, and maybe cycle a
+ * couble of palette entries for simple animation.
+ */
+ toggle_splash_screen(cur_console);
+#endif
}
static scr_stat
@@ -3424,8 +3436,6 @@ draw_mouse_image(scr_stat *scp)
*(crt_pos+1) = (*(scp->mouse_pos+1)&0xff00)|0xd1;
*(crt_pos+scp->xsize+1) = (*(scp->mouse_pos+scp->xsize+1)&0xff00)|0xd3;
}
- mark_for_update(scp, scp->mouse_pos - scp->scr_buf);
- mark_for_update(scp, scp->mouse_pos + scp->xsize + 1 - scp->scr_buf);
}
static void
@@ -3437,8 +3447,6 @@ remove_mouse_image(scr_stat *scp)
*(crt_pos+1) = *(scp->mouse_oldpos+1);
*(crt_pos+scp->xsize) = *(scp->mouse_oldpos+scp->xsize);
*(crt_pos+scp->xsize+1) = *(scp->mouse_oldpos+scp->xsize+1);
- mark_for_update(scp, scp->mouse_oldpos - scp->scr_buf);
- mark_for_update(scp, scp->mouse_oldpos + scp->xsize + 1 - scp->scr_buf);
}
static void