What is a possible use of glfwGetWindowUserPointer?


#1

I asked this same question on StackOverflow but didn’t get any answeres there, so I figured this place would be more suitable.

When looking through the GLFW reference I came accross the glfwGetWindowUserPointer function (and the glfwSetWindowUserPointer function). In the reference it says the following about the user-pointer:

Each window has a user pointer that can be set with glfwSetWindowUserPointer and fetched with glfwGetWindowUserPointer. This can be used for any purpose you need and will not be modified by GLFW throughout the life-time of the window.

Now I wonder for what purpose one could use this?


#2

Welcome to the forum!

A UserData field is a fairly common paradigm in C APIs that lets the user access contextual data from within callbacks without needing to make everything global. In essence, it lets you associate an arbitrary piece of data relevant to your program with a glfw window.

If you are trying to use glfw in a program that follows object-oriented design, for example, you can use this pointer to store the address of the instance that is handling a particular window, and forward the callbacks (which have to be static functions, because of the way the API works) to the appropriate member functions. e.g.

/* Constructor for the MyWindowHandler class */
MyWindowHandler (GLFWwindow * window) {
    ....
    glfwSetWindowUserPointer(window, reinterpret_cast<void *>(this));
}

...

/* Key event callback wrapper function */
static void key_callback (GLFWwindow * window, int key, int scancode, int action, int mods) {
    MyWindowHandler * handler = reinterpret_cast<MyWindowHandler *>(glfwGetWindowUserPointer(window));
    if (handler)
        handler->keyEvent(key, scancode, action, mods);
}