mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
Fixes annoying behavior and a bug regarding the destructive
cursor (CHAR_CURSOR) 1. Reduced the number of calls to set_destructive_cursor(). The destructive cursor produced noticeable overhead on the system. It was caused by draw_cursor_image() calling set_destructive_cursor() every so often. set_destructive_cursor() absolutely needs to be called when a) the character code under the cursor has changed either because the cursor moved or because the screen was updated or the mouse pointer overlapped the cursor. b) Or a new font has been loaded, c) or the video mode has been changed, d) or the cursor shape has been changed, e) or the user switched virtual consoles. 2. Turn off the configuration flag CHAR_CURSOR (destructive cursor) in scattach() if we have a non-VGA card. The destructive cursor works only for VGA. 3. Removed redundant calls to set_destructive_cursor() in some places. 4. Fixed the "disappearing mouse pointer" problem. The mouse pointer looked hidden under the destructive cursor when it overlaped the cursor. A slightly different version of the patch was reviewd and OKed by sos and ache.
This commit is contained in:
parent
7569c70b61
commit
ac4c944d67
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=27114
@ -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.218 1997/06/29 15:11:39 yokota Exp $
|
||||
* $Id: syscons.c,v 1.219 1997/06/29 22:23:32 ache Exp $
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
@ -254,14 +254,30 @@ static inline void
|
||||
draw_cursor_image(scr_stat *scp)
|
||||
{
|
||||
u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
|
||||
u_short prev_image;
|
||||
|
||||
/* do we have a destructive cursor ? */
|
||||
if (flags & CHAR_CURSOR) {
|
||||
cursor_image = *scp->cursor_pos;
|
||||
prev_image = scp->cursor_saveunder;
|
||||
cursor_image = *ptr & 0x00ff;
|
||||
if (cursor_image == DEAD_CHAR)
|
||||
cursor_image = prev_image & 0x00ff;
|
||||
cursor_image |= *(scp->cursor_pos) & 0xff00;
|
||||
scp->cursor_saveunder = cursor_image;
|
||||
/* update the cursor bitmap if the char under the cursor has changed */
|
||||
if (prev_image != cursor_image)
|
||||
set_destructive_cursor(scp);
|
||||
/* modify cursor_image */
|
||||
if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
|
||||
set_destructive_cursor(scp);
|
||||
/*
|
||||
* When the mouse pointer is at the same position as the cursor,
|
||||
* the cursor bitmap needs to be updated even if the char under
|
||||
* the cursor hasn't changed, because the mouse pionter may
|
||||
* have moved by a few dots within the cursor cel.
|
||||
*/
|
||||
if ((prev_image == cursor_image)
|
||||
&& (cursor_image != *(scp->cursor_pos)))
|
||||
set_destructive_cursor(scp);
|
||||
cursor_image &= 0xff00;
|
||||
cursor_image |= DEAD_CHAR;
|
||||
}
|
||||
@ -593,6 +609,8 @@ scattach(struct isa_device *dev)
|
||||
|
||||
scinit();
|
||||
flags = dev->id_flags;
|
||||
if (!crtc_vga)
|
||||
flags &= ~CHAR_CURSOR;
|
||||
|
||||
scp = console[0];
|
||||
|
||||
@ -619,11 +637,8 @@ scattach(struct isa_device *dev)
|
||||
bzero(scp->history_head, scp->history_size*sizeof(u_short));
|
||||
|
||||
/* initialize cursor stuff */
|
||||
if (!(scp->status & UNKNOWN_MODE)) {
|
||||
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(NULL);
|
||||
@ -919,9 +934,18 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
if (!crtc_vga)
|
||||
return ENXIO;
|
||||
flags |= CHAR_CURSOR;
|
||||
set_destructive_cursor(scp);
|
||||
} else
|
||||
flags &= ~CHAR_CURSOR;
|
||||
/*
|
||||
* The cursor shape is global property; all virtual consoles
|
||||
* are affected. Update the cursor in the current console...
|
||||
*/
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
remove_cursor_image(cur_console);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
draw_cursor_image(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case CONS_BELLTYPE: /* set bell type sound/visual */
|
||||
@ -1310,8 +1334,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (fonts_loaded & FONT_16)
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
load_palette(palette);
|
||||
}
|
||||
/* FALL THROUGH */
|
||||
@ -1480,9 +1502,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_8, 8*256);
|
||||
fonts_loaded |= FONT_8;
|
||||
copy_font(LOAD, FONT_8, font_8);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_8, font_8);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x8: /* get 8x8 dot font */
|
||||
@ -1500,9 +1524,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_14, 14*256);
|
||||
fonts_loaded |= FONT_14;
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x14: /* get 8x14 dot font */
|
||||
@ -1520,9 +1546,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_16, 16*256);
|
||||
fonts_loaded |= FONT_16;
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x16: /* get 8x16 dot font */
|
||||
@ -1881,11 +1909,10 @@ exchange_scr(void)
|
||||
set_mode(new_scp);
|
||||
}
|
||||
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
|
||||
if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) {
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(new_scp);
|
||||
if (!(new_scp->status & UNKNOWN_MODE) && (flags & CHAR_CURSOR))
|
||||
set_destructive_cursor(new_scp);
|
||||
if ((old_scp->status & UNKNOWN_MODE) && crtc_vga)
|
||||
load_palette(palette);
|
||||
}
|
||||
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
|
||||
shfts = ctls = alts = agrs = metas = 0;
|
||||
update_leds(new_scp->status);
|
||||
@ -2356,17 +2383,24 @@ scan_esc(scr_stat *scp, u_char c)
|
||||
flags |= BLINK_CURSOR;
|
||||
else
|
||||
flags &= ~BLINK_CURSOR;
|
||||
if ((scp->term.param[0] & 0x02) && crtc_vga) {
|
||||
if ((scp->term.param[0] & 0x02) && crtc_vga)
|
||||
flags |= CHAR_CURSOR;
|
||||
set_destructive_cursor(scp);
|
||||
} else
|
||||
else
|
||||
flags &= ~CHAR_CURSOR;
|
||||
}
|
||||
else if (scp->term.num_param == 2) {
|
||||
scp->cursor_start = scp->term.param[0] & 0x1F;
|
||||
scp->cursor_end = scp->term.param[1] & 0x1F;
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
}
|
||||
/*
|
||||
* The cursor shape is global property; all virtual consoles
|
||||
* are affected. Update the cursor in the current console...
|
||||
*/
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
remove_cursor_image(cur_console);
|
||||
if (crtc_vga && (flags & CHAR_CURSOR))
|
||||
set_destructive_cursor(cur_console);
|
||||
draw_cursor_image(cur_console);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2597,6 +2631,7 @@ scinit(void)
|
||||
|
||||
console[0]->scr_buf = console[0]->mouse_pos = sc_buffer;
|
||||
console[0]->cursor_pos = console[0]->cursor_oldpos = sc_buffer + hw_cursor;
|
||||
console[0]->cursor_saveunder = *console[0]->cursor_pos;
|
||||
console[0]->xpos = hw_cursor % COL;
|
||||
console[0]->ypos = hw_cursor / COL;
|
||||
for (i=1; i<MAXCONS; i++)
|
||||
@ -2618,6 +2653,7 @@ scinit(void)
|
||||
copy_font(SAVE, FONT_16, font_16);
|
||||
fonts_loaded = FONT_16;
|
||||
save_palette();
|
||||
set_destructive_cursor(console[0]);
|
||||
}
|
||||
|
||||
#ifdef SC_SPLASH_SCREEN
|
||||
@ -2651,6 +2687,7 @@ static scr_stat
|
||||
set_mode(scp);
|
||||
*/
|
||||
clear_screen(scp);
|
||||
scp->cursor_saveunder = *scp->cursor_pos;
|
||||
return scp;
|
||||
}
|
||||
|
||||
|
@ -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.218 1997/06/29 15:11:39 yokota Exp $
|
||||
* $Id: syscons.c,v 1.219 1997/06/29 22:23:32 ache Exp $
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
@ -254,14 +254,30 @@ static inline void
|
||||
draw_cursor_image(scr_stat *scp)
|
||||
{
|
||||
u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
|
||||
u_short prev_image;
|
||||
|
||||
/* do we have a destructive cursor ? */
|
||||
if (flags & CHAR_CURSOR) {
|
||||
cursor_image = *scp->cursor_pos;
|
||||
prev_image = scp->cursor_saveunder;
|
||||
cursor_image = *ptr & 0x00ff;
|
||||
if (cursor_image == DEAD_CHAR)
|
||||
cursor_image = prev_image & 0x00ff;
|
||||
cursor_image |= *(scp->cursor_pos) & 0xff00;
|
||||
scp->cursor_saveunder = cursor_image;
|
||||
/* update the cursor bitmap if the char under the cursor has changed */
|
||||
if (prev_image != cursor_image)
|
||||
set_destructive_cursor(scp);
|
||||
/* modify cursor_image */
|
||||
if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
|
||||
set_destructive_cursor(scp);
|
||||
/*
|
||||
* When the mouse pointer is at the same position as the cursor,
|
||||
* the cursor bitmap needs to be updated even if the char under
|
||||
* the cursor hasn't changed, because the mouse pionter may
|
||||
* have moved by a few dots within the cursor cel.
|
||||
*/
|
||||
if ((prev_image == cursor_image)
|
||||
&& (cursor_image != *(scp->cursor_pos)))
|
||||
set_destructive_cursor(scp);
|
||||
cursor_image &= 0xff00;
|
||||
cursor_image |= DEAD_CHAR;
|
||||
}
|
||||
@ -593,6 +609,8 @@ scattach(struct isa_device *dev)
|
||||
|
||||
scinit();
|
||||
flags = dev->id_flags;
|
||||
if (!crtc_vga)
|
||||
flags &= ~CHAR_CURSOR;
|
||||
|
||||
scp = console[0];
|
||||
|
||||
@ -619,11 +637,8 @@ scattach(struct isa_device *dev)
|
||||
bzero(scp->history_head, scp->history_size*sizeof(u_short));
|
||||
|
||||
/* initialize cursor stuff */
|
||||
if (!(scp->status & UNKNOWN_MODE)) {
|
||||
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(NULL);
|
||||
@ -919,9 +934,18 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
if (!crtc_vga)
|
||||
return ENXIO;
|
||||
flags |= CHAR_CURSOR;
|
||||
set_destructive_cursor(scp);
|
||||
} else
|
||||
flags &= ~CHAR_CURSOR;
|
||||
/*
|
||||
* The cursor shape is global property; all virtual consoles
|
||||
* are affected. Update the cursor in the current console...
|
||||
*/
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
remove_cursor_image(cur_console);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
draw_cursor_image(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case CONS_BELLTYPE: /* set bell type sound/visual */
|
||||
@ -1310,8 +1334,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (fonts_loaded & FONT_16)
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
load_palette(palette);
|
||||
}
|
||||
/* FALL THROUGH */
|
||||
@ -1480,9 +1502,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_8, 8*256);
|
||||
fonts_loaded |= FONT_8;
|
||||
copy_font(LOAD, FONT_8, font_8);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_8, font_8);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x8: /* get 8x8 dot font */
|
||||
@ -1500,9 +1524,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_14, 14*256);
|
||||
fonts_loaded |= FONT_14;
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x14: /* get 8x14 dot font */
|
||||
@ -1520,9 +1546,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_16, 16*256);
|
||||
fonts_loaded |= FONT_16;
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x16: /* get 8x16 dot font */
|
||||
@ -1881,11 +1909,10 @@ exchange_scr(void)
|
||||
set_mode(new_scp);
|
||||
}
|
||||
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
|
||||
if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) {
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(new_scp);
|
||||
if (!(new_scp->status & UNKNOWN_MODE) && (flags & CHAR_CURSOR))
|
||||
set_destructive_cursor(new_scp);
|
||||
if ((old_scp->status & UNKNOWN_MODE) && crtc_vga)
|
||||
load_palette(palette);
|
||||
}
|
||||
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
|
||||
shfts = ctls = alts = agrs = metas = 0;
|
||||
update_leds(new_scp->status);
|
||||
@ -2356,17 +2383,24 @@ scan_esc(scr_stat *scp, u_char c)
|
||||
flags |= BLINK_CURSOR;
|
||||
else
|
||||
flags &= ~BLINK_CURSOR;
|
||||
if ((scp->term.param[0] & 0x02) && crtc_vga) {
|
||||
if ((scp->term.param[0] & 0x02) && crtc_vga)
|
||||
flags |= CHAR_CURSOR;
|
||||
set_destructive_cursor(scp);
|
||||
} else
|
||||
else
|
||||
flags &= ~CHAR_CURSOR;
|
||||
}
|
||||
else if (scp->term.num_param == 2) {
|
||||
scp->cursor_start = scp->term.param[0] & 0x1F;
|
||||
scp->cursor_end = scp->term.param[1] & 0x1F;
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
}
|
||||
/*
|
||||
* The cursor shape is global property; all virtual consoles
|
||||
* are affected. Update the cursor in the current console...
|
||||
*/
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
remove_cursor_image(cur_console);
|
||||
if (crtc_vga && (flags & CHAR_CURSOR))
|
||||
set_destructive_cursor(cur_console);
|
||||
draw_cursor_image(cur_console);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2597,6 +2631,7 @@ scinit(void)
|
||||
|
||||
console[0]->scr_buf = console[0]->mouse_pos = sc_buffer;
|
||||
console[0]->cursor_pos = console[0]->cursor_oldpos = sc_buffer + hw_cursor;
|
||||
console[0]->cursor_saveunder = *console[0]->cursor_pos;
|
||||
console[0]->xpos = hw_cursor % COL;
|
||||
console[0]->ypos = hw_cursor / COL;
|
||||
for (i=1; i<MAXCONS; i++)
|
||||
@ -2618,6 +2653,7 @@ scinit(void)
|
||||
copy_font(SAVE, FONT_16, font_16);
|
||||
fonts_loaded = FONT_16;
|
||||
save_palette();
|
||||
set_destructive_cursor(console[0]);
|
||||
}
|
||||
|
||||
#ifdef SC_SPLASH_SCREEN
|
||||
@ -2651,6 +2687,7 @@ static scr_stat
|
||||
set_mode(scp);
|
||||
*/
|
||||
clear_screen(scp);
|
||||
scp->cursor_saveunder = *scp->cursor_pos;
|
||||
return scp;
|
||||
}
|
||||
|
||||
|
@ -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.218 1997/06/29 15:11:39 yokota Exp $
|
||||
* $Id: syscons.c,v 1.219 1997/06/29 22:23:32 ache Exp $
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
@ -254,14 +254,30 @@ static inline void
|
||||
draw_cursor_image(scr_stat *scp)
|
||||
{
|
||||
u_short cursor_image, *ptr = Crtat + (scp->cursor_pos - scp->scr_buf);
|
||||
u_short prev_image;
|
||||
|
||||
/* do we have a destructive cursor ? */
|
||||
if (flags & CHAR_CURSOR) {
|
||||
cursor_image = *scp->cursor_pos;
|
||||
prev_image = scp->cursor_saveunder;
|
||||
cursor_image = *ptr & 0x00ff;
|
||||
if (cursor_image == DEAD_CHAR)
|
||||
cursor_image = prev_image & 0x00ff;
|
||||
cursor_image |= *(scp->cursor_pos) & 0xff00;
|
||||
scp->cursor_saveunder = cursor_image;
|
||||
/* update the cursor bitmap if the char under the cursor has changed */
|
||||
if (prev_image != cursor_image)
|
||||
set_destructive_cursor(scp);
|
||||
/* modify cursor_image */
|
||||
if (!(flags & BLINK_CURSOR)||((flags & BLINK_CURSOR)&&(blinkrate & 4))){
|
||||
set_destructive_cursor(scp);
|
||||
/*
|
||||
* When the mouse pointer is at the same position as the cursor,
|
||||
* the cursor bitmap needs to be updated even if the char under
|
||||
* the cursor hasn't changed, because the mouse pionter may
|
||||
* have moved by a few dots within the cursor cel.
|
||||
*/
|
||||
if ((prev_image == cursor_image)
|
||||
&& (cursor_image != *(scp->cursor_pos)))
|
||||
set_destructive_cursor(scp);
|
||||
cursor_image &= 0xff00;
|
||||
cursor_image |= DEAD_CHAR;
|
||||
}
|
||||
@ -593,6 +609,8 @@ scattach(struct isa_device *dev)
|
||||
|
||||
scinit();
|
||||
flags = dev->id_flags;
|
||||
if (!crtc_vga)
|
||||
flags &= ~CHAR_CURSOR;
|
||||
|
||||
scp = console[0];
|
||||
|
||||
@ -619,11 +637,8 @@ scattach(struct isa_device *dev)
|
||||
bzero(scp->history_head, scp->history_size*sizeof(u_short));
|
||||
|
||||
/* initialize cursor stuff */
|
||||
if (!(scp->status & UNKNOWN_MODE)) {
|
||||
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(NULL);
|
||||
@ -919,9 +934,18 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
if (!crtc_vga)
|
||||
return ENXIO;
|
||||
flags |= CHAR_CURSOR;
|
||||
set_destructive_cursor(scp);
|
||||
} else
|
||||
flags &= ~CHAR_CURSOR;
|
||||
/*
|
||||
* The cursor shape is global property; all virtual consoles
|
||||
* are affected. Update the cursor in the current console...
|
||||
*/
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
remove_cursor_image(cur_console);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
draw_cursor_image(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case CONS_BELLTYPE: /* set bell type sound/visual */
|
||||
@ -1310,8 +1334,6 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (fonts_loaded & FONT_16)
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
load_palette(palette);
|
||||
}
|
||||
/* FALL THROUGH */
|
||||
@ -1480,9 +1502,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_8, 8*256);
|
||||
fonts_loaded |= FONT_8;
|
||||
copy_font(LOAD, FONT_8, font_8);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_8, font_8);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x8: /* get 8x8 dot font */
|
||||
@ -1500,9 +1524,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_14, 14*256);
|
||||
fonts_loaded |= FONT_14;
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_14, font_14);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x14: /* get 8x14 dot font */
|
||||
@ -1520,9 +1546,11 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
|
||||
return ENXIO;
|
||||
bcopy(data, font_16, 16*256);
|
||||
fonts_loaded |= FONT_16;
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
copy_font(LOAD, FONT_16, font_16);
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(cur_console);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case GIO_FONT8x16: /* get 8x16 dot font */
|
||||
@ -1881,11 +1909,10 @@ exchange_scr(void)
|
||||
set_mode(new_scp);
|
||||
}
|
||||
move_crsr(new_scp, new_scp->xpos, new_scp->ypos);
|
||||
if ((old_scp->status & UNKNOWN_MODE) && crtc_vga) {
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(new_scp);
|
||||
if (!(new_scp->status & UNKNOWN_MODE) && (flags & CHAR_CURSOR))
|
||||
set_destructive_cursor(new_scp);
|
||||
if ((old_scp->status & UNKNOWN_MODE) && crtc_vga)
|
||||
load_palette(palette);
|
||||
}
|
||||
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
|
||||
shfts = ctls = alts = agrs = metas = 0;
|
||||
update_leds(new_scp->status);
|
||||
@ -2356,17 +2383,24 @@ scan_esc(scr_stat *scp, u_char c)
|
||||
flags |= BLINK_CURSOR;
|
||||
else
|
||||
flags &= ~BLINK_CURSOR;
|
||||
if ((scp->term.param[0] & 0x02) && crtc_vga) {
|
||||
if ((scp->term.param[0] & 0x02) && crtc_vga)
|
||||
flags |= CHAR_CURSOR;
|
||||
set_destructive_cursor(scp);
|
||||
} else
|
||||
else
|
||||
flags &= ~CHAR_CURSOR;
|
||||
}
|
||||
else if (scp->term.num_param == 2) {
|
||||
scp->cursor_start = scp->term.param[0] & 0x1F;
|
||||
scp->cursor_end = scp->term.param[1] & 0x1F;
|
||||
if (flags & CHAR_CURSOR)
|
||||
set_destructive_cursor(scp);
|
||||
}
|
||||
/*
|
||||
* The cursor shape is global property; all virtual consoles
|
||||
* are affected. Update the cursor in the current console...
|
||||
*/
|
||||
if (!(cur_console->status & UNKNOWN_MODE)) {
|
||||
remove_cursor_image(cur_console);
|
||||
if (crtc_vga && (flags & CHAR_CURSOR))
|
||||
set_destructive_cursor(cur_console);
|
||||
draw_cursor_image(cur_console);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2597,6 +2631,7 @@ scinit(void)
|
||||
|
||||
console[0]->scr_buf = console[0]->mouse_pos = sc_buffer;
|
||||
console[0]->cursor_pos = console[0]->cursor_oldpos = sc_buffer + hw_cursor;
|
||||
console[0]->cursor_saveunder = *console[0]->cursor_pos;
|
||||
console[0]->xpos = hw_cursor % COL;
|
||||
console[0]->ypos = hw_cursor / COL;
|
||||
for (i=1; i<MAXCONS; i++)
|
||||
@ -2618,6 +2653,7 @@ scinit(void)
|
||||
copy_font(SAVE, FONT_16, font_16);
|
||||
fonts_loaded = FONT_16;
|
||||
save_palette();
|
||||
set_destructive_cursor(console[0]);
|
||||
}
|
||||
|
||||
#ifdef SC_SPLASH_SCREEN
|
||||
@ -2651,6 +2687,7 @@ static scr_stat
|
||||
set_mode(scp);
|
||||
*/
|
||||
clear_screen(scp);
|
||||
scp->cursor_saveunder = *scp->cursor_pos;
|
||||
return scp;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user