From fb6861e481310dc172e16453684fd6150356b3d5 Mon Sep 17 00:00:00 2001 From: Ingo Date: Thu, 27 Nov 2014 19:49:08 +0100 Subject: [PATCH] Multiple Editor Tabs in separate window: crash when closing tab while (image update) processing is running, Issue 2587 --- rtdata/languages/default | 2 +- rtgui/editorpanel.cc | 63 +++++++++++++++++++++------------------- rtgui/editwindow.cc | 21 +++++++------- rtgui/filepanel.cc | 2 +- rtgui/rtwindow.cc | 6 ++-- rtgui/rtwindow.h | 2 +- 6 files changed, 50 insertions(+), 46 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 1cc7655e6..7dd6b7b4b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -826,7 +826,7 @@ PREFERENCES_MENUOPTIONS;Context Menu Options PREFERENCES_METADATA;Metadata PREFERENCES_MIN;Mini (100x115) PREFERENCES_MONITORICC;Monitor color profile -PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs Mode (if available on second monitor) +PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode PREFERENCES_MULTITAB;Multiple Editor Tabs Mode PREFERENCES_NAVGUIDEBRUSH;Navigator guide color PREFERENCES_NOISE;Noise Reduction diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index ed197b165..27454f500 100755 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -224,30 +224,31 @@ EditorPanel::EditorPanel (FilePanel* filePanel) // Zoom panel iops->pack_end (*iareapanel->imageArea->zoomPanel, Gtk::PACK_SHRINK, 1); iops->pack_end (*vsepz3, Gtk::PACK_SHRINK, 2); - - // Navigation buttons - Gtk::Image *navPrevImage = Gtk::manage (new RTImage ("nav-prev.png")); - navPrevImage->set_padding(0,0); - navPrev = Gtk::manage (new Gtk::Button ()); - navPrev->add(*navPrevImage); - navPrev->set_relief(Gtk::RELIEF_NONE); - navPrev->set_tooltip_markup(M("MAIN_BUTTON_NAVPREV_TOOLTIP")); - - Gtk::Image *navNextImage = Gtk::manage (new RTImage ("nav-next.png")); - navNextImage->set_padding(0,0); - navNext = Gtk::manage (new Gtk::Button ()); - navNext->add(*navNextImage); - navNext->set_relief(Gtk::RELIEF_NONE); - navNext->set_tooltip_markup(M("MAIN_BUTTON_NAVNEXT_TOOLTIP")); - - Gtk::Image *navSyncImage = Gtk::manage (new RTImage ("nav-sync.png")); - navSyncImage->set_padding(0,0); - navSync = Gtk::manage (new Gtk::Button ()); - navSync->add(*navSyncImage); - navSync->set_relief(Gtk::RELIEF_NONE); - navSync->set_tooltip_markup(M("MAIN_BUTTON_NAVSYNC_TOOLTIP")); - + + navPrev = navNext = navSync = NULL; if (!simpleEditor && !options.tabbedUI){ + // Navigation buttons + Gtk::Image *navPrevImage = Gtk::manage (new RTImage ("nav-prev.png")); + navPrevImage->set_padding(0,0); + navPrev = Gtk::manage (new Gtk::Button ()); + navPrev->add(*navPrevImage); + navPrev->set_relief(Gtk::RELIEF_NONE); + navPrev->set_tooltip_markup(M("MAIN_BUTTON_NAVPREV_TOOLTIP")); + + Gtk::Image *navNextImage = Gtk::manage (new RTImage ("nav-next.png")); + navNextImage->set_padding(0,0); + navNext = Gtk::manage (new Gtk::Button ()); + navNext->add(*navNextImage); + navNext->set_relief(Gtk::RELIEF_NONE); + navNext->set_tooltip_markup(M("MAIN_BUTTON_NAVNEXT_TOOLTIP")); + + Gtk::Image *navSyncImage = Gtk::manage (new RTImage ("nav-sync.png")); + navSyncImage->set_padding(0,0); + navSync = Gtk::manage (new Gtk::Button ()); + navSync->add(*navSyncImage); + navSync->set_relief(Gtk::RELIEF_NONE); + navSync->set_tooltip_markup(M("MAIN_BUTTON_NAVSYNC_TOOLTIP")); + iops->pack_end (*Gtk::manage(new Gtk::VSeparator()), Gtk::PACK_SHRINK, 0); iops->pack_end (*navNext, Gtk::PACK_SHRINK, 0); iops->pack_end (*navSync, Gtk::PACK_SHRINK, 0); @@ -325,14 +326,16 @@ EditorPanel::EditorPanel (FilePanel* filePanel) tbRightPanel_1->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::tbRightPanel_1_toggled) ); saveimgas->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::saveAsPressed) ); queueimg->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::queueImgPressed) ); - sendtogimp->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::sendToGimpPressed) ); - navPrev->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::openPreviousEditorImage) ); - navNext->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::openNextEditorImage) ); - navSync->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::syncFileBrowser) ); - + sendtogimp->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::sendToGimpPressed) ); + if(navPrev) + navPrev->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::openPreviousEditorImage) ); + if(navNext) + navNext->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::openNextEditorImage) ); + if(navSync) + navSync->signal_pressed().connect( sigc::mem_fun(*this, &EditorPanel::syncFileBrowser) ); ShowHideSidePanelsconn = tbShowHideSidePanels->signal_toggled().connect ( sigc::mem_fun(*this, &EditorPanel::toggleSidePanels), true); - if (tbTopPanel_1) - tbTopPanel_1->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::tbTopPanel_1_toggled) ); + if (tbTopPanel_1) + tbTopPanel_1->signal_toggled().connect( sigc::mem_fun(*this, &EditorPanel::tbTopPanel_1_toggled) ); } EditorPanel::~EditorPanel () { diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index f7adb964a..af0e722ac 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -35,20 +35,18 @@ bool EditWindow::isMultiDisplayEnabled() { EditWindow* EditWindow::getInstance(RTWindow* p) { - if ( editWnd == NULL ) - { + if (editWnd == NULL) { static MyMutex smutex_; MyMutex::MyLock lock(smutex_); - if ( editWnd == 0 ) - { + if ( editWnd == 0 ) { editWnd = new EditWindow(p); // Determine the other display and maximize the window on that const Glib::RefPtr< Gdk::Window >& wnd=p->get_window(); int monNo=p->get_screen()->get_monitor_at_window (wnd); - Gdk::Rectangle lMonitorRect; - editWnd->get_screen()->get_monitor_geometry(monNo==0 ? 1:0, lMonitorRect); + Gdk::Rectangle lMonitorRect; + editWnd->get_screen()->get_monitor_geometry(isMultiDisplayEnabled() ? (monNo==0 ? 1 : 0) : monNo, lMonitorRect); editWnd->move(lMonitorRect.get_x(), lMonitorRect.get_y()); editWnd->maximize(); editWnd->show(); @@ -158,7 +156,10 @@ void EditWindow::addEditorPanel (EditorPanel* ep, const std::string &name) { ep->setAspect(); } -void EditWindow::remEditorPanel (EditorPanel* ep) { +void EditWindow::remEditorPanel (EditorPanel* ep) { + if (ep->getIsProcessing()) + return; // Will crash if destroyed while loading + epanels.erase (ep->getFileName()); filesEdited.erase (ep->getFileName ()); parent->fpanel->refreshEditedState (filesEdited); @@ -220,8 +221,8 @@ bool EditWindow::on_delete_event(GdkEventAny* event) { if (epanels[*iter]->getIsProcessing()) isProcessing=true; } - if (isProcessing) return false; - + if (isProcessing) + return true; for ( std::set ::iterator iter = filesEdited.begin(); iter != filesEdited.end(); iter++ ) mainNB->remove_page (*epanels[*iter]); @@ -232,7 +233,7 @@ bool EditWindow::on_delete_event(GdkEventAny* event) { parent->fpanel->refreshEditedState (filesEdited); hide (); - return true; + return false; } void EditWindow::set_title_decorated(Glib::ustring fname){ diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index aff48b83c..21118327f 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -211,7 +211,7 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnectoraddEditorPanel (epanel,pl->thm->getFileName()); } epanel->open(pl->thm, pl->pc->returnValue() ); - if (!EditWindow::isMultiDisplayEnabled()) + if (!(options.multiDisplayMode>0)) parent->set_title_decorated(pl->thm->getFileName()); } else { { diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 21c732437..057db0bf9 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -389,7 +389,7 @@ void RTWindow::on_mainNB_switch_page(GtkNotebookPage* page, guint page_num) { } void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) { - if (EditWindow::isMultiDisplayEnabled()) { + if (options.multiDisplayMode>0) { EditWindow * wndEdit = EditWindow::getInstance(this); wndEdit->show_all(); wndEdit->addEditorPanel(ep,name); @@ -432,7 +432,7 @@ 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()) { + if (options.multiDisplayMode>0) { EditWindow * wndEdit = EditWindow::getInstance(this); wndEdit->remEditorPanel(ep); } else { @@ -456,7 +456,7 @@ void RTWindow::remEditorPanel (EditorPanel* ep) { } bool RTWindow::selectEditorPanel(const std::string &name) { - if (EditWindow::isMultiDisplayEnabled()) { + if (options.multiDisplayMode>0) { EditWindow * wndEdit = EditWindow::getInstance(this); if (wndEdit->selectEditorPanel(name)) { set_title_decorated(name); diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 05a1abe6d..53d09bd17 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -47,7 +47,7 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{ Gtk::Image *iFullscreen, *iFullscreen_exit; - bool isSingleTabMode() { return !options.tabbedUI && !EditWindow::isMultiDisplayEnabled(); }; + bool isSingleTabMode() { return !options.tabbedUI && !(options.multiDisplayMode>0); }; void findVerNumbers(int* numbers, Glib::ustring versionStr); bool on_expose_event_epanel(GdkEventExpose* event);