Remove legacy IdleRegister::add<>()
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user