Fixed crash when closing image panel that is still processing

see issue 671
This commit is contained in:
Oliver Duis
2011-06-11 10:28:00 +02:00
parent 73347b5f87
commit 72923977dd
3 changed files with 33 additions and 3 deletions

View File

@@ -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);
} }

View File

@@ -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;
}; };

View File

@@ -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 ();