Multiple Editor Tabs in separate window: crash when closing tab while (image update) processing is running, Issue 2587

This commit is contained in:
Ingo
2014-11-27 19:49:08 +01:00
parent c381db2f1f
commit fb6861e481
6 changed files with 50 additions and 46 deletions

View File

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

View File

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

View File

@@ -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 <Glib::ustring>::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){

View File

@@ -211,7 +211,7 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::Initial
parent->addEditorPanel (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 {
{

View File

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

View File

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