Fixed crash when closing image panel that is still processing
see issue 671
This commit is contained in:
@@ -29,7 +29,8 @@
|
|||||||
|
|
||||||
using namespace rtengine::procparams;
|
using namespace rtengine::procparams;
|
||||||
|
|
||||||
EditorPanel::EditorPanel (FilePanel* filePanel) : beforePreviewHandler(NULL), beforeIarea(NULL), parent(NULL), beforeIpc(NULL), ipc(NULL), catalogPane(NULL) {
|
EditorPanel::EditorPanel (FilePanel* filePanel)
|
||||||
|
: beforePreviewHandler(NULL), beforeIarea(NULL), parent(NULL), beforeIpc(NULL), ipc(NULL), catalogPane(NULL), isProcessing(false) {
|
||||||
|
|
||||||
epih = new EditorPanelIdleHelper;
|
epih = new EditorPanelIdleHelper;
|
||||||
epih->epanel = this;
|
epih->epanel = this;
|
||||||
@@ -365,6 +366,9 @@ void EditorPanel::on_realize () {
|
|||||||
void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) {
|
void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) {
|
||||||
|
|
||||||
close();
|
close();
|
||||||
|
|
||||||
|
isProcessing=true; // prevents closing-on-init
|
||||||
|
|
||||||
// initialize everything
|
// initialize everything
|
||||||
openThm = tmb;
|
openThm = tmb;
|
||||||
openThm->increaseRef ();
|
openThm->increaseRef ();
|
||||||
@@ -575,12 +579,12 @@ void EditorPanel::setProgressStr (Glib::ustring str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This is only called from the ThreadUI, so within the gtk thread
|
// This is only called from the ThreadUI, so within the gtk thread
|
||||||
void EditorPanel::refreshProcessingState (bool inProcessing) {
|
void EditorPanel::refreshProcessingState (bool inProcessingP) {
|
||||||
spparams *s=new spparams;
|
spparams *s=new spparams;
|
||||||
s->pProgress = progressLabel;
|
s->pProgress = progressLabel;
|
||||||
s->gtkEnter = false;
|
s->gtkEnter = false;
|
||||||
|
|
||||||
if (inProcessing) {
|
if (inProcessingP) {
|
||||||
if (processingStartedTime==0) processingStartedTime = ::time(NULL);
|
if (processingStartedTime==0) processingStartedTime = ::time(NULL);
|
||||||
|
|
||||||
s->str = "PROGRESSBAR_PROCESSING";
|
s->str = "PROGRESSBAR_PROCESSING";
|
||||||
@@ -607,6 +611,8 @@ void EditorPanel::refreshProcessingState (bool inProcessing) {
|
|||||||
s->val = 1.0;
|
s->val = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isProcessing=inProcessingP;
|
||||||
|
|
||||||
_setprogressStr(s);
|
_setprogressStr(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -118,6 +118,9 @@ class EditorPanel : public Gtk::VBox,
|
|||||||
|
|
||||||
sigc::connection ShowHideSidePanelsconn;
|
sigc::connection ShowHideSidePanelsconn;
|
||||||
|
|
||||||
|
bool isProcessing;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EditorPanel (FilePanel* filePanel = NULL);
|
EditorPanel (FilePanel* filePanel = NULL);
|
||||||
@@ -173,6 +176,8 @@ class EditorPanel : public Gtk::VBox,
|
|||||||
Glib::ustring getFileName ();
|
Glib::ustring getFileName ();
|
||||||
bool handleShortcutKey (GdkEventKey* event);
|
bool handleShortcutKey (GdkEventKey* event);
|
||||||
|
|
||||||
|
bool getIsProcessing() const { return isProcessing; }
|
||||||
|
|
||||||
Gtk::Paned *catalogPane;
|
Gtk::Paned *catalogPane;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -273,6 +273,8 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RTWindow::remEditorPanel (EditorPanel* ep) {
|
void RTWindow::remEditorPanel (EditorPanel* ep) {
|
||||||
|
if (ep->getIsProcessing()) return; // Will crash if destroyed while loading
|
||||||
|
|
||||||
if (EditWindow::isMultiDisplayEnabled()) {
|
if (EditWindow::isMultiDisplayEnabled()) {
|
||||||
EditWindow * wndEdit = EditWindow::getInstance(this);
|
EditWindow * wndEdit = EditWindow::getInstance(this);
|
||||||
wndEdit->remEditorPanel(ep);
|
wndEdit->remEditorPanel(ep);
|
||||||
@@ -347,6 +349,23 @@ void RTWindow::addBatchQueueJobs (std::vector<BatchQueueEntry*> &entries) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool RTWindow::on_delete_event(GdkEventAny* event) {
|
bool RTWindow::on_delete_event(GdkEventAny* event) {
|
||||||
|
// Check if any editor is still processing, and do NOT quit if so. Otherwise crashes and inconsistent caches
|
||||||
|
bool isProcessing=false;
|
||||||
|
|
||||||
|
if (isSingleTabMode() || simpleEditor)
|
||||||
|
isProcessing=epanel->getIsProcessing();
|
||||||
|
else {
|
||||||
|
int pageCount=mainNB->get_n_pages();
|
||||||
|
|
||||||
|
// First and second are file browser and batch queue
|
||||||
|
if (pageCount>2) {
|
||||||
|
for (int i=2;i<pageCount;i++)
|
||||||
|
isProcessing |= ((EditorPanel*)mainNB->get_nth_page(i))->getIsProcessing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isProcessing) return true;
|
||||||
|
|
||||||
|
|
||||||
if( fpanel )
|
if( fpanel )
|
||||||
fpanel->saveOptions ();
|
fpanel->saveOptions ();
|
||||||
|
Reference in New Issue
Block a user