void dt_control_progress_destroy(dt_control_t *control, dt_progress_t *progress) { dt_pthread_mutex_lock(&control->progress_system.mutex); // tell the gui if(control->progress_system.proxy.module != NULL) control->progress_system.proxy.destroyed(control->progress_system.proxy.module, progress->gui_data); // remove the object from the global list control->progress_system.list = g_list_remove(control->progress_system.list, progress); control->progress_system.list_length--; dt_pthread_mutex_unlock(&control->progress_system.mutex); #ifdef HAVE_UNITY if(progress->has_progress_bar) { unity_launcher_entry_set_progress(progress->darktable_launcher, 1.0); unity_launcher_entry_set_progress_visible(progress->darktable_launcher, FALSE); } #endif #ifdef MAC_INTEGRATION #ifdef GTK_TYPE_OSX_APPLICATION gtk_osxapplication_attention_request(g_object_new(GTK_TYPE_OSX_APPLICATION, NULL), INFO_REQUEST); #else gtkosx_application_attention_request(g_object_new(GTKOSX_TYPE_APPLICATION, NULL), INFO_REQUEST); #endif #endif // free the object dt_pthread_mutex_destroy(&progress->mutex); free(progress); }
static void _lib_backgroundjobs_progress(dt_lib_module_t *self, const guint *key, double progress) { if(!darktable.control->running) return; dt_lib_backgroundjobs_t *d = (dt_lib_backgroundjobs_t*)self->data; gboolean i_own_lock = dt_control_gdk_lock(); dt_bgjob_t *j = (dt_bgjob_t*)g_hash_table_lookup(d->jobs, key); if(j) { /* check if progress is above 1.0 and destroy bgjob if finished */ /* FIXME: actually we are having some rounding issues, where the */ /* FIXME: last item doesn't bring to total to 1.0 flat */ /* FIXME: so this is why we have the ugly kludge below */ if (progress > 0.999999) { if (GTK_IS_WIDGET(j->widget)) gtk_container_remove( GTK_CONTAINER(d->jobbox), j->widget ); #ifdef HAVE_UNITY unity_launcher_entry_set_progress( j->darktable_launcher, 1.0 ); unity_launcher_entry_set_progress_visible( j->darktable_launcher, FALSE ); #endif #ifdef MAC_INTEGRATION #ifdef GTK_TYPE_OSX_APPLICATION gtk_osxapplication_attention_request(g_object_new(GTK_TYPE_OSX_APPLICATION, NULL), INFO_REQUEST); #else gtkosx_application_attention_request(g_object_new(GTKOSX_TYPE_APPLICATION, NULL), INFO_REQUEST); #endif #endif /* hide jobbox if theres no jobs left */ if (g_list_length(gtk_container_get_children(GTK_CONTAINER(d->jobbox))) == 0 ) gtk_widget_hide(d->jobbox); } else { if( j->type == 0 ) gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR(j->progressbar), progress ); #ifdef HAVE_UNITY unity_launcher_entry_set_progress( j->darktable_launcher, progress ); #endif } } if(i_own_lock) dt_control_gdk_unlock(); }
static void _lib_backgroundjobs_destroy(dt_lib_module_t *self, const guint *key) { gboolean i_own_lock = dt_control_gdk_lock(); dt_lib_backgroundjobs_t *d = (dt_lib_backgroundjobs_t*)self->data; dt_bgjob_t *j = (dt_bgjob_t*)g_hash_table_lookup(d->jobs, key); if(j) { g_hash_table_remove(d->jobs, key); /* remove job widget from jobbox */ if(j->widget && GTK_IS_WIDGET(j->widget)) gtk_container_remove(GTK_CONTAINER(d->jobbox),j->widget); j->widget = 0; #ifdef HAVE_UNITY if( j->type == 0 ) { unity_launcher_entry_set_progress( j->darktable_launcher, 1.0 ); unity_launcher_entry_set_progress_visible( j->darktable_launcher, FALSE ); } #endif #ifdef MAC_INTEGRATION #ifdef GTK_TYPE_OSX_APPLICATION gtk_osxapplication_attention_request(g_object_new(GTK_TYPE_OSX_APPLICATION, NULL), INFO_REQUEST); #else gtkosx_application_attention_request(g_object_new(GTKOSX_TYPE_APPLICATION, NULL), INFO_REQUEST); #endif #endif /* if jobbox is empty lets hide */ if(g_list_length(gtk_container_get_children(GTK_CONTAINER(d->jobbox)))==0) gtk_widget_hide(d->jobbox); /* free allocted mem */ g_free(j); g_free((guint*)key); } if(i_own_lock) dt_control_gdk_unlock(); }