Ticket #2505: pearpc-x11-kbd.diff
File pearpc-x11-kbd.diff, 6.3 KB (added by shadow@…, 20 years ago) |
---|
-
src/system/ui/x11/sysx11.cc
RCS file: /cvsroot/pearpc/pearpc/src/system/ui/x11/sysx11.cc,v retrieving revision 1.17 diff -u -r1.17 sysx11.cc
4 4 * 5 5 * Copyright (C) 1999-2002 Stefan Weyergraf 6 6 * Copyright (C) 1999-2004 Sebastian Biallas (sb@biallas.net) 7 * Portions Copyright (C) 2004 Apple Computer, Inc. 7 8 * 8 9 * This program is free software; you can redistribute it and/or modify 9 10 * it under the terms of the GNU General Public License version 2 as … … 42 43 Display * gX11Display = NULL; 43 44 Window gX11Window; 44 45 45 static uint8 x11_key_to_adb_key[256] = { 46 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 47 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x35,0x12,0x13,0x14,0x15,0x17,0x16, 48 0x1a,0x1c,0x19,0x1d,0x1b,0x18,0x33,0x30,0x0c,0x0d,0x0e,0x0f,0x11,0x10,0x20,0x22, 49 0x1f,0x23,0x21,0x1e,0x24,0x36,0x00,0x01,0x02,0x03,0x05,0x04,0x26,0x28,0x25,0x29, 50 0x27,0x32,0x38,0x2a,0x06,0x07,0x08,0x09,0x0b,0x2d,0x2e,0x2b,0x2f,0x2c,0x38,0x43, 51 0x37,0x31,0xff,0x7a,0x78,0x63,0x76,0x60,0x61,0x62,0x64,0x65,0x6d,0x47,0xff,0x59, 52 0x5b,0x5c,0x4e,0x56,0x57,0x58,0x45,0x53,0x54,0x55,0x52,0x41,0xff,0xff,0x0a,0x67, 53 0x6f,0x73,0x3e,0x74,0x3b,0xff,0x3c,0x77,0x3d,0x79,0x72,0x75,0x4c,0x36,0xff,0xff, 54 0x4b,0x3a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 46 static uint8 x11_latin1_keysym_to_adb_key[256] = { 47 // Latin 1 Upper Byte = 0x00 48 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 55 49 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 56 50 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 51 0x31,0xff,0xff,0xff,0xff,0xff,0xff,0x27,0xff,0xff,0xff,0xff,0x2b,0x1b,0x2f,0x2c, 52 0x1d,0x12,0x13,0x14,0x15,0x17,0x16,0x1a,0x1c,0x19,0xff,0x29,0xff,0x18,0xff,0xff, 57 53 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 54 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x21,0x2a,0x1e,0xff,0xff, 55 0x32,0x00,0x0b,0x08,0x02,0x0e,0x03,0x05,0x04,0x22,0x26,0x28,0x25,0x2e,0x2d,0x1f, 56 0x23,0x0c,0x0f,0x01,0x11,0x20,0x09,0x0d,0x07,0x10,0x06,0xff,0xff,0xff,0xff,0xff, 58 57 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 59 58 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 60 59 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 61 60 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 62 61 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 62 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 63 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 64 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff 65 }; 66 67 static uint8 x11_function_keysym_to_adb_key[256] = { 68 // Upper byte = 0xff 69 // 0 1 2 3 4 5 6 7 8 9 A B C D E F 70 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x33,0x30,0xff,0xff,0xff,0x24,0xff,0xff, 71 0xff,0xff,0xff,0x71,0x6b,0xff,0xff,0xff,0xff,0xff,0xff,0x35,0xff,0xff,0xff,0xff, 72 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 73 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 74 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 75 0x73,0x3b,0x3e,0x3c,0x3d,0x74,0x79,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 76 0xff,0xff,0xff,0x72,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 77 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x47, 78 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4c,0xff,0xff, 79 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 80 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x43,0x45,0xff,0x4e,0x41,0x4b, 81 0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5b,0x5c,0xff,0xff,0xff,0xff,0x7a,0x78, 82 0x63,0x76,0x60,0x61,0x62,0x64,0x65,0x6d,0x67,0x6f,0x69,0xff,0xff,0xff,0xff,0xff, 83 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 84 0xff,0x38,0x38,0x36,0x36,0x39,0xff,0xff,0xff,0x37,0x37,0xff,0xff,0xff,0xff,0xff, 85 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff 63 86 }; 64 87 65 88 static void handleX11Event(const XEvent &event) … … 76 99 gDisplay->displayShow(); 77 100 break; 78 101 case KeyRelease: { 79 char buffer[4];80 102 SystemEvent ev; 81 XComposeStatus compose;82 103 KeySym keysym; 83 104 84 ev.key.keycode = x11_key_to_adb_key[event.xkey.keycode]; 105 sys_lock_mutex(gX11Mutex); 106 keysym = XLookupKeysym((XKeyEvent*)&event, 0); 107 sys_unlock_mutex(gX11Mutex); 108 if ((keysym & 0xff00) == 0xff00) { 109 ev.key.keycode = x11_function_keysym_to_adb_key[keysym & 0x00ff]; 110 } else if ((keysym & 0xff00) == 0x0000) { 111 ev.key.keycode = x11_latin1_keysym_to_adb_key[keysym & 0x00ff]; 112 } else { 113 ev.key.keycode = 0xff; 114 } 115 85 116 if ((ev.key.keycode & 0xff) == 0xff) break; 86 117 ev.type = sysevKey; 87 118 ev.key.pressed = false; 88 119 89 sys_lock_mutex(gX11Mutex);90 XLookupString((XKeyEvent*)&event, buffer, sizeof buffer, &keysym, &compose);91 sys_unlock_mutex(gX11Mutex);92 ev.key.chr = buffer[0];93 94 120 gKeyboard->handleEvent(ev); 95 121 break; 96 122 } 97 123 case KeyPress: { 98 char buffer[4];99 XComposeStatus compose;100 124 KeySym keysym; 101 102 125 SystemEvent ev; 103 ev.key.keycode = x11_key_to_adb_key[event.xkey.keycode];104 if ((ev.key.keycode & 0xff) == 0xff) break;105 ev.type = sysevKey;106 ev.key.pressed = true;107 ev.key.keycode = x11_key_to_adb_key[event.xkey.keycode];108 126 109 127 sys_lock_mutex(gX11Mutex); 110 XLookupString((XKeyEvent*)&event, buffer, sizeof buffer, &keysym, &compose);128 keysym = XLookupKeysym((XKeyEvent*)&event, 0); 111 129 sys_unlock_mutex(gX11Mutex); 112 ev.key.chr = buffer[0]; 130 if ((keysym & 0xff00) == 0xff00) { 131 ev.key.keycode = x11_function_keysym_to_adb_key[keysym & 0x00ff]; 132 } else if ((keysym & 0xff00) == 0x0000) { 133 ev.key.keycode = x11_latin1_keysym_to_adb_key[keysym & 0x00ff]; 134 } else { 135 ev.key.keycode = 0xff; 136 } 137 138 if ((ev.key.keycode & 0xff) == 0xff) break; 139 ev.type = sysevKey; 140 ev.key.pressed = true; 113 141 114 142 gKeyboard->handleEvent(ev); 115 143 break;