GTK threads cleanup

This commit is contained in:
Oliver Duis
2011-07-04 08:11:34 +02:00
parent a24cba937d
commit 44d1d18b3c
20 changed files with 108 additions and 216 deletions

View File

@@ -22,6 +22,7 @@
#include <multilangmgr.h> #include <multilangmgr.h>
#include <rtengine.h> #include <rtengine.h>
#include <options.h> #include <options.h>
#include <guiutils.h>
extern Glib::ustring argv0; extern Glib::ustring argv0;
@@ -258,10 +259,9 @@ Glib::ustring Adjuster::getTextValue () {
bool Adjuster::notifyListener () { bool Adjuster::notifyListener () {
if (adjusterListener!=NULL && !blocked) { if (adjusterListener!=NULL && !blocked) {
gdk_threads_enter(); GThreadLock lock;
adjusterListener->adjusterChanged (this, spin->get_value ()); adjusterListener->adjusterChanged (this, spin->get_value ());
gdk_threads_leave();
} }
return false; return false;
} }
@@ -271,6 +271,7 @@ void Adjuster::setEnabled (bool enabled) {
spin->set_sensitive (enabled); spin->set_sensitive (enabled);
slider->set_sensitive (enabled); slider->set_sensitive (enabled);
} }
void Adjuster::setEditedState (EditedState eState) { void Adjuster::setEditedState (EditedState eState) {
if (editedState!=eState) { if (editedState!=eState) {

View File

@@ -209,12 +209,10 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring filename
return savedParamPath; return savedParamPath;
} }
int deleteitem (void* data) int cancelItemUI (void* data)
{ {
safe_g_remove( ((BatchQueueEntry*)data)->savedParamsFile ); safe_g_remove( ((BatchQueueEntry*)data)->savedParamsFile );
gdk_threads_enter ();
delete (BatchQueueEntry*)data; delete (BatchQueueEntry*)data;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -235,7 +233,7 @@ void BatchQueue::cancelItems (std::vector<ThumbBrowserEntryBase*>* items) {
rtengine::ProcessingJob::destroy (entry->job); rtengine::ProcessingJob::destroy (entry->job);
if (entry->thumbnail) if (entry->thumbnail)
entry->thumbnail->imageRemovedFromQueue (); entry->thumbnail->imageRemovedFromQueue ();
g_idle_add (deleteitem, entry); g_idle_add (cancelItemUI, entry);
} }
} }
for (int i=0; i<fd.size(); i++) for (int i=0; i<fd.size(); i++)
@@ -351,8 +349,8 @@ void BatchQueue::startProcessing () {
} }
rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) { rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) {
GThreadLock lock;
gdk_threads_enter ();
// save image img // save image img
Glib::ustring fname; Glib::ustring fname;
SaveFormat saveFormat; SaveFormat saveFormat;
@@ -443,7 +441,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) {
redraw (); redraw ();
notifyListener (); notifyListener ();
gdk_threads_leave ();
return processing ? processing->job : NULL; return processing ? processing->job : NULL;
} }
@@ -575,11 +573,8 @@ Glib::ustring BatchQueue::autoCompleteFileName (const Glib::ustring& fileName, c
} }
} }
int bqredraw (void* p) { int setProgressUI (void* p) {
gdk_threads_enter ();
((BatchQueue*)p)->redraw(); ((BatchQueue*)p)->redraw();
gdk_threads_leave ();
return 0; return 0;
} }
@@ -588,7 +583,7 @@ void BatchQueue::setProgress (double p) {
if (processing) if (processing)
processing->progress = p; processing->progress = p;
g_idle_add (bqredraw, this); g_idle_add (setProgressUI, this);
} }
void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionData) { void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionData) {
@@ -609,13 +604,10 @@ struct NLParams {
int qsize; int qsize;
}; };
int bqnotifylistener (void* data) { int bqnotifylistenerUI (void* data) {
gdk_threads_enter ();
NLParams* params = (NLParams*)data; NLParams* params = (NLParams*)data;
params->listener->queueSizeChanged (params->qsize); params->listener->queueSizeChanged (params->qsize);
delete params; delete params;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -625,7 +617,7 @@ void BatchQueue::notifyListener () {
NLParams* params = new NLParams; NLParams* params = new NLParams;
params->listener = listener; params->listener = listener;
params->qsize = fd.size(); params->qsize = fd.size();
g_idle_add (bqnotifylistener, params); g_idle_add (bqnotifylistenerUI, params);
} }
} }

View File

