1ee3138f1Smrg/* 2ee3138f1Smrg * Copyright (c) 2002-2003 by The XFree86 Project, Inc. 3ee3138f1Smrg * 4ee3138f1Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5ee3138f1Smrg * copy of this software and associated documentation files (the "Software"), 6ee3138f1Smrg * to deal in the Software without restriction, including without limitation 7ee3138f1Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8ee3138f1Smrg * and/or sell copies of the Software, and to permit persons to whom the 9ee3138f1Smrg * Software is furnished to do so, subject to the following conditions: 10ee3138f1Smrg * 11ee3138f1Smrg * The above copyright notice and this permission notice shall be included in 12ee3138f1Smrg * all copies or substantial portions of the Software. 13ee3138f1Smrg * 14ee3138f1Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15ee3138f1Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16ee3138f1Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17ee3138f1Smrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18ee3138f1Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19ee3138f1Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20ee3138f1Smrg * OTHER DEALINGS IN THE SOFTWARE. 21ee3138f1Smrg * 22ee3138f1Smrg * Except as contained in this notice, the name of the copyright holder(s) 23ee3138f1Smrg * and author(s) shall not be used in advertising or otherwise to promote 24ee3138f1Smrg * the sale, use or other dealings in this Software without prior written 25ee3138f1Smrg * authorization from the copyright holder(s) and author(s). 26ee3138f1Smrg */ 27ee3138f1Smrg 28ee3138f1Smrg#ifdef HAVE_CONFIG_H 29ee3138f1Smrg#include "config.h" 30ee3138f1Smrg#endif 31ee3138f1Smrg 32b425557eSmrg#include <xorg-server.h> 33ee3138f1Smrg#include "xf86.h" 34ee3138f1Smrg#include "xf86Xinput.h" 35ee3138f1Smrg#include "xf86OSKbd.h" 36ee3138f1Smrg#include "atKeynames.h" 37ee3138f1Smrg 38ee3138f1SmrgBool 39ee3138f1SmrgATScancode(InputInfoPtr pInfo, int *scanCode) 40ee3138f1Smrg{ 41ee3138f1Smrg KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; 42ee3138f1Smrg 43ee3138f1Smrg switch (pKbd->scanPrefix) { 44ee3138f1Smrg case 0: 45ee3138f1Smrg switch (*scanCode) { 46ee3138f1Smrg case KEY_Prefix0: 47ee3138f1Smrg case KEY_Prefix1: 48ee3138f1Smrg pKbd->scanPrefix = *scanCode; /* special prefixes */ 49ee3138f1Smrg return TRUE; 50ee3138f1Smrg } 513e72ca8cSmrg switch (*scanCode) { 52ee3138f1Smrg case 0x59: *scanCode = KEY_0x59; break; 53ee3138f1Smrg case 0x5a: *scanCode = KEY_0x5A; break; 54ee3138f1Smrg case 0x5b: *scanCode = KEY_0x5B; break; 55ee3138f1Smrg case 0x5c: *scanCode = KEY_KP_Equal; break; /* Keypad Equal */ 56ee3138f1Smrg case 0x5d: *scanCode = KEY_0x5D; break; 57ee3138f1Smrg case 0x5e: *scanCode = KEY_0x5E; break; 58ee3138f1Smrg case 0x5f: *scanCode = KEY_0x5F; break; 59ee3138f1Smrg case 0x62: *scanCode = KEY_0x62; break; 60ee3138f1Smrg case 0x63: *scanCode = KEY_0x63; break; 61ee3138f1Smrg case 0x64: *scanCode = KEY_0x64; break; 62ee3138f1Smrg case 0x65: *scanCode = KEY_0x65; break; 63ee3138f1Smrg case 0x66: *scanCode = KEY_0x66; break; 64ee3138f1Smrg case 0x67: *scanCode = KEY_0x67; break; 65ee3138f1Smrg case 0x68: *scanCode = KEY_0x68; break; 66ee3138f1Smrg case 0x69: *scanCode = KEY_0x69; break; 67ee3138f1Smrg case 0x6a: *scanCode = KEY_0x6A; break; 68ee3138f1Smrg case 0x6b: *scanCode = KEY_0x6B; break; 69ee3138f1Smrg case 0x6c: *scanCode = KEY_0x6C; break; 70ee3138f1Smrg case 0x6d: *scanCode = KEY_0x6D; break; 71ee3138f1Smrg case 0x6e: *scanCode = KEY_0x6E; break; 72ee3138f1Smrg case 0x6f: *scanCode = KEY_0x6F; break; 73ee3138f1Smrg case 0x70: *scanCode = KEY_0x70; break; 74ee3138f1Smrg case 0x71: *scanCode = KEY_0x71; break; 75ee3138f1Smrg case 0x72: *scanCode = KEY_0x72; break; 76ee3138f1Smrg case 0x73: *scanCode = KEY_0x73; break; 77ee3138f1Smrg case 0x74: *scanCode = KEY_0x74; break; 78ee3138f1Smrg case 0x75: *scanCode = KEY_0x75; break; 79ee3138f1Smrg case 0x76: *scanCode = KEY_0x76; break; 80ee3138f1Smrg } 81ee3138f1Smrg break; 82ee3138f1Smrg case KEY_Prefix0: 83ee3138f1Smrg pKbd->scanPrefix = 0; 84ee3138f1Smrg switch (*scanCode) { 85ee3138f1Smrg case KEY_KP_7: *scanCode = KEY_Home; break; /* curs home */ 86ee3138f1Smrg case KEY_KP_8: *scanCode = KEY_Up; break; /* curs up */ 87ee3138f1Smrg case KEY_KP_9: *scanCode = KEY_PgUp; break; /* curs pgup */ 88ee3138f1Smrg case KEY_KP_4: *scanCode = KEY_Left; break; /* curs left */ 89ee3138f1Smrg case KEY_KP_5: *scanCode = KEY_Begin; break; /* curs begin */ 90ee3138f1Smrg case KEY_KP_6: *scanCode = KEY_Right; break; /* curs right */ 91ee3138f1Smrg case KEY_KP_1: *scanCode = KEY_End; break; /* curs end */ 92ee3138f1Smrg case KEY_KP_2: *scanCode = KEY_Down; break; /* curs down */ 93ee3138f1Smrg case KEY_KP_3: *scanCode = KEY_PgDown; break; /* curs pgdown */ 94ee3138f1Smrg case KEY_KP_0: *scanCode = KEY_Insert; break; /* curs insert */ 95ee3138f1Smrg case KEY_KP_Decimal: *scanCode = KEY_Delete; break; /* curs delete */ 96ee3138f1Smrg case KEY_Enter: *scanCode = KEY_KP_Enter; break; /* keypad enter */ 97ee3138f1Smrg case KEY_LCtrl: *scanCode = KEY_RCtrl; break; /* right ctrl */ 98ee3138f1Smrg case KEY_KP_Multiply: *scanCode = KEY_Print; break; /* print */ 99ee3138f1Smrg case KEY_Slash: *scanCode = KEY_KP_Divide; break; /* keyp divide */ 100ee3138f1Smrg case KEY_Alt: *scanCode = KEY_AltLang; break; /* right alt */ 101ee3138f1Smrg case KEY_ScrollLock: *scanCode = KEY_Break; break; /* curs break */ 102ee3138f1Smrg case 0x5b: *scanCode = KEY_LMeta; break; 103ee3138f1Smrg case 0x5c: *scanCode = KEY_RMeta; break; 104ee3138f1Smrg case 0x5d: *scanCode = KEY_Menu; break; 105ee3138f1Smrg case KEY_F3: *scanCode = KEY_F13; break; 106ee3138f1Smrg case KEY_F4: *scanCode = KEY_F14; break; 107ee3138f1Smrg case KEY_F5: *scanCode = KEY_F15; break; 108ee3138f1Smrg case KEY_F6: *scanCode = KEY_F16; break; 109ee3138f1Smrg case KEY_F7: *scanCode = KEY_F17; break; 110ee3138f1Smrg case KEY_KP_Plus: *scanCode = KEY_KP_DEC; break; 111414bd68fSmrg /* Remap codes 0x09 and 0x11 to avoid overlap with the 112414bd68fSmrg Henkan and Muhenkan keys on Japanese pc106 or pc103 113414bd68fSmrg keyboards */ 114414bd68fSmrg case 0x01: *scanCode = KEY_R_0xF4; break; 115414bd68fSmrg case 0x03: *scanCode = KEY_R_0xF5; break; 116ee3138f1Smrg case 0x2A: 117ee3138f1Smrg case 0x36: 118ee3138f1Smrg return TRUE; 119ee3138f1Smrg default: 1203e72ca8cSmrg LogMessageVerbSigSafe(X_INFO, 4, "Unreported Prefix0 scancode: 0x%x\n", 1213e72ca8cSmrg *scanCode); 122ee3138f1Smrg *scanCode += 0x78; 123ee3138f1Smrg } 124ee3138f1Smrg break; 125ee3138f1Smrg case KEY_Prefix1: 126ee3138f1Smrg pKbd->scanPrefix = (*scanCode == KEY_LCtrl) ? KEY_LCtrl : 0; 127ee3138f1Smrg return TRUE; 128ee3138f1Smrg case KEY_LCtrl: 129ee3138f1Smrg pKbd->scanPrefix = 0; 130ee3138f1Smrg if (*scanCode != KEY_NumLock) 131ee3138f1Smrg return TRUE; 132ee3138f1Smrg *scanCode = KEY_Pause; /* pause */ 133ee3138f1Smrg } 134ee3138f1Smrg return FALSE; 135ee3138f1Smrg} 136