@ -14,6 +14,7 @@
// CHANGELOG
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// (minor and older changes stripped away, please see git history for details)
// 2018-11-07: Inputs: When installing our GLFW callbacks, we save user's previously installed ones - if any - and chain call them.
// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls.
// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls.
// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
// 2018-06-08: Misc: Extracted imgui_impl_glfw.cpp/.h away from the old combined GLFW+OpenGL/Vulkan examples.
// 2018-06-08: Misc: Extracted imgui_impl_glfw.cpp/.h away from the old combined GLFW+OpenGL/Vulkan examples.
@ -57,6 +58,12 @@ static double g_Time = 0.0;
static bool g_MouseJustPressed [ 5 ] = { false , false , false , false , false } ;
static bool g_MouseJustPressed [ 5 ] = { false , false , false , false , false } ;
static GLFWcursor * g_MouseCursors [ ImGuiMouseCursor_COUNT ] = { 0 } ;
static GLFWcursor * g_MouseCursors [ ImGuiMouseCursor_COUNT ] = { 0 } ;
// Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
static GLFWmousebuttonfun g_PrevUserCallbackMousebutton = NULL ;
static GLFWscrollfun g_PrevUserCallbackScroll = NULL ;
static GLFWkeyfun g_PrevUserCallbackKey = NULL ;
static GLFWcharfun g_PrevUserCallbackChar = NULL ;
static const char * ImGui_ImplGlfw_GetClipboardText ( void * user_data )
static const char * ImGui_ImplGlfw_GetClipboardText ( void * user_data )
{
{
return glfwGetClipboardString ( ( GLFWwindow * ) user_data ) ;
return glfwGetClipboardString ( ( GLFWwindow * ) user_data ) ;
@ -67,36 +74,48 @@ static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text)
glfwSetClipboardString ( ( GLFWwindow * ) user_data , text ) ;
glfwSetClipboardString ( ( GLFWwindow * ) user_data , text ) ;
}
}
void ImGui_ImplGlfw_MouseButtonCallback ( GLFWwindow * , int button , int action , int /*mods*/ )
void ImGui_ImplGlfw_MouseButtonCallback ( GLFWwindow * window , int button , int action , int mods )
{
{
if ( g_PrevUserCallbackMousebutton ! = NULL )
g_PrevUserCallbackMousebutton ( window , button , action , mods ) ;
if ( action = = GLFW_PRESS & & button > = 0 & & button < IM_ARRAYSIZE ( g_MouseJustPressed ) )
if ( action = = GLFW_PRESS & & button > = 0 & & button < IM_ARRAYSIZE ( g_MouseJustPressed ) )
g_MouseJustPressed [ button ] = true ;
g_MouseJustPressed [ button ] = true ;
}
}
void ImGui_ImplGlfw_ScrollCallback ( GLFWwindow * , double xoffset , double yoffset )
void ImGui_ImplGlfw_ScrollCallback ( GLFWwindow * window , double xoffset , double yoffset )
{
{
if ( g_PrevUserCallbackScroll ! = NULL )
g_PrevUserCallbackScroll ( window , xoffset , yoffset ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
io . MouseWheelH + = ( float ) xoffset ;
io . MouseWheelH + = ( float ) xoffset ;
io . MouseWheel + = ( float ) yoffset ;
io . MouseWheel + = ( float ) yoffset ;
}
}
void ImGui_ImplGlfw_KeyCallback ( GLFWwindow * , int key , int , int action , int mods )
void ImGui_ImplGlfw_KeyCallback ( GLFWwindow * window , int key , int scancode , int action , int mods )
{
{
if ( g_PrevUserCallbackKey ! = NULL )
g_PrevUserCallbackKey ( window , key , scancode , action , mods ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
if ( action = = GLFW_PRESS )
if ( action = = GLFW_PRESS )
io . KeysDown [ key ] = true ;
io . KeysDown [ key ] = true ;
if ( action = = GLFW_RELEASE )
if ( action = = GLFW_RELEASE )
io . KeysDown [ key ] = false ;
io . KeysDown [ key ] = false ;
( void ) mods ; // Modifiers are not reliable across systems
// Modifiers are not reliable across systems
io . KeyCtrl = io . KeysDown [ GLFW_KEY_LEFT_CONTROL ] | | io . KeysDown [ GLFW_KEY_RIGHT_CONTROL ] ;
io . KeyCtrl = io . KeysDown [ GLFW_KEY_LEFT_CONTROL ] | | io . KeysDown [ GLFW_KEY_RIGHT_CONTROL ] ;
io . KeyShift = io . KeysDown [ GLFW_KEY_LEFT_SHIFT ] | | io . KeysDown [ GLFW_KEY_RIGHT_SHIFT ] ;
io . KeyShift = io . KeysDown [ GLFW_KEY_LEFT_SHIFT ] | | io . KeysDown [ GLFW_KEY_RIGHT_SHIFT ] ;
io . KeyAlt = io . KeysDown [ GLFW_KEY_LEFT_ALT ] | | io . KeysDown [ GLFW_KEY_RIGHT_ALT ] ;
io . KeyAlt = io . KeysDown [ GLFW_KEY_LEFT_ALT ] | | io . KeysDown [ GLFW_KEY_RIGHT_ALT ] ;
io . KeySuper = io . KeysDown [ GLFW_KEY_LEFT_SUPER ] | | io . KeysDown [ GLFW_KEY_RIGHT_SUPER ] ;
io . KeySuper = io . KeysDown [ GLFW_KEY_LEFT_SUPER ] | | io . KeysDown [ GLFW_KEY_RIGHT_SUPER ] ;
}
}
void ImGui_ImplGlfw_CharCallback ( GLFWwindow * , unsigned int c )
void ImGui_ImplGlfw_CharCallback ( GLFWwindow * window , unsigned int c )
{
{
if ( g_PrevUserCallbackChar ! = NULL )
g_PrevUserCallbackChar ( window , c ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
ImGuiIO & io = ImGui : : GetIO ( ) ;
if ( c > 0 & & c < 0x10000 )
if ( c > 0 & & c < 0x10000 )
io . AddInputCharacter ( ( unsigned short ) c ) ;
io . AddInputCharacter ( ( unsigned short ) c ) ;
@ -151,12 +170,17 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw
g_MouseCursors [ ImGuiMouseCursor_ResizeNWSE ] = glfwCreateStandardCursor ( GLFW_ARROW_CURSOR ) ; // FIXME: GLFW doesn't have this.
g_MouseCursors [ ImGuiMouseCursor_ResizeNWSE ] = glfwCreateStandardCursor ( GLFW_ARROW_CURSOR ) ; // FIXME: GLFW doesn't have this.
g_MouseCursors [ ImGuiMouseCursor_Hand ] = glfwCreateStandardCursor ( GLFW_HAND_CURSOR ) ;
g_MouseCursors [ ImGuiMouseCursor_Hand ] = glfwCreateStandardCursor ( GLFW_HAND_CURSOR ) ;
// Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
g_PrevUserCallbackMousebutton = NULL ;
g_PrevUserCallbackScroll = NULL ;
g_PrevUserCallbackKey = NULL ;
g_PrevUserCallbackChar = NULL ;
if ( install_callbacks )
if ( install_callbacks )
{
{
glfwSetMouseButtonCallback ( window , ImGui_ImplGlfw_MouseButtonCallback ) ;
g _PrevUserCallbackMousebutton = g lfwSetMouseButtonCallback( window , ImGui_ImplGlfw_MouseButtonCallback ) ;
glfwSetScrollCallback ( window , ImGui_ImplGlfw_ScrollCallback ) ;
g _PrevUserCallbackScroll = g lfwSetScrollCallback( window , ImGui_ImplGlfw_ScrollCallback ) ;
glfwSetKeyCallback ( window , ImGui_ImplGlfw_KeyCallback ) ;
g _PrevUserCallbackKey = g lfwSetKeyCallback( window , ImGui_ImplGlfw_KeyCallback ) ;
g lfwSetCharCallback( window , ImGui_ImplGlfw_CharCallback ) ;
g _PrevUserCallbackChar = g lfwSetCharCallback( window , ImGui_ImplGlfw_CharCallback ) ;
}
}
g_ClientApi = client_api ;
g_ClientApi = client_api ;