Created
March 23, 2020 12:06
-
-
Save blep/59b5a69b9671f0a90f3576d14520eb5c to your computer and use it in GitHub Desktop.
DearImGi : change to automatically adapt to keyboard layout with SDL (handling both qwerty/azerty)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// The ideas: | |
// - Initialize varying key to SDL_SCANCODE_UNKNOWN | |
// - On KeyPress, retrieve the actual ASCII code corresponding to the letter, and map related input | |
static void ImGui_ImplSDL2_SetScancodeFromLetter(ImGuiIO& io, int scanCode, int ascii) | |
{ | |
switch (ascii) | |
{ | |
case 'a': case 'A': | |
io.KeyMap[ImGuiKey_A] = scanCode; | |
break; | |
case 'y': case 'Y': | |
io.KeyMap[ImGuiKey_Y] = scanCode; | |
break; | |
case 'z': case 'Z': | |
io.KeyMap[ImGuiKey_Z] = scanCode; | |
break; | |
// should also do C V X ? | |
} | |
} | |
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. | |
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. | |
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. | |
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. | |
bool ImGui_ImplSDL2_ProcessEvent(SDL_Event* event) | |
{ | |
ImGuiIO& io = ImGui::GetIO(); | |
switch (event->type) | |
{ | |
case SDL_MOUSEWHEEL: | |
{ | |
if (event->wheel.x > 0) io.MouseWheelH += 1; | |
if (event->wheel.x < 0) io.MouseWheelH -= 1; | |
if (event->wheel.y > 0) io.MouseWheel += 1; | |
if (event->wheel.y < 0) io.MouseWheel -= 1; | |
return true; | |
} | |
case SDL_MOUSEBUTTONDOWN: | |
{ | |
if (event->button.button == SDL_BUTTON_LEFT) g_MousePressed[0] = true; | |
if (event->button.button == SDL_BUTTON_RIGHT) g_MousePressed[1] = true; | |
if (event->button.button == SDL_BUTTON_MIDDLE) g_MousePressed[2] = true; | |
return true; | |
} | |
case SDL_TEXTINPUT: | |
{ | |
io.AddInputCharactersUTF8(event->text.text); | |
return true; | |
} | |
case SDL_KEYDOWN: | |
case SDL_KEYUP: | |
{ | |
int key = event->key.keysym.scancode; | |
IM_ASSERT(key >= 0 && key < IM_ARRAYSIZE(io.KeysDown)); | |
io.KeysDown[key] = (event->type == SDL_KEYDOWN); | |
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0); | |
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0); | |
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0); | |
io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0); | |
if (event->type == SDL_KEYDOWN) | |
{ | |
ImGui_ImplSDL2_SetScancodeFromLetter(io, key, event->key.keysym.sym); | |
} | |
return true; | |
} | |
} | |
return false; | |
} | |
static bool ImGui_ImplSDL2_Init(SDL_Window* window) | |
{ | |
g_Window = window; | |
// Setup back-end capabilities flags | |
ImGuiIO& io = ImGui::GetIO(); | |
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) | |
#if SDL_HAS_WARP_MOUSE_GLOBAL | |
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) | |
#endif | |
// Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array. | |
io.KeyMap[ImGuiKey_Tab] = SDL_SCANCODE_TAB; | |
io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT; | |
io.KeyMap[ImGuiKey_RightArrow] = SDL_SCANCODE_RIGHT; | |
io.KeyMap[ImGuiKey_UpArrow] = SDL_SCANCODE_UP; | |
io.KeyMap[ImGuiKey_DownArrow] = SDL_SCANCODE_DOWN; | |
io.KeyMap[ImGuiKey_PageUp] = SDL_SCANCODE_PAGEUP; | |
io.KeyMap[ImGuiKey_PageDown] = SDL_SCANCODE_PAGEDOWN; | |
io.KeyMap[ImGuiKey_Home] = SDL_SCANCODE_HOME; | |
io.KeyMap[ImGuiKey_End] = SDL_SCANCODE_END; | |
io.KeyMap[ImGuiKey_Insert] = SDL_SCANCODE_INSERT; | |
io.KeyMap[ImGuiKey_Delete] = SDL_SCANCODE_DELETE; | |
io.KeyMap[ImGuiKey_Backspace] = SDL_SCANCODE_BACKSPACE; | |
io.KeyMap[ImGuiKey_Space] = SDL_SCANCODE_SPACE; | |
io.KeyMap[ImGuiKey_Enter] = SDL_SCANCODE_RETURN; | |
io.KeyMap[ImGuiKey_Escape] = SDL_SCANCODE_ESCAPE; | |
io.KeyMap[ImGuiKey_A] = SDL_SCANCODE_UNKNOWN; | |
io.KeyMap[ImGuiKey_C] = SDL_SCANCODE_C; | |
io.KeyMap[ImGuiKey_V] = SDL_SCANCODE_V; | |
io.KeyMap[ImGuiKey_X] = SDL_SCANCODE_X; | |
io.KeyMap[ImGuiKey_Y] = SDL_SCANCODE_UNKNOWN; | |
io.KeyMap[ImGuiKey_Z] = SDL_SCANCODE_UNKNOWN; | |
io.SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText; | |
io.GetClipboardTextFn = ImGui_ImplSDL2_GetClipboardText; | |
io.ClipboardUserData = NULL; | |
g_MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); | |
g_MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM); | |
g_MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); | |
g_MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS); | |
g_MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); | |
g_MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW); | |
g_MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE); | |
#ifdef _WIN32 | |
SDL_SysWMinfo wmInfo; | |
SDL_VERSION(&wmInfo.version); | |
SDL_GetWindowWMInfo(window, &wmInfo); | |
io.ImeWindowHandle = wmInfo.info.win.window; | |
#else | |
(void)window; | |
#endif | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment