diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 8d6572af94..7d2ffdcabb 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -272,8 +272,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S //FIXME it seems this method is not called on application start-up, at least not on Windows. Why? // The same applies to wxEVT_CREATE, it is not being called on startup on Windows. Bind(wxEVT_ACTIVATE, [this](wxActivateEvent& event) { - if (m_plater != nullptr && event.GetActive()) - m_plater->on_activate(); + if (m_plater != nullptr) + m_plater->on_activate(event.GetActive()); event.Skip(); }); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6428d299dc..7fe362f5ea 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6300,9 +6300,12 @@ void Plater::force_print_bed_update() p->config->opt_string("printer_model", true) = "\x01\x00\x01"; } -void Plater::on_activate() +void Plater::on_activate(bool active) { - this->p->show_delayed_error_message(); + this->p->user_account->on_activate_window(active); + if (active) { + this->p->show_delayed_error_message(); + } } // Get vector of extruder colors considering filament color, if extruder color is undefined. diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 5c113a394f..28c33b13c3 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -253,7 +253,7 @@ public: void force_filament_cb_update(); void force_print_bed_update(); // On activating the parent window. - void on_activate(); + void on_activate(bool active); std::vector get_extruder_colors_from_plater_config(const GCodeProcessorResult* const result = nullptr) const; std::vector get_colors_for_color_print(const GCodeProcessorResult* const result = nullptr) const; diff --git a/src/slic3r/GUI/UserAccount.hpp b/src/slic3r/GUI/UserAccount.hpp index bfcdae5521..533fdff970 100644 --- a/src/slic3r/GUI/UserAccount.hpp +++ b/src/slic3r/GUI/UserAccount.hpp @@ -58,6 +58,8 @@ public: bool on_connect_printers_success(const std::string& data, AppConfig* app_config, bool& out_printers_changed); bool on_connect_uiid_map_success(const std::string& data, AppConfig* app_config, bool& out_printers_changed); + void on_activate_window(bool active) { m_communication->on_activate_window(active); } + std::string get_username() const { return m_username; } std::string get_access_token(); std::string get_shared_session_key(); diff --git a/src/slic3r/GUI/UserAccountCommunication.cpp b/src/slic3r/GUI/UserAccountCommunication.cpp index 611bd18159..2796ae525e 100644 --- a/src/slic3r/GUI/UserAccountCommunication.cpp +++ b/src/slic3r/GUI/UserAccountCommunication.cpp @@ -360,6 +360,10 @@ void UserAccountCommunication::init_session_thread() if (m_thread_stop) // Stop the worker thread. break; + // Do not process_action_queue if window is not active and thread was not forced to wakeup + if (!m_window_is_active && !m_thread_wakeup) { + continue; + } m_thread_wakeup = false; { std::lock_guard lock(m_session_mutex); @@ -369,6 +373,12 @@ void UserAccountCommunication::init_session_thread() }); } +void UserAccountCommunication::on_activate_window(bool active) +{ + std::lock_guard lck(m_thread_stop_mutex); + m_window_is_active = active; +} + void UserAccountCommunication::wakeup_session_thread() { { diff --git a/src/slic3r/GUI/UserAccountCommunication.hpp b/src/slic3r/GUI/UserAccountCommunication.hpp index 114bfa977b..b630b95ec2 100644 --- a/src/slic3r/GUI/UserAccountCommunication.hpp +++ b/src/slic3r/GUI/UserAccountCommunication.hpp @@ -51,6 +51,7 @@ public: // Exchanges code for tokens and shared_session_key void on_login_code_recieved(const std::string& url_message); + void on_activate_window(bool active); void set_username(const std::string& username); void set_remember_session(bool b); @@ -71,6 +72,7 @@ private: std::condition_variable m_thread_stop_condition; bool m_thread_stop { false }; bool m_thread_wakeup{ false }; + bool m_window_is_active{ true }; std::string m_code_verifier; wxEvtHandler* m_evt_handler; AppConfig* m_app_config;