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;
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->epanel = this;
@@ -365,6 +366,9 @@ void EditorPanel::on_realize () {
void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) {
close();
isProcessing=true; // prevents closing-on-init
// initialize everything
openThm = tmb;
openThm->increaseRef ();
@@ -575,12 +579,12 @@ void EditorPanel::setProgressStr (Glib::ustring str)
}
// 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;
s->pProgress = progressLabel;
s->gtkEnter = false;
if (inProcessing) {
if (inProcessingP) {
if (processingStartedTime==0) processingStartedTime = ::time(NULL);
s->str = "PROGRESSBAR_PROCESSING";
@@ -607,6 +611,8 @@ void EditorPanel::refreshProcessingState (bool inProcessing) {
s->val = 1.0;
}
isProcessing=inProcessingP;
_setprogressStr(s);
}

View File

@@ -118,6 +118,9 @@ class EditorPanel : public Gtk::VBox,
sigc::connection ShowHideSidePanelsconn;
bool isProcessing;
public:
EditorPanel (FilePanel* filePanel = NULL);
@@ -173,6 +176,8 @@ class EditorPanel : public Gtk::VBox,
Glib::ustring getFileName ();
bool handleShortcutKey (GdkEventKey* event);
bool getIsProcessing() const { return isProcessing; }
Gtk::Paned *catalogPane;
};

View File

@@ -273,6 +273,8 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) {
}
void RTWindow::remEditorPanel (EditorPanel* ep) {
if (ep->getIsProcessing()) return; // Will crash if destroyed while loading
if (EditWindow::isMultiDisplayEnabled()) {
EditWindow * wndEdit = EditWindow::getInstance(this);
wndEdit->remEditorPanel(ep);
@@ -347,6 +349,23 @@ void RTWindow::addBatchQueueJobs (std::vector<BatchQueueEntry*> &entries) {
}
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 )
fpanel->saveOptions ();