OpenGL/GLFW: glfwOpenWindow hanging (barebones application)

Alright so I'm just trying to open a basic window with GLFW, and while it opens and get's cleared to black, it hangs and the circle waiting cursor appears. The GUI is unusable and the whole program just freezes.

Any help?

EDIT is there a way to manually create a window and have glfw attach to that window?

Code:

// Attempt to start up GLFW
        f1("Attempting to start up GLFW");
        if(!glfwInit())
        {
            e("Could not start up GLFW!");
            SetVError(V_ERR_OGL_GLFWINIT);
            return false;
        }

        // Create window hints
        f1("Setting window hints");
        glfwOpenWindowHint(GLFW_FSAA_SAMPLES, V_OGL_ANTIALIAS);
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // We want 4.0!
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
        glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        // Create the window
        f1("Creating main window");
        if(!glfwOpenWindow(V_OGL_WINDOW_W, V_OGL_WINDOW_H, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
        {
            e("Could not create main window!");
            SetVError(V_ERR_OGL_WINDOW);
            return false;
        }

        // Attempt to start up Glew
        f1("Attempting to startup Glew");
        if(glewInit() != GLEW_OK)
        {
            // Error and return
            e("Could not instantiate Glew!");
            SetVError(V_ERR_OGL_GLEWINIT);
            return false;
        }

        // Set the window's title
        f1("Setting window title");
        glfwSetWindowTitle(V_WINDOW_TITLE);

        // Clear the screen / set BG color
        f1("Clearing background");
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        // Lastly, setup basic sticky keys
        f1("Enabling sticky keys");
        glfwEnable(GLFW_STICKY_KEYS);

Main code:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpComString, int nShowCmd)
{
    // Generate logger instance (instantiate logging)
    VLogInit();

    // Log Title + Version
    i("VOGL Test "V_FULLVERSION);

    // Init OpenGL/Graphics
    if(!OGLStartup())
        return GetLastVError();
    else // Log that we succeeded
        f1("OGLStartup succeeded!");

    // Fork thread for window events
    hMainWindow = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&tcbMainWindow, NULL, 0, thMainWindow);

    // Alloc statuc
    DWORD status;

    // Wait for all threads to return
    while(true)
    {
        // Main Window
        GetExitCodeThread(hMainWindow, &status);
        if(status != STILL_ACTIVE)
            break;

        // Sleep for a little bit
        Sleep(10);
    }

    // All okay!
    f1("Terminating Program");
    return V_SUCCESS;
}

DWORD tcbMainWindow(LPVOID lpdwThreadParam)
{
    // Begin window loop
    do
    {

    } // Escape key or window closed
    while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED));

    // Success!
    return V_SUCCESS;
}

And yes, everything is logging correctly. http://pastebin.com/sQ2pw2wN

Upvotes: 0

Views: 2015

Answers (1)

Gigi
Gigi

Reputation: 4962

You must swap the back and front framebuffers in your main loop, like this:

// Begin window loop
do
{
  glfwSwapBuffers(); // <<<
} // Escape key or window closed
while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS 
      && glfwGetWindowParam(GLFW_OPENED));

Why it freeze?

glfw manage operating system events (like refreshing the window, key that get pressed, ...) when you call glfwSwapBuffers (usually).

Upvotes: 2

Related Questions