Skip to content

Commit 6dc7440

Browse files
Update ImGui implementation for XCB and X11
1 parent ae06cca commit 6dc7440

File tree

2 files changed

+56
-104
lines changed

2 files changed

+56
-104
lines changed

Imgui/src/ImGuiImplLinuxX11.cpp

Lines changed: 24 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2023 Diligent Graphics LLC
2+
* Copyright 2019-2025 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -70,30 +70,6 @@ ImGuiImplLinuxX11::ImGuiImplLinuxX11(const ImGuiDiligentCreateInfo& CI,
7070

7171
io.BackendPlatformName = "Diligent-ImGuiImplLinuxX11";
7272

73-
// Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array that we will update during the application lifetime.
74-
io.KeyMap[ImGuiKey_Tab] = 256;
75-
io.KeyMap[ImGuiKey_LeftArrow] = 257;
76-
io.KeyMap[ImGuiKey_RightArrow] = 258;
77-
io.KeyMap[ImGuiKey_UpArrow] = 259;
78-
io.KeyMap[ImGuiKey_DownArrow] = 260;
79-
io.KeyMap[ImGuiKey_PageUp] = 261;
80-
io.KeyMap[ImGuiKey_PageDown] = 262;
81-
io.KeyMap[ImGuiKey_Home] = 263;
82-
io.KeyMap[ImGuiKey_End] = 264;
83-
io.KeyMap[ImGuiKey_Insert] = 265;
84-
io.KeyMap[ImGuiKey_Delete] = 266;
85-
io.KeyMap[ImGuiKey_Backspace] = 267;
86-
io.KeyMap[ImGuiKey_Space] = 268;
87-
io.KeyMap[ImGuiKey_Enter] = 269;
88-
//io.KeyMap[ImGuiKey_Escape] = 270;
89-
io.KeyMap[ImGuiKey_KeyPadEnter] = 271;
90-
io.KeyMap[ImGuiKey_A] = 'A';
91-
io.KeyMap[ImGuiKey_C] = 'C';
92-
io.KeyMap[ImGuiKey_V] = 'V';
93-
io.KeyMap[ImGuiKey_X] = 'X';
94-
io.KeyMap[ImGuiKey_Y] = 'Y';
95-
io.KeyMap[ImGuiKey_Z] = 'Z';
96-
9773
m_LastTimestamp = std::chrono::high_resolution_clock::now();
9874
}
9975

