aboutsummaryrefslogtreecommitdiff
path: root/sys/isa/syscons.c
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>1997-10-01 20:46:29 +0000
committerSøren Schmidt <sos@FreeBSD.org>1997-10-01 20:46:29 +0000
commit3bd724f2b3e64d033bf79729a6b89473ee4a3b14 (patch)
tree7d7ea574008ce716f71027ae000c8c113e42f5ef /sys/isa/syscons.c
parent62a9dc968b3625766d4f3c5c67c8ee8d529801ef (diff)
Add a new keyboard mode K_CODE. Returns a single byte for each key
much like the scancode mode. However the keys that (for no good reason) returns extension codes etc, are translated into singlebyte codes. Needed by libvgl. This makes life ALOT easier, also the XFree86 folks could use this.
Notes
Notes: svn path=/head/; revision=30043
Diffstat (limited to 'sys/isa/syscons.c')
-rw-r--r--sys/isa/syscons.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c
index fa0c28aa5f14..c92bb36a41d4 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.232 1997/09/14 03:19:27 peter Exp $
+ * $Id: syscons.c,v 1.233 1997/09/26 15:27:55 itojun Exp $
*/
#include "sc.h"
@@ -1408,13 +1408,19 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case KDSKBMODE: /* set keyboard mode */
switch (*data) {
case K_RAW: /* switch to RAW scancode mode */
+ scp->status &= ~KBD_CODE_MODE;
scp->status |= KBD_RAW_MODE;
return 0;
+ case K_CODE: /* switch to CODE mode */
+ scp->status &= ~KBD_RAW_MODE;
+ scp->status |= KBD_CODE_MODE;
+ return 0;
+
case K_XLATE: /* switch to XLT ascii mode */
if (scp == cur_console && scp->status & KBD_RAW_MODE)
shfts = ctls = alts = agrs = metas = 0;
- scp->status &= ~KBD_RAW_MODE;
+ scp->status &= ~(KBD_RAW_MODE | KBD_CODE_MODE);
return 0;
default:
return EINVAL;
@@ -1422,7 +1428,8 @@ scioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
/* NOT REACHED */
case KDGKBMODE: /* get keyboard mode */
- *data = (scp->status & KBD_RAW_MODE) ? K_RAW : K_XLATE;
+ *data = (scp->status & KBD_RAW_MODE) ? K_RAW :
+ ((scp->status & KBD_CODE_MODE) ? K_CODE : K_XLATE);
return 0;
case KDMKTONE: /* sound the bell */
@@ -1992,7 +1999,8 @@ exchange_scr(void)
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)
+ if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE ||
+ old_scp->status & KBD_CODE_MODE || new_scp->status & KBD_CODE_MODE)
shfts = ctls = alts = agrs = metas = 0;
update_leds(new_scp->status);
delayed_next_scr = FALSE;
@@ -3026,6 +3034,9 @@ next_code:
break;
}
+ if (cur_console->status & KBD_CODE_MODE)
+ return (keycode | (scancode & 0x80));
+
/* if scroll-lock pressed allow history browsing */
if (cur_console->history && cur_console->status & SLKED) {
int i;