As I mentioned before, I found the default framebuffer cursor to be extremely distracting as it made the character it's on blink. Here's a patch to make it act just the way it does in text mode. I made it a configurable option. So if the default cursor drives you nuts as well, give it a try. diff -urN -X dontdiff fbdev-2.6/drivers/video/console/Kconfig fbdev/drivers/video/console/Kconfig --- fbdev-2.6/drivers/video/console/Kconfig 2003-10-25 14:43:11.000000000 -0400 +++ fbdev/drivers/video/console/Kconfig 2003-11-15 23:13:02.000000000 -0500 @@ -104,6 +104,13 @@ config FRAMEBUFFER_CONSOLE tristate "Framebuffer Console support" depends on FB + +config FBCON_TEXT_CURSOR + bool "Framebuffer text mode style cursor" + depends on FRAMEBUFFER_CONSOLE + help + Say Y here if you want the framebuffer cursor to behave like it + does in text mode. config PCI_CONSOLE bool diff -urN -X dontdiff fbdev-2.6/drivers/video/console/fbcon.c fbdev/drivers/video/console/fbcon.c --- fbdev-2.6/drivers/video/console/fbcon.c 2003-11-15 03:31:27.000000000 -0500 +++ fbdev/drivers/video/console/fbcon.c 2003-11-15 23:10:14.000000000 -0500 @@ -139,6 +139,11 @@ static int vbl_cursor_cnt; +#ifdef CONFIG_FBCON_TEXT_CURSOR +static u8 *cursor_data = NULL; +static int cursor_data_size = 0; +#endif + #define divides(a, b) ((!(a) || (b)%(a)) ? 0 : 1) /* @@ -966,18 +971,38 @@ } if (mode != CM_ERASE) { - unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; int bgshift = (vc->vc_hi_font_mask) ? 13 : 12; int fgshift = (vc->vc_hi_font_mask) ? 9 : 8; int s_pitch = (vc->vc_font.width + 7) >> 3; int size = s_pitch * vc->vc_font.height; struct fb_cursor cursor; - int cur_height = 0, c, i; - u8 *dst; + int cur_height, c; memset(&cursor, 0, sizeof(struct fb_cursor)); cursor.enable = 1; + switch (vc->vc_cursor_type & 0x0f) { + case CUR_NONE: + cur_height = 0; + break; + case CUR_UNDERLINE: + cur_height = (vc->vc_font.height < 10) ? 1 : 2; + break; + case CUR_LOWER_THIRD: + cur_height = vc->vc_font.height/3; + break; + case CUR_LOWER_HALF: + cur_height = vc->vc_font.height >> 1; + break; + case CUR_TWO_THIRDS: + cur_height = (vc->vc_font.height << 1)/3; + break; + case CUR_BLOCK: + default: + cur_height = vc->vc_font.height; + break; + } + c = scr_readw((u16 *) vc->vc_pos); if (info->cursor.image.bg_color != attr_bgcol(bgshift, c) || @@ -988,6 +1013,12 @@ cursor.set |= FB_CUR_SETCMAP; } + if (info->cursor.hot.x || info->cursor.hot.y) { + cursor.hot.x = cursor.hot.y = 0; + cursor.set |= FB_CUR_SETHOT; + } + +#ifndef CONFIG_FBCON_TEXT_CURSOR if ((info->cursor.image.dx != (vc->vc_font.width * vc->vc_x)) || (info->cursor.image.dy != (vc->vc_font.height * y))) { cursor.image.dx = vc->vc_font.width * vc->vc_x; @@ -1002,15 +1033,13 @@ cursor.set |= FB_CUR_SETSIZE; } - if (info->cursor.hot.x || info->cursor.hot.y) { - cursor.hot.x = cursor.hot.y = 0; - cursor.set |= FB_CUR_SETHOT; - } - if ((cursor.set & FB_CUR_SETSIZE) || (cursor.set & FB_CUR_SETPOS)) { + unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; int width = vc->vc_font.width >> 3; u8 delta = vc->vc_font.width & 7; - + u8 *dst; + int i; + dst = kmalloc(size, GFP_ATOMIC); if (!dst) return; @@ -1019,28 +1048,7 @@ if (info->cursor.image.data) kfree(info->cursor.image.data); info->cursor.image.data = dst; - - switch (vc->vc_cursor_type & 0x0f) { - case CUR_NONE: - cur_height = 0; - break; - case CUR_UNDERLINE: - cur_height = (vc->vc_font.height < 10) ? 1 : 2; - break; - case CUR_LOWER_THIRD: - cur_height = vc->vc_font.height/3; - break; - case CUR_LOWER_HALF: - cur_height = vc->vc_font.height >> 1; - break; - case CUR_TWO_THIRDS: - cur_height = (vc->vc_font.height << 1)/3; - break; - case CUR_BLOCK: - default: - cur_height = vc->vc_font.height; - break; - } + dst += (vc->vc_font.height - cur_height) * s_pitch; for (i = 0; i < cur_height; i++) { memset(dst, 0xff, width); @@ -1048,9 +1056,7 @@ *(dst+width) = 0xf << delta; dst += s_pitch; } - } - if ((cursor.set & FB_CUR_SETSIZE) || (cursor.set & FB_CUR_SETPOS)) { char *src = vc->vc_font.data + ((c & charmask) * size); dst = kmalloc(size, GFP_ATOMIC); @@ -1067,6 +1073,39 @@ *dst++ = 0xff ^ *src++; } } +#else + if ((info->cursor.image.dx != (vc->vc_font.width * vc->vc_x)) || + (info->cursor.image.dy != (vc->vc_font.height * y + vc->vc_font.height - cur_height))) { + cursor.image.dx = vc->vc_font.width * vc->vc_x; + cursor.image.dy = vc->vc_font.height * y + vc->vc_font.height - cur_height; + cursor.set |= FB_CUR_SETPOS; + } + + if (info->cursor.image.height != cur_height || + info->cursor.image.width != vc->vc_font.width) { + cursor.image.height = cur_height; + cursor.image.width = vc->vc_font.width; + cursor.set |= FB_CUR_SETSIZE; + } + + if (cursor.set & FB_CUR_SETSIZE) { + if (size > cursor_data_size) { + if (cursor_data) { + kfree(cursor_data); + cursor_data_size = 0; + } + cursor_data = kmalloc(size, GFP_ATOMIC); + if (!cursor_data) + return; + memset(cursor_data, 0xff, size); + cursor_data_size = size; + } + + cursor.set |= FB_CUR_SETSHAPE; + info->cursor.image.data = cursor_data; + info->cursor.mask = cursor_data; + } +#endif info->fbops->fb_cursor(info, &cursor); info->cursor.enable = 1; atomic_dec(&info->sprite.count); John