diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 1810501b5..78f1a8976 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -24,14 +24,6 @@ #include "soundman.h" #include "rtimage.h" -int processLoadedBatchQueueUIThread (void* data) -{ - - BatchQueue* bq = static_cast(data); - bq->resizeLoadedQueue(); - return 0; -} - static Glib::ustring makeFolderLabel(Glib::ustring path) { if (!Glib::file_test (path, Glib::FILE_TEST_IS_DIR)) { @@ -185,11 +177,22 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) show_all (); - if (batchQueue->loadBatchQueue ()) { - g_idle_add_full (G_PRIORITY_LOW, processLoadedBatchQueueUIThread, batchQueue, nullptr); + if (batchQueue->loadBatchQueue()) { + const auto func = [](gpointer data) -> gboolean { + static_cast(data)->resizeLoadedQueue(); + + return FALSE; + }; + + idle_register.add(func, batchQueue, G_PRIORITY_LOW); } } +BatchQueuePanel::~BatchQueuePanel() +{ + idle_register.destroy(); +} + void BatchQueuePanel::init (RTWindow *parent) { this->parent = parent; diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index b92f300be..a4d6ed244 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -53,9 +53,11 @@ class BatchQueuePanel : public Gtk::VBox, Gtk::HBox* bottomBox; Gtk::HBox* topBox; -public: + IdleRegister idle_register; +public: explicit BatchQueuePanel (FileCatalog* aFileCatalog); + ~BatchQueuePanel(); void init (RTWindow* parent); diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index d452b88cd..a2f88ee40 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -67,6 +67,7 @@ FileBrowserEntry::FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname) FileBrowserEntry::~FileBrowserEntry () { + idle_register.destroy(); // so jobs arriving now do nothing if (feih->pending) { @@ -176,39 +177,6 @@ void FileBrowserEntry::procParamsChanged (Thumbnail* thm, int whoChangedIt) } } -struct tiupdate { - FileBrowserEntryIdleHelper* feih; - rtengine::IImage8* img; - double scale; - rtengine::procparams::CropParams cropParams; -}; - -int updateImageUI (void* data) -{ - - tiupdate* params = static_cast(data); - FileBrowserEntryIdleHelper* feih = params->feih; - - if (feih->destroyed) { - if (feih->pending == 1) { - delete feih; - } else { - feih->pending--; - } - - params->img->free (); - delete params; - return 0; - } - - feih->fbentry->_updateImage (params->img, params->scale, params->cropParams); - feih->pending--; - - delete params; - - return 0; -} - void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams) { @@ -225,16 +193,51 @@ void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengi feih->pending++; } - tiupdate* param = new tiupdate (); - param->feih = feih; - param->img = img; - param->scale = scale; - param->cropParams = cropParams; + struct tiupdate { + FileBrowserEntryIdleHelper* feih; + rtengine::IImage8* img; + double scale; + rtengine::procparams::CropParams cropParams; + }; + + tiupdate* param = new tiupdate{ + feih, + img, + scale, + cropParams + }; + #if __GNUC__ == 4 && __GNUC_MINOR__ == 8 && defined( WIN32 ) && defined(__x86_64__) - g_idle_add_full (G_PRIORITY_DEFAULT, updateImageUI, param, NULL); + const gint priority = G_PRIORITY_DEFAULT; #else - g_idle_add_full (G_PRIORITY_LOW, updateImageUI, param, nullptr); + const gint priority = G_PRIORITY_LOW; #endif + + const auto func = [](gpointer data) -> gboolean { + tiupdate* const params = static_cast(data); + FileBrowserEntryIdleHelper* const feih = params->feih; + + if (feih->destroyed) { + if (feih->pending == 1) { + delete feih; + } else { + feih->pending--; + } + + params->img->free (); + delete params; + return 0; + } + + feih->fbentry->_updateImage (params->img, params->scale, params->cropParams); + feih->pending--; + + delete params; + + return FALSE; + }; + + idle_register.add(func, param, priority); } void FileBrowserEntry::_updateImage (rtengine::IImage8* img, double s, rtengine::procparams::CropParams cropParams) diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index 5b95ca069..cbbe2c595 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -57,6 +57,8 @@ class FileBrowserEntry : public ThumbBrowserEntryBase, ImgEditState state; + IdleRegister idle_register; + bool onArea (CursorArea a, int x, int y); void updateCursor (int x, int y); void drawStraightenGuide (Cairo::RefPtr c); diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 451af4e38..f78ee34e4 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -38,18 +38,12 @@ Glib::RefPtr MyExpander::disabledPBuf; Glib::RefPtr MyExpander::openedPBuf; Glib::RefPtr MyExpander::closedPBuf; -guint add_idle (GSourceFunc function, gpointer data) -{ - return gdk_threads_add_idle(function, data); - //gtk_main_iteration_do(false); -} - IdleRegister::~IdleRegister() { destroy(); } -void IdleRegister::add(GSourceFunc function, gpointer data) +void IdleRegister::add(GSourceFunc function, gpointer data, gint priority) { struct DataWrapper { IdleRegister* const self; @@ -79,7 +73,7 @@ void IdleRegister::add(GSourceFunc function, gpointer data) }; mutex.lock(); - ids[data_wrapper] = add_idle(dispatch, data_wrapper); + ids[data_wrapper] = gdk_threads_add_idle_full(priority, dispatch, data_wrapper, nullptr); mutex.unlock(); } diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 3f88adf0c..88f572e5a 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -44,15 +44,13 @@ void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int gboolean acquireGUI(void* data); void setExpandAlignProperties(Gtk::Widget *widget, bool hExpand, bool vExpand, enum Gtk::Align hAlign, enum Gtk::Align vAlign); -guint add_idle (GSourceFunc function, gpointer data); - class IdleRegister final : public rtengine::NonCopyable { public: ~IdleRegister(); - void add(GSourceFunc function, gpointer data); + void add(GSourceFunc function, gpointer data, gint priority = G_PRIORITY_DEFAULT_IDLE); void destroy(); private: