diff options
Diffstat (limited to 'src/eom-exif-details.c')
-rw-r--r-- | src/eom-exif-details.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/eom-exif-details.c b/src/eom-exif-details.c index 1b1e548..efe1e42 100644 --- a/src/eom-exif-details.c +++ b/src/eom-exif-details.c @@ -451,13 +451,22 @@ exif_entry_cb (ExifEntry *entry, gpointer data) ExifIfd ifd = exif_entry_get_ifd (entry); char *path; char b[1024]; + const gint key = ifd << 16 | entry->tag; + + /* This should optimize away if comparision is correct */ + g_warn_if_fail (EXIF_IFD_COUNT <= G_MAXUINT16); view = EOM_EXIF_DETAILS (data); priv = view->priv; store = GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view))); - path = g_hash_table_lookup (priv->id_path_hash, GINT_TO_POINTER (entry->tag)); + /* Take the tag's IFD into account when caching their GtkTreePaths. + * That should fix key collisions for tags that have the same number + * but are stored in different IFDs. Exif tag numbers are 16-bit + * values so we should be able to set the high word to the IFD number. + */ + path = g_hash_table_lookup (priv->id_path_hash, GINT_TO_POINTER (key)); if (path != NULL) { set_row_data (store, @@ -500,8 +509,8 @@ exif_entry_cb (ExifEntry *entry, gpointer data) sizeof(b))); g_hash_table_insert (priv->id_path_hash, - GINT_TO_POINTER (entry->tag), - path); + GINT_TO_POINTER (key), + path); } } } |