Skip to content

Commit 38eade4

Browse files
Updated ImGui XCB implementation
1 parent ae45132 commit 38eade4

1 file changed

Lines changed: 71 additions & 104 deletions

File tree

Imgui/src/ImGuiImplLinuxXCB.cpp

Lines changed: 71 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ ImGuiImplLinuxXCB::ImGuiImplLinuxXCB(const ImGuiDiligentCreateInfo& CI,
5353
{
5454
m_syms = xcb_key_symbols_alloc((xcb_connection_t*)connection);
5555

56-
auto& io = ImGui::GetIO();
56+
ImGuiIO& io = ImGui::GetIO();
5757
io.DisplaySize = ImVec2(DisplayWidth, DisplayHeight);
5858

5959
io.BackendPlatformName = "Diligent-ImGuiImplLinuxXCB";
@@ -76,7 +76,7 @@ void ImGuiImplLinuxXCB::NewFrame(Uint32 RenderSurfaceWidth,
7676
auto now = std::chrono::high_resolution_clock::now();
7777
auto elapsed_ns = now - m_LastTimestamp;
7878
m_LastTimestamp = now;
79-
auto& io = ImGui::GetIO();
79+
ImGuiIO& io = ImGui::GetIO();
8080
io.DeltaTime = static_cast<float>(elapsed_ns.count() / 1e+9);
8181

8282
VERIFY(io.DisplaySize.x == 0 || io.DisplaySize.x == static_cast<float>(RenderSurfaceWidth), "io.DisplaySize.x (",
@@ -93,125 +93,92 @@ void ImGuiImplLinuxXCB::HandleKeyEvent(xcb_key_release_event_t* event)
9393
{
9494
bool IsKeyPressed = (event->response_type & 0x7f) == XCB_KEY_PRESS;
9595

96-
auto& io = ImGui::GetIO();
96+
ImGuiIO& io = ImGui::GetIO();
9797

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);
98+
// Handle modifier keys
99+
bool IsCtrlPressed = (event->state & XCB_MOD_MASK_CONTROL) != 0;
100+
bool IsShiftPressed = (event->state & XCB_MOD_MASK_SHIFT) != 0;
101+
bool IsAltPressed = (event->state & XCB_MOD_MASK_1) != 0;
102+
io.AddKeyEvent(ImGuiKey_ModCtrl, IsCtrlPressed);
103+
io.AddKeyEvent(ImGuiKey_ModShift, IsShiftPressed);
104+
io.AddKeyEvent(ImGuiKey_ModAlt, IsAltPressed);
105+
106+
// Lookup the keysym
107+
xcb_keysym_t keysym = xcb_key_press_lookup_keysym(m_syms, event, 0);
101108

102109
ImGuiKey k = ImGuiKey_None;
103-
switch (event->detail)
110+
switch (keysym)
104111
{
105-
// clang-format off
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;
112+
// clang-format off
113+
case XK_Tab: k = ImGuiKey_Tab; break;
114+
case XK_Left: k = ImGuiKey_LeftArrow; break;
115+
case XK_Right: k = ImGuiKey_RightArrow; break;
116+
case XK_Up: k = ImGuiKey_UpArrow; break;
117+
case XK_Down: k = ImGuiKey_DownArrow; break;
118+
case XK_Page_Up: k = ImGuiKey_PageUp; break;
119+
case XK_Page_Down: k = ImGuiKey_PageDown; break;
120+
case XK_Home: k = ImGuiKey_Home; break;
121+
case XK_End: k = ImGuiKey_End; break;
122+
case XK_Insert: k = ImGuiKey_Insert; break;
123+
case XK_Delete: k = ImGuiKey_Delete; break;
124+
case XK_BackSpace: k = ImGuiKey_Backspace; break;
125+
case XK_Return: k = ImGuiKey_Enter; break;
126+
case XK_Escape: k = ImGuiKey_Escape; break;
127+
case XK_KP_Enter: k = ImGuiKey_Enter; break;
121128
// clang-format on
129+
130+
default:
131+
if (keysym >= 'a' && keysym <= 'z')
132+
k = static_cast<ImGuiKey>(ImGuiKey_A + (keysym - 'a'));
133+
else if (keysym >= 'A' && keysym <= 'Z')
134+
k = static_cast<ImGuiKey>(ImGuiKey_A + (keysym - 'A'));
122135
}
123136

124-
if (k == 0 && IsKeyPressed)
137+
if (k != ImGuiKey_None)
138+
io.AddKeyEvent(k, IsKeyPressed);
139+
140+
// Add input characters for pressed keys
141+
if (IsKeyPressed && keysym > 12 && keysym < 127)
125142
{
126-
xcb_keysym_t keysym = xcb_key_press_lookup_keysym(m_syms, event, 0);
127-
switch (keysym)
143+
if (IsShiftPressed)
128144
{
129-
#if 0
130-
case XK_Control_L:
131-
case XK_Control_R: /*s_KMod |= TW_KMOD_CTRL;*/ break;
132-
133-
case XK_Shift_L:
134-
case XK_Shift_R: /*s_KMod |= TW_KMOD_SHIFT;*/ break;
135-
136-
case XK_Alt_L:
137-
case XK_Alt_R: /*s_KMod |= TW_KMOD_ALT;*/ break;
138-
139-
# ifdef XK_Enter
140-
case XK_Enter: k = TW_KEY_RETURN; break;
141-
# endif
142-
143-
# ifdef XK_KP_Home
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;
147-
# endif
148-
149-
# ifdef XK_KP_Up
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;
154-
# endif
155-
156-
# ifdef XK_KP_Page_Up
157-
case XK_KP_Page_Up: k = ImGuiKey_PageUp; break;
158-
case XK_KP_Page_Down: k = ImGuiKey_PageDown; break;
159-
# endif
160-
161-
# ifdef XK_KP_Tab
162-
case XK_KP_Tab: k = ImGuiKey_Tab; break;
163-
# endif
164-
#endif
165-
default:
166-
if (keysym > 12 && keysym < 127)
145+
if (keysym >= 'a' && keysym <= 'z')
146+
keysym += (int)'A' - (int)'a';
147+
else
148+
{
149+
switch (keysym)
167150
{
168-
if (io.KeyShift)
169-
{
170-
if (keysym >= 'a' && keysym <= 'z')
171-
keysym += (int)'A' - (int)'a';
172-
else
173-
{
174-
switch (keysym)
175-
{
176-
case '`': keysym = '~'; break;
177-
case '1': keysym = '!'; break;
178-
case '2': keysym = '@'; break;
179-
case '3': keysym = '#'; break;
180-
case '4': keysym = '$'; break;
181-
case '5': keysym = '%'; break;
182-
case '6': keysym = '^'; break;
183-
case '7': keysym = '&'; break;
184-
case '8': keysym = '*'; break;
185-
case '9': keysym = '('; break;
186-
case '0': keysym = ')'; break;
187-
case '-': keysym = '_'; break;
188-
case '=': keysym = '+'; break;
189-
case '[': keysym = '{'; break;
190-
case ']': keysym = '}'; break;
191-
case '\\': keysym = '|'; break;
192-
case ';': keysym = ':'; break;
193-
case '\'': keysym = '\"'; break;
194-
case ',': keysym = '<'; break;
195-
case '.': keysym = '>'; break;
196-
case '/': keysym = '?'; break;
197-
}
198-
}
199-
}
200-
201-
io.AddInputCharacter(keysym);
151+
case '`': keysym = '~'; break;
152+
case '1': keysym = '!'; break;
153+
case '2': keysym = '@'; break;
154+
case '3': keysym = '#'; break;
155+
case '4': keysym = '$'; break;
156+
case '5': keysym = '%'; break;
157+
case '6': keysym = '^'; break;
158+
case '7': keysym = '&'; break;
159+
case '8': keysym = '*'; break;
160+
case '9': keysym = '('; break;
161+
case '0': keysym = ')'; break;
162+
case '-': keysym = '_'; break;
163+
case '=': keysym = '+'; break;
164+
case '[': keysym = '{'; break;
165+
case ']': keysym = '}'; break;
166+
case '\\': keysym = '|'; break;
167+
case ';': keysym = ':'; break;
168+
case '\'': keysym = '\"'; break;
169+
case ',': keysym = '<'; break;
170+
case '.': keysym = '>'; break;
171+
case '/': keysym = '?'; break;
202172
}
173+
}
203174
}
204-
}
205-
206-
if (k != ImGuiKey_None)
207-
{
208-
io.AddKeyEvent(k, IsKeyPressed);
175+
io.AddInputCharacter(keysym);
209176
}
210177
}
211178

212179
bool ImGuiImplLinuxXCB::HandleXCBEvent(xcb_generic_event_t* event)
213180
{
214-
auto& io = ImGui::GetIO();
181+
ImGuiIO& io = ImGui::GetIO();
215182
switch (event->response_type & 0x7f)
216183
{
217184
case XCB_MOTION_NOTIFY:

0 commit comments

Comments
 (0)