GLFW mouse callback fired after mouse leave GLFWwindow?

风流意气都作罢 提交于 2019-12-24 18:55:11

问题


For some reason my Window::callback is being called even after the mouse has left the window. I am unable to find a solution or even something that could help. Is it possible that GLFW updated how the mouse cursor callback operates? I wonder if it is an order of invocation problem?

Window

Window::Window(std::string title, int32_t width, int32_t height) {
    // TODO: add support for monitor and share for GLFW
    m_window = std::unique_ptr<GLFWwindow, GLFWdeleter>(glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr));
    glfwMakeContextCurrent(m_window.get());
    glfwSetWindowUserPointer(m_window.get(), this);
    glfwSetCursorPosCallback(m_window.get(), Window::callback);
}

void Window::mouse_callback(double xpos, double ypos) {
    std::cout << "x: " << xpos << " y: " << ypos << std::endl;
}

void Window::callback(GLFWwindow* window, double xpos, double ypos)
{
    auto win = static_cast<Window*>(glfwGetWindowUserPointer(window));
    win->mouse_callback(xpos, ypos);
}

Engine

void startup() const
{
    if (glfwInit() == 0)
    {
        LOG(kError, "GLFW init failed!");
        exit(-1);
    }
}

void Engine::run() {
    if (m_main_window_registered)
    {
        glewExperimental = static_cast<GLboolean>(true);
        if (glewInit() != GLEW_OK)
        {
            std::cout << "Failed to initialize glew" << std::endl;
            return;
        }
    }

    while(glfwWindowShouldClose(m_main_window->window()) == 0) {
       glClear(GL_COLOR_BUFFER_BIT);
       glfwSwapBuffers(m_main_window->window());
       glfwPollEvents();
    }
}

main.cpp

int main()
{
    g_engine.startup();

    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    auto window = std::make_unique<Window>("Hello World!", 640, 480);
    //window->make_current();
    g_engine.registerWindow(std::move(window));
    g_engine.run();

    glfwTerminate();
    return 0;
}

回答1:


I have figured out what the problem (or better put) issue is. On Windows the callback performs as expected where once the mouse leaves the windows area the callback stops firing. For OSX the window never loses focus and therefore the cursor callback is always being called. To fix the issue you simply have to test the coordinates to ensure that the mouse is in fact inside the window.



来源:https://stackoverflow.com/questions/45265543/glfw-mouse-callback-fired-after-mouse-leave-glfwwindow

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!