|
@@ -13,7 +13,6 @@
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
// 2018-XX-XX: Inputs: Added support for mouse cursors, honoring ImGui::GetMouseCursor() value.
|
|
|
-// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplGlfwGL3_RenderDrawData() in the .h file so you can call it yourself.
|
|
|
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
|
|
|
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
|
|
|
// 2018-01-25: Inputs: Added gamepad support if ImGuiNavFlags_EnableGamepad is set.
|
|
@@ -26,7 +25,7 @@
|
|
|
#include "imgui.h"
|
|
|
#include "imgui_impl_glfw.h"
|
|
|
|
|
|
-// GL3W/GLFW
|
|
|
+// GLFW
|
|
|
#include <GLFW/glfw3.h>
|
|
|
#ifdef _WIN32
|
|
|
#undef APIENTRY
|
|
@@ -37,22 +36,22 @@
|
|
|
// Data
|
|
|
static GLFWwindow* g_Window = NULL;
|
|
|
static double g_Time = 0.0f;
|
|
|
-static bool g_MouseJustPressed[3] = { false, false, false };
|
|
|
+static bool g_MouseJustPressed[5] = { false, false, false, false, false };
|
|
|
static GLFWcursor* g_MouseCursors[ImGuiMouseCursor_Count_] = { 0 };
|
|
|
|
|
|
-static const char* ImGui_ImplGlfwGL3_GetClipboardText(void* user_data)
|
|
|
+static const char* ImGui_ImplGlfw_GetClipboardText(void* user_data)
|
|
|
{
|
|
|
return glfwGetClipboardString((GLFWwindow*)user_data);
|
|
|
}
|
|
|
|
|
|
-static void ImGui_ImplGlfwGL3_SetClipboardText(void* user_data, const char* text)
|
|
|
+static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text)
|
|
|
{
|
|
|
glfwSetClipboardString((GLFWwindow*)user_data, text);
|
|
|
}
|
|
|
|
|
|
void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
|
|
|
{
|
|
|
- if (action == GLFW_PRESS && button >= 0 && button < 3)
|
|
|
+ if (action == GLFW_PRESS && button >= 0 && button < IM_ARRAYSIZE(g_MouseJustPressed))
|
|
|
g_MouseJustPressed[button] = true;
|
|
|
}
|
|
|
|
|
@@ -85,6 +84,14 @@ void ImGui_ImplGlfw_CharCallback(GLFWwindow*, unsigned int c)
|
|
|
io.AddInputCharacter((unsigned short)c);
|
|
|
}
|
|
|
|
|
|
+void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window)
|
|
|
+{
|
|
|
+ glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback);
|
|
|
+ glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback);
|
|
|
+ glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback);
|
|
|
+ glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
|
|
|
+}
|
|
|
+
|
|
|
bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks)
|
|
|
{
|
|
|
g_Window = window;
|
|
@@ -112,8 +119,8 @@ bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks)
|
|
|
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
|
|
|
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
|
|
|
|
|
|
- io.SetClipboardTextFn = ImGui_ImplGlfwGL3_SetClipboardText;
|
|
|
- io.GetClipboardTextFn = ImGui_ImplGlfwGL3_GetClipboardText;
|
|
|
+ io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
|
|
|
+ io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText;
|
|
|
io.ClipboardUserData = g_Window;
|
|
|
#ifdef _WIN32
|
|
|
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
|
|
@@ -128,12 +135,7 @@ bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks)
|
|
|
g_MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); // FIXME: GLFW doesn't have this.
|
|
|
|
|
|
if (install_callbacks)
|
|
|
- {
|
|
|
- glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback);
|
|
|
- glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback);
|
|
|
- glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback);
|
|
|
- glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
|
|
|
- }
|
|
|
+ ImGui_ImplGlfw_InstallCallbacks(window);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -147,26 +149,17 @@ void ImGui_ImplGlfw_Shutdown()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ImGui_ImplGlfw_NewFrame()
|
|
|
+static void ImGui_ImplGlfw_UpdateMousePosButtons()
|
|
|
{
|
|
|
- ImGuiIO& io = ImGui::GetIO();
|
|
|
- IM_ASSERT(io.Fonts->IsBuilt()); // Font atlas needs to be built, call renderer _NewFrame() function e.g. ImGui_ImplOpenGL3_NewFrame()
|
|
|
-
|
|
|
- // Setup display size
|
|
|
- int w, h;
|
|
|
- int display_w, display_h;
|
|
|
- glfwGetWindowSize(g_Window, &w, &h);
|
|
|
- glfwGetFramebufferSize(g_Window, &display_w, &display_h);
|
|
|
- io.DisplaySize = ImVec2((float)w, (float)h);
|
|
|
- io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
|
|
-
|
|
|
- // Setup time step
|
|
|
- double current_time = glfwGetTime();
|
|
|
- io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
|
|
|
- g_Time = current_time;
|
|
|
+ // Update buttons
|
|
|
+ for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
|
|
|
+ {
|
|
|
+ // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
|
|
|
+ io.MouseDown[i] = g_MouseJustPressed[i] || glfwGetMouseButton(g_Window, i) != 0;
|
|
|
+ g_MouseJustPressed[i] = false;
|
|
|
+ }
|
|
|
|
|
|
- // Setup inputs
|
|
|
- // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())
|
|
|
+ // Update mouse position
|
|
|
if (glfwGetWindowAttrib(g_Window, GLFW_FOCUSED))
|
|
|
{
|
|
|
if (io.WantMoveMouse)
|
|
@@ -185,14 +178,29 @@ void ImGui_ImplGlfw_NewFrame()
|
|
|
io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX);
|
|
|
}
|
|
|
|
|
|
- for (int i = 0; i < 3; i++)
|
|
|
- {
|
|
|
- // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
|
|
|
- io.MouseDown[i] = g_MouseJustPressed[i] || glfwGetMouseButton(g_Window, i) != 0;
|
|
|
- g_MouseJustPressed[i] = false;
|
|
|
- }
|
|
|
+}
|
|
|
+
|
|
|
+void ImGui_ImplGlfw_NewFrame()
|
|
|
+{
|
|
|
+ ImGuiIO& io = ImGui::GetIO();
|
|
|
+ IM_ASSERT(io.Fonts->IsBuilt()); // Font atlas needs to be built, call renderer _NewFrame() function e.g. ImGui_ImplOpenGL3_NewFrame()
|
|
|
+
|
|
|
+ // Setup display size
|
|
|
+ int w, h;
|
|
|
+ int display_w, display_h;
|
|
|
+ glfwGetWindowSize(g_Window, &w, &h);
|
|
|
+ glfwGetFramebufferSize(g_Window, &display_w, &display_h);
|
|
|
+ io.DisplaySize = ImVec2((float)w, (float)h);
|
|
|
+ io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
|
|
+
|
|
|
+ // Setup time step
|
|
|
+ double current_time = glfwGetTime();
|
|
|
+ io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
|
|
|
+ g_Time = current_time;
|
|
|
+
|
|
|
+ ImGui_ImplGlfw_UpdateMousePosButtons();
|
|
|
|
|
|
- // Hide OS mouse cursor if ImGui is drawing it
|
|
|
+ // Update OS/hardware mouse cursor if imgui isn't drawing a software cursor
|
|
|
ImGuiMouseCursor cursor = ImGui::GetMouseCursor();
|
|
|
if (io.MouseDrawCursor || cursor == ImGuiMouseCursor_None)
|
|
|
{
|
|
@@ -200,8 +208,8 @@ void ImGui_ImplGlfw_NewFrame()
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ glfwSetCursor(g_Window, g_MouseCursors[cursor] ? g_MouseCursors[cursor] : g_MouseCursors[ImGuiMouseCursor_Arrow]);
|
|
|
glfwSetInputMode(g_Window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
|
|
- glfwSetCursor(g_Window, g_MouseCursors[cursor]);
|
|
|
}
|
|
|
|
|
|
// Gamepad navigation mapping [BETA]
|