@@ -109,7 +109,6 @@ struct BQUpdateParam {
int updateImageUIThread (void* data) { int updateImageUIThread (void* data) {
gdk_threads_enter ();
BQUpdateParam* params = (BQUpdateParam*)data; BQUpdateParam* params = (BQUpdateParam*)data;
BatchQueueEntryIdleHelper* bqih = params->bqih; BatchQueueEntryIdleHelper* bqih = params->bqih;
@@ -122,14 +121,13 @@ int updateImageUIThread (void* data) {
bqih->pending--; bqih->pending--;
delete [] params->img; delete [] params->img;
delete params; delete params;
gdk_threads_leave ();
return 0; return 0;
} }
bqih->bqentry->_updateImage (params->img, params->w, params->h); bqih->bqentry->_updateImage (params->img, params->w, params->h);
bqih->pending--; bqih->pending--;
gdk_threads_leave ();
delete params; delete params;
return 0; return 0;
} }

View File

@@ -436,34 +436,28 @@ void Crop::enabledChanged () {
} }
} }
int notifylistener (void* data) { int notifyListenerUI (void* data) {
gdk_threads_enter ();
((Crop*)data)->notifyListener (); ((Crop*)data)->notifyListener ();
gdk_threads_leave ();
return 0; return 0;
} }
int refreshspins (void* data) { int refreshSpinsUI (void* data) {
gdk_threads_enter ();
RefreshSpinHelper* rsh = (RefreshSpinHelper*) data; RefreshSpinHelper* rsh = (RefreshSpinHelper*) data;
rsh->crop->refreshSpins (rsh->notify); rsh->crop->refreshSpins (rsh->notify);
delete rsh; delete rsh;
gdk_threads_leave ();
return 0; return 0;
} }
void Crop::hFlipCrop () { void Crop::hFlipCrop () {
nx = maxw - nx - nw; nx = maxw - nx - nw;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
} }
void Crop::vFlipCrop () { void Crop::vFlipCrop () {
ny = maxh - ny - nh; ny = maxh - ny - nh;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
} }
void Crop::rotateCrop (int deg) { void Crop::rotateCrop (int deg) {
@@ -493,7 +487,7 @@ void Crop::rotateCrop (int deg) {
} }
lastRotationDeg = deg; lastRotationDeg = deg;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
} }
void Crop::positionChanged () { void Crop::positionChanged () {
@@ -506,7 +500,7 @@ void Crop::positionChanged () {
int W = nw; int W = nw;
int H = nh; int H = nh;
cropMoved (X, Y, W, H); cropMoved (X, Y, W, H);
g_idle_add (notifylistener, this); g_idle_add (notifyListenerUI, this);
} }
void Crop::widthChanged () { void Crop::widthChanged () {
@@ -518,7 +512,7 @@ void Crop::widthChanged () {
int W = (int)w->get_value (); int W = (int)w->get_value ();
int H = nh; int H = nh;
cropWidth2Resized (X, Y, W, H); cropWidth2Resized (X, Y, W, H);
g_idle_add (notifylistener, this); g_idle_add (notifyListenerUI, this);
} }
void Crop::heightChanged () { void Crop::heightChanged () {
@@ -530,7 +524,7 @@ void Crop::heightChanged () {
int W = nw; int W = nw;
int H = (int)h->get_value (); int H = (int)h->get_value ();
cropHeight2Resized (X, Y, W, H); cropHeight2Resized (X, Y, W, H);
g_idle_add (notifylistener, this); g_idle_add (notifyListenerUI, this);
} }
@@ -563,7 +557,7 @@ void Crop::ratioChanged () {
else else
cropHeight2Resized (X, Y, W, H); cropHeight2Resized (X, Y, W, H);
g_idle_add (refreshspins, new RefreshSpinHelper (this, true)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, true));
} }
} }
@@ -628,13 +622,10 @@ struct setdimparams {
int y; int y;
}; };
int setdim (void* data) { int sizeChangedUI (void* data) {
gdk_threads_enter ();
setdimparams* params = (setdimparams*)data; setdimparams* params = (setdimparams*)data;
params->crop->setDimensions (params->x, params->y); params->crop->setDimensions (params->x, params->y);
delete params; delete params;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -644,7 +635,7 @@ void Crop::sizeChanged (int x, int y, int ow, int oh) {
params->x = x; params->x = x;
params->y = y; params->y = y;
params->crop = this; params->crop = this;
g_idle_add (setdim, params); g_idle_add (sizeChangedUI, params);
} }
bool Crop::refreshSpins (bool notify) { bool Crop::refreshSpins (bool notify) {
@@ -697,7 +688,7 @@ void Crop::cropMoved (int &X, int &Y, int &W, int &H) {
nw = W; nw = W;
nh = H; nh = H;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
@@ -727,7 +718,7 @@ void Crop::cropWidth1Resized (int &X, int &Y, int &W, int &H) {
nw = W; nw = W;
nh = H; nh = H;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
@@ -759,7 +750,7 @@ void Crop::cropWidth2Resized (int &X, int &Y, int &W, int &H) {
nw = W; nw = W;
nh = H; nh = H;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
@@ -790,7 +781,7 @@ void Crop::cropHeight1Resized (int &X, int &Y, int &W, int &H) {
nw = W; nw = W;
nh = H; nh = H;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
@@ -821,7 +812,7 @@ void Crop::cropHeight2Resized (int &X, int &Y, int &W, int &H) {
nw = W; nw = W;
nh = H; nh = H;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
@@ -837,7 +828,7 @@ void Crop::cropInit (int &x, int &y, int &w, int &h) {
econn.block (true); econn.block (true);
enabled->set_active (1); enabled->set_active (1);
econn.block (false); econn.block (false);
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
@@ -922,13 +913,13 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2) {
nw = W; nw = W;
nh = H; nh = H;
g_idle_add (refreshspins, new RefreshSpinHelper (this, false)); g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false));
// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins));
} }
void Crop::cropManipReady () { void Crop::cropManipReady () {
g_idle_add (notifylistener, this); g_idle_add (notifyListenerUI, this);
} }
double Crop::getRatio () { double Crop::getRatio () {

View File

@@ -20,6 +20,7 @@
#undef THREAD_PRIORITY_NORMAL #undef THREAD_PRIORITY_NORMAL
#include <cstring> #include <cstring>
#include <guiutils.h>
using namespace rtengine; using namespace rtengine;
@@ -157,7 +158,7 @@ void CropHandler::getPosition (int& x, int& y) {
int createpixbufs (void* data) { int createpixbufs (void* data) {
gdk_threads_enter (); GThreadLock lock;
CropHandlerIdleHelper* chi = (CropHandlerIdleHelper*) data; CropHandlerIdleHelper* chi = (CropHandlerIdleHelper*) data;
if (chi->destroyed) { if (chi->destroyed) {
@@ -165,7 +166,7 @@ int createpixbufs (void* data) {
delete chi; delete chi;
else else
chi->pending--; chi->pending--;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -180,7 +181,6 @@ int createpixbufs (void* data) {
delete [] ch->cropimgtrue; delete [] ch->cropimgtrue;
ch->cropimgtrue = NULL; ch->cropimgtrue = NULL;
ch->cimg.unlock (); ch->cimg.unlock ();
gdk_threads_leave ();
return 0; return 0;
} }
@@ -221,7 +221,6 @@ int createpixbufs (void* data) {
chi->pending--; chi->pending--;
gdk_threads_leave ();
return 0; return 0;
} }

View File

@@ -25,6 +25,7 @@
#include <safegtk.h> #include <safegtk.h>
#include <cstring> #include <cstring>
#include <guiutils.h>
#define CHECKTIME 5000 #define CHECKTIME 5000
extern Glib::ustring argv0; extern Glib::ustring argv0;
@@ -142,7 +143,7 @@ void DirBrowser::updateVolumes () {
int nvolumes = GetLogicalDrives (); int nvolumes = GetLogicalDrives ();
if (nvolumes!=volumes) { if (nvolumes!=volumes) {
gdk_threads_enter(); GThreadLock lock;
for (int i=0; i<32; i++) for (int i=0; i<32; i++)
if (((volumes >> i) & 1) && !((nvolumes >> i) & 1)) { // volume i has been deleted if (((volumes >> i) & 1) && !((nvolumes >> i) & 1)) { // volume i has been deleted
@@ -155,27 +156,21 @@ void DirBrowser::updateVolumes () {
else if (!((volumes >> i) & 1) && ((nvolumes >> i) & 1)) else if (!((volumes >> i) & 1) && ((nvolumes >> i) & 1))
addRoot ('A'+i); // volume i has been added addRoot ('A'+i); // volume i has been added
volumes = nvolumes; volumes = nvolumes;
gdk_threads_leave();
} }
} }
int _updateVolumes (void* br) { int updateVolumesUI (void* br) {
((DirBrowser*)br)->updateVolumes (); ((DirBrowser*)br)->updateVolumes ();
return 1; return 1;
} }
int _updateDirTree (void* br) { int updateDirTreeUI (void* br) {
gdk_threads_enter ();
((DirBrowser*)br)->updateDirTreeRoot (); ((DirBrowser*)br)->updateDirTreeRoot ();
gdk_threads_leave ();
return 0; return 0;
} }
void DirBrowser::winDirChanged () { void DirBrowser::winDirChanged () {
g_idle_add (_updateDirTree, this); g_idle_add (updateDirTreeUI, this);
} }
#endif #endif
@@ -187,7 +182,7 @@ void DirBrowser::fillRoot () {
if ((volumes >> i) & 1) if ((volumes >> i) & 1)
addRoot ('A'+i); addRoot ('A'+i);
// since sigc++ is not thread safe, we have to use the glib function // since sigc++ is not thread safe, we have to use the glib function
g_timeout_add (CHECKTIME, _updateVolumes, this); g_timeout_add (CHECKTIME, updateVolumesUI, this);
#else #else
Gtk::TreeModel::Row rootRow = *(dirTreeModel->append()); Gtk::TreeModel::Row rootRow = *(dirTreeModel->append());
rootRow[dtColumns.filename] = "/"; rootRow[dtColumns.filename] = "/";

View File

@@ -502,7 +502,6 @@ struct spsparams {
int setProgressStateUIThread (void* data) { int setProgressStateUIThread (void* data) {
gdk_threads_enter ();
spsparams* p = (spsparams*)data; spsparams* p = (spsparams*)data;
if (p->epih->destroyed) { if (p->epih->destroyed) {
@@ -511,14 +510,14 @@ int setProgressStateUIThread (void* data) {
else else
p->epih->pending--; p->epih->pending--;
delete p; delete p;
gdk_threads_leave ();
return 0; return 0;
} }
p->epih->epanel->refreshProcessingState (p->inProcessing); p->epih->epanel->refreshProcessingState (p->inProcessing);
p->epih->pending--; p->epih->pending--;
delete p; delete p;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -637,9 +636,7 @@ void EditorPanel::displayError (Glib::ustring descr) {
} }
} }
int disperror (void* data) { int disperrorUI (void* data) {
gdk_threads_enter ();
errparams* p = (errparams*)data; errparams* p = (errparams*)data;
if (p->epih->destroyed) { if (p->epih->destroyed) {
@@ -648,14 +645,14 @@ int disperror (void* data) {
else else
p->epih->pending--; p->epih->pending--;
delete p; delete p;
gdk_threads_leave ();
return 0; return 0;
} }
p->epih->epanel->displayError (p->descr); p->epih->epanel->displayError (p->descr);
p->epih->pending--; p->epih->pending--;
delete p; delete p;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -665,7 +662,7 @@ void EditorPanel::error (Glib::ustring descr) {
errparams* p = new errparams; errparams* p = new errparams;
p->descr = descr; p->descr = descr;
p->epih = epih; p->epih = epih;
g_idle_add (disperror, p); g_idle_add (disperrorUI, p);
} }
void EditorPanel::info_toggled () { void EditorPanel::info_toggled () {

View File

@@ -313,8 +313,6 @@ int AddEntryUIThread (void* data) {
addparams* ap = (addparams*) data; addparams* ap = (addparams*) data;
FileBrowserIdleHelper* fbih = ap->fbih; FileBrowserIdleHelper* fbih = ap->fbih;
gdk_threads_enter();
if (fbih->destroyed) { if (fbih->destroyed) {
if (fbih->pending == 1) if (fbih->pending == 1)
delete fbih; delete fbih;
@@ -322,14 +320,14 @@ int AddEntryUIThread (void* data) {
fbih->pending--; fbih->pending--;
delete ap->entry; delete ap->entry;
delete ap; delete ap;
gdk_threads_leave ();
return 0; return 0;
} }
ap->fbih->fbrowser->addEntry_ (ap->entry); ap->fbih->fbrowser->addEntry_ (ap->entry);
delete ap; delete ap;
fbih->pending--; fbih->pending--;
gdk_threads_leave();
return 0; return 0;
} }

View File

@@ -158,13 +158,11 @@ struct tiupdate {
rtengine::procparams::CropParams cropParams; rtengine::procparams::CropParams cropParams;
}; };
int fbeupdate (void* data) { int updateImageUI (void* data) {
tiupdate* params = (tiupdate*)data; tiupdate* params = (tiupdate*)data;
FileBrowserEntryIdleHelper* feih = params->feih; FileBrowserEntryIdleHelper* feih = params->feih;
GThreadLock lock;
if (feih->destroyed) { if (feih->destroyed) {
if (feih->pending == 1) if (feih->pending == 1)
delete feih; delete feih;
@@ -204,7 +202,7 @@ void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengi
param->img = img; param->img = img;
param->scale = scale; param->scale = scale;
param->cropParams = cropParams; param->cropParams = cropParams;
g_idle_add (fbeupdate, param); g_idle_add (updateImageUI, param);
} }
void FileBrowserEntry::_updateImage (rtengine::IImage8* img, double s, rtengine::procparams::CropParams cropParams) { void FileBrowserEntry::_updateImage (rtengine::IImage8* img, double s, rtengine::procparams::CropParams cropParams) {

View File

@@ -550,19 +550,18 @@ void FileCatalog::_refreshProgressBar () {
} }
} }
int refreshpb (void* data) { int refreshProgressBarUI (void* data) {
gdk_threads_enter ();
((FileCatalog*)data)->_refreshProgressBar (); ((FileCatalog*)data)->_refreshProgressBar ();
gdk_threads_leave ();
return 0; return 0;
} }
void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn) { void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn) {
GThreadLock lock; GThreadLock lock;
_previewReady (dir_id,fdn); previewReadyUI (dir_id,fdn);
} }
void FileCatalog::_previewReady (int dir_id, FileBrowserEntry* fdn) {
// Called WITHIN gtk thread
void FileCatalog::previewReadyUI (int dir_id, FileBrowserEntry* fdn) {
if ( dir_id != selectedDirectoryId ) if ( dir_id != selectedDirectoryId )
{ {
@@ -597,18 +596,18 @@ void FileCatalog::_previewReady (int dir_id, FileBrowserEntry* fdn) {
dirEFS.cameras.insert (cfs->camera); dirEFS.cameras.insert (cfs->camera);
dirEFS.lenses.insert (cfs->lens); dirEFS.lenses.insert (cfs->lens);
previewsLoaded++; previewsLoaded++;
g_idle_add (refreshpb, this);
g_idle_add (refreshProgressBarUI, this);
} }
int prevfinished (void* data) { int prevfinished (void* data) {
GThreadLock lock;
gdk_threads_enter(); ((FileCatalog*)data)->previewsFinishedUI ();
((FileCatalog*)data)->_previewsFinished ();
gdk_threads_leave();
return 0; return 0;
} }
void FileCatalog::_previewsFinished () { // Called within GTK UI thread
void FileCatalog::previewsFinishedUI () {
redrawAll (); redrawAll ();
previewsToLoad = 0; previewsToLoad = 0;
@@ -631,8 +630,6 @@ void FileCatalog::_previewsFinished () {
void FileCatalog::previewsFinished (int dir_id) { void FileCatalog::previewsFinished (int dir_id) {
GThreadLock lock;
if ( dir_id != selectedDirectoryId ) if ( dir_id != selectedDirectoryId )
{ {
return; return;
@@ -684,13 +681,11 @@ struct FCOIParams {
std::vector<Thumbnail*> tmb; std::vector<Thumbnail*> tmb;
}; };
int fcopenimg (void* p) { int openRequestedUI (void* p) {
gdk_threads_enter ();
FCOIParams* params = (FCOIParams*)p; FCOIParams* params = (FCOIParams*)p;
params->catalog->_openImage (params->tmb); params->catalog->_openImage (params->tmb);
delete params; delete params;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -701,7 +696,7 @@ void FileCatalog::openRequested (std::vector<Thumbnail*> tmb) {
params->tmb = tmb; params->tmb = tmb;
for (size_t i=0; i<tmb.size(); i++) for (size_t i=0; i<tmb.size(); i++)
tmb[i]->increaseRef (); tmb[i]->increaseRef ();
g_idle_add (fcopenimg, params); g_idle_add (openRequestedUI, params);
} }
void FileCatalog::deleteRequested (std::vector<FileBrowserEntry*> tbe, bool inclBatchProcessed) { void FileCatalog::deleteRequested (std::vector<FileBrowserEntry*> tbe, bool inclBatchProcessed) {
@@ -1275,10 +1270,7 @@ void FileCatalog::reparseDirectory () {
#ifdef WIN32 #ifdef WIN32
int winDirChangedUITread (void* cat) { int winDirChangedUITread (void* cat) {
gdk_threads_enter ();
((FileCatalog*)cat)->reparseDirectory (); ((FileCatalog*)cat)->reparseDirectory ();
gdk_threads_leave ();
return 0; return 0;
} }
@@ -1331,13 +1323,13 @@ void FileCatalog::addAndOpenFile (const Glib::ustring& fname) {
Thumbnail* tmb = cacheMgr->getEntry (file->get_parse_name()); Thumbnail* tmb = cacheMgr->getEntry (file->get_parse_name());
if (tmb) { if (tmb) {
FileBrowserEntry* entry = new FileBrowserEntry (tmb, file->get_parse_name()); FileBrowserEntry* entry = new FileBrowserEntry (tmb, file->get_parse_name());
_previewReady (selectedDirectoryId,entry); previewReadyUI (selectedDirectoryId,entry);
// open the file // open the file
FCOIParams* params = new FCOIParams; FCOIParams* params = new FCOIParams;
params->catalog = this; params->catalog = this;
params->tmb.push_back (tmb); params->tmb.push_back (tmb);
tmb->increaseRef (); tmb->increaseRef ();
g_idle_add (fcopenimg, params); g_idle_add (openRequestedUI, params);
} }
} }
} }

View File

@@ -163,10 +163,10 @@ class FileCatalog : public Gtk::VBox,
void refreshEditedState (const std::set<Glib::ustring>& efiles); void refreshEditedState (const std::set<Glib::ustring>& efiles);
// previewloaderlistener interface // previewloaderlistener interface
void _previewReady (int dir_id, FileBrowserEntry* fdn); void previewReadyUI (int dir_id, FileBrowserEntry* fdn);
void previewReady (int dir_id, FileBrowserEntry* fdn); void previewReady (int dir_id, FileBrowserEntry* fdn);
void previewsFinished (int dir_id); void previewsFinished (int dir_id);
void _previewsFinished (); void previewsFinishedUI ();
void _refreshProgressBar (); void _refreshProgressBar ();
// filterpanel interface // filterpanel interface

View File

@@ -21,12 +21,8 @@
#include <rtwindow.h> #include <rtwindow.h>
#include <safegtk.h> #include <safegtk.h>
int fbinit (void* data) { int FilePanelInitUI (void* data) {
gdk_threads_enter ();
((FilePanel*)data)->init (); ((FilePanel*)data)->init ();
gdk_threads_leave ();
return 0; return 0;
} }
@@ -112,7 +108,7 @@ FilePanel::FilePanel () : parent(NULL) {
fileCatalog->setFileSelectionChangeListener (tpc); fileCatalog->setFileSelectionChangeListener (tpc);
fileCatalog->setFileSelectionListener (this); fileCatalog->setFileSelectionListener (this);
g_idle_add (fbinit, this); g_idle_add (FilePanelInitUI, this);
show_all (); show_all ();
} }

View File

@@ -112,9 +112,7 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool raw) {
renderHistogram (); renderHistogram ();
} }
int histupdate (void* data) { int histupdateUI (void* data) {
gdk_threads_enter ();
HistogramAreaIdleHelper* haih = (HistogramAreaIdleHelper*)data; HistogramAreaIdleHelper* haih = (HistogramAreaIdleHelper*)data;
@@ -123,7 +121,7 @@ int histupdate (void* data) {
delete haih; delete haih;
else else
haih->pending--; haih->pending--;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -131,7 +129,7 @@ int histupdate (void* data) {
haih->harea->queue_draw (); haih->harea->queue_draw ();
haih->pending--; haih->pending--;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -148,7 +146,7 @@ void HistogramArea::update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu
valid = false; valid = false;
haih->pending++; haih->pending++;
g_idle_add (histupdate, haih); g_idle_add (histupdateUI, haih);
} }
void HistogramArea::renderHistogram () { void HistogramArea::renderHistogram () {

View File

@@ -701,9 +701,7 @@ void MyDiagonalCurve::setActiveParam (int ac) {
queue_draw (); queue_draw ();
} }
int diagonalmchistupdate (void* data) { int diagonalmchistupdateUI (void* data) {
gdk_threads_enter ();
MyCurveIdleHelper* mcih = (MyCurveIdleHelper*)data; MyCurveIdleHelper* mcih = (MyCurveIdleHelper*)data;
@@ -712,7 +710,7 @@ int diagonalmchistupdate (void* data) {
delete mcih; delete mcih;
else else
mcih->pending--; mcih->pending--;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -720,7 +718,7 @@ int diagonalmchistupdate (void* data) {
mcih->myCurve->queue_draw (); mcih->myCurve->queue_draw ();
mcih->pending--; mcih->pending--;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -736,7 +734,7 @@ void MyDiagonalCurve::updateBackgroundHistogram (LUTu & hist) {
bghistvalid = false; bghistvalid = false;
mcih->pending++; mcih->pending++;
g_idle_add (diagonalmchistupdate, mcih); g_idle_add (diagonalmchistupdateUI, mcih);
} }

View File

@@ -1279,43 +1279,6 @@ void MyFlatCurve::setType (FlatCurveType t) {
pixmap.clear (); pixmap.clear ();
} }
/*int flatmchistupdate (void* data) {
gdk_threads_enter ();
MyFlatCurveIdleHelper* mcih = (MyFlatCurveIdleHelper*)data;
if (mcih->destroyed) {
if (mcih->pending == 1)
delete mcih;
else
mcih->pending--;
gdk_threads_leave ();
return 0;
}
mcih->clearPixmap ();
mcih->myCurve->queue_draw ();
mcih->pending--;
gdk_threads_leave ();
return 0;
}*/
/*void MyFlatCurve::updateBackgroundHistogram (unsigned int* hist) {
if (hist!=NULL) {
memcpy (bghist, hist, 256*sizeof(unsigned int));
bghistvalid = true;
}
else
bghistvalid = false;
mcih->pending++;
g_idle_add (flatmchistupdate, mcih);
}*/
void MyFlatCurve::reset() { void MyFlatCurve::reset() {
innerWidth = get_allocation().get_width() - RADIUS * 2; innerWidth = get_allocation().get_width() - RADIUS * 2;
innerHeight = get_allocation().get_height() - RADIUS * 2; innerHeight = get_allocation().get_height() - RADIUS * 2;

View File

@@ -20,6 +20,7 @@
#include <options.h> #include <options.h>
#include <toolpanel.h> #include <toolpanel.h>
#include <safegtk.h> #include <safegtk.h>
#include <guiutils.h>
PlacesBrowser::PlacesBrowser () : listener (NULL) { PlacesBrowser::PlacesBrowser () : listener (NULL) {
@@ -211,24 +212,18 @@ bool PlacesBrowser::rowSeparatorFunc (const Glib::RefPtr<Gtk::TreeModel>& model,
} }
void PlacesBrowser::mountChanged (const Glib::RefPtr<Gio::Mount>& m) { void PlacesBrowser::mountChanged (const Glib::RefPtr<Gio::Mount>& m) {
GThreadLock lock;
gdk_threads_enter ();
refreshPlacesList (); refreshPlacesList ();
gdk_threads_leave ();
} }
void PlacesBrowser::volumeChanged (const Glib::RefPtr<Gio::Volume>& m) { void PlacesBrowser::volumeChanged (const Glib::RefPtr<Gio::Volume>& m) {
GThreadLock lock;
gdk_threads_enter ();
refreshPlacesList (); refreshPlacesList ();
gdk_threads_leave ();
} }
void PlacesBrowser::driveChanged (const Glib::RefPtr<Gio::Drive>& m) { void PlacesBrowser::driveChanged (const Glib::RefPtr<Gio::Drive>& m) {
GThreadLock lock;
gdk_threads_enter ();
refreshPlacesList (); refreshPlacesList ();
gdk_threads_leave ();
} }
void PlacesBrowser::selectionChanged () { void PlacesBrowser::selectionChanged () {

View File

@@ -48,10 +48,7 @@ struct iaimgpar {
CropParams cp; CropParams cp;
}; };
int setImageThread (void* data) { int setImageUI (void* data) {
gdk_threads_enter ();
iaimgpar* iap = (iaimgpar*)data; iaimgpar* iap = (iaimgpar*)data;
PreviewHandlerIdleHelper* pih = iap->pih; PreviewHandlerIdleHelper* pih = iap->pih;
@@ -61,7 +58,7 @@ int setImageThread (void* data) {
else else
pih->pending--; pih->pending--;
delete iap; delete iap;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -79,8 +76,6 @@ int setImageThread (void* data) {
pih->pending--; pih->pending--;
delete iap; delete iap;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -94,13 +89,11 @@ void PreviewHandler::setImage (rtengine::IImage8* i, double scale, rtengine::pro
iap->scale = scale; iap->scale = scale;
iap->cp = cp; iap->cp = cp;
g_idle_add (setImageThread, iap); g_idle_add (setImageUI, iap);
} }
int delImageThread (void* data) { int delImageUI (void* data) {
gdk_threads_enter ();
iaimgpar* iap = (iaimgpar*)data; iaimgpar* iap = (iaimgpar*)data;
PreviewHandlerIdleHelper* pih = iap->pih; PreviewHandlerIdleHelper* pih = iap->pih;
@@ -111,7 +104,7 @@ int delImageThread (void* data) {
else else
pih->pending--; pih->pending--;
delete iap; delete iap;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -129,8 +122,6 @@ int delImageThread (void* data) {
pih->pending--; pih->pending--;
delete iap; delete iap;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -142,12 +133,10 @@ void PreviewHandler::delImage (IImage8* i) {
iap->image = i; iap->image = i;
iap->pih = pih; iap->pih = pih;
g_idle_add (delImageThread, iap); g_idle_add (delImageUI, iap);
} }
int imageReadyThread (void* data) { int imageReadyUI (void* data) {
gdk_threads_enter ();
iaimgpar* iap = (iaimgpar*)data; iaimgpar* iap = (iaimgpar*)data;
PreviewHandlerIdleHelper* pih = iap->pih; PreviewHandlerIdleHelper* pih = iap->pih;
@@ -158,7 +147,7 @@ int imageReadyThread (void* data) {
else else
pih->pending--; pih->pending--;
delete iap; delete iap;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -170,8 +159,6 @@ int imageReadyThread (void* data) {
pih->pending--; pih->pending--;
delete iap; delete iap;
gdk_threads_leave ();
return 0; return 0;
} }
@@ -181,7 +168,7 @@ void PreviewHandler::imageReady (CropParams cp) {
iaimgpar* iap = new iaimgpar; iaimgpar* iap = new iaimgpar;
iap->pih = pih; iap->pih = pih;
iap->cp = cp; iap->cp = cp;
g_idle_add (imageReadyThread, iap); g_idle_add (imageReadyUI, iap);
} }
Glib::RefPtr<Gdk::Pixbuf> PreviewHandler::getRoughImage (int x, int y, int w, int h, double zoom) { Glib::RefPtr<Gdk::Pixbuf> PreviewHandler::getRoughImage (int x, int y, int w, int h, double zoom) {

View File

@@ -38,9 +38,9 @@ struct PreviewHandlerIdleHelper {
class PreviewHandler : public rtengine::PreviewImageListener { class PreviewHandler : public rtengine::PreviewImageListener {
friend int setImageThread (void* data); friend int setImageUI (void* data);
friend int delImageThread (void* data); friend int delImageUI (void* data);
friend int imageReadyThread (void* data); friend int imageReadyUI (void* data);
protected: protected:
rtengine::IImage8* image; rtengine::IImage8* image;

View File

@@ -22,6 +22,7 @@
#include <sigc++/sigc++.h> #include <sigc++/sigc++.h>
#include <gtkmm.h> #include <gtkmm.h>
#include <rtengine.h> #include <rtengine.h>
#include <guiutils.h>
#undef THREAD_PRIORITY_NORMAL #undef THREAD_PRIORITY_NORMAL
@@ -35,28 +36,24 @@ class PLDBridge : public rtengine::ProgressListener {
// ProgressListener interface // ProgressListener interface
void setProgress (double p) { void setProgress (double p) {
gdk_threads_enter (); GThreadLock lock;
pl->setProgress(p); pl->setProgress(p);
gdk_threads_leave ();
} }
void setProgressStr (Glib::ustring str) { void setProgressStr (Glib::ustring str) {
gdk_threads_enter (); GThreadLock lock;
Glib::ustring progrstr; Glib::ustring progrstr;
progrstr = M(str); progrstr = M(str);
pl->setProgressStr(progrstr); pl->setProgressStr(progrstr);
gdk_threads_leave ();
} }
void setProgressState (bool inProcessing){ void setProgressState (bool inProcessing){
gdk_threads_enter (); GThreadLock lock;
pl->setProgressState(inProcessing); pl->setProgressState(inProcessing);
gdk_threads_leave ();
} }
void error (Glib::ustring descr){ void error (Glib::ustring descr){
gdk_threads_enter (); GThreadLock lock;
pl->error(descr); pl->error(descr);
gdk_threads_leave ();
} }
}; };
@@ -68,18 +65,18 @@ class ProgressConnector {
T retval; T retval;
Glib::Thread *workThread; Glib::Thread *workThread;
static int emitEndSignal (void* data) { static int emitEndSignalUI (void* data) {
gdk_threads_enter ();
sigc::signal0<bool>* opEnd = (sigc::signal0<bool>*) data; sigc::signal0<bool>* opEnd = (sigc::signal0<bool>*) data;
int r = opEnd->emit (); int r = opEnd->emit ();
delete opEnd; delete opEnd;
gdk_threads_leave ();
return r; return r;
} }
void workingThread () { void workingThread () {
retval = opStart.emit (); retval = opStart.emit ();
g_idle_add (ProgressConnector<T>::emitEndSignal, new sigc::signal0<bool> (opEnd)); g_idle_add (ProgressConnector<T>::emitEndSignalUI, new sigc::signal0<bool> (opEnd));
workThread = 0; workThread = 0;
} }

View File

@@ -305,11 +305,8 @@ void ToneCurve::waitForAutoExp () {
curveEditorG->set_sensitive (false); curveEditorG->set_sensitive (false);
} }
int aexpcomputed (void* data) { int autoExpChangedUI (void* data) {
gdk_threads_enter();
((ToneCurve*)data)->autoExpComputed_ (); ((ToneCurve*)data)->autoExpComputed_ ();
gdk_threads_leave();
return 0; return 0;
} }
@@ -317,7 +314,7 @@ void ToneCurve::autoExpChanged (double expcomp, int black) {
nextBlack = black; nextBlack = black;
nextExpcomp = expcomp; nextExpcomp = expcomp;
g_idle_add (aexpcomputed, this); g_idle_add (autoExpChangedUI, this);
// Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::autoExpComputed_)); // Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::autoExpComputed_));
} }