iPXE
keymap.c File Reference

Keyboard mappings. More...

#include <string.h>
#include <ctype.h>
#include <ipxe/keys.h>
#include <ipxe/keymap.h>

Go to the source code of this file.

Macros

#define ASCII_MASK   0x7f
 ASCII character mask.
#define CTRL_MASK   0x1f
 Control character mask.
#define UPPER_MASK   0x5f
 Upper case character mask.
#define CASE_TOGGLE   ( ASCII_MASK & ~UPPER_MASK )
 Case toggle bit.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static TABLE_START (keymap_start, KEYMAP)
 Default keyboard mapping.
unsigned int key_remap (unsigned int character)
 Remap a key.
struct keymapkeymap_find (const char *name)
 Find keyboard map by name.
void keymap_set (struct keymap *keymap)
 Set keyboard map.

Variables

static struct keymapkeymap_current = keymap_start
 Current keyboard mapping.

Detailed Description

Keyboard mappings.

Definition in file keymap.c.

Macro Definition Documentation

◆ ASCII_MASK

#define ASCII_MASK   0x7f

ASCII character mask.

Definition at line 39 of file keymap.c.

Referenced by key_remap().

◆ CTRL_MASK

#define CTRL_MASK   0x1f

Control character mask.

Definition at line 42 of file keymap.c.

Referenced by b44_init_hw(), and key_remap().

◆ UPPER_MASK

#define UPPER_MASK   0x5f

Upper case character mask.

Definition at line 45 of file keymap.c.

◆ CASE_TOGGLE

#define CASE_TOGGLE   ( ASCII_MASK & ~UPPER_MASK )

Case toggle bit.

Definition at line 48 of file keymap.c.

Referenced by key_remap().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ TABLE_START()

TABLE_START ( keymap_start ,
KEYMAP  )
static

Default keyboard mapping.

References KEYMAP.

◆ key_remap()

unsigned int key_remap ( unsigned int character)

Remap a key.

Parameters
characterCharacter read from console
Return values
mappedMapped character

Definition at line 62 of file keymap.c.

62 {
64 unsigned int mapped = ( character & KEYMAP_MASK );
65 struct keymap_key *key;
66
67 /* Invert case before remapping if applicable */
68 if ( ( character & KEYMAP_CAPSLOCK_UNDO ) && isalpha ( mapped ) )
69 mapped ^= CASE_TOGGLE;
70
71 /* Select remapping table */
72 key = ( ( character & KEYMAP_ALTGR ) ? keymap->altgr : keymap->basic );
73
74 /* Remap via table */
75 for ( ; key->from ; key++ ) {
76 if ( mapped == key->from ) {
77 mapped = key->to;
78 break;
79 }
80 }
81
82 /* Handle Ctrl-<key> and CapsLock */
83 if ( isalpha ( mapped ) ) {
84 if ( character & KEYMAP_CTRL ) {
85 mapped &= CTRL_MASK;
86 } else if ( character & KEYMAP_CAPSLOCK ) {
87 mapped ^= CASE_TOGGLE;
88 }
89 }
90
91 /* Clear flags */
92 mapped &= ASCII_MASK;
93
94 DBGC2 ( &keymap_current, "KEYMAP mapped %04x => %02x\n",
95 character, mapped );
96 return mapped;
97}
union @162305117151260234136356364136041353210355154177 key
Sense key.
Definition scsi.h:3
static int isalpha(int character)
Check if character is alphabetic.
Definition ctype.h:76
#define DBGC2(...)
Definition compiler.h:522
#define ASCII_MASK
ASCII character mask.
Definition keymap.c:39
#define CTRL_MASK
Control character mask.
Definition keymap.c:42
static struct keymap * keymap_current
Current keyboard mapping.
Definition keymap.c:54
#define CASE_TOGGLE
Case toggle bit.
Definition keymap.c:48
#define KEYMAP_CAPSLOCK_UNDO
Undo CapsLock key flag.
Definition keymap.h:68
#define KEYMAP_ALTGR
AltGr key flag.
Definition keymap.h:74
#define KEYMAP_CTRL
Ctrl key flag.
Definition keymap.h:56
#define KEYMAP_MASK
Mappable character mask.
Definition keymap.h:50
#define KEYMAP_CAPSLOCK
CapsLock key flag.
Definition keymap.h:59
A remapped key.
Definition keymap.h:23
A keyboard mapping.
Definition keymap.h:31
struct keymap_key * altgr
AltGr remapping table (zero-terminated)
Definition keymap.h:37
struct keymap_key * basic
Basic remapping table (zero-terminated)
Definition keymap.h:35

References keymap::altgr, ASCII_MASK, keymap::basic, CASE_TOGGLE, CTRL_MASK, DBGC2, isalpha(), key, KEYMAP_ALTGR, KEYMAP_CAPSLOCK, KEYMAP_CAPSLOCK_UNDO, KEYMAP_CTRL, keymap_current, and KEYMAP_MASK.

Referenced by bios_getchar(), efi_getchar(), and usbkbd_map().

◆ keymap_find()

struct keymap * keymap_find ( const char * name)

Find keyboard map by name.

Parameters
nameKeyboard map name
Return values
keymapKeyboard map, or NULL if not found

Definition at line 105 of file keymap.c.

105 {
106 struct keymap *keymap;
107
108 /* Find matching keyboard map */
110 if ( strcmp ( keymap->name, name ) == 0 )
111 return keymap;
112 }
113
114 return NULL;
115}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
const char * name
Definition ath9k_hw.c:1986
#define KEYMAP
Keyboard mapping table.
Definition keymap.h:41
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174
const char * name
Name.
Definition keymap.h:33
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386

References for_each_table_entry, KEYMAP, keymap::name, name, NULL, and strcmp().

Referenced by keymap_apply().

◆ keymap_set()

void keymap_set ( struct keymap * keymap)

Set keyboard map.

Parameters
keymapKeyboard map, or NULL to use default

Definition at line 122 of file keymap.c.

122 {
123
124 /* Use default keymap if none specified */
125 if ( ! keymap )
126 keymap = keymap_start;
127
128 /* Set new keyboard map */
129 if ( keymap != keymap_current )
130 DBGC ( &keymap_current, "KEYMAP using \"%s\"\n", keymap->name );
132}
#define DBGC(...)
Definition compiler.h:505

References DBGC, keymap_current, and keymap::name.

Referenced by keymap_apply().

Variable Documentation

◆ keymap_current

struct keymap* keymap_current = keymap_start
static

Current keyboard mapping.

Definition at line 54 of file keymap.c.

Referenced by key_remap(), and keymap_set().