@ -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"
// GL 3W/GL FW
// GL FW
# 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_ImplGlfw GL3 _GetClipboardText( void * user_data )
static const char * ImGui_ImplGlfw _GetClipboardText( void * user_data )
{
return glfwGetClipboardString ( ( GLFWwindow * ) user_data ) ;
}
static void ImGui_ImplGlfw GL3 _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_ImplGlfw GL3 _SetClipboardText;
io . GetClipboardTextFn = ImGui_ImplGlfw GL3 _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]