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

Reply via email to