yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie HermaszewskaMove switch statement bodies to their own lines (#5493)b118451e3

master
5.8 KiB246 linesraw
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{
23    KeyCode vKeyCode;
24    int 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{
111    for (auto entry : keys)
112    {
113        auto systemKeyCode = XKeysymToKeycode(display, entry.keySym);
114        keyCodeMap[systemKeyCode] = entry.vKeyCode;
115    }
116}
117
118void freeKeyCodeTranslationTable()
119{
120    keyCodeMap = decltype(keyCodeMap)();
121}
122
123KeyCode translateKeyCode(int keyCode)
124{
125    KeyCode result = KeyCode::None;
126    keyCodeMap.tryGetValue(keyCode, result);
127    return result;
128}
129
130int getKeyChar(KeyCode keyCode, int keyState)
131{
132    bool shift = (keyState & ShiftMask) != 0;
133    if (keyCode >= KeyCode::A && keyCode <= KeyCode::Z)
134    {
135        bool capslock = (keyState & LockMask) != 0;
136        bool isCapital = capslock ^ shift;
137        if (isCapital)
138            return (int)keyCode;
139        else
140            return (int)keyCode + ('a' - 'A');
141    }
142    else if (keyCode == KeyCode::Space)
143    {
144        return ' ';
145    }
146    else if (keyCode == KeyCode::Return)
147    {
148        return (int)keyCode;
149    }
150    else if (keyCode >= KeyCode::Key0 && keyCode <= KeyCode::Key9)
151    {
152        if (!shift)
153            return (int)keyCode;
154        else
155        {
156            switch (keyCode)
157            {
158            case KeyCode::Key0:
159                return ')';
160            case KeyCode::Key1:
161                return '!';
162            case KeyCode::Key2:
163                return '@';
164            case KeyCode::Key3:
165                return '#';
166            case KeyCode::Key4:
167                return '$';
168            case KeyCode::Key5:
169                return '%';
170            case KeyCode::Key6:
171                return '^';
172            case KeyCode::Key7:
173                return '&';
174            case KeyCode::Key8:
175                return '*';
176            case KeyCode::Key9:
177                return '(';
178            default:
179                return 0;
180            }
181        }
182    }
183    if (shift)
184    {
185        switch (keyCode)
186        {
187        case KeyCode::Semicolon:
188            return ':';
189        case KeyCode::Comma:
190            return '<';
191        case KeyCode::Dot:
192            return '>';
193        case KeyCode::Slash:
194            return '?';
195        case KeyCode::Quote:
196            return '\"';
197        case KeyCode::LBracket:
198            return '{';
199        case KeyCode::RBracket:
200            return '}';
201        case KeyCode::Backslash:
202            return '|';
203        case KeyCode::Minus:
204            return '_';
205        case KeyCode::Plus:
206            return '+';
207        case KeyCode::Tilde:
208            return '~';
209        default:
210            return 0;
211        }
212    }
213    else
214    {
215        switch (keyCode)
216        {
217        case KeyCode::Semicolon:
218            return ';';
219        case KeyCode::Comma:
220            return ',';
221        case KeyCode::Dot:
222            return '.';
223        case KeyCode::Slash:
224            return '/';
225        case KeyCode::Quote:
226            return '\'';
227        case KeyCode::LBracket:
228            return '[';
229        case KeyCode::RBracket:
230            return ']';
231        case KeyCode::Backslash:
232            return '\\';
233        case KeyCode::Minus:
234            return '-';
235        case KeyCode::Plus:
236            return '=';
237        case KeyCode::Tilde:
238            return '`';
239        default:
240            return 0;
241        }
242    }
243}
244} // namespace platform
245
246#endif