Solving issue 2324: "Crash when creating detail window" / Credits: Ingo, Hombre
This commit is contained in:
@@ -47,11 +47,12 @@ Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider)
|
|||||||
Crop::~Crop () {
|
Crop::~Crop () {
|
||||||
|
|
||||||
MyMutex::MyLock cropLock(cropMutex);
|
MyMutex::MyLock cropLock(cropMutex);
|
||||||
MyMutex::MyLock processingLock(parent->mProcessing);
|
|
||||||
|
|
||||||
std::vector<Crop*>::iterator i = std::find (parent->crops.begin(), parent->crops.end(), this);
|
std::vector<Crop*>::iterator i = std::find (parent->crops.begin(), parent->crops.end(), this);
|
||||||
if (i!=parent->crops.end ())
|
if (i!=parent->crops.end ())
|
||||||
parent->crops.erase (i);
|
parent->crops.erase (i);
|
||||||
|
|
||||||
|
MyMutex::MyLock processingLock(parent->mProcessing);
|
||||||
freeAll ();
|
freeAll ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,7 +45,8 @@ CropHandler::~CropHandler () {
|
|||||||
|
|
||||||
setEnabled (false);
|
setEnabled (false);
|
||||||
if (crop) {
|
if (crop) {
|
||||||
crop->destroy ();
|
//crop->destroy ();
|
||||||
|
delete crop; // will do the same than destroy, plus delete the object
|
||||||
crop = NULL;
|
crop = NULL;
|
||||||
}
|
}
|
||||||
cimg.lock ();
|
cimg.lock ();
|
||||||
|
@@ -459,8 +459,12 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) {
|
|||||||
|
|
||||||
if (decorated)
|
if (decorated)
|
||||||
buttonSet.releaseNotify (x, y);
|
buttonSet.releaseNotify (x, y);
|
||||||
if (deleted)
|
|
||||||
|
if (deleted) {
|
||||||
|
iarea->flawnOverWindow = NULL;
|
||||||
|
delete this;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
state = SNormal;
|
state = SNormal;
|
||||||
iarea->grabFocus (NULL);
|
iarea->grabFocus (NULL);
|
||||||
|
@@ -382,8 +382,9 @@ void ImageArea::addCropWindow () {
|
|||||||
cw->setPosition (col*get_width()/K + hBorder/2 + layer*30, row*get_height()/K + vBorder/2 + layer*30);
|
cw->setPosition (col*get_width()/K + hBorder/2 + layer*30, row*get_height()/K + vBorder/2 + layer*30);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cw->setPosition (lastClosedX, lastClosedY);
|
|
||||||
cw->setSize(lastClosedW, lastClosedH);
|
cw->setSize(lastClosedW, lastClosedH);
|
||||||
|
cw->setPosition (lastClosedX, lastClosedY);
|
||||||
|
lastClosedX = -1;
|
||||||
}
|
}
|
||||||
int x0,y0,w,h,wc,hc;
|
int x0,y0,w,h,wc,hc;
|
||||||
mainCropWindow->getCropRectangle(x0,y0,w,h );
|
mainCropWindow->getCropRectangle(x0,y0,w,h );
|
||||||
@@ -414,7 +415,6 @@ void ImageArea::cropWindowClosed (CropWindow* cw) {
|
|||||||
std::list<CropWindow*>::iterator i = std::find (cropWins.begin(), cropWins.end(), cw);
|
std::list<CropWindow*>::iterator i = std::find (cropWins.begin(), cropWins.end(), cw);
|
||||||
if (i!=cropWins.end())
|
if (i!=cropWins.end())
|
||||||
cropWins.erase (i);
|
cropWins.erase (i);
|
||||||
delete cw;
|
|
||||||
if (!cropWins.empty())
|
if (!cropWins.empty())
|
||||||
mainCropWindow->setObservedCropWin (cropWins.front());
|
mainCropWindow->setObservedCropWin (cropWins.front());
|
||||||
else
|
else
|
||||||
|
@@ -55,7 +55,6 @@ class ImageArea : public Gtk::DrawingArea, public CropWindowListener, public Edi
|
|||||||
|
|
||||||
bool dirty;
|
bool dirty;
|
||||||
CropWindow* focusGrabber;
|
CropWindow* focusGrabber;
|
||||||
CropWindow* flawnOverWindow;
|
|
||||||
CropGUIListener* cropgl;
|
CropGUIListener* cropgl;
|
||||||
PointerMotionListener* pmlistener;
|
PointerMotionListener* pmlistener;
|
||||||
PointerMotionListener* pmhlistener;
|
PointerMotionListener* pmhlistener;
|
||||||
@@ -65,6 +64,7 @@ class ImageArea : public Gtk::DrawingArea, public CropWindowListener, public Edi
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
CropWindow* mainCropWindow;
|
CropWindow* mainCropWindow;
|
||||||
|
CropWindow* flawnOverWindow;
|
||||||
ZoomPanel* zoomPanel;
|
ZoomPanel* zoomPanel;
|
||||||
IndicateClippedPanel* indClippedPanel;
|
IndicateClippedPanel* indClippedPanel;
|
||||||
PreviewModePanel* previewModePanel;
|
PreviewModePanel* previewModePanel;
|
||||||
|
Reference in New Issue
Block a user