From 0555361a5789eddf419e2b0a08f30eeba003b976 Mon Sep 17 00:00:00 2001 From: Bruno Date: Tue, 27 Jul 2021 20:05:39 +0200 Subject: [PATCH] BugFix glfw set Window Title Function is not thread safe, causing crash when saving. --- Mixer.cpp | 9 +++++---- Mixer.h | 1 + RenderingManager.cpp | 9 ++++++--- RenderingManager.h | 6 ++++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Mixer.cpp b/Mixer.cpp index 578502d..9a12a76 100644 --- a/Mixer.cpp +++ b/Mixer.cpp @@ -54,7 +54,7 @@ static void saveSession(const std::string& filename, Session *session) // set session filename session->setFilename(filename); // cosmetics saved ok - Rendering::manager().mainWindow().setTitle(filename); + Rendering::manager().setMainWindowTitle(filename); Settings::application.recentSessions.push(filename); Log::Notify("Session %s saved.", filename.c_str()); @@ -67,7 +67,8 @@ static void saveSession(const std::string& filename, Session *session) session->unlock(); } -Mixer::Mixer() : session_(nullptr), back_session_(nullptr), current_view_(nullptr), dt_(0.f), dt__(0.f) +Mixer::Mixer() : session_(nullptr), back_session_(nullptr), sessionSwapRequested_(false), + current_view_(nullptr), dt_(0.f), dt__(0.f) { // unsused initial empty session session_ = new Session; @@ -141,8 +142,8 @@ void Mixer::update() // swap front and back sessions swap(); ++View::need_deep_update_; - // set session filename - Rendering::manager().mainWindow().setTitle(session_->filename()); + // inform new session filename + Rendering::manager().setMainWindowTitle(session_->filename()); Settings::application.recentSessions.push(session_->filename()); } } diff --git a/Mixer.h b/Mixer.h index 7000886..88ad30e 100644 --- a/Mixer.h +++ b/Mixer.h @@ -122,6 +122,7 @@ protected: Session *back_session_; std::list garbage_; bool sessionSwapRequested_; + bool sessionNameChanged_; void swap(); SourceList candidate_sources_; diff --git a/RenderingManager.cpp b/RenderingManager.cpp index 39f5f82..cfd70b6 100644 --- a/RenderingManager.cpp +++ b/RenderingManager.cpp @@ -278,8 +278,6 @@ void Rendering::pushBackDrawCallback(RenderingCallback function) void Rendering::draw() { -// guint64 _time = gst_util_get_timestamp (); - // operate on main window context main_.makeCurrent(); @@ -335,6 +333,11 @@ void Rendering::draw() g_timer_start(timer); } + // change main window title if requested + if (!main_new_title_.empty()) { + main_.setTitle(main_new_title_); + main_new_title_.clear(); + } } @@ -487,7 +490,7 @@ void RenderingWindow::setTitle(const std::string &title) { std::string fulltitle = Settings::application.windows[index_].name; if ( !title.empty() ) - fulltitle += " -- " + title; + fulltitle = std::string(APP_NAME) + " -- " + title; glfwSetWindowTitle(window_, fulltitle.c_str()); } diff --git a/RenderingManager.h b/RenderingManager.h index 76355dc..4527c5a 100644 --- a/RenderingManager.h +++ b/RenderingManager.h @@ -29,6 +29,7 @@ class RenderingWindow GLFWwindow *window_, *master_; RenderingAttrib window_attributes_; + std::string title_changed_; int index_; float dpi_scale_; @@ -106,9 +107,8 @@ public: // Initialization OpenGL and GLFW window creation bool init(); - + // show windows and reset views void show(); - // true if active rendering window bool isActive(); // draw one frame @@ -131,6 +131,7 @@ public: // get hold on the windows inline RenderingWindow& mainWindow() { return main_; } inline RenderingWindow& outputWindow() { return output_; } + inline void setMainWindowTitle(const std::string t) { main_new_title_ = t; } // request screenshot void requestScreenshot(); @@ -160,6 +161,7 @@ private: std::list draw_callbacks_; RenderingWindow main_; + std::string main_new_title_; RenderingWindow output_; // file drop callback