mirror of
https://gitlab.gnome.org/GNOME/nautilus
synced 2024-09-17 23:01:59 +00:00
Optionally support XMP metadata in images via exemi (#451380) Patch from
2007-07-24 Alexander Larsson <alexl@redhat.com> * configure.in: * src/Makefile.am: * src/nautilus-image-properties-page.c: * src/nautilus-main.c: Optionally support XMP metadata in images via exemi (#451380) Patch from Hubert Figuiere svn path=/trunk/; revision=13021
This commit is contained in:
parent
5e29db8a25
commit
39e570a717
|
@ -1,3 +1,12 @@
|
|||
2007-07-24 Alexander Larsson <alexl@redhat.com>
|
||||
|
||||
* configure.in:
|
||||
* src/Makefile.am:
|
||||
* src/nautilus-image-properties-page.c:
|
||||
* src/nautilus-main.c:
|
||||
Optionally support XMP metadata in images via exemi (#451380)
|
||||
Patch from Hubert Figuiere
|
||||
|
||||
2007-07-24 Alexander Larsson <alexl@redhat.com>
|
||||
|
||||
* src/nautilus-connect-server-dialog.c:
|
||||
|
|
13
configure.in
13
configure.in
|
@ -22,6 +22,7 @@ m4_define(startup_notification_minver, 0.8)
|
|||
m4_define(exif_minver, 0.5.12)
|
||||
m4_define(beagle_minver, 0.0.12)
|
||||
m4_define(tracker_minver, 0.0.1)
|
||||
m4_define(exempi_minver, 1.99.2)
|
||||
|
||||
dnl 1. If the library code has changed at all since last release, then increment revision.
|
||||
dnl 2. If any interfaces have been added, then increment current and set revision to 0.
|
||||
|
@ -259,6 +260,18 @@ PKG_CHECK_MODULES(EXIF, libexif > exif_minver, [
|
|||
AC_SUBST(EXIF_CFLAGS)
|
||||
AC_SUBST(EXIF_LIBS)
|
||||
|
||||
dnl ==========================================================================
|
||||
|
||||
dnl exempi checking
|
||||
|
||||
PKG_CHECK_MODULES(EXEMPI, exempi-2.0 >= exempi_minver, [
|
||||
AM_CONDITIONAL(HAVE_EXEMPI, true)
|
||||
AC_DEFINE(HAVE_EXEMPI, 1, [Define to enable XMP support])
|
||||
], [AM_CONDITIONAL(HAVE_EXEMPI, false)])
|
||||
|
||||
AC_SUBST(EXEMPI_CFLAGS)
|
||||
AC_SUBST(EXEMPI_LIBS)
|
||||
|
||||
dnl ==========================================================================
|
||||
dnl search implementations
|
||||
dnl ****************************
|
||||
|
|
|
@ -14,6 +14,7 @@ INCLUDES = \
|
|||
-I$(top_builddir)/libnautilus-private \
|
||||
$(CORE_CFLAGS) \
|
||||
$(EXIF_CFLAGS) \
|
||||
$(EXEMPI_CFLAGS) \
|
||||
-DDATADIR=\""$(datadir)"\" \
|
||||
-DLIBDIR=\""$(libdir)"\" \
|
||||
-DNAUTILUS_DATADIR=\""$(datadir)/nautilus"\" \
|
||||
|
@ -30,6 +31,7 @@ LDADD =\
|
|||
$(top_builddir)/libnautilus-private/libnautilus-private.la \
|
||||
$(CORE_LIBS) \
|
||||
$(EXIF_LIBS) \
|
||||
$(EXEMPI_LIBS) \
|
||||
$(POPT_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
/*
|
||||
* Copyright (C) 2004 Red Hat, Inc
|
||||
* Copyright (c) 2007 Novell, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
@ -19,6 +20,7 @@
|
|||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Author: Alexander Larsson <alexl@redhat.com>
|
||||
* XMP support by Hubert Figuiere <hfiguiere@novell.com>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
@ -38,6 +40,18 @@
|
|||
#include <libexif/exif-data.h>
|
||||
#include <libexif/exif-ifd.h>
|
||||
#include <libexif/exif-loader.h>
|
||||
#define ENABLE_METADATA 1
|
||||
#endif
|
||||
#ifdef HAVE_EXEMPI
|
||||
#include <exempi/xmp.h>
|
||||
#include <exempi/xmpconsts.h>
|
||||
#include <libgnomevfs/gnome-vfs-utils.h>
|
||||
#if !defined(ENABLE_METADATA)
|
||||
#define ENABLE_METADATA 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_METADATA
|
||||
#include <gtk/gtkliststore.h>
|
||||
#include <gtk/gtktreestore.h>
|
||||
#include <gtk/gtktreeview.h>
|
||||
|
@ -61,6 +75,9 @@ struct NautilusImagePropertiesPageDetails {
|
|||
#ifdef HAVE_EXIF
|
||||
ExifLoader *exifldr;
|
||||
#endif /*HAVE_EXIF*/
|
||||
#ifdef HAVE_EXEMPI
|
||||
XmpPtr xmp;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef HAVE_EXIF
|
||||
|
@ -230,19 +247,69 @@ append_exifdata_string (ExifData *exifdata, GString *string)
|
|||
}
|
||||
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_EXPOSURE_TIME, _("Exposure Time"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_EXPOSURE_PROGRAM, _("Exposure Program"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_APERTURE_VALUE, _("Aperture Value"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_METERING_MODE, _("Metering Mode"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_FLASH,_("Flash Fired"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_FOCAL_LENGTH,_("Focal Length"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_SHUTTER_SPEED_VALUE, _("Shutter Speed"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_ISO_SPEED_RATINGS, _("ISO Speed Rating"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_FLASH,_("Flash Fired"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_METERING_MODE, _("Metering Mode"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_EXPOSURE_PROGRAM, _("Exposure Program"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_FOCAL_LENGTH,_("Focal Length"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_SOFTWARE, _("Software"));
|
||||
|
||||
}
|
||||
}
|
||||
#endif /*HAVE_EXIF*/
|
||||
|
||||
|
||||
#ifdef HAVE_EXEMPI
|
||||
static void
|
||||
append_xmp_value_pair(GString *string, XmpPtr xmp, const char * ns, const char * propname, gchar* descr)
|
||||
{
|
||||
uint32_t options;
|
||||
XmpStringPtr value = xmp_string_new();
|
||||
if(xmp_get_property_and_bits(xmp, ns, propname, value, &options)) {
|
||||
if(XMP_IS_PROP_SIMPLE(options)) {
|
||||
g_string_append_printf(string, "<b>%s:</b> %s\n", descr, xmp_string_cstr(value));
|
||||
}
|
||||
else if(XMP_IS_PROP_ARRAY(options)) {
|
||||
XmpIteratorPtr iter = xmp_iterator_new(xmp, ns, propname, XMP_ITER_JUSTLEAFNODES);
|
||||
if(iter) {
|
||||
bool first = true;
|
||||
g_string_append_printf(string, "<b>%s:</b> ", descr);
|
||||
while (xmp_iterator_next(iter, NULL, NULL, value, &options)
|
||||
&& !XMP_IS_PROP_QUALIFIER(options)) {
|
||||
if(!first) {
|
||||
g_string_append_printf(string, ", ");
|
||||
}
|
||||
else {
|
||||
first = false;
|
||||
}
|
||||
g_string_append_printf(string, "%s", xmp_string_cstr(value));
|
||||
}
|
||||
xmp_iterator_free(iter);
|
||||
g_string_append_printf(string, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
xmp_string_free(value);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
append_xmpdata_string(XmpPtr xmp, GString *string)
|
||||
{
|
||||
if(xmp != NULL) {
|
||||
append_xmp_value_pair(string, xmp, NS_IPTC4XMP, "Location", _("Location"));
|
||||
append_xmp_value_pair(string, xmp, NS_DC, "description", _("Description"));
|
||||
append_xmp_value_pair(string, xmp, NS_DC, "subject", _("Keywords"));
|
||||
append_xmp_value_pair(string, xmp, NS_DC, "creator", _("Creator"));
|
||||
append_xmp_value_pair(string, xmp, NS_DC, "rights", _("Copyright"));
|
||||
append_xmp_value_pair(string, xmp, NS_XAP,"Rating", _("Rating"));
|
||||
/* TODO add CC licenses */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
load_finished (NautilusImagePropertiesPage *page)
|
||||
{
|
||||
|
@ -272,6 +339,9 @@ load_finished (NautilusImagePropertiesPage *page)
|
|||
#ifdef HAVE_EXIF
|
||||
append_exifdata_string (exif_loader_get_data (page->details->exifldr), str);
|
||||
#endif /*HAVE_EXIF*/
|
||||
#ifdef HAVE_EXEMPI
|
||||
append_xmpdata_string(page->details->xmp, str);
|
||||
#endif /*HAVE EXEMPI*/
|
||||
|
||||
gtk_label_set_markup (GTK_LABEL (page->details->resolution), str->str);
|
||||
gtk_label_set_selectable (GTK_LABEL (page->details->resolution), TRUE);
|
||||
|
@ -291,6 +361,12 @@ load_finished (NautilusImagePropertiesPage *page)
|
|||
page->details->exifldr = NULL;
|
||||
}
|
||||
#endif /*HAVE_EXIF*/
|
||||
#ifdef HAVE_EXEMPI
|
||||
if (page->details->xmp != NULL) {
|
||||
xmp_free(page->details->xmp);
|
||||
page->details->xmp = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (page->details->vfs_handle != NULL) {
|
||||
gnome_vfs_async_close (page->details->vfs_handle, file_closed_callback, NULL);
|
||||
|
@ -402,6 +478,25 @@ load_location (NautilusImagePropertiesPage *page,
|
|||
if (page->details->vfs_handle != NULL)
|
||||
gnome_vfs_async_cancel (page->details->vfs_handle);
|
||||
|
||||
#ifdef HAVE_EXEMPI
|
||||
{
|
||||
/* Current Exempi does not support setting custom IO to be able to use Gnome-vfs */
|
||||
/* So it will only work with local files. Future version might remove this limitation */
|
||||
XmpFilePtr xf;
|
||||
gchar* localname;
|
||||
localname = gnome_vfs_get_local_path_from_uri (location);
|
||||
if(localname) {
|
||||
xf = xmp_files_open_new(localname, 0);
|
||||
page->details->xmp = xmp_files_get_new_xmp(xf); /* only load when loading */
|
||||
xmp_files_close(xf, 0);
|
||||
g_free(localname);
|
||||
}
|
||||
else {
|
||||
page->details->xmp = NULL;
|
||||
}
|
||||
}
|
||||
#endif /*HAVE_EXEMPI*/
|
||||
|
||||
gnome_vfs_async_open (&page->details->vfs_handle,
|
||||
location,
|
||||
GNOME_VFS_OPEN_READ,
|
||||
|
|
|
@ -63,6 +63,10 @@
|
|||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef HAVE_EXEMPI
|
||||
#include <exempi/xmp.h>
|
||||
#endif
|
||||
|
||||
/* Keeps track of everyone who wants the main event loop kept active */
|
||||
static GSList *event_loop_registrants;
|
||||
|
||||
|
@ -433,6 +437,10 @@ main (int argc, char *argv[])
|
|||
|
||||
g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE);
|
||||
|
||||
#ifdef HAVE_EXEMPI
|
||||
xmp_init();
|
||||
#endif
|
||||
|
||||
program = gnome_program_init ("nautilus", VERSION,
|
||||
LIBGNOMEUI_MODULE, argc, argv,
|
||||
GNOME_PROGRAM_STANDARD_PROPERTIES,
|
||||
|
|
Loading…
Reference in a new issue