Showing preview only (491K chars total). Download the full file or copy to clipboard to get everything.
Repository: trustcrypto/OnlyKey-Firmware
Branch: master
Commit: 9600daa8ffc8
Files: 12
Total size: 475.3 KB
Directory structure:
gitextract_wrctxzzj/
├── .gitignore
├── OnlyKey/
│ └── OnlyKey.ino
├── README.md
├── keylayouts.c
├── keylayouts.h
├── usb_desc.c
├── usb_desc.h
├── usb_dev.c
├── usb_dev.h
├── usb_keyboard.c
├── usb_rawhid.c
└── usb_rawhid.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msm
*.msp
# Windows shortcuts
*.lnk
# =========================
# Operating System Files
# =========================
# OSX
# =========================
.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
OnlyKey_NOPIN/OnlyKey_NOPIN.ino
================================================
FILE: OnlyKey/OnlyKey.ino
================================================
/*
* Copyright (c) 2015-2022, CryptoTrust LLC.
* All rights reserved.
*
* Author : Tim Steiner <t@crp.to>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by CryptoTrust LLC. for
* the OnlyKey Project (https://crp.to/ok)"
*
* 4. The names "OnlyKey" and "CryptoTrust" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* admin@crp.to.
*
* 5. Products derived from this software may not be called "OnlyKey"
* nor may "OnlyKey" or "CryptoTrust" appear in their names without
* specific prior written permission. For written permission, please
* contact admin@crp.to.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by CryptoTrust LLC. for
* the OnlyKey Project (https://crp.to/ok)"
*
* 7. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for this software and any
* accompanying software that uses this software. The source code
* must either be included in the distribution or be available for
* no more than the cost of distribution plus a nominal fee, and must
* be freely redistributable under reasonable conditions. For a
* binary file, complete source code means the source code for all
* modules it contains.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS
* ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT
* LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM
* IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE
* SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE
* RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY
* THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF
* ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER
* APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE
* REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION
* BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM
* EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL
* SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT
* FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS
* AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF
* TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS
* PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*************************************/
//Firmware Build Options
/*************************************/
#define DEBUG //Enable Serial Monitor, debug firmware
#define STD_VERSION //Define for STD edition firmare, undefine for IN TRVL edition firmware
#define OK_Color //Define for hardware with color LED
//#define FACTORYKEYS2 // Attestation key and other keys encrypted using CHIP ID and RNG for unique per device
#ifndef STD_VERSION
#undef FACTORYKEYS2
#endif
/*************************************/
//Standard Libraries
/*************************************/
#include "sha256.h"
#include "EEPROM.h"
#include "T3MacLib.h"
#include "SoftTimer.h"
#include "password.h"
#include "sha1.h"
#include "totp.h"
#include "Time.h"
#include "onlykey.h"
#include "flashkinetis.h"
#include "RNG.h"
#include "base64.h"
#include "ADC.h"
#include "usb_dev.h"
/*************************************/
//Color LED Libraries
/*************************************/
#ifdef OK_Color
#include "Adafruit_NeoPixel.h"
#endif
/*************************************/
//Additional Libraries to Load for STD firmware version
//These libraries will only be used if STD_VERSION is defined
/*************************************/
extern uint8_t profilemode;
#ifdef STD_VERSION
#define OKSOLO //Using FIDO2 from SOLO
#include "yksim.h"
#include "uECC.h"
#include "ykcore.h"
#include "AES.h"
#include "GCM.h"
#include "rsa.h"
#include "tweetnacl.h"
/*************************************/
//FIDO2 Libraries
/*************************************/
#ifdef OKSOLO
#include "ctap.h"
#include "ctaphid.h"
#include "cbor.h"
#include "ctap_parse.h"
#include "ctap_errors.h"
#include "device.h"
#include "storage.h"
#include "wallet.h"
#include "solo.h"
#include "extensions.h"
#include "ok_extension.h"
#include "crypto.h"
#include "u2f.h"
#endif
#endif
/*************************************/
//LED Assignments
/*************************************/
extern uint8_t NEO_Color;
extern uint8_t NEO_Brightness[1];
extern uint8_t touchoffset;
extern uint8_t Profile_Offset;
/*************************************/
//RNG Assignments
/*************************************/
bool calibrating = false;
extern char ID[36];
/*************************************/
//PIN Assigment Variables
/*************************************/
extern uint8_t BLINKPIN;
extern uint8_t TOUCHPIN1;
extern uint8_t TOUCHPIN2;
extern uint8_t TOUCHPIN3;
extern uint8_t TOUCHPIN4;
extern uint8_t TOUCHPIN5;
extern uint8_t TOUCHPIN6;
extern uint8_t ANALOGPIN1;
extern uint8_t ANALOGPIN2;
extern unsigned int sumofall;
/*************************************/
//Keypad / Password Assignments
/*************************************/
extern int button_selected; //Key selected 1-6
static int pass_keypress = 1; //The number key presses in current password attempt
static int session_attempts = 0; //The number of password attempts this session
static bool firsttime = true;
extern Password password;
extern uint8_t TIMEOUT[1];
extern uint8_t TYPESPEED[1];
extern uint8_t KeyboardLayout[1];
extern uint8_t mod_keys_enabled;
/*************************************/
//Capacitive Touch Variables
/*************************************/
extern unsigned int touchread1;
extern unsigned int touchread2;
extern unsigned int touchread3;
extern unsigned int touchread4;
extern unsigned int touchread5;
extern unsigned int touchread6;
extern unsigned int touchread1ref;
extern unsigned int touchread2ref;
extern unsigned int touchread3ref;
extern unsigned int touchread4ref;
extern unsigned int touchread5ref;
extern unsigned int touchread6ref;
/*************************************/
//Keys, Hashes, Integrity Counters
/*************************************/
extern uint8_t profilekey[32];
extern uint8_t p1hash[32];
extern uint8_t sdhash[32];
extern uint8_t p2hash[32];
extern uint8_t nonce[32];
extern int initcheck;
extern int integrityctr1;
extern int integrityctr2;
/*************************************/
//SoftTimer Tasks
/*************************************/
#define TIME_POLL 50 // poll "key" every 50 ms
Task taskKey(TIME_POLL, checkKey);
Task taskKB(50, sendKey); // Default send kb codes every 50 ms
Task taskInitialized(1000, sendInitialized);
/*************************************/
//CRYPTO
/*************************************/
extern uint8_t Challenge_button1;
extern uint8_t Challenge_button2;
extern uint8_t Challenge_button3;
extern uint8_t CRYPTO_AUTH;
extern int packet_buffer_offset;
extern uint8_t packet_buffer_details[5];
extern uint8_t outputmode;
extern uint8_t derived_key_challenge_mode;
extern uint8_t stored_key_challenge_mode;
/*************************************/
//Other
/*************************************/
extern uint8_t recv_buffer[64];
char keybuffer[EElen_url+EElen_addchar+EElen_delay+EElen_addchar+EElen_username+EElen_delay+EElen_addchar+EElen_password+EElen_addchar+EElen_2FAtype+64+EElen_addchar+EElen_addchar+10]; //Buffer to hold all keystrokes
char *pos;
extern uint8_t isfade;
#ifdef STD_VERSION
extern uint8_t ctap_buffer[CTAPHID_BUFFER_SIZE];
#endif
extern uint8_t pending_operation;
uint8_t modkey;
extern uint8_t onlykeyhw;
extern uint8_t Duo_config[2];
extern "C" {
int _getpid(){ return -1;}
int _kill(int pid, int sig){ return -1; }
int _write(){return -1;}
}
/*************************************/
//Arduino Setup
/*************************************/
void setup() {
// Delay may be needed for serial debug
// delay(3000);
analogReadResolution(16);
#ifdef DEBUG
Serial.begin(9600);
#endif
#ifdef STD_VERSION
profilemode = STDPROFILE1;
#else
profilemode = NONENCRYPTEDPROFILE;
#endif
/*************************************/
//PIN Assigments
/*************************************/
BLINKPIN=6;
TOUCHPIN1=1; // #define CORE_PIN1_CONFIG PORTB_PCR17
TOUCHPIN2=22; //#define CORE_PIN22_CONFIG PORTC_PCR1
TOUCHPIN3=23; //#define CORE_PIN23_CONFIG PORTC_PCR2 OnlyKey DUO Button #1
TOUCHPIN4=17; //#define CORE_PIN17_CONFIG PORTB_PCR1
TOUCHPIN5=15; //#define CORE_PIN15_CONFIG PORTC_PCR0 OnlyKey DUO Button #2
TOUCHPIN6=16; //#define CORE_PIN16_CONFIG PORTB_PCR0
ANALOGPIN1=A0; //#define CORE_PIN14_CONFIG PORTD_PCR1
ANALOGPIN2=A7; //#define CORE_PIN21_CONFIG PORTD_PCR6
/*************************************/
initcheck = okcore_flashget_noncehash ((uint8_t*)nonce, 32); //Check if first time use
CHIP_ID(); // Get Unique chip ID from ROM
unsigned int analog1 = analogRead(ANALOGPIN1);
unsigned int analog2 = analogRead(ANALOGPIN2);
integrityctr1++;
/*
//dump flash storage, useful for verifying contents
Serial.println(initcheck);
char temp[32];
wipeEEPROM();
unsigned long readadr = flashstorestart;
while (readadr <= flashend) {
for(int i =0; i<=2048; i=i+4){
sprintf (temp, "%.8X", *((unsigned int*)readadr));
Serial.print(temp);
readadr = readadr + 4;
}
Serial.println();
}
*/
//FSEC currently set to 0x44, everything disabled except mass erase https://forum.pjrc.com/threads/28783-Upload-Hex-file-from-Teensy-3-1
if (FTFL_FSEC!=0x44) {
// First time starting up, three steps to complete:
// 1) Read factory loaded device keys and generate custom device keys
// Get factory default flash contents
#ifdef FACTORYKEYS2
okcore_flashget_common(ctap_buffer, (unsigned long *)factorysectoradr, 1025);
#ifdef DEBUG
Serial.println("Factory Key Values");
byteprint(ctap_buffer, 1025);
#endif
if (ctap_buffer[480] != 0xFF) { // Attestation key loaded
// Hash factory bytes with unique chip ID and random
SHA256_CTX hash;
for (int i=0; i<=14; i++) {
analog1 = analogRead(ANALOGPIN1);
analog2 = analogRead(ANALOGPIN1);
sha256_init(&hash);
sha256_update(&hash, ctap_buffer+(32*i), 32);
sha256_update(&hash, ctap_buffer+(32*(i+1)), 32);
sha256_update(&hash, (uint8_t*)ID, 36);
sha256_update(&hash, (uint8_t*)&analog1, 4);
sha256_update(&hash, (uint8_t*)&analog2, 4);
sha256_final(&hash, ctap_buffer+(32*i));
}
#ifdef DEBUG
Serial.println("KDF Hashed Factory Values");
byteprint(ctap_buffer, 512);
#endif
// Write everything to flash
if (*certified_hw != 1) {
// Encrypt attestation key with generated KEK
ctap_buffer[435]=3;
//Write keys
okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 436);
okcrypto_aes_gcm_encrypt2(ctap_buffer+480, ctap_buffer+436, ctap_buffer+448, 32, true);
//Write encrypted contents to flash
okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 513);
// Set write flag
ctap_buffer[435]=1;
// Write flag to flash
okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 513);
}
// Erase factory keys
memset(ctap_buffer, 0, 2048);
okcore_flashset_common(ctap_buffer, (unsigned long *)factorysectoradr, 512);
}
#endif // end FACTORYKEYS
// 2) Store factory firmware hash for integrity verification
//create hash of firmware in hash buffer
#ifdef STD_VERSION
fw_hash(ctap_buffer);
for (int i = 0; i < crypto_hash_BYTES; i++) { //write 64byte hash to eeprom
eeprom_write_byte((unsigned char*)(2+i), ctap_buffer[i]); // 2-65 used for fw integrity hash
}
memset(ctap_buffer, 0, 2048);
#endif
// 3) Enable flash security after writing
int nn = 0;
nn=flashSecurityLockBits();
#ifdef DEBUG
Serial.print("Flash security bits ");
if(nn) Serial.print("not ");
Serial.println("written successfully");
#endif
}
if(!initcheck) {
wipeEEPROM();
eeprom_write_byte((unsigned char *)1984, (OKversionmaj[0] - '0')); //write fwvermaj, prevents downgrade to previous majver
okeeprom_eeset_timeout((uint8_t*)TIMEOUT); //Default lockout 30 min
unlocked = true; //Flash is not protected, First time use
initialized = false;
#ifdef DEBUG
Serial.println("UNLOCKED, NO PIN SET");
#endif
} else if(FTFL_FSEC==0x44 && initcheck) {
okcore_flashget_pinhashpublic ((uint8_t*)p1hash, 32); //store PIN hash
okcore_flashget_selfdestructhash ((uint8_t*)sdhash); //store self destruct PIN hash
okcore_flashget_2ndpinhashpublic ((uint8_t*)p2hash); //store plausible deniability PIN hash
okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);
okeeprom_eeget_modkey(&mod_keys_enabled);
#ifdef DEBUG
Serial.println("typespeed = ");
Serial.println(TYPESPEED[0]);
#endif
if (TYPESPEED[0] == 0) {
TYPESPEED[0] = 4;
} else if (TYPESPEED[0] <= 10) {
}
okeeprom_eeget_ledbrightness((uint8_t*)NEO_Brightness);
okeeprom_eeget_touchoffset(&touchoffset);
okeeprom_eeget_timeout((uint8_t*)TIMEOUT);
okeeprom_eeget_keyboardlayout((uint8_t*)KeyboardLayout);
#ifdef DEBUG
Serial.println("KeyboardLayout = ");
Serial.println(KeyboardLayout[0]);
#endif
update_keyboard_layout();
unlocked = false;
initialized = true;
#ifdef DEBUG
Serial.println("INITIALIZED");
#endif
SoftTimer.add(&taskInitialized);
} else { //Glitch detect, somehow device is initialized but flash security is not on
CPU_RESTART();
}
integrityctr2++;
/*************************************/
//Initialize the random number generator with analog noise, stored NONCE, and chip ID
/*************************************/
RNG.begin(OKversion, 2045); //Start RNG with the device version
RNG.stir((uint8_t *)&analog1, 2, 4);
RNG.stir((uint8_t *)&analog2, 2, 4);
#ifdef DEBUG
Serial.print("EEPROM Used ");
Serial.println(EEpos_slottypespeed+12);
Serial.println(FTFL_FSEC, HEX);
#endif
rngloop(); //Start RNG
#ifdef OK_Color
initColor();
rainbowCycle();
#else
pinMode(BLINKPIN, OUTPUT);
fadein();//Additional delay to make sure button is not pressed during plug into USB
fadeout();
fadein();
fadeout();
#endif
SoftTimer.add(&taskKey);
if (!initcheck) {
//Default set to no challenge code required for OnlyKey Agent
//User can enable challenge code in OnlyKey app preferences
derived_key_challenge_mode = 1;
stored_key_challenge_mode = 1;
okeeprom_eeset_derived_key_challenge_mode(&derived_key_challenge_mode);
okeeprom_eeset_stored_key_challenge_mode(&stored_key_challenge_mode);
}
if (onlykeyhw==OK_HW_DUO) {
if (initialized == true && password.profile1hashevaluate()) {
payload(10);
}
}
}
extern elapsedMillis idletimer;
/*************************************/
//Main Loop, Read Key Press Using Capacitive Touch
//Called every 50ms
/*************************************/
void checkKey(Task* me) {
//Check for bootloader trigger
if (!digitalRead(33)) { //Trigger bootloader to load firmware by PTA4 low for 3 sec
elapsedMillis waiting;
int jumptobootloader = 0;
while (waiting < 3000) {
delay(100);
jumptobootloader = jumptobootloader + digitalRead(33);
}
if (jumptobootloader==0) {
eeprom_write_byte(0x00, 1); //Go to bootloader
eeprom_write_byte((unsigned char *)0x01, 1); //Firmware ready to load
CPU_RESTART(); //Reboot
}
}
#ifndef STD_VERSION
// Disable OK_HW_DUO hardware for IN_TRVL firmware
if (onlykeyhw==OK_HW_DUO) {
eeprom_write_byte(0x00, 1); //Go to bootloader
eeprom_write_byte((unsigned char *)0x01, 1); //Firmware ready to load
CPU_RESTART(); //Reboot
}
#endif
if (setBuffer[8] == 1 && (!isfade || configmode)) //Done receiving packets
{
if (outputmode != KEYBOARD_USB) changeoutputmode(KEYBOARD_USB); //Keyboard USB
process_setreport();
}
//Check integrity counters and recv usb data
integrityctr1++;
delay(sumofall % 6); //delay 0 - 5 ms
if (unlocked) {
integrityctr2++;
recvmsg(0);
if(initialized && initcheck) {
#ifdef STD_VERSION
yubikey_incr_time();
#endif
if (TIMEOUT[0] && idletimer >= (TIMEOUT[0]*60000)) {
unlocked = false;
firsttime = true;
password.reset(); //reset the guessed password to NULL
pass_keypress=1;
memset(profilekey, 0, 32);
SoftTimer.add(&taskInitialized);
CPU_RESTART();
}
}
} else{
integrityctr2++;
}
if(configmode && unlocked && !isfade) {
#ifdef OK_Color
NEO_Color = 1; //Red
#endif
fadeon(1);
}
#ifdef DEBUG
// Auto set default PINs and passphrase for testing
//if (!initialized) {
// okeeprom_eeset_timeout(0); //Disable lockout
// okcore_quick_setup(AUTO_PIN_SET);
//}
#endif
int press_duration = touch_sense_loop();
if (pending_operation==0xF6 || pending_operation==0xF7) { //CTAP2_ERR_DATA_READY or CTAP2_ERR_DATA_WIPE
setcolor(45); //yellow
} else {
if (press_duration) payload(press_duration);
}
}
/*************************************/
//Type out on Keyboard the contents of Keybuffer
/*************************************/
void sendKey(Task* me) {
while ( isfade && NEO_Color == 170 && (uint8_t)*pos != 00 && (uint8_t)*pos != 9 ) {
pos++;
}
int delay1 = (TYPESPEED[0]*TYPESPEED[0]/3)*8;
int delay2 = ((TYPESPEED[0]*TYPESPEED[0])*2);
if ((uint8_t)*pos == 00) {
#ifdef DEBUG
Serial.print(pos);
#endif
Keyboard.end();
SoftTimer.remove(&taskKB);
SoftTimer.add(&taskKey);
// Set back to default type speed
okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);
if (TYPESPEED[0]==0) TYPESPEED[0] = 4;
return;
}
else if ((uint8_t)*pos == 1) {
if (!isfade) {
Keyboard.press(KEY_TAB);
delay(delay1);
Keyboard.releaseAll();
delay(delay2);
}
pos++;
}
else if ((uint8_t)*pos == 2) {
if (!isfade) {
Keyboard.press(KEY_RETURN);
delay(delay1);
Keyboard.releaseAll();
delay(delay2);
}
pos++;
}
else if ((uint8_t)*pos == 9) {
if(profilemode==NONENCRYPTEDPROFILE) return;
#ifdef STD_VERSION
#ifdef DEBUG
Serial.println("Starting U2F...");
#endif
u2f_button = 1;
unsigned long u2fwait = millis() + 4000;
while(u2f_button && millis() < u2fwait) {
recvmsg(0);
}
u2f_button = 0;
Keyboard.end();
SoftTimer.remove(&taskKB);
SoftTimer.add(&taskKey);
#endif
return;
}
else if ((uint8_t)*pos >= 10 && (uint8_t)*pos <= 31) {
if (!isfade) {
delay((*pos - 10)*1000);
pos++;
}
}
else if ((uint8_t)*pos == ' ' && (uint8_t)*(pos+1) == 0x5c) {
pos++;
if (!isfade) {
while(*pos) {
if ((uint8_t)*pos == 0x5c) { //modifier/special key comes next
pos++;
keymap_press(0);
delay(delay1);
} else { //regular key
keymap_press(1);
delay(delay1);
}
pos++;
if ((uint8_t)*pos == ' ' || (uint8_t)*pos == 0) {
if ((uint8_t)*pos == ' ') pos++;
Keyboard.releaseAll();
delay(delay1);
Keyboard.releaseAll();
resetkeys();
delay(delay2);
return;
}
}
}
}
else if (*pos){
if (!isfade) {
Keyboard.press(*pos);
delay(delay1);
Keyboard.releaseAll();
delay(delay2);
}
pos++;
}
}
/*************************************/
//Password Checking Loop
/*************************************/
void payload(int duration) {
if (!unlocked) {
// OnlyKey Go has only 3 buttons, longer press to enter PIN of 4 - 6
if (onlykeyhw==OK_HW_DUO && duration >= 21) {
// <1 sec OK_HW_DUO buttons 1,2,3 = 4,5,6
button_selected = button_selected + 3;
}
#ifdef OK_Color
setcolor(45); // NEO Pixel ON Yellow
#else
analogWrite(BLINKPIN, 255); //LED ON
#endif
}
else {
#ifdef OK_Color
setcolor(0); // NEO Pixel OFF
#else
analogWrite(BLINKPIN, 0); //LED OFF
#endif
}
uint8_t pass_attempts[1];
uint8_t sincelastregularlogin[1];
if (session_attempts >= 3) { //Limit 3 password attempts per session to make sure that someone does not accidentally wipe device
exceeded_login_attempts();
return;
}
integrityctr1++;
if (firsttime) //Get failed login counter from eeprom and increment for new login attempt
{
okeeprom_eeget_failedlogins ((uint8_t*)pass_attempts);
if (pass_attempts[0]) {
okeeprom_eeget_sincelastregularlogin ((uint8_t*)sincelastregularlogin);
if (sincelastregularlogin[0] >= 20) {
for (int i =0; i<32; i++) {
p1hash[i] = 0xFF;
}
okcore_flashset_pinhashpublic ((uint8_t*)p1hash); //permanently wipe pinhash
okeeprom_eeset_sincelastregularlogin (0);
} else {
sincelastregularlogin[0]++;
okeeprom_eeset_sincelastregularlogin ((uint8_t*)sincelastregularlogin);
}
#ifdef DEBUG
Serial.println("Failed PIN attempts since last successful regular PIN entry");
Serial.println(sincelastregularlogin[0]);
#endif
}
integrityctr2++;
pass_attempts[0]++;
integrityctr1++;
if (pass_attempts[0] > 10) {
#ifdef DEBUG
Serial.println("Password attempts exhausted");
Serial.println(pass_attempts[0]);
#endif
factorydefault();
pass_attempts[0] = 0;
return;
}
okeeprom_eeset_failedlogins ((uint8_t*)pass_attempts);
firsttime = false;
}
integrityctr2++;
password.append(button_selected);
integrityctr1++;
delay((sumofall % 4)+(sumofall % 3)); //delay 0 - 5 ms
if (unlocked || password.profile1hashevaluate() || password.profile2hashevaluate()) {
integrityctr2++;
if (unlocked != true) { //A correct PIN was just entered do the following for first login
okeeprom_eeset_failedlogins(0); //Set failed login counter to 0
password.reset(); //reset the guessed password to NULL
session_attempts=0;
if (!configmode) hidprint(HW_MODEL(UNLOCKED));
SoftTimer.remove(&taskInitialized);
#ifdef DEBUG
Serial.println("UNLOCKED");
#endif
fadeon(NEO_Color);
fadeoff(85);
if (profilemode!=NONENCRYPTEDPROFILE) {
#ifdef STD_VERSION
U2Finit();
okeeprom_eeset_sincelastregularlogin(0); //Set failed logins since last regular login to 0
fw_version_changes();
#endif
}
idletimer=0;
unlocked = true;
if (configmode) {
#ifdef OK_Color
NEO_Color = 1; //Red
#endif
fadeon(1);
}
unsigned long wait = millis() + 200;
while(millis() < wait) { //Process waiting messages
recvmsg(0);
}
wipe_usb_buffer(); // Wipe old responses
return;
} else if (!initialized && duration >= 85 && button_selected=='1' && profilemode!=NONENCRYPTEDPROFILE) {
if (onlykeyhw==OK_HW_DUO) okcore_quick_setup(KEYBOARD_ONLYKEY_DUO_NO_BACKUP);
else okcore_quick_setup(KEYBOARD_MANUAL_PIN_SET);
return;
} else if (!initialized && duration >= 85 && button_selected=='2' && profilemode!=NONENCRYPTEDPROFILE) {
if (onlykeyhw==OK_HW_DUO) okcore_quick_setup(KEYBOARD_ONLYKEY_DUO_BACKUP);
else okcore_quick_setup(KEYBOARD_AUTO_PIN_SET);
return;
} else if (!initialized && duration >= 85 && button_selected=='3' && profilemode!=NONENCRYPTEDPROFILE) {
okcore_quick_setup(0); //Setup with keyboard prompt
return;
} else if (pin_set==0 && !initcheck) {
return;
}
else if (pin_set==0) {
}
else if (pin_set<=3) {
#ifdef DEBUG
Serial.print("password appended with ");
Serial.println(button_selected-'0');
#endif
if (configmode) {
NEO_Color = 45;
blink(1);
NEO_Color = 1;
}
return;
}
else if (pin_set<=6) {
#ifdef DEBUG
Serial.print("SD password appended with ");
Serial.println(button_selected-'0');
#endif
if (configmode) {
NEO_Color = 45;
blink(1);
NEO_Color = 1;
}
return;
}
else if (pin_set<=9) {
if(profilemode!=NONENCRYPTEDPROFILE){
#ifdef STD_VERSION
#ifdef DEBUG
Serial.print("2nd profile password appended with ");
Serial.println(button_selected-'0');
#endif
#endif
}
if (configmode) {
NEO_Color = 45;
blink(1);
NEO_Color = 1;
}
return;
} else if (pin_set==10) {
cancelfadeoffafter20();
if (button_selected=='1') okcore_quick_setup(KEYBOARD_MANUAL_PIN_SET); //Manual
else okcore_quick_setup(KEYBOARD_AUTO_PIN_SET); //Manual
return;
}
Keyboard.begin();
*keybuffer = '\0';
#ifdef DEBUG
Serial.print("Button selected ");
Serial.println(button_selected-'0');
#endif
idletimer=0;
if (profilemode!=NONENCRYPTEDPROFILE) {
#ifdef STD_VERSION
if (CRYPTO_AUTH == 1 && button_selected==Challenge_button1 && isfade) {
#ifdef DEBUG
Serial.print("Challenge1 entered");
Serial.println(button_selected-'0');
#endif
CRYPTO_AUTH++;
return;
} else if (CRYPTO_AUTH == 2 && button_selected==Challenge_button2 && isfade) {
#ifdef DEBUG
Serial.print("Challenge2 entered");
Serial.println(button_selected-'0');
#endif
CRYPTO_AUTH++;
return;
} else if ((CRYPTO_AUTH == 3 && button_selected==Challenge_button3 && isfade && packet_buffer_details[0]) || (derived_key_challenge_mode==1 && isfade && packet_buffer_details[0]) || (stored_key_challenge_mode==1 && isfade && packet_buffer_details[0]) || (CRYPTO_AUTH == 3 && packet_buffer_details[0] == OKHMAC && isfade) || (packet_buffer_details[0] == OKWEBAUTHN && isfade)) {
#ifdef DEBUG
Serial.print("Challenge3 entered");
Serial.println(button_selected-'0');
#endif
CRYPTO_AUTH = 4;
derived_key_challenge_mode = 0;
stored_key_challenge_mode = 0;
if(packet_buffer_details[0] == OKSIGN) {
recv_buffer[4] = packet_buffer_details[0];
recv_buffer[5] = packet_buffer_details[1];
okcrypto_sign(recv_buffer);
} else if (packet_buffer_details[0] == OKDECRYPT) {
recv_buffer[4] = packet_buffer_details[0];
recv_buffer[5] = packet_buffer_details[1];
okcrypto_decrypt(recv_buffer);
} else if (packet_buffer_details[0] == OKHMAC) {
okcrypto_hmacsha1();
} else if (packet_buffer_details[0] == OKWEBAUTHN) {
u2f_button = 1;
unsigned long u2fwait = millis() + 4000;
while(u2f_button && millis() < u2fwait) {
recvmsg(0);
}
u2f_button = 0;
}
CRYPTO_AUTH = 0;
packet_buffer_details[0]=0;
fadeoff(0);
return;
} else if (CRYPTO_AUTH) { //Wrong challenge was entered
CRYPTO_AUTH = 0;
Challenge_button1 = 0;
Challenge_button2 = 0;
Challenge_button3 = 0;
fadeoff(1);
hidprint("Error incorrect challenge was entered");
analogWrite(BLINKPIN, 255); //LED ON
return;
} else if (duration < 180 && duration >= 72 && button_selected=='1' && !isfade) {
// Backup <4 sec
SoftTimer.remove(&taskKey);
backup();
SoftTimer.add(&taskKey);
return;
} else if (onlykeyhw==OK_HW_DUO && duration >= 360 && button_selected=='2' && configmode==true) {
factorydefault();
} else if (duration >= 72 && button_selected=='2' && !isfade) {
// Slot Labels <4 sec
get_slot_labels(1);
if (duration >= 140) get_key_labels(1);
return;
} else if (duration >= 72 && button_selected=='3' && !isfade) {
// Lock and/or switch profiles <4 sec
if (onlykeyhw==OK_HW_DUO && duration < 180) {
if (Duo_config[1] == 0){ // Profile 1
Profile_Offset = 84; //Profile 2 Blue
Duo_config[1] = 1;
} else if (Duo_config[1] == 1){ // Profile 2
Profile_Offset = -42; //Profile 3 Yellow
Duo_config[1] = 2;
} else if (Duo_config[1] == 2){ // Profile 3
Profile_Offset = 128; //Profile 4 Purple
Duo_config[1] = 3;
} else if (Duo_config[1] == 3){ // Profile 4
Profile_Offset = 0; //Profile 1 Green
Duo_config[1] = 0;
}
return;
}
unlocked = false;
firsttime = true;
password.reset(); //reset the guessed password to NULL
pass_keypress=1;
memset(profilekey, 0, 32);
SoftTimer.add(&taskInitialized);
button_selected=0;
CPU_RESTART();
return;
}
else if (((onlykeyhw==OK_HW_DUO && duration >= 180 && button_selected=='1') || (onlykeyhw!=OK_HW_DUO && duration >= 72 && button_selected=='6')) && !isfade) {
// Config mode
integrityctr1++;
configmode=true;
if (Duo_config[0]!=1) {
unlocked = false;
firsttime = true;
password.reset(); //reset the guessed password to NULL
pass_keypress=1;
SoftTimer.add(&taskInitialized);
}
integrityctr2++;
return;
}
#endif
}
#ifdef OK_Color
setcolor(0); // NEO Pixel OFF
#else
analogWrite(BLINKPIN, 0); //LED OFF
#endif
if (duration <= 20 && !configmode) {
gen_press();
}
else if (duration >= 21 && duration < 90 && !configmode) {
gen_hold();
}
else if (duration >= 90 && !configmode) {
NEO_Color = 1;
blink(2);
}
pos = keybuffer;
SoftTimer.remove(&taskKey);
SoftTimer.add(&taskKB, (unsigned long)TYPESPEED[0]);
return;
}
else if (password.sdhashevaluate()) {
#ifdef DEBUG
Serial.println("Self Destruct PIN entered");
#endif
factorydefault();
}
else {
integrityctr2++;
if (pass_keypress < 10) {
#ifdef DEBUG
Serial.print("password appended with ");
Serial.println(button_selected-'0');
Serial.print("Number of keys entered for this passcode = ");
Serial.println(pass_keypress);
#endif
pass_keypress++;
return;
} else {
firsttime = true;
session_attempts++;
#ifdef OK_Color
NEO_Color = 1;
#endif
blink(3);
#ifdef DEBUG
Serial.print("Login Failed, there are ");
#endif
okeeprom_eeget_failedlogins ((uint8_t*)pass_attempts);
#ifdef DEBUG
Serial.print(10 - pass_attempts[0]);
Serial.println(" remaining attempts before a factory reset will occur");
Serial.println("WARNING: This will render all device information unrecoverable");
#endif
password.reset(); //reset the guessed password to NULL
pass_keypress=1;
if (session_attempts >= 3) { //Limit 3 password attempts per session to make sure that someone does not accidentally wipe device
exceeded_login_attempts();
}
return;
}
}
}
/*************************************/
//Trigger on short button press
/*************************************/
void gen_press(void) {
int slot;
if (profilemode || Duo_config[1] == 2) {
slot=(button_selected-'0')+12;
} else if (Duo_config[1] == 1) {
slot=(button_selected-'0')+6;
} else if (Duo_config[1] == 3) {
slot=(button_selected-'0')+18;
} else {
slot=button_selected-'0';
}
process_slot(slot);
}
/*************************************/
//Trigger on long button press
/*************************************/
void gen_hold(void) {
int slot;
if (profilemode || Duo_config[1] == 2) {
slot=(button_selected-'0')+12;
} else if (Duo_config[1] == 1) {
slot=(button_selected-'0')+6;
} else if (Duo_config[1] == 3) {
slot=(button_selected-'0')+18;
} else {
slot=button_selected-'0';
}
if (onlykeyhw==OK_HW_DUO){
process_slot(slot+3);
} else {
process_slot(slot+6);
}
}
/*************************************/
//Load Set Values to Keybuffer
/*************************************/
void process_slot(int s) {
long GMT;
char* newcode;
static uint8_t index;
uint8_t temp[64];
int urllength;
int usernamelength;
int passwordlength;
int otplength;
uint8_t addchar1;
uint8_t addchar2;
uint8_t addchar3;
uint8_t addchar4;
uint8_t addchar5;
uint8_t addchar6;
uint8_t autolockslot;
int delay1 = 0;
int delay2 = 0;
int delay3 = 0;
uint8_t *ptr;
int slot=s;
bool scripted_mode = false;
index = 0;
okeeprom_eeget_autolockslot(&autolockslot);
if ((profilemode==STDPROFILE1 && (slot==(autolockslot & 0xF))) || (profilemode==STDPROFILE2 && slot==((autolockslot >> 4) & 0xF)+12)) {
lock_ok_and_screen ();
return;
}
okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, slot);
if (TYPESPEED[0]==0) okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);
if (TYPESPEED[0]==0) TYPESPEED[0] = 4;
okeeprom_eeget_addchar(&addchar5, slot);
#ifdef DEBUG
Serial.println("Additional Character");
Serial.println(addchar5);
#endif
addchar1 = addchar5 & 0x3; //After Username
addchar2 = (addchar5 >> 4) & 0x3; //After Password
addchar3 = (addchar5 >> 6) & 0x1; //After OTP
addchar6 = (addchar5 >> 7) & 0x1; //After OTP 2
addchar4 = (addchar5 >> 2) & 0x1; //Before Username
addchar5 = (addchar5 >> 3) & 0x1; //Before OTP
if (isfade) return;
#ifdef DEBUG
Serial.print("Slot Number ");
Serial.println(button_selected-'0');
#endif
memset(temp, 0, 64); //Wipe all data from buffer
memset(keybuffer, 0, sizeof(keybuffer)); //Wipe all data from keybuffer
ptr = temp;
urllength = okcore_flashget_url(ptr, slot);
if(urllength > 0)
{
#ifdef DEBUG
Serial.println("Reading URL from Flash...");
Serial.print("URL Length = ");
Serial.println(urllength);
#endif
#ifdef DEBUG
Serial.println("Encrypted");
byteprint(temp, urllength);
#endif
okcore_aes_gcm_decrypt(temp, slot, 15, profilekey, urllength);
if (temp[0]==0x08) { // Scripted Mode
scripted_mode=true;
ByteToChar2(temp+1, keybuffer, urllength-1, index);
index=urllength-1;
} else {
ByteToChar2(temp, keybuffer, urllength, index);
index=urllength;
keybuffer[index] = 2;
index++;
#ifdef DEBUG
Serial.println("Unencrypted");
byteprint(temp, urllength);
Serial.println("Setting RETURN after URL");
#endif
}
}
memset(temp, 0, 64); //Wipe all data from buffer
okeeprom_eeget_delay1(ptr, slot);
if(temp[0] > 0 && !scripted_mode)
{
#ifdef DEBUG
Serial.println("Reading Delay1 from EEPROM...");
Serial.print("Delay ");
Serial.print(temp[0]);
Serial.println(" Seconds before entering username");
#endif
if (temp[0] <= 30)
{
delay1=temp[0];
keybuffer[index] = temp[0] + 10;
index++;
}
}
if(addchar4 && !scripted_mode)
{
#ifdef DEBUG
Serial.println("Reading before Username addchar...");
#endif
keybuffer[index] = 1;
#ifdef DEBUG
Serial.println("TAB");
#endif
index++;
}
usernamelength = okcore_flashget_username(ptr, slot);
if(usernamelength > 0)
{
#ifdef DEBUG
Serial.println("Reading Username from Flash...");
Serial.print("Username Length = ");
Serial.println(usernamelength);
byteprint(temp, usernamelength);
#endif
okcore_aes_gcm_decrypt(temp, slot, 2, profilekey, usernamelength);
ByteToChar2(temp, keybuffer, usernamelength, index);
#ifdef DEBUG
byteprint(temp, usernamelength);
#endif
index=usernamelength+index;
}
memset(temp, 0, 64); //Wipe all data from buffer
if(addchar1 && !scripted_mode)
{
if(addchar1 == 1) {
#ifdef DEBUG
Serial.println("Reading after username addchar...");
#endif
keybuffer[index] = 1;
#ifdef DEBUG
Serial.println("TAB");
#endif
index++;
}
else if(addchar1 == 2) {
#ifdef DEBUG
Serial.println("Reading after username addchar...");
#endif
keybuffer[index] = 2;
#ifdef DEBUG
Serial.println("RETURN");
#endif
index++;
}
}
memset(temp, 0, 64); //Wipe all data from buffer
okeeprom_eeget_delay2(ptr, slot);
if(temp[0] > 0 && !scripted_mode)
{
#ifdef DEBUG
Serial.println("Reading Delay2 from EEPROM...");
Serial.print("Delay ");
Serial.print(temp[0]);
Serial.println(" Seconds before entering password");
#endif
if (temp[0] <= 30)
{
delay2=temp[0];
keybuffer[index] = temp[0] + 10;
index++;
}
}
passwordlength = okeeprom_eeget_password(ptr, slot);
if(passwordlength > 0)
{
#ifdef DEBUG
Serial.println("Reading Password from EEPROM...");
Serial.print("Password Length = ");
Serial.println(passwordlength);
Serial.println("Encrypted");
byteprint(temp, passwordlength);
#endif
okcore_aes_gcm_decrypt(temp, slot, 5, profilekey, passwordlength);
ByteToChar2(temp, keybuffer, passwordlength, index);
#ifdef DEBUG
Serial.println("Unencrypted");
byteprint(temp, passwordlength);
#endif
index=passwordlength+index;
}
memset(temp, 0, 64); //Wipe all data from buffer
if(addchar2 && !scripted_mode)
{
#ifdef DEBUG
Serial.println("Reading after password addchar...");
#endif
if(addchar2 == 1) {
keybuffer[index] = 1;
#ifdef DEBUG
Serial.println("TAB");
#endif
index++;
}
else if(addchar2 == 2) {
keybuffer[index] = 2;
#ifdef DEBUG
Serial.println("RETURN");
#endif
index++;
}
}
memset(temp, 0, 64); //Wipe all data from buffer
okeeprom_eeget_delay3(ptr, slot);
if(temp[0] > 0 && !scripted_mode)
{
#ifdef DEBUG
Serial.println("Reading Delay3 from EEPROM...");
Serial.print("Delay ");
Serial.print(temp[0]);
Serial.println(" Seconds before entering 2FA");
#endif
if (temp[0] <= 30)
{
delay3=temp[0];
keybuffer[index] = temp[0] + 10;
index++;
}
}
memset(temp, 0, 64); //Wipe all data from buffer
if(addchar5 && !scripted_mode)
{
#ifdef DEBUG
Serial.println("Reading before OTP addchar...");
#endif
keybuffer[index] = 1;
#ifdef DEBUG
Serial.println("TAB");
#endif
index++;
}
otplength = okeeprom_eeget_2FAtype(ptr, slot);
if(temp[0] > 0)
{
if(temp[0] == MFAGOOGLEAUTH) { //Google Auth
#ifdef DEBUG
Serial.println("Reading TOTP Key from Flash...");
#endif
otplength = okcore_flashget_2fa_key(ptr, slot);
#ifdef DEBUG
Serial.println("Encrypted");
byteprint(temp, otplength);
Serial.print("TOTP Key Length = ");
Serial.println(otplength);
#endif
okcore_aes_gcm_decrypt(temp, slot, 9, profilekey, otplength);
ByteToChar2(temp, keybuffer, otplength, index);
#ifdef DEBUG
Serial.println("Unencrypted");
byteprint(temp, otplength);
#endif
TOTP totp1 = TOTP(temp, otplength);
GMT = now();
GMT = GMT + delay1 + delay2 + delay3;
#ifdef DEBUG
Serial.println(GMT);
#endif
newcode = totp1.getCode(GMT);
if (timeStatus() == timeNotSet) {
keybuffer[index]='N';
keybuffer[index+1]='O';
keybuffer[index+2]='T';
keybuffer[index+3]='S';
keybuffer[index+4]='E';
keybuffer[index+5]='T';
} else {
keybuffer[index]=*newcode;
keybuffer[index+1]=*(newcode+1);
keybuffer[index+2]=*(newcode+2);
keybuffer[index+3]=*(newcode+3);
keybuffer[index+4]=*(newcode+4);
keybuffer[index+5]=*(newcode+5);
}
index=index+6;
memset(temp, 0, 64); //Wipe all data from buffer
}
if(temp[0] == MFAOLDYUBIOTP && profilemode!=NONENCRYPTEDPROFILE) {
#ifdef DEBUG
Serial.println("Generating Yubico OTP Legacy...");
#endif
#ifdef STD_VERSION
yubikeysim(keybuffer + index, 0);
index=index+44;
#endif
}
if((temp[0] == MFAYUBIOTPandHMACSHA1 || temp[0] == MFAYUBIOTP) && profilemode!=NONENCRYPTEDPROFILE) {
#ifdef DEBUG
Serial.println("Generating Yubico OTP...");
#endif
#ifdef STD_VERSION
int publen;
publen = yubikeysim(keybuffer + index, slot);
index=index+32+(publen*2);
#endif
}
if(temp[0] == MFAOLDU2F && profilemode!=NONENCRYPTEDPROFILE) { //U2F
keybuffer[index] = 9;
index++;
}
}
if(addchar6)
{
#ifdef DEBUG
Serial.println("Reading after OTP addchar...");
#endif
keybuffer[index] = 1;
#ifdef DEBUG
Serial.println("TAB");
#endif
index++;
}
if(addchar3)
{
#ifdef DEBUG
Serial.println("Reading after OTP addchar...");
#endif
keybuffer[index] = 2;
#ifdef DEBUG
Serial.println("RETURN");
#endif
index++;
}
keybuffer[index] = 0;
#ifdef DEBUG
Serial.println("Displaying Full Keybuffer");
for (int i=0; keybuffer[i]!=0x00; i++) {
Serial.print
(keybuffer[i]);
}
#endif
}
void sendInitialized(Task* me) {
if (onlykeyhw==OK_HW_DUO){
int n = RawHID.recv(recv_buffer, 0); // 0 timeout = do not wait
if (n && recv_buffer[4] == OKPIN && recv_buffer[5]>='0' && initialized == true && unlocked == false && onlykeyhw==OK_HW_DUO) {
unlocked = false;
firsttime = true;
password.reset(); //reset the guessed password to NULL
okcore_pin_login(); // Received PIN Login Attempt for OnlyKey Duo
pass_keypress=10;
button_selected=0;
payload(10); // Try the PIN
memset(recv_buffer, 0, sizeof(recv_buffer));
if (unlocked == true) {
hidprint(HW_MODEL(UNLOCKED));
}
} else {
hidprint("INITIALIZED-D");
}
} else hidprint("INITIALIZED");
#ifdef DEBUG
Serial.println("INITIALIZED");
#endif
}
void resetkeys () {
delay(200);
Keyboard.set_key1(0);
Keyboard.set_key2(0);
Keyboard.set_key3(0);
Keyboard.set_key4(0);
Keyboard.set_key5(0);
Keyboard.set_key6(0);
Keyboard.set_modifier(0);
Keyboard.set_media(0);
Keyboard.send_now();
}
void ctrl_alt_del () {
//Keyboard.set_modifier(MODIFIERKEY_CTRL);
// Keyboard.send_now();
// Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_ALT);
Keyboard.send_now();
// Keyboard.set_key1(KEY_DELETE);
Keyboard.send_now();
resetkeys();
// Keyboard.set_key1(KEY_ESC);
Keyboard.send_now();
resetkeys();
}
void lock_ok_and_screen () {
unlocked = false;
firsttime = true;
password.reset(); //reset the guessed password to NULL
pass_keypress=1;
memset(profilekey, 0, 32);
//Lock Windows and Linux (Gnome Super+L to lock)
Keyboard.set_modifier(MODIFIERKEY_GUI);
Keyboard.send_now();
Keyboard.set_key1(KEY_L);
Keyboard.send_now();
resetkeys();
//Lock Mac
Keyboard.set_modifier(MODIFIERKEY_CTRL);
Keyboard.send_now();
Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_GUI);
Keyboard.send_now();
Keyboard.set_key1(KEY_Q);
Keyboard.send_now();
delay(500); // Mac OS-X will not recognize a very short eject press
Keyboard.set_media(0);
Keyboard.send_now();
resetkeys();
CPU_RESTART();
}
void fw_hash(unsigned char* hashptr) {
#ifdef STD_VERSION
unsigned char smesg[17000];
unsigned long adr = fwstartadr;
//Hash current fw in hashptr
while (adr <= 0x36060) { //13 blocks of 16384 bytes, last block 0x36060 - 0x3A060
okcore_flashget_common (smesg, (unsigned long*)adr, 16384); //Read each block
if (adr == (unsigned long)fwstartadr) {
crypto_hash(hashptr,smesg,16384); //hash this block
}
else { //if not first block, hash with previous block hash
memcpy(smesg + 16384, hashptr, crypto_hash_BYTES);
crypto_hash(hashptr,smesg,(16384+crypto_hash_BYTES));
}
adr = adr + 16384;
}
return;
#endif
}
void keymap_press (char key) {
extern uint8_t keyboard_modifier_keys;
extern uint8_t keyboard_keys[6];
if ((uint8_t)*pos>'0' && (uint8_t)*pos<='9') {
delay((*(pos)-'0')*1000);
} else if ((uint8_t)*pos=='t' || (uint8_t)*pos=='r') {
if (key) {
Keyboard.press(*pos);
key=0;
}
else if ((uint8_t)*pos=='t') {
key = KEY_TAB;
}
else if ((uint8_t)*pos=='r') {
key = KEY_RETURN;
}
} else if (mod_keys_enabled) {
if (key) {
Keyboard.press(*pos);
key=0;
} else {
if ((uint8_t)*pos=='p') key = KEY_PRINTSCREEN;
else if ((uint8_t)*pos=='h') key = KEY_HOME;
else if ((uint8_t)*pos=='u') key = KEY_PAGE_UP;
else if ((uint8_t)*pos=='o') key = KEY_PAGE_DOWN;
else if ((uint8_t)*pos=='e') key = KEY_END;
else if ((uint8_t)*pos=='d') key = KEY_DELETE;
else if ((uint8_t)*pos=='b') key = KEY_BACKSPACE;
else if ((uint8_t)*pos=='L') key = KEY_LEFT;
else if ((uint8_t)*pos=='R') key = KEY_RIGHT;
else if ((uint8_t)*pos=='U') key = KEY_UP;
else if ((uint8_t)*pos=='D') key = KEY_DOWN;
else if ((uint8_t)*pos=='E') key = KEY_ESC;
if ((uint8_t)*pos=='c') keyboard_modifier_keys |= MODIFIERKEY_CTRL;
else if ((uint8_t)*pos=='s') keyboard_modifier_keys |= MODIFIERKEY_SHIFT;
else if ((uint8_t)*pos=='a') keyboard_modifier_keys |= MODIFIERKEY_ALT;
else if ((uint8_t)*pos=='g') keyboard_modifier_keys |= MODIFIERKEY_GUI;
}
}
if (keyboard_keys[0] == 0) keyboard_keys[0] = key;
else if (keyboard_keys[1] == 0) keyboard_keys[1] = key;
else if (keyboard_keys[2] == 0) keyboard_keys[2] = key;
else if (keyboard_keys[3] == 0) keyboard_keys[3] = key;
else if (keyboard_keys[4] == 0) keyboard_keys[4] = key;
else if (keyboard_keys[5] == 0) keyboard_keys[5] = key;
Keyboard.send_now();
}
void exceeded_login_attempts() {
#ifdef DEBUG
Serial.print("password attempts for this session exceeded, remove OnlyKey and reinsert to attempt login");
#endif
while(1==1)
{
hidprint("Error password attempts for this session exceeded, remove OnlyKey and reinsert to attempt login");
#ifdef OK_Color
NEO_Color = 1; //Red
#endif
blink(5);
}
}
================================================
FILE: README.md
================================================
# OnlyKey Firmware
This is the official firmware for **OnlyKey**
OnlyKey can be purchased here: [OnlyKey order](https://onlykey.io)
## Getting Started
Just getting started with OnlyKey?
[Start here](https://onlykey.io/start)
## About
The firmware is the software that runs on the OnlyKey itself. In order to load firmware follow the instructions in the [User's Guide here](https://docs.crp.to/usersguide.html#loading-onlykey-firmware)
## Development
OnlyKey firmware is open source and new features are added with each firmware release. A list of of supported features are available [here](https://docs.crp.to/features.html)
## Support
Check out the [OnlyKey Support Forum](https://forum.onlykey.io)
Check out the [OnlyKey Documentation](https://docs.crp.to)
## Libraries
OnlyKey firmware uses additional libraries that are available [here](https://github.com/trustcrypto/libraries).
# Legal things
## Cryptography Notice
This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software.
BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
See <http://www.wassenaar.org/> for more information.
The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms.
The form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.
The following cryptographic software is included in this distribution:
"MBED TLS PROJECT" - https://github.com/ARMmbed/mbedtls
"MICRO-ECC PROJECT" - https://github.com/kmackay/micro-ecc
"ARDUINOLIBS PROJECT" - https://rweather.github.io/arduinolibs/crypto.html
"YUBICO-C PROJECT" - https://github.com/Yubico/yubico-c
For more information on export restrictions see: http://www.apache.org/licenses/exports/
## Source
[OnlyKey Firmware on Github](https://github.com/trustcrypto/OnlyKey-Firmware)
================================================
FILE: keylayouts.c
================================================
/* Modifications
* Copyright (c) 2015-2020, CryptoTrust LLC.
* All rights reserved.
*
* Author : Tim Steiner <t@crp.to>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by CryptoTrust LLC. for
* the OnlyKey Project (https://www.crp.to/ok)"
*
* 4. The names "OnlyKey" and "CryptoTrust" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* admin@crp.to.
*
* 5. Products derived from this software may not be called "OnlyKey"
* nor may "OnlyKey" or "CryptoTrust" appear in their names without
* specific prior written permission. For written permission, please
* contact admin@crp.to.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by CryptoTrust LLC. for
* the OnlyKey Project (https://www.crp.to/ok)"
*
* 7. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for this software and any
* accompanying software that uses this software. The source code
* must either be included in the distribution or be available for
* no more than the cost of distribution plus a nominal fee, and must
* be freely redistributable under reasonable conditions. For a
* binary file, complete source code means the source code for all
* modules it contains.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS
* ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT
* LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM
* IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE
* SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE
* RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY
* THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF
* ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER
* APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE
* REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION
* BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM
* EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL
* SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT
* FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS
* AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF
* TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS
* PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* Original Teensyduino Core Library
* http://www.pjrc.com/teensy/
* Copyright (c) 2013 PJRC.COM, LLC.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* 1. The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* 2. If the Software is incorporated into a build system that allows
* selection among a list of target devices, then similar target
* devices manufactured by PJRC.COM must be included in the list of
* target devices and selectable in the same manner.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <avr/pgmspace.h>
#include <stdint.h>
#include "keylayouts.h"
#ifdef M
#undef M
#endif
#define M(n) ((n) & KEYCODE_MASK)
KEYCODE_TYPE keycodes_ascii[96] = {0};
KEYCODE_TYPE keycodes_iso_8859_1[96] = {0};
uint8_t KeyboardLayout[1];
uint16_t SHIFT_MASK = 0;
uint16_t ALTGR_MASK = 0;
uint16_t RCTRL_MASK = 0;
uint16_t KEY_NON_US_100 = 0;
uint16_t DEADKEYS_MASK = 0;
uint16_t CIRCUMFLEX_BITS = 0;
uint16_t ACUTE_ACCENT_BITS = 0;
uint16_t GRAVE_ACCENT_BITS = 0;
uint16_t TILDE_BITS = 0;
uint16_t DIAERESIS_BITS = 0;
uint16_t DEADKEY_CIRCUMFLEX = 0;
uint16_t DEADKEY_ACUTE_ACCENT = 0;
uint16_t DEADKEY_GRAVE_ACCENT = 0;
uint16_t DEADKEY_TILDE = 0;
uint16_t DEADKEY_DIAERESIS = 0;
uint16_t UNICODE_20AC = 0;
uint16_t CEDILLA_BITS = 0;
uint16_t DEADKEY_CEDILLA = 0;
uint16_t RING_ABOVE_BITS = 0;
uint16_t DEADKEY_RING_ABOVE = 0;
uint16_t DEGREE_SIGN_BITS = 0;
uint16_t CARON_BITS = 0;
uint16_t BREVE_BITS = 0;
uint16_t OGONEK_BITS = 0;
uint16_t DOT_ABOVE_BITS = 0;
uint16_t DOUBLE_ACUTE_BITS = 0;
uint16_t DEADKEY_DEGREE_SIGN = 0;
uint16_t DEADKEY_CARON = 0;
uint16_t DEADKEY_BREVE = 0;
uint16_t DEADKEY_OGONEK = 0;
uint16_t DEADKEY_DOT_ABOVE = 0;
uint16_t DEADKEY_DOUBLE_ACUTE = 0;
uint16_t UNICODE_EXTRA0A = 0;
uint16_t KEYCODE_EXTRA0A = 0;
uint16_t ISO_8859_1_A0 = 0;
uint16_t UNICODE_EXTRA00 = 0;
uint16_t UNICODE_EXTRA01 = 0;
uint16_t UNICODE_EXTRA02 = 0;
uint16_t UNICODE_EXTRA03 = 0;
uint16_t UNICODE_EXTRA04 = 0;
uint16_t UNICODE_EXTRA05 = 0;
uint16_t UNICODE_EXTRA06 = 0;
uint16_t UNICODE_EXTRA07 = 0;
uint16_t UNICODE_EXTRA08 = 0;
uint16_t UNICODE_EXTRA09 = 0;
uint16_t KEYCODE_EXTRA00 = 0;
uint16_t KEYCODE_EXTRA01 = 0;
uint16_t KEYCODE_EXTRA02 = 0;
uint16_t KEYCODE_EXTRA03 = 0;
uint16_t KEYCODE_EXTRA04 = 0;
uint16_t KEYCODE_EXTRA05 = 0;
uint16_t KEYCODE_EXTRA06 = 0;
uint16_t KEYCODE_EXTRA07 = 0;
uint16_t KEYCODE_EXTRA08 = 0;
uint16_t KEYCODE_EXTRA09 = 0;
uint16_t KEYCODE_MASK = 0;
void update_keyboard_layout() {
SHIFT_MASK = 0;
ALTGR_MASK = 0;
RCTRL_MASK = 0;
KEY_NON_US_100 = 0;
DEADKEYS_MASK = 0;
CIRCUMFLEX_BITS = 0;
ACUTE_ACCENT_BITS = 0;
GRAVE_ACCENT_BITS = 0;
TILDE_BITS = 0;
DIAERESIS_BITS = 0;
DEADKEY_CIRCUMFLEX = 0;
DEADKEY_ACUTE_ACCENT = 0;
DEADKEY_GRAVE_ACCENT = 0;
DEADKEY_TILDE = 0;
DEADKEY_DIAERESIS = 0;
UNICODE_20AC = 0;
CEDILLA_BITS = 0;
DEADKEY_CEDILLA = 0;
RING_ABOVE_BITS = 0;
DEADKEY_RING_ABOVE = 0;
DEGREE_SIGN_BITS = 0;
CARON_BITS = 0;
BREVE_BITS = 0;
OGONEK_BITS = 0;
DOT_ABOVE_BITS = 0;
DOUBLE_ACUTE_BITS = 0;
DEADKEY_DEGREE_SIGN = 0;
DEADKEY_CARON = 0;
DEADKEY_BREVE = 0;
DEADKEY_OGONEK = 0;
DEADKEY_DOT_ABOVE = 0;
DEADKEY_DOUBLE_ACUTE = 0;
UNICODE_EXTRA0A = 0;
KEYCODE_EXTRA0A = 0;
uint16_t ASCII_20 = 0;
uint16_t ASCII_21 = 0;
uint16_t ASCII_22 = 0;
uint16_t ASCII_23 = 0;
uint16_t ASCII_24 = 0;
uint16_t ASCII_25 = 0;
uint16_t ASCII_26 = 0;
uint16_t ASCII_27 = 0;
uint16_t ASCII_28 = 0;
uint16_t ASCII_29 = 0;
uint16_t ASCII_2A = 0;
uint16_t ASCII_2B = 0;
uint16_t ASCII_2C = 0;
uint16_t ASCII_2D = 0;
uint16_t ASCII_2E = 0;
uint16_t ASCII_2F = 0;
uint16_t ASCII_30 = 0;
uint16_t ASCII_31 = 0;
uint16_t ASCII_32 = 0;
uint16_t ASCII_33 = 0;
uint16_t ASCII_34 = 0;
uint16_t ASCII_35 = 0;
uint16_t ASCII_36 = 0;
uint16_t ASCII_37 = 0;
uint16_t ASCII_38 = 0;
uint16_t ASCII_39 = 0;
uint16_t ASCII_3A = 0;
uint16_t ASCII_3B = 0;
uint16_t ASCII_3C = 0;
uint16_t ASCII_3D = 0;
uint16_t ASCII_3E = 0;
uint16_t ASCII_3F = 0;
uint16_t ASCII_40 = 0;
uint16_t ASCII_41 = 0;
uint16_t ASCII_42 = 0;
uint16_t ASCII_43 = 0;
uint16_t ASCII_44 = 0;
uint16_t ASCII_45 = 0;
uint16_t ASCII_46 = 0;
uint16_t ASCII_47 = 0;
uint16_t ASCII_48 = 0;
uint16_t ASCII_49 = 0;
uint16_t ASCII_4A = 0;
uint16_t ASCII_4B = 0;
uint16_t ASCII_4C = 0;
uint16_t ASCII_4D = 0;
uint16_t ASCII_4E = 0;
uint16_t ASCII_4F = 0;
uint16_t ASCII_50 = 0;
uint16_t ASCII_51 = 0;
uint16_t ASCII_52 = 0;
uint16_t ASCII_53 = 0;
uint16_t ASCII_54 = 0;
uint16_t ASCII_55 = 0;
uint16_t ASCII_56 = 0;
uint16_t ASCII_57 = 0;
uint16_t ASCII_58 = 0;
uint16_t ASCII_59 = 0;
uint16_t ASCII_5A = 0;
uint16_t ASCII_5B = 0;
uint16_t ASCII_5C = 0;
uint16_t ASCII_5D = 0;
uint16_t ASCII_5E = 0;
uint16_t ASCII_5F = 0;
uint16_t ASCII_60 = 0;
uint16_t ASCII_61 = 0;
uint16_t ASCII_62 = 0;
uint16_t ASCII_63 = 0;
uint16_t ASCII_64 = 0;
uint16_t ASCII_65 = 0;
uint16_t ASCII_66 = 0;
uint16_t ASCII_67 = 0;
uint16_t ASCII_68 = 0;
uint16_t ASCII_69 = 0;
uint16_t ASCII_6A = 0;
uint16_t ASCII_6B = 0;
uint16_t ASCII_6C = 0;
uint16_t ASCII_6D = 0;
uint16_t ASCII_6E = 0;
uint16_t ASCII_6F = 0;
uint16_t ASCII_70 = 0;
uint16_t ASCII_71 = 0;
uint16_t ASCII_72 = 0;
uint16_t ASCII_73 = 0;
uint16_t ASCII_74 = 0;
uint16_t ASCII_75 = 0;
uint16_t ASCII_76 = 0;
uint16_t ASCII_77 = 0;
uint16_t ASCII_78 = 0;
uint16_t ASCII_79 = 0;
uint16_t ASCII_7A = 0;
uint16_t ASCII_7B = 0;
uint16_t ASCII_7C = 0;
uint16_t ASCII_7D = 0;
uint16_t ASCII_7E = 0;
uint16_t ASCII_7F = 0;
ISO_8859_1_A0 = 0;
uint16_t ISO_8859_1_A1 = 0;
uint16_t ISO_8859_1_A2 = 0;
uint16_t ISO_8859_1_A3 = 0;
uint16_t ISO_8859_1_A4 = 0;
uint16_t ISO_8859_1_A5 = 0;
uint16_t ISO_8859_1_A6 = 0;
uint16_t ISO_8859_1_A7 = 0;
uint16_t ISO_8859_1_A8 = 0;
uint16_t ISO_8859_1_A9 = 0;
uint16_t ISO_8859_1_AA = 0;
uint16_t ISO_8859_1_AB = 0;
uint16_t ISO_8859_1_AC = 0;
uint16_t ISO_8859_1_AD = 0;
uint16_t ISO_8859_1_AE = 0;
uint16_t ISO_8859_1_AF = 0;
uint16_t ISO_8859_1_B0 = 0;
uint16_t ISO_8859_1_B1 = 0;
uint16_t ISO_8859_1_B2 = 0;
uint16_t ISO_8859_1_B3 = 0;
uint16_t ISO_8859_1_B4 = 0;
uint16_t ISO_8859_1_B5 = 0;
uint16_t ISO_8859_1_B6 = 0;
uint16_t ISO_8859_1_B7 = 0;
uint16_t ISO_8859_1_B8 = 0;
uint16_t ISO_8859_1_B9 = 0;
uint16_t ISO_8859_1_BA = 0;
uint16_t ISO_8859_1_BB = 0;
uint16_t ISO_8859_1_BC = 0;
uint16_t ISO_8859_1_BD = 0;
uint16_t ISO_8859_1_BE = 0;
uint16_t ISO_8859_1_BF = 0;
uint16_t ISO_8859_1_C0 = 0;
uint16_t ISO_8859_1_C1 = 0;
uint16_t ISO_8859_1_C2 = 0;
uint16_t ISO_8859_1_C3 = 0;
uint16_t ISO_8859_1_C4 = 0;
uint16_t ISO_8859_1_C5 = 0;
uint16_t ISO_8859_1_C6 = 0;
uint16_t ISO_8859_1_C7 = 0;
uint16_t ISO_8859_1_C8 = 0;
uint16_t ISO_8859_1_C9 = 0;
uint16_t ISO_8859_1_CA = 0;
uint16_t ISO_8859_1_CB = 0;
uint16_t ISO_8859_1_CC = 0;
uint16_t ISO_8859_1_CD = 0;
uint16_t ISO_8859_1_CE = 0;
uint16_t ISO_8859_1_CF = 0;
uint16_t ISO_8859_1_D0 = 0;
uint16_t ISO_8859_1_D1 = 0;
uint16_t ISO_8859_1_D2 = 0;
uint16_t ISO_8859_1_D3 = 0;
uint16_t ISO_8859_1_D4 = 0;
uint16_t ISO_8859_1_D5 = 0;
uint16_t ISO_8859_1_D6 = 0;
uint16_t ISO_8859_1_D7 = 0;
uint16_t ISO_8859_1_D8 = 0;
uint16_t ISO_8859_1_D9 = 0;
uint16_t ISO_8859_1_DA = 0;
uint16_t ISO_8859_1_DB = 0;
uint16_t ISO_8859_1_DC = 0;
uint16_t ISO_8859_1_DD = 0;
uint16_t ISO_8859_1_DE = 0;
uint16_t ISO_8859_1_DF = 0;
uint16_t ISO_8859_1_E0 = 0;
uint16_t ISO_8859_1_E1 = 0;
uint16_t ISO_8859_1_E2 = 0;
uint16_t ISO_8859_1_E3 = 0;
uint16_t ISO_8859_1_E4 = 0;
uint16_t ISO_8859_1_E5 = 0;
uint16_t ISO_8859_1_E6 = 0;
uint16_t ISO_8859_1_E7 = 0;
uint16_t ISO_8859_1_E8 = 0;
uint16_t ISO_8859_1_E9 = 0;
uint16_t ISO_8859_1_EA = 0;
uint16_t ISO_8859_1_EB = 0;
uint16_t ISO_8859_1_EC = 0;
uint16_t ISO_8859_1_ED = 0;
uint16_t ISO_8859_1_EE = 0;
uint16_t ISO_8859_1_EF = 0;
uint16_t ISO_8859_1_F0 = 0;
uint16_t ISO_8859_1_F1 = 0;
uint16_t ISO_8859_1_F2 = 0;
uint16_t ISO_8859_1_F3 = 0;
uint16_t ISO_8859_1_F4 = 0;
uint16_t ISO_8859_1_F5 = 0;
uint16_t ISO_8859_1_F6 = 0;
uint16_t ISO_8859_1_F7 = 0;
uint16_t ISO_8859_1_F8 = 0;
uint16_t ISO_8859_1_F9 = 0;
uint16_t ISO_8859_1_FA = 0;
uint16_t ISO_8859_1_FB = 0;
uint16_t ISO_8859_1_FC = 0;
uint16_t ISO_8859_1_FD = 0;
uint16_t ISO_8859_1_FE = 0;
uint16_t ISO_8859_1_FF = 0;
UNICODE_EXTRA00 = 0;
UNICODE_EXTRA01 = 0;
UNICODE_EXTRA02 = 0;
UNICODE_EXTRA03 = 0;
UNICODE_EXTRA04 = 0;
UNICODE_EXTRA05 = 0;
UNICODE_EXTRA06 = 0;
UNICODE_EXTRA07 = 0;
UNICODE_EXTRA08 = 0;
UNICODE_EXTRA09 = 0;
uint16_t UNICODE_EXTRA10 = 0;
uint16_t UNICODE_EXTRA11 = 0;
uint16_t UNICODE_EXTRA12 = 0;
uint16_t UNICODE_EXTRA13 = 0;
uint16_t UNICODE_EXTRA14 = 0;
uint16_t UNICODE_EXTRA15 = 0;
uint16_t UNICODE_EXTRA16 = 0;
uint16_t UNICODE_EXTRA17 = 0;
uint16_t UNICODE_EXTRA18 = 0;
uint16_t UNICODE_EXTRA19 = 0;
uint16_t UNICODE_EXTRA20 = 0;
uint16_t UNICODE_EXTRA21 = 0;
uint16_t UNICODE_EXTRA22 = 0;
uint16_t UNICODE_EXTRA23 = 0;
uint16_t UNICODE_EXTRA24 = 0;
uint16_t UNICODE_EXTRA25 = 0;
uint16_t UNICODE_EXTRA26 = 0;
uint16_t UNICODE_EXTRA27 = 0;
uint16_t UNICODE_EXTRA28 = 0;
uint16_t UNICODE_EXTRA29 = 0;
uint16_t UNICODE_EXTRA30 = 0;
uint16_t UNICODE_EXTRA31 = 0;
uint16_t UNICODE_EXTRA32 = 0;
uint16_t UNICODE_EXTRA33 = 0;
uint16_t UNICODE_EXTRA34 = 0;
uint16_t UNICODE_EXTRA35 = 0;
uint16_t UNICODE_EXTRA36 = 0;
uint16_t UNICODE_EXTRA37 = 0;
uint16_t UNICODE_EXTRA38 = 0;
uint16_t UNICODE_EXTRA39 = 0;
uint16_t UNICODE_EXTRA40 = 0;
uint16_t UNICODE_EXTRA41 = 0;
uint16_t UNICODE_EXTRA42 = 0;
uint16_t UNICODE_EXTRA43 = 0;
uint16_t UNICODE_EXTRA44 = 0;
uint16_t UNICODE_EXTRA45 = 0;
uint16_t UNICODE_EXTRA46 = 0;
uint16_t UNICODE_EXTRA47 = 0;
uint16_t UNICODE_EXTRA48 = 0;
uint16_t UNICODE_EXTRA49 = 0;
uint16_t UNICODE_EXTRA50 = 0;
uint16_t UNICODE_EXTRA51 = 0;
KEYCODE_EXTRA00 = 0;
KEYCODE_EXTRA01 = 0;
KEYCODE_EXTRA02 = 0;
KEYCODE_EXTRA03 = 0;
KEYCODE_EXTRA04 = 0;
KEYCODE_EXTRA05 = 0;
KEYCODE_EXTRA06 = 0;
KEYCODE_EXTRA07 = 0;
KEYCODE_EXTRA08 = 0;
KEYCODE_EXTRA09 = 0;
uint16_t KEYCODE_EXTRA10 = 0;
uint16_t KEYCODE_EXTRA11 = 0;
uint16_t KEYCODE_EXTRA12 = 0;
uint16_t KEYCODE_EXTRA13 = 0;
uint16_t KEYCODE_EXTRA14 = 0;
uint16_t KEYCODE_EXTRA15 = 0;
uint16_t KEYCODE_EXTRA16 = 0;
uint16_t KEYCODE_EXTRA17 = 0;
uint16_t KEYCODE_EXTRA18 = 0;
uint16_t KEYCODE_EXTRA19 = 0;
uint16_t KEYCODE_EXTRA20 = 0;
uint16_t KEYCODE_EXTRA21 = 0;
uint16_t KEYCODE_EXTRA22 = 0;
uint16_t KEYCODE_EXTRA23 = 0;
uint16_t KEYCODE_EXTRA24 = 0;
uint16_t KEYCODE_EXTRA25 = 0;
uint16_t KEYCODE_EXTRA26 = 0;
uint16_t KEYCODE_EXTRA27 = 0;
uint16_t KEYCODE_EXTRA28 = 0;
uint16_t KEYCODE_EXTRA29 = 0;
uint16_t KEYCODE_EXTRA30 = 0;
uint16_t KEYCODE_EXTRA31 = 0;
uint16_t KEYCODE_EXTRA32 = 0;
uint16_t KEYCODE_EXTRA33 = 0;
uint16_t KEYCODE_EXTRA34 = 0;
uint16_t KEYCODE_EXTRA35 = 0;
uint16_t KEYCODE_EXTRA36 = 0;
uint16_t KEYCODE_EXTRA37 = 0;
uint16_t KEYCODE_EXTRA38 = 0;
uint16_t KEYCODE_EXTRA39 = 0;
uint16_t KEYCODE_EXTRA40 = 0;
uint16_t KEYCODE_EXTRA41 = 0;
uint16_t KEYCODE_EXTRA42 = 0;
uint16_t KEYCODE_EXTRA43 = 0;
uint16_t KEYCODE_EXTRA44 = 0;
uint16_t KEYCODE_EXTRA45 = 0;
uint16_t KEYCODE_EXTRA46 = 0;
uint16_t KEYCODE_EXTRA47 = 0;
uint16_t KEYCODE_EXTRA48 = 0;
uint16_t KEYCODE_EXTRA49 = 0;
uint16_t KEYCODE_EXTRA50 = 0;
uint16_t KEYCODE_EXTRA51 = 0;
if (KeyboardLayout[0] == LAYOUT_USA_ENGLISH || KeyboardLayout[0] == LAYOUT_DVORAK || KeyboardLayout[0] == 0x00) {
SHIFT_MASK=0x0040;
//KEYCODE_TYPE=uint8_t
KEYCODE_MASK=0x007F;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_QUOTE + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_QUOTE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_SLASH;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 )=
ASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >
ASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE;// 91 [
ASCII_5C=KEY_BACKSLASH;// 92
ASCII_5D=KEY_RIGHT_BRACE;// 93 ]
ASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=KEY_TILDE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {
ASCII_7C=KEY_BACKSLASH + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }
ASCII_7E=KEY_TILDE + SHIFT_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
if (KeyboardLayout[0] == LAYOUT_DVORAK) {
ASCII_2D=KEY_QUOTE; // -
ASCII_5F=KEY_QUOTE + SHIFT_MASK; // _
ASCII_3D=KEY_RIGHT_BRACE; // =
ASCII_2B=KEY_RIGHT_BRACE + SHIFT_MASK; // +
ASCII_71=KEY_X; // q
ASCII_51=KEY_X + SHIFT_MASK;// Q
ASCII_77=KEY_COMMA; // w
ASCII_57=KEY_COMMA + SHIFT_MASK; // W
ASCII_65=KEY_D; // e
ASCII_45=KEY_D + SHIFT_MASK; // E
ASCII_72=KEY_O; // r
ASCII_52=KEY_O + SHIFT_MASK; // R
ASCII_74=KEY_K; // t
ASCII_54=KEY_K + SHIFT_MASK; // T
ASCII_79=KEY_T; // y
ASCII_59=KEY_T + SHIFT_MASK; // Y
ASCII_75=KEY_F; // u
ASCII_55=KEY_F + SHIFT_MASK; // U
ASCII_69=KEY_G; // i
ASCII_49=KEY_G + SHIFT_MASK; // I
ASCII_6F=KEY_S; // o
ASCII_4F=KEY_S + SHIFT_MASK; // O
ASCII_70=KEY_R; // p
ASCII_50=KEY_R + SHIFT_MASK; // P
ASCII_5B=KEY_MINUS; // [
ASCII_7B=KEY_MINUS + SHIFT_MASK; // {
ASCII_5D=KEY_EQUAL; // ]
ASCII_7D=KEY_EQUAL + SHIFT_MASK; // }
ASCII_73=KEY_SEMICOLON; // s
ASCII_53=KEY_SEMICOLON + SHIFT_MASK; // S
ASCII_64=KEY_H; // d
ASCII_44=KEY_H + SHIFT_MASK; // D
ASCII_66=KEY_Y; // f
ASCII_46=KEY_Y + SHIFT_MASK; // F
ASCII_67=KEY_U; // g
ASCII_47=KEY_U + SHIFT_MASK; // G
ASCII_68=KEY_J; // h
ASCII_48=KEY_J + SHIFT_MASK; // H
ASCII_6A=KEY_C; // j
ASCII_4A=KEY_C + SHIFT_MASK; // J
ASCII_6B=KEY_V; // k
ASCII_4B=KEY_V + SHIFT_MASK; // K
ASCII_6C=KEY_P; // l
ASCII_4C=KEY_P + SHIFT_MASK; // L
ASCII_3B=KEY_Z; // ;
ASCII_3A=KEY_Z + SHIFT_MASK; // :
ASCII_27=KEY_Q; // '
ASCII_22=KEY_Q + SHIFT_MASK; // "
ASCII_7A=KEY_SLASH; // z
ASCII_5A=KEY_SLASH + SHIFT_MASK; // Z
ASCII_78=KEY_B; // x
ASCII_58=KEY_B + SHIFT_MASK; // X
ASCII_63=KEY_I; // c
ASCII_43=KEY_I + SHIFT_MASK; // C
ASCII_76=KEY_PERIOD; // v
ASCII_56=KEY_PERIOD + SHIFT_MASK; // V
ASCII_62=KEY_N; // b
ASCII_42=KEY_N + SHIFT_MASK; // B
ASCII_6E=KEY_L; // n
ASCII_4E=KEY_L + SHIFT_MASK; // N
ASCII_2C=KEY_W; // ,
ASCII_3C=KEY_W + SHIFT_MASK; // <
ASCII_2E=KEY_E; // .
ASCII_3E=KEY_E + SHIFT_MASK; // >
ASCII_2F=KEY_LEFT_BRACE; // /
ASCII_3F=KEY_LEFT_BRACE + SHIFT_MASK; // ?
}
// LAYOUT_USA_ENGLISH
}
else if (KeyboardLayout[0] == LAYOUT_US_INTERNATIONAL) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
//KEYCODE_TYPE=uint16_t
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_6 + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_QUOTE;
DEADKEY_GRAVE_ACCENT=KEY_TILDE;
DEADKEY_TILDE=KEY_TILDE + SHIFT_MASK;
DEADKEY_DIAERESIS=KEY_QUOTE + SHIFT_MASK;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=DIAERESIS_BITS + KEY_SPACE;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=ACUTE_ACCENT_BITS + KEY_SPACE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_SLASH;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >
ASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE;// 91 [
ASCII_5C=KEY_BACKSLASH;// 92
ASCII_5D=KEY_RIGHT_BRACE;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {
ASCII_7C=KEY_BACKSLASH + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=KEY_C + ALTGR_MASK + SHIFT_MASK;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_4 + ALTGR_MASK;// 164 ¤ Currency or Euro Sign
ISO_8859_1_A5=KEY_MINUS + ALTGR_MASK;// 165 ¥ YEN SIGN
ISO_8859_1_A6=KEY_BACKSLASH + ALTGR_MASK + SHIFT_MASK;// 166 ¦ BROKEN BAR;??
ISO_8859_1_A7=KEY_S + ALTGR_MASK + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 168 ¨ DIAERESIS
ISO_8859_1_A9=KEY_C + ALTGR_MASK;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_LEFT_BRACE + ALTGR_MASK;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_BACKSLASH + ALTGR_MASK;// 172 ¬ NOT SIGN;??
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_SEMICOLON + ALTGR_MASK + SHIFT_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_3 + ALTGR_MASK;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=KEY_QUOTE + ALTGR_MASK;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=KEY_SEMICOLON + ALTGR_MASK;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=KEY_1 + ALTGR_MASK + SHIFT_MASK;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_RIGHT_BRACE + ALTGR_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=KEY_6 + ALTGR_MASK;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_7 + ALTGR_MASK;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=KEY_8 + ALTGR_MASK;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_SLASH + ALTGR_MASK;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=KEY_Q + ALTGR_MASK + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=KEY_W + ALTGR_MASK + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=KEY_Z + ALTGR_MASK + SHIFT_MASK;// 198 Æ AE
ISO_8859_1_C7=KEY_COMMA + ALTGR_MASK + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð ETH
ISO_8859_1_D1=KEY_N + ALTGR_MASK + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=KEY_P + ALTGR_MASK + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=KEY_EQUAL + ALTGR_MASK;// 215 × MULTIPLICATION
ISO_8859_1_D8=KEY_L + ALTGR_MASK + SHIFT_MASK;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=KEY_Y + ALTGR_MASK + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=KEY_W + ALTGR_MASK;// 229 å a RING ABOVE
ISO_8859_1_E6=KEY_Z + ALTGR_MASK;// 230 æ ae
ISO_8859_1_E7=KEY_COMMA + ALTGR_MASK;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð ETH
ISO_8859_1_F1=KEY_N + ALTGR_MASK;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O ;// 245 õ o TILDE
ISO_8859_1_F6=KEY_P + ALTGR_MASK;// 246 ö o DIAERESIS
ISO_8859_1_F7=KEY_EQUAL + ALTGR_MASK + SHIFT_MASK;// 247 ÷ DIVISION
ISO_8859_1_F8=KEY_L + ALTGR_MASK;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=KEY_Y + ALTGR_MASK;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_5 + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_US_INTERNATIONAL
}
else if (KeyboardLayout[0] == LAYOUT_GERMAN) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0300;
ACUTE_ACCENT_BITS=0x0400;
GRAVE_ACCENT_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_TILDE;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_BACKSLASH;// 35 #=??
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_Q + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Z + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_MINUS + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Z;// 121 y
ASCII_7A=KEY_Y;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=KEY_RIGHT_BRACE + ALTGR_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent Sign
ISO_8859_1_A3=0;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_E + ALTGR_MASK;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_3 + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_TILDE + SHIFT_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_3 + ALTGR_MASK;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=0;// 195 Ã A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=0;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=0;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=0;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=0;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=0;// 213 Õ O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=KEY_LEFT_BRACE + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=KEY_MINUS;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=0;// 227 ã a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä a DIAERESIS
ISO_8859_1_E5=0;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=0;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=0;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=0;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=0;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=0;// 245 õ o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=0;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_GERMAN
}
else if (KeyboardLayout[0] == LAYOUT_GERMAN_MAC) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
ACUTE_ACCENT_BITS=0x0100;
GRAVE_ACCENT_BITS=0x0200;
CIRCUMFLEX_BITS=0x0300;
DIAERESIS_BITS=0x0400;
TILDE_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_CIRCUMFLEX=KEY_6 + SHIFT_MASK + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_U + ALTGR_MASK;
DEADKEY_TILDE=KEY_N + ALTGR_MASK;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_BACKSLASH;// 35 #=??
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_TILDE;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_TILDE + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_L + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Z + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_5 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_7 + ALTGR_MASK + SHIFT_MASK;// 92
ASCII_5D=KEY_6 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Z;// 121 y
ASCII_7A=KEY_Y;// 122 z
ASCII_7B=KEY_8 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_7 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_9 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=KEY_4 + ALTGR_MASK;// 162 ¢ Cent Sign
ISO_8859_1_A3=KEY_4 + SHIFT_MASK + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_E + ALTGR_MASK;// 164 ¤ Currency Sign
ISO_8859_1_A5=KEY_Z + ALTGR_MASK;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_3 + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=KEY_G + ALTGR_MASK;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=KEY_H + ALTGR_MASK;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_Q + ALTGR_MASK;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=KEY_0 + SHIFT_MASK + ALTGR_MASK;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_LEFT_BRACE + ALTGR_MASK + SHIFT_MASK; // 176 ° DEGREE SIGN
ISO_8859_1_B1=KEY_RIGHT_BRACE + ALTGR_MASK;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=KEY_3 + ALTGR_MASK;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=KEY_9 + SHIFT_MASK + ALTGR_MASK;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_J + ALTGR_MASK;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_Q + SHIFT_MASK + ALTGR_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_MINUS + ALTGR_MASK;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=KEY_A + ALTGR_MASK + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 198 Æ AE
ISO_8859_1_C7=KEY_C + ALTGR_MASK + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=KEY_O + ALTGR_MASK + SHIFT_MASK;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=KEY_LEFT_BRACE + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=KEY_MINUS;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä a DIAERESIS
ISO_8859_1_E5=KEY_A + ALTGR_MASK;// 229 å a RING ABOVE
ISO_8859_1_E6=KEY_QUOTE + ALTGR_MASK;// 230 æ ae
ISO_8859_1_E7=KEY_C + ALTGR_MASK;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=KEY_O + ALTGR_MASK;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Z;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_GERMAN_MAC
}
else if (KeyboardLayout[0] == LAYOUT_CANADIAN_FRENCH) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
DIAERESIS_BITS=0x0400;
CEDILLA_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;
DEADKEY_ACUTE_ACCENT=KEY_SLASH + ALTGR_MASK;
DEADKEY_GRAVE_ACCENT=KEY_QUOTE;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_CEDILLA=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_TILDE + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_COMMA + SHIFT_MASK;// 39 '
//ASCII_27=ACUTE_ACCENT_BITS + KEY_SPACE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_3 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_BACKSLASH;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_BACKSLASH + SHIFT_MASK;// 62 >
ASCII_3F=KEY_6 + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + ALTGR_MASK;// 92
ASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |
ASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }
ASCII_7E=KEY_SEMICOLON + ALTGR_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=KEY_4 + ALTGR_MASK;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_5 + ALTGR_MASK;// 164 ¤ Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=KEY_7 + ALTGR_MASK;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_O + ALTGR_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_NON_US_100;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬ NOT SIGN
ISO_8859_1_AD=KEY_PERIOD + ALTGR_MASK;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=KEY_COMMA + ALTGR_MASK;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_NON_US_100 + ALTGR_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=KEY_1 + ALTGR_MASK;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_8 + ALTGR_MASK;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_9 + ALTGR_MASK;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=KEY_P + ALTGR_MASK;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_NON_US_100 + SHIFT_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=KEY_0 + ALTGR_MASK;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_MINUS + ALTGR_MASK;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=KEY_EQUAL + ALTGR_MASK;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=0;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=0;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=CEDILLA_BITS + KEY_C + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=KEY_SLASH + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=0;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=0;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=0;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=0;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=0;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=CEDILLA_BITS + KEY_C;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=KEY_SLASH;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=0;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=0;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
// LAYOUT_CANADIAN_FRENCH
}
else if (KeyboardLayout[0] == LAYOUT_CANADIAN_MULTILINGUAL) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
RCTRL_MASK=0x0800;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
DIAERESIS_BITS=0x0200;
ACUTE_ACCENT_BITS=0x0300;
CEDILLA_BITS=0x0400;
GRAVE_ACCENT_BITS=0x0500;
TILDE_BITS=0x0600;
RING_ABOVE_BITS=0x0700;
KEYCODE_MASK=0x0FFF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;
DEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_SEMICOLON + RCTRL_MASK;
DEADKEY_CEDILLA=KEY_EQUAL + RCTRL_MASK;
DEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE + ALTGR_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_RING_ABOVE=KEY_LEFT_BRACE + SHIFT_MASK + RCTRL_MASK;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_PERIOD + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_COMMA + SHIFT_MASK;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_TILDE;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + ALTGR_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_PERIOD + ALTGR_MASK;// 62 >
ASCII_3F=KEY_6 + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_9 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + SHIFT_MASK;// 92
ASCII_5D=KEY_0 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE + ALTGR_MASK;// 124 |
ASCII_7D=KEY_8 + ALTGR_MASK;// 125 }
ASCII_7E=KEY_RIGHT_BRACE + RCTRL_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE + ALTGR_MASK;// 160 Nonbreakng Space
ISO_8859_1_A1=KEY_1 + SHIFT_MASK + RCTRL_MASK;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=KEY_C + RCTRL_MASK;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + SHIFT_MASK + RCTRL_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK + RCTRL_MASK;// 164 ¤ Currency or Euro Sign
ISO_8859_1_A5=KEY_Y + SHIFT_MASK + RCTRL_MASK;// 165 ¥ YEN SIGN
ISO_8859_1_A6=KEY_NON_US_100 + SHIFT_MASK + RCTRL_MASK; // 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_S + SHIFT_MASK + RCTRL_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=KEY_C + SHIFT_MASK + RCTRL_MASK;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=KEY_F + SHIFT_MASK + RCTRL_MASK;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_Z + ALTGR_MASK;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_EQUAL + ALTGR_MASK;// 172 ¬ NOT SIGN
ISO_8859_1_AD=KEY_TILDE + SHIFT_MASK + RCTRL_MASK;// 173 SOFT HYPHEN
ISO_8859_1_AE=KEY_R + SHIFT_MASK + RCTRL_MASK;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0; // special dead key - no implemented=// 175 ¯ MACRON
ISO_8859_1_B0=KEY_SEMICOLON + ALTGR_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=KEY_9 + SHIFT_MASK + RCTRL_MASK;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_2 + RCTRL_MASK;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_3 + RCTRL_MASK;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + RCTRL_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=KEY_R + RCTRL_MASK;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=CEDILLA_BITS + KEY_SPACE;// 184 ¸ CEDILLA
ISO_8859_1_B9=KEY_1 + RCTRL_MASK;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_M + SHIFT_MASK + RCTRL_MASK;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_X + ALTGR_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=KEY_4 + RCTRL_MASK;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_5 + RCTRL_MASK;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=KEY_6 + RCTRL_MASK;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_MINUS + SHIFT_MASK + RCTRL_MASK;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=KEY_BACKSLASH + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=RING_ABOVE_BITS + KEY_A + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=KEY_A + SHIFT_MASK + RCTRL_MASK;// 198 Æ AE
ISO_8859_1_C7=KEY_RIGHT_BRACE + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_C8=KEY_QUOTE + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=KEY_SLASH + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=KEY_D + SHIFT_MASK + RCTRL_MASK;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=KEY_COMMA + SHIFT_MASK + RCTRL_MASK;// 215 × MULTIPLICATION
ISO_8859_1_D8=KEY_O + SHIFT_MASK + RCTRL_MASK;// 216 Ø O STROKE
ISO_8859_1_D9=KEY_NON_US_100 + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=KEY_P + RCTRL_MASK + SHIFT_MASK;// 222 Þ THORN
ISO_8859_1_DF=KEY_S + RCTRL_MASK;// 223 ß SHARP S
ISO_8859_1_E0=KEY_BACKSLASH;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=RING_ABOVE_BITS + KEY_A;// 229 å a RING ABOVE
ISO_8859_1_E6=KEY_A + RCTRL_MASK;// 230 æ ae
ISO_8859_1_E7=KEY_RIGHT_BRACE;// 231 ç c CEDILLA
ISO_8859_1_E8=KEY_QUOTE;// 232 è e GRAVE
ISO_8859_1_E9=KEY_SLASH;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=KEY_D + RCTRL_MASK;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=KEY_PERIOD + SHIFT_MASK + RCTRL_MASK;// 247 ÷ DIVISION
ISO_8859_1_F8=KEY_O + RCTRL_MASK;// 248 ø o STROKE
ISO_8859_1_F9=KEY_NON_US_100;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=KEY_P + RCTRL_MASK;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
// LAYOUT_CANADIAN_MULTILINGUAL
}
else if (KeyboardLayout[0] == LAYOUT_UNITED_KINGDOM) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
KEYCODE_MASK=0x00FF;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_BACKSLASH;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_QUOTE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_SLASH;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >
ASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?
ASCII_40=KEY_QUOTE + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE;// 91 [
ASCII_5C=KEY_NON_US_100;// 92
ASCII_5D=KEY_RIGHT_BRACE;// 93 ]
ASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=KEY_TILDE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }
ASCII_7E=KEY_BACKSLASH + SHIFT_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=0;// 164 ¤ Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=KEY_TILDE + ALTGR_MASK;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=0;// 167 § SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_TILDE + SHIFT_MASK;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=0;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=0;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=0;// 192 À A GRAVE
ISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=0;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=0;// 195 Ã A TILDE
ISO_8859_1_C4=0;// 196 Ä A DIAERESIS
ISO_8859_1_C5=0;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=0;// 200 È E GRAVE
ISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=0;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=0;// 203 Ë E DIAERESIS
ISO_8859_1_CC=0;// 204 Ì I GRAVE
ISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=0;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=0;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=0;// 209 Ñ N TILDE
ISO_8859_1_D2=0;// 210 Ò O GRAVE
ISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=0;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=0;// 213 Õ O TILDE
ISO_8859_1_D6=0;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=0;// 217 Ù U GRAVE
ISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=0;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=0;// 220 Ü U DIAERESIS
ISO_8859_1_DD=0;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=0;// 223 ß SHARP S
ISO_8859_1_E0=0;// 224 à a GRAVE
ISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á a ACUTE
ISO_8859_1_E2=0;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=0;// 227 ã a TILDE
ISO_8859_1_E4=0;// 228 ä a DIAERESIS
ISO_8859_1_E5=0;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=0;// 231 ç c CEDILLA
ISO_8859_1_E8=0;// 232 è e GRAVE
ISO_8859_1_E9=KEY_E + ALTGR_MASK;// 233 é e ACUTE
ISO_8859_1_EA=0;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=0;// 235 ë e DIAERESIS
ISO_8859_1_EC=0;// 236 ì i GRAVE
ISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í i ACUTE
ISO_8859_1_EE=0;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=0;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=0;// 241 ñ n TILDE
ISO_8859_1_F2=0;// 242 ò o GRAVE
ISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó o ACUTE
ISO_8859_1_F4=0;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=0;// 245 õ o TILDE
ISO_8859_1_F6=0;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=0;// 249 ù u GRAVE
ISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú u ACUTE
ISO_8859_1_FB=0;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=0;// 252 ü u DIAERESIS
ISO_8859_1_FD=0;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=0;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_4 + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_4 + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_UNITED_KINGDOM
}
else if (KeyboardLayout[0] == LAYOUT_FINNISH) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_MINUS + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE + ALTGR_MASK;// 160 Nonbreakng Space
ISO_8859_1_A1=KEY_1 + SHIFT_MASK + ALTGR_MASK;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤ Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_TILDE;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=KEY_SLASH + ALTGR_MASK;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_0 + ALTGR_MASK + SHIFT_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=KEY_X + ALTGR_MASK + SHIFT_MASK;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_3 + ALTGR_MASK + SHIFT_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE + SHIFT_MASK;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_MINUS + ALTGR_MASK + SHIFT_MASK;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=KEY_X + ALTGR_MASK;// 215 × MULTIPLICATION
ISO_8859_1_D8=KEY_SEMICOLON + ALTGR_MASK + SHIFT_MASK;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å a RING ABOVE
ISO_8859_1_E6=KEY_QUOTE + ALTGR_MASK;// 230 æ ae
ISO_8859_1_E7=0;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=KEY_SEMICOLON + ALTGR_MASK;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// TODO: Finnish Multilingual layout can type many more glyphs
// but we currently don't have tables tables to store them...
// LAYOUT_FINNISH
}
else if (KeyboardLayout[0] == LAYOUT_FRENCH) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
GRAVE_ACCENT_BITS=0x0200;
DIAERESIS_BITS=0x0300;
TILDE_BITS=0x0400;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;
DEADKEY_GRAVE_ACCENT=KEY_7 + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;
DEADKEY_TILDE=KEY_2 + ALTGR_MASK;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_SLASH;// 33 !
ASCII_22=KEY_3;// 34 "
ASCII_23=KEY_3 + ALTGR_MASK;// 35 #
ASCII_24=KEY_RIGHT_BRACE;// 36 $
ASCII_25=KEY_QUOTE + SHIFT_MASK;// 37 %
ASCII_26=KEY_1;// 38 &
ASCII_27=KEY_4;// 39 '
ASCII_28=KEY_5;// 40 (
ASCII_29=KEY_MINUS;// 41 )
ASCII_2A=KEY_BACKSLASH;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_M;// 44 ,
ASCII_2D=KEY_6;// 45 -
ASCII_2E=KEY_COMMA + SHIFT_MASK;// 46 .
ASCII_2F=KEY_PERIOD + SHIFT_MASK;// 47 /
ASCII_30=KEY_0 + SHIFT_MASK;// 48 0
ASCII_31=KEY_1 + SHIFT_MASK;// 49 1
ASCII_32=KEY_2 + SHIFT_MASK;// 50 2
ASCII_33=KEY_3 + SHIFT_MASK;// 51 3
ASCII_34=KEY_4 + SHIFT_MASK;// 52 4
ASCII_35=KEY_5 + SHIFT_MASK;// 53 5
ASCII_36=KEY_6 + SHIFT_MASK;// 54 6
ASCII_37=KEY_7 + SHIFT_MASK;// 55 7
ASCII_38=KEY_8 + SHIFT_MASK;// 55 8
ASCII_39=KEY_9 + SHIFT_MASK;// 57 9
ASCII_3A=KEY_PERIOD;// 58 :
ASCII_3B=KEY_COMMA;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_M + SHIFT_MASK;// 63 ?
ASCII_40=KEY_0 + ALTGR_MASK;// 64 @
ASCII_41=KEY_Q + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_SEMICOLON + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_A + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_Z + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_W + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_5 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_8 + ALTGR_MASK;// 92
ASCII_5D=KEY_MINUS + ALTGR_MASK;// 93 ]
ASCII_5E=KEY_9 + ALTGR_MASK;// 94 ^
ASCII_5F=KEY_8;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_Q;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_SEMICOLON;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_A;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_Z;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_W;// 122 z
ASCII_7B=KEY_4 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_6 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_EQUAL + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_RIGHT_BRACE + SHIFT_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_RIGHT_BRACE + ALTGR_MASK;// 164 ¤ Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_SLASH + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_MINUS + SHIFT_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_TILDE;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_BACKSLASH + SHIFT_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_Q + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=0;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_Q + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_Q + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_Q + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=0;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=0;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=0;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=0;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=0;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü U DIAERESIS
ISO_8859_1_DD=0;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=0;// 223 ß SHARP S
ISO_8859_1_E0=KEY_0;// 224 à a GRAVE
ISO_8859_1_E1=0;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_Q;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_Q;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_Q;// 228 ä a DIAERESIS
ISO_8859_1_E5=0;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=KEY_9;// 231 ç c CEDILLA
ISO_8859_1_E8=KEY_7;// 232 è e GRAVE
ISO_8859_1_E9=KEY_2;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=0;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=0;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=KEY_SEMICOLON;// 249 ù u GRAVE
ISO_8859_1_FA=0;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=0;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_FRENCH
}
else if (KeyboardLayout[0] == LAYOUT_DANISH || KeyboardLayout[0] == LAYOUT_DANISH_MAC) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_NON_US_100 + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_EQUAL + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_4;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=0;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=KEY_SEMICOLON + SHIFT_MASK;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=KEY_QUOTE + SHIFT_MASK;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å a RING ABOVE
ISO_8859_1_E6=KEY_SEMICOLON;// 230 æ ae
ISO_8859_1_E7=0;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=KEY_QUOTE;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
if (KeyboardLayout[0] == LAYOUT_DANISH_MAC) {
ASCII_24=KEY_3 + SHIFT_MASK + ALTGR_MASK;// 36 $
ASCII_3C=KEY_TILDE;// 60 <
ASCII_3E=KEY_TILDE + SHIFT_MASK;// 62 >
ASCII_40=KEY_BACKSLASH + ALTGR_MASK;// 64 @
ASCII_5C=KEY_7 + ALTGR_MASK + SHIFT_MASK;// 92 \
ASCII_7B=KEY_8 + ALTGR_MASK + SHIFT_MASK;// 123 {
ASCII_7D=KEY_9 + ALTGR_MASK + SHIFT_MASK;// 125 }
ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_4 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A5=KEY_Y + ALTGR_MASK;// 165 ¥ YEN SIGN
ISO_8859_1_A7=0;// 167 § SECTION SIGN??
ISO_8859_1_A9=KEY_G + ALTGR_MASK;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=KEY_A + ALTGR_MASK;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_H + ALTGR_MASK;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_L + ALTGR_MASK;// 172 ¬ NOT SIGN
ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=KEY_0 + SHIFT_MASK + ALTGR_MASK;// 175 ¯ MACRON
ISO_8859_1_B0=KEY_Q + ALTGR_MASK;// 176 ° DEGREE SIGN
ISO_8859_1_B1=KEY_MINUS + ALTGR_MASK;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B6=KEY_7 + ALTGR_MASK;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=KEY_PERIOD + ALTGR_MASK;// 183 · MIDDLE DOT
ISO_8859_1_BA=KEY_BACKSLASH + SHIFT_MASK + ALTGR_MASK;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_H + SHIFT_MASK + ALTGR_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BF=KEY_MINUS + SHIFT_MASK + ALTGR_MASK;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C7=KEY_C + ALTGR_MASK + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_E7=KEY_C + ALTGR_MASK;// 231 ç c CEDILLA
ISO_8859_1_FE=0;// 254 þ THORN
}
// LAYOUT_DANISH
}
else if (KeyboardLayout[0] == LAYOUT_NORWEGIAN) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL + ALTGR_MASK;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_EQUAL;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_4;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=0;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=KEY_QUOTE + SHIFT_MASK;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=KEY_SEMICOLON + SHIFT_MASK;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å a RING ABOVE
ISO_8859_1_E6=KEY_QUOTE;// 230 æ ae
ISO_8859_1_E7=0;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=KEY_SEMICOLON;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_NORWEGIAN
}
else if (KeyboardLayout[0] == LAYOUT_SWEDISH) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_MINUS + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_TILDE;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_4;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=0;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE + SHIFT_MASK;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=0;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=0;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_SWEDISH
}
else if (KeyboardLayout[0] == LAYOUT_SPANISH) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_QUOTE;
DEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE;
DEADKEY_TILDE=KEY_4 + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_QUOTE + SHIFT_MASK;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + ALTGR_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_MINUS;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + ALTGR_MASK;// 92
ASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {
ASCII_7C=KEY_1 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=KEY_EQUAL;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=0;// 163 £ Pound Sign
ISO_8859_1_A4=0;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=0;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=KEY_TILDE + SHIFT_MASK;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=0;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=0;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=KEY_3 + SHIFT_MASK;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_TILDE;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_EQUAL;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=0;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=KEY_BACKSLASH + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=KEY_SEMICOLON + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=0;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=0;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=KEY_BACKSLASH;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=KEY_SEMICOLON;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_5 + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_SPANISH
}
else if (KeyboardLayout[0] == LAYOUT_PORTUGUESE) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_BACKSLASH;
DEADKEY_ACUTE_ACCENT=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_GRAVE_ACCENT=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_TILDE=KEY_BACKSLASH;
DEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + ALTGR_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_MINUS;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_LEFT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_LEFT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=0;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_4 + ALTGR_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_AA=KEY_QUOTE + SHIFT_MASK;// 170 ª FEMININE ORDINAL
ISO_8859_1_AB=KEY_EQUAL;// 171 « LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬ NOT SIGN
ISO_8859_1_AD=0;// 173 SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ® REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯ MACRON
ISO_8859_1_B0=0;// 176 ° DEGREE SIGN
ISO_8859_1_B1=0;// 177 ± PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³ SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´ ACUTE ACCENT
ISO_8859_1_B5=0;// 181 µ MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶ PILCROW SIGN
ISO_8859_1_B7=0;// 183 · MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸ CEDILLA
ISO_8859_1_B9=0;// 185 ¹ SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_QUOTE;// 186 º MASCULINE ORDINAL
ISO_8859_1_BB=KEY_EQUAL + SHIFT_MASK;// 187 » RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼ FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½ FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾ FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿ INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä A DIAERESIS
ISO_8859_1_C5=0;// 197 Å A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ AE
ISO_8859_1_C7=KEY_SEMICOLON + SHIFT_MASK;// 199 Ç C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö O DIAERESIS
ISO_8859_1_D7=0;// 215 × MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý Y ACUTE
ISO_8859_1_DE=0;// 222 Þ THORN
ISO_8859_1_DF=0;// 223 ß SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä a DIAERESIS
ISO_8859_1_E5=0;// 229 å a RING ABOVE
ISO_8859_1_E6=0;// 230 æ ae
ISO_8859_1_E7=KEY_SEMICOLON;// 231 ç c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï i DIAERESIS
ISO_8859_1_F0=0;// 240 ð ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷ DIVISION
ISO_8859_1_F8=0;// 248 ø o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý y ACUTE
ISO_8859_1_FE=0;// 254 þ THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;// € Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC € Euro Sign
// LAYOUT_PORTUGUESE
}
else if (KeyboardLayout[0] == LAYOUT_ITALIAN) {
SHIFT_MASK=0x40;
ALTGR_MASK=0x80;
KEYCODE_MASK=0x00FF;
KEY_NON_US_100=63;
ASCII_20=KEY_SPACE;// 32
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_QUOTE + ALTGR_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_MINUS;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_SEMICOLON + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE;// 92
ASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]
ASCII_5E=KEY_EQUAL + SHIFT_MASK;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=0;// 96 ` (how to type this on Italian?)
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK + ALTGR_MASK; // 123 {
ASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK + ALTGR_MASK; // 125 }
ASCII_7E=0;// 126 ~ (how to type this on Italian?)
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160 Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡ Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢ Cent Sign
ISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £ Pound Sign
ISO_8859_1_A4=0;// 164 ¤ Currency Sign
ISO_8859_1_A5=0;// 165 ¥ YEN SIGN
ISO_8859_1_A6=0;// 166 ¦ BROKEN BAR
ISO_8859_1_A7=KEY_BACKSLASH + SHIFT_MASK;// 167 § SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨ DIAERESIS
ISO_8859_1_A9=0;// 169 © COPYRIGHT SIGN
ISO_8859_1_A
gitextract_wrctxzzj/ ├── .gitignore ├── OnlyKey/ │ └── OnlyKey.ino ├── README.md ├── keylayouts.c ├── keylayouts.h ├── usb_desc.c ├── usb_desc.h ├── usb_dev.c ├── usb_dev.h ├── usb_keyboard.c ├── usb_rawhid.c └── usb_rawhid.h
SYMBOL INDEX (48 symbols across 8 files)
FILE: keylayouts.c
function update_keyboard_layout (line 179) | void update_keyboard_layout() {
FILE: usb_desc.c
type usb_string_descriptor_struct (line 1002) | struct usb_string_descriptor_struct
type usb_string_descriptor_struct (line 1004) | struct usb_string_descriptor_struct
type usb_string_descriptor_struct (line 1006) | struct usb_string_descriptor_struct
type usb_string_descriptor_struct (line 1009) | struct usb_string_descriptor_struct
type usb_string_descriptor_struct (line 1015) | struct usb_string_descriptor_struct
type usb_string_descriptor_struct (line 1020) | struct usb_string_descriptor_struct
type usb_string_descriptor_struct (line 1025) | struct usb_string_descriptor_struct
function usb_init_serialnumber (line 1031) | void usb_init_serialnumber(void)
FILE: usb_desc.h
type usb_descriptor_list_t (line 458) | typedef struct {
FILE: usb_dev.c
type bdt_t (line 116) | typedef struct {
function endpoint0_stall (line 213) | static void endpoint0_stall(void)
function endpoint0_receive (line 218) | static uint8_t endpoint0_receive(uint8_t *data) {
function endpoint0_transmit (line 237) | static void endpoint0_transmit(const void *data, uint32_t len)
function endpoint0_ack (line 255) | static void endpoint0_ack(void)
function wipe_usb_buffer (line 264) | void wipe_usb_buffer() {
function usb_setup (line 338) | static void usb_setup(void)
function usb_control (line 671) | static void usb_control(uint32_t stat)
function usb_packet_t (line 826) | usb_packet_t *usb_rx(uint32_t endpoint)
function usb_queue_byte_count (line 846) | static uint32_t usb_queue_byte_count(const usb_packet_t *p)
function usb_tx_byte_count (line 869) | uint32_t usb_tx_byte_count(uint32_t endpoint)
function usb_tx_packet_count (line 876) | uint32_t usb_tx_packet_count(uint32_t endpoint)
function usb_rx_memory (line 898) | void usb_rx_memory(usb_packet_t *packet)
function usb_tx (line 940) | void usb_tx(uint32_t endpoint, usb_packet_t *packet)
function _reboot_Teensyduino_ (line 986) | void _reboot_Teensyduino_(void)
function usb_isr (line 994) | void usb_isr(void)
function usb_init (line 1217) | void usb_init(void)
function usb_init (line 1275) | void usb_init(void)
FILE: usb_dev.h
function usb_rx_byte_count (line 147) | static inline uint32_t usb_rx_byte_count(uint32_t endpoint)
FILE: usb_keyboard.c
function usb_keyboard_write (line 213) | void usb_keyboard_write(uint8_t c)
function KEYCODE_TYPE (line 251) | static KEYCODE_TYPE unicode_to_keycode(uint16_t cpoint)
function KEYCODE_TYPE (line 288) | static KEYCODE_TYPE deadkey_to_keycode(KEYCODE_TYPE keycode)
function usb_keyboard_write_unicode (line 311) | void usb_keyboard_write_unicode(uint16_t cpoint)
function write_key (line 328) | static void write_key(KEYCODE_TYPE keycode)
function keycode_to_modifier (line 351) | static uint8_t keycode_to_modifier(KEYCODE_TYPE keycode)
function keycode_to_key (line 364) | static uint8_t keycode_to_key(KEYCODE_TYPE keycode)
function usb_keyboard_press_keycode (line 380) | void usb_keyboard_press_keycode(uint16_t n)
function usb_keyboard_release_keycode (line 432) | void usb_keyboard_release_keycode(uint16_t n)
function usb_keyboard_press_key (line 466) | static void usb_keyboard_press_key(uint8_t key, uint8_t modifier)
function usb_keyboard_release_key (line 499) | static void usb_keyboard_release_key(uint8_t key, uint8_t modifier)
function usb_keyboard_release_all (line 526) | void usb_keyboard_release_all(void)
function usb_keyboard_press (line 542) | int usb_keyboard_press(uint8_t key, uint8_t modifier)
function usb_keyboard_send (line 586) | int usb_keyboard_send(void)
FILE: usb_rawhid.c
function usb_rawhid_recv (line 117) | int usb_rawhid_recv(void *buffer, uint32_t timeout)
function usb_rawhid_available (line 143) | int usb_rawhid_available(void)
function usb_rawhid_send (line 155) | int usb_rawhid_send(const void *buffer, uint32_t timeout)
function usb_rawhid_send2 (line 175) | int usb_rawhid_send2(const void *buffer, uint32_t timeout)
FILE: usb_rawhid.h
function class (line 132) | class usb_rawhid_class
Condensed preview — 12 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (506K chars).
[
{
"path": ".gitignore",
"chars": 681,
"preview": "# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$"
},
{
"path": "OnlyKey/OnlyKey.ino",
"chars": 50303,
"preview": "/* \n * Copyright (c) 2015-2022, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Re"
},
{
"path": "README.md",
"chars": 2530,
"preview": "# OnlyKey Firmware\n\nThis is the official firmware for **OnlyKey**\n\nOnlyKey can be purchased here: [OnlyKey order](https:"
},
{
"path": "keylayouts.c",
"chars": 262019,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "keylayouts.h",
"chars": 13676,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_desc.c",
"chars": 59851,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_desc.h",
"chars": 19825,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_dev.c",
"chars": 35767,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_dev.h",
"chars": 7838,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_keyboard.c",
"chars": 20230,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_rawhid.c",
"chars": 7611,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
},
{
"path": "usb_rawhid.h",
"chars": 6427,
"preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
}
]
About this extraction
This page contains the full source code of the trustcrypto/OnlyKey-Firmware GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 12 files (475.3 KB), approximately 171.2k tokens, and a symbol index with 48 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.