yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
b118451e3
master
1#if defined(SLANG_ENABLE_XLIB ) 2 3#include "../window.h" 4#include "core/slang-basic.h" 5 6#include <X11/Xlib.h> 7#include <X11/keysym.h> 8 9#ifdef None 10#undef None 11#endif 12 13// Translates X11 key code values to Win32 Virtual Key values 14 15using namespace Slang ; 16 17namespace platform 18{ 19Dictionary < int ,KeyCode > keyCodeMap ; 20 21struct Win32KeyCode 22{ 23KeyCode vKeyCode ; 24int keySym ; 25}; 26 27Win32KeyCode keys []= { 28 {KeyCode ::Left ,XK_Left }, 29 {KeyCode ::Up ,XK_Up }, 30 {KeyCode ::Down ,XK_Down }, 31 {KeyCode ::Right ,XK_Right }, 32 {KeyCode ::Escape ,XK_Escape }, 33 {KeyCode ::Return ,XK_Return }, 34 {KeyCode ::Space ,XK_space }, 35 {KeyCode ::Shift ,XK_Shift_L }, 36 {KeyCode ::Shift ,XK_Shift_R }, 37 {KeyCode ::Ctrl ,XK_Control_L }, 38 {KeyCode ::Ctrl ,XK_Control_R }, 39 {KeyCode ::Alt ,XK_Alt_L }, 40 {KeyCode ::Alt ,XK_Alt_R }, 41 {KeyCode ::Backspace ,XK_BackSpace }, 42 {KeyCode ::Delete ,XK_Delete }, 43 {KeyCode ::Home ,XK_Home }, 44 {KeyCode ::End ,XK_End }, 45 {KeyCode ::PageUp ,XK_Page_Up }, 46 {KeyCode ::PageDown ,XK_Page_Down }, 47 {KeyCode ::Insert ,XK_Insert }, 48 {KeyCode ::Tab ,XK_Tab }, 49 {KeyCode ::A ,0x41 }, 50 {KeyCode ::B ,0x42 }, 51 {KeyCode ::C ,0x43 }, 52 {KeyCode ::D ,0x44 }, 53 {KeyCode ::E ,0x45 }, 54 {KeyCode ::F ,0x46 }, 55 {KeyCode ::G ,0x47 }, 56 {KeyCode ::H ,0x48 }, 57 {KeyCode ::I ,0x49 }, 58 {KeyCode ::J ,0x4A }, 59 {KeyCode ::K ,0x4B }, 60 {KeyCode ::L ,0x4C }, 61 {KeyCode ::M ,0x4D }, 62 {KeyCode ::N ,0x4E }, 63 {KeyCode ::O ,0x4F }, 64 {KeyCode ::P ,0x50 }, 65 {KeyCode ::Q ,0x51 }, 66 {KeyCode ::R ,0x52 }, 67 {KeyCode ::S ,0x53 }, 68 {KeyCode ::T ,0x54 }, 69 {KeyCode ::U ,0x55 }, 70 {KeyCode ::V ,0x56 }, 71 {KeyCode ::W ,0x57 }, 72 {KeyCode ::X ,0x58 }, 73 {KeyCode ::Y ,0x59 }, 74 {KeyCode ::Z ,0x5A }, 75 {KeyCode ::Semicolon ,XK_semicolon }, 76 {KeyCode ::Comma ,XK_comma }, 77 {KeyCode ::Dot ,XK_period }, 78 {KeyCode ::Slash ,XK_slash }, 79 {KeyCode ::Quote ,XK_apostrophe }, 80 {KeyCode ::LBracket ,XK_bracketleft }, 81 {KeyCode ::RBracket ,XK_bracketright }, 82 {KeyCode ::Backslash ,XK_backslash }, 83 {KeyCode ::Minus ,XK_minus }, 84 {KeyCode ::Plus ,XK_equal }, 85 {KeyCode ::Tilde ,XK_asciitilde }, 86 {KeyCode ::Key0 ,0x30 }, 87 {KeyCode ::Key1 ,0x31 }, 88 {KeyCode ::Key2 ,0x32 }, 89 {KeyCode ::Key3 ,0x33 }, 90 {KeyCode ::Key4 ,0x34 }, 91 {KeyCode ::Key5 ,0x35 }, 92 {KeyCode ::Key6 ,0x36 }, 93 {KeyCode ::Key7 ,0x37 }, 94 {KeyCode ::Key8 ,0x38 }, 95 {KeyCode ::Key9 ,0x39 }, 96 {KeyCode ::F1 ,XK_F1 }, 97 {KeyCode ::F2 ,XK_F2 }, 98 {KeyCode ::F3 ,XK_F3 }, 99 {KeyCode ::F4 ,XK_F4 }, 100 {KeyCode ::F5 ,XK_F5 }, 101 {KeyCode ::F6 ,XK_F6 }, 102 {KeyCode ::F7 ,XK_F7 }, 103 {KeyCode ::F8 ,XK_F8 }, 104 {KeyCode ::F9 ,XK_F9 }, 105 {KeyCode ::F10 ,XK_F10 }, 106 {KeyCode ::F11 ,XK_F11 }, 107 {KeyCode ::F12 ,XK_F12 }}; 108 109void initKeyCodeTranslationTable (Display * display ) 110{ 111for (auto entry :keys ) 112 { 113auto systemKeyCode = XKeysymToKeycode (display ,entry .keySym ); 114keyCodeMap [systemKeyCode ]= entry .vKeyCode ; 115 } 116} 117 118void freeKeyCodeTranslationTable () 119{ 120keyCodeMap = decltype(keyCodeMap )(); 121} 122 123KeyCode translateKeyCode (int keyCode ) 124{ 125KeyCode result = KeyCode ::None ; 126keyCodeMap .tryGetValue (keyCode ,result ); 127return result ; 128} 129 130int getKeyChar (KeyCode keyCode ,int keyState ) 131{ 132bool shift = (keyState & ShiftMask )!= 0 ; 133if (keyCode >=KeyCode ::A && keyCode <=KeyCode ::Z ) 134 { 135bool capslock = (keyState & LockMask )!= 0 ; 136bool isCapital = capslock ^shift ; 137if (isCapital ) 138return (int )keyCode ; 139else 140return (int )keyCode + ('a' - 'A' ); 141 } 142else if (keyCode == KeyCode ::Space ) 143 { 144return ' ' ; 145 } 146else if (keyCode == KeyCode ::Return ) 147 { 148return (int )keyCode ; 149 } 150else if (keyCode >=KeyCode ::Key0 && keyCode <=KeyCode ::Key9 ) 151 { 152if (!shift ) 153return (int )keyCode ; 154else 155 { 156switch (keyCode ) 157 { 158case KeyCode ::Key0 : 159return ')' ; 160case KeyCode ::Key1 : 161return '!' ; 162case KeyCode ::Key2 : 163return '@' ; 164case KeyCode ::Key3 : 165return '#' ; 166case KeyCode ::Key4 : 167return '$' ; 168case KeyCode ::Key5 : 169return '%' ; 170case KeyCode ::Key6 : 171return '^' ; 172case KeyCode ::Key7 : 173return '&' ; 174case KeyCode ::Key8 : 175return '*' ; 176case KeyCode ::Key9 : 177return '(' ; 178default : 179return 0 ; 180 } 181 } 182 } 183if (shift ) 184 { 185switch (keyCode ) 186 { 187case KeyCode ::Semicolon : 188return ':' ; 189case KeyCode ::Comma : 190return '<' ; 191case KeyCode ::Dot : 192return '>' ; 193case KeyCode ::Slash : 194return '?' ; 195case KeyCode ::Quote : 196return '\"' ; 197case KeyCode ::LBracket : 198return '{' ; 199case KeyCode ::RBracket : 200return '}' ; 201case KeyCode ::Backslash : 202return '|' ; 203case KeyCode ::Minus : 204return '_' ; 205case KeyCode ::Plus : 206return '+' ; 207case KeyCode ::Tilde : 208return '~' ; 209default : 210return 0 ; 211 } 212 } 213else 214 { 215switch (keyCode ) 216 { 217case KeyCode ::Semicolon : 218return ';' ; 219case KeyCode ::Comma : 220return ',' ; 221case KeyCode ::Dot : 222return '.' ; 223case KeyCode ::Slash : 224return '/' ; 225case KeyCode ::Quote : 226return '\'' ; 227case KeyCode ::LBracket : 228return '[' ; 229case KeyCode ::RBracket : 230return ']' ; 231case KeyCode ::Backslash : 232return '\\' ; 233case KeyCode ::Minus : 234return '-' ; 235case KeyCode ::Plus : 236return '=' ; 237case KeyCode ::Tilde : 238return '`' ; 239default : 240return 0 ; 241 } 242 } 243} 244}// namespace platform 245 246#endif