@@ -159,41 +135,41 @@ bool ImGuiImplLinuxX11::HandleXEvent(XEvent* event)
159135
case KeyRelease:
160136
{
161137
bool IsPressed = event->type == KeyPress;
162-
io.KeyCtrl = (event->xkey.state & ControlMask) != 0;
163-
io.KeyShift = (event->xkey.state & ShiftMask) != 0;
164-
io.KeyAlt = (event->xkey.state & Mod1Mask) != 0;
138+
io.AddKeyEvent(ImGuiKey_ModCtrl, (event->xkey.state & ControlMask) != 0);
139+
io.AddKeyEvent(ImGuiKey_ModShift, (event->xkey.state & ShiftMask) != 0);
140+
io.AddKeyEvent(ImGuiKey_ModAlt, (event->xkey.state & Mod1Mask) != 0);
165141

166142
KeySym keysym = 0;
167143
constexpr int buff_sz = 80;
168144
char buffer[buff_sz];
169145
int num_char = XLookupString((XKeyEvent*)event, buffer, buff_sz, &keysym, 0);
170-
int k = 0;
146+
ImGuiKey k = ImGuiKey_None;
171147
switch (keysym)
172148
{
173149
// clang-format off
174-
case XK_Tab: k = io.KeyMap[ImGuiKey_Tab]; break;
175-
case XK_Left: k = io.KeyMap[ImGuiKey_LeftArrow]; break;
176-
case XK_Right: k = io.KeyMap[ImGuiKey_RightArrow]; break;
177-
case XK_Up: k = io.KeyMap[ImGuiKey_UpArrow]; break;
178-
case XK_Down: k = io.KeyMap[ImGuiKey_DownArrow]; break;
179-
case XK_Page_Up: k = io.KeyMap[ImGuiKey_PageUp]; break;
180-
case XK_Page_Down: k = io.KeyMap[ImGuiKey_PageDown]; break;
181-
case XK_Home: k = io.KeyMap[ImGuiKey_Home]; break;
182-
case XK_End: k = io.KeyMap[ImGuiKey_End]; break;
183-
case XK_Insert: k = io.KeyMap[ImGuiKey_Insert]; break;
184-
case XK_Delete: k = io.KeyMap[ImGuiKey_Delete]; break;
185-
case XK_BackSpace: k = io.KeyMap[ImGuiKey_Backspace]; break;
186-
//case XK_space: k = io.KeyMap[ImGuiKey_Space]; break;
187-
case XK_Return: k = io.KeyMap[ImGuiKey_Enter]; break;
188-
case XK_Escape: k = io.KeyMap[ImGuiKey_Escape]; break;
189-
case XK_KP_Enter: k = io.KeyMap[ImGuiKey_KeyPadEnter];break;
150+
case XK_Tab: k = ImGuiKey_Tab; break;
151+
case XK_Left: k = ImGuiKey_LeftArrow; break;
152+
case XK_Right: k = ImGuiKey_RightArrow; break;
153+
case XK_Up: k = ImGuiKey_UpArrow; break;
154+
case XK_Down: k = ImGuiKey_DownArrow; break;
155+
case XK_Page_Up: k = ImGuiKey_PageUp; break;
156+
case XK_Page_Down: k = ImGuiKey_PageDown; break;
157+
case XK_Home: k = ImGuiKey_Home; break;
158+
case XK_End: k = ImGuiKey_End; break;
159+
case XK_Insert: k = ImGuiKey_Insert; break;
160+
case XK_Delete: k = ImGuiKey_Delete; break;
161+
case XK_BackSpace: k = ImGuiKey_Backspace; break;
162+
//case XK_space: k = ImGuiKey_Space; break;
163+
case XK_Return: k = ImGuiKey_Enter; break;
164+
case XK_Escape: k = ImGuiKey_Escape; break;
165+
case XK_KP_Enter: k = ImGuiKey_Enter; break;
190166
// clang-format on
191167
}
192168

193-
if (k != 0)
194-
io.KeysDown[k] = IsPressed;
169+
if (k != ImGuiKey_None)
170+
io.AddKeyEvent(k, IsPressed);
195171

196-
if (k == 0 && IsPressed)
172+
if (k == ImGuiKey_None && IsPressed)
197173
{
198174
for (int i = 0; i < num_char; ++i)
199175
io.AddInputCharacter(buffer[i]);

Imgui/src/ImGuiImplLinuxXCB.cpp

Lines changed: 32 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2023 Diligent Graphics LLC
2+
* Copyright 2019-2025 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -58,30 +58,6 @@ ImGuiImplLinuxXCB::ImGuiImplLinuxXCB(const ImGuiDiligentCreateInfo& CI,
5858

5959
io.BackendPlatformName = "Diligent-ImGuiImplLinuxXCB";
6060

61-
// Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array that we will update during the application lifetime.
62-
io.KeyMap[ImGuiKey_Tab] = 0x17;
63-
io.KeyMap[ImGuiKey_LeftArrow] = 0x71;
64-
io.KeyMap[ImGuiKey_RightArrow] = 0x72;
65-
io.KeyMap[ImGuiKey_UpArrow] = 0x6F;
66-
io.KeyMap[ImGuiKey_DownArrow] = 0x74;
67-
io.KeyMap[ImGuiKey_PageUp] = 0x70;
68-
io.KeyMap[ImGuiKey_PageDown] = 0x75;
69-
io.KeyMap[ImGuiKey_Home] = 0x6E;
70-
io.KeyMap[ImGuiKey_End] = 0x73;
71-
io.KeyMap[ImGuiKey_Insert] = 0x76;
72-
io.KeyMap[ImGuiKey_Delete] = 0x77;
73-
io.KeyMap[ImGuiKey_Backspace] = 0x16;
74-
//io.KeyMap[ImGuiKey_Space] = 0;//VK_SPACE;
75-
io.KeyMap[ImGuiKey_Enter] = 0x24;
76-
io.KeyMap[ImGuiKey_Escape] = 0x09;
77-
io.KeyMap[ImGuiKey_KeyPadEnter] = 0x68;
78-
io.KeyMap[ImGuiKey_A] = 'A';
79-
io.KeyMap[ImGuiKey_C] = 'C';
80-
io.KeyMap[ImGuiKey_V] = 'V';
81-
io.KeyMap[ImGuiKey_X] = 'X';
82-
io.KeyMap[ImGuiKey_Y] = 'Y';
83-
io.KeyMap[ImGuiKey_Z] = 'Z';
84-
8561
m_LastTimestamp = std::chrono::high_resolution_clock::now();
8662
}
8763

@@ -119,29 +95,29 @@ void ImGuiImplLinuxXCB::HandleKeyEvent(xcb_key_release_event_t* event)
11995

12096
auto& io = ImGui::GetIO();
12197

122-
io.KeyCtrl = event->state & XCB_KEY_BUT_MASK_CONTROL;
123-
io.KeyShift = event->state & XCB_KEY_BUT_MASK_SHIFT;
124-
io.KeyAlt = event->state & XCB_KEY_BUT_MASK_MOD_1;
98+
io.AddKeyEvent(ImGuiKey_ModCtrl, event->state & XCB_KEY_BUT_MASK_CONTROL);
99+
io.AddKeyEvent(ImGuiKey_ModShift, event->state & XCB_KEY_BUT_MASK_SHIFT);
100+
io.AddKeyEvent(ImGuiKey_ModAlt, event->state & XCB_KEY_BUT_MASK_MOD_1);
125101

126-
int k = 0;
102+
ImGuiKey k = ImGuiKey_None;
127103
switch (event->detail)
128104
{
129105
// clang-format off
130-
case 0x09: k = io.KeyMap[ImGuiKey_Escape]; break;
131-
case 0x6F: k = io.KeyMap[ImGuiKey_UpArrow]; break;
132-
case 0x74: k = io.KeyMap[ImGuiKey_DownArrow]; break;
133-
case 0x72: k = io.KeyMap[ImGuiKey_RightArrow]; break;
134-
case 0x71: k = io.KeyMap[ImGuiKey_LeftArrow]; break;
135-
case 0x24: k = io.KeyMap[ImGuiKey_Enter]; break;
136-
case 0x76: k = io.KeyMap[ImGuiKey_Insert]; break;
137-
case 0x77: k = io.KeyMap[ImGuiKey_Delete]; break;
138-
case 0x16: k = io.KeyMap[ImGuiKey_Backspace]; break;
139-
case 0x6E: k = io.KeyMap[ImGuiKey_Home]; break;
140-
case 0x17: k = io.KeyMap[ImGuiKey_Tab]; break;
141-
case 0x73: k = io.KeyMap[ImGuiKey_End]; break;
142-
case 0x68: k = io.KeyMap[ImGuiKey_KeyPadEnter];break;
143-
case 0x70: k = io.KeyMap[ImGuiKey_PageUp]; break;
144-
case 0x75: k = io.KeyMap[ImGuiKey_PageDown]; break;
106+
case 0x09: k = ImGuiKey_Escape; break;
107+
case 0x6F: k = ImGuiKey_UpArrow; break;
108+
case 0x74: k = ImGuiKey_DownArrow; break;
109+
case 0x72: k = ImGuiKey_RightArrow; break;
110+
case 0x71: k = ImGuiKey_LeftArrow; break;
111+
case 0x24: k = ImGuiKey_Enter; break;
112+
case 0x76: k = ImGuiKey_Insert; break;
113+
case 0x77: k = ImGuiKey_Delete; break;
114+
case 0x16: k = ImGuiKey_Backspace; break;
115+
case 0x6E: k = ImGuiKey_Home; break;
116+
case 0x17: k = ImGuiKey_Tab; break;
117+
case 0x73: k = ImGuiKey_End; break;
118+
case 0x68: k = ImGuiKey_Enter; break;
119+
case 0x70: k = ImGuiKey_PageUp; break;
120+
case 0x75: k = ImGuiKey_PageDown; break;
145121
// clang-format on
146122
}
147123

@@ -165,25 +141,25 @@ void ImGuiImplLinuxXCB::HandleKeyEvent(xcb_key_release_event_t* event)
165141
# endif
166142

167143
# ifdef XK_KP_Home
168-
case XK_KP_Home: k = io.KeyMap[ImGuiKey_Home]; break;
169-
case XK_KP_End: k = io.KeyMap[ImGuiKey_End]; break;
170-
case XK_KP_Delete: k = io.KeyMap[ImGuiKey_Delete]; break;
144+
case XK_KP_Home: k = ImGuiKey_Home; break;
145+
case XK_KP_End: k = ImGuiKey_End; break;
146+
case XK_KP_Delete: k = ImGuiKey_Delete; break;
171147
# endif
172148

173149
# ifdef XK_KP_Up
174-
case XK_KP_Up: k = io.KeyMap[ImGuiKey_UpArrow]; break;
175-
case XK_KP_Down: k = io.KeyMap[ImGuiKey_DownArrow]; break;
176-
case XK_KP_Right: k = io.KeyMap[ImGuiKey_RightArrow]; break;
177-
case XK_KP_Left: k = io.KeyMap[ImGuiKey_LeftArrow]; break;
150+
case XK_KP_Up: k = ImGuiKey_UpArrow; break;
151+
case XK_KP_Down: k = ImGuiKey_DownArrow; break;
152+
case XK_KP_Right: k = ImGuiKey_RightArrow; break;
153+
case XK_KP_Left: k = ImGuiKey_LeftArrow; break;
178154
# endif
179155

180156
# ifdef XK_KP_Page_Up
181-
case XK_KP_Page_Up: k = io.KeyMap[ImGuiKey_PageUp]; break;
182-
case XK_KP_Page_Down: k = io.KeyMap[ImGuiKey_PageDown]; break;
157+
case XK_KP_Page_Up: k = ImGuiKey_PageUp; break;
158+
case XK_KP_Page_Down: k = ImGuiKey_PageDown; break;
183159
# endif
184160

185161
# ifdef XK_KP_Tab
186-
case XK_KP_Tab: k = io.KeyMap[ImGuiKey_Tab]; break;
162+
case XK_KP_Tab: k = ImGuiKey_Tab; break;
187163
# endif
188164
#endif
189165
default:
@@ -227,9 +203,9 @@ void ImGuiImplLinuxXCB::HandleKeyEvent(xcb_key_release_event_t* event)
227203
}
228204
}
229205

230-
if (k != 0)
206+
if (k != ImGuiKey_None)
231207
{
232-
io.KeysDown[k] = IsKeyPressed;
208+
io.AddKeyEvent(k, IsKeyPressed);
233209
}
234210
}
235211

0 commit comments

Comments
 (0)