Multiple Editor Tabs in separate window: crash when closing tab while (image update) processing is running, Issue 2587
This commit is contained in:
@@ -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
|
||||
|
@@ -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 () {
|
||||
|
@@ -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){
|
||||
|
@@ -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 {
|
||||
{
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user