@@ -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
212179bool 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