iPXE
Macros | Functions | Variables
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. More...
 
#define CTRL_MASK   0x1f
 Control character mask. More...
 
#define UPPER_MASK   0x5f
 Upper case character mask. More...
 
#define CASE_TOGGLE   ( ASCII_MASK & ~UPPER_MASK )
 Case toggle bit. More...
 

Functions

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

Variables

static struct keymapkeymap_current = keymap_start
 Current keyboard mapping. More...
 

Detailed Description

Keyboard mappings.

Definition in file keymap.c.

Macro Definition Documentation

◆ ASCII_MASK

#define ASCII_MASK   0x7f

ASCII character mask.

Definition at line 38 of file keymap.c.

◆ CTRL_MASK

#define CTRL_MASK   0x1f

Control character mask.

Definition at line 41 of file keymap.c.

◆ UPPER_MASK

#define UPPER_MASK   0x5f

Upper case character mask.

Definition at line 44 of file keymap.c.

◆ CASE_TOGGLE

#define CASE_TOGGLE   ( ASCII_MASK & ~UPPER_MASK )

Case toggle bit.

Definition at line 47 of file keymap.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ TABLE_START()

static TABLE_START ( keymap_start  ,
KEYMAP   
)
static

Default keyboard mapping.

◆ key_remap()

unsigned int key_remap ( unsigned int  character)

Remap a key.

Parameters
characterCharacter read from console
Return values
mappedMapped character

Definition at line 61 of file keymap.c.

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

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 104 of file keymap.c.

104  {
105  struct keymap *keymap;
106 
107  /* Find matching keyboard map */
109  if ( strcmp ( keymap->name, name ) == 0 )
110  return keymap;
111  }
112 
113  return NULL;
114 }
#define KEYMAP
Keyboard mapping table.
Definition: keymap.h:40
const char * name
Definition: ath9k_hw.c:1984
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
const char * name
Name.
Definition: keymap.h:32
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:173
A keyboard mapping.
Definition: keymap.h:30
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 121 of file keymap.c.

121  {
122 
123  /* Use default keymap if none specified */
124  if ( ! keymap )
125  keymap = keymap_start;
126 
127  /* Set new keyboard map */
128  if ( keymap != keymap_current )
129  DBGC ( &keymap_current, "KEYMAP using \"%s\"\n", keymap->name );
131 }
static struct keymap * keymap_current
Current keyboard mapping.
Definition: keymap.c:53
#define DBGC(...)
Definition: compiler.h:505
const char * name
Name.
Definition: keymap.h:32
A keyboard mapping.
Definition: keymap.h:30

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 53 of file keymap.c.

Referenced by key_remap(), and keymap_set().