From 98efaa5f1b36e840c4b6b2603084442c788a5e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 26 Jan 2018 16:46:22 +0100 Subject: [PATCH] Avoid deadlock by shifting GUI update to idle thread (#4224) --- rtgui/toolpanelcoord.cc | 68 +++++++++++++++++++++++++++++------------ rtgui/toolpanelcoord.h | 3 ++ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index e9cb3ea43..00582942c 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -253,6 +253,7 @@ void ToolPanelCoordinator::addPanel (Gtk::Box* where, FoldableToolPanel* panel, ToolPanelCoordinator::~ToolPanelCoordinator () { + idle_register.destroy(); closeImage (); @@ -262,29 +263,58 @@ ToolPanelCoordinator::~ToolPanelCoordinator () void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans) { - GThreadLock lock; - if (isRaw) { - rawPanelSW->set_sensitive (true); - if (isBayer) { - sensorxtrans->FoldableToolPanel::hide(); - sensorbayer->FoldableToolPanel::show(); - preprocess->FoldableToolPanel::show(); - flatfield->FoldableToolPanel::show(); - } else if (isXtrans) { - sensorxtrans->FoldableToolPanel::show(); - sensorbayer->FoldableToolPanel::hide(); - preprocess->FoldableToolPanel::show(); - flatfield->FoldableToolPanel::show(); - } else { - sensorbayer->FoldableToolPanel::hide(); - sensorxtrans->FoldableToolPanel::hide(); - preprocess->FoldableToolPanel::hide(); - flatfield->FoldableToolPanel::hide(); + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (true); + self->sensorxtrans->FoldableToolPanel::hide(); + self->sensorbayer->FoldableToolPanel::show(); + self->preprocess->FoldableToolPanel::show(); + self->flatfield->FoldableToolPanel::show(); + + return FALSE; + }; + idle_register.add(func, this); + } + else if (isXtrans) { + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (true); + self->sensorxtrans->FoldableToolPanel::show(); + self->sensorbayer->FoldableToolPanel::hide(); + self->preprocess->FoldableToolPanel::show(); + self->flatfield->FoldableToolPanel::show(); + + return FALSE; + }; + idle_register.add(func, this); + } + else { + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (true); + self->sensorbayer->FoldableToolPanel::hide(); + self->sensorxtrans->FoldableToolPanel::hide(); + self->preprocess->FoldableToolPanel::hide(); + self->flatfield->FoldableToolPanel::hide(); + + return FALSE; + }; + idle_register.add(func, this); } } else { - rawPanelSW->set_sensitive (false); + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (false); + + return FALSE; + }; + idle_register.add(func, this); } } diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index c6d2e6380..b387ac988 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -301,6 +301,9 @@ public: void editModeSwitchedOff (); void setEditProvider (EditDataProvider *provider); + +private: + IdleRegister idle_register; }; #endif