Author: post
Date: 2010-03-28 17:42:29 +0200 (Sun, 28 Mar 2010)
New Revision: 3272
Modified:
trunk/src/gtk-interface.c
trunk/src/rs-library.c
trunk/src/rs-store.c
Log:
- Enable proper gdk locking, when loading thumbnails or otherwise updating the
store, this should remove the occasional lockup.
- Use dot_dir function for creating tag xml names.
- Check if dot_dir returns NULL on unwritable directories several places.
- Return no more than 1000 hits on tag searches.
- Only re-add tags for files that exist.
Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c 2010-03-28 15:11:27 UTC (rev 3271)
+++ trunk/src/gtk-interface.c 2010-03-28 15:42:29 UTC (rev 3272)
@@ -1189,8 +1189,6 @@
if (!lwd)
lwd = g_get_current_dir();
- /* rs_store_load_directory() MUST have the GDK lock! */
- gdk_threads_enter();
gui_set_busy(TRUE);
GTK_CATCHUP();
gui_status_push(_("Opening directory..."));
@@ -1213,7 +1211,6 @@
GTK_CATCHUP();
gui_set_busy(FALSE);
gui_status_push(_("Ready"));
- gdk_threads_leave();
rs_dir_selector_expand_path(RS_DIR_SELECTOR(dir_selector), lwd);
g_free(lwd);
}
@@ -1222,8 +1219,6 @@
factory = NULL;
gui_set_busy(FALSE);
- gdk_threads_enter();
gtk_main();
- gdk_threads_leave();
return(0);
}
Modified: trunk/src/rs-library.c
===================================================================
--- trunk/src/rs-library.c 2010-03-28 15:11:27 UTC (rev 3271)
+++ trunk/src/rs-library.c 2010-03-28 15:42:29 UTC (rev 3272)
@@ -62,6 +62,8 @@
#include <libxml/xmlwriter.h>
#define LIBRARY_VERSION 2
+#define TAGS_XML_FILE "tags.xml"
+#define MAX_SEARCH_RESULTS 1000
struct _RSLibrary {
GObject parent;
@@ -720,11 +722,16 @@
sqlite3_prepare_v2(db, "select library.filename from library,result
where library.id = result.photo and result.count = ?1 order by
library.filename;", -1, &stmt, NULL);
rc = sqlite3_bind_int(stmt, 1, num_tags);
- while (sqlite3_step(stmt) == SQLITE_ROW)
+
+ gint count = 0;
+ while (sqlite3_step(stmt) == SQLITE_ROW && count < MAX_SEARCH_RESULTS)
{
filename = g_strdup((gchar *) sqlite3_column_text(stmt, 0));
if (g_file_test(filename, G_FILE_TEST_EXISTS))
+ {
photos = g_list_append(photos, filename);
+ count++;
+ }
}
sqlite3_finalize(stmt);
@@ -931,10 +938,13 @@
g_list_foreach(photos, list_photos, NULL);
g_list_foreach(tags, list_photos, NULL);
*/
-
/* FIXME: deselect all photos in store */
rs_store_remove(carrier->store, NULL, NULL);
g_list_foreach(photos, load_photos, carrier->store);
+
+ /* Add task to re-enable priority count, and update after last
thumbnail */
+ rs_store_load_file(carrier->store, NULL);
+
/* Fix size of iconview */
rs_store_set_iconview_size(carrier->store, g_list_length(photos));
@@ -1101,10 +1111,22 @@
gchar *filename = NULL, *checksum, *tag, *t_filename;
gint autotag;
- const gchar *tagfile = g_build_filename(directory,
"/.rawstudio/tags.xml", NULL);
+ gchar *dotdir = rs_dotdir_get(directory);
+
+ if (!dotdir)
+ return;
+ GString *gs = g_string_new(dotdir);
+ g_string_append(gs, G_DIR_SEPARATOR_S);
+ g_string_append(gs, TAGS_XML_FILE);
+ gchar *xmlfile = gs->str;
+ g_string_free(gs, FALSE);
+
xmlTextWriterPtr writer;
- writer = xmlNewTextWriterFilename(tagfile, 0);
+ writer = xmlNewTextWriterFilename(xmlfile, 0);
+ if (!writer)
+ return;
+
xmlTextWriterSetIndent(writer, 1);
xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);
xmlTextWriterStartElement(writer, BAD_CAST "rawstudio-tags");
@@ -1148,8 +1170,16 @@
rs_library_restore_tags(const gchar *directory)
{
RSLibrary *library = rs_library_get_singleton();
- const gchar *tagfile = g_build_filename(directory,
"/.rawstudio/tags.xml", NULL);
- if (!g_file_test(tagfile, G_FILE_TEST_EXISTS))
+ gchar *dotdir = rs_dotdir_get(directory);
+
+ if (!dotdir)
+ return;
+ GString *gs = g_string_new(dotdir);
+ g_string_append(gs, G_DIR_SEPARATOR_S);
+ g_string_append(gs, TAGS_XML_FILE);
+ gchar *xmlfile = gs->str;
+ g_string_free(gs, FALSE);
+ if (!g_file_test(xmlfile, G_FILE_TEST_EXISTS))
return;
xmlDocPtr doc;
@@ -1160,7 +1190,7 @@
gchar *filename, *identifier, *tagname;
gint autotag, photoid, tagid;
- doc = xmlParseFile(tagfile);
+ doc = xmlParseFile(xmlfile);
if (!doc)
return;
@@ -1183,7 +1213,7 @@
xmlFree(val);
photoid = library_find_photo_id(library, filename);
- if ( photoid == -1)
+ if ( photoid == -1 && g_file_test(filename,
G_FILE_TEST_EXISTS))
{
photoid = rs_library_add_photo(library,
filename);
Modified: trunk/src/rs-store.c
===================================================================
--- trunk/src/rs-store.c 2010-03-28 15:11:27 UTC (rev 3271)
+++ trunk/src/rs-store.c 2010-03-28 15:42:29 UTC (rev 3272)
@@ -1040,6 +1040,17 @@
gboolean exported;
gint priority;
WORKER_JOB *job;
+
+ if (!fullname)
+ {
+ /* Build dummy job to signal re-enable priority count */
+ job = g_new(WORKER_JOB, 1);
+ job->last_icon = TRUE;
+ job->store = g_object_ref(store);
+ job->filename =
g_strdup("796f7577696c6c6e6576657266696e646d65");
+ rs_io_idle_read_metadata(job->filename, METADATA_CLASS,
got_metadata, job);
+ return;
+ }
gchar *name = g_path_get_basename(fullname);
@@ -1055,17 +1066,20 @@
rs_cache_load_quick(fullname, &priority, &exported);
/* Add thumbnail to store */
+ gdk_threads_enter();
gtk_list_store_append (store->store, &iter);
gtk_list_store_set (store->store, &iter,
METADATA_COLUMN, NULL,
PIXBUF_COLUMN, icon_default,
PIXBUF_CLEAN_COLUMN, icon_default,
- TEXT_COLUMN, g_strdup(""),
- FULLNAME_COLUMN, fullname,
+ TEXT_COLUMN, g_strdup(name),
+ FULLNAME_COLUMN, g_strdup(fullname),
PRIORITY_COLUMN, priority,
EXPORTED_COLUMN, exported,
-1);
+ gdk_threads_leave();
+
/* Push an asynchronous job for loading the thumbnail */
job = g_new(WORKER_JOB, 1);
job->store = g_object_ref(store);
@@ -1087,7 +1101,6 @@
gchar *fullname;
GDir *dir;
gint count = 0;
- WORKER_JOB *job;
gchar *path_normalized = rs_normalize_path(path);
@@ -1114,13 +1127,6 @@
g_free(fullname);
}
- /* Build dummy job to signal re-enable priority count */
- job = g_new(WORKER_JOB, 1);
- job->last_icon = TRUE;
- job->store = g_object_ref(store);
- job->filename = g_strdup("796f7577696c6c6e6576657266696e646d65");
- rs_io_idle_read_metadata(job->filename, METADATA_CLASS, got_metadata,
job);
-
g_free(path_normalized);
if (dir)
g_dir_close(dir);
@@ -1128,6 +1134,7 @@
return count;
}
+
/* Public functions */
/**
@@ -1171,6 +1178,7 @@
if (tree_find_filename(GTK_TREE_MODEL(store->store), filename,
&i, NULL))
iter = &i;
+ gdk_threads_enter();
/* We got iter, just remove it */
if (iter)
gtk_list_store_remove(GTK_LIST_STORE(GTK_TREE_MODEL(store->store)), iter);
@@ -1178,6 +1186,7 @@
/* If both are NULL, remove everything */
if ((filename == NULL) && (iter == NULL))
gtk_list_store_clear(store->store);
+ gdk_threads_leave();
}
@@ -1234,7 +1243,11 @@
items = load_directory(store, path, library, load_8bit, load_recursive);
rs_io_unlock();
+ /* Add a final entry to re-enable the priority count */
+ rs_store_load_file(store, NULL);
+
/* unset model and make sure we have enough columns */
+ gdk_threads_enter();
for (n=0;n<NUM_VIEWS;n++)
{
gtk_icon_view_set_model(GTK_ICON_VIEW (store->iconview[n]),
NULL);
@@ -1265,6 +1278,7 @@
/* load group file and group photos */
store_load_groups(store->store);
#endif
+ gdk_threads_leave();
/* Start the preloader */
predict_preload(store, TRUE);
@@ -2052,6 +2066,8 @@
store_get_fullname(store, &iter, &filename);
dotdir = rs_dotdir_get(filename);
+ if (!dotdir)
+ return;
GString *gs = g_string_new(dotdir);
g_string_append(gs, G_DIR_SEPARATOR_S);
g_string_append(gs, GROUP_XML_FILE);
@@ -2120,6 +2136,8 @@
store_get_fullname(store, &iter, &filename);
dotdir = rs_dotdir_get(filename);
+ if (!dotdir)
+ return;
GString *gs = g_string_new(dotdir);
g_string_append(gs, G_DIR_SEPARATOR_S);
@@ -2408,6 +2426,7 @@
/* unblock the priority count */
if (job->last_icon)
{
+ gdk_threads_enter();
g_signal_handler_unblock(job->store->store,
job->store->counthandler);
/* count'em by sending a "row-changed"-signal */
@@ -2419,6 +2438,8 @@
g_free(job->filename);
g_object_unref(job->store);
g_free(job);
+ GTK_CATCHUP();
+ gdk_threads_leave();
return;
}
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit