Remove legacy IdleRegister::add<>()

This commit is contained in:
Flössie
2019-01-01 20:58:26 +01:00
parent 732bbf1a55
commit b21d910573
11 changed files with 128 additions and 267 deletions

View File

@@ -718,56 +718,39 @@ void BayerProcess::pixelShiftMotionMethodChanged ()
void BayerProcess::FrameCountChanged(int n, int frameNum) void BayerProcess::FrameCountChanged(int n, int frameNum)
{ {
struct Data { idle_register.add(
BayerProcess *me; [this, n, frameNum]() -> bool
int n;
int frameNum;
};
const auto func =
[](Data* d) -> bool
{ {
BayerProcess *me = d->me; imageNumber->block(true);
me->imageNumber->block (true);
int n = d->n;
int frameNum = d->frameNum;
me->imageNumber->remove_all(); imageNumber->remove_all();
me->imageNumber->append("1"); imageNumber->append("1");
for(int i = 2; i <= std::min(n, 4); ++i) { for (int i = 2; i <= std::min(n, 4); ++i) {
std::ostringstream entry; std::ostringstream entry;
entry << i; entry << i;
me->imageNumber->append(entry.str()); imageNumber->append(entry.str());
} }
me->imageNumber->set_active(std::min(frameNum, n - 1)); imageNumber->set_active(std::min(frameNum, n - 1));
if(n == 1) { if (n == 1) {
me->imageNumberBox->hide(); imageNumberBox->hide();
} else { } else {
me->imageNumberBox->show(); imageNumberBox->show();
} }
me->imageNumber->block (false); imageNumber->block (false);
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, n, frameNum}, true);
} }
void BayerProcess::autoContrastChanged (double autoContrast) void BayerProcess::autoContrastChanged (double autoContrast)
{ {
struct Data { idle_register.add(
BayerProcess* self; [this, autoContrast]() -> bool
double autoContrast;
};
const auto func =
[](Data* data) -> bool
{ {
BayerProcess* const self = data->self; disableListener();
self->disableListener(); dualDemosaicContrast->setValue(autoContrast);
self->dualDemosaicContrast->setValue(data->autoContrast); enableListener();
self->enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, autoContrast}, true);
} }

View File

@@ -1447,64 +1447,42 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit
void ColorAppearance::autoCamChanged (double ccam, double ccamout) void ColorAppearance::autoCamChanged (double ccam, double ccamout)
{ {
struct Data { idle_register.add(
ColorAppearance* me; [this, ccam, ccamout]() -> bool
double ccam;
double ccamout;
};
const auto func =
[](Data* data) -> bool
{ {
ColorAppearance* const self = data->me; disableListener();
self->disableListener(); degree->setValue(ccam);
self->degree->setValue(data->ccam); degreeout->setValue(ccamout);
self->degreeout->setValue(data->ccamout); enableListener();
self->enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, ccam, ccamout}, true);
} }
void ColorAppearance::adapCamChanged (double cadap) void ColorAppearance::adapCamChanged (double cadap)
{ {
struct Data { idle_register.add(
ColorAppearance* self; [this, cadap]() -> bool
double cadap;
};
const auto func =
[](Data* data) -> bool
{ {
ColorAppearance* const self = data->self; disableListener();
self->disableListener(); adapscen->setValue(cadap);
self->adapscen->setValue(data->cadap); enableListener();
self->enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, cadap}, true);
} }
void ColorAppearance::ybCamChanged (int ybsc) void ColorAppearance::ybCamChanged (int ybsc)
{ {
struct Data { idle_register.add(
ColorAppearance* self; [this, ybsc]() -> bool
int ybsc;
};
const auto func =
[](Data* data) -> bool
{ {
ColorAppearance* self = data->self; disableListener();
self->disableListener(); ybscen->setValue(ybsc);
self->ybscen->setValue(data->ybsc); enableListener();
self->enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, ybsc}, true);
} }
void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller)

View File

@@ -1193,38 +1193,28 @@ void EditorPanel::setProgressStr(const Glib::ustring& str)
void EditorPanel::setProgressState(bool inProcessing) void EditorPanel::setProgressState(bool inProcessing)
{ {
struct spsparams {
bool inProcessing;
EditorPanelIdleHelper* epih;
};
epih->pending++; epih->pending++;
spsparams* p = new spsparams; idle_register.add(
p->inProcessing = inProcessing; [this, inProcessing]() -> bool
p->epih = epih;
const auto func =
[](spsparams* p) -> bool
{ {
if (p->epih->destroyed) if (epih->destroyed)
{ {
if (p->epih->pending == 1) { if (epih->pending == 1) {
delete p->epih; delete epih;
} else { } else {
p->epih->pending--; --epih->pending;
} }
return false; return false;
} }
p->epih->epanel->refreshProcessingState (p->inProcessing); epih->epanel->refreshProcessingState(inProcessing);
p->epih->pending--; --epih->pending;
return false; return false;
}; }
);
idle_register.add<spsparams>(func, p, true);
} }
void EditorPanel::error(const Glib::ustring& descr) void EditorPanel::error(const Glib::ustring& descr)

View File

@@ -565,31 +565,22 @@ void FileBrowser::doubleClicked (ThumbBrowserEntryBase* entry)
void FileBrowser::addEntry (FileBrowserEntry* entry) void FileBrowser::addEntry (FileBrowserEntry* entry)
{ {
struct addparams { entry->setParent(this);
FileBrowser* self;
FileBrowserEntry* entry;
unsigned int session_id;
};
addparams* const ap = new addparams; const unsigned int sid = session_id();
entry->setParent (this);
ap->self = this;
ap->entry = entry;
ap->session_id = session_id();
const auto func = idle_register.add(
[](addparams* ap) -> bool [this, entry, sid]() -> bool
{ {
if (ap->session_id != ap->self->session_id()) { if (sid != session_id()) {
delete ap->entry; delete entry;
} else { } else {
ap->self->addEntry_(ap->entry); addEntry_(entry);
} }
return false; return false;
}; }
);
idle_register.add<addparams>(func, ap, true);
} }
void FileBrowser::addEntry_ (FileBrowserEntry* entry) void FileBrowser::addEntry_ (FileBrowserEntry* entry)

View File

@@ -217,45 +217,27 @@ void FileBrowserEntry::updateImage(rtengine::IImage8* img, double scale, const r
redrawRequests++; redrawRequests++;
feih->pending++; feih->pending++;
struct tiupdate { idle_register.add(
FileBrowserEntryIdleHelper* feih; [this, img, scale, cropParams]() -> bool
rtengine::IImage8* img;
double scale;
rtengine::procparams::CropParams cropParams;
};
tiupdate* param = new tiupdate{
feih,
img,
scale,
cropParams
};
const gint priority = G_PRIORITY_LOW;
const auto func =
[](tiupdate* params) -> bool
{ {
FileBrowserEntryIdleHelper* const feih = params->feih;
if (feih->destroyed) { if (feih->destroyed) {
if (feih->pending == 1) { if (feih->pending == 1) {
delete feih; delete feih;
} else { } else {
feih->pending--; --feih->pending;
} }
params->img->free (); img->free();
return false; return false;
} }
feih->fbentry->_updateImage (params->img, params->scale, params->cropParams); feih->fbentry->_updateImage(img, scale, cropParams);
feih->pending--; --feih->pending;
return false; return false;
}; },
G_PRIORITY_LOW
idle_register.add<tiupdate>(func, param, true, priority); );
} }
void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rtengine::procparams::CropParams& cropParams) void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rtengine::procparams::CropParams& cropParams)

View File

@@ -411,20 +411,13 @@ void FlatField::setShortcutPath(const Glib::ustring& path)
void FlatField::flatFieldAutoClipValueChanged(int n) void FlatField::flatFieldAutoClipValueChanged(int n)
{ {
struct Data { idle_register.add(
FlatField* self; [this, n]() -> bool
int n;
};
const auto func =
[](Data* data) -> bool
{ {
FlatField* const self = data->self; disableListener();
self->disableListener(); flatFieldClipControl->setValue(n);
self->flatFieldClipControl->setValue (data->n); enableListener();
self->enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, n}, true);
} }

View File

@@ -45,15 +45,31 @@ IdleRegister::~IdleRegister()
void IdleRegister::add(std::function<bool ()> function, gint priority) void IdleRegister::add(std::function<bool ()> function, gint priority)
{ {
using Function = std::function<bool ()>; const auto dispatch =
[](gpointer data) -> gboolean
const auto func =
[](Function* function)
{ {
return (*function)(); DataWrapper* const data_wrapper = static_cast<DataWrapper*>(data);
if (!data_wrapper->function()) {
data_wrapper->self->mutex.lock();
data_wrapper->self->ids.erase(data_wrapper);
data_wrapper->self->mutex.unlock();
delete data_wrapper;
return FALSE;
}
return TRUE;
}; };
add<Function>(func, new Function(std::move(function)), true, priority); DataWrapper* const data_wrapper = new DataWrapper{
this,
std::move(function)
};
mutex.lock();
ids[data_wrapper] = gdk_threads_add_idle_full(priority, dispatch, data_wrapper, nullptr);
mutex.unlock();
} }
void IdleRegister::destroy() void IdleRegister::destroy()
@@ -61,9 +77,6 @@ void IdleRegister::destroy()
mutex.lock(); mutex.lock();
for (const auto& id : ids) { for (const auto& id : ids) {
g_source_remove(id.second); g_source_remove(id.second);
if (id.first->deleter) {
id.first->deleter(id.first->data);
}
delete id.first; delete id.first;
} }
ids.clear(); ids.clear();

View File

@@ -51,63 +51,13 @@ class IdleRegister final :
public: public:
~IdleRegister(); ~IdleRegister();
template<typename DATA>
void add(bool (*function)(DATA*), DATA* data, bool delete_data, gint priority = G_PRIORITY_DEFAULT_IDLE)
{
const auto dispatch =
[](gpointer data) -> gboolean
{
DataWrapper* const data_wrapper = static_cast<DataWrapper*>(data);
// This is safe as per https://en.cppreference.com/w/cpp/language/reinterpret_cast item 7)
if (!reinterpret_cast<bool (*)(DATA*)>(data_wrapper->function)(static_cast<DATA*>(data_wrapper->data))) {
data_wrapper->self->mutex.lock();
data_wrapper->self->ids.erase(data_wrapper);
data_wrapper->self->mutex.unlock();
if (data_wrapper->deleter) {
data_wrapper->deleter(data_wrapper->data);
}
delete data_wrapper;
return FALSE;
}
return TRUE;
};
DataWrapper* const data_wrapper = new DataWrapper{
this,
reinterpret_cast<GSourceFunc>(function),
data,
[delete_data]() -> GSourceFunc
{
if (delete_data) {
return
[](gpointer data) -> gboolean
{
delete static_cast<DATA*>(data);
return TRUE;
};
}
return nullptr;
}()
};
mutex.lock();
ids[data_wrapper] = gdk_threads_add_idle_full(priority, dispatch, data_wrapper, nullptr);
mutex.unlock();
}
void add(std::function<bool ()> function, gint priority = G_PRIORITY_DEFAULT_IDLE); void add(std::function<bool ()> function, gint priority = G_PRIORITY_DEFAULT_IDLE);
void destroy(); void destroy();
private: private:
struct DataWrapper { struct DataWrapper {
IdleRegister* const self; IdleRegister* const self;
GSourceFunc function; std::function<bool ()> function;
gpointer data;
GSourceFunc deleter;
}; };
std::map<const DataWrapper*, guint> ids; std::map<const DataWrapper*, guint> ids;

View File

@@ -887,23 +887,18 @@ Wavelet::~Wavelet ()
void Wavelet::wavChanged (double nlevel) void Wavelet::wavChanged (double nlevel)
{ {
if (!batchMode) { if (!batchMode) {
struct Data { idle_register.add(
Wavelet *self; [this, nlevel]() -> bool
double nlevel;
};
const auto func =
[](Data* data) -> bool
{ {
Wavelet* self = data->self; wavLabels->set_text(
self->wavLabels->set_text( Glib::ustring::compose(
Glib::ustring::compose(M("TP_WAVELET_LEVLABEL"), M("TP_WAVELET_LEVLABEL"),
Glib::ustring::format(std::fixed, std::setprecision(0), data->nlevel)) Glib::ustring::format(std::fixed, std::setprecision(0), nlevel)
)
); );
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, nlevel}, true);
} }
} }

View File

@@ -913,25 +913,18 @@ inline Gtk::TreeRow WhiteBalance::getActiveMethod ()
void WhiteBalance::WBChanged(double temperature, double greenVal) void WhiteBalance::WBChanged(double temperature, double greenVal)
{ {
struct Data { idle_register.add(
WhiteBalance* self; [this, temperature, greenVal]() -> bool
double temperature;
double green_val;
};
const auto func =
[](Data* data) -> bool
{ {
data->self->disableListener(); disableListener();
data->self->setEnabled(true); setEnabled(true);
data->self->temp->setValue(data->temperature); temp->setValue(temperature);
data->self->green->setValue(data->green_val); green->setValue(greenVal);
data->self->temp->setDefault(data->temperature); temp->setDefault(temperature);
data->self->green->setDefault(data->green_val); green->setDefault(greenVal);
data->self->enableListener(); enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, temperature, greenVal}, true);
} }

View File

@@ -254,20 +254,13 @@ void XTransProcess::checkBoxToggled (CheckBox* c, CheckValue newval)
void XTransProcess::autoContrastChanged (double autoContrast) void XTransProcess::autoContrastChanged (double autoContrast)
{ {
struct Data { idle_register.add(
XTransProcess* self; [this, autoContrast]() -> bool
double autoContrast;
};
const auto func =
[](Data* data) -> bool
{ {
XTransProcess* self = data->self; disableListener();
self->disableListener(); dualDemosaicContrast->setValue(autoContrast);
self->dualDemosaicContrast->setValue(data->autoContrast); enableListener();
self->enableListener();
return false; return false;
}; }
);
idle_register.add<Data>(func, new Data{this, autoContrast}, true);
} }