summaryrefslogtreecommitdiffstats
path: root/sys/isa
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1997-06-30 13:31:49 +0000
committeryokota <yokota@FreeBSD.org>1997-06-30 13:31:49 +0000
commitacda80dd9da57aa1dbea968d1f7b6a9cdf8ea1e2 (patch)
treed60262a517c01167522a052abd6837de6c80f656 /sys/isa
parent793e761486f7f9482754d2ce7926fe0643d36657 (diff)
downloadFreeBSD-src-acda80dd9da57aa1dbea968d1f7b6a9cdf8ea1e2.zip
FreeBSD-src-acda80dd9da57aa1dbea968d1f7b6a9cdf8ea1e2.tar.gz
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.
Diffstat (limited to 'sys/isa')
-rw-r--r--sys/isa/syscons.c93
1 files changed, 65 insertions, 28 deletions
diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c
index 5569633f..eb2b0ad 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.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;
}
OpenPOWER on IntegriCloud