Nav: Examples: DirectX11, Glfw+GL3: Basic code to map keyboard inputs when io.NavFlags & ImGuiNavFlags_EnableKeyboard is set. (will iterate/tweak before spreading to other examples). (#787)
diff --git a/examples/directx11_example/imgui_impl_dx11.cpp b/examples/directx11_example/imgui_impl_dx11.cpp
index 4963fc1..cd57bc9 100644
--- a/examples/directx11_example/imgui_impl_dx11.cpp
+++ b/examples/directx11_example/imgui_impl_dx11.cpp
@@ -605,6 +605,26 @@
     // io.MouseDown : filled by WM_*BUTTON* events
     // io.MouseWheel : filled by WM_MOUSEWHEEL events
 
+    // Gamepad/keyboard navigation mapping [BETA]
+    memset(io.NavInputs, 0, sizeof(io.NavInputs));
+    if (io.NavFlags & ImGuiNavFlags_EnableKeyboard)
+    {
+        // Update keyboard
+        // FIXME-NAV: We are still using some of the ImGuiNavInput_PadXXX enums as keyboard support is incomplete.
+        #define MAP_KEY(NAV_NO, KEY_NO) { if (io.KeysDown[KEY_NO]) io.NavInputs[NAV_NO] = 1.0f; }
+        MAP_KEY(ImGuiNavInput_KeyLeft,      VK_LEFT);
+        MAP_KEY(ImGuiNavInput_KeyRight,     VK_RIGHT);
+        MAP_KEY(ImGuiNavInput_KeyUp,        VK_UP);
+        MAP_KEY(ImGuiNavInput_KeyDown,      VK_DOWN);
+        MAP_KEY(ImGuiNavInput_KeyMenu,      VK_MENU);
+        MAP_KEY(ImGuiNavInput_PadActivate,  VK_SPACE);
+        MAP_KEY(ImGuiNavInput_PadCancel,    VK_ESCAPE);
+        MAP_KEY(ImGuiNavInput_PadInput,     VK_RETURN);
+        MAP_KEY(ImGuiNavInput_PadTweakFast, VK_SHIFT);
+        MAP_KEY(ImGuiNavInput_PadTweakSlow, VK_CONTROL);
+        #undef MAP_KEY
+    }
+
     // Set OS mouse position if requested last frame by io.WantMoveMouse flag (used when io.NavMovesTrue is enabled by user and using directional navigation)
     if (io.WantMoveMouse)
     {
diff --git a/examples/directx11_example/main.cpp b/examples/directx11_example/main.cpp
index 79e7bb1..1ce5d49 100644
--- a/examples/directx11_example/main.cpp
+++ b/examples/directx11_example/main.cpp
@@ -125,7 +125,9 @@
     UpdateWindow(hwnd);
 
     // Setup ImGui binding
+    ImGuiIO& io = ImGui::GetIO(); (void)io;
     ImGui_ImplDX11_Init(hwnd, g_pd3dDevice, g_pd3dDeviceContext);
+    //io.NavFlags |= ImGuiNavFlags_EnableKeyboard;
 
     // Setup style
     ImGui::StyleColorsClassic();
@@ -138,7 +140,6 @@
     // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
     // - Read 'extra_fonts/README.txt' for more instructions and details.
     // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
-    //ImGuiIO& io = ImGui::GetIO();
     //io.Fonts->AddFontDefault();
     //io.Fonts->AddFontFromFileTTF("../../extra_fonts/Roboto-Medium.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f);
diff --git a/examples/opengl3_example/imgui_impl_glfw_gl3.cpp b/examples/opengl3_example/imgui_impl_glfw_gl3.cpp
index a71fc51..196f641 100644
--- a/examples/opengl3_example/imgui_impl_glfw_gl3.cpp
+++ b/examples/opengl3_example/imgui_impl_glfw_gl3.cpp
@@ -411,6 +411,28 @@
     // Hide OS mouse cursor if ImGui is drawing it
     glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);
 
+    // Gamepad/keyboard navigation mapping [BETA]
+    memset(io.NavInputs, 0, sizeof(io.NavInputs));
+    if (io.NavFlags & ImGuiNavFlags_EnableKeyboard)
+    {
+        // Update keyboard
+        // FIXME-NAV: We are still using some of the ImGuiNavInput_PadXXX enums as keyboard support is incomplete.
+        #define MAP_KEY(NAV_NO, KEY_NO) { if (io.KeysDown[KEY_NO]) io.NavInputs[NAV_NO] = 1.0f; }
+        MAP_KEY(ImGuiNavInput_KeyLeft,      GLFW_KEY_LEFT);
+        MAP_KEY(ImGuiNavInput_KeyRight,     GLFW_KEY_RIGHT);
+        MAP_KEY(ImGuiNavInput_KeyUp,        GLFW_KEY_UP);
+        MAP_KEY(ImGuiNavInput_KeyDown,      GLFW_KEY_DOWN);
+        MAP_KEY(ImGuiNavInput_KeyMenu,      GLFW_KEY_LEFT_ALT);
+        MAP_KEY(ImGuiNavInput_PadActivate,  GLFW_KEY_SPACE);
+        MAP_KEY(ImGuiNavInput_PadCancel,    GLFW_KEY_ESCAPE);
+        MAP_KEY(ImGuiNavInput_PadInput,     GLFW_KEY_ENTER);
+        MAP_KEY(ImGuiNavInput_PadTweakSlow, GLFW_KEY_LEFT_ALT);
+        MAP_KEY(ImGuiNavInput_PadTweakSlow, GLFW_KEY_RIGHT_ALT);
+        MAP_KEY(ImGuiNavInput_PadTweakFast, GLFW_KEY_LEFT_SHIFT);
+        MAP_KEY(ImGuiNavInput_PadTweakFast, GLFW_KEY_RIGHT_SHIFT);
+        #undef MAP_KEY
+    }
+
     // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.
     ImGui::NewFrame();
 }
diff --git a/examples/opengl3_example/main.cpp b/examples/opengl3_example/main.cpp
index 6beb855..4b3073a 100644
--- a/examples/opengl3_example/main.cpp
+++ b/examples/opengl3_example/main.cpp
@@ -32,7 +32,9 @@
     gl3wInit();
 
     // Setup ImGui binding
+    ImGuiIO& io = ImGui::GetIO(); (void)io;
     ImGui_ImplGlfwGL3_Init(window, true);
+    //io.NavFlags |= ImGuiNavFlags_EnableKeyboard;
 
     // Setup style
     ImGui::StyleColorsClassic();
@@ -45,7 +47,6 @@
     // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
     // - Read 'extra_fonts/README.txt' for more instructions and details.
     // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
-    //ImGuiIO& io = ImGui::GetIO();
     //io.Fonts->AddFontDefault();
     //io.Fonts->AddFontFromFileTTF("../../extra_fonts/Roboto-Medium.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f);