From b21d910573e951ad51b4058bb5ecedc63c8bde57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 1 Jan 2019 20:58:26 +0100 Subject: [PATCH] Remove legacy `IdleRegister::add<>()` --- rtgui/bayerprocess.cc | 59 +++++++++++++--------------------- rtgui/colorappearance.cc | 66 +++++++++++++-------------------------- rtgui/editorpanel.cc | 30 ++++++------------ rtgui/filebrowser.cc | 27 ++++++---------- rtgui/filebrowserentry.cc | 36 ++++++--------------- rtgui/flatfield.cc | 21 +++++-------- rtgui/guiutils.cc | 31 ++++++++++++------ rtgui/guiutils.h | 52 +----------------------------- rtgui/wavelet.cc | 23 ++++++-------- rtgui/whitebalance.cc | 29 +++++++---------- rtgui/xtransprocess.cc | 21 +++++-------- 11 files changed, 128 insertions(+), 267 deletions(-) diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index ad9db9c2c..74cf27dde 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -718,56 +718,39 @@ void BayerProcess::pixelShiftMotionMethodChanged () void BayerProcess::FrameCountChanged(int n, int frameNum) { - struct Data { - BayerProcess *me; - int n; - int frameNum; - }; - - const auto func = - [](Data* d) -> bool + idle_register.add( + [this, n, frameNum]() -> bool { - BayerProcess *me = d->me; - me->imageNumber->block (true); - int n = d->n; - int frameNum = d->frameNum; + imageNumber->block(true); - me->imageNumber->remove_all(); - me->imageNumber->append("1"); - for(int i = 2; i <= std::min(n, 4); ++i) { + imageNumber->remove_all(); + imageNumber->append("1"); + for (int i = 2; i <= std::min(n, 4); ++i) { std::ostringstream entry; entry << i; - me->imageNumber->append(entry.str()); + imageNumber->append(entry.str()); } - me->imageNumber->set_active(std::min(frameNum, n - 1)); - if(n == 1) { - me->imageNumberBox->hide(); + imageNumber->set_active(std::min(frameNum, n - 1)); + if (n == 1) { + imageNumberBox->hide(); } else { - me->imageNumberBox->show(); + imageNumberBox->show(); } - me->imageNumber->block (false); + imageNumber->block (false); return false; - }; - - idle_register.add(func, new Data{this, n, frameNum}, true); + } + ); } void BayerProcess::autoContrastChanged (double autoContrast) { - struct Data { - BayerProcess* self; - double autoContrast; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, autoContrast]() -> bool { - BayerProcess* const self = data->self; - self->disableListener(); - self->dualDemosaicContrast->setValue(data->autoContrast); - self->enableListener(); + disableListener(); + dualDemosaicContrast->setValue(autoContrast); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, autoContrast}, true); + } + ); } diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index bbf5ed5d7..dea55ced4 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1447,64 +1447,42 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit void ColorAppearance::autoCamChanged (double ccam, double ccamout) { - struct Data { - ColorAppearance* me; - double ccam; - double ccamout; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, ccam, ccamout]() -> bool { - ColorAppearance* const self = data->me; - self->disableListener(); - self->degree->setValue(data->ccam); - self->degreeout->setValue(data->ccamout); - self->enableListener(); + disableListener(); + degree->setValue(ccam); + degreeout->setValue(ccamout); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, ccam, ccamout}, true); + } + ); } void ColorAppearance::adapCamChanged (double cadap) { - struct Data { - ColorAppearance* self; - double cadap; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, cadap]() -> bool { - ColorAppearance* const self = data->self; - self->disableListener(); - self->adapscen->setValue(data->cadap); - self->enableListener(); + disableListener(); + adapscen->setValue(cadap); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, cadap}, true); + } + ); } void ColorAppearance::ybCamChanged (int ybsc) { - struct Data { - ColorAppearance* self; - int ybsc; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, ybsc]() -> bool { - ColorAppearance* self = data->self; - self->disableListener(); - self->ybscen->setValue(data->ybsc); - self->enableListener(); + disableListener(); + ybscen->setValue(ybsc); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, ybsc}, true); + } + ); } void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index b0e945ce1..cfd2d0486 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1193,38 +1193,28 @@ void EditorPanel::setProgressStr(const Glib::ustring& str) void EditorPanel::setProgressState(bool inProcessing) { - struct spsparams { - bool inProcessing; - EditorPanelIdleHelper* epih; - }; - epih->pending++; - spsparams* p = new spsparams; - p->inProcessing = inProcessing; - p->epih = epih; - - const auto func = - [](spsparams* p) -> bool + idle_register.add( + [this, inProcessing]() -> bool { - if (p->epih->destroyed) + if (epih->destroyed) { - if (p->epih->pending == 1) { - delete p->epih; + if (epih->pending == 1) { + delete epih; } else { - p->epih->pending--; + --epih->pending; } return false; } - p->epih->epanel->refreshProcessingState (p->inProcessing); - p->epih->pending--; + epih->epanel->refreshProcessingState(inProcessing); + --epih->pending; return false; - }; - - idle_register.add(func, p, true); + } + ); } void EditorPanel::error(const Glib::ustring& descr) diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 20cb3350f..d489bb1d3 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -565,31 +565,22 @@ void FileBrowser::doubleClicked (ThumbBrowserEntryBase* entry) void FileBrowser::addEntry (FileBrowserEntry* entry) { - struct addparams { - FileBrowser* self; - FileBrowserEntry* entry; - unsigned int session_id; - }; + entry->setParent(this); - addparams* const ap = new addparams; - entry->setParent (this); - ap->self = this; - ap->entry = entry; - ap->session_id = session_id(); + const unsigned int sid = session_id(); - const auto func = - [](addparams* ap) -> bool + idle_register.add( + [this, entry, sid]() -> bool { - if (ap->session_id != ap->self->session_id()) { - delete ap->entry; + if (sid != session_id()) { + delete entry; } else { - ap->self->addEntry_(ap->entry); + addEntry_(entry); } return false; - }; - - idle_register.add(func, ap, true); + } + ); } void FileBrowser::addEntry_ (FileBrowserEntry* entry) diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 5d47a54ea..70d2fc128 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -217,45 +217,27 @@ void FileBrowserEntry::updateImage(rtengine::IImage8* img, double scale, const r redrawRequests++; feih->pending++; - struct tiupdate { - FileBrowserEntryIdleHelper* feih; - 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 + idle_register.add( + [this, img, scale, cropParams]() -> bool { - FileBrowserEntryIdleHelper* const feih = params->feih; - if (feih->destroyed) { if (feih->pending == 1) { delete feih; } else { - feih->pending--; + --feih->pending; } - params->img->free (); + img->free(); return false; } - feih->fbentry->_updateImage (params->img, params->scale, params->cropParams); - feih->pending--; + feih->fbentry->_updateImage(img, scale, cropParams); + --feih->pending; return false; - }; - - idle_register.add(func, param, true, priority); + }, + G_PRIORITY_LOW + ); } void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rtengine::procparams::CropParams& cropParams) diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index ae94255a7..86d27aacf 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -411,20 +411,13 @@ void FlatField::setShortcutPath(const Glib::ustring& path) void FlatField::flatFieldAutoClipValueChanged(int n) { - struct Data { - FlatField* self; - int n; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, n]() -> bool { - FlatField* const self = data->self; - self->disableListener(); - self->flatFieldClipControl->setValue (data->n); - self->enableListener(); + disableListener(); + flatFieldClipControl->setValue(n); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, n}, true); + } + ); } diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index bd9828933..a645846d1 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -45,15 +45,31 @@ IdleRegister::~IdleRegister() void IdleRegister::add(std::function function, gint priority) { - using Function = std::function; - - const auto func = - [](Function* function) + const auto dispatch = + [](gpointer data) -> gboolean { - return (*function)(); + DataWrapper* const data_wrapper = static_cast(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(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() @@ -61,9 +77,6 @@ void IdleRegister::destroy() mutex.lock(); for (const auto& id : ids) { g_source_remove(id.second); - if (id.first->deleter) { - id.first->deleter(id.first->data); - } delete id.first; } ids.clear(); diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 309965520..a5705630f 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -51,63 +51,13 @@ class IdleRegister final : public: ~IdleRegister(); - template - 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(data); - - // This is safe as per https://en.cppreference.com/w/cpp/language/reinterpret_cast item 7) - if (!reinterpret_cast(data_wrapper->function)(static_cast(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(function), - data, - [delete_data]() -> GSourceFunc - { - if (delete_data) { - return - [](gpointer data) -> gboolean - { - delete static_cast(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 function, gint priority = G_PRIORITY_DEFAULT_IDLE); void destroy(); private: struct DataWrapper { IdleRegister* const self; - GSourceFunc function; - gpointer data; - GSourceFunc deleter; + std::function function; }; std::map ids; diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 5b395fc91..60915fa02 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -887,23 +887,18 @@ Wavelet::~Wavelet () void Wavelet::wavChanged (double nlevel) { if (!batchMode) { - struct Data { - Wavelet *self; - double nlevel; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, nlevel]() -> bool { - Wavelet* self = data->self; - self->wavLabels->set_text( - Glib::ustring::compose(M("TP_WAVELET_LEVLABEL"), - Glib::ustring::format(std::fixed, std::setprecision(0), data->nlevel)) + wavLabels->set_text( + Glib::ustring::compose( + M("TP_WAVELET_LEVLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), nlevel) + ) ); return false; - }; - - idle_register.add(func, new Data{this, nlevel}, true); + } + ); } } diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index dbb65867f..02fb8d793 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -913,25 +913,18 @@ inline Gtk::TreeRow WhiteBalance::getActiveMethod () void WhiteBalance::WBChanged(double temperature, double greenVal) { - struct Data { - WhiteBalance* self; - double temperature; - double green_val; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, temperature, greenVal]() -> bool { - data->self->disableListener(); - data->self->setEnabled(true); - data->self->temp->setValue(data->temperature); - data->self->green->setValue(data->green_val); - data->self->temp->setDefault(data->temperature); - data->self->green->setDefault(data->green_val); - data->self->enableListener(); + disableListener(); + setEnabled(true); + temp->setValue(temperature); + green->setValue(greenVal); + temp->setDefault(temperature); + green->setDefault(greenVal); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, temperature, greenVal}, true); + } + ); } diff --git a/rtgui/xtransprocess.cc b/rtgui/xtransprocess.cc index 72a2db2b0..9639ce29d 100644 --- a/rtgui/xtransprocess.cc +++ b/rtgui/xtransprocess.cc @@ -254,20 +254,13 @@ void XTransProcess::checkBoxToggled (CheckBox* c, CheckValue newval) void XTransProcess::autoContrastChanged (double autoContrast) { - struct Data { - XTransProcess* self; - double autoContrast; - }; - - const auto func = - [](Data* data) -> bool + idle_register.add( + [this, autoContrast]() -> bool { - XTransProcess* self = data->self; - self->disableListener(); - self->dualDemosaicContrast->setValue(data->autoContrast); - self->enableListener(); + disableListener(); + dualDemosaicContrast->setValue(autoContrast); + enableListener(); return false; - }; - - idle_register.add(func, new Data{this, autoContrast}, true); + } + ); }