From owner-freebsd-bugs Wed Jan 19 19:50: 9 2000 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id E4C0014F7A for ; Wed, 19 Jan 2000 19:50:02 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id TAA70737; Wed, 19 Jan 2000 19:50:02 -0800 (PST) (envelope-from gnats@FreeBSD.org) Date: Wed, 19 Jan 2000 19:50:02 -0800 (PST) Message-Id: <200001200350.TAA70737@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Kelly Yancey Subject: Re: kern/15996: patch adds hw.syscons.sc_mouse_char sysctl variable Reply-To: Kelly Yancey Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR kern/15996; it has been noted by GNATS. From: Kelly Yancey To: Kazutaka YOKOTA Cc: freebsd-gnats-submit@FreeBSD.org Subject: Re: kern/15996: patch adds hw.syscons.sc_mouse_char sysctl variable Date: Wed, 19 Jan 2000 22:38:12 -0500 (EST) > In principle, any change should go into -CURRENT first, then will be > merged to -STABLE. Although the patch for -STABLE will be much > different from the patch for -CURRENT in our case, I believe this > principle will still stand. > > We shall first commit the change to -CURRENT and test its concept > for a while there, then apply the change to -STABLE. > > Kazu > Here is a patch against -stable as of Jan 19, 2000 which MFC's the functionality using ioctl rather than sysctl. I also imported the changes to vidcontrol to facilitate setting the mouse character. I have been using this on a couple of -stable boxen without incident for several days now. Kelly --- sys/i386/include/console.h.orig Wed Jan 19 20:59:14 2000 +++ sys/i386/include/console.h Wed Jan 19 21:07:22 2000 @@ -161,6 +161,7 @@ #define MOUSE_ACTION 0x07 #define MOUSE_MOTION_EVENT 0x08 #define MOUSE_BUTTON_EVENT 0x09 +#define MOUSE_MOUSECHAR 0x0a struct mouse_info { int operation; @@ -168,6 +169,7 @@ struct mouse_data data; struct mouse_mode mode; struct mouse_event event; + int mouse_char; }u; }; --- sys/alpha/include/console.h.orig Wed Jan 19 21:02:10 2000 +++ sys/alpha/include/console.h Wed Jan 19 21:08:27 2000 @@ -162,6 +162,7 @@ #define MOUSE_ACTION 0x07 #define MOUSE_MOTION_EVENT 0x08 #define MOUSE_BUTTON_EVENT 0x09 +#define MOUSE_MOUSECHAR 0x0a struct mouse_info { int operation; @@ -169,6 +170,7 @@ struct mouse_data data; struct mouse_mode mode; struct mouse_event event; + int mouse_char; }u; }; --- usr.sbin/vidcontrol/vidcontrol.c.orig Wed Jan 19 21:46:52 2000 +++ usr.sbin/vidcontrol/vidcontrol.c Wed Jan 19 21:52:24 2000 @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -57,10 +58,11 @@ static void usage() { - fprintf(stderr, "%s\n%s\n%s\n", + fprintf(stderr, "%s\n%s\n%s\n%s\n", "usage: vidcontrol [-r fg bg] [-b color] [-c appearance] [-d] [-l scrmap]", -" [-i adapter | mode] [-L] [-m on|off] [-f size file]", -" [-s number] [-t N|off] [-x] [mode] [fgcol [bgcol]] [show]"); +" [-i adapter | mode] [-L] [-M char] [-m on|off]", +" [-f size file] [-s number] [-t N|off] [-x] [mode]", +" [fgcol [bgcol]] [show]"); exit(1); } @@ -390,6 +392,22 @@ } void +set_mouse_char(char *arg) +{ + struct mouse_info mouse; + long l; + + l = strtol(arg, NULL, 0); + if ((l < 0) || (l > UCHAR_MAX)) { + warnx("argument to -M must be 0 through %d", UCHAR_MAX); + return; + } + mouse.operation = MOUSE_MOUSECHAR; + mouse.u.mouse_char = (int)l; + ioctl(0, CONS_MOUSECTL, &mouse); +} + +void set_mouse(char *arg) { struct mouse_info mouse; @@ -529,7 +547,7 @@ info.size = sizeof(info); if (ioctl(0, CONS_GETINFO, &info) < 0) err(1, "must be on a virtual console"); - while((opt = getopt(argc, argv, "b:c:df:i:l:Lm:r:s:t:x")) != -1) + while((opt = getopt(argc, argv, "b:c:df:i:l:LM:m:r:s:t:x")) != -1) switch(opt) { case 'b': set_border_color(optarg); @@ -552,6 +570,9 @@ break; case 'L': load_default_scrnmap(); + break; + case 'M': + set_mouse_char(optarg); break; case 'm': set_mouse(optarg); --- sys/dev/syscons/syscons.c.orig Wed Jan 19 20:52:32 2000 +++ sys/dev/syscons/syscons.c Wed Jan 19 22:27:33 2000 @@ -41,6 +41,8 @@ #endif #include "opt_syscons.h" +#include + #if NSC > 0 #include #include @@ -239,6 +241,7 @@ #define SC_CONSOLE 255 vm_offset_t Crtat; static const int nsccons = MAXCONS+2; +static int sc_mouse_char = SC_MOUSE_CHAR; #define WRAPHIST(scp, pointer, offset)\ ((scp)->history + ((((pointer) - (scp)->history) + (scp)->history_size \ @@ -1280,6 +1283,54 @@ } break; + case MOUSE_MOUSECHAR: + if (mouse->u.mouse_char < 0) { + mouse->u.mouse_char = sc_mouse_char; + } else { + char *font = NULL; + + if (mouse->u.mouse_char >= UCHAR_MAX - 4) + return EINVAL; + + /* + * The base character for drawing the mouse pointer has changed. + * Clear the pointer, restore the original font definitions, + * and the redraw the pointer - mangling the new characters. + */ + s = spltty(); + remove_mouse_image(cur_console); + + if (ISTEXTSC(cur_console) && + (cur_console->font_size != FONT_NONE)) { + if (scp->font_size < 14) { + if (fonts_loaded & FONT_8) + font = font_8; + } + else if (scp->font_size >= 16) { + if (fonts_loaded & FONT_16) + font = font_16; + } + else { + if (fonts_loaded & FONT_14) + font = font_8; + } + + if (font != NULL) { + font_loading_in_progress = TRUE; + (*vidsw[scp->ad]->load_font)(scp->adp, 0, + cur_console->font_size, + font + (sc_mouse_char * cur_console->font_size), + sc_mouse_char, 4); + font_loading_in_progress = FALSE; + (*vidsw[scp->ad]->show_font)(scp->adp, 0); + } + } + + sc_mouse_char = mouse->u.mouse_char; + splx(s); + } + break; + default: return EINVAL; } @@ -4217,13 +4268,13 @@ } if (scp->status & MOUSE_VISIBLE) { - if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR) + if ((scp->cursor_saveunder & 0xff) == sc_mouse_char) bcopy(&scp->mouse_cursor[0], cursor, scp->font_size); - else if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR + 1) + else if ((scp->cursor_saveunder & 0xff) == sc_mouse_char + 1) bcopy(&scp->mouse_cursor[32], cursor, scp->font_size); - else if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR + 2) + else if ((scp->cursor_saveunder & 0xff) == sc_mouse_char + 2) bcopy(&scp->mouse_cursor[64], cursor, scp->font_size); - else if ((scp->cursor_saveunder & 0xff) == SC_MOUSE_CHAR + 3) + else if ((scp->cursor_saveunder & 0xff) == sc_mouse_char + 3) bcopy(&scp->mouse_cursor[96], cursor, scp->font_size); else bcopy(font_buffer+((scp->cursor_saveunder & 0xff)*scp->font_size), @@ -4551,16 +4602,16 @@ #endif font_loading_in_progress = TRUE; (*vidsw[scp->ad]->load_font)(scp->adp, 0, 32, scp->mouse_cursor, - SC_MOUSE_CHAR, 4); + sc_mouse_char, 4); font_loading_in_progress = FALSE; - writew(crt_pos, (*(scp->mouse_pos) & 0xff00) | SC_MOUSE_CHAR); + writew(crt_pos, (*(scp->mouse_pos) & 0xff00) | sc_mouse_char); writew(crt_pos+2*scp->xsize, - (*(scp->mouse_pos + scp->xsize) & 0xff00) | (SC_MOUSE_CHAR + 2)); + (*(scp->mouse_pos + scp->xsize) & 0xff00) | (sc_mouse_char + 2)); if (scp->mouse_xpos < (scp->xsize-1)*8) { - writew(crt_pos + 2, (*(scp->mouse_pos + 1) & 0xff00) | (SC_MOUSE_CHAR + 1)); + writew(crt_pos + 2, (*(scp->mouse_pos + 1) & 0xff00) | (sc_mouse_char + 1)); writew(crt_pos+2*scp->xsize + 2, - (*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (SC_MOUSE_CHAR + 3)); + (*(scp->mouse_pos + scp->xsize + 1) & 0xff00) | (sc_mouse_char + 3)); } mark_for_update(scp, scp->mouse_pos - scp->scr_buf); mark_for_update(scp, scp->mouse_pos + scp->xsize + 1 - scp->scr_buf); -- Kelly Yancey - kbyanc@posi.net - Richmond, VA Analyst / E-business Development, Bell Industries http://www.bellind.com/ Maintainer, BSD Driver Database http://www.posi.net/freebsd/drivers/ Coordinator, Team FreeBSD http://www.posi.net/freebsd/Team-FreeBSD/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message