Author: post
Date: 2011-01-14 11:06:14 +0100 (Fri, 14 Jan 2011)
New Revision: 3797
Modified:
trunk/src/rs-actions.c
trunk/src/rs-batch.c
Log:
Run batch exports in a separate window and thread, so it is possible to work
while exporting (though it way feel slow).
Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c 2011-01-10 00:35:51 UTC (rev 3796)
+++ trunk/src/rs-actions.c 2011-01-14 10:06:14 UTC (rev 3797)
@@ -1133,13 +1133,30 @@
}
}
+/* This is protected by gdk_thread */
+static GThread* process_thread = 0;
+
+static gpointer
+start_process_batch(gpointer data)
+{
+ RS_QUEUE *queue = data;
+
+ rs_batch_process(queue);
+
+ gdk_threads_enter();
+ process_thread = NULL;
+ gdk_threads_leave();
+ return NULL;
+}
+
ACTION(ProcessBatch)
{
/* Save current photo just in case it's in the queue */
if (RS_IS_PHOTO(rs->photo))
rs_cache_save(rs->photo, MASK_ALL);
- rs_batch_process(rs->queue);
+ if (NULL == process_thread)
+ process_thread =
g_thread_create_full(start_process_batch, rs->queue, 0, FALSE, FALSE,
G_THREAD_PRIORITY_LOW, NULL);
}
ACTION(lens_db_editor)
Modified: trunk/src/rs-batch.c
===================================================================
--- trunk/src/rs-batch.c 2011-01-10 00:35:51 UTC (rev 3796)
+++ trunk/src/rs-batch.c 2011-01-14 10:06:14 UTC (rev 3797)
@@ -389,12 +389,11 @@
GtkWidget *vbox = gtk_vbox_new(FALSE, 4);
GtkWidget *cancel;
gboolean abort_render = FALSE;
- gboolean fullscreen = FALSE;
GTimeVal start_time;
GTimeVal now_time = {0,0};
gint time, eta;
GtkWidget *eta_label = gtk_label_new(NULL);
- gchar *eta_text;
+ gchar *eta_text, *title_text;
gint h = 0, m = 0, s = 0;
gint done = 0, left = 0;
RSFilter *finput = rs_filter_new("RSInputImage16", NULL);
@@ -449,9 +448,11 @@
g_object_unref(profile);
}
#endif
+ gdk_threads_enter();
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_transient_for(GTK_WINDOW(window), rawstudio_window);
- gtk_window_set_title(GTK_WINDOW(window), _("Processing photos"));
+ gtk_window_set_position(GTK_WINDOW(window),
GTK_WIN_POS_CENTER_ON_PARENT);
+ gtk_window_set_destroy_with_parent(GTK_WINDOW(window), TRUE);
gtk_window_resize(GTK_WINDOW(window), 250, 250);
g_signal_connect((gpointer) window, "delete_event",
G_CALLBACK(window_destroy), &abort_render);
@@ -466,25 +467,17 @@
gtk_box_pack_start (GTK_BOX (vbox), cancel, FALSE, FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 15);
- /* Remember fullscreen state */
- if (gdk_window_get_state((GTK_WIDGET(rawstudio_window))->window) &
GDK_WINDOW_STATE_FULLSCREEN)
- {
- fullscreen = TRUE;
- gtk_window_unfullscreen(rawstudio_window);
- }
- gtk_widget_hide(GTK_WIDGET(rawstudio_window));
gtk_widget_show_all(window);
while (gtk_events_pending()) gtk_main_iteration();
g_mkdir_with_parents(queue->directory, 00755);
g_get_current_time(&start_time);
- left = rs_batch_num_entries(queue);
while(gtk_tree_model_get_iter_first(queue->list, &iter) &&
(!abort_render))
{
- done++;
- if (now_time.tv_sec > 0)
+ left = rs_batch_num_entries(queue);
+ if (done > 0 && now_time.tv_sec > 0)
{
time = (gint) (now_time.tv_sec-start_time.tv_sec);
eta = (time/done)*left;
@@ -495,15 +488,19 @@
s = eta;
eta_text = g_strdup_printf(_("Time left: %dh %dm %ds"),
h, m, s);
+ title_text = g_strdup_printf(_("Processing Image
%d/%d"), done+1, done+left);
}
else
{
eta_text = g_strdup(_("Time left: ..."));
+ title_text = g_strdup_printf(_("Processing Image
1/%d."), left);
}
- left--;
+ gtk_window_set_title(GTK_WINDOW(window), title_text);
gtk_label_set_text(GTK_LABEL(eta_label), eta_text);
g_free(eta_text);
+ g_free(title_text);
+ done++;
gtk_tree_model_get(queue->list, &iter,
RS_QUEUE_ELEMENT_FILENAME, &filename_in,
@@ -515,6 +512,7 @@
while (gtk_events_pending()) gtk_main_iteration();
g_free(basename);
+ gdk_threads_leave();
photo = rs_photo_load_from_file(filename_in);
if (photo)
{
@@ -540,6 +538,7 @@
if (FALSE == g_file_test(parsed_dir, G_FILE_TEST_EXISTS
| G_FILE_TEST_IS_DIR))
if (g_mkdir_with_parents(parsed_dir, 0x1ff))
{
+ gdk_threads_enter();
gui_status_notify(_("Could not create
output directory."));
break;
}
@@ -604,6 +603,7 @@
rs_filter_param_set_object(RS_FILTER_PARAM(request),
"colorspace", display_color_space);
filter_response = rs_filter_get_image8(fend, request);
pixbuf = rs_filter_response_get_image8(filter_response);
+ gdk_threads_enter();
if (pixbuf)
{
gtk_image_set_from_pixbuf(GTK_IMAGE(preview),
pixbuf);
@@ -612,7 +612,7 @@
g_object_unref(request);
g_object_unref(filter_response);
- if (left > 0)
+ if (left > 1)
{
GtkTreeIter iter2 = iter;
if (gtk_tree_model_iter_next (queue->list,
&iter2))
@@ -628,6 +628,7 @@
while (gtk_events_pending())
gtk_main_iteration();
g_free(basename);
+ gdk_threads_leave();
width = 65535;
height = 65535;
@@ -666,6 +667,7 @@
g_assert(RS_IS_FILTER(fend));
gboolean exported = rs_output_execute(queue->output,
fend);
+ gdk_threads_enter();
if (exported)
rs_store_set_flags(NULL, photo->filename, NULL,
NULL, &exported);
else
@@ -686,12 +688,8 @@
}
gtk_widget_destroy(window);
- /* Restore fullscreen state if needed */
- if (fullscreen)
- gtk_window_fullscreen(rawstudio_window);
- gtk_widget_show_all(GTK_WIDGET(rawstudio_window));
-
batch_queue_update_sensivity(queue);
+ gdk_threads_leave();
g_object_unref(finput);
g_object_unref(fdemosaic);
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit