Callback method von GLFW window beim Schliessen (glfwSetWindowCloseCallback)



  • Hey Leute!
    Ist es moeglich die GLFW Funktion

    glfwSetWindowCloseCallback (GLFWwindow *window, GLFWwindowclosefun cbfun)
    

    http://www.glfw.org/docs/latest/group__window.html#gaade9264e79fae52bdb78e2df11ee8d6a

    mit einem Callback in einer Klasse so aufzurufen, dass man im Callback auf die Klassen-Memberattribute zugreifen kann?

    In meinem konkreten Beispiel:

    class Frame
    {
    public:
    	Frame()
    	{
    		glfwSetWindowCloseCallback(m_window, [this](GLFWwindow* m_window) { this->setWindowShouldClose(true) });
    		// Das Probkem ist das "[this]", da glfwSetWindowCloseCallback dies nicht zulaesst.
    	}
    
    	~Frame(){}
    
    	GLFWwindow* m_window;
    
    	 // glfwSetWindowShouldClose ist fuer mich keine Option!
    	inline void setWindowShouldClose(bool windowShouldClose) { m_windowShouldClose = true; }
    	inline bool windowShouldClose() const { return m_windowShouldClose; }
    
    private:
    	bool m_windowShouldClose;
    }
    

    Kann ich irgendwie eine Referenz auf das Frame Object an die Callback Funktion uebergeben, ohne gegen die glfwSetWindowCloseCallback Funktionsdefinition zu verstossen? (statische Member sind keine Option!)

    Danke fier eure Hilfe!



  • Da GLFW keine 'UserData'-Parameter unterstützt, geht das direkt nicht.
    Wenn du nur ein Frame-Objekt hast, dann kannst du einfach ein statisches Frame-Objekt anlegen und mittels diesem darauf zugreifen.
    Bei mehreren Frame-Objekten kannst du eine statische Map dafür anlegen:

    static std::map<GLFWwindow*, Frame*> mapFrames;
    

    und vor dem Callback füllen

    mapFrames.Add(m_window, this);
    

    Und in der (statischen) Callback-Funktion entsprechend auslesen:

    Frame *frame = mapFrames[window];
    


  • Th69 schrieb:

    Da GLFW keine 'UserData'-Parameter unterstützt, geht das direkt nicht.
    Wenn du nur ein Frame-Objekt hast, dann kannst du einfach ein statisches Frame-Objekt anlegen und mittels diesem darauf zugreifen.
    Bei mehreren Frame-Objekten kannst du eine statische Map dafür anlegen:

    Okay, das mit der statischen Map duerfte funktionieren.
    Danke fuer den Loesungsansatz, allein waer ich da wahrscheinlich nicht mehr drauf gekommen. 🙂 👍



  • Habe jetzt eine schönere Lösung gefunden, die ohne statische std::map funktioniert!
    Wenn man eine eigene Window class hat, die den Code von GLFW abstrahiert, kann man einen Pointer zur Instanz des eigenen Windows and das GLFWwindow koppeln.

    Dazu verwendet man:

    // void glfwSetWindowUserPointer(GLFWwindow*, OwnWindowClass*);
    glfwSetWindowUserPointer(m_window, this);
    

    Eigene Window-Class-Instanz zurückerhalten:

    // void* glfwGetWindowUserPointer(GLFWwindow*);
    OwnWindowClass* ownWindow = glfwGetWindowUserPointer(m_window);
    


  • @rnholzinger01 Hab ich auch so

    glfwSetWindowUserPointer(window, this);

    Sehe aber gerade, dass ich in den "statischen Callbacks" bisher Membervariablen gar nicht brauche.
    Sehe aber gerade, dass ich Membervariablen bisher gar nicht brauche.

    Praktisch finde ich mit OpenGL auch glEnable(GL_DEBUG_OUTPUT) auch mit Callback Funktionspointer glDebugMessageCallback(&DebugCallback, this)

    Was sind denn dass für Membervariablen die du beim schliessen brauchst? Habe zwar auch eine Klasse für GLFW geschrieben, habe aber nur GLFWwindow* window als Membervariable. Sonst brauche ich nur gl... Funktionen und glew wird noch initialisiert.