summaryrefslogtreecommitdiffstats
path: root/sys/isa/syscons.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>1997-10-01 20:46:29 +0000
committersos <sos@FreeBSD.org>1997-10-01 20:46:29 +0000
commit85a02d214d4daf2fbdbfa72558a07df37a7d832f (patch)
tree21006868c4674b0de8ef5f6bfd5dd0fd1d08d979 /sys/isa/syscons.c
parent8880ef0decba18474fbb1f90a0869f48177cabf3 (diff)
downloadFreeBSD-src-85a02d214d4daf2fbdbfa72558a07df37a7d832f.zip
FreeBSD-src-85a02d214d4daf2fbdbfa72558a07df37a7d832f.tar.gz
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.
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 fa0c28a..c92bb36 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;
OpenPOWER on IntegriCloud