# HG changeset patch
# User Matti Hamalainen
# Date 1544644590 -7200
# Node ID 49bd0d974e88bfbe4264afa751c5bb5360c9d1ca
# Parent c79d70e1807640321f96979520fb00388da8294a# Parent c56112a165a4e483af1e1a04b28b2699fc889b79
Merge.
diff -r c79d70e18076 -r 49bd0d974e88 .gitignore
--- a/.gitignore Tue Oct 02 22:50:14 2018 +0300
+++ b/.gitignore Wed Dec 12 21:56:30 2018 +0200
@@ -6,6 +6,9 @@
*.rej
*.orig
+# GNOME .desktop files
+*.desktop
+
# /
/aclocal.m4
/autom4te.cache
@@ -32,23 +35,10 @@
/depcomp
/auxdir
/stamp-h1
-/geeqie.desktop
/intltool-extract.in
/intltool-update.in
/intltool-merge.in
-# /plugins/import/
-/plugins/import/*.desktop
-
-# /plugins/rotate/
-/plugins/rotate/*.desktop
-
-# /plugins/symlink/
-/plugins/symlink/*.desktop
-
-# /plugins/ufraw/
-/plugins/ufraw/*.desktop
-
# /po/
/po/Makefile.in.in
/po/POTFILES
diff -r c79d70e18076 -r 49bd0d974e88 .mailmap
--- a/.mailmap Tue Oct 02 22:50:14 2018 +0300
+++ b/.mailmap Wed Dec 12 21:56:30 2018 +0200
@@ -6,6 +6,8 @@
- J. R. Schmid
+
Morgan Hardwood
Rezső Páder
+Olaf Seibert <>
+
diff -r c79d70e18076 -r 49bd0d974e88 README.md
--- a/README.md Tue Oct 02 22:50:14 2018 +0300
+++ b/README.md Wed Dec 12 21:56:30 2018 +0200
@@ -100,17 +100,26 @@
## Downloading
-Geeqie is available as a package with some distributions.
+Geeqie is available as a package with some distributions, however Geeqie is stable and you may compile the latest version from sources.
+
+There are two scripts which will download and compile the sources for you.
-However Geeqie is stable, and you may download the latest version (if you have installed git) from here:
+The first script will install Geeqie to a defined location, and will run under any system. However, it is left to you to make sure dependencies are fulfilled.
+To get the script, from the command line type:
+`wget https://raw.githubusercontent.com/pixlsus/Scripts/master/build-geeqie`
+
+The second script will run only on Debian-based system, but will fulfil all dependencies and also give you the opportunity to include additional pixbuf loaders and other useful programs.
+To get the script, from the command line type:
+`wget https://raw.githubusercontent.com/BestImageViewer/geeqie/master/web/geeqie-install-debian.sh`
+
+
+If you wish to compile the sources yourself you may download the latest version (if you have installed git) from here:
Either: `git clone git://www.geeqie.org/geeqie.git`
Or: `git clone http://www.geeqie.org/git/geeqie.git`
-For Ubuntu and other Debian-based systems, [this script](http://www.geeqie.org/web/geeqie-install-debian.sh) will download Geeqie sources, all dependencies, and compile and install Geeqie. You may also select which optional libraries to install.
-
-## Installation
+## Manual Installation
List compile options: `./autogen.sh --help`
@@ -238,6 +247,19 @@
and copy to the location of the Geeqie ancilliary files, which is usually:
/usr/local/lib/geeqie/
+ libimage-exiftool-perl
+ For the jpeg extraction plugin
+
+ liblcms2-utils
+ For the command-line tool jpgicc, used by the jpeg extraction plugin
+
+ ImageMagick
+ exiftran
+ gphoto2
+ ufraw
+ exiv2
+ Additional command-line tools for various operations
+
### Code hackers:
If you plan on making any major changes to the code that will be offered for
diff -r c79d70e18076 -r 49bd0d974e88 autogen.sh
--- a/autogen.sh Tue Oct 02 22:50:14 2018 +0300
+++ b/autogen.sh Wed Dec 12 21:56:30 2018 +0200
@@ -6,7 +6,7 @@
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
-(test -f $srcdir/configure.in \
+(test -f $srcdir/configure.ac\
&& test -f $srcdir/src/main.c \
&& test -f $srcdir/src/main.h) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
@@ -24,8 +24,8 @@
DIE=1
}
-(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.in >/dev/null) && {
- (grep "sed.*POTFILES" $srcdir/configure.in) >/dev/null || \
+(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.ac >/dev/null) && {
+ (grep "sed.*POTFILES" $srcdir/configure.ac) >/dev/null || \
(glib-gettextize --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`glib-gettextize' installed."
@@ -74,13 +74,13 @@
am_opt=--include-deps;;
esac
-auxdir="`sed -ne 's/^[ \t]*A._CONFIG_AUX_DIR *( *\([^ )]*\).*/\1/p' $srcdir/configure.in`"
+auxdir="`sed -ne 's/^[ \t]*A._CONFIG_AUX_DIR *( *\([^ )]*\).*/\1/p' $srcdir/configure.ac`"
if test -n "$auxdir"; then
if test ! -d "$srcdir/$auxdir"; then
mkdir -p "$srcdir/$auxdir"
fi fi
-for coin in `find $srcdir -name configure.in -print`
+for coin in `find $srcdir -name configure.ac -print`
do
dr=`dirname $coin`
if test -f $dr/NO-AUTO-GEN; then
@@ -97,9 +97,9 @@
## echo "**Warning**: No such directory \`$k'. Ignored."
fi
done
- if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
- if grep "sed.*POTFILES" configure.in >/dev/null; then
- : do nothing -- we still have an old unmodified configure.in
+ if grep "^AM_GLIB_GNU_GETTEXT" configure.ac >/dev/null; then
+ if grep "sed.*POTFILES" configure.ac >/dev/null; then
+ : do nothing -- we still have an old unmodified configure.ac
else
echo "Creating $dr/aclocal.m4 ..."
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
@@ -117,7 +117,7 @@
fi
echo "Running aclocal $aclocalinclude ..."
aclocal $aclocalinclude
- if grep "^AC_CONFIG_HEADER" configure.in >/dev/null; then
+ if grep "^AC_CONFIG_HEADER" configure.ac >/dev/null; then
echo "Running autoheader..."
autoheader
fi
diff -r c79d70e18076 -r 49bd0d974e88 configure.ac
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/configure.ac Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,690 @@
+dnl Process this file with autoconf to produce a configure script. -*- Autoconf
+ -*-
+
+dnl This file is a part of Geeqie project (http://www.geeqie.org/).
+dnl Copyright (C) 2008 - 2018 The Geeqie Team
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+
+AC_PREREQ(2.57)
+AC_INIT([geeqie], m4_esyscmd_s(git rev-parse --quiet --verify --short HEAD), [geeqie@freelists.org], [], [http://www.geeqie.org/])
+
+# Add -Werror to the default CFLAGS
+CFLAGS+=" -Werror -Wno-error=deprecated-declarations -Wno-error=sign-compare -Wno-error=return-type"
+
+# Check for rightly dirs
+AC_CONFIG_SRCDIR([src/main.c])
+
+AC_CONFIG_AUX_DIR(auxdir)
+# Require Automake 1.14 for %reldir% support
+AM_INIT_AUTOMAKE([1.14.1 subdir-objects foreign dist-xz no-dist-gzip])
+
+AC_CONFIG_HEADER([config.h])
+
+# Only for developers
+AM_MAINTAINER_MODE
+
+# Silent build for automake >= 1.11
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+AC_ARG_ENABLE(developer, [
+Development options:
+AC_HELP_STRING([--enable-developer], [turn on developers mode [default=no]])],
+[
+ __IS_DEVELOPER=yes
+],
+[
+if test "x${enable_developer}" != "xyes"
+then
+ __IS_DEVELOPER=no
+else
+ __IS_DEVELOPER=yes
+fi
+])
+
+DX_HTML_FEATURE(ON)
+DX_CHM_FEATURE(OFF)
+DX_CHI_FEATURE(OFF)
+DX_MAN_FEATURE(OFF)
+DX_RTF_FEATURE(OFF)
+DX_XML_FEATURE(OFF)
+DX_PDF_FEATURE(OFF)
+DX_PS_FEATURE(OFF)
+
+DX_INIT_DOXYGEN($PACKAGE_NAME, doxygen.conf, doc/doxygen)
+
+# Debug support
+# ----------------------------------------------------------------------
+
+dnl Debugging option
+dnl FIXME: official release convert default to 'no'
+dnl
+
+AC_ARG_ENABLE([debug-flags], [
+Development options:
+AC_HELP_STRING([--enable-debug-flags], [use compiler flags for debugging [default=no]])], [],
+[
+if test "x${enable_developer}" != "xyes"
+then
+ enable_debug_flags="no"
+else
+ enable_debug_flags="yes"
+fi
+])
+
+AC_ARG_ENABLE([debug-log], [
+Development options:
+AC_HELP_STRING([--enable-debug-log], [enable debugging messages [default=yes]])], [], [enable_debug_log="yes"])
+
+if test "x${enable_debug_flags}" != "xno"
+then
+ if test "x${enable_developer}" = "xyes"
+ then
+ CXXFLAGS="${CXXFLAGS} -Wall"
+ CFLAGS="${CFLAGS} -Wstrict-prototypes -Wall"
+ fi
+ __COMMONFLAGS="-g -O0 -Wextra -Wunused-value -Wunused-variable -Wunused-function -Wunused-label -Wcomment -Wmissing-braces -Wparentheses -Wreturn-type -Wswitch -Wstrict-aliasing -Wno-unused-parameter -Wformat -Wformat-security -DGQ_DEBUG_PATH_UTF8=1"
+ CXXFLAGS="${CXXFLAGS} ${__COMMONFLAGS}"
+ CFLAGS="${CFLAGS} ${__COMMONFLAGS} -Wimplicit-int -Werror-implicit-function-declaration"
+ __IS_DEBUG_FLAGS=yes
+else
+ __IS_DEBUG_FLAGS=no
+fi
+
+if test "x${enable_debug_log}" != "xno"
+then
+ AC_DEFINE(DEBUG,1,[Defined if Geeqie is compiled with debugging messages support])
+ __IS_DEBUG_LOG=yes
+else
+ __IS_DEBUG_LOG=no
+fi
+
+AM_CONDITIONAL(DEBUG, test x$enable_debug_flags = xyes)
+
+AC_ARG_ENABLE(deprecated, [
+AC_HELP_STRING([--enable-deprecated], [turn off checking of deprecated functions [default=yes]])], [],
+[
+if test "x${enable_developer}" != "xyes"
+then
+ enable_deprecated="no"
+else
+ enable_deprecated="yes"
+fi
+])
+
+if test "x${enable_deprecated}" != "xno"
+then
+ CXXFLAGS="${CXXFLAGS} -DGTK_DISABLE_DEPRECATED=1 -DGDK_DISABLE_DEPRECATED=1 -DGDK_PIXBUF_DISABLE_DEPRECATED=1 -DG_DISABLE_DEPRECATED=1"
+ CFLAGS="${CFLAGS} -DGTK_DISABLE_DEPRECATED=1 -DGDK_DISABLE_DEPRECATED=1 -DGDK_PIXBUF_DISABLE_DEPRECATED=1 -DG_DISABLE_DEPRECATED=1"
+ __IS_DEPRECATED=yes
+else
+ __IS_DEPRECATED=no
+fi
+
+
+AC_ISC_POSIX
+AC_PROG_CC
+AC_PROG_CC_C99
+AC_PROG_CXX
+AC_STDC_HEADERS
+AC_ARG_PROGRAM
+AC_SYS_LARGEFILE
+IT_PROG_INTLTOOL([0.35.0])
+
+
+dnl checks for functions
+AC_CHECK_FUNCS(strverscmp access fsync fflush)
+
+
+# Check target architecture
+
+# Check for Win32
+AC_MSG_CHECKING([for some Win32 platform])
+case "$target_os" in
+ mingw* | cygwin*)
+ platform_win32=yes
+ AC_DEFINE(PLATFORM_WIN32, 1, [Build on win32 OS])
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT([$platform_win32])
+AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
+
+AC_MSG_CHECKING([for native Win32])
+case "$target_os" in
+ mingw*)
+ os_win32=yes
+ AC_DEFINE(OS_WIN32, 1, [Build on native win32 OS])
+ os_unix=no
+ PATHSEP=';'
+ ;;
+ *)
+ os_win32=no
+ os_unix=yes
+ PATHSEP=':'
+ ;;
+esac
+AC_MSG_RESULT([$os_win32])
+AC_SUBST(PATHSEP)
+AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
+AM_CONDITIONAL(OS_UNIX, test "$os_unix" = "yes")
+
+if test "$os_win32" = "yes"; then
+ AC_CHECK_PROG(ms_librarian, lib.exe, yes, no)
+ AC_CHECK_TOOL(WINDRES, windres, :)
+else
+ WINDRES=":"
+fi
+
+AM_CONDITIONAL(MS_LIB_AVAILABLE, test x$ms_librarian = xyes)
+AM_CONDITIONAL(HAVE_WINDRES, test "x$WINDRES" != "x:")
+AC_SUBST(WINDRES)
+
+dnl reasonable guesses for where stuff is installed
+if test "x$prefix" = "xNONE"; then
+ prefix="/usr/local"
+else
+ prefix=$prefix
+fi
+
+AM_PATH_GLIB_2_0(2.24.0,,AC_MSG_ERROR(GLIB >= 2.24.0 not installed.))
+AC_ARG_ENABLE([gtk3], AC_HELP_STRING([--disable-gtk3], [use gtk2 instead of gtk3]),[gtk3="${enableval}"], [gtk3=m4_ifdef([AM_PATH_GTK_3_0], [auto], [no])])
+
+if test x$gtk3 = xyes; then
+ AC_MSG_WARN("Gtk3 enabled")
+ m4_ifdef([AM_PATH_GTK_3_0], [AM_PATH_GTK_3_0(3.0.0,,AC_MSG_ERROR(GTK+ >= 3.0.0 not installed.))])
+else
+ if test x$gtk3 != xno; then
+ AC_MSG_WARN("Gtk3 is preferred...")
+ m4_ifdef([AM_PATH_GTK_3_0], [AM_PATH_GTK_3_0(3.0.0,,[gtk3=no])])
+ fi
+fi
+
+if test x$gtk3 = xno; then
+ m4_ifdef([AM_PATH_GTK_2_0], [AM_PATH_GTK_2_0(2.20.0,,AC_MSG_ERROR(GTK+ >= 2.20.0 not installed.))])
+ true
+fi
+
+threads="auto"
+AC_ARG_ENABLE([threads],
+ AC_HELP_STRING([--disable-threads], [disable thread support]), [threads="${enableval}"])
+
+have_gthread="no"
+if test "x${threads}" != "xno" ; then
+ PKG_CHECK_MODULES(GTHREAD, [gthread-2.0], have_gthread="yes", [AC_MSG_WARN("No thread support in glib")])
+fi
+
+if test "x$have_gthread" != "xno"; then
+ AC_DEFINE(HAVE_GTHREAD, 1, Define if you have gthread library)
+ GLIB_CFLAGS="$GTHREAD_CFLAGS"
+ GLIB_LIBS="$GTHREAD_LIBS"
+fi
+
+
+AC_PATH_PROGS(GDK_PIXBUF_CSOURCE, "gdk-pixbuf-csource")
+AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
+
+AC_ARG_WITH(readmedir, [ --with-readmedir=DIR install path for readme files],
+ readmedir=$withval, readmedir="$prefix/share/doc/geeqie-$VERSION")
+AC_ARG_WITH(htmldir, [ --with-htmldir=DIR install path for html files],
+ htmldir=$withval, htmldir="$readmedir/html")
+
+AC_DEFINE_UNQUOTED(GQ_HELPDIR, "$readmedir", [Location of documentation files])
+AC_DEFINE_UNQUOTED(GQ_HTMLDIR, "$htmldir", [Location of html documentation])
+
+AC_PATH_PROG(GNOME_DOC_TOOL, gnome-doc-tool)
+
+AC_SUBST(readmedir)
+AC_SUBST(htmldir)
+
+eval "eval appdir=${datadir}/${PACKAGE}"
+AC_DEFINE_UNQUOTED([GQ_APP_DIR], "$appdir", [Location of application data])
+AC_SUBST(appdir)
+
+eval "eval gq_bindir=${prefix}/lib/${PACKAGE}"
+AC_DEFINE_UNQUOTED([GQ_BIN_DIR], "$gq_bindir", [Location of helper scripts and executables])
+AC_SUBST(gq_bindir)
+
+# LIRC support
+# ----------------------------------------------------------------------
+
+dnl Check for LIRC client support
+AC_MSG_CHECKING(if LIRC support is enabled)
+lirc=no
+AC_ARG_ENABLE([lirc],
+ AC_HELP_STRING([--disable-lirc], [disable lirc support (auto)]),
+[
+if test "x${enableval}" = "xyes" -a "x$GCC" = "xyes"; then
+ AC_MSG_RESULT(yes)
+ lirc=yes
+else
+ AC_MSG_RESULT(no)
+ lirc=no
+fi], AC_MSG_RESULT(no))
+
+
+AC_ARG_WITH(lirc-prefix,
+[ --with-lirc-prefix=PATH Prefix where LIRC is installed],
+[
+for dir in `echo "$withval" | tr : ' '`; do
+ if test -d $dir/lib; then CXXFLAGS="$CXXFLAGS -L$dir/lib"; fi
+ if test -d $dir/include; then CXXFLAGS="$CXXFLAGS -I$dir/include"; fi
+ done
+])
+
+HAVE_LIRC=no
+if test "x${lirc}" != "xno" ; then
+ AC_CHECK_HEADER(lirc/lirc_client.h,
+ [AC_CHECK_LIB(lirc_client,lirc_init,[HAVE_LIRC=yes;LIBS=-llirc_client $LIBS;AC_DEFINE([HAVE_LIRC],[],[Define to 1 if LIRC must be used])],,)],)
+fi
+AM_CONDITIONAL(HAVE_LIRC, [test "x$HAVE_LIRC" = xyes])
+
+
+# LCMS support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([lcms],
+ AC_HELP_STRING([--disable-lcms], [disable lcms support]),
+ [liblcms=$enableval], [liblcms=auto])
+
+if test "x${liblcms}" != "xno"; then
+ PKG_CHECK_MODULES(LCMS, [lcms2 >= 2.0],
+ [
+ HAVE_LCMS=yes
+ AC_DEFINE(HAVE_LCMS, 1, [define to enable use of color profiles with lcms])
+ AC_DEFINE(HAVE_LCMS2, 1, [lcms2 is used])
+ ],
+ [
+ PKG_CHECK_MODULES(LCMS, [lcms >= 1.14],
+ [
+ HAVE_LCMS=yes
+ AC_DEFINE(HAVE_LCMS, 1, [define to enable use of color profiles with lcms])
+ ],
+ [
+ HAVE_LCMS=no
+ AC_MSG_WARN([$LCMS_PKG_ERRORS])
+ ])
+ ])
+else
+ HAVE_LCMS=disabled
+fi
+
+AM_CONDITIONAL(HAVE_LCMS, [test "x$HAVE_LCMS" = xyes])
+AC_SUBST(LCMS_CFLAGS)
+AC_SUBST(LCMS_LIBS)
+
+# libjpeg support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([jpeg],
+ AC_HELP_STRING([--disable-jpeg], [disable direct jpeg support]),
+ [libjpeg=$enableval], [libjpeg=auto])
+
+if test "x${libjpeg}" != "xno"; then
+ AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,
+ HAVE_JPEG=yes
+ JPEG_LIBS=-ljpeg
+ AC_DEFINE(HAVE_JPEG, 1, [define to enable use of custom jpeg loader]),
+ HAVE_JPEG=no)
+else
+ HAVE_JPEG=disabled
+fi
+
+AM_CONDITIONAL(HAVE_JPEG, [test "x$HAVE_JPEG" = xyes])
+AC_SUBST(JPEG_CFLAGS)
+AC_SUBST(JPEG_LIBS)
+
+
+# libtiff support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([tiff],
+ AC_HELP_STRING([--disable-tiff], [disable direct tiff support]),
+ [libtiff=$enableval], [libtiff=auto])
+
+if test "x${libtiff}" != "xno"; then
+ AC_CHECK_LIB(tiff, TIFFClientOpen,
+ HAVE_TIFF=yes
+ TIFF_LIBS=-ltiff
+ AC_DEFINE(HAVE_TIFF, 1, [define to enable use of custom tiff loader]),
+ HAVE_TIFF=no)
+else
+ HAVE_TIFF=disabled
+fi
+
+AM_CONDITIONAL(HAVE_TIFF, [test "x$HAVE_TIFF" = xyes])
+AC_SUBST(TIFF_CFLAGS)
+AC_SUBST(TIFF_LIBS)
+
+# libffmpegthumbnailer support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([ffmpegthumbnailer],
+ AC_HELP_STRING([--disable-ffmpegthumbnailer], [disable ffmpegthumbnailer support for generating thumbnails of video files]),
+ [ffmpegthumbnailer=$enableval], [ffmpegthumbnailer=auto])
+
+if test "x${ffmpegthumbnailer}" != "xno"; then
+ PKG_CHECK_MODULES(FFMPEGTHUMBNAILER, [libffmpegthumbnailer >= 2.1.0],
+ [
+ HAVE_FFMPEGTHUMBNAILER=yes
+ AC_DEFINE(HAVE_FFMPEGTHUMBNAILER, 1, [define to enable ffmpegthumbnailer support])
+ AC_CHECK_MEMBER([video_thumbnailer.prefer_embedded_metadata], [AC_DEFINE(HAVE_FFMPEGTHUMBNAILER_METADATA, 1, [define if ffmpegthumbnailer supports embedded metadata])], [], [[#include ]])
+ AC_CHECK_MEMBER([image_data.image_data_width], [AC_DEFINE(HAVE_FFMPEGTHUMBNAILER_RGB, 1, [define if ffmpegthumbnailer supports raw RGB output])], [], [[#include ]])
+ AC_CHECK_LIB([ffmpegthumbnailer], [video_thumbnailer_set_size], [AC_DEFINE(HAVE_FFMPEGTHUMBNAILER_WH, 1, [define if ffmpegthumbnailer supports specifying size by width/height])])
+ ],
+ [
+ HAVE_FFMPEGTHUMBNAILER=no
+ ])
+else
+ HAVE_FFMPEGTHUMBNAILER=disabled
+fi
+
+AM_CONDITIONAL(HAVE_FFMPEGTHUMBNAILER, [test "x$HAVE_FFMPEGTHUMBNAILER" = xyes])
+AC_SUBST(FFMPEGTHUMBNAILER_CFLAGS)
+AC_SUBST(FFMPEGTHUMBNAILER_LIBS)
+
+# Exiv2 support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([exiv2],
+ AC_HELP_STRING([--disable-exiv2], [disable exiv2 support]),
+ [libexiv2=$enableval], [libexiv2=auto])
+
+if test "x${libexiv2}" != "xno"; then
+ PKG_CHECK_MODULES(EXIV2, [exiv2 >= 0.11],
+ [
+ HAVE_EXIV2=yes
+ AC_DEFINE(HAVE_EXIV2, 1, [define to enable exiv2 support])
+ ],
+ [
+ HAVE_EXIV2=no
+ AC_MSG_WARN([$EXIV2_PKG_ERRORS])
+ ])
+else
+ HAVE_EXIV2=disabled
+fi
+
+AM_CONDITIONAL(HAVE_EXIV2, [test "x$HAVE_EXIV2" = xyes])
+AC_SUBST(EXIV2_CFLAGS)
+AC_SUBST(EXIV2_LIBS)
+
+
+# Gettext support
+# ----------------------------------------------------------------------
+
+dnl Set of available languages
+ALL_LINGUAS="`grep -v '^#' "$srcdir/po/LINGUAS" | tr '\n' ' '`"
+AC_SUBST([CONFIG_STATUS_DEPENDENCIES],['$(top_srcdir)/po/LINGUAS'])
+
+GETTEXT_PACKAGE=$PACKAGE
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["${GETTEXT_PACKAGE}"],[Name of gettext file])
+AM_GLIB_GNU_GETTEXT
+AM_GLIB_DEFINE_LOCALEDIR(GQ_LOCALEDIR)
+
+AC_SUBST(CFLAGS)
+AC_SUBST(CXXFLAGS)
+AC_SUBST(CPPFLAGS)
+AC_SUBST(LDFLAGS)
+
+
+# clutter and champlain support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([map],
+ AC_HELP_STRING([--disable-map], [disable map support]),
+ [libgps=$enableval], [libgps=auto])
+
+AC_ARG_ENABLE([gpu-accel],
+ AC_HELP_STRING([--disable-gpu-accel], [disable GPU acceleration support - experimental]),
+ [libclutter=$enableval], [libclutter=auto])
+
+if test "x${libclutter}" != "xno" -a "x${gtk3}" != "xno"; then
+ PKG_CHECK_MODULES(CLUTTER, [clutter-1.0 >= 1.0],
+ [
+ PKG_CHECK_MODULES(CLUTTER_GTK, [clutter-gtk-1.0 >= 1.0],
+ [
+ HAVE_CLUTTER=yes
+ AC_DEFINE(HAVE_CLUTTER, 1, [define to enable use of clutter library])
+ ],
+ [
+ HAVE_CLUTTER=no
+ AC_MSG_WARN([$CLUTTER_GTK_PKG_ERRORS])
+ ])
+ ],
+ [
+ HAVE_CLUTTER=no
+ AC_MSG_WARN([$CLUTTER_PKG_ERRORS])
+ ])
+else
+ HAVE_CLUTTER=disabled
+fi
+
+AC_SUBST(CLUTTER_CFLAGS)
+AC_SUBST(CLUTTER_LIBS)
+AC_SUBST(CLUTTER_GTK_CFLAGS)
+AC_SUBST(CLUTTER_GTK_LIBS)
+
+
+# Libchamplain support - used for map facility
+# ----------------------------------------------------------------------
+
+if test "x${libgps}" != "xno" -a "x${HAVE_CLUTTER}" = "xyes"; then
+ if test "x${gtk3}" != "xno"; then
+ PKG_CHECK_MODULES(LIBCHAMPLAIN, [champlain-0.12 >= 0.12],
+ [
+ HAVE_LIBCHAMPLAIN=yes
+ AC_DEFINE(HAVE_LIBCHAMPLAIN, 1, [define to enable use of maps])
+ ],
+ [
+ HAVE_LIBCHAMPLAIN=no
+ AC_MSG_WARN([$LIBCHAMPLAIN_PKG_ERRORS])
+ ])
+ else
+ HAVE_LIBCHAMPLAIN=disabled
+ fi
+else
+ HAVE_LIBCHAMPLAIN=disabled
+fi
+
+if test "x${libgps}" != "xno" -a "x${HAVE_LIBCHAMPLAIN}" = "xyes" ; then
+ PKG_CHECK_MODULES(LIBCHAMPLAIN_GTK, [champlain-gtk-0.12 >= 0.12],
+ [
+ HAVE_LIBCHAMPLAIN_GTK=yes
+ AC_DEFINE(HAVE_LIBCHAMPLAIN_GTK, 1, [define to enable use of maps])
+ ],
+ [
+ HAVE_LIBCHAMPLAIN_GTK=no
+ AC_MSG_WARN([$LIBCHAMPLAIN_GTK_PKG_ERRORS])
+ ])
+else
+ HAVE_LIBCHAMPLAIN_GTK=disabled
+fi
+
+AM_CONDITIONAL(HAVE_LIBCHAMPLAIN_GTK, [test "x$HAVE_LIBCHAMPLAIN_GTK" = xyes])
+AC_SUBST(LIBCHAMPLAIN_GTK_CFLAGS)
+AC_SUBST(LIBCHAMPLAIN_GTK_LIBS)
+
+# Lua support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([lua],
+ AC_HELP_STRING([--disable-lua], [disable lua support]),
+ [liblua=$enableval], [liblua=auto])
+
+if test "x${liblua}" != "xno"; then
+ PKG_CHECK_MODULES(LUA, lua5.1 >= 5.1,
+ [
+ HAVE_LUA=yes
+ AC_DEFINE(HAVE_LUA, 1, [define to enable lua support])
+ ],
+ [
+ HAVE_LUA=no
+ AC_MSG_WARN([$LUA_PKG_ERRORS])
+ ])
+else
+ HAVE_LUA=disabled
+fi
+
+AM_CONDITIONAL(HAVE_LUA, [test "x$HAVE_LUA" = xyes])
+AC_SUBST(LUA_CFLAGS)
+AC_SUBST(LUA_LIBS)
+
+# Pdf support
+# ----------------------------------------------------------------------
+
+if test "x${gtk3}" != "xno"; then
+ AC_ARG_ENABLE([pdf],
+ AC_HELP_STRING([--disable-pdf], [disable pdf support]),
+ [libpdf=$enableval], [libpdf=auto])
+
+ if test "x${libpdf}" != "xno"; then
+ PKG_CHECK_MODULES(PDF, poppler-glib >= 0.62,
+ [
+ HAVE_PDF=yes
+ AC_DEFINE(HAVE_PDF, 1, [define to enable pdf support])
+ ],
+ [
+ HAVE_PDF=no
+ AC_MSG_WARN([$PDF_PKG_ERRORS])
+ ])
+ else
+ HAVE_PDF=disabled
+ fi
+else
+ HAVE_PDF=disabled
+fi
+
+AM_CONDITIONAL(HAVE_PDF, [test "x$HAVE_PDF" = xyes])
+AC_SUBST(PDF_CFLAGS)
+AC_SUBST(PDF_LIBS)
+
+# Markdown support
+# ----------------------------------------------------------------------
+
+AM_CONDITIONAL(HAVE_MARKDOWN, [ "$(command -v markdown)" ])
+
+# ----------------------------------------------------------------------
+
+AH_TOP([
+/** \file
+ * \short autogenerated definition by autoheader.
+ * \author Bruclik
+ */
+
+/*
+ * This file is a part of Geeqie project (http://www.geeqie.org/).
+ * Copyright (C) 2008 - 2016 The Geeqie Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _INCLUDE_CONFIG_H
+#define _INCLUDE_CONFIG_H
+])
+
+AH_BOTTOM([#endif])
+
+dnl Write the output
+dnl
+
+AC_CONFIG_FILES([
+ Makefile
+ src/Makefile
+ src/icons/Makefile
+ src/icons/svg/Makefile
+ po/Makefile.in
+ doc/Makefile
+ plugins/Makefile
+ plugins/symlink/Makefile
+ plugins/rotate/Makefile
+ plugins/ufraw/Makefile
+ plugins/import/Makefile
+ plugins/geocode-parameters/Makefile
+ plugins/export-jpeg/Makefile
+ plugins/tethered-photography/Makefile
+ plugins/camera-import/Makefile
+ plugins/image-crop/Makefile
+ geeqie.spec
+])
+
+AC_OUTPUT
+dnl Print the results
+dnl
+
+cat > config.report << END
+
+ Config results:
+ -=-=-=-=-=-=-=-=-
+
+Package:
+ Name: $PACKAGE_NAME
+ Version: $PACKAGE_VERSION
+
+Architecture:
+ UNIX: $os_unix
+ Win32: $platform_win32 (native: $os_win32)
+
+Flags:
+ Geeqie: $GQ_CFLAGS
+ DEFS: $DEFS
+ CPPFLAGS: $__CPPFLAGS
+ CFLAGS: $CFLAGS
+ CXXFLAGS: $CXXFLAGS
+ Gtk: $GTK_CFLAGS
+ Glib: $GLIB_CFLAGS
+ Thread: $GTHREAD_LIBS
+ Others: $JPEG_LIBS $TIFF_LIBS $LCMS_LIBS $EXIV2_LIBS $CLUTTER_LIBS $CLUTTER_GTK_LIBS $LIBCHAMPLAIN_LIBS $LIBCHAMPLAIN_GTK_LIBS $LUA_LIBS
+
+Localization:
+ NLS support: $USE_NLS
+ LINGUAS: $LINGUAS
+
+Settings:
+ Developer: $__IS_DEVELOPER
+ Debug flags: $__IS_DEBUG_FLAGS
+ Debug log: $__IS_DEBUG_LOG
+ Deprecated: $__IS_DEPRECATED
+
+Support:
+ LCMS: $HAVE_LCMS
+ Exiv2: $HAVE_EXIV2
+ Lirc: $HAVE_LIRC
+ Clutter: $HAVE_CLUTTER
+ Libchamplain: $HAVE_LIBCHAMPLAIN
+ Libchamplain-gtk: $HAVE_LIBCHAMPLAIN_GTK
+ Lua: $HAVE_LUA
+ FFmpegthumbnailer: $HAVE_FFMPEGTHUMBNAILER
+ Pdf: $HAVE_PDF
+
+Documentation:
+ Doxygen: $DX_DOXYGEN
+ doc-tool: $GNOME_DOC_TOOL
+
+END
+
+cat config.report
+cat <
- Confirm file delete
+ Confirm permanent file delete
Prompts for confirmation before deleting files.
@@ -15,6 +15,14 @@
+ Confirm move file to Trash
+
+
+ Prompts for confirmation before moving files to the trash bin.
+
+
+
+
Enable
Delete key
@@ -44,7 +52,7 @@
- Safe Delete
+ Use Geeqie trash location
Moves deleted files to a temporary folder, for easy retrieval of deleted files. Files in the temporary folder are retained until the maximum size is reached, at which point deleting additional files will result in the removal of the oldest files to reclaim the space needed for the new files.
@@ -62,6 +70,14 @@
+ Use system Trash bin
+
+
+ Moves deleted files to the system-defined trash bin.
+
+
+
+
Folder
diff -r c79d70e18076 -r 49bd0d974e88 doc/docbook/GuidePluginsConfig.xml
--- a/doc/docbook/GuidePluginsConfig.xml Tue Oct 02 22:50:14 2018 +0300
+++ b/doc/docbook/GuidePluginsConfig.xml Wed Dec 12 21:56:30 2018 +0200
@@ -29,6 +29,14 @@
+ Disabled
+
+
+ If the checkbox is ticked, the plugin will not be displayed in Geeqie menus.
+
+
+
+
Name
diff -r c79d70e18076 -r 49bd0d974e88 doc/docbook/GuideReferenceKeyboardShortcuts.xml
--- a/doc/docbook/GuideReferenceKeyboardShortcuts.xml Tue Oct 02 22:50:14 2018 +0300
+++ b/doc/docbook/GuideReferenceKeyboardShortcuts.xml Wed Dec 12 21:56:30 2018 +0200
@@ -424,7 +424,16 @@
- Delete selected images.
+ Move selected images to trash bin.
+
+
+
+
+ Shift + Delete
+
+
+
+ Permanently delete selected images.
diff -r c79d70e18076 -r 49bd0d974e88 geeqie.1
diff -r c79d70e18076 -r 49bd0d974e88 plugins/Makefile.am
--- a/plugins/Makefile.am Tue Oct 02 22:50:14 2018 +0300
+++ b/plugins/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -1,7 +1,9 @@
-#FIXME enable or disable individual plugins from configure
-SUBDIRS = rotate symlink ufraw import geocode-parameters
+SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg tethered-photography camera-import image-crop
qq_desktoptemplatedir = $(appdir)
-qq_desktoptemplate_DATA = template.desktop
+qq_desktoptemplate_in_files = template.desktop.in
+qq_desktoptemplate_DATA = $(qq_desktoptemplate_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
-EXTRA_DIST = $(qq_desktoptemplate_DATA)
+EXTRA_DIST = $(qq_desktoptemplate_in_files)
+CLEANFILES = $(qq_desktoptemplate_DATA)
diff -r c79d70e18076 -r 49bd0d974e88 plugins/camera-import/Makefile.am
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/camera-import/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,9 @@
+dist_gq_bin_SCRIPTS = geeqie-camera-import geeqie-camera-import-hook-script
+
+gq_desktopdir = $(appdir)/applications
+gq_desktop_in_files = camera-import.desktop.in
+gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST = $(gq_desktop_in_files)
+CLEANFILES = $(gq_desktop_DATA)
diff -r c79d70e18076 -r 49bd0d974e88 plugins/camera-import/camera-import.desktop.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/camera-import/camera-import.desktop.in Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+_Name=Camera import
+
+# Requires gphoto2
+# The gphoto2 file $HOME/.gphoto2/settings can
+# be used to set auto-rename on download
+
+Exec=geeqie-camera-import
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff -r c79d70e18076 -r 49bd0d974e88 plugins/camera-import/geeqie-camera-import
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/camera-import/geeqie-camera-import Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,159 @@
+#!/bin/bash
+
+# Import all images from camera
+# Requires gphoto2
+
+function finish
+{
+ if [ -f /tmp/geeqie-camera-import-files ]
+ then
+ rm /tmp/geeqie-camera-import-files
+ fi
+
+ if [ -p $zen_pipe ]
+ then
+ rm $zen_pipe
+ fi
+
+ if [ "$gphoto2_pid" != "" ]
+ then
+ ps -p $gphoto2_pid > /dev/null
+ if [ $? -eq 0 ]
+ then
+ kill $gphoto2_pid
+ fi
+ fi
+
+ if [ "$zen_pid" != "" ]
+ then
+ ps -p $zen_pid > /dev/null
+ if [ $? -eq 0 ]
+ then
+ kill $zen_pid
+ fi
+ fi
+}
+trap finish EXIT
+
+if ! [ -x "$(command -v gphoto2)" ]
+then
+ zenity --title="Geeqie camera import" --info --width=200 --text="gphoto2 is not installed" 2>/dev/null
+ exit 0
+fi
+
+if [ -f /tmp/geeqie-camera-import.log ]
+then
+ rm /tmp/geeqie-camera-import.log
+fi
+
+if [ $(gphoto2 --auto-detect | wc -l) -le 2 ]
+then
+ zenity --error --title="Geeqie camera import" --text="No camera detected" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250 2>/dev/null
+ exit 0
+fi
+
+list=$(gphoto2 --auto-detect | tail +3)
+readarray -t split_list <<<"$list"
+
+camera_list=""
+n=1
+count=$(gphoto2 --auto-detect | tail +3 | wc -l)
+if [[ $count -gt 1 ]]
+then
+ for camera in "${split_list[@]}"
+ do
+ if [[ $n -eq $count ]]
+ then
+ camera_list="$camera_list"$'TRUE\n'"$camera"$'\n'"$n"
+ else
+ camera_list="$camera_list"$'FALSE\n'"$camera"$'\n'"$n"$'\n'
+ fi
+ n=$((n+1))
+ done
+
+ camera_selected=$(echo "$camera_list" | zenity --width=500 --height=250 --title="Geeqie camera import" --list --text "Select camera" --radiolist --column "Select" --column "Camera" --column "n" --hide-column=3 --print-column=2 2>/dev/null)
+
+ if [[ $? == 1 ]]
+ then
+ exit 0
+ fi
+else
+ camera_selected=$(gphoto2 --auto-detect | tail +3)
+fi
+
+port_type=$(echo $camera_selected |awk -F ':' '{print $1}' | awk '{print $NF}')
+camera=$(echo $camera_selected | awk -F $port_type '{print $1}')
+port_address=$(echo $camera_selected | awk -F ':' '{print $2}')
+port="$port_type:$port_address"
+
+script_dir=$(dirname "$0")
+
+zenity --question --title="Geeqie camera import" --text="Camera: $camera\n\nDownloading to folder:\n$PWD" --ok-label="OK" --cancel-label="Cancel" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=350 2>/dev/null
+
+if [[ $? == 1 ]]
+then
+ exit 0
+fi
+
+src_files_sorted=$(mktemp --tmpdir geeqie_camera_import_camera_files_sorted_XXXXXX)
+dest_files_sorted=$(mktemp --tmpdir geeqie_camera_import_computer_files_sorted_XXXXXX)
+
+(
+gphoto2 --port "$port" --list-files 2>/tmp/geeqie-camera-import.log | awk '/#/ {print $2}' | sort > $src_files_sorted
+) | zenity --progress --auto-close --auto-kill --title="Geeqie camera import" --text="Searching for files to download..." --pulsate --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250
+
+error=$(grep -i error /tmp/geeqie-camera-import.log)
+
+if [ ! -z "$error" ]
+then
+ cat /tmp/geeqie-camera-import.log | zenity --text-info --title="Geeqie camera import" - --window-icon=error --width=250 2>/dev/null
+ exit 1
+fi
+
+ls -1 | sort > $dest_files_sorted
+existing_file_count=$(comm -12 $src_files_sorted $dest_files_sorted | wc -l)
+
+total=$(cat $src_files_sorted | wc -l)
+files_to_load=$(( $total - $existing_file_count ))
+
+rm $src_files_sorted
+rm $dest_files_sorted
+
+if [ "$files_to_load" -eq 0 ]
+then
+ zenity --info --title="Geeqie camera download" --text="No photos to download" --width=250 --window-icon=usr/local/share/pixmaps/geeqie.png 2>/dev/null
+ exit 0
+fi
+
+if [ -f /tmp/geeqie-camera-import-files ]
+then
+ rm /tmp/geeqie-camera-import-files
+fi
+touch /tmp/geeqie-camera-import-files
+
+zen_pipe=$(mktemp --dry-run --tmpdir geeqie_camera_import_pipe_XXXXXX)
+mkfifo $zen_pipe
+
+gphoto2 --port "$port" --hook-script "$script_dir/"geeqie-camera-import-hook-script --get-all-files --skip-existing 2>/tmp/geeqie-camera-import.log &
+
+gphoto2_pid=$!
+
+(tail -f $zen_pipe 2>/dev/null) | zenity --progress --title="Geeqie camera import" --width=370 --text="Downloading: total: $files_to_load existing: $existing_file_count\n" --auto-close --auto-kill --percentage=0 window-icon=/usr/local/share/pixmaps/geeqie.png 2>/dev/null &
+zen_pid=$!
+
+n=0
+while [ -f /tmp/geeqie-camera-import-files ] && [ "$n" -lt 100 ]
+do
+ i=$(cat "/tmp/geeqie-camera-import-files" | wc -l)
+ n=$(( $((i * 100)) / $files_to_load))
+ echo "$n" >$zen_pipe
+
+ latest_file=$(tail -n 1 /tmp/geeqie-camera-import-files)
+ if [ -z "$latest_file" ]
+ then
+ latest_file="Skipping existing files, if any..."
+ fi
+ echo "#Downloading: total: $files_to_load existing: $existing_file_count\n$latest_file" >$zen_pipe
+
+ sleep 1
+done
diff -r c79d70e18076 -r 49bd0d974e88 plugins/camera-import/geeqie-camera-import-hook-script
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/camera-import/geeqie-camera-import-hook-script Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# Camera import
+
+if [ "$ACTION" == "download" ]
+then
+ echo "$ARGUMENT" >> /tmp/geeqie-camera-import-files
+
+elif [ "$ACTION" == "stop" ]
+then
+ zenity --info --title="Geeqie camera download" --text="Import ended" --width=200 --timeout=5 --window-icon=usr/local/share/pixmaps/geeqie.png 2>/dev/null
+ if [ -f /tmp/geeqie-camera-import-files ]
+ then
+ rm /tmp/geeqie-camera-import-files
+ fi
+fi
+
+exit 0
diff -r c79d70e18076 -r 49bd0d974e88 plugins/export-jpeg/Makefile.am
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/export-jpeg/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,9 @@
+dist_gq_bin_SCRIPTS = geeqie-export-jpeg
+
+gq_desktopdir = $(appdir)/applications
+gq_desktop_in_files = export-jpeg.desktop.in
+gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST = $(gq_desktop_in_files)
+CLEANFILES = $(gq_desktop_DATA)
diff -r c79d70e18076 -r 49bd0d974e88 plugins/export-jpeg/export-jpeg.desktop.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/export-jpeg/export-jpeg.desktop.in Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+_Name=Export jpeg
+
+Exec=geeqie-export-jpeg %f
+
+# show only if these are installed
+#TryExec=exiv2
+#TryExec=jpgicc
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff -r c79d70e18076 -r 49bd0d974e88 plugins/export-jpeg/geeqie-export-jpeg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/export-jpeg/geeqie-export-jpeg Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+# Extract emdedded jpegs from a raw file:
+#
+# Display a list of the embedded files
+# Extract the selected image to a tmp folder
+# If jpgicc is installed, correct for currently selected rendering intent
+# and store in a new file
+# Set Geeqie focus to the newly generated image
+
+count=$(exiv2 -pp "$1" | wc -l)
+
+if [[ $count -eq 0 ]]
+then
+ zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\nFile contains no embedded images" --title="Geeqie export jpeg" 2>/dev/null
+ exit
+fi
+
+if ! [ -x "$(command -v exiv2)" ]
+then
+ zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\nexiv2 is not installed" --title="Geeqie export jpeg" 2>/dev/null
+ exit 1
+fi
+
+if ! [ -x "$(command -v jpgicc)" ]
+then
+ zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\njpgicc is not installed\ncolor corrections will not be made\nYou may install via liblcms2-utils" --title="Geeqie export jpeg" 2>/dev/null
+fi
+
+list=$(exiv2 -pp "$1")
+readarray -t split_list <<<"$list"
+
+image_list=""
+n=1
+
+for image in "${split_list[@]}"
+do
+ if [[ $n -eq $count ]]
+ then
+ image_list="$image_list"$'TRUE\n'"$image"$'\n'"$n"
+ else
+ image_list="$image_list"$'FALSE\n'"$image"$'\n'"$n"$'\n'
+ fi
+ n=$((n+1))
+done
+
+image_selected=$(echo "$image_list" | zenity --width=500 --height=250 --title="Geeqie export jpeg" --list --text "Select embedded image" --radiolist --column "Select" --column "Image" --column "n" --hide-column=3 --print-column=3 2>/dev/null)
+
+if [[ ! -z "$image_selected" ]]
+then
+ tmpdir=$(mktemp --tmpdir --directory geeqie_export_jpeg_XXXXXX)
+
+ exiv2 -ep"$image_selected" "$1" --location "$tmpdir"
+
+ render_str=$(geeqie --remote --get-render-intent)
+
+ case $render_str in
+ "Perceptual" )
+ render_key=0;;
+ "Relative Colorimetric" )
+ render_key=1;;
+ "Saturation" )
+ render_key=2;;
+ "Absolute Colorimetric" )
+ render_key=3;;
+ esac
+
+ filename=$(basename "$tmpdir/"* ".jpg")
+ if [ -x "$(command -v jpgicc)" ]
+ then
+ filename_ri="$tmpdir/""$filename""-ri.jpg"
+ jpgicc -t $render_key "$tmpdir/""$filename"".jpg" "$filename_ri"
+
+ rm "$tmpdir/""$filename"".jpg"
+
+ geeqie --remote view:"$filename_ri"
+ else
+ geeqie --remote view:"$tmpdir/""$filename"".jpg"
+ fi
+fi
diff -r c79d70e18076 -r 49bd0d974e88 plugins/image-crop/Makefile.am
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/image-crop/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,9 @@
+dist_gq_bin_SCRIPTS = geeqie-image-crop
+
+gq_desktopdir = $(appdir)/applications
+gq_desktop_in_files = image-crop.desktop.in
+gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST = $(gq_desktop_in_files)
+CLEANFILES = $(gq_desktop_DATA)
diff -r c79d70e18076 -r 49bd0d974e88 plugins/image-crop/geeqie-image-crop
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/image-crop/geeqie-image-crop Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+# Crop image
+#
+# Requires ImageMagick and exiftool
+
+
+process_raw ()
+{
+ tmpdir=$(mktemp --tmpdir --directory geeqie_crop_image_XXXXXX)
+
+ list=$(exiv2 -pp "$1")
+ if [[ ! -z "$list" ]]
+ then
+ readarray -t split_list <<<"$list"
+
+ array_length="${#split_list[@]}"
+ exiv2 -ep"$array_length" "$1" --location "$tmpdir"
+
+ src_filename=$(ls "$tmpdir/")
+ filename="${src_filename%.*}"
+ extension="${src_filename##*.}"
+ rotation=$(exiftool -Orientation -n "$1" | cut -d':' -f2 | xargs)
+ convert "$tmpdir/$src_filename" -crop "$2" "$tmpdir/$filename-crop.$extension"
+
+ exiftool -Orientation=$rotation -n "$tmpdir/$filename-crop.$extension"
+
+ rm "$tmpdir/$src_filename"
+
+ geeqie --remote view:"$tmpdir/$filename-crop.$extension"
+ res=0
+ else
+ res=1
+ fi
+
+ return $res
+}
+
+process_plain ()
+{
+ tmpdir=$(mktemp --tmpdir --directory geeqie_crop_image_XXXXXX)
+
+ src_filename=$(basename -- "$1")
+ filename="${src_filename%.*}"
+ extension="${src_filename##*.}"
+ convert "$1" -crop "$2" "$tmpdir/$filename-crop.$extension"
+ if [ $? = 1 ]
+ then
+ zenity --error --title="$title" --text="Cannot process this file format" --width="$width" --window-icon="$window_icon"
+ else
+ geeqie --remote view:"$tmpdir/$filename-crop.$extension"
+ fi
+}
+
+export window_icon="/usr/local/share/pixmaps/geeqie.png"
+export title="Geeqie crop image"
+export width="250"
+
+if [ -x "$(command -v convert)" ]
+then
+ if [ -x "$(command -v exiftool)" ]
+ then
+
+ coords=$(geeqie --remote --get-rectangle)
+
+ if [ -z "$coords" ]
+ then
+ zenity --error --title="$title" --text="Rectangle coordinates have not been set" --width="$width" --window-icon="$window_icon" 2>/dev/null
+ exit 0
+ fi
+
+ filename=$(basename -- "$1")
+ extension="${filename##*.}"
+
+ if [ "${extension,,}" = "jpeg" ]
+ then
+ source_file="$1"
+ process_plain "$1" $coords
+ elif [ "${extension,,}" = "jpg" ]
+ then
+ source_file="$1"
+ process_plain "$1" $coords
+ elif [ "${extension,,}" = "png" ]
+ then
+ source_file="$1"
+ process_plain "$1" $coords
+ elif [ "${extension,,}" = "tif" ]
+ then
+ source_file="$1"
+ process_plain "$1" $coords
+ elif [ "${extension,,}" = "tiff" ]
+ then
+ source_file="$1"
+ process_plain "$1" $coords
+ else
+ process_raw "$1" $coords
+ if [ $? = 1 ]
+ then
+ process_plain "$1" $coords
+ fi
+ fi
+ else
+ zenity --info --title="$title" --width="$width" --height=100 --text="Crop image\n\nexiftool is not installed" --title="$title" --window-icon="$window_icon" 2>/dev/null
+ exit 0
+ fi
+else
+ zenity --info --title="$title" --width="$width" --height=100 --text="Crop image\n\nImageMagick is not installed" --title="$title" --window-icon="$window_icon" 2>/dev/null
+ exit 0
+fi
diff -r c79d70e18076 -r 49bd0d974e88 plugins/image-crop/image-crop.desktop
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/image-crop/image-crop.desktop Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Image crop
+
+# Requires ImageMagick and exiftools
+
+Exec=geeqie-image-crop %f
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff -r c79d70e18076 -r 49bd0d974e88 plugins/image-crop/image-crop.desktop.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/image-crop/image-crop.desktop.in Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+_Name=Image crop
+
+# Requires ImageMagick and exiftools
+
+Exec=geeqie-image-crop %f
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff -r c79d70e18076 -r 49bd0d974e88 plugins/template.desktop.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/template.desktop.in Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,94 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+
+# The name which appears in the menu:
+_Name=Template
+#Name[cs]=
+#Name[fr]=
+#Name[de]=Vorlage
+
+# Replace "command" with the actual command or script:
+Exec=command %f
+
+# %f A single file name, even if multiple files are selected. The
+# system reading the desktop entry should recognize that the program in
+# question cannot handle multiple file arguments, and it should should
+# probably spawn and execute multiple copies of a program for each
+# selected file if the program is not able to handle additional file
+# arguments. If files are not on the local file system (i.e. are on HTTP
+# or FTP locations), the files will be copied to the local file system
+# and %f will be expanded to point at the temporary file. Used for
+# programs that do not understand the URL syntax.
+#
+# %F A list of files. Use for apps that can open several local files
+# at once. Each file is passed as a separate argument to the executable
+# program.
+#
+# %u A single URL. Local files may either be passed as file: URLs or
+# as file path.
+#
+# %U A list of URLs. Each URL is passed as a separate argument to
+# the executable program. Local files may either be passed as file: URLs
+# or as file path.
+
+# Change the following line to point to an icon of your choosing
+Icon=gtk-file
+
+# Use the following to only show this menu entry if the command is installed
+#TryExec=command
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# Uncomment the following line to include in a Geeqie menu,
+# other than in the default path of EditMenu/ExternalMenu
+#X-Geeqie-Menu-Path=
+
+# e.g.
+#X-Geeqie-Menu-Path=SelectMenu/SelectSection
+
+# Valid sections are:
+# FileMenu
+# FileMenu/OpenSection
+# FileMenu/SearchSection
+# FileMenu/PrintSection
+# FileMenu/FileOpsSection
+# FileMenu/QuitSection
+# GoMenu
+# SelectMenu
+# SelectMenu/SelectSection
+# SelectMenu/ClipboardSection
+# SelectMenu/MarksSection
+# EditMenu
+# EditMenu/EditSection
+# EditMenu/OrientationMenu
+# EditMenu/RatingMenu
+# EditMenu/PropertiesSection
+# EditMenu/PreferencesSection
+# PluginsMenu
+# ViewMenu
+# ViewMenu/WindowSection
+# ViewMenu/FileDirMenu
+# ViewMenu/FileDirMenu/FolderSection
+# ViewMenu/FileDirMenu/ListSection
+# ViewMenu/DirSection
+# ViewMenu/ZoomMenu
+# ViewMenu/ZoomMenu/ConnectZoomMenu
+# ViewMenu/SplitMenu
+# ViewMenu/StereoMenu
+# ViewMenu/ColorMenu
+# ViewMenu/OverlayMenu
+# ViewMenu/ViewSection
+# ViewMenu/ToolsSection
+# ViewMenu/SlideShowSection
+# HelpMenu
+# HelpMenu/HelpSection
+
+# This is a filter - see symlink.desktop and geeqie-symlink for an example
+# how to use this feature
+#X-Geeqie-Filter=true
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
diff -r c79d70e18076 -r 49bd0d974e88 plugins/tethered-photography/Makefile.am
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/tethered-photography/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,9 @@
+dist_gq_bin_SCRIPTS = geeqie-tethered-photography geeqie-tethered-photography-hook-script
+
+gq_desktopdir = $(appdir)/applications
+gq_desktop_in_files = tethered-photography.desktop.in
+gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST = $(gq_desktop_in_files)
+CLEANFILES = $(gq_desktop_DATA)
diff -r c79d70e18076 -r 49bd0d974e88 plugins/tethered-photography/geeqie-tethered-photography
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/tethered-photography/geeqie-tethered-photography Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# Tethered photography
+# Requires gphoto2
+#
+# If a file already exists with the same name, it is not overwritten, but the
+# download will not take place.
+# Auto-rename can be achieved with the --filename option of gphoto2.
+# In file $HOME/.config/gphoto2/settings, set the option:
+# gphoto2=filename=
+
+n=$(ps -e | grep "geeqie-tethered" | wc -l)
+if [ "$n" -ge 3 ]
+then
+ exit 0
+fi
+
+if ! [ -x "$(command -v gphoto2)" ]
+then
+ zenity --title="Geeqie tethered photography" --info --width=200 --text="gphoto2 is not installed" 2>/dev/null
+ exit 0
+fi
+
+if [ $(gphoto2 --auto-detect | wc -l) -le 2 ]
+then
+ zenity --error --title="Geeqie tethered photography" --text="No camera detected" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250 2>/dev/null
+ exit 0
+fi
+
+notify-send --expire-time=2000 "$(gphoto2 --auto-detect | sed -n '3p')" --icon=geeqie
+
+script_dir=$(dirname "$0")
+
+tmpfile=$(mktemp --tmpdir geeqie_tethered_photography_XXXXXX)
+
+yes n | gphoto2 --hook-script "$script_dir/"geeqie-tethered-photography-hook-script --capture-tethered >$tmpfile &
+
+gphoto2_pid=$!
+
+zenity --question --title="Geeqie tethered photography" --ok-label="Stop" --cancel-label="Show log data" --text="Tethered photography is running.\n\n\nDownloading to folder:\n""$PWD\n\n\nExisting files will not be overwritten,\nbut the download will not take place.\n\n(Use gphoto2 --filename default option\nfor auto-rename on download)" --width=300 --window-icon=/usr/local/share/pixmaps/geeqie.png 2>/dev/null
+
+if [ $? == 1 ]
+then
+ zenity --text-info --title="Geeqie tethered photography" --window-icon=/usr/local/share/pixmaps/geeqie.png --ok-label="Stop" --cancel-label="Abort" <$tmpfile 2>/dev/null
+fi
+
+kill $gphoto2_pid
+rm $tmpfile
diff -r c79d70e18076 -r 49bd0d974e88 plugins/tethered-photography/geeqie-tethered-photography-hook-script
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/tethered-photography/geeqie-tethered-photography-hook-script Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# Tethered photography
+
+if [ "$ACTION" == "download" ]
+then
+ notify-send --expire-time=4000 "$ARGUMENT" --icon=geeqie
+ geeqie --remote File:"$PWD/$ARGUMENT"
+fi
+
+exit 0
diff -r c79d70e18076 -r 49bd0d974e88 plugins/tethered-photography/tethered-photography.desktop.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/tethered-photography/tethered-photography.desktop.in Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+_Name=Tethered photography
+
+Exec=geeqie-tethered-photography
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff -r c79d70e18076 -r 49bd0d974e88 po/POTFILES.in
--- a/po/POTFILES.in Tue Oct 02 22:50:14 2018 +0300
+++ b/po/POTFILES.in Wed Dec 12 21:56:30 2018 +0200
@@ -1,8 +1,13 @@
geeqie.desktop.in
plugins/import/geeqie-import-geeqie.desktop.in
plugins/import/geeqie-import-gqview.desktop.in
+plugins/export-jpeg/export-jpeg.desktop.in
+plugins/tethered-photography/tethered-photography.desktop.in
+plugins/camera-import/camera-import.desktop.in
+plugins/image-crop/image-crop.desktop.in
plugins/rotate/rotate.desktop.in
plugins/symlink/symlink.desktop.in
+plugins/template.desktop.in
plugins/ufraw/geeqie-ufraw.desktop.in
plugins/ufraw/geeqie-ufraw-id.desktop.in
plugins/ufraw/geeqie-ufraw-recursive.desktop.in
@@ -45,9 +50,12 @@
src/history_list.c
src/image.c
src/image-load.c
+src/image_load_collection.c
+src/image_load_dds.c
src/image_load_ffmpegthumbnailer.c
src/image_load_gdk.c
src/image_load_jpeg.c
+src/image_load_pdf.c
src/image_load_tiff.c
src/image-overlay.c
src/img-view.c
@@ -66,6 +74,7 @@
src/metadata.c
src/misc.c
src/options.c
+src/osd.c
src/pan-view/pan-calendar.c
src/pan-view/pan-folder.c
src/pan-view/pan-grid.c
@@ -111,3 +120,4 @@
src/view_file/view_file_icon.c
src/view_file/view_file_list.c
src/window.c
+src/zonedetect.c
diff -r c79d70e18076 -r 49bd0d974e88 po/en_GB.po
--- a/po/en_GB.po Tue Oct 02 22:50:14 2018 +0300
+++ b/po/en_GB.po Wed Dec 12 21:56:30 2018 +0200
@@ -7,15 +7,15 @@
msgstr ""
"Project-Id-Version: geeqie-1.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-06-24 10:14+0100\n"
-"PO-Revision-Date: 2018-07-14 14:54+0100\n"
+"POT-Creation-Date: 2018-11-03 15:19+0000\n"
+"PO-Revision-Date: 2018-11-03 16:09+0000\n"
"Last-Translator: Colin Clark \n"
-"Language-Team: British English <>\n"
+"Language-Team: English <>\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Gtranslator 2.91.7\n"
#: ../geeqie.desktop.in.h:1
@@ -38,6 +38,22 @@
msgid "Import GQView metadata"
msgstr ""
+#: ../plugins/export-jpeg/export-jpeg.desktop.in.h:1
+msgid "Export jpeg"
+msgstr ""
+
+#: ../plugins/tethered-photography/tethered-photography.desktop.in.h:1
+msgid "Tethered photography"
+msgstr ""
+
+#: ../plugins/camera-import/camera-import.desktop.in.h:1
+msgid "Camera import"
+msgstr ""
+
+#: ../plugins/image-crop/image-crop.desktop.in.h:1
+msgid "Image crop"
+msgstr ""
+
#: ../plugins/rotate/rotate.desktop.in.h:1
msgid "Apply the orientation to image content"
msgstr ""
@@ -58,13 +74,13 @@
msgid "UFRaw Batch recursive"
msgstr ""
-#: ../src/advanced_exif.c:384 ../src/cache_maint.c:1265
-#: ../src/preferences.c:111 ../src/preferences.c:2304 ../src/search.c:2103
-#: ../src/search.c:3242
+#: ../src/advanced_exif.c:384 ../src/cache_maint.c:1266
+#: ../src/preferences.c:118 ../src/preferences.c:2512 ../src/search.c:2193
+#: ../src/search.c:3366
msgid "Metadata"
msgstr ""
-#: ../src/advanced_exif.c:432 ../src/preferences.c:2218
+#: ../src/advanced_exif.c:432 ../src/preferences.c:2426
msgid "Description"
msgstr ""
@@ -72,9 +88,10 @@
msgid "Value"
msgstr ""
-#: ../src/advanced_exif.c:434 ../src/desktop_file.c:535 ../src/dupe.c:2765
-#: ../src/dupe.c:3306 ../src/print.c:3209 ../src/search.c:3325
-#: ../src/utilops.c:505 ../src/view_file/view_file_list.c:2059
+#: ../src/advanced_exif.c:434 ../src/desktop_file.c:629 ../src/dupe.c:2784
+#: ../src/dupe.c:3326 ../src/preferences.c:2062 ../src/print.c:414
+#: ../src/search.c:3449 ../src/utilops.c:505
+#: ../src/view_file/view_file_list.c:2070
msgid "Name"
msgstr ""
@@ -91,68 +108,72 @@
msgstr ""
#. default sidebar
-#: ../src/bar.c:186
+#: ../src/bar.c:199
msgid "Histogram"
msgstr ""
-#: ../src/bar.c:187
+#: ../src/bar.c:200
msgid "Title"
msgstr ""
-#: ../src/bar.c:188 ../src/search.c:3163
+#: ../src/bar.c:201 ../src/preferences.c:2897 ../src/search.c:3286
msgid "Keywords"
msgstr ""
-#: ../src/bar.c:189 ../src/search.c:3175
+#: ../src/bar.c:202 ../src/search.c:3298
msgid "Comment"
msgstr ""
-#: ../src/bar.c:190
+#: ../src/bar.c:203
msgid "Rating"
msgstr ""
-#: ../src/bar.c:191
+#: ../src/bar.c:204
+msgid "Headline"
+msgstr ""
+
+#: ../src/bar.c:205
msgid "Exif"
msgstr ""
#. other pre-configured panes
-#: ../src/bar.c:193
+#: ../src/bar.c:207
msgid "File info"
msgstr ""
-#: ../src/bar.c:194
+#: ../src/bar.c:208
msgid "Location and GPS"
msgstr ""
-#: ../src/bar.c:195 ../src/exif.c:342
+#: ../src/bar.c:209 ../src/exif.c:342
msgid "Copyright"
msgstr ""
-#: ../src/bar.c:198 ../src/bar_gps.c:1010
+#: ../src/bar.c:212 ../src/bar_gps.c:1010
msgid "GPS Map"
msgstr ""
-#: ../src/bar.c:318 ../src/toolbar.c:191
+#: ../src/bar.c:332 ../src/toolbar.c:210
msgid "Move to _top"
msgstr ""
-#: ../src/bar.c:319 ../src/toolbar.c:192 ../src/ui_bookmark.c:416
+#: ../src/bar.c:333 ../src/toolbar.c:211 ../src/ui_bookmark.c:416
msgid "Move _up"
msgstr ""
-#: ../src/bar.c:320 ../src/toolbar.c:193 ../src/ui_bookmark.c:418
+#: ../src/bar.c:334 ../src/toolbar.c:212 ../src/ui_bookmark.c:418
msgid "Move _down"
msgstr ""
-#: ../src/bar.c:321 ../src/toolbar.c:194
+#: ../src/bar.c:335 ../src/toolbar.c:213
msgid "Move to _bottom"
msgstr ""
-#: ../src/bar.c:323 ../src/toolbar.c:196
+#: ../src/bar.c:337 ../src/toolbar.c:215
msgid "Remove"
msgstr ""
-#: ../src/bar.c:714
+#: ../src/bar.c:728
msgid "Add Pane"
msgstr ""
@@ -181,7 +202,7 @@
msgid "Key:"
msgstr ""
-#: ../src/bar_exif.c:576 ../src/preferences.c:1872
+#: ../src/bar_exif.c:576 ../src/preferences.c:1886
msgid "Title:"
msgstr ""
@@ -199,7 +220,7 @@
msgid "Configure \"%s\""
msgstr ""
-#: ../src/bar_exif.c:636 ../src/bar_keywords.c:1342
+#: ../src/bar_exif.c:636 ../src/bar_keywords.c:1367
#, c-format
msgid "Remove \"%s\""
msgstr ""
@@ -303,27 +324,27 @@
msgstr ""
#. use the same strings as in layout_util.c
-#: ../src/bar_histogram.c:257 ../src/layout_util.c:1961
+#: ../src/bar_histogram.c:257 ../src/layout_util.c:2047
msgid "Histogram on _Red"
msgstr ""
-#: ../src/bar_histogram.c:258 ../src/layout_util.c:1962
+#: ../src/bar_histogram.c:258 ../src/layout_util.c:2048
msgid "Histogram on _Green"
msgstr ""
-#: ../src/bar_histogram.c:259 ../src/layout_util.c:1963
+#: ../src/bar_histogram.c:259 ../src/layout_util.c:2049
msgid "Histogram on _Blue"
msgstr ""
-#: ../src/bar_histogram.c:260 ../src/layout_util.c:1964
+#: ../src/bar_histogram.c:260 ../src/layout_util.c:2050
msgid "_Histogram on RGB"
msgstr ""
-#: ../src/bar_histogram.c:261 ../src/layout_util.c:1965
+#: ../src/bar_histogram.c:261 ../src/layout_util.c:2051
msgid "Histogram on _Value"
msgstr ""
-#: ../src/bar_histogram.c:265 ../src/layout_util.c:1969
+#: ../src/bar_histogram.c:265 ../src/layout_util.c:2055
msgid "Li_near Histogram"
msgstr ""
@@ -331,120 +352,125 @@
msgid "L_og Histogram"
msgstr ""
-#: ../src/bar_keywords.c:463
-msgid "Add keywords to selected files"
-msgstr ""
-
-#: ../src/bar_keywords.c:464
-msgid "Replace existing keywords in selected files"
-msgstr ""
-
-#: ../src/bar_keywords.c:935
+#: ../src/bar_keywords.c:488
+msgid "Add selected keywords to selected files"
+msgstr ""
+
+#: ../src/bar_keywords.c:489
+msgid "Replace existing keywords in selected files with selected keywords"
+msgstr ""
+
+#: ../src/bar_keywords.c:960
msgid "Edit keyword"
msgstr ""
-#: ../src/bar_keywords.c:935 ../src/bar_keywords.c:942
-#: ../src/bar_keywords.c:1287
+#: ../src/bar_keywords.c:960 ../src/bar_keywords.c:967
+#: ../src/bar_keywords.c:1312
msgid "New keyword"
msgstr ""
-#: ../src/bar_keywords.c:942
+#: ../src/bar_keywords.c:967
msgid "Configure keyword"
msgstr ""
-#: ../src/bar_keywords.c:948
+#: ../src/bar_keywords.c:973
msgid "Keyword:"
msgstr ""
-#: ../src/bar_keywords.c:957
+#: ../src/bar_keywords.c:982
msgid "Keyword type:"
msgstr ""
-#: ../src/bar_keywords.c:959
+#: ../src/bar_keywords.c:984
msgid "Active keyword"
msgstr ""
-#: ../src/bar_keywords.c:962
+#: ../src/bar_keywords.c:987
msgid "Helper"
msgstr ""
-#: ../src/bar_keywords.c:1036
+#: ../src/bar_keywords.c:1061
msgid "This will disconnect all Marks Keywords connections"
msgstr ""
-#: ../src/bar_keywords.c:1038
+#: ../src/bar_keywords.c:1063
msgid "Marks Keywords"
msgstr ""
-#: ../src/bar_keywords.c:1311
+#: ../src/bar_keywords.c:1336
#, c-format
msgid "Add \"%s\" to all selected images"
msgstr ""
-#: ../src/bar_keywords.c:1317
+#: ../src/bar_keywords.c:1342
#, c-format
msgid "Hide \"%s\""
msgstr ""
-#: ../src/bar_keywords.c:1324
-#, c-format
-msgid "Mark %d"
-msgstr ""
-
-#: ../src/bar_keywords.c:1332
-#, c-format
-msgid "Connect \"%s\" to mark"
-msgstr ""
-
-#: ../src/bar_keywords.c:1339
-#, c-format
-msgid "Edit \"%s\""
-msgstr ""
-
#: ../src/bar_keywords.c:1349
#, c-format
+msgid "Mark %d"
+msgstr ""
+
+#: ../src/bar_keywords.c:1357
+#, c-format
+msgid "Connect \"%s\" to mark"
+msgstr ""
+
+#: ../src/bar_keywords.c:1364
+#, c-format
+msgid "Edit \"%s\""
+msgstr ""
+
+#: ../src/bar_keywords.c:1374
+#, c-format
msgid "Disconnect \"%s\" from mark %s"
msgstr ""
-#: ../src/bar_keywords.c:1356
+#: ../src/bar_keywords.c:1381
#, c-format
msgid "Disconnect all Mark Keyword connections"
msgstr ""
#. for the pane
-#: ../src/bar_keywords.c:1367 ../src/bar_keywords.c:1381
+#: ../src/bar_keywords.c:1392 ../src/bar_keywords.c:1406
msgid "Expand checked"
msgstr ""
-#: ../src/bar_keywords.c:1368 ../src/bar_keywords.c:1382
+#: ../src/bar_keywords.c:1393 ../src/bar_keywords.c:1407
msgid "Collapse unchecked"
msgstr ""
-#: ../src/bar_keywords.c:1369 ../src/bar_keywords.c:1383
+#: ../src/bar_keywords.c:1394 ../src/bar_keywords.c:1408
msgid "Hide unchecked"
msgstr ""
-#: ../src/bar_keywords.c:1370
+#: ../src/bar_keywords.c:1395
msgid "Revert all hidden"
msgstr ""
-#: ../src/bar_keywords.c:1372
+#: ../src/bar_keywords.c:1397
msgid "Show all"
msgstr ""
-#: ../src/bar_keywords.c:1373
+#: ../src/bar_keywords.c:1398
msgid "Collapse all"
msgstr ""
-#: ../src/bar_keywords.c:1374
+#: ../src/bar_keywords.c:1399
msgid "Revert"
msgstr ""
-#: ../src/bar_keywords.c:1378
+#: ../src/bar_keywords.c:1403
msgid "On any change"
msgstr ""
-#: ../src/bar_sort.c:500
+#: ../src/bar_keywords.c:1899
+#, c-format
+msgid "Error: Unable to write keywords list to: %s\n"
+msgstr ""
+
+#: ../src/bar_sort.c:501
#, c-format
msgid ""
"The collection:\n"
@@ -452,63 +478,63 @@
"already exists."
msgstr ""
-#: ../src/bar_sort.c:501
+#: ../src/bar_sort.c:502
msgid "Collection exists"
msgstr ""
-#: ../src/bar_sort.c:515 ../src/collect.c:1146 ../src/collect-dlg.c:93
+#: ../src/bar_sort.c:516 ../src/collect.c:1147 ../src/collect-dlg.c:93
#, c-format
msgid ""
"Failed to save the collection:\n"
"%s"
msgstr ""
-#: ../src/bar_sort.c:516 ../src/collect.c:1147 ../src/collect-dlg.c:94
+#: ../src/bar_sort.c:517 ../src/collect.c:1148 ../src/collect-dlg.c:94
msgid "Save Failed"
msgstr ""
-#: ../src/bar_sort.c:551 ../src/bar_sort.c:723
+#: ../src/bar_sort.c:552 ../src/bar_sort.c:724
msgid "Add Bookmark"
msgstr ""
-#: ../src/bar_sort.c:555
+#: ../src/bar_sort.c:556
msgid "Add Collection"
msgstr ""
-#: ../src/bar_sort.c:572 ../src/shortcuts.c:118 ../src/ui_bookmark.c:297
+#: ../src/bar_sort.c:573 ../src/shortcuts.c:118 ../src/ui_bookmark.c:297
msgid "Name:"
msgstr ""
-#: ../src/bar_sort.c:650
+#: ../src/bar_sort.c:651
msgid "Sort Manager"
msgstr ""
-#: ../src/bar_sort.c:659 ../src/pan-view/pan-view.c:1832
+#: ../src/bar_sort.c:660 ../src/pan-view/pan-view.c:1836
#: ../src/ui_pathsel.c:1108
msgid "Folders"
msgstr ""
-#: ../src/bar_sort.c:660 ../src/options.c:207
+#: ../src/bar_sort.c:661 ../src/options.c:221
msgid "Collections"
msgstr ""
-#: ../src/bar_sort.c:668 ../src/utilops.c:2321
+#: ../src/bar_sort.c:669 ../src/toolbar.c:88 ../src/utilops.c:2329
msgid "Copy"
msgstr ""
-#: ../src/bar_sort.c:671 ../src/utilops.c:2271
+#: ../src/bar_sort.c:672 ../src/toolbar.c:89 ../src/utilops.c:2279
msgid "Move"
msgstr ""
-#: ../src/bar_sort.c:710
+#: ../src/bar_sort.c:711
msgid "Add image"
msgstr ""
-#: ../src/bar_sort.c:713
+#: ../src/bar_sort.c:714
msgid "Add selection"
msgstr ""
-#: ../src/bar_sort.c:726
+#: ../src/bar_sort.c:727
msgid "Undo last image"
msgstr ""
@@ -520,7 +546,7 @@
msgstr ""
#: ../src/cache_maint.c:123 ../src/cache_maint.c:612 ../src/cache_maint.c:880
-#: ../src/editors.c:1205
+#: ../src/editors.c:1228 ../src/preferences.c:2674
msgid "done"
msgstr ""
@@ -540,11 +566,11 @@
msgid "Maintenance"
msgstr ""
-#: ../src/cache_maint.c:732
+#: ../src/cache_maint.c:732 ../src/preferences.c:2756
msgid "Invalid folder"
msgstr ""
-#: ../src/cache_maint.c:733
+#: ../src/cache_maint.c:733 ../src/preferences.c:2757
msgid "The specified folder can not be found."
msgstr ""
@@ -552,19 +578,19 @@
msgid "Create thumbnails"
msgstr ""
-#: ../src/cache_maint.c:804 ../src/cache_maint.c:1063
+#: ../src/cache_maint.c:804 ../src/cache_maint.c:1063 ../src/preferences.c:2795
msgid "S_tart"
msgstr ""
-#: ../src/cache_maint.c:817 ../src/preferences.c:2564
+#: ../src/cache_maint.c:817 ../src/preferences.c:2808 ../src/preferences.c:3134
msgid "Folder:"
msgstr ""
-#: ../src/cache_maint.c:820
+#: ../src/cache_maint.c:820 ../src/preferences.c:2811
msgid "Select folder"
msgstr ""
-#: ../src/cache_maint.c:824
+#: ../src/cache_maint.c:824 ../src/preferences.c:2815
msgid "Include subfolders"
msgstr ""
@@ -572,11 +598,11 @@
msgid "Store thumbnails local to source images"
msgstr ""
-#: ../src/cache_maint.c:834 ../src/cache_maint.c:1072
+#: ../src/cache_maint.c:834 ../src/cache_maint.c:1072 ../src/preferences.c:2823
msgid "click start to begin"
msgstr ""
-#: ../src/cache_maint.c:992 ../src/editors.c:1131
+#: ../src/cache_maint.c:992 ../src/editors.c:1154
msgid "running..."
msgstr ""
@@ -613,7 +639,7 @@
msgstr ""
#: ../src/cache_maint.c:1227 ../src/cache_maint.c:1246
-#: ../src/cache_maint.c:1271
+#: ../src/cache_maint.c:1272
msgid "Clean up"
msgstr ""
@@ -641,13 +667,13 @@
msgid "Render thumbnails for a specific folder."
msgstr ""
-#: ../src/cache_maint.c:1274
+#: ../src/cache_maint.c:1275
msgid "Remove orphaned keywords and comments."
msgstr ""
#. When does this occur ??
-#: ../src/collect.c:422 ../src/image.c:189 ../src/image-overlay.c:549
-#: ../src/image-overlay.c:626
+#: ../src/collect.c:422 ../src/image.c:313 ../src/image-overlay.c:555
+#: ../src/image-overlay.c:632
msgid "Untitled"
msgstr ""
@@ -656,22 +682,22 @@
msgid "Untitled (%d)"
msgstr ""
-#: ../src/collect.c:1071
+#: ../src/collect.c:1072
#, c-format
msgid "%s - Collection - %s"
msgstr ""
-#: ../src/collect.c:1183 ../src/collect.c:1187
+#: ../src/collect.c:1184 ../src/collect.c:1188
msgid "Close collection"
msgstr ""
-#: ../src/collect.c:1188
+#: ../src/collect.c:1189
msgid ""
"Collection has been modified.\n"
"Save first?"
msgstr ""
-#: ../src/collect.c:1191
+#: ../src/collect.c:1192
msgid "_Discard"
msgstr ""
@@ -750,166 +776,189 @@
"error: %s\n"
msgstr ""
-#: ../src/collect-table.c:212
+#: ../src/collect-table.c:214
#, c-format
msgid "%s, %d images (%s, %d)"
msgstr ""
-#: ../src/collect-table.c:219
+#: ../src/collect-table.c:221
#, c-format
msgid "%s, %d images"
msgstr ""
-#: ../src/collect-table.c:224 ../src/layout_util.c:1736
-#: ../src/layout_util.c:2880
+#: ../src/collect-table.c:226 ../src/layout_util.c:1817
+#: ../src/layout_util.c:2992
msgid "Empty"
msgstr ""
-#: ../src/collect-table.c:238 ../src/dupe.c:1363 ../src/search.c:386
-#: ../src/view_file/view_file.c:1004 ../src/view_file/view_file.c:1113
+#: ../src/collect-table.c:240 ../src/dupe.c:1364 ../src/search.c:389
+#: ../src/view_file/view_file.c:1146 ../src/view_file/view_file.c:1255
msgid "Loading thumbs..."
msgstr ""
-#: ../src/collect-table.c:933 ../src/dupe.c:2344 ../src/dupe.c:2662
-#: ../src/layout_util.c:1783 ../src/search.c:1095
+#: ../src/collect-table.c:961 ../src/dupe.c:2354 ../src/dupe.c:2681
+#: ../src/layout_util.c:1864 ../src/search.c:1107
msgid "_View"
msgstr ""
-#: ../src/collect-table.c:935 ../src/dupe.c:2346 ../src/dupe.c:2664
-#: ../src/img-view.c:1328 ../src/layout_image.c:691
-#: ../src/pan-view/pan-view.c:2290 ../src/search.c:1097
-#: ../src/view_file/view_file.c:622
+#: ../src/collect-table.c:963 ../src/dupe.c:2356 ../src/dupe.c:2683
+#: ../src/img-view.c:1337 ../src/layout_image.c:701
+#: ../src/pan-view/pan-view.c:2309 ../src/search.c:1109
+#: ../src/view_file/view_file.c:623
msgid "View in _new window"
msgstr ""
-#: ../src/collect-table.c:937 ../src/pan-view/pan-view.c:2292
+#: ../src/collect-table.c:965 ../src/pan-view/pan-view.c:2311
msgid "Go to original"
msgstr ""
-#: ../src/collect-table.c:940 ../src/dupe.c:2385 ../src/dupe.c:2672
-#: ../src/search.c:1132
+#: ../src/collect-table.c:968 ../src/dupe.c:2404 ../src/dupe.c:2691
msgid "Rem_ove"
msgstr ""
-#: ../src/collect-table.c:943
+#: ../src/collect-table.c:971
msgid "Append from file selection"
msgstr ""
-#: ../src/collect-table.c:945
+#: ../src/collect-table.c:973
msgid "Append from collection..."
msgstr ""
-#: ../src/collect-table.c:949
+#: ../src/collect-table.c:977
msgid "_Selection"
msgstr ""
-#: ../src/collect-table.c:951 ../src/dupe.c:2349 ../src/dupe.c:2667
-#: ../src/layout_util.c:1841 ../src/search.c:1100
+#: ../src/collect-table.c:979 ../src/dupe.c:2359 ../src/dupe.c:2686
+#: ../src/layout_util.c:1923 ../src/search.c:1112 ../src/toolbar.c:94
msgid "Select all"
msgstr ""
-#: ../src/collect-table.c:953 ../src/dupe.c:2351 ../src/dupe.c:2669
-#: ../src/layout_util.c:1842 ../src/search.c:1102
+#: ../src/collect-table.c:981 ../src/dupe.c:2361 ../src/dupe.c:2688
+#: ../src/layout_util.c:1924 ../src/search.c:1114 ../src/toolbar.c:95
msgid "Select none"
msgstr ""
-#: ../src/collect-table.c:955
+#: ../src/collect-table.c:983
msgid "Invert selection"
msgstr ""
-#: ../src/collect-table.c:957
-msgid "Rectangular selection"
-msgstr ""
-
-#: ../src/collect-table.c:969 ../src/dupe.c:2372 ../src/img-view.c:1332
-#: ../src/layout_image.c:699 ../src/layout_util.c:1816
-#: ../src/pan-view/pan-view.c:2296 ../src/search.c:1119
-#: ../src/view_file/view_file.c:626
-msgid "_Copy..."
-msgstr ""
-
-#: ../src/collect-table.c:971 ../src/dupe.c:2374 ../src/img-view.c:1333
-#: ../src/layout_image.c:701 ../src/layout_util.c:1817
-#: ../src/pan-view/pan-view.c:2298 ../src/search.c:1121
-#: ../src/view_file/view_file.c:628
-msgid "_Move..."
-msgstr ""
-
-#: ../src/collect-table.c:973 ../src/dupe.c:2376 ../src/img-view.c:1334
-#: ../src/layout_image.c:703 ../src/layout_util.c:1818
-#: ../src/pan-view/pan-view.c:2300 ../src/search.c:1123 ../src/view_dir.c:683
-#: ../src/view_file/view_file.c:630
-msgid "_Rename..."
-msgstr ""
-
-#: ../src/collect-table.c:975 ../src/dupe.c:2378 ../src/img-view.c:1335
-#: ../src/layout_image.c:705 ../src/pan-view/pan-view.c:2302
-#: ../src/search.c:1125 ../src/view_dir.c:686 ../src/view_file/view_file.c:632
-msgid "_Copy path"
-msgstr ""
-
-#: ../src/collect-table.c:977 ../src/dupe.c:2380 ../src/img-view.c:1336
-#: ../src/layout_image.c:706 ../src/pan-view/pan-view.c:2304
-#: ../src/search.c:1127 ../src/view_dir.c:689 ../src/view_file/view_file.c:634
-msgid "_Copy path unquoted"
-msgstr ""
-
-#: ../src/collect-table.c:979 ../src/dupe.c:2382 ../src/img-view.c:1337
-#: ../src/layout_image.c:708 ../src/layout_util.c:1819
-#: ../src/layout_util.c:1820 ../src/layout_util.c:1821
-#: ../src/pan-view/pan-view.c:2306 ../src/search.c:1129 ../src/view_dir.c:692
-#: ../src/view_file/view_file.c:636
-msgid "_Delete..."
-msgstr ""
-
#: ../src/collect-table.c:985
+msgid "Rectangular selection"
+msgstr ""
+
+#: ../src/collect-table.c:997 ../src/dupe.c:2382 ../src/img-view.c:1341
+#: ../src/layout_image.c:709 ../src/layout_util.c:1897
+#: ../src/pan-view/pan-view.c:2315 ../src/search.c:1131
+#: ../src/view_file/view_file.c:627
+msgid "_Copy..."
+msgstr ""
+
+#: ../src/collect-table.c:999 ../src/dupe.c:2384 ../src/img-view.c:1342
+#: ../src/layout_image.c:711 ../src/layout_util.c:1898
+#: ../src/pan-view/pan-view.c:2317 ../src/search.c:1133
+#: ../src/view_file/view_file.c:629
+msgid "_Move..."
+msgstr ""
+
+#: ../src/collect-table.c:1001 ../src/dupe.c:2386 ../src/img-view.c:1343
+#: ../src/layout_image.c:713 ../src/layout_util.c:1899
+#: ../src/pan-view/pan-view.c:2319 ../src/search.c:1135 ../src/view_dir.c:686
+#: ../src/view_file/view_file.c:631
+msgid "_Rename..."
+msgstr ""
+
+#: ../src/collect-table.c:1003 ../src/dupe.c:2388 ../src/img-view.c:1344
+#: ../src/layout_image.c:715 ../src/pan-view/pan-view.c:2321
+#: ../src/search.c:1137 ../src/view_dir.c:689 ../src/view_file/view_file.c:633
+msgid "_Copy path"
+msgstr ""
+
+#: ../src/collect-table.c:1005 ../src/dupe.c:2390 ../src/img-view.c:1345
+#: ../src/layout_image.c:716 ../src/pan-view/pan-view.c:2323
+#: ../src/search.c:1139 ../src/view_dir.c:692 ../src/view_file/view_file.c:635
+msgid "_Copy path unquoted"
+msgstr ""
+
+#: ../src/collect-table.c:1010 ../src/dupe.c:2395 ../src/img-view.c:1349
+#: ../src/layout_image.c:721 ../src/layout_util.c:1900
+#: ../src/layout_util.c:1901 ../src/layout_util.c:1902
+#: ../src/pan-view/pan-view.c:2328 ../src/search.c:1144
+#: ../src/view_file/view_file.c:639
+msgid "Move to Trash..."
+msgstr "Move to Rubbish bin..."
+
+#: ../src/collect-table.c:1011 ../src/dupe.c:2396 ../src/img-view.c:1350
+#: ../src/layout_image.c:722 ../src/pan-view/pan-view.c:2329
+#: ../src/search.c:1145 ../src/view_file/view_file.c:640
+msgid "Move to Trash"
+msgstr "Move to Rubbish bin"
+
+#: ../src/collect-table.c:1014 ../src/dupe.c:2399 ../src/img-view.c:1353
+#: ../src/layout_image.c:726 ../src/pan-view/pan-view.c:2332
+#: ../src/search.c:1148 ../src/view_dir.c:695 ../src/view_file/view_file.c:643
+msgid "_Delete..."
+msgstr ""
+
+#: ../src/collect-table.c:1015 ../src/dupe.c:2400 ../src/img-view.c:1354
+#: ../src/layout_image.c:727 ../src/pan-view/pan-view.c:2333
+#: ../src/search.c:1149 ../src/ui_pathsel.c:644
+#: ../src/view_file/view_file.c:644
+msgid "_Delete"
+msgstr ""
+
+#: ../src/collect-table.c:1021
msgid "Randomize"
msgstr "Randomise"
-#: ../src/collect-table.c:987 ../src/view_file/view_file.c:661
+#: ../src/collect-table.c:1023 ../src/view_file/view_file.c:669
msgid "_Sort"
msgstr ""
-#: ../src/collect-table.c:990 ../src/view_file/view_file.c:677
+#: ../src/collect-table.c:1026 ../src/view_file/view_file.c:685
msgid "Show filename _text"
msgstr ""
-#: ../src/collect-table.c:993
+#: ../src/collect-table.c:1028 ../src/view_file/view_file.c:693
+#: ../src/view_file/view_file.c:697
+msgid "Show star rating"
+msgstr ""
+
+#: ../src/collect-table.c:1031
msgid "_Save collection"
msgstr ""
-#: ../src/collect-table.c:995
+#: ../src/collect-table.c:1033
msgid "Save collection _as..."
msgstr ""
-#: ../src/collect-table.c:998 ../src/layout_util.c:1812
-#: ../src/view_file/view_file.c:646
+#: ../src/collect-table.c:1036 ../src/layout_util.c:1893
+#: ../src/view_file/view_file.c:654
msgid "_Find duplicates..."
msgstr ""
-#: ../src/collect-table.c:1000 ../src/dupe.c:2369 ../src/layout_util.c:1814
-#: ../src/search.c:1116
+#: ../src/collect-table.c:1038 ../src/dupe.c:2379 ../src/layout_util.c:1895
+#: ../src/search.c:1128
msgid "Print..."
msgstr ""
-#: ../src/collect-table.c:2189 ../src/dupe.c:3528 ../src/img-view.c:1496
+#: ../src/collect-table.c:2227 ../src/dupe.c:3548 ../src/img-view.c:1514
msgid "Dropped list includes folders."
msgstr ""
-#: ../src/collect-table.c:2191 ../src/dupe.c:3530 ../src/img-view.c:1498
+#: ../src/collect-table.c:2229 ../src/dupe.c:3550 ../src/img-view.c:1516
msgid "_Add contents"
msgstr ""
-#: ../src/collect-table.c:2193 ../src/dupe.c:3531 ../src/img-view.c:1499
+#: ../src/collect-table.c:2231 ../src/dupe.c:3551 ../src/img-view.c:1517
msgid "Add contents _recursive"
msgstr ""
-#: ../src/collect-table.c:2195 ../src/dupe.c:3532 ../src/img-view.c:1500
+#: ../src/collect-table.c:2233 ../src/dupe.c:3552 ../src/img-view.c:1518
msgid "_Skip folders"
msgstr ""
-#: ../src/collect-table.c:2198 ../src/dupe.c:3534 ../src/img-view.c:1502
-#: ../src/view_dir.c:426
+#: ../src/collect-table.c:2236 ../src/dupe.c:3554 ../src/img-view.c:1520
+#: ../src/view_dir.c:429
msgid "Cancel"
msgstr ""
@@ -945,7 +994,7 @@
msgid "Could not create directory"
msgstr ""
-#: ../src/desktop_file.c:191 ../src/desktop_file.c:554
+#: ../src/desktop_file.c:191 ../src/desktop_file.c:648
msgid "Desktop file"
msgstr ""
@@ -956,8 +1005,8 @@
"%s"
msgstr ""
-#: ../src/desktop_file.c:301 ../src/ui_pathsel.c:495 ../src/utilops.c:2157
-#: ../src/utilops.c:2184 ../src/utilops.c:2706
+#: ../src/desktop_file.c:301 ../src/ui_pathsel.c:495 ../src/utilops.c:2158
+#: ../src/utilops.c:2192 ../src/utilops.c:2714
msgid "File deletion failed"
msgstr ""
@@ -977,230 +1026,234 @@
msgid "new.desktop"
msgstr ""
-#: ../src/desktop_file.c:467
+#: ../src/desktop_file.c:548 ../src/menu.c:119
msgid "Plugins"
msgstr ""
-#: ../src/desktop_file.c:544
+#: ../src/desktop_file.c:616
+msgid "Disabled"
+msgstr ""
+
+#: ../src/desktop_file.c:638
msgid "Hidden"
msgstr ""
-#: ../src/desktop_file.c:563 ../src/dupe.c:2771 ../src/dupe.c:3310
-#: ../src/print.c:3211 ../src/search.c:3329 ../src/ui_pathsel.c:1120
-#: ../src/utilops.c:501
+#: ../src/desktop_file.c:657 ../src/dupe.c:2790 ../src/dupe.c:3330
+#: ../src/preferences.c:2063 ../src/print.c:416 ../src/search.c:3453
+#: ../src/ui_pathsel.c:1120 ../src/utilops.c:501
msgid "Path"
msgstr ""
-#: ../src/dupe.c:109
+#: ../src/dupe.c:110
msgid "Drop files to compare them."
msgstr ""
-#: ../src/dupe.c:113
+#: ../src/dupe.c:114
#, c-format
msgid "%d files"
msgstr ""
-#: ../src/dupe.c:117
+#: ../src/dupe.c:118
#, c-format
msgid "%d matches found in %d files"
msgstr ""
-#: ../src/dupe.c:122
+#: ../src/dupe.c:123
msgid "[set 1]"
msgstr ""
-#: ../src/dupe.c:1489
+#: ../src/dupe.c:1490
msgid "Reading checksums..."
msgstr ""
-#: ../src/dupe.c:1522
+#: ../src/dupe.c:1523
msgid "Reading dimensions..."
msgstr ""
-#: ../src/dupe.c:1556
+#: ../src/dupe.c:1557
msgid "Reading similarity data..."
msgstr ""
-#: ../src/dupe.c:1592 ../src/dupe.c:1623
+#: ../src/dupe.c:1593 ../src/dupe.c:1624
msgid "Comparing..."
msgstr ""
-#: ../src/dupe.c:1603 ../src/pan-view/pan-view.c:1012
+#: ../src/dupe.c:1604 ../src/pan-view/pan-view.c:1012
msgid "Sorting..."
msgstr ""
-#: ../src/dupe.c:2353
+#: ../src/dupe.c:2363
msgid "Select group _1 duplicates"
msgstr ""
-#: ../src/dupe.c:2355
+#: ../src/dupe.c:2365
msgid "Select group _2 duplicates"
msgstr ""
-#: ../src/dupe.c:2387 ../src/dupe.c:2674 ../src/search.c:1134
+#: ../src/dupe.c:2406 ../src/dupe.c:2693
msgid "C_lear"
msgstr ""
-#: ../src/dupe.c:2390 ../src/dupe.c:2677
+#: ../src/dupe.c:2409 ../src/dupe.c:2696
msgid "Close _window"
msgstr ""
-#: ../src/dupe.c:2550
+#: ../src/dupe.c:2569
#, c-format
msgid "%d files (set 2)"
msgstr ""
-#: ../src/dupe.c:2766
+#: ../src/dupe.c:2785
msgid "Name case-insensitive"
msgstr ""
-#: ../src/dupe.c:2767 ../src/dupe.c:3307 ../src/preferences.c:2017
-#: ../src/print.c:3215 ../src/search.c:3326
-#: ../src/view_file/view_file_list.c:2071
+#: ../src/dupe.c:2786 ../src/dupe.c:3327 ../src/preferences.c:2033
+#: ../src/preferences.c:2065 ../src/print.c:420 ../src/search.c:3450
+#: ../src/view_file/view_file_list.c:2082
msgid "Size"
msgstr ""
-#: ../src/dupe.c:2768 ../src/dupe.c:3308 ../src/exif.c:336
-#: ../src/exif-common.c:870 ../src/print.c:3213 ../src/search.c:3327
-#: ../src/view_file/view_file_list.c:2075
+#: ../src/dupe.c:2787 ../src/dupe.c:3328 ../src/exif.c:336
+#: ../src/exif-common.c:900 ../src/preferences.c:2064 ../src/print.c:418
+#: ../src/search.c:3451 ../src/view_file/view_file_list.c:2086
msgid "Date"
msgstr ""
-#: ../src/dupe.c:2769 ../src/dupe.c:3309 ../src/print.c:3217
-#: ../src/search.c:3328
+#: ../src/dupe.c:2788 ../src/dupe.c:3329 ../src/preferences.c:2067
+#: ../src/print.c:422 ../src/search.c:3452
msgid "Dimensions"
msgstr ""
-#: ../src/dupe.c:2770
+#: ../src/dupe.c:2789
msgid "Checksum"
msgstr ""
-#: ../src/dupe.c:2772
+#: ../src/dupe.c:2791
msgid "Similarity (high)"
msgstr ""
-#: ../src/dupe.c:2773
+#: ../src/dupe.c:2792
msgid "Similarity"
msgstr ""
-#: ../src/dupe.c:2774
+#: ../src/dupe.c:2793
msgid "Similarity (low)"
msgstr ""
-#: ../src/dupe.c:2775
+#: ../src/dupe.c:2794
msgid "Similarity (custom)"
msgstr ""
-#: ../src/dupe.c:3260 ../src/toolbar.c:86
+#: ../src/dupe.c:3280 ../src/toolbar.c:86
msgid "Find duplicates"
msgstr ""
-#: ../src/dupe.c:3342
+#: ../src/dupe.c:3362
msgid "Compare to:"
msgstr ""
-#: ../src/dupe.c:3355
+#: ../src/dupe.c:3375
msgid "Compare by:"
msgstr ""
-#: ../src/dupe.c:3363 ../src/preferences.c:1714 ../src/search.c:3342
+#: ../src/dupe.c:3383 ../src/preferences.c:1721 ../src/search.c:3466
msgid "Thumbnails"
msgstr ""
-#: ../src/dupe.c:3371
+#: ../src/dupe.c:3391
msgid "Ignore Rotation"
msgstr ""
-#: ../src/dupe.c:3379
+#: ../src/dupe.c:3399
msgid "Compare two file sets"
msgstr ""
-#: ../src/dupe.c:3399 ../src/menu.c:229
+#: ../src/dupe.c:3419 ../src/menu.c:229
msgid "Sort"
msgstr ""
-#: ../src/dupe.c:3407
+#: ../src/dupe.c:3427
msgid "Custom Threshold"
msgstr ""
-#: ../src/editors.c:305
+#: ../src/editors.c:307
#, c-format
msgid "Desktop file '%s' should not include extension in Icon key: '%s'\n"
msgstr ""
#. flash fired (bit 0)
-#: ../src/editors.c:359 ../src/exif.c:220 ../src/exif-common.c:429
+#: ../src/editors.c:377 ../src/exif.c:220 ../src/exif-common.c:429
msgid "yes"
msgstr ""
-#: ../src/editors.c:359 ../src/exif.c:219 ../src/exif-common.c:429
+#: ../src/editors.c:377 ../src/exif.c:219 ../src/exif-common.c:429
msgid "no"
msgstr ""
-#: ../src/editors.c:531
+#: ../src/editors.c:554
msgid "stopping..."
msgstr ""
-#: ../src/editors.c:552
+#: ../src/editors.c:575
msgid "Edit command results"
msgstr ""
-#: ../src/editors.c:555
+#: ../src/editors.c:578
#, c-format
msgid "Output of %s"
msgstr ""
-#: ../src/editors.c:1082
+#: ../src/editors.c:1105
#, c-format
msgid ""
"Failed to run command:\n"
"%s\n"
msgstr ""
-#: ../src/editors.c:1209
+#: ../src/editors.c:1232
msgid "stopped by user"
msgstr ""
-#: ../src/editors.c:1294
+#: ../src/editors.c:1317
#, c-format
msgid ""
"%s\n"
"\"%s\""
msgstr ""
-#: ../src/editors.c:1296
+#: ../src/editors.c:1319
msgid "Invalid editor command"
msgstr ""
-#: ../src/editors.c:1383
+#: ../src/editors.c:1406
msgid "Editor template is empty."
msgstr ""
-#: ../src/editors.c:1384
+#: ../src/editors.c:1407
msgid "Editor template has incorrect syntax."
msgstr ""
-#: ../src/editors.c:1385
+#: ../src/editors.c:1408
msgid "Editor template uses incompatible macros."
msgstr ""
-#: ../src/editors.c:1386
+#: ../src/editors.c:1409
msgid "Can't find matching file type."
msgstr ""
-#: ../src/editors.c:1387
+#: ../src/editors.c:1410
msgid "Can't execute external editor."
msgstr ""
-#: ../src/editors.c:1388
+#: ../src/editors.c:1411
msgid "External editor returned error status."
msgstr ""
-#: ../src/editors.c:1389
+#: ../src/editors.c:1412
msgid "File was skipped."
msgstr ""
-#: ../src/editors.c:1390
+#: ../src/editors.c:1413
msgid "Unknown error."
msgstr ""
@@ -1592,7 +1645,7 @@
msgid "Spectral Sensitivity"
msgstr ""
-#: ../src/exif.c:349 ../src/exif.c:385 ../src/exif-common.c:875
+#: ../src/exif.c:349 ../src/exif.c:385 ../src/exif-common.c:905
msgid "ISO sensitivity"
msgstr ""
@@ -1608,7 +1661,7 @@
msgid "Date original"
msgstr ""
-#: ../src/exif.c:353
+#: ../src/exif.c:353 ../src/preferences.c:2078
msgid "Date digitized"
msgstr "Date digitised"
@@ -1620,11 +1673,11 @@
msgid "Compression ratio"
msgstr ""
-#: ../src/exif.c:356 ../src/exif-common.c:872
+#: ../src/exif.c:356 ../src/exif-common.c:902 ../src/preferences.c:2084
msgid "Shutter speed"
msgstr ""
-#: ../src/exif.c:357 ../src/exif-common.c:873
+#: ../src/exif.c:357 ../src/exif-common.c:903 ../src/preferences.c:2080
msgid "Aperture"
msgstr ""
@@ -1632,7 +1685,7 @@
msgid "Brightness"
msgstr ""
-#: ../src/exif.c:359 ../src/exif-common.c:874
+#: ../src/exif.c:359 ../src/exif-common.c:904 ../src/preferences.c:2081
msgid "Exposure bias"
msgstr ""
@@ -1640,7 +1693,7 @@
msgid "Maximum aperture"
msgstr ""
-#: ../src/exif.c:361 ../src/exif-common.c:878
+#: ../src/exif.c:361 ../src/exif-common.c:908 ../src/preferences.c:2088
msgid "Subject distance"
msgstr ""
@@ -1652,11 +1705,11 @@
msgid "Light source"
msgstr ""
-#: ../src/exif.c:364 ../src/exif-common.c:879
+#: ../src/exif.c:364 ../src/exif-common.c:909 ../src/preferences.c:2089
msgid "Flash"
msgstr ""
-#: ../src/exif.c:365 ../src/exif-common.c:876
+#: ../src/exif.c:365 ../src/exif-common.c:906 ../src/preferences.c:2086
msgid "Focal length"
msgstr ""
@@ -1693,11 +1746,11 @@
msgstr "Colourspace"
#. ExifImageWidth, ExifImageHeight can also be unsigned short
-#: ../src/exif.c:375 ../src/preferences.c:2829
+#: ../src/exif.c:375 ../src/preferences.c:3411
msgid "Width"
msgstr ""
-#: ../src/exif.c:376 ../src/preferences.c:2831
+#: ../src/exif.c:376 ../src/preferences.c:3413
msgid "Height"
msgstr ""
@@ -1782,7 +1835,7 @@
msgid "Contrast"
msgstr ""
-#: ../src/exif.c:399 ../src/preferences.c:2435
+#: ../src/exif.c:399 ../src/preferences.c:2986
msgid "Saturation"
msgstr ""
@@ -1818,11 +1871,11 @@
msgid "mode:"
msgstr ""
-#: ../src/exif-common.c:437 ../src/trash.c:213
+#: ../src/exif-common.c:437
msgid "on"
msgstr ""
-#: ../src/exif-common.c:440 ../src/trash.c:218
+#: ../src/exif-common.c:440
msgid "off"
msgstr ""
@@ -1860,141 +1913,165 @@
msgid "Below Sea Level"
msgstr ""
-#: ../src/exif-common.c:869
+#: ../src/exif-common.c:899 ../src/preferences.c:2083
msgid "Camera"
msgstr ""
-#: ../src/exif-common.c:871
+#: ../src/exif-common.c:901
msgid "DateDigitized"
msgstr "DateDigitised"
-#: ../src/exif-common.c:877
+#: ../src/exif-common.c:907
msgid "Focal length 35mm"
msgstr ""
-#: ../src/exif-common.c:880
+#: ../src/exif-common.c:910 ../src/preferences.c:2082
msgid "Resolution"
msgstr ""
-#: ../src/exif-common.c:881
+#: ../src/exif-common.c:911 ../src/preferences.c:2090
msgid "Color profile"
msgstr "Colour profile"
-#: ../src/exif-common.c:882
+#: ../src/exif-common.c:912
msgid "GPS position"
msgstr ""
-#: ../src/exif-common.c:883
+#: ../src/exif-common.c:913
msgid "GPS altitude"
msgstr ""
-#: ../src/exif-common.c:884
+#: ../src/exif-common.c:914 ../src/preferences.c:2093
msgid "Local time"
msgstr ""
-#: ../src/exif-common.c:885
+#: ../src/exif-common.c:915
msgid "Time zone"
msgstr ""
-#: ../src/exif-common.c:886
+#: ../src/exif-common.c:916 ../src/preferences.c:2095
+msgid "Country name"
+msgstr ""
+
+#: ../src/exif-common.c:917 ../src/preferences.c:2096
+msgid "Country code"
+msgstr ""
+
+#: ../src/exif-common.c:918 ../src/preferences.c:2097
msgid "Star rating"
msgstr ""
-#: ../src/exif-common.c:887
+#: ../src/exif-common.c:919
msgid "File size"
msgstr ""
-#: ../src/exif-common.c:888
+#: ../src/exif-common.c:920
msgid "File date"
msgstr ""
-#: ../src/exif-common.c:889
+#: ../src/exif-common.c:921 ../src/preferences.c:2072
msgid "File mode"
msgstr ""
-#: ../src/exif-common.c:890
+#: ../src/exif-common.c:922 ../src/preferences.c:2071
msgid "File ctime"
msgstr ""
-#: ../src/filedata.c:110
+#: ../src/exif-common.c:923 ../src/preferences.c:2073
+msgid "File owner"
+msgstr ""
+
+#: ../src/exif-common.c:924 ../src/preferences.c:2074
+msgid "File group"
+msgstr ""
+
+#: ../src/exif-common.c:925 ../src/preferences.c:2075
+msgid "File link"
+msgstr ""
+
+#: ../src/exif-common.c:926 ../src/preferences.c:2076
+msgid "File class"
+msgstr ""
+
+#: ../src/filedata.c:112
#, c-format
msgid "%d bytes"
msgstr ""
-#: ../src/filedata.c:114
+#: ../src/filedata.c:116
#, c-format
msgid "%.1f K"
msgstr ""
-#: ../src/filedata.c:118
+#: ../src/filedata.c:120
#, c-format
msgid "%.1f MB"
msgstr ""
-#: ../src/filedata.c:123
+#: ../src/filedata.c:125
#, c-format
msgid "%.1f GB"
msgstr ""
-#: ../src/filedata.c:2625
+#: ../src/filedata.c:2680
msgid "file or directory does not exist"
msgstr ""
-#: ../src/filedata.c:2631
+#: ../src/filedata.c:2686
msgid "destination already exists"
msgstr ""
-#: ../src/filedata.c:2637
+#: ../src/filedata.c:2692
msgid "destination can't be overwritten"
msgstr ""
-#: ../src/filedata.c:2643
+#: ../src/filedata.c:2698
msgid "destination directory is not writable"
msgstr ""
-#: ../src/filedata.c:2649
+#: ../src/filedata.c:2704
msgid "destination directory does not exist"
msgstr ""
-#: ../src/filedata.c:2655
+#: ../src/filedata.c:2710
msgid "source directory is not writable"
msgstr ""
-#: ../src/filedata.c:2661
+#: ../src/filedata.c:2716
msgid "no read permission"
msgstr ""
-#: ../src/filedata.c:2667
+#: ../src/filedata.c:2722
msgid "file is readonly"
msgstr ""
-#: ../src/filedata.c:2673
+#: ../src/filedata.c:2728
msgid "destination already exists and will be overwritten"
msgstr ""
-#: ../src/filedata.c:2679
+#: ../src/filedata.c:2734
msgid "source and destination are the same"
msgstr ""
-#: ../src/filedata.c:2685
+#: ../src/filedata.c:2740
msgid "source and destination have different extension"
msgstr ""
-#: ../src/filedata.c:2691
+#: ../src/filedata.c:2746
msgid "there are unsaved metadata changes for the file"
msgstr ""
-#: ../src/filedata.c:2697
+#: ../src/filedata.c:2752
msgid "another destination file has the same filename"
msgstr ""
-#: ../src/filedata.c:3251
+#: ../src/filedata.c:3306
#, c-format
msgid "Error: Unable to write marks lists to: %s\n"
msgstr ""
-#: ../src/fullscreen.c:242 ../src/layout_util.c:1883 ../src/layout_util.c:1884
-#: ../src/layout_util.c:1885 ../src/preferences.c:2030
+#: ../src/fullscreen.c:242 ../src/layout_util.c:1966 ../src/layout_util.c:1967
+#: ../src/layout_util.c:1968 ../src/preferences.c:2046
msgid "Full screen"
msgstr ""
@@ -2067,7 +2144,7 @@
msgid "Unable to write history lists to: %s\n"
msgstr ""
-#: ../src/image.c:190
+#: ../src/image.c:314
#, c-format
msgid " (Collection %s)"
msgstr ""
@@ -2077,201 +2154,201 @@
msgid "Error interpreting JPEG image file (%s)"
msgstr ""
-#: ../src/img-view.c:1312 ../src/layout_image.c:674 ../src/layout_util.c:1850
-#: ../src/layout_util.c:1851 ../src/layout_util.c:1866
-#: ../src/layout_util.c:1867 ../src/pan-view/pan-view.c:2275
+#: ../src/img-view.c:1321 ../src/layout_image.c:684 ../src/layout_util.c:1933
+#: ../src/layout_util.c:1934 ../src/layout_util.c:1949
+#: ../src/layout_util.c:1950 ../src/pan-view/pan-view.c:2294
msgid "Zoom _in"
msgstr ""
-#: ../src/img-view.c:1313 ../src/layout_image.c:675 ../src/layout_util.c:1852
-#: ../src/layout_util.c:1853 ../src/layout_util.c:1868
-#: ../src/layout_util.c:1869 ../src/pan-view/pan-view.c:2277
+#: ../src/img-view.c:1322 ../src/layout_image.c:685 ../src/layout_util.c:1935
+#: ../src/layout_util.c:1936 ../src/layout_util.c:1951
+#: ../src/layout_util.c:1952 ../src/pan-view/pan-view.c:2296
msgid "Zoom _out"
msgstr ""
-#: ../src/img-view.c:1314 ../src/layout_image.c:676 ../src/layout_util.c:1854
-#: ../src/layout_util.c:1855 ../src/layout_util.c:1870
-#: ../src/layout_util.c:1871 ../src/pan-view/pan-view.c:2279
+#: ../src/img-view.c:1323 ../src/layout_image.c:686 ../src/layout_util.c:1937
+#: ../src/layout_util.c:1938 ../src/layout_util.c:1953
+#: ../src/layout_util.c:1954 ../src/pan-view/pan-view.c:2298
msgid "Zoom _1:1"
msgstr ""
-#: ../src/img-view.c:1315 ../src/layout_image.c:677
+#: ../src/img-view.c:1324 ../src/layout_image.c:687
msgid "Fit image to _window"
msgstr ""
-#: ../src/img-view.c:1324 ../src/layout_image.c:687 ../src/layout_util.c:1848
+#: ../src/img-view.c:1333 ../src/layout_image.c:697 ../src/layout_util.c:1930
msgid "Set as _wallpaper"
msgstr ""
-#: ../src/img-view.c:1329 ../src/layout_image.c:694
+#: ../src/img-view.c:1338 ../src/layout_image.c:704
msgid "_Go to directory view"
msgstr ""
-#: ../src/img-view.c:1348 ../src/layout_image.c:719
+#: ../src/img-view.c:1366 ../src/layout_image.c:739
msgid "_Stop slideshow"
msgstr ""
-#: ../src/img-view.c:1351 ../src/layout_image.c:722
+#: ../src/img-view.c:1369 ../src/layout_image.c:742
msgid "Continue slides_how"
msgstr ""
-#: ../src/img-view.c:1356 ../src/img-view.c:1364 ../src/layout_image.c:727
-#: ../src/layout_image.c:734
+#: ../src/img-view.c:1374 ../src/img-view.c:1382 ../src/layout_image.c:747
+#: ../src/layout_image.c:754
msgid "Pause slides_how"
msgstr ""
-#: ../src/img-view.c:1362 ../src/layout_image.c:733
+#: ../src/img-view.c:1380 ../src/layout_image.c:753
msgid "_Start slideshow"
msgstr ""
-#: ../src/img-view.c:1370 ../src/layout_image.c:744
-#: ../src/pan-view/pan-view.c:2359
+#: ../src/img-view.c:1388 ../src/layout_image.c:764
+#: ../src/pan-view/pan-view.c:2386
msgid "Exit _full screen"
msgstr ""
-#: ../src/img-view.c:1374 ../src/layout_image.c:740
-#: ../src/pan-view/pan-view.c:2363
+#: ../src/img-view.c:1392 ../src/layout_image.c:760
+#: ../src/pan-view/pan-view.c:2390
msgid "_Full screen"
msgstr ""
-#: ../src/img-view.c:1378 ../src/layout_util.c:1826
-#: ../src/pan-view/pan-view.c:2367
+#: ../src/img-view.c:1396 ../src/layout_util.c:1908
+#: ../src/pan-view/pan-view.c:2394
msgid "C_lose window"
msgstr ""
-#: ../src/layout.c:407 ../src/view_file/view_file.c:658
+#: ../src/layout.c:424 ../src/view_file/view_file.c:666
msgid "Ascending"
msgstr ""
-#: ../src/layout.c:487
+#: ../src/layout.c:504
msgid "Scroll to top left corner"
msgstr ""
-#: ../src/layout.c:492
+#: ../src/layout.c:509
msgid "Scroll to image center"
msgstr ""
-#: ../src/layout.c:497
+#: ../src/layout.c:514
msgid "Keep the region from previous image"
msgstr ""
-#: ../src/layout.c:603
+#: ../src/layout.c:620
msgid " Slideshow"
msgstr ""
-#: ../src/layout.c:607
+#: ../src/layout.c:624
msgid " Paused"
msgstr ""
-#: ../src/layout.c:623
+#: ../src/layout.c:640
#, c-format
msgid "%s, %d files (%s, %d)%s"
msgstr ""
-#: ../src/layout.c:630
+#: ../src/layout.c:647
#, c-format
msgid "%s, %d files%s"
msgstr ""
-#: ../src/layout.c:635
+#: ../src/layout.c:652
#, c-format
msgid "%d files%s"
msgstr ""
-#: ../src/layout.c:681
+#: ../src/layout.c:698
#, c-format
msgid "(no read permission) %s bytes"
msgstr ""
-#: ../src/layout.c:685
+#: ../src/layout.c:702
#, c-format
msgid "( ? x ? ) %s bytes"
msgstr ""
-#: ../src/layout.c:693
+#: ../src/layout.c:710
#, c-format
msgid "( %d x %d ) %s bytes"
msgstr ""
-#: ../src/layout.c:779
+#: ../src/layout.c:796
msgid "Select sort order"
msgstr ""
-#: ../src/layout.c:784
+#: ../src/layout.c:801
msgid "Folder contents (files selected)"
msgstr ""
-#: ../src/layout.c:793
+#: ../src/layout.c:810
msgid "(Image dimensions) Image size"
msgstr ""
-#: ../src/layout.c:803
+#: ../src/layout.c:820
msgid "Select zoom and scroll mode"
msgstr ""
#. expand only in small format
-#: ../src/layout.c:813
+#: ../src/layout.c:830
msgid "[Pixel x,y coord]: (Pixel R,G,B value)"
msgstr ""
-#: ../src/layout.c:1458 ../src/layout_config.c:67
+#: ../src/layout.c:1493 ../src/layout_config.c:67
msgid "Tools"
msgstr ""
-#: ../src/layout.c:2085
+#: ../src/layout.c:2123
msgid "Window options and layout"
msgstr ""
-#: ../src/layout.c:2150
+#: ../src/layout.c:2188
msgid "General options"
msgstr ""
-#: ../src/layout.c:2152
+#: ../src/layout.c:2190
msgid "Home path (empty to use your home directory)"
msgstr ""
-#: ../src/layout.c:2160
+#: ../src/layout.c:2198
msgid "Use current"
msgstr ""
-#: ../src/layout.c:2163
+#: ../src/layout.c:2201
msgid "Show date in directories list view"
msgstr ""
-#: ../src/layout.c:2166
+#: ../src/layout.c:2204
msgid "Exit program when this window is closed"
msgstr ""
-#: ../src/layout.c:2169
+#: ../src/layout.c:2207
msgid "Start-up directory:"
msgstr ""
-#: ../src/layout.c:2171
+#: ../src/layout.c:2209
msgid "No change"
msgstr ""
-#: ../src/layout.c:2174
+#: ../src/layout.c:2212
msgid "Restore last path"
msgstr ""
-#: ../src/layout.c:2177
+#: ../src/layout.c:2215
msgid "Home path"
msgstr ""
-#: ../src/layout.c:2181 ../src/print.c:3375 ../src/print.c:3382
+#: ../src/layout.c:2219
msgid "Layout"
msgstr ""
-#: ../src/layout.c:2428
+#: ../src/layout.c:2466
msgid "Invalid geometry\n"
msgstr ""
-#: ../src/layout_config.c:67 ../src/preferences.c:2150 ../src/ui_pathsel.c:1187
+#: ../src/layout_config.c:67 ../src/preferences.c:2358 ../src/ui_pathsel.c:1187
msgid "Files"
msgstr ""
-#: ../src/layout_config.c:67 ../src/preferences.c:109 ../src/preferences.c:1915
-#: ../src/print.c:133 ../src/search.c:2088 ../src/search.c:3239
+#: ../src/layout_config.c:67 ../src/preferences.c:116 ../src/preferences.c:1934
+#: ../src/search.c:2178 ../src/search.c:3363
msgid "Image"
msgstr ""
@@ -2279,1216 +2356,1239 @@
msgid "(drag to change order)"
msgstr ""
-#: ../src/layout_image.c:747
+#: ../src/layout_image.c:767
msgid "_Animate"
msgstr ""
-#: ../src/layout_image.c:751
+#: ../src/layout_image.c:771
msgid "Hide file _list"
msgstr ""
-#: ../src/layout_image.c:1942
+#: ../src/layout_image.c:1962
#, c-format
msgid "[%*d,%*d]: RGB(%3d,%3d,%3d)"
msgstr ""
-#: ../src/layout_image.c:1950
+#: ../src/layout_image.c:1970
#, c-format
msgid "[%*s,%*s]: RGB(---,---,---)"
msgstr ""
-#: ../src/layout_util.c:255 ../src/layout_util.c:1912
+#: ../src/layout_util.c:265 ../src/layout_util.c:1995
msgid "Clear Marks"
msgstr ""
-#: ../src/layout_util.c:569
+#: ../src/layout_util.c:606
msgid "Operation failed:\n"
msgstr ""
-#: ../src/layout_util.c:572
+#: ../src/layout_util.c:609
msgid "No file extension\n"
msgstr ""
-#: ../src/layout_util.c:574
+#: ../src/layout_util.c:611
msgid "Cannot create tmp file\n"
msgstr ""
-#: ../src/layout_util.c:576
+#: ../src/layout_util.c:613
msgid "Operation not supported for filetype\n"
msgstr ""
-#: ../src/layout_util.c:578
+#: ../src/layout_util.c:615
msgid "File is not writable\n"
msgstr ""
-#: ../src/layout_util.c:580
+#: ../src/layout_util.c:617
msgid "Exiftran error\n"
msgstr ""
-#: ../src/layout_util.c:582
+#: ../src/layout_util.c:619
msgid "Mogrify error\n"
msgstr ""
-#: ../src/layout_util.c:586
+#: ../src/layout_util.c:623
msgid "Image orientation"
msgstr ""
-#: ../src/layout_util.c:1776
+#: ../src/layout_util.c:1857
msgid "_File"
msgstr ""
-#: ../src/layout_util.c:1777
-msgid "_Go"
-msgstr ""
-
-#: ../src/layout_util.c:1778 ../src/menu.c:119
-msgid "_Edit"
-msgstr ""
-
-#: ../src/layout_util.c:1779
-msgid "_Select"
-msgstr ""
-
-#: ../src/layout_util.c:1780 ../src/menu.c:380
-msgid "_Orientation"
-msgstr ""
-
-#: ../src/layout_util.c:1781
-msgid "_Rating"
-msgstr ""
-
-#: ../src/layout_util.c:1782
-msgid "P_references"
-msgstr ""
-
-#: ../src/layout_util.c:1784
-msgid "_Files and Folders"
-msgstr ""
-
-#: ../src/layout_util.c:1785
-msgid "_Zoom"
-msgstr ""
-
-#: ../src/layout_util.c:1786
-msgid "_Color Management"
-msgstr "_Colour Management"
-
-#: ../src/layout_util.c:1787
-msgid "_Connected Zoom"
-msgstr ""
-
-#: ../src/layout_util.c:1788
-msgid "Spli_t"
-msgstr ""
-
-#: ../src/layout_util.c:1789
-msgid "Stere_o"
-msgstr ""
-
-#: ../src/layout_util.c:1790 ../src/layout_util.c:1928
-msgid "Image _Overlay"
-msgstr ""
-
-#: ../src/layout_util.c:1791
-msgid "_Plugins"
-msgstr ""
-
-#: ../src/layout_util.c:1792
-msgid "_Help"
-msgstr ""
-
-#: ../src/layout_util.c:1794
-msgid "_First Image"
-msgstr ""
-
-#: ../src/layout_util.c:1794 ../src/toolbar.c:74
-msgid "First Image"
-msgstr ""
-
-#: ../src/layout_util.c:1795 ../src/layout_util.c:1796
-#: ../src/layout_util.c:1797
-msgid "_Previous Image"
-msgstr ""
-
-#: ../src/layout_util.c:1795 ../src/layout_util.c:1796
-#: ../src/layout_util.c:1797 ../src/toolbar.c:75
-msgid "Previous Image"
-msgstr ""
-
-#: ../src/layout_util.c:1798 ../src/layout_util.c:1799
-#: ../src/layout_util.c:1800
-msgid "_Next Image"
-msgstr ""
-
-#: ../src/layout_util.c:1798 ../src/layout_util.c:1799
-#: ../src/layout_util.c:1800 ../src/toolbar.c:76
-msgid "Next Image"
-msgstr ""
-
-#: ../src/layout_util.c:1801
-msgid "_Last Image"
-msgstr ""
-
-#: ../src/layout_util.c:1801 ../src/toolbar.c:77
-msgid "Last Image"
-msgstr ""
-
-#: ../src/layout_util.c:1802
-msgid "_Back"
-msgstr ""
-
-#: ../src/layout_util.c:1802 ../src/toolbar.c:78
-msgid "Back"
-msgstr ""
-
-#: ../src/layout_util.c:1803
-msgid "_Forward"
-msgstr ""
-
-#: ../src/layout_util.c:1803 ../src/toolbar.c:79
-msgid "Forward"
-msgstr ""
-
-#: ../src/layout_util.c:1804
-msgid "_Home"
-msgstr ""
-
-#: ../src/layout_util.c:1804 ../src/options.c:203 ../src/toolbar.c:80
-#: ../src/ui_bookmark.c:567 ../src/ui_pathsel.c:1056
-msgid "Home"
-msgstr ""
-
-#: ../src/layout_util.c:1805
-msgid "_Up"
-msgstr ""
-
-#: ../src/layout_util.c:1805 ../src/toolbar.c:81
-msgid "Up"
-msgstr ""
-
-#: ../src/layout_util.c:1807 ../src/toolbar.c:82
-msgid "New _window"
-msgstr ""
-
-#: ../src/layout_util.c:1807
-msgid "New window"
-msgstr ""
-
-#: ../src/layout_util.c:1808
-msgid "_New collection"
-msgstr ""
-
-#: ../src/layout_util.c:1808 ../src/menu.c:439 ../src/toolbar.c:83
-msgid "New collection"
-msgstr ""
-
-#: ../src/layout_util.c:1809
-msgid "_Open collection..."
-msgstr ""
-
-#: ../src/layout_util.c:1809
-msgid "Open collection..."
-msgstr ""
-
-#: ../src/layout_util.c:1810
-msgid "Open recen_t"
-msgstr ""
-
-#: ../src/layout_util.c:1810
-msgid "Open recent"
-msgstr ""
-
-#: ../src/layout_util.c:1811
-msgid "_Search..."
-msgstr ""
-
-#: ../src/layout_util.c:1811
-msgid "Search..."
-msgstr ""
-
-#: ../src/layout_util.c:1812
-msgid "Find duplicates..."
-msgstr ""
-
-#: ../src/layout_util.c:1813
-msgid "Pa_n view"
-msgstr ""
-
-#: ../src/layout_util.c:1813 ../src/toolbar.c:87
-msgid "Pan view"
-msgstr ""
-
-#: ../src/layout_util.c:1814
-msgid "_Print..."
-msgstr ""
-
-#: ../src/layout_util.c:1815
-msgid "N_ew folder..."
-msgstr ""
-
-#: ../src/layout_util.c:1815
-msgid "New folder..."
-msgstr ""
-
-#: ../src/layout_util.c:1816
-msgid "Copy..."
-msgstr ""
-
-#: ../src/layout_util.c:1817
-msgid "Move..."
-msgstr ""
-
-#: ../src/layout_util.c:1818
-msgid "Rename..."
-msgstr ""
-
-#: ../src/layout_util.c:1819 ../src/layout_util.c:1820
-#: ../src/layout_util.c:1821
-msgid "Delete..."
-msgstr ""
-
-#: ../src/layout_util.c:1822 ../src/view_file/view_file.c:640
-msgid "Enable file _grouping"
-msgstr ""
-
-#: ../src/layout_util.c:1822
-msgid "Enable file grouping"
-msgstr ""
-
-#: ../src/layout_util.c:1823 ../src/view_file/view_file.c:642
-msgid "Disable file groupi_ng"
-msgstr ""
-
-#: ../src/layout_util.c:1823
-msgid "Disable file grouping"
-msgstr ""
-
-#: ../src/layout_util.c:1824
-msgid "_Copy path to clipboard"
-msgstr ""
-
-#: ../src/layout_util.c:1824
-msgid "Copy path to clipboard"
-msgstr ""
-
-#: ../src/layout_util.c:1825
-msgid "_Copy path unquoted to clipboard"
-msgstr ""
-
-#: ../src/layout_util.c:1825
-msgid "Copy path unquoted to clipboard"
-msgstr ""
-
-#: ../src/layout_util.c:1826
-msgid "Close window"
-msgstr ""
-
-#: ../src/layout_util.c:1827
-msgid "_Quit"
-msgstr ""
-
-#: ../src/layout_util.c:1827 ../src/toolbar.c:117
-msgid "Quit"
-msgstr ""
-
-#: ../src/layout_util.c:1828 ../src/menu.c:322
-msgid "_Rotate clockwise"
-msgstr ""
-
-#: ../src/layout_util.c:1828
-msgid "Rotate clockwise"
-msgstr ""
-
-#: ../src/layout_util.c:1829
-msgid "_Rating 0"
-msgstr ""
-
-#: ../src/layout_util.c:1829
-msgid "Rating 0"
-msgstr ""
-
-#: ../src/layout_util.c:1830
-msgid "_Rating 1"
-msgstr ""
-
-#: ../src/layout_util.c:1830
-msgid "Rating 1"
-msgstr ""
-
-#: ../src/layout_util.c:1831
-msgid "_Rating 2"
-msgstr ""
-
-#: ../src/layout_util.c:1831
-msgid "Rating 2"
-msgstr ""
-
-#: ../src/layout_util.c:1832
-msgid "_Rating 3"
-msgstr ""
-
-#: ../src/layout_util.c:1832
-msgid "Rating 3"
-msgstr ""
-
-#: ../src/layout_util.c:1833
-msgid "_Rating 4"
-msgstr ""
-
-#: ../src/layout_util.c:1833
-msgid "Rating 4"
-msgstr ""
-
-#: ../src/layout_util.c:1834
-msgid "_Rating 5"
-msgstr ""
-
-#: ../src/layout_util.c:1834
-msgid "Rating 5"
-msgstr ""
-
-#: ../src/layout_util.c:1835
-msgid "_Rating -1"
-msgstr ""
-
-#: ../src/layout_util.c:1835
-msgid "Rating -1"
-msgstr ""
-
-#: ../src/layout_util.c:1836 ../src/menu.c:325
-msgid "Rotate _counterclockwise"
-msgstr ""
-
-#: ../src/layout_util.c:1836
-msgid "Rotate counterclockwise"
-msgstr ""
-
-#: ../src/layout_util.c:1837
-msgid "Rotate 1_80"
-msgstr ""
-
-#: ../src/layout_util.c:1837
-msgid "Rotate 180"
-msgstr ""
-
-#: ../src/layout_util.c:1838 ../src/menu.c:331
-msgid "_Mirror"
-msgstr ""
-
-#: ../src/layout_util.c:1838
-msgid "Mirror"
-msgstr ""
-
-#: ../src/layout_util.c:1839 ../src/menu.c:334
-msgid "_Flip"
-msgstr ""
-
-#: ../src/layout_util.c:1839
-msgid "Flip"
-msgstr ""
-
-#: ../src/layout_util.c:1840 ../src/menu.c:337
-msgid "_Original state"
-msgstr ""
-
-#: ../src/layout_util.c:1840
-msgid "Original state"
-msgstr ""
-
-#: ../src/layout_util.c:1841
-msgid "Select _all"
-msgstr ""
-
-#: ../src/layout_util.c:1842
-msgid "Select _none"
-msgstr ""
-
-#: ../src/layout_util.c:1843
-msgid "_Invert Selection"
-msgstr ""
-
-#: ../src/layout_util.c:1843
-msgid "Invert Selection"
-msgstr ""
-
-#: ../src/layout_util.c:1844
-msgid "P_references..."
-msgstr ""
-
-#: ../src/layout_util.c:1844
-msgid "Preferences..."
-msgstr ""
-
-#: ../src/layout_util.c:1845
-msgid "Configure _Plugins..."
-msgstr ""
-
-#: ../src/layout_util.c:1845
-msgid "Configure Plugins..."
-msgstr ""
-
-#: ../src/layout_util.c:1846
-msgid "_Configure this window..."
-msgstr ""
-
-#: ../src/layout_util.c:1846
-msgid "Configure this window..."
-msgstr ""
-
-#: ../src/layout_util.c:1847
-msgid "_Cache maintenance..."
-msgstr ""
-
-#: ../src/layout_util.c:1847
-msgid "Cache maintenance..."
-msgstr ""
-
-#: ../src/layout_util.c:1848
-msgid "Set as wallpaper"
-msgstr ""
-
-#: ../src/layout_util.c:1849
-msgid "_Save metadata"
-msgstr ""
-
-#: ../src/layout_util.c:1849
-msgid "Save metadata"
-msgstr ""
-
-#: ../src/layout_util.c:1850 ../src/layout_util.c:1851 ../src/toolbar.c:92
-msgid "Zoom in"
-msgstr ""
-
-#: ../src/layout_util.c:1852 ../src/layout_util.c:1853 ../src/toolbar.c:93
-msgid "Zoom out"
-msgstr ""
-
-#: ../src/layout_util.c:1854 ../src/layout_util.c:1855 ../src/toolbar.c:94
-msgid "Zoom 1:1"
-msgstr ""
-
-#: ../src/layout_util.c:1856 ../src/layout_util.c:1857
-#: ../src/layout_util.c:1872 ../src/layout_util.c:1873
-msgid "_Zoom to fit"
-msgstr ""
-
-#: ../src/layout_util.c:1856 ../src/layout_util.c:1857 ../src/toolbar.c:95
-msgid "Zoom to fit"
-msgstr ""
-
-#: ../src/layout_util.c:1858 ../src/layout_util.c:1874
-msgid "Fit _Horizontally"
-msgstr ""
-
#: ../src/layout_util.c:1858
-msgid "Fit Horizontally"
-msgstr ""
-
-#: ../src/layout_util.c:1859 ../src/layout_util.c:1875
-msgid "Fit _Vertically"
+msgid "_Go"
msgstr ""
#: ../src/layout_util.c:1859
-msgid "Fit Vertically"
-msgstr ""
-
-#: ../src/layout_util.c:1860 ../src/layout_util.c:1876
-msgid "Zoom _2:1"
-msgstr ""
-
-#: ../src/layout_util.c:1860 ../src/toolbar.c:98
-msgid "Zoom 2:1"
-msgstr ""
-
-#: ../src/layout_util.c:1861 ../src/layout_util.c:1877
-msgid "Zoom _3:1"
-msgstr ""
-
-#: ../src/layout_util.c:1861 ../src/toolbar.c:99
-msgid "Zoom 3:1"
-msgstr ""
-
-#: ../src/layout_util.c:1862 ../src/layout_util.c:1878
-msgid "Zoom _4:1"
-msgstr ""
-
-#: ../src/layout_util.c:1862 ../src/toolbar.c:100
-msgid "Zoom 4:1"
-msgstr ""
-
-#: ../src/layout_util.c:1863 ../src/layout_util.c:1879 ../src/toolbar.c:101
-msgid "Zoom 1:2"
-msgstr ""
-
-#: ../src/layout_util.c:1864 ../src/layout_util.c:1880
-msgid "Zoom 1:3"
-msgstr ""
-
-#: ../src/layout_util.c:1865 ../src/layout_util.c:1881 ../src/toolbar.c:103
-msgid "Zoom 1:4"
-msgstr ""
-
-#: ../src/layout_util.c:1866 ../src/layout_util.c:1867 ../src/toolbar.c:104
-msgid "Connected Zoom in"
-msgstr ""
-
-#: ../src/layout_util.c:1868 ../src/layout_util.c:1869
-msgid "Connected Zoom out"
-msgstr ""
-
-#: ../src/layout_util.c:1870 ../src/layout_util.c:1871
-msgid "Connected Zoom 1:1"
-msgstr ""
-
-#: ../src/layout_util.c:1872 ../src/layout_util.c:1873
-msgid "Connected Zoom to fit"
-msgstr ""
-
-#: ../src/layout_util.c:1874
-msgid "Connected Fit Horizontally"
+msgid "_Edit"
+msgstr ""
+
+#: ../src/layout_util.c:1860
+msgid "_Select"
+msgstr ""
+
+#: ../src/layout_util.c:1861 ../src/menu.c:380
+msgid "_Orientation"
+msgstr ""
+
+#: ../src/layout_util.c:1862
+msgid "_Rating"
+msgstr ""
+
+#: ../src/layout_util.c:1863
+msgid "P_references"
+msgstr ""
+
+#: ../src/layout_util.c:1865
+msgid "_Files and Folders"
+msgstr ""
+
+#: ../src/layout_util.c:1866
+msgid "_Zoom"
+msgstr ""
+
+#: ../src/layout_util.c:1867
+msgid "_Color Management"
+msgstr "_Colour Management"
+
+#: ../src/layout_util.c:1868
+msgid "_Connected Zoom"
+msgstr ""
+
+#: ../src/layout_util.c:1869
+msgid "Spli_t"
+msgstr ""
+
+#: ../src/layout_util.c:1870
+msgid "Stere_o"
+msgstr ""
+
+#: ../src/layout_util.c:1871 ../src/layout_util.c:2012
+msgid "Image _Overlay"
+msgstr ""
+
+#: ../src/layout_util.c:1872
+msgid "_Plugins"
+msgstr ""
+
+#: ../src/layout_util.c:1873
+msgid "_Help"
msgstr ""
#: ../src/layout_util.c:1875
-msgid "Connected Fit Vertically"
-msgstr ""
-
-#: ../src/layout_util.c:1876
-msgid "Connected Zoom 2:1"
-msgstr ""
-
-#: ../src/layout_util.c:1877
-msgid "Connected Zoom 3:1"
-msgstr ""
-
+msgid "_First Image"
+msgstr ""
+
+#: ../src/layout_util.c:1875 ../src/toolbar.c:74
+msgid "First Image"
+msgstr ""
+
+#: ../src/layout_util.c:1876 ../src/layout_util.c:1877
#: ../src/layout_util.c:1878
-msgid "Connected Zoom 4:1"
-msgstr ""
-
-#: ../src/layout_util.c:1879
-msgid "Connected Zoom 1:2"
-msgstr ""
-
-#: ../src/layout_util.c:1880
-msgid "Connected Zoom 1:3"
-msgstr ""
-
+msgid "_Previous Image"
+msgstr ""
+
+#: ../src/layout_util.c:1876 ../src/layout_util.c:1877
+#: ../src/layout_util.c:1878 ../src/toolbar.c:75
+msgid "Previous Image"
+msgstr ""
+
+#: ../src/layout_util.c:1879 ../src/layout_util.c:1880
#: ../src/layout_util.c:1881
-msgid "Connected Zoom 1:4"
+msgid "_Next Image"
+msgstr ""
+
+#: ../src/layout_util.c:1879 ../src/layout_util.c:1880
+#: ../src/layout_util.c:1881 ../src/toolbar.c:76
+msgid "Next Image"
msgstr ""
#: ../src/layout_util.c:1882
-msgid "_View in new window"
-msgstr ""
-
-#: ../src/layout_util.c:1882
-msgid "View in new window"
-msgstr ""
-
-#: ../src/layout_util.c:1883 ../src/layout_util.c:1884
+msgid "_Last Image"
+msgstr ""
+
+#: ../src/layout_util.c:1882 ../src/toolbar.c:77
+msgid "Last Image"
+msgstr ""
+
+#: ../src/layout_util.c:1883
+msgid "_Back"
+msgstr ""
+
+#: ../src/layout_util.c:1883 ../src/toolbar.c:78
+msgid "Back"
+msgstr ""
+
+#: ../src/layout_util.c:1884
+msgid "_Forward"
+msgstr ""
+
+#: ../src/layout_util.c:1884 ../src/toolbar.c:79
+msgid "Forward"
+msgstr ""
+
#: ../src/layout_util.c:1885
-msgid "F_ull screen"
-msgstr ""
-
-#: ../src/layout_util.c:1886 ../src/layout_util.c:1887
-msgid "_Leave full screen"
-msgstr ""
-
-#: ../src/layout_util.c:1886 ../src/layout_util.c:1887
-msgid "Leave full screen"
+msgid "_Home"
+msgstr ""
+
+#: ../src/layout_util.c:1885 ../src/options.c:217 ../src/toolbar.c:80
+#: ../src/ui_bookmark.c:578 ../src/ui_pathsel.c:1056
+msgid "Home"
+msgstr ""
+
+#: ../src/layout_util.c:1886
+msgid "_Up"
+msgstr ""
+
+#: ../src/layout_util.c:1886 ../src/toolbar.c:81
+msgid "Up"
+msgstr ""
+
+#: ../src/layout_util.c:1888 ../src/toolbar.c:82
+msgid "New _window"
msgstr ""
#: ../src/layout_util.c:1888
-msgid "_Cycle through overlay modes"
-msgstr ""
-
-#: ../src/layout_util.c:1888
-msgid "Cycle through Overlay modes"
-msgstr ""
-
-#: ../src/layout_util.c:1889
-msgid "Cycle through histogram ch_annels"
+msgid "New window"
msgstr ""
#: ../src/layout_util.c:1889
-msgid "Cycle through histogram channels"
+msgid "_New collection"
+msgstr ""
+
+#: ../src/layout_util.c:1889 ../src/menu.c:439 ../src/toolbar.c:83
+msgid "New collection"
msgstr ""
#: ../src/layout_util.c:1890
-msgid "Cycle through histogram mo_des"
+msgid "_Open collection..."
msgstr ""
#: ../src/layout_util.c:1890
-msgid "Cycle through histogram modes"
+msgid "Open collection..."
+msgstr ""
+
+#: ../src/layout_util.c:1891
+msgid "Open recen_t"
msgstr ""
#: ../src/layout_util.c:1891
-msgid "_Hide file list"
-msgstr ""
-
-#: ../src/layout_util.c:1891 ../src/toolbar.c:105
-msgid "Hide file list"
+msgid "Open recent"
+msgstr ""
+
+#: ../src/layout_util.c:1892
+msgid "_Search..."
msgstr ""
#: ../src/layout_util.c:1892
-msgid "_Pause slideshow"
-msgstr ""
-
-#: ../src/layout_util.c:1892 ../src/toolbar.c:106
-msgid "Pause slideshow"
+msgid "Search..."
msgstr ""
#: ../src/layout_util.c:1893
-msgid "Faster"
+msgid "Find duplicates..."
msgstr ""
#: ../src/layout_util.c:1894
-msgid "Slower"
+msgid "Pa_n view"
+msgstr ""
+
+#: ../src/layout_util.c:1894 ../src/toolbar.c:93
+msgid "Pan view"
msgstr ""
#: ../src/layout_util.c:1895
-msgid "_Refresh"
-msgstr ""
-
-#: ../src/layout_util.c:1895 ../src/toolbar.c:109
-msgid "Refresh"
+msgid "_Print..."
msgstr ""
#: ../src/layout_util.c:1896
-msgid "_Contents"
+msgid "N_ew folder..."
msgstr ""
#: ../src/layout_util.c:1896
-msgid "Contents"
-msgstr ""
-
-#: ../src/layout_util.c:1897 ../src/window.c:371
-msgid "On-line help search"
+msgid "New folder..."
+msgstr ""
+
+#: ../src/layout_util.c:1897
+msgid "Copy..."
msgstr ""
#: ../src/layout_util.c:1898
-msgid "_Keyboard shortcuts"
-msgstr ""
-
-#: ../src/layout_util.c:1898
-msgid "Keyboard shortcuts"
-msgstr ""
-
-#: ../src/layout_util.c:1899
-msgid "_Keyboard map"
+msgid "Move..."
msgstr ""
#: ../src/layout_util.c:1899
-msgid "Keyboard map"
-msgstr ""
-
-#: ../src/layout_util.c:1900
-msgid "_Release notes"
-msgstr ""
-
-#: ../src/layout_util.c:1900
-msgid "Release notes"
-msgstr ""
-
-#: ../src/layout_util.c:1901
-msgid "_ChangeLog"
-msgstr ""
-
-#: ../src/layout_util.c:1901
-msgid "ChangeLog notes"
-msgstr ""
-
-#: ../src/layout_util.c:1902
-msgid "_About"
-msgstr ""
-
-#: ../src/layout_util.c:1902
-msgid "About"
+msgid "Rename..."
msgstr ""
#: ../src/layout_util.c:1903
-msgid "_Log Window"
-msgstr ""
-
-#: ../src/layout_util.c:1903
-msgid "Log Window"
+msgid "Delete..."
+msgstr ""
+
+#: ../src/layout_util.c:1904 ../src/view_file/view_file.c:648
+msgid "Enable file _grouping"
msgstr ""
#: ../src/layout_util.c:1904
-msgid "_Exif window"
-msgstr ""
-
-#: ../src/layout_util.c:1904 ../src/toolbar.c:111
-msgid "Exif window"
+msgid "Enable file grouping"
+msgstr ""
+
+#: ../src/layout_util.c:1905 ../src/view_file/view_file.c:650
+msgid "Disable file groupi_ng"
msgstr ""
#: ../src/layout_util.c:1905
-msgid "_Cycle through stereo modes"
-msgstr ""
-
-#: ../src/layout_util.c:1905
-msgid "Cycle through stereo modes"
+msgid "Disable file grouping"
msgstr ""
#: ../src/layout_util.c:1906
-msgid "_Next Pane"
+msgid "_Copy path to clipboard"
msgstr ""
#: ../src/layout_util.c:1906
-msgid "Next Pane"
-msgstr ""
-
-#: ../src/layout_util.c:1907
-msgid "_Previous Pane"
+msgid "Copy path to clipboard"
msgstr ""
#: ../src/layout_util.c:1907
-msgid "Previous Pane"
+msgid "_Copy path unquoted to clipboard"
+msgstr ""
+
+#: ../src/layout_util.c:1907
+msgid "Copy path unquoted to clipboard"
msgstr ""
#: ../src/layout_util.c:1908
-msgid "_Up Pane"
-msgstr ""
-
-#: ../src/layout_util.c:1908
-msgid "Up Pane"
+msgid "Close window"
msgstr ""
#: ../src/layout_util.c:1909
-msgid "_Down Pane"
-msgstr ""
-
-#: ../src/layout_util.c:1909
-msgid "Down Pane"
-msgstr ""
-
-#: ../src/layout_util.c:1910
-msgid "_Write orientation to file"
-msgstr ""
-
-#: ../src/layout_util.c:1910
-msgid "Write orientation to file"
+msgid "_Quit"
+msgstr ""
+
+#: ../src/layout_util.c:1909 ../src/toolbar.c:136
+msgid "Quit"
+msgstr ""
+
+#: ../src/layout_util.c:1910 ../src/menu.c:322
+msgid "_Rotate clockwise"
+msgstr ""
+
+#: ../src/layout_util.c:1910 ../src/toolbar.c:103
+msgid "Rotate clockwise"
+msgstr ""
+
+#: ../src/layout_util.c:1911
+msgid "_Rating 0"
msgstr ""
#: ../src/layout_util.c:1911
-msgid "_Write orientation to file (preserve timestamp)"
-msgstr ""
-
-#: ../src/layout_util.c:1911
-msgid "Write orientation to file (preserve timestamp)"
+msgid "Rating 0"
+msgstr ""
+
+#: ../src/layout_util.c:1912
+msgid "_Rating 1"
msgstr ""
#: ../src/layout_util.c:1912
-msgid "Clear Marks..."
+msgid "Rating 1"
+msgstr ""
+
+#: ../src/layout_util.c:1913
+msgid "_Rating 2"
+msgstr ""
+
+#: ../src/layout_util.c:1913
+msgid "Rating 2"
+msgstr ""
+
+#: ../src/layout_util.c:1914
+msgid "_Rating 3"
+msgstr ""
+
+#: ../src/layout_util.c:1914
+msgid "Rating 3"
+msgstr ""
+
+#: ../src/layout_util.c:1915
+msgid "_Rating 4"
+msgstr ""
+
+#: ../src/layout_util.c:1915
+msgid "Rating 4"
msgstr ""
#: ../src/layout_util.c:1916
-msgid "Show _Thumbnails"
+msgid "_Rating 5"
msgstr ""
#: ../src/layout_util.c:1916
-msgid "Show Thumbnails"
-msgstr ""
-
-#: ../src/layout_util.c:1917
-msgid "Show _Marks"
+msgid "Rating 5"
msgstr ""
#: ../src/layout_util.c:1917
-msgid "Show Marks"
-msgstr ""
-
-#: ../src/layout_util.c:1918
-msgid "Pi_xel Info"
-msgstr ""
-
-#: ../src/layout_util.c:1918
-msgid "Show Pixel Info"
+msgid "_Rating -1"
+msgstr ""
+
+#: ../src/layout_util.c:1917
+msgid "Rating -1"
+msgstr ""
+
+#: ../src/layout_util.c:1918 ../src/menu.c:325
+msgid "Rotate _counterclockwise"
+msgstr ""
+
+#: ../src/layout_util.c:1918 ../src/toolbar.c:104
+msgid "Rotate counterclockwise"
msgstr ""
#: ../src/layout_util.c:1919
-msgid "_Float file list"
-msgstr ""
-
-#: ../src/layout_util.c:1919 ../src/toolbar.c:114
-msgid "Float file list"
-msgstr ""
-
-#: ../src/layout_util.c:1920
-msgid "Hide tool_bar"
-msgstr ""
-
-#: ../src/layout_util.c:1920
-msgid "Hide toolbar"
-msgstr ""
-
-#: ../src/layout_util.c:1921
-msgid "_Info sidebar"
-msgstr ""
-
-#: ../src/layout_util.c:1921 ../src/toolbar.c:115
-msgid "Info sidebar"
-msgstr ""
-
-#: ../src/layout_util.c:1922
-msgid "Sort _manager"
-msgstr ""
-
-#: ../src/layout_util.c:1922 ../src/toolbar.c:116
-msgid "Sort manager"
+msgid "Rotate 1_80"
+msgstr ""
+
+#: ../src/layout_util.c:1919 ../src/toolbar.c:105
+msgid "Rotate 180"
+msgstr ""
+
+#: ../src/layout_util.c:1920 ../src/menu.c:331
+msgid "_Mirror"
+msgstr ""
+
+#: ../src/layout_util.c:1920 ../src/toolbar.c:106
+msgid "Mirror"
+msgstr ""
+
+#: ../src/layout_util.c:1921 ../src/menu.c:334
+msgid "_Flip"
+msgstr ""
+
+#: ../src/layout_util.c:1921 ../src/toolbar.c:107
+msgid "Flip"
+msgstr ""
+
+#: ../src/layout_util.c:1922 ../src/menu.c:337
+msgid "_Original state"
+msgstr ""
+
+#: ../src/layout_util.c:1922 ../src/toolbar.c:108
+msgid "Original state"
msgstr ""
#: ../src/layout_util.c:1923
-msgid "Hide Bars"
+msgid "Select _all"
msgstr ""
#: ../src/layout_util.c:1924
-msgid "Toggle _slideshow"
-msgstr ""
-
-#: ../src/layout_util.c:1924
-msgid "Toggle slideshow"
+msgid "Select _none"
+msgstr ""
+
+#: ../src/layout_util.c:1925
+msgid "_Invert Selection"
msgstr ""
#: ../src/layout_util.c:1925
-msgid "Use _color profiles"
-msgstr "Use _colour profiles"
-
-#: ../src/layout_util.c:1925
-msgid "Use color profiles"
-msgstr "Use colour profiles"
+msgid "Invert Selection"
+msgstr ""
#: ../src/layout_util.c:1926
-msgid "Use profile from _image"
+msgid "P_references..."
msgstr ""
#: ../src/layout_util.c:1926
-msgid "Use profile from image"
+msgid "Preferences..."
msgstr ""
#: ../src/layout_util.c:1927
-msgid "Toggle _grayscale"
+msgid "Configure _Plugins..."
msgstr ""
#: ../src/layout_util.c:1927
-msgid "Toggle grayscale"
+msgid "Configure Plugins..."
+msgstr ""
+
+#: ../src/layout_util.c:1928
+msgid "_Configure this window..."
msgstr ""
#: ../src/layout_util.c:1928
-msgid "Image Overlay"
+msgid "Configure this window..."
msgstr ""
#: ../src/layout_util.c:1929
-msgid "_Show Histogram"
+msgid "_Cache maintenance..."
msgstr ""
#: ../src/layout_util.c:1929
-msgid "Show Histogram"
+msgid "Cache maintenance..."
msgstr ""
#: ../src/layout_util.c:1930
-msgid "Rectangular Selection"
+msgid "Set as wallpaper"
msgstr ""
#: ../src/layout_util.c:1931
-msgid "GIF _animation"
+msgid "_Save metadata"
msgstr ""
#: ../src/layout_util.c:1931
-msgid "Toggle GIF animation"
+msgid "Save metadata"
msgstr ""
#: ../src/layout_util.c:1932
-msgid "_Exif rotate"
+msgid "Keyword autocomplete"
msgstr ""
#: ../src/layout_util.c:1932
-msgid "Exif rotate"
-msgstr ""
-
-#: ../src/layout_util.c:1936
-msgid "Image _List"
-msgstr ""
-
-#: ../src/layout_util.c:1936
-msgid "View Images as List"
-msgstr ""
-
-#: ../src/layout_util.c:1937
-msgid "I_cons"
-msgstr ""
-
-#: ../src/layout_util.c:1937
-msgid "View Images as Icons"
-msgstr ""
-
-#: ../src/layout_util.c:1941
-msgid "T_oggle Folder View"
+msgid "Keyword Autocomplete"
+msgstr ""
+
+#: ../src/layout_util.c:1933 ../src/layout_util.c:1934 ../src/toolbar.c:109
+msgid "Zoom in"
+msgstr ""
+
+#: ../src/layout_util.c:1935 ../src/layout_util.c:1936 ../src/toolbar.c:110
+msgid "Zoom out"
+msgstr ""
+
+#: ../src/layout_util.c:1937 ../src/layout_util.c:1938 ../src/toolbar.c:111
+msgid "Zoom 1:1"
+msgstr ""
+
+#: ../src/layout_util.c:1939 ../src/layout_util.c:1940
+#: ../src/layout_util.c:1955 ../src/layout_util.c:1956
+msgid "_Zoom to fit"
+msgstr ""
+
+#: ../src/layout_util.c:1939 ../src/layout_util.c:1940 ../src/toolbar.c:112
+msgid "Zoom to fit"
+msgstr ""
+
+#: ../src/layout_util.c:1941 ../src/layout_util.c:1957
+msgid "Fit _Horizontally"
msgstr ""
#: ../src/layout_util.c:1941
-msgid "Toggle Folders View"
-msgstr ""
-
-#: ../src/layout_util.c:1945
-msgid "_Horizontal"
-msgstr ""
-
-#: ../src/layout_util.c:1945
-msgid "Split Horizontal"
-msgstr ""
-
-#: ../src/layout_util.c:1946
-msgid "_Vertical"
-msgstr ""
-
-#: ../src/layout_util.c:1946
-msgid "Split Vertical"
-msgstr ""
-
-#: ../src/layout_util.c:1947
-msgid "_Quad"
-msgstr ""
-
-#: ../src/layout_util.c:1947
-msgid "Split Quad"
-msgstr ""
-
-#: ../src/layout_util.c:1948
-msgid "_Single"
-msgstr ""
-
-#: ../src/layout_util.c:1948
-msgid "Split Single"
-msgstr ""
-
-#: ../src/layout_util.c:1952
-msgid "Input _0: sRGB"
-msgstr ""
-
-#: ../src/layout_util.c:1952
-msgid "Input 0: sRGB"
-msgstr ""
-
-#: ../src/layout_util.c:1953
-msgid "Input _1: AdobeRGB compatible"
-msgstr ""
-
-#: ../src/layout_util.c:1953
-msgid "Input 1: AdobeRGB compatible"
-msgstr ""
-
-#: ../src/layout_util.c:1954
-msgid "Input _2"
-msgstr ""
-
-#: ../src/layout_util.c:1954
-msgid "Input 2"
-msgstr ""
-
-#: ../src/layout_util.c:1955
-msgid "Input _3"
-msgstr ""
-
-#: ../src/layout_util.c:1955
-msgid "Input 3"
-msgstr ""
-
-#: ../src/layout_util.c:1956
-msgid "Input _4"
-msgstr ""
-
-#: ../src/layout_util.c:1956
-msgid "Input 4"
+msgid "Fit Horizontally"
+msgstr ""
+
+#: ../src/layout_util.c:1942 ../src/layout_util.c:1958
+msgid "Fit _Vertically"
+msgstr ""
+
+#: ../src/layout_util.c:1942
+msgid "Fit Vertically"
+msgstr ""
+
+#: ../src/layout_util.c:1943 ../src/layout_util.c:1959
+msgid "Zoom _2:1"
+msgstr ""
+
+#: ../src/layout_util.c:1943 ../src/toolbar.c:115
+msgid "Zoom 2:1"
+msgstr ""
+
+#: ../src/layout_util.c:1944 ../src/layout_util.c:1960
+msgid "Zoom _3:1"
+msgstr ""
+
+#: ../src/layout_util.c:1944 ../src/toolbar.c:116
+msgid "Zoom 3:1"
+msgstr ""
+
+#: ../src/layout_util.c:1945 ../src/layout_util.c:1961
+msgid "Zoom _4:1"
+msgstr ""
+
+#: ../src/layout_util.c:1945 ../src/toolbar.c:117
+msgid "Zoom 4:1"
+msgstr ""
+
+#: ../src/layout_util.c:1946 ../src/layout_util.c:1962 ../src/toolbar.c:118
+msgid "Zoom 1:2"
+msgstr ""
+
+#: ../src/layout_util.c:1947 ../src/layout_util.c:1963
+msgid "Zoom 1:3"
+msgstr ""
+
+#: ../src/layout_util.c:1948 ../src/layout_util.c:1964 ../src/toolbar.c:120
+msgid "Zoom 1:4"
+msgstr ""
+
+#: ../src/layout_util.c:1949 ../src/layout_util.c:1950 ../src/toolbar.c:121
+msgid "Connected Zoom in"
+msgstr ""
+
+#: ../src/layout_util.c:1951 ../src/layout_util.c:1952
+msgid "Connected Zoom out"
+msgstr ""
+
+#: ../src/layout_util.c:1953 ../src/layout_util.c:1954
+msgid "Connected Zoom 1:1"
+msgstr ""
+
+#: ../src/layout_util.c:1955 ../src/layout_util.c:1956
+msgid "Connected Zoom to fit"
msgstr ""
#: ../src/layout_util.c:1957
-msgid "Input _5"
-msgstr ""
-
-#: ../src/layout_util.c:1957
-msgid "Input 5"
+msgid "Connected Fit Horizontally"
+msgstr ""
+
+#: ../src/layout_util.c:1958
+msgid "Connected Fit Vertically"
+msgstr ""
+
+#: ../src/layout_util.c:1959
+msgid "Connected Zoom 2:1"
+msgstr ""
+
+#: ../src/layout_util.c:1960
+msgid "Connected Zoom 3:1"
msgstr ""
#: ../src/layout_util.c:1961
-msgid "Histogram on Red"
+msgid "Connected Zoom 4:1"
msgstr ""
#: ../src/layout_util.c:1962
-msgid "Histogram on Green"
+msgid "Connected Zoom 1:2"
msgstr ""
#: ../src/layout_util.c:1963
-msgid "Histogram on Blue"
+msgid "Connected Zoom 1:3"
msgstr ""
#: ../src/layout_util.c:1964
-msgid "Histogram on RGB"
+msgid "Connected Zoom 1:4"
+msgstr ""
+
+#: ../src/layout_util.c:1965
+msgid "_View in new window"
msgstr ""
#: ../src/layout_util.c:1965
-msgid "Histogram on Value"
-msgstr ""
-
-#: ../src/layout_util.c:1969
-msgid "Linear Histogram"
-msgstr ""
-
-#: ../src/layout_util.c:1970
-msgid "_Log Histogram"
-msgstr ""
-
-#: ../src/layout_util.c:1970
-msgid "Log Histogram"
+msgid "View in new window"
+msgstr ""
+
+#: ../src/layout_util.c:1966 ../src/layout_util.c:1967
+#: ../src/layout_util.c:1968
+msgid "F_ull screen"
+msgstr ""
+
+#: ../src/layout_util.c:1969 ../src/layout_util.c:1970
+msgid "_Leave full screen"
+msgstr ""
+
+#: ../src/layout_util.c:1969 ../src/layout_util.c:1970
+msgid "Leave full screen"
+msgstr ""
+
+#: ../src/layout_util.c:1971
+msgid "_Cycle through overlay modes"
+msgstr ""
+
+#: ../src/layout_util.c:1971
+msgid "Cycle through Overlay modes"
+msgstr ""
+
+#: ../src/layout_util.c:1972
+msgid "Cycle through histogram ch_annels"
+msgstr ""
+
+#: ../src/layout_util.c:1972
+msgid "Cycle through histogram channels"
+msgstr ""
+
+#: ../src/layout_util.c:1973
+msgid "Cycle through histogram mo_des"
+msgstr ""
+
+#: ../src/layout_util.c:1973
+msgid "Cycle through histogram modes"
msgstr ""
#: ../src/layout_util.c:1974
-msgid "_Auto"
-msgstr ""
-
-#: ../src/layout_util.c:1974
-msgid "Stereo Auto"
-msgstr ""
-
-#: ../src/layout_util.c:1975
-msgid "_Side by Side"
+msgid "_Hide file list"
+msgstr ""
+
+#: ../src/layout_util.c:1974 ../src/toolbar.c:122
+msgid "Hide file list"
msgstr ""
#: ../src/layout_util.c:1975
-msgid "Stereo Side by Side"
+msgid "_Pause slideshow"
+msgstr ""
+
+#: ../src/layout_util.c:1975 ../src/toolbar.c:123
+msgid "Pause slideshow"
msgstr ""
#: ../src/layout_util.c:1976
-msgid "_Cross"
-msgstr ""
-
-#: ../src/layout_util.c:1976
-msgid "Stereo Cross"
-msgstr ""
-
-#: ../src/layout_util.c:1977
-msgid "_Off"
+msgid "Faster"
msgstr ""
#: ../src/layout_util.c:1977
+msgid "Slower"
+msgstr ""
+
+#: ../src/layout_util.c:1978
+msgid "_Refresh"
+msgstr ""
+
+#: ../src/layout_util.c:1978 ../src/toolbar.c:126
+msgid "Refresh"
+msgstr ""
+
+#: ../src/layout_util.c:1979
+msgid "_Contents"
+msgstr ""
+
+#: ../src/layout_util.c:1979
+msgid "Contents"
+msgstr ""
+
+#: ../src/layout_util.c:1980 ../src/window.c:371
+msgid "On-line help search"
+msgstr ""
+
+#: ../src/layout_util.c:1981
+msgid "_Keyboard shortcuts"
+msgstr ""
+
+#: ../src/layout_util.c:1981
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: ../src/layout_util.c:1982
+msgid "_Keyboard map"
+msgstr ""
+
+#: ../src/layout_util.c:1982
+msgid "Keyboard map"
+msgstr ""
+
+#: ../src/layout_util.c:1983
+msgid "_Release notes"
+msgstr ""
+
+#: ../src/layout_util.c:1983
+msgid "Release notes"
+msgstr ""
+
+#: ../src/layout_util.c:1984
+msgid "_ChangeLog"
+msgstr ""
+
+#: ../src/layout_util.c:1984
+msgid "ChangeLog notes"
+msgstr ""
+
+#: ../src/layout_util.c:1985
+msgid "_About"
+msgstr ""
+
+#: ../src/layout_util.c:1985
+msgid "About"
+msgstr ""
+
+#: ../src/layout_util.c:1986
+msgid "_Log Window"
+msgstr ""
+
+#: ../src/layout_util.c:1986
+msgid "Log Window"
+msgstr ""
+
+#: ../src/layout_util.c:1987
+msgid "_Exif window"
+msgstr ""
+
+#: ../src/layout_util.c:1987 ../src/toolbar.c:128
+msgid "Exif window"
+msgstr ""
+
+#: ../src/layout_util.c:1988
+msgid "_Cycle through stereo modes"
+msgstr ""
+
+#: ../src/layout_util.c:1988
+msgid "Cycle through stereo modes"
+msgstr ""
+
+#: ../src/layout_util.c:1989
+msgid "_Next Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1989
+msgid "Next Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1990
+msgid "_Previous Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1990
+msgid "Previous Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1991
+msgid "_Up Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1991
+msgid "Up Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1992
+msgid "_Down Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1992
+msgid "Down Pane"
+msgstr ""
+
+#: ../src/layout_util.c:1993
+msgid "_Write orientation to file"
+msgstr ""
+
+#: ../src/layout_util.c:1993
+msgid "Write orientation to file"
+msgstr ""
+
+#: ../src/layout_util.c:1994
+msgid "_Write orientation to file (preserve timestamp)"
+msgstr ""
+
+#: ../src/layout_util.c:1994
+msgid "Write orientation to file (preserve timestamp)"
+msgstr ""
+
+#: ../src/layout_util.c:1995
+msgid "Clear Marks..."
+msgstr ""
+
+#: ../src/layout_util.c:1999
+msgid "Show _Thumbnails"
+msgstr ""
+
+#: ../src/layout_util.c:1999
+msgid "Show Thumbnails"
+msgstr ""
+
+#: ../src/layout_util.c:2000
+msgid "Show _Marks"
+msgstr ""
+
+#: ../src/layout_util.c:2000
+msgid "Show Marks"
+msgstr ""
+
+#: ../src/layout_util.c:2001
+msgid "Show File Filter"
+msgstr ""
+
+#: ../src/layout_util.c:2002
+msgid "Pi_xel Info"
+msgstr ""
+
+#: ../src/layout_util.c:2002
+msgid "Show Pixel Info"
+msgstr ""
+
+#: ../src/layout_util.c:2003
+msgid "_Float file list"
+msgstr ""
+
+#: ../src/layout_util.c:2003 ../src/toolbar.c:133
+msgid "Float file list"
+msgstr ""
+
+#: ../src/layout_util.c:2004
+msgid "Hide tool_bar"
+msgstr ""
+
+#: ../src/layout_util.c:2004
+msgid "Hide toolbar"
+msgstr ""
+
+#: ../src/layout_util.c:2005
+msgid "_Info sidebar"
+msgstr ""
+
+#: ../src/layout_util.c:2005 ../src/toolbar.c:134
+msgid "Info sidebar"
+msgstr ""
+
+#: ../src/layout_util.c:2006
+msgid "Sort _manager"
+msgstr ""
+
+#: ../src/layout_util.c:2006 ../src/toolbar.c:135
+msgid "Sort manager"
+msgstr ""
+
+#: ../src/layout_util.c:2007
+msgid "Hide Bars"
+msgstr ""
+
+#: ../src/layout_util.c:2008
+msgid "Toggle _slideshow"
+msgstr ""
+
+#: ../src/layout_util.c:2008
+msgid "Toggle slideshow"
+msgstr ""
+
+#: ../src/layout_util.c:2009
+msgid "Use _color profiles"
+msgstr "Use _colour profiles"
+
+#: ../src/layout_util.c:2009
+msgid "Use color profiles"
+msgstr "Use colour profiles"
+
+#: ../src/layout_util.c:2010
+msgid "Use profile from _image"
+msgstr ""
+
+#: ../src/layout_util.c:2010
+msgid "Use profile from image"
+msgstr ""
+
+#: ../src/layout_util.c:2011
+msgid "Toggle _grayscale"
+msgstr ""
+
+#: ../src/layout_util.c:2011
+msgid "Toggle grayscale"
+msgstr ""
+
+#: ../src/layout_util.c:2012
+msgid "Image Overlay"
+msgstr ""
+
+#: ../src/layout_util.c:2013
+msgid "_Show Histogram"
+msgstr ""
+
+#: ../src/layout_util.c:2013
+msgid "Show Histogram"
+msgstr ""
+
+#: ../src/layout_util.c:2014
+msgid "_Show Guidelines"
+msgstr ""
+
+#: ../src/layout_util.c:2014
+msgid "Show Guidelines"
+msgstr ""
+
+#: ../src/layout_util.c:2015
+msgid "Rectangular Selection"
+msgstr ""
+
+#: ../src/layout_util.c:2016
+msgid "GIF _animation"
+msgstr ""
+
+#: ../src/layout_util.c:2016
+msgid "Toggle GIF animation"
+msgstr ""
+
+#: ../src/layout_util.c:2017
+msgid "_Exif rotate"
+msgstr ""
+
+#: ../src/layout_util.c:2017
+msgid "Exif rotate"
+msgstr ""
+
+#: ../src/layout_util.c:2018 ../src/toolbar.c:132
+msgid "Draw Rectangle"
+msgstr ""
+
+#: ../src/layout_util.c:2022
+msgid "Image _List"
+msgstr ""
+
+#: ../src/layout_util.c:2022
+msgid "View Images as List"
+msgstr ""
+
+#: ../src/layout_util.c:2023
+msgid "I_cons"
+msgstr ""
+
+#: ../src/layout_util.c:2023
+msgid "View Images as Icons"
+msgstr ""
+
+#: ../src/layout_util.c:2027
+msgid "T_oggle Folder View"
+msgstr ""
+
+#: ../src/layout_util.c:2027
+msgid "Toggle Folders View"
+msgstr ""
+
+#: ../src/layout_util.c:2031
+msgid "_Horizontal"
+msgstr ""
+
+#: ../src/layout_util.c:2031
+msgid "Split Horizontal"
+msgstr ""
+
+#: ../src/layout_util.c:2032
+msgid "_Vertical"
+msgstr ""
+
+#: ../src/layout_util.c:2032
+msgid "Split Vertical"
+msgstr ""
+
+#: ../src/layout_util.c:2033
+msgid "_Quad"
+msgstr ""
+
+#: ../src/layout_util.c:2033
+msgid "Split Quad"
+msgstr ""
+
+#: ../src/layout_util.c:2034
+msgid "_Single"
+msgstr ""
+
+#: ../src/layout_util.c:2034
+msgid "Split Single"
+msgstr ""
+
+#: ../src/layout_util.c:2038
+msgid "Input _0: sRGB"
+msgstr ""
+
+#: ../src/layout_util.c:2038
+msgid "Input 0: sRGB"
+msgstr ""
+
+#: ../src/layout_util.c:2039
+msgid "Input _1: AdobeRGB compatible"
+msgstr ""
+
+#: ../src/layout_util.c:2039
+msgid "Input 1: AdobeRGB compatible"
+msgstr ""
+
+#: ../src/layout_util.c:2040
+msgid "Input _2"
+msgstr ""
+
+#: ../src/layout_util.c:2040
+msgid "Input 2"
+msgstr ""
+
+#: ../src/layout_util.c:2041
+msgid "Input _3"
+msgstr ""
+
+#: ../src/layout_util.c:2041
+msgid "Input 3"
+msgstr ""
+
+#: ../src/layout_util.c:2042
+msgid "Input _4"
+msgstr ""
+
+#: ../src/layout_util.c:2042
+msgid "Input 4"
+msgstr ""
+
+#: ../src/layout_util.c:2043
+msgid "Input _5"
+msgstr ""
+
+#: ../src/layout_util.c:2043
+msgid "Input 5"
+msgstr ""
+
+#: ../src/layout_util.c:2047
+msgid "Histogram on Red"
+msgstr ""
+
+#: ../src/layout_util.c:2048
+msgid "Histogram on Green"
+msgstr ""
+
+#: ../src/layout_util.c:2049
+msgid "Histogram on Blue"
+msgstr ""
+
+#: ../src/layout_util.c:2050
+msgid "Histogram on RGB"
+msgstr ""
+
+#: ../src/layout_util.c:2051
+msgid "Histogram on Value"
+msgstr ""
+
+#: ../src/layout_util.c:2055
+msgid "Linear Histogram"
+msgstr ""
+
+#: ../src/layout_util.c:2056
+msgid "_Log Histogram"
+msgstr ""
+
+#: ../src/layout_util.c:2056
+msgid "Log Histogram"
+msgstr ""
+
+#: ../src/layout_util.c:2060
+msgid "_Auto"
+msgstr ""
+
+#: ../src/layout_util.c:2060
+msgid "Stereo Auto"
+msgstr ""
+
+#: ../src/layout_util.c:2061
+msgid "_Side by Side"
+msgstr ""
+
+#: ../src/layout_util.c:2061
+msgid "Stereo Side by Side"
+msgstr ""
+
+#: ../src/layout_util.c:2062
+msgid "_Cross"
+msgstr ""
+
+#: ../src/layout_util.c:2062
+msgid "Stereo Cross"
+msgstr ""
+
+#: ../src/layout_util.c:2063
+msgid "_Off"
+msgstr ""
+
+#: ../src/layout_util.c:2063
msgid "Stereo Off"
msgstr ""
-#: ../src/layout_util.c:2290
+#: ../src/layout_util.c:2384
#, c-format
msgid "Mark _%d"
msgstr ""
-#: ../src/layout_util.c:2291 ../src/view_file/view_file.c:574
+#: ../src/layout_util.c:2385 ../src/view_file/view_file.c:575
#, c-format
msgid "_Set mark %d"
msgstr ""
-#: ../src/layout_util.c:2291
+#: ../src/layout_util.c:2385
#, c-format
msgid "Set mark %d"
msgstr ""
-#: ../src/layout_util.c:2292 ../src/view_file/view_file.c:575
+#: ../src/layout_util.c:2386 ../src/view_file/view_file.c:576
#, c-format
msgid "_Reset mark %d"
msgstr ""
-#: ../src/layout_util.c:2292
+#: ../src/layout_util.c:2386
#, c-format
msgid "Reset mark %d"
msgstr ""
-#: ../src/layout_util.c:2293 ../src/layout_util.c:2294
-#: ../src/view_file/view_file.c:576
+#: ../src/layout_util.c:2387 ../src/layout_util.c:2388
+#: ../src/view_file/view_file.c:577
#, c-format
msgid "_Toggle mark %d"
msgstr ""
-#: ../src/layout_util.c:2293 ../src/layout_util.c:2294
+#: ../src/layout_util.c:2387 ../src/layout_util.c:2388
#, c-format
msgid "Toggle mark %d"
msgstr ""
-#: ../src/layout_util.c:2295
+#: ../src/layout_util.c:2389
#, c-format
msgid "Se_lect mark %d"
msgstr ""
-#: ../src/layout_util.c:2295 ../src/layout_util.c:2296
+#: ../src/layout_util.c:2389 ../src/layout_util.c:2390
#, c-format
msgid "Select mark %d"
msgstr ""
-#: ../src/layout_util.c:2296 ../src/view_file/view_file.c:577
+#: ../src/layout_util.c:2390 ../src/view_file/view_file.c:578
#, c-format
msgid "_Select mark %d"
msgstr ""
-#: ../src/layout_util.c:2297 ../src/view_file/view_file.c:578
+#: ../src/layout_util.c:2391 ../src/view_file/view_file.c:579
#, c-format
msgid "_Add mark %d"
msgstr ""
-#: ../src/layout_util.c:2297
+#: ../src/layout_util.c:2391
#, c-format
msgid "Add mark %d"
msgstr ""
-#: ../src/layout_util.c:2298 ../src/view_file/view_file.c:579
+#: ../src/layout_util.c:2392 ../src/view_file/view_file.c:580
#, c-format
msgid "_Intersection with mark %d"
msgstr ""
-#: ../src/layout_util.c:2298
+#: ../src/layout_util.c:2392
#, c-format
msgid "Intersection with mark %d"
msgstr ""
-#: ../src/layout_util.c:2299 ../src/view_file/view_file.c:580
+#: ../src/layout_util.c:2393 ../src/view_file/view_file.c:581
#, c-format
msgid "_Unselect mark %d"
msgstr ""
-#: ../src/layout_util.c:2299
+#: ../src/layout_util.c:2393
#, c-format
msgid "Unselect mark %d"
msgstr ""
-#: ../src/layout_util.c:2300
+#: ../src/layout_util.c:2394
#, c-format
msgid "_Filter mark %d"
msgstr ""
-#: ../src/layout_util.c:2300
+#: ../src/layout_util.c:2394
#, c-format
msgid "Filter mark %d"
msgstr ""
-#: ../src/layout_util.c:2854
+#: ../src/layout_util.c:2966
#, c-format
msgid "Number of files with unsaved metadata: %d"
msgstr ""
-#: ../src/layout_util.c:2860
+#: ../src/layout_util.c:2972
msgid "No unsaved metadata"
msgstr ""
-#: ../src/layout_util.c:2907
+#: ../src/layout_util.c:3019
#, c-format
msgid ""
"Image profile: %s\n"
"Screen profile: %s"
msgstr ""
-#: ../src/layout_util.c:2915
+#: ../src/layout_util.c:3027
msgid "Click to enable color management"
msgstr "Click to enable colour management"
-#: ../src/layout_util.c:2920
+#: ../src/layout_util.c:3032
msgid "Color profiles not supported"
msgstr "Colour profiles not supported"
-#: ../src/layout_util.c:2942
+#: ../src/layout_util.c:3054
#, c-format
msgid "Input _%d: %s"
msgstr ""
@@ -3511,7 +3611,7 @@
msgid "Log"
msgstr ""
-#: ../src/logwindow.c:172 ../src/preferences.c:2636
+#: ../src/logwindow.c:172 ../src/preferences.c:3218
msgid "Debug level:"
msgstr ""
@@ -3642,7 +3742,7 @@
msgid "Collections have been modified. Quit anyway?"
msgstr ""
-#: ../src/main.c:973 ../src/remote.c:790
+#: ../src/main.c:973 ../src/remote.c:847
msgid "Command line"
msgstr ""
@@ -3694,7 +3794,7 @@
msgid "Zoom to original size"
msgstr ""
-#: ../src/menu.c:245 ../src/preferences.c:1936
+#: ../src/menu.c:245 ../src/preferences.c:1955
msgid "Fit image to window"
msgstr ""
@@ -3702,7 +3802,7 @@
msgid "Leave Zoom at previous setting"
msgstr ""
-#: ../src/menu.c:303 ../src/preferences.c:1917
+#: ../src/menu.c:303 ../src/preferences.c:1936 ../src/preferences.c:2066
msgid "Zoom"
msgstr ""
@@ -3798,7 +3898,7 @@
msgid "Sea"
msgstr ""
-#: ../src/metadata.c:1733 ../src/print.c:385
+#: ../src/metadata.c:1733
msgid "Landscape"
msgstr ""
@@ -3934,7 +4034,7 @@
msgid "Macro"
msgstr ""
-#: ../src/metadata.c:1769 ../src/print.c:384
+#: ../src/metadata.c:1769
msgid "Portrait"
msgstr ""
@@ -3946,12 +4046,12 @@
msgid "Perspective"
msgstr ""
-#: ../src/options.c:205 ../src/ui_bookmark.c:578
+#: ../src/options.c:219 ../src/ui_bookmark.c:589
msgid "Desktop"
msgstr ""
-#: ../src/options.c:226 ../src/search.c:2140 ../src/search.c:2144
-#: ../src/search.c:3258 ../src/search.c:3262 ../src/view_file/view_file.c:820
+#: ../src/options.c:240 ../src/search.c:2230 ../src/search.c:2234
+#: ../src/search.c:3382 ../src/search.c:3386 ../src/view_file/view_file.c:828
msgid "Mark "
msgstr ""
@@ -3977,140 +4077,141 @@
msgid "Sorting images..."
msgstr ""
-#: ../src/pan-view/pan-view.c:1408 ../src/print.c:2609
+#: ../src/pan-view/pan-view.c:1412
msgid "Filename:"
msgstr ""
-#: ../src/pan-view/pan-view.c:1410 ../src/pan-view/pan-view.c:1823
-#: ../src/preferences.c:2034
+#: ../src/pan-view/pan-view.c:1414 ../src/pan-view/pan-view.c:1827
+#: ../src/preferences.c:2050
msgid "Location:"
msgstr ""
-#: ../src/pan-view/pan-view.c:1412 ../src/pan-view/pan-view-search.c:377
+#: ../src/pan-view/pan-view.c:1416 ../src/pan-view/pan-view-search.c:377
msgid "Date:"
msgstr ""
-#: ../src/pan-view/pan-view.c:1414 ../src/preferences.c:1717
-#: ../src/print.c:3222 ../src/print.c:3427
+#: ../src/pan-view/pan-view.c:1418 ../src/preferences.c:1724
msgid "Size:"
msgstr ""
-#: ../src/pan-view/pan-view.c:1721 ../src/search.c:2560
+#: ../src/pan-view/pan-view.c:1725 ../src/search.c:2680
msgid "Folder not found"
msgstr ""
-#: ../src/pan-view/pan-view.c:1722
+#: ../src/pan-view/pan-view.c:1726
msgid "The entered path is not a folder"
msgstr ""
-#: ../src/pan-view/pan-view.c:1807
+#: ../src/pan-view/pan-view.c:1811
msgid "Pan View"
msgstr ""
-#: ../src/pan-view/pan-view.c:1830
-msgid "Timeline"
-msgstr ""
-
-#: ../src/pan-view/pan-view.c:1831
-msgid "Calendar"
-msgstr ""
-
-#: ../src/pan-view/pan-view.c:1833
-msgid "Folders (flower)"
-msgstr ""
-
#: ../src/pan-view/pan-view.c:1834
+msgid "Timeline"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1835
+msgid "Calendar"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1837
+msgid "Folders (flower)"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1838
msgid "Grid"
msgstr ""
-#: ../src/pan-view/pan-view.c:1843
-msgid "Dots"
-msgstr ""
-
-#: ../src/pan-view/pan-view.c:1844
-msgid "No Images"
-msgstr ""
-
-#: ../src/pan-view/pan-view.c:1845
-msgid "Small Thumbnails"
-msgstr ""
-
-#: ../src/pan-view/pan-view.c:1846
-msgid "Normal Thumbnails"
-msgstr ""
-
#: ../src/pan-view/pan-view.c:1847
+msgid "Dots"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1848
+msgid "No Images"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1849
+msgid "Small Thumbnails"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1850
+msgid "Normal Thumbnails"
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:1851
msgid "Large Thumbnails"
msgstr ""
-#: ../src/pan-view/pan-view.c:1848 ../src/pan-view/pan-view.c:2349
+#: ../src/pan-view/pan-view.c:1852 ../src/pan-view/pan-view.c:2376
msgid "1:10 (10%)"
msgstr ""
-#: ../src/pan-view/pan-view.c:1849 ../src/pan-view/pan-view.c:2345
+#: ../src/pan-view/pan-view.c:1853 ../src/pan-view/pan-view.c:2372
msgid "1:4 (25%)"
msgstr ""
-#: ../src/pan-view/pan-view.c:1850 ../src/pan-view/pan-view.c:2341
+#: ../src/pan-view/pan-view.c:1854 ../src/pan-view/pan-view.c:2368
msgid "1:3 (33%)"
msgstr ""
-#: ../src/pan-view/pan-view.c:1851 ../src/pan-view/pan-view.c:2337
+#: ../src/pan-view/pan-view.c:1855 ../src/pan-view/pan-view.c:2364
msgid "1:2 (50%)"
msgstr ""
-#: ../src/pan-view/pan-view.c:1852
+#: ../src/pan-view/pan-view.c:1856
msgid "1:1 (100%)"
msgstr ""
-#: ../src/pan-view/pan-view.c:1998
+#: ../src/pan-view/pan-view.c:2002
msgid "Pan View Performance"
msgstr ""
-#: ../src/pan-view/pan-view.c:2005
+#: ../src/pan-view/pan-view.c:2009
msgid "Pan view performance may be poor."
msgstr ""
-#: ../src/pan-view/pan-view.c:2006
+#: ../src/pan-view/pan-view.c:2010
msgid ""
-"To improve performance of thumbnails in the pan view the following options "
-"can be enabled. Note that both options must be enabled to notice a change in "
-"performance."
-msgstr ""
-
-#: ../src/pan-view/pan-view.c:2014 ../src/preferences.c:1720
+"To improve the performance of thumbnails in\n"
+"pan view the following options can be enabled.\n"
+"\n"
+"Note that both options must be enabled to\n"
+"notice a change in performance."
+msgstr ""
+
+#: ../src/pan-view/pan-view.c:2016 ../src/preferences.c:1727
msgid "Cache thumbnails"
msgstr ""
-#: ../src/pan-view/pan-view.c:2016
+#: ../src/pan-view/pan-view.c:2018
msgid "Use shared thumbnail cache"
msgstr ""
-#: ../src/pan-view/pan-view.c:2022
+#: ../src/pan-view/pan-view.c:2024
msgid "Do not show this dialog again"
msgstr "Do not show this dialogue again"
-#: ../src/pan-view/pan-view.c:2271 ../src/search.c:1091
+#: ../src/pan-view/pan-view.c:2290 ../src/search.c:1103
msgid "_Play"
msgstr ""
-#: ../src/pan-view/pan-view.c:2317
+#: ../src/pan-view/pan-view.c:2344
msgid "Sort by E_xif date"
msgstr ""
-#: ../src/pan-view/pan-view.c:2323
+#: ../src/pan-view/pan-view.c:2350
msgid "_Show Exif information"
msgstr ""
-#: ../src/pan-view/pan-view.c:2325
+#: ../src/pan-view/pan-view.c:2352
msgid "Show im_age"
msgstr ""
-#: ../src/pan-view/pan-view.c:2329
+#: ../src/pan-view/pan-view.c:2356
msgid "_None"
msgstr ""
-#: ../src/pan-view/pan-view.c:2333
+#: ../src/pan-view/pan-view.c:2360
msgid "_Full size"
msgstr ""
@@ -4150,7 +4251,7 @@
msgid "Keyword Filter:"
msgstr ""
-#: ../src/pan-view/pan-view-filter.c:105 ../src/preferences.c:2198
+#: ../src/pan-view/pan-view-filter.c:105 ../src/preferences.c:2406
msgid "Filter"
msgstr ""
@@ -4182,271 +4283,297 @@
msgid "no match"
msgstr ""
-#: ../src/preferences.c:108 ../src/search.c:3243
+#: ../src/preferences.c:115 ../src/search.c:3367
msgid "Unknown"
msgstr ""
-#: ../src/preferences.c:110
+#: ../src/preferences.c:117
msgid "RAW Image"
msgstr ""
-#: ../src/preferences.c:112 ../src/search.c:2098 ../src/search.c:3241
+#: ../src/preferences.c:119 ../src/search.c:2188 ../src/search.c:3365
msgid "Video"
msgstr ""
-#: ../src/preferences.c:570
+#: ../src/preferences.c:120 ../src/preferences.c:2068
+msgid "Collection"
+msgstr ""
+
+#: ../src/preferences.c:121
+msgid "Pdf"
+msgstr ""
+
+#: ../src/preferences.c:589
msgid "Nearest (worst, but fastest)"
msgstr ""
-#: ../src/preferences.c:572
+#: ../src/preferences.c:591
msgid "Tiles"
msgstr ""
-#: ../src/preferences.c:574
+#: ../src/preferences.c:593
msgid "Bilinear"
msgstr ""
-#: ../src/preferences.c:576
+#: ../src/preferences.c:595
msgid "Hyper (best, but slowest)"
msgstr ""
-#: ../src/preferences.c:601
+#: ../src/preferences.c:620
msgid "PRIMARY"
msgstr ""
-#: ../src/preferences.c:603
+#: ../src/preferences.c:622
msgid "CLIPBOARD"
msgstr ""
-#: ../src/preferences.c:668 ../src/print.c:390
+#: ../src/preferences.c:687
msgid "Custom"
msgstr ""
-#: ../src/preferences.c:751
+#: ../src/preferences.c:770
msgid "Single image"
msgstr ""
-#: ../src/preferences.c:753
-msgid "Anaglyph Red-Cyan"
-msgstr ""
-
-#: ../src/preferences.c:755
-msgid "Anaglyph Green-Magenta"
-msgstr ""
-
-#: ../src/preferences.c:757
-msgid "Anaglyph Yellow-Blue"
-msgstr ""
-
-#: ../src/preferences.c:759
-msgid "Anaglyph Gray Red-Cyan"
-msgstr ""
-
-#: ../src/preferences.c:761
-msgid "Anaglyph Gray Green-Magenta"
-msgstr ""
-
-#: ../src/preferences.c:763
-msgid "Anaglyph Gray Yellow-Blue"
-msgstr ""
-
-#: ../src/preferences.c:765
-msgid "Anaglyph Dubois Red-Cyan"
-msgstr ""
-
-#: ../src/preferences.c:767
-msgid "Anaglyph Dubois Green-Magenta"
-msgstr ""
-
-#: ../src/preferences.c:769
-msgid "Anaglyph Dubois Yellow-Blue"
-msgstr ""
-
#: ../src/preferences.c:772
-msgid "Side by Side"
-msgstr ""
-
-#: ../src/preferences.c:773
-msgid "Side by Side Half size"
+msgid "Anaglyph Red-Cyan"
+msgstr ""
+
+#: ../src/preferences.c:774
+msgid "Anaglyph Green-Magenta"
+msgstr ""
+
+#: ../src/preferences.c:776
+msgid "Anaglyph Yellow-Blue"
+msgstr ""
+
+#: ../src/preferences.c:778
+msgid "Anaglyph Gray Red-Cyan"
msgstr ""
#: ../src/preferences.c:780
+msgid "Anaglyph Gray Green-Magenta"
+msgstr ""
+
+#: ../src/preferences.c:782
+msgid "Anaglyph Gray Yellow-Blue"
+msgstr ""
+
+#: ../src/preferences.c:784
+msgid "Anaglyph Dubois Red-Cyan"
+msgstr ""
+
+#: ../src/preferences.c:786
+msgid "Anaglyph Dubois Green-Magenta"
+msgstr ""
+
+#: ../src/preferences.c:788
+msgid "Anaglyph Dubois Yellow-Blue"
+msgstr ""
+
+#: ../src/preferences.c:791
+msgid "Side by Side"
+msgstr ""
+
+#: ../src/preferences.c:792
+msgid "Side by Side Half size"
+msgstr ""
+
+#: ../src/preferences.c:799
msgid "Top - Bottom"
msgstr ""
-#: ../src/preferences.c:781
+#: ../src/preferences.c:800
msgid "Top - Bottom Half size"
msgstr ""
-#: ../src/preferences.c:790 ../src/preferences.c:2827
+#: ../src/preferences.c:809 ../src/preferences.c:3409
msgid "Fixed position"
msgstr ""
-#: ../src/preferences.c:1129 ../src/preferences.c:1132
+#: ../src/preferences.c:1148 ../src/preferences.c:1151
msgid "Reset filters"
msgstr ""
-#: ../src/preferences.c:1133
+#: ../src/preferences.c:1152
msgid ""
"This will reset the file filters to the defaults.\n"
"Continue?"
msgstr ""
-#: ../src/preferences.c:1160 ../src/preferences.c:1163
+#: ../src/preferences.c:1179 ../src/preferences.c:1182
msgid "Clear trash"
msgstr "Clear Rubbish Bin"
-#: ../src/preferences.c:1164
+#: ../src/preferences.c:1183
msgid "This will remove the trash contents."
msgstr "This will remove the Rubbish Bin contents."
-#: ../src/preferences.c:1208 ../src/preferences.c:1211
+#: ../src/preferences.c:1227 ../src/preferences.c:1230
msgid "Reset image overlay template string"
msgstr ""
-#: ../src/preferences.c:1212
+#: ../src/preferences.c:1231
msgid ""
"This will reset the image overlay template string to the default.\n"
"Continue?"
msgstr ""
-#: ../src/preferences.c:1712
+#: ../src/preferences.c:1719
msgid "General"
msgstr ""
-#: ../src/preferences.c:1718 ../src/preferences.c:1920
+#: ../src/preferences.c:1725 ../src/preferences.c:1939
msgid "Quality:"
msgstr ""
-#: ../src/preferences.c:1726
+#: ../src/preferences.c:1735
msgid "Use Geeqie thumbnail style and cache"
msgstr ""
-#: ../src/preferences.c:1733
+#: ../src/preferences.c:1742
msgid "Store thumbnails local to image folder (non-standard)"
msgstr ""
-#: ../src/preferences.c:1740
+#: ../src/preferences.c:1749
msgid "Use standard thumbnail style and cache, shared with other applications"
msgstr ""
-#: ../src/preferences.c:1746
+#: ../src/preferences.c:1755
msgid "Use EXIF thumbnails when available (EXIF thumbnails may be outdated)"
msgstr ""
-#: ../src/preferences.c:1750
+#: ../src/preferences.c:1758
+msgid "Collection preview:"
+msgstr ""
+
+#: ../src/preferences.c:1761
+msgid "The maximum number of thumbnails shown in a Collection preview montage"
+msgstr ""
+
+#: ../src/preferences.c:1764
msgid "Use embedded metadata in video files as thumbnails when available"
msgstr ""
-#: ../src/preferences.c:1757
+#: ../src/preferences.c:1771
msgid "Star Rating"
msgstr ""
-#: ../src/preferences.c:1773 ../src/preferences.c:1805
+#: ../src/preferences.c:1787 ../src/preferences.c:1819
msgid "Set"
msgstr ""
-#: ../src/preferences.c:1775 ../src/preferences.c:1807
+#: ../src/preferences.c:1789 ../src/preferences.c:1821
msgid "Display selected character"
msgstr ""
-#: ../src/preferences.c:1778 ../src/preferences.c:1810
+#: ../src/preferences.c:1792 ../src/preferences.c:1824
msgid ""
"Hexadecimal representation of a Unicode character. A list of all Unicode "
"characters may be found on the Internet."
msgstr ""
-#: ../src/preferences.c:1782 ../src/preferences.c:1814
-#: ../src/preferences.c:1894 ../src/window.c:397
+#: ../src/preferences.c:1796 ../src/preferences.c:1828
+#: ../src/preferences.c:1913 ../src/window.c:397
msgid "Clear"
msgstr ""
-#: ../src/preferences.c:1786 ../src/preferences.c:1818
-#: ../src/preferences.c:1898
+#: ../src/preferences.c:1800 ../src/preferences.c:1832
+#: ../src/preferences.c:1917
msgid "Default"
msgstr ""
-#: ../src/preferences.c:1826
+#: ../src/preferences.c:1840
msgid "Slide show"
msgstr ""
-#: ../src/preferences.c:1837
+#: ../src/preferences.c:1851
msgid "Delay between image change hrs:mins:secs.dec"
msgstr ""
-#: ../src/preferences.c:1853
-msgid "Random"
-msgstr ""
-
-#: ../src/preferences.c:1854
-msgid "Repeat"
-msgstr ""
-
-#: ../src/preferences.c:1856
-msgid "Image loading and caching"
-msgstr ""
-
-#: ../src/preferences.c:1858
-msgid "Decoded image cache size (Mb):"
-msgstr ""
-
-#: ../src/preferences.c:1860
-msgid "Preload next image"
-msgstr ""
-
-#: ../src/preferences.c:1863
-msgid "Refresh on file change"
-msgstr ""
-
-#: ../src/preferences.c:1866
-msgid "Info sidebar heights"
-msgstr ""
-
#: ../src/preferences.c:1867
+msgid "Random"
+msgstr ""
+
+#: ../src/preferences.c:1868
+msgid "Repeat"
+msgstr ""
+
+#: ../src/preferences.c:1870
+msgid "Image loading and caching"
+msgstr ""
+
+#: ../src/preferences.c:1872
+msgid "Decoded image cache size (Mb):"
+msgstr ""
+
+#: ../src/preferences.c:1874
+msgid "Preload next image"
+msgstr ""
+
+#: ../src/preferences.c:1877
+msgid "Refresh on file change"
+msgstr ""
+
+#: ../src/preferences.c:1880
+msgid "Info sidebar heights"
+msgstr ""
+
+#: ../src/preferences.c:1881
msgid "NOTE! Geeqie must be restarted for changes to take effect"
msgstr ""
-#: ../src/preferences.c:1869
+#: ../src/preferences.c:1883
msgid "Keywords:"
msgstr ""
-#: ../src/preferences.c:1875
-msgid "Comment:"
-msgstr ""
-
-#: ../src/preferences.c:1878
-msgid "Rating:"
-msgstr ""
-
-#: ../src/preferences.c:1882
-msgid "On-line help search engine"
-msgstr ""
-
#: ../src/preferences.c:1889
+msgid "Comment:"
+msgstr ""
+
+#: ../src/preferences.c:1892
+msgid "Rating:"
+msgstr ""
+
+#: ../src/preferences.c:1896
+msgid "Show predefined keyword tree"
+msgstr ""
+
+#: ../src/preferences.c:1898
+msgid ""
+"Show predefined keyword tree (NOTE! Geeqie must be restarted for change to "
+"take effect)"
+msgstr ""
+
+#: ../src/preferences.c:1901
+msgid "On-line help search engine"
+msgstr ""
+
+#: ../src/preferences.c:1908
msgid ""
"The format varies between search engines, e.g the format may be:\n"
"https://www.search_engine.com/search?q=site:geeqie.org/help\n"
"https://www.search_engine.com/?q=site:geeqie.org/help"
msgstr ""
-#: ../src/preferences.c:1923
+#: ../src/preferences.c:1942
msgid "Use GPU acceleration via Clutter library"
msgstr ""
-#: ../src/preferences.c:1927
+#: ../src/preferences.c:1946
msgid "Two pass rendering (apply HQ zoom and color correction in second pass)"
msgstr ""
"Two pass rendering (apply HQ zoom and colour correction in second pass)"
-#: ../src/preferences.c:1931
+#: ../src/preferences.c:1950
msgid "Zoom increment:"
msgstr ""
-#: ../src/preferences.c:1939
+#: ../src/preferences.c:1958
msgid "Allow enlargement of image (max. size in %)"
msgstr ""
-#: ../src/preferences.c:1945
+#: ../src/preferences.c:1964
#, c-format
msgid ""
"Enable this to allow Geeqie to increase the image size for images that are "
@@ -4455,12 +4582,12 @@
"100% is full-size."
msgstr ""
-#: ../src/preferences.c:1948
+#: ../src/preferences.c:1967
#, c-format
msgid "Virtual window size (% of actual window):"
msgstr ""
-#: ../src/preferences.c:1954
+#: ../src/preferences.c:1973
msgid ""
"This value will set the virtual size of the window when \"Fit image to window"
"\" is set. Instead of using the actual size of the window, the specified "
@@ -4469,822 +4596,656 @@
"than 100%). It affects fullscreen mode too."
msgstr ""
-#: ../src/preferences.c:1956
+#: ../src/preferences.c:1975
msgid "Appearance"
msgstr ""
-#: ../src/preferences.c:1958
+#: ../src/preferences.c:1977
msgid "Use custom border color in window mode"
msgstr "Use custom border colour in window mode"
-#: ../src/preferences.c:1961
+#: ../src/preferences.c:1980
msgid "Use custom border color in fullscreen mode"
msgstr "Use custom border colour in fullscreen mode"
-#: ../src/preferences.c:1964
+#: ../src/preferences.c:1983
msgid "Border color"
msgstr "Border colour"
-#: ../src/preferences.c:1969
+#: ../src/preferences.c:1988
msgid "Alpha channel color 1"
msgstr "Alpha channel colour 1"
-#: ../src/preferences.c:1972
+#: ../src/preferences.c:1991
msgid "Alpha channel color 2"
msgstr "Alpha channel colour 2"
-#: ../src/preferences.c:1978
+#: ../src/preferences.c:1997
msgid "Convenience"
msgstr ""
-#: ../src/preferences.c:1980
-msgid "Auto rotate proofs using Exif information"
-msgstr ""
-
-#: ../src/preferences.c:1997
-msgid "Windows"
-msgstr ""
-
#: ../src/preferences.c:1999
+msgid "Auto rotate proofs using Exif information"
+msgstr ""
+
+#: ../src/preferences.c:2013
+msgid "Windows"
+msgstr ""
+
+#: ../src/preferences.c:2015
msgid "State"
msgstr ""
-#: ../src/preferences.c:2001
+#: ../src/preferences.c:2017
msgid "Remember window positions"
msgstr ""
-#: ../src/preferences.c:2004
+#: ../src/preferences.c:2020
msgid "Use saved window positions also for new windows"
msgstr ""
-#: ../src/preferences.c:2008
+#: ../src/preferences.c:2024
msgid "Remember tool state (float/hidden)"
msgstr ""
-#: ../src/preferences.c:2011
+#: ../src/preferences.c:2027
msgid "Remember dialog window positions"
msgstr "Remember dialogue window positions"
-#: ../src/preferences.c:2014
+#: ../src/preferences.c:2030
msgid "Show window IDs"
msgstr ""
-#: ../src/preferences.c:2019
+#: ../src/preferences.c:2035
msgid "Fit window to image when tools are hidden/floating"
msgstr ""
-#: ../src/preferences.c:2023
+#: ../src/preferences.c:2039
msgid "Limit size when auto-sizing window (%):"
msgstr ""
-#: ../src/preferences.c:2038
+#: ../src/preferences.c:2054
msgid "Smooth image flip"
msgstr ""
-#: ../src/preferences.c:2040
+#: ../src/preferences.c:2056
msgid "Disable screen saver"
msgstr ""
-#: ../src/preferences.c:2044
-msgid "Overlay Screen Display"
-msgstr ""
-
-#: ../src/preferences.c:2046
-msgid "Image overlay template"
-msgstr ""
-
-#: ../src/preferences.c:2059
-msgid ""
-"%name% results in the filename of the picture.\n"
-"Also available: %collection%, %number%, %total%, "
-"%date%,\n"
-"%size% (filesize), %width%, %height%, %res% "
-"(resolution),\n"
-"%rating%, %keywords%, %comment% (XMP), %imagecomment"
-"% (JPEG)\n"
-"To access exif data use the exif name, e. g. %formatted.Camera% is "
-"the formatted camera name,\n"
-"%Exif.Photo.DateTimeOriginal% the date of the original shot.\n"
-"%formatted.Camera:20 notation will truncate the displayed data to 20 "
-"characters and will add 3 dots at the end to denote the truncation.\n"
-"If two or more variables are connected with the |-sign, it prints available "
-"variables with a separator.\n"
-"%formatted.ShutterSpeed%|%formatted.ISOSpeedRating%|"
-"%formatted.FocalLength% could show \"1/20s - 400 - 80 mm\" or \"1/200 - "
-"80 mm\",\n"
-"if there's no ISO information in the Exif data.\n"
-"If a line is empty, it is removed. This allows one to add lines that totally "
-"disappear when no data is available.\n"
-msgstr ""
-
-#: ../src/preferences.c:2077 ../src/print.c:3220
-msgid "Font"
-msgstr ""
-
-#: ../src/preferences.c:2089 ../src/print.c:3410
-msgid "Text"
+#: ../src/preferences.c:2069
+msgid "Collection number"
+msgstr ""
+
+#: ../src/preferences.c:2070
+msgid "Collection total"
+msgstr ""
+
+#: ../src/preferences.c:2077
+msgid "Image date"
+msgstr ""
+
+#: ../src/preferences.c:2079
+msgid "ShutterSpeed"
+msgstr ""
+
+#: ../src/preferences.c:2085
+msgid "ISO"
+msgstr ""
+
+#: ../src/preferences.c:2087
+msgid "Focal len. 35mm"
+msgstr ""
+
+#: ../src/preferences.c:2091
+msgid "Lat, Long"
+msgstr ""
+
+#: ../src/preferences.c:2092
+msgid "Altitude"
msgstr ""
#: ../src/preferences.c:2094
-msgid "Background"
-msgstr ""
-
-#: ../src/preferences.c:2100 ../src/preferences.c:2278
-#: ../src/preferences.c:2740
-msgid "Defaults"
-msgstr ""
-
-#: ../src/preferences.c:2154
-msgid "Show hidden files or folders"
-msgstr ""
-
-#: ../src/preferences.c:2156
-msgid "Show parent folder (..)"
-msgstr ""
-
-#: ../src/preferences.c:2158
-msgid "Case sensitive sort"
-msgstr ""
-
-#: ../src/preferences.c:2160
-msgid "Natural sort order"
-msgstr ""
-
-#: ../src/preferences.c:2162
-msgid "Disable file extension checks"
-msgstr ""
-
-#: ../src/preferences.c:2165
-msgid "Disable File Filtering"
-msgstr ""
-
-#: ../src/preferences.c:2169
-msgid "Grouping sidecar extensions"
-msgstr ""
-
-#: ../src/preferences.c:2176
-msgid "File types"
+msgid "Timezone"
+msgstr ""
+
+#: ../src/preferences.c:2186
+msgid "OSD"
+msgstr ""
+
+#: ../src/preferences.c:2190
+msgid "Overlay Screen Display"
+msgstr ""
+
+#: ../src/preferences.c:2197
+msgid ""
+"To include predefined tags in the template, click a button or drag-and-drop"
+msgstr ""
+
+#: ../src/preferences.c:2222
+msgid "Image overlay template"
msgstr ""
#: ../src/preferences.c:2233
-msgid "Class"
-msgstr ""
-
-#: ../src/preferences.c:2250
-msgid "Writable"
-msgstr ""
-
-#: ../src/preferences.c:2261
-msgid "Sidecar is allowed"
-msgstr ""
-
-#: ../src/preferences.c:2307
-msgid "Metadata writing process"
-msgstr ""
-
-#: ../src/preferences.c:2309
-msgid "Warning: Geeqie is built without Exiv2. Some options are disabled."
-msgstr ""
-
-#: ../src/preferences.c:2311
-msgid ""
-"Metadata are written in the following order. The process ends after first "
-"success."
-msgstr ""
-
-#: ../src/preferences.c:2314
-msgid ""
-"1) Save metadata in image files, or sidecar files, according to the XMP "
-"standard"
-msgstr ""
-
-#: ../src/preferences.c:2320
+msgid "Extensive formatting options are shown in the Help file"
+msgstr ""
+
+#: ../src/preferences.c:2241 ../src/print.c:428 ../src/print.c:491
+msgid "Font"
+msgstr ""
+
+#: ../src/preferences.c:2253
+msgid "Text"
+msgstr ""
+
+#: ../src/preferences.c:2258
+msgid "Background"
+msgstr ""
+
+#: ../src/preferences.c:2264 ../src/preferences.c:2486
+#: ../src/preferences.c:3322
+msgid "Defaults"
+msgstr ""
+
+#: ../src/preferences.c:2281
+msgid "Exif, XMP or IPTC tags"
+msgstr ""
+
+#: ../src/preferences.c:2285
+msgid "%Exif.Image.Orientation%"
+msgstr ""
+
+#: ../src/preferences.c:2290
+msgid "Field separators"
+msgstr ""
+
+#: ../src/preferences.c:2294
msgid ""
-"2) Save metadata in '.metadata' folder, local to image folder (non-standard)"
-msgstr ""
-
-#: ../src/preferences.c:2323
-#, c-format
-msgid "3) Save metadata in Geeqie private directory '%s'"
-msgstr ""
-
-#: ../src/preferences.c:2329
-msgid "Step 1: Write to image files"
-msgstr ""
-
-#: ../src/preferences.c:2337
+"Separator shown only if both fields are non-null:\n"
+"%formatted.ShutterSpeed%|%formatted.ISOSpeedRating%"
+msgstr ""
+
+#: ../src/preferences.c:2299
+msgid "Field maximum length"
+msgstr ""
+
+#: ../src/preferences.c:2303
+msgid "%path:39%"
+msgstr ""
+
+#: ../src/preferences.c:2308
+msgid "Pre- and post- text"
+msgstr ""
+
+#: ../src/preferences.c:2312
msgid ""
-"Store metadata also in legacy IPTC tags (converted according to IPTC4XMP "
-"standard)"
-msgstr ""
-
-#: ../src/preferences.c:2340
-msgid "Warn if the image files are unwritable"
-msgstr ""
-
-#: ../src/preferences.c:2343
-msgid "Ask before writing to image files"
-msgstr ""
-
-#: ../src/preferences.c:2346
-msgid "Create sidecar files named image.ext.xmp (as opposed to image.xmp)"
-msgstr ""
-
-#: ../src/preferences.c:2349
-msgid "Step 2 and 3: write to Geeqie private files"
-msgstr ""
-
-#: ../src/preferences.c:2354
+"Text shown only if the field is non-null:\n"
+"%formatted.Aperture:F no. * setting%\n"
+" %formatted.Aperture:10:F no. * setting%"
+msgstr ""
+
+#: ../src/preferences.c:2317
+msgid "Pango markup"
+msgstr ""
+
+#: ../src/preferences.c:2321
msgid ""
-"Use GQview legacy metadata format (supports only keywords and comments) "
-"instead of XMP"
-msgstr ""
-
-#: ../src/preferences.c:2358
-msgid "Miscellaneous"
-msgstr ""
-
-#: ../src/preferences.c:2359
-msgid ""
-"Write the same description tags (keywords, comment, etc.) to all grouped "
-"sidecars"
+"bold\n"
+"underline\n"
+"italic\n"
+"strikethrough"
msgstr ""
#: ../src/preferences.c:2362
-msgid "Allow keywords to differ only in case"
-msgstr ""
-
-#: ../src/preferences.c:2365
-msgid "Write altered image orientation to the metadata"
-msgstr ""
-
-#: ../src/preferences.c:2371
-msgid "Auto-save options"
+msgid "Show hidden files or folders"
+msgstr ""
+
+#: ../src/preferences.c:2364
+msgid "Show parent folder (..)"
+msgstr ""
+
+#: ../src/preferences.c:2366
+msgid "Case sensitive sort"
+msgstr ""
+
+#: ../src/preferences.c:2368
+msgid "Natural sort order"
+msgstr ""
+
+#: ../src/preferences.c:2370
+msgid "Disable file extension checks"
msgstr ""
#: ../src/preferences.c:2373
-msgid "Write metadata after timeout"
-msgstr ""
-
-#: ../src/preferences.c:2379
-msgid "Timeout (seconds):"
-msgstr ""
-
-#: ../src/preferences.c:2382
-msgid "Write metadata on image change"
-msgstr ""
-
-#: ../src/preferences.c:2385
-msgid "Write metadata on directory change"
-msgstr ""
-
-#: ../src/preferences.c:2388
-msgid "Pre-load metadata"
-msgstr ""
-
-#: ../src/preferences.c:2390
-msgid "Read metadata in background"
-msgstr ""
-
-#: ../src/preferences.c:2431
-msgid "Perceptual"
-msgstr ""
-
-#: ../src/preferences.c:2433
-msgid "Relative Colorimetric"
-msgstr "Relative Colourimetric"
-
-#: ../src/preferences.c:2437
-msgid "Absolute Colorimetric"
-msgstr "Absolute Colourimetric"
-
-#: ../src/preferences.c:2462
-msgid "Color management"
-msgstr "Colour management"
-
-#: ../src/preferences.c:2464
-msgid "Input profiles"
-msgstr ""
-
-#: ../src/preferences.c:2472
-msgid "Type"
-msgstr ""
-
-#: ../src/preferences.c:2475
-msgid "Menu name"
-msgstr ""
-
-#: ../src/preferences.c:2478
-msgid "File"
-msgstr ""
-
-#: ../src/preferences.c:2486
-#, c-format
-msgid "Input %d:"
-msgstr ""
-
-#: ../src/preferences.c:2502 ../src/preferences.c:2522
-msgid "Select color profile"
-msgstr "Select colour profile"
-
-#: ../src/preferences.c:2510
-msgid "Screen profile"
-msgstr ""
-
-#: ../src/preferences.c:2514
-msgid "Use system screen profile if available"
+msgid "Disable File Filtering"
+msgstr ""
+
+#: ../src/preferences.c:2377
+msgid "Grouping sidecar extensions"
+msgstr ""
+
+#: ../src/preferences.c:2384
+msgid "File types"
+msgstr ""
+
+#: ../src/preferences.c:2441
+msgid "Class"
+msgstr ""
+
+#: ../src/preferences.c:2458
+msgid "Writable"
+msgstr ""
+
+#: ../src/preferences.c:2469
+msgid "Sidecar is allowed"
+msgstr ""
+
+#: ../src/preferences.c:2515
+msgid "Metadata writing process"
+msgstr ""
+
+#: ../src/preferences.c:2517
+msgid "Warning: Geeqie is built without Exiv2. Some options are disabled."
msgstr ""
#: ../src/preferences.c:2519
-msgid "Screen:"
-msgstr ""
-
-#: ../src/preferences.c:2525
-msgid "Render Intent:"
-msgstr ""
-
-#: ../src/preferences.c:2548 ../src/preferences.c:2589
-msgid "Behavior"
-msgstr "Behaviour"
-
-#: ../src/preferences.c:2550 ../src/utilops.c:2180
-msgid "Delete"
-msgstr ""
-
-#: ../src/preferences.c:2552
-msgid "Confirm file delete"
+msgid ""
+"Metadata are written in the following order. The process ends after first "
+"success."
+msgstr ""
+
+#: ../src/preferences.c:2522
+msgid ""
+"1) Save metadata in image files, or sidecar files, according to the XMP "
+"standard"
+msgstr ""
+
+#: ../src/preferences.c:2528
+msgid ""
+"2) Save metadata in '.metadata' folder, local to image folder (non-standard)"
+msgstr ""
+
+#: ../src/preferences.c:2531
+#, c-format
+msgid "3) Save metadata in Geeqie private directory '%s'"
+msgstr ""
+
+#: ../src/preferences.c:2537
+msgid "Step 1: Write to image files"
+msgstr ""
+
+#: ../src/preferences.c:2545
+msgid ""
+"Store metadata also in legacy IPTC tags (converted according to IPTC4XMP "
+"standard)"
+msgstr ""
+
+#: ../src/preferences.c:2548
+msgid "Warn if the image files are unwritable"
+msgstr ""
+
+#: ../src/preferences.c:2551
+msgid "Ask before writing to image files"
msgstr ""
#: ../src/preferences.c:2554
-msgid "Enable Delete key"
+msgid "Create sidecar files named image.ext.xmp (as opposed to image.xmp)"
msgstr ""
#: ../src/preferences.c:2557
-msgid "Safe delete"
-msgstr ""
-
-#: ../src/preferences.c:2575
+msgid "Step 2 and 3: write to Geeqie private files"
+msgstr ""
+
+#: ../src/preferences.c:2562
+msgid ""
+"Use GQview legacy metadata format (supports only keywords and comments) "
+"instead of XMP"
+msgstr ""
+
+#: ../src/preferences.c:2566
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../src/preferences.c:2567
+msgid ""
+"Write the same description tags (keywords, comment, etc.) to all grouped "
+"sidecars"
+msgstr ""
+
+#: ../src/preferences.c:2570
+msgid "Allow keywords to differ only in case"
+msgstr ""
+
+#: ../src/preferences.c:2573
+msgid "Write altered image orientation to the metadata"
+msgstr ""
+
+#: ../src/preferences.c:2579
+msgid "Auto-save options"
+msgstr ""
+
+#: ../src/preferences.c:2581
+msgid "Write metadata after timeout"
+msgstr ""
+
+#: ../src/preferences.c:2587
+msgid "Timeout (seconds):"
+msgstr ""
+
+#: ../src/preferences.c:2590
+msgid "Write metadata on image change"
+msgstr ""
+
+#: ../src/preferences.c:2593
+msgid "Write metadata on directory change"
+msgstr ""
+
+#: ../src/preferences.c:2596
+msgid "Pre-load metadata"
+msgstr ""
+
+#: ../src/preferences.c:2598
+msgid "Read metadata in background"
+msgstr ""
+
+#: ../src/preferences.c:2787 ../src/preferences.c:2801
+msgid "Search for keywords"
+msgstr ""
+
+#: ../src/preferences.c:2899
+msgid "Edit keywords autocompletion list"
+msgstr ""
+
+#: ../src/preferences.c:2903 ../src/toolbar.c:85
+msgid "Search"
+msgstr ""
+
+#: ../src/preferences.c:2982
+msgid "Perceptual"
+msgstr ""
+
+#: ../src/preferences.c:2984
+msgid "Relative Colorimetric"
+msgstr "Relative Colourimetric"
+
+#: ../src/preferences.c:2988
+msgid "Absolute Colorimetric"
+msgstr "Absolute Colourimetric"
+
+#: ../src/preferences.c:3013
+msgid "Color management"
+msgstr "Colour management"
+
+#: ../src/preferences.c:3015
+msgid "Input profiles"
+msgstr ""
+
+#: ../src/preferences.c:3023
+msgid "Type"
+msgstr ""
+
+#: ../src/preferences.c:3026
+msgid "Menu name"
+msgstr ""
+
+#: ../src/preferences.c:3029
+msgid "File"
+msgstr ""
+
+#: ../src/preferences.c:3037
+#, c-format
+msgid "Input %d:"
+msgstr ""
+
+#: ../src/preferences.c:3053 ../src/preferences.c:3073
+msgid "Select color profile"
+msgstr "Select colour profile"
+
+#: ../src/preferences.c:3061
+msgid "Screen profile"
+msgstr ""
+
+#: ../src/preferences.c:3065
+msgid "Use system screen profile if available"
+msgstr ""
+
+#: ../src/preferences.c:3070
+msgid "Screen:"
+msgstr ""
+
+#: ../src/preferences.c:3076
+msgid "Render Intent:"
+msgstr ""
+
+#: ../src/preferences.c:3116 ../src/preferences.c:3163
+msgid "Behavior"
+msgstr "Behaviour"
+
+#: ../src/preferences.c:3118 ../src/toolbar.c:91 ../src/utilops.c:2188
+msgid "Delete"
+msgstr ""
+
+#: ../src/preferences.c:3120
+msgid "Confirm permanent file delete"
+msgstr ""
+
+#: ../src/preferences.c:3122
+msgid "Confirm move file to Trash"
+msgstr "Confirm file move to Rubbish bin"
+
+#: ../src/preferences.c:3124
+msgid "Enable Delete key"
+msgstr ""
+
+#: ../src/preferences.c:3127
+msgid "Use Geeqie trash location"
+msgstr "Use Geeqie Rubbish bin location"
+
+#: ../src/preferences.c:3145
msgid "Maximum size:"
msgstr ""
-#: ../src/preferences.c:2575
+#: ../src/preferences.c:3145
msgid "MB"
msgstr ""
-#: ../src/preferences.c:2577
+#: ../src/preferences.c:3147
msgid "Set to 0 for unlimited size"
msgstr ""
-#: ../src/preferences.c:2578
+#: ../src/preferences.c:3148
msgid "View"
msgstr ""
-#: ../src/preferences.c:2591
+#: ../src/preferences.c:3156
+msgid "Use system Trash bin"
+msgstr "Use system Rubbish bin"
+
+#: ../src/preferences.c:3165
msgid "Descend folders in tree view"
msgstr ""
-#: ../src/preferences.c:2594
+#: ../src/preferences.c:3168
msgid "In place renaming"
msgstr ""
-#: ../src/preferences.c:2597
+#: ../src/preferences.c:3171
msgid "List directory view uses single click to enter"
msgstr ""
-#: ../src/preferences.c:2600
+#: ../src/preferences.c:3174
msgid "Save marks on exit"
msgstr ""
-#: ../src/preferences.c:2604
+#: ../src/preferences.c:3178
msgid "Use \"With Rename\" as default for Copy/Move dialogs"
msgstr "Use \"With Rename\" as default for Copy/Move dialogues"
-#: ../src/preferences.c:2608
+#: ../src/preferences.c:3182
+msgid "Open collections on top"
+msgstr ""
+
+#: ../src/preferences.c:3186
msgid "Recent folder list maximum size"
msgstr ""
-#: ../src/preferences.c:2611
+#: ../src/preferences.c:3189
msgid "Drag'n drop icon size"
msgstr ""
-#: ../src/preferences.c:2615
+#: ../src/preferences.c:3193
msgid "Copy path clipboard selection:"
msgstr ""
-#: ../src/preferences.c:2617
+#: ../src/preferences.c:3197
msgid "Navigation"
msgstr ""
-#: ../src/preferences.c:2619
+#: ../src/preferences.c:3199
msgid "Progressive keyboard scrolling"
msgstr ""
-#: ../src/preferences.c:2621
+#: ../src/preferences.c:3201
msgid "Keyboard scrolling step multiplier:"
msgstr ""
-#: ../src/preferences.c:2623
+#: ../src/preferences.c:3203
msgid "Mouse wheel scrolls image"
msgstr ""
-#: ../src/preferences.c:2625
+#: ../src/preferences.c:3205
msgid "Navigation by left or middle click on image"
msgstr ""
-#: ../src/preferences.c:2627
+#: ../src/preferences.c:3207
msgid "Play video by left click on image"
msgstr ""
-#: ../src/preferences.c:2630
+#: ../src/preferences.c:3210
msgid "Play with:"
msgstr ""
-#: ../src/preferences.c:2634
+#: ../src/preferences.c:3216
msgid "Debugging"
msgstr ""
-#: ../src/preferences.c:2639
+#: ../src/preferences.c:3221
msgid "Timer data"
msgstr ""
-#: ../src/preferences.c:2642
+#: ../src/preferences.c:3224
msgid "Log Window max. lines:"
msgstr ""
-#: ../src/preferences.c:2660
+#: ../src/preferences.c:3242
msgid "Keyboard"
msgstr ""
-#: ../src/preferences.c:2662
+#: ../src/preferences.c:3244
msgid "Accelerators"
msgstr ""
-#: ../src/preferences.c:2681
+#: ../src/preferences.c:3263
msgid "Action"
msgstr ""
-#: ../src/preferences.c:2703
+#: ../src/preferences.c:3285
msgid "KEY"
msgstr ""
-#: ../src/preferences.c:2714
+#: ../src/preferences.c:3296
msgid "Tooltip"
msgstr ""
-#: ../src/preferences.c:2745
+#: ../src/preferences.c:3327
msgid "Reset selected"
msgstr ""
-#: ../src/preferences.c:2760
+#: ../src/preferences.c:3342
msgid "Toolbar"
msgstr ""
-#: ../src/preferences.c:2777
+#: ../src/preferences.c:3359
msgid "Stereo"
msgstr ""
-#: ../src/preferences.c:2779 ../src/preferences.c:2782
+#: ../src/preferences.c:3361 ../src/preferences.c:3364
msgid "Windowed stereo mode"
msgstr ""
-#: ../src/preferences.c:2786 ../src/preferences.c:2811
+#: ../src/preferences.c:3368 ../src/preferences.c:3393
msgid "Mirror left image"
msgstr ""
-#: ../src/preferences.c:2789 ../src/preferences.c:2814
+#: ../src/preferences.c:3371 ../src/preferences.c:3396
msgid "Flip left image"
msgstr ""
-#: ../src/preferences.c:2792 ../src/preferences.c:2817
+#: ../src/preferences.c:3374 ../src/preferences.c:3399
msgid "Mirror right image"
msgstr ""
-#: ../src/preferences.c:2795 ../src/preferences.c:2820
+#: ../src/preferences.c:3377 ../src/preferences.c:3402
msgid "Flip right image"
msgstr ""
-#: ../src/preferences.c:2797 ../src/preferences.c:2822
+#: ../src/preferences.c:3379 ../src/preferences.c:3404
msgid "Swap left and right images"
msgstr ""
-#: ../src/preferences.c:2799 ../src/preferences.c:2824
+#: ../src/preferences.c:3381 ../src/preferences.c:3406
msgid "Disable stereo mode on single image source"
msgstr ""
-#: ../src/preferences.c:2802 ../src/preferences.c:2808
+#: ../src/preferences.c:3384 ../src/preferences.c:3390
msgid "Fullscreen stereo mode"
msgstr ""
-#: ../src/preferences.c:2803
+#: ../src/preferences.c:3385
msgid "Use different settings for fullscreen"
msgstr ""
-#: ../src/preferences.c:2833
+#: ../src/preferences.c:3415
msgid "Left X"
msgstr ""
-#: ../src/preferences.c:2835
+#: ../src/preferences.c:3417
msgid "Left Y"
msgstr ""
-#: ../src/preferences.c:2837
+#: ../src/preferences.c:3419
msgid "Right X"
msgstr ""
-#: ../src/preferences.c:2839
+#: ../src/preferences.c:3421
msgid "Right Y"
msgstr ""
-#: ../src/preferences.c:2855 ../src/toolbar.c:89
+#: ../src/preferences.c:3437 ../src/toolbar.c:100
msgid "Preferences"
msgstr ""
-#: ../src/preferences.c:3004
+#: ../src/preferences.c:3589
msgid "About Geeqie"
msgstr ""
-#: ../src/preferences.c:3014
+#: ../src/preferences.c:3599
msgid "translator-credits"
msgstr ""
-#: ../src/print.c:134
-msgid "Selection"
-msgstr ""
-
-#: ../src/print.c:135
-msgid "All"
-msgstr ""
-
-#: ../src/print.c:146
-msgid "One image per page"
-msgstr ""
-
-#: ../src/print.c:147
-msgid "Proof sheet"
-msgstr ""
-
-#: ../src/print.c:160
-msgid "Default printer"
-msgstr ""
-
-#: ../src/print.c:161
-msgid "Custom printer"
-msgstr ""
-
-#: ../src/print.c:162
-msgid "PostScript file"
-msgstr ""
-
-#: ../src/print.c:163
-msgid "Image file"
-msgstr ""
-
-#: ../src/print.c:177
-msgid "jpeg, low quality"
-msgstr ""
-
-#: ../src/print.c:178
-msgid "jpeg, normal quality"
-msgstr ""
-
-#: ../src/print.c:179
-msgid "jpeg, high quality"
-msgstr ""
-
-#: ../src/print.c:375 ../src/print.c:3222
-msgid "points"
-msgstr ""
-
-#: ../src/print.c:376
-msgid "millimeters"
-msgstr "millimetres"
-
-#: ../src/print.c:377
-msgid "centimeters"
-msgstr "centimetres"
-
-#: ../src/print.c:378
-msgid "inches"
-msgstr ""
-
-#: ../src/print.c:379
-msgid "picas"
-msgstr ""
-
-#: ../src/print.c:391
-msgid "Letter"
-msgstr ""
-
-#. in 8.5 x 11
-#: ../src/print.c:392
-msgid "Legal"
-msgstr ""
-
-#. in 8.5 x 14
-#: ../src/print.c:393
-msgid "Executive"
-msgstr ""
-
-#. in 7.25x 10.5
-#. mm 841 x 1189
-#. mm 594 x 841
-#. mm 420 x 594
-#. mm 297 x 420
-#. mm 210 x 297
-#. mm 148 x 210
-#. mm 105 x 148
-#. mm 353 x 500
-#. mm 250 x 353
-#. mm 176 x 250
-#. mm 125 x 176
-#: ../src/print.c:405
-msgid "Envelope #10"
-msgstr ""
-
-#. in 4.125 x 9.5
-#: ../src/print.c:406
-msgid "Envelope #9"
-msgstr ""
-
-#. in 3.875 x 8.875
-#: ../src/print.c:407
-msgid "Envelope C4"
-msgstr ""
-
-#. mm 229 x 324
-#: ../src/print.c:408
-msgid "Envelope C5"
-msgstr ""
-
-#. mm 162 x 229
-#: ../src/print.c:409
-msgid "Envelope C6"
-msgstr ""
-
-#. mm 114 x 162
-#: ../src/print.c:410
-msgid "Photo 6x4"
-msgstr ""
-
-#. in 6 x 4
-#: ../src/print.c:411
-msgid "Photo 8x10"
-msgstr ""
-
-#. in 8 x 10
-#: ../src/print.c:412
-msgid "Postcard"
-msgstr ""
-
-#. mm 100 x 148
-#: ../src/print.c:413
-msgid "Tabloid"
-msgstr ""
-
-#: ../src/print.c:569
-#, c-format
-msgid "page %d of %d"
-msgstr ""
-
-#: ../src/print.c:761
-msgid "Preview"
-msgstr ""
-
-#: ../src/print.c:1069
-#, c-format
-msgid ""
-"Unable to open pipe for writing.\n"
-"\"%s\""
-msgstr ""
-
-#: ../src/print.c:1084 ../src/print.c:1476 ../src/ui_pathsel.c:432
-#, c-format
-msgid "A file with name %s already exists."
-msgstr ""
-
-#: ../src/print.c:1099 ../src/print.c:1531
-#, c-format
-msgid "Failure writing to file %s"
-msgstr ""
-
-#: ../src/print.c:1154 ../src/print.c:1191 ../src/print.c:1227
-#: ../src/print.c:1344 ../src/print.c:1417
-msgid "SIGPIPE error writing to printer."
-msgstr ""
-
-#: ../src/print.c:1952
-#, c-format
-msgid "Page %d"
-msgstr ""
-
-#: ../src/print.c:1974 ../src/print.c:1979
-msgid "Printing error"
-msgstr ""
-
-#: ../src/print.c:1978
-#, c-format
-msgid "An error occurred printing to %s."
-msgstr ""
-
-#: ../src/print.c:1982
-msgid "Details"
-msgstr ""
-
-#: ../src/print.c:2597 ../src/print.c:3351 ../src/toolbar.c:88
-msgid "Print"
-msgstr ""
-
-#: ../src/print.c:2601
-#, c-format
-msgid "Printing %d pages to %s."
-msgstr ""
-
-#: ../src/print.c:2701
-msgid "Format:"
-msgstr ""
-
-#: ../src/print.c:2776
-msgid "Units:"
-msgstr ""
-
-#: ../src/print.c:2820
-msgid "Orientation:"
-msgstr ""
-
-#: ../src/print.c:2952
-msgid "Destination:"
-msgstr ""
-
-#: ../src/print.c:3000
-msgid ""
-msgstr ""
-
-#: ../src/print.c:3089
-msgid "Unlimited"
-msgstr ""
-
-#: ../src/print.c:3207
-msgid "Show"
-msgstr ""
-
-#: ../src/print.c:3378
-msgid "Source"
-msgstr ""
-
-#: ../src/print.c:3390
-msgid "Image size:"
-msgstr ""
-
-#: ../src/print.c:3394
-msgid "Proof size:"
-msgstr ""
-
-#: ../src/print.c:3420
-msgid "Paper"
-msgstr ""
-
-#: ../src/print.c:3443
-msgid "Margins"
-msgstr ""
-
-#: ../src/print.c:3445
-msgid "Left:"
-msgstr ""
-
-#: ../src/print.c:3448
-msgid "Right:"
-msgstr ""
-
-#: ../src/print.c:3451
-msgid "Top:"
-msgstr ""
-
-#: ../src/print.c:3454
-msgid "Bottom:"
-msgstr ""
-
-#: ../src/print.c:3463
-msgid "Printer"
-msgstr ""
-
-#: ../src/print.c:3469
-msgid "Custom printer:"
-msgstr ""
-
-#: ../src/print.c:3478
-msgid "File:"
-msgstr ""
-
-#: ../src/print.c:3487
-msgid "File format:"
-msgstr ""
-
-#: ../src/print.c:3492
-msgid "DPI:"
-msgstr ""
-
-#: ../src/print.c:3500
-msgid "Remember print settings"
+#: ../src/print.c:386
+msgid "Image text"
+msgstr ""
+
+#: ../src/print.c:388
+msgid "Show image text"
+msgstr ""
+
+#: ../src/print.c:442
+msgid "Page text"
+msgstr ""
+
+#: ../src/print.c:444
+msgid "Show page text"
msgstr ""
#: ../src/rcfile.c:91
@@ -5292,12 +5253,12 @@
msgid "Option %s ignored: %s\n"
msgstr ""
-#: ../src/rcfile.c:560
+#: ../src/rcfile.c:608
#, c-format
msgid "error saving config file: %s\n"
msgstr ""
-#: ../src/rcfile.c:621
+#: ../src/rcfile.c:672
#, c-format
msgid ""
"error saving config file: %s\n"
@@ -5309,417 +5270,430 @@
msgid "[%d,%d]: RGB(%3d,%3d,%3d)"
msgstr ""
-#: ../src/remote.c:834 ../src/remote.c:839
+#: ../src/remote.c:708
+#, c-format
+msgid "%dx%d+%d+%d"
+msgstr ""
+
+#: ../src/remote.c:891 ../src/remote.c:896
msgid "lua error: no data"
msgstr ""
#. short, long callback, extra, prefer, parameter, description
-#: ../src/remote.c:862
+#: ../src/remote.c:919
msgid "next image"
msgstr ""
-#: ../src/remote.c:863
+#: ../src/remote.c:920
msgid "previous image"
msgstr ""
-#: ../src/remote.c:864
+#: ../src/remote.c:921
msgid "first image"
msgstr ""
-#: ../src/remote.c:865
+#: ../src/remote.c:922
msgid "last image"
msgstr ""
-#: ../src/remote.c:866
+#: ../src/remote.c:923
msgid "toggle full screen"
msgstr ""
-#: ../src/remote.c:867
+#: ../src/remote.c:924
msgid "start full screen"
msgstr ""
-#: ../src/remote.c:868
+#: ../src/remote.c:925
msgid "stop full screen"
msgstr ""
-#: ../src/remote.c:869
+#: ../src/remote.c:926
msgid "toggle slide show"
msgstr ""
-#: ../src/remote.c:870
+#: ../src/remote.c:927
msgid "start slide show"
msgstr ""
-#: ../src/remote.c:871
+#: ../src/remote.c:928
msgid "stop slide show"
msgstr ""
-#: ../src/remote.c:872
+#: ../src/remote.c:929
msgid ""
msgstr ""
-#: ../src/remote.c:872
+#: ../src/remote.c:929
msgid "start recursive slide show in FOLDER"
msgstr ""
-#: ../src/remote.c:873
+#: ../src/remote.c:930
msgid "<[H:][M:][N][.M]>"
msgstr ""
-#: ../src/remote.c:873
+#: ../src/remote.c:930
msgid "set slide show delay to Hrs Mins N.M seconds"
msgstr ""
-#: ../src/remote.c:874
+#: ../src/remote.c:931
msgid "show tools"
msgstr ""
-#: ../src/remote.c:875
+#: ../src/remote.c:932
msgid "hide tools"
msgstr ""
-#: ../src/remote.c:876
+#: ../src/remote.c:933
msgid "quit"
msgstr ""
-#: ../src/remote.c:877 ../src/remote.c:878 ../src/remote.c:879
-#: ../src/remote.c:880 ../src/remote.c:881 ../src/remote.c:884
-#: ../src/remote.c:886
+#: ../src/remote.c:934 ../src/remote.c:935 ../src/remote.c:936
+#: ../src/remote.c:937 ../src/remote.c:938 ../src/remote.c:943
+#: ../src/remote.c:945
msgid ""
msgstr ""
-#: ../src/remote.c:877
+#: ../src/remote.c:934
msgid "load configuration from FILE"
msgstr ""
-#: ../src/remote.c:878
+#: ../src/remote.c:935
msgid "get list of sidecars of FILE"
msgstr ""
-#: ../src/remote.c:879
+#: ../src/remote.c:936
msgid "get destination path of FILE"
msgstr ""
-#: ../src/remote.c:880
+#: ../src/remote.c:937
msgid "open FILE, bring Geeqie window to the top"
msgstr ""
-#: ../src/remote.c:881
+#: ../src/remote.c:938
msgid "open FILE, do not bring Geeqie window to the top"
msgstr ""
-#: ../src/remote.c:882
+#: ../src/remote.c:939
msgid "print filename of current image"
msgstr ""
-#: ../src/remote.c:883
+#: ../src/remote.c:940
msgid "print pixel info of mouse pointer on current image"
msgstr ""
-#: ../src/remote.c:884
+#: ../src/remote.c:941
+msgid "get rectangle co-ordinates"
+msgstr ""
+
+#: ../src/remote.c:942
+msgid "get render intent"
+msgstr ""
+
+#: ../src/remote.c:943
msgid "open FILE in new window"
msgstr ""
-#: ../src/remote.c:885
+#: ../src/remote.c:944
msgid "clear command line collection list"
msgstr ""
-#: ../src/remote.c:886
+#: ../src/remote.c:945
msgid "add FILE to command line collection list"
msgstr ""
-#: ../src/remote.c:887
+#: ../src/remote.c:946
msgid "bring the Geeqie window to the top"
msgstr ""
-#: ../src/remote.c:888
+#: ../src/remote.c:947
msgid ""
msgstr ""
-#: ../src/remote.c:888
+#: ../src/remote.c:947
msgid "window id for following commands"
msgstr ""
-#: ../src/remote.c:889
+#: ../src/remote.c:948
msgid "new window"
msgstr ""
-#: ../src/remote.c:890
+#: ../src/remote.c:949
msgid "close window"
msgstr ""
-#: ../src/remote.c:891 ../src/remote.c:892
+#: ../src/remote.c:950 ../src/remote.c:951
msgid "clear|clean"
msgstr ""
-#: ../src/remote.c:891
+#: ../src/remote.c:950
msgid "clear or clean thumbnail cache"
msgstr ""
-#: ../src/remote.c:892
+#: ../src/remote.c:951
msgid "clear or clean shared thumbnail cache"
msgstr ""
-#: ../src/remote.c:893
+#: ../src/remote.c:952
msgid " clean the metadata cache"
msgstr ""
-#: ../src/remote.c:894
+#: ../src/remote.c:953
msgid " "
msgstr ""
-#: ../src/remote.c:894
+#: ../src/remote.c:953
msgid " render thumbnails"
msgstr ""
-#: ../src/remote.c:895 ../src/remote.c:896
+#: ../src/remote.c:954 ../src/remote.c:955
msgid " "
msgstr ""
-#: ../src/remote.c:895
+#: ../src/remote.c:954
msgid "render thumbnails recursively"
msgstr ""
-#: ../src/remote.c:896
+#: ../src/remote.c:955
msgid " render thumbnails (see Help)"
msgstr ""
-#: ../src/remote.c:897
+#: ../src/remote.c:956
msgid ""
msgstr ""
-#: ../src/remote.c:897
+#: ../src/remote.c:956
msgid " render thumbnails recursively (see Help)"
msgstr ""
-#: ../src/remote.c:899
+#: ../src/remote.c:958
msgid ","
msgstr ""
-#: ../src/remote.c:899
+#: ../src/remote.c:958
msgid "run lua script on FILE"
msgstr ""
-#: ../src/remote.c:965
+#: ../src/remote.c:1024
msgid "Remote command list:\n"
msgstr ""
-#: ../src/remote.c:984
+#: ../src/remote.c:1043
msgid ""
"\n"
" All other command line parameters are used as plain files if they exists.\n"
msgstr ""
-#: ../src/remote.c:1034
+#: ../src/remote.c:1093
#, c-format
msgid "Remote %s not running, starting..."
msgstr ""
-#: ../src/remote.c:1170
+#: ../src/remote.c:1229
msgid "Remote not available\n"
msgstr ""
-#: ../src/search.c:254
+#: ../src/search.c:257
msgid "folder"
msgstr ""
-#: ../src/search.c:255
+#: ../src/search.c:258
msgid "comments"
msgstr ""
-#: ../src/search.c:256
+#: ../src/search.c:259
msgid "results"
msgstr ""
-#: ../src/search.c:260 ../src/search.c:285
+#: ../src/search.c:263 ../src/search.c:288
msgid "contains"
msgstr ""
-#: ../src/search.c:261 ../src/search.c:304 ../src/search.c:309
+#: ../src/search.c:264 ../src/search.c:307 ../src/search.c:312
msgid "is"
msgstr ""
-#: ../src/search.c:265 ../src/search.c:272 ../src/search.c:291
-msgid "equal to"
-msgstr ""
-
-#: ../src/search.c:266 ../src/search.c:292 ../src/search.c:299
-msgid "less than"
-msgstr ""
-
-#: ../src/search.c:267 ../src/search.c:293 ../src/search.c:300
-msgid "greater than"
-msgstr ""
-
#: ../src/search.c:268 ../src/search.c:275 ../src/search.c:294
+msgid "equal to"
+msgstr ""
+
+#: ../src/search.c:269 ../src/search.c:295 ../src/search.c:302
+msgid "less than"
+msgstr ""
+
+#: ../src/search.c:270 ../src/search.c:296 ../src/search.c:303
+msgid "greater than"
+msgstr ""
+
+#: ../src/search.c:271 ../src/search.c:278 ../src/search.c:297
msgid "between"
msgstr ""
-#: ../src/search.c:273
+#: ../src/search.c:276
msgid "before"
msgstr ""
-#: ../src/search.c:274
+#: ../src/search.c:277
msgid "after"
msgstr ""
-#: ../src/search.c:279
+#: ../src/search.c:282
msgid "match all"
msgstr ""
-#: ../src/search.c:280
+#: ../src/search.c:283
msgid "match any"
msgstr ""
-#: ../src/search.c:281
+#: ../src/search.c:284
msgid "exclude"
msgstr ""
-#: ../src/search.c:286
+#: ../src/search.c:289
msgid "miss"
msgstr ""
-#: ../src/search.c:298
+#: ../src/search.c:301
msgid "not geocoded"
msgstr ""
-#: ../src/search.c:305 ../src/search.c:310
+#: ../src/search.c:308 ../src/search.c:313
msgid "is not"
msgstr ""
-#: ../src/search.c:361
+#: ../src/search.c:364
#, c-format
msgid "%s, %d files (%s, %d)"
msgstr ""
-#: ../src/search.c:366
+#: ../src/search.c:369
#, c-format
msgid "%s, %d files"
msgstr ""
-#: ../src/search.c:384
+#: ../src/search.c:387
msgid "Searching..."
msgstr ""
-#: ../src/search.c:1885
+#: ../src/search.c:1975
msgid "Changed"
msgstr ""
-#: ../src/search.c:1890 ../src/search.c:3114
+#: ../src/search.c:1980 ../src/search.c:3237
msgid "Original"
msgstr ""
-#: ../src/search.c:1896 ../src/search.c:3115
+#: ../src/search.c:1986 ../src/search.c:3238
msgid "Digitized"
msgstr "Digitised"
-#: ../src/search.c:2093 ../src/search.c:3240
+#: ../src/search.c:2183 ../src/search.c:3364
msgid "Raw Image"
msgstr ""
-#: ../src/search.c:2132 ../src/search.c:3255
+#: ../src/search.c:2222 ../src/search.c:3379
msgid "Any mark"
msgstr ""
-#: ../src/search.c:2188 ../src/search.c:3213
+#: ../src/search.c:2278 ../src/search.c:3337
msgid "km"
msgstr ""
-#: ../src/search.c:2193 ../src/search.c:3214
+#: ../src/search.c:2283 ../src/search.c:3338
msgid "miles"
msgstr ""
-#: ../src/search.c:2485
+#: ../src/search.c:2605
msgid "File not found"
msgstr ""
-#: ../src/search.c:2486
+#: ../src/search.c:2606
msgid "Please enter an existing file for image content."
msgstr ""
-#: ../src/search.c:2511
+#: ../src/search.c:2631
msgid "Entry does not contain a valid lat/long value"
msgstr ""
-#: ../src/search.c:2561
+#: ../src/search.c:2681
msgid "Please enter an existing folder to search."
msgstr ""
-#: ../src/search.c:3021
+#: ../src/search.c:3143
msgid "Image search"
msgstr ""
-#: ../src/search.c:3051
+#: ../src/search.c:3173
msgid "Search:"
msgstr ""
-#: ../src/search.c:3065
+#: ../src/search.c:3187
msgid "Recurse"
msgstr ""
-#: ../src/search.c:3070
+#: ../src/search.c:3192
msgid "File name"
msgstr ""
-#: ../src/search.c:3076 ../src/search.c:3184
+#: ../src/search.c:3198 ../src/search.c:3307
msgid "Match case"
msgstr ""
-#: ../src/search.c:3081
+#: ../src/search.c:3204
msgid "File size is"
msgstr ""
-#: ../src/search.c:3088 ../src/search.c:3105 ../src/search.c:3134
-#: ../src/search.c:3196
+#: ../src/search.c:3211 ../src/search.c:3228 ../src/search.c:3257
+#: ../src/search.c:3320
msgid "and"
msgstr ""
-#: ../src/search.c:3094
+#: ../src/search.c:3217
msgid "File date is"
msgstr ""
-#: ../src/search.c:3112
+#: ../src/search.c:3235
msgid "Modified"
msgstr ""
-#: ../src/search.c:3113
+#: ../src/search.c:3236
msgid "Status Changed"
msgstr ""
-#: ../src/search.c:3123
+#: ../src/search.c:3246
msgid "Image dimensions are"
msgstr ""
-#: ../src/search.c:3144
+#: ../src/search.c:3267
msgid "Image content is"
msgstr ""
-#: ../src/search.c:3150
+#: ../src/search.c:3273
#, no-c-format
msgid "% similar to"
msgstr ""
-#: ../src/search.c:3158
+#: ../src/search.c:3281
msgid "Ignore rotation"
msgstr ""
-#: ../src/search.c:3189
+#: ../src/search.c:3313
msgid "Image rating is"
msgstr ""
-#: ../src/search.c:3203
+#: ../src/search.c:3327
msgid "Image is"
msgstr ""
-#: ../src/search.c:3215
+#: ../src/search.c:3339
msgid "n.m."
msgstr ""
-#: ../src/search.c:3221
+#: ../src/search.c:3345
msgid "from"
msgstr ""
-#: ../src/search.c:3226
+#: ../src/search.c:3350
msgid ""
"Enter a coordinate in the form:\n"
"89.123 179.456\n"
@@ -5730,15 +5704,15 @@
"See the Help file"
msgstr ""
-#: ../src/search.c:3234
+#: ../src/search.c:3358
msgid "Image class"
msgstr ""
-#: ../src/search.c:3250
+#: ../src/search.c:3374
msgid "Marks"
msgstr ""
-#: ../src/search.c:3323
+#: ../src/search.c:3447
msgid "Rank"
msgstr ""
@@ -5786,56 +5760,85 @@
msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
msgstr ""
-#: ../src/toolbar.c:85
-msgid "Search"
-msgstr ""
-
-#: ../src/toolbar.c:90
-msgid "Configure this window"
-msgstr ""
-
-#: ../src/toolbar.c:91
-msgid "Cache maintenance"
+#: ../src/toolbar.c:87 ../src/ui_pathsel.c:752 ../src/ui_pathsel.c:1058
+#: ../src/utilops.c:2879
+msgid "New folder"
+msgstr ""
+
+#: ../src/toolbar.c:90 ../src/utilops.c:2375 ../src/utilops.c:2841
+msgid "Rename"
+msgstr ""
+
+#: ../src/toolbar.c:92
+msgid "Close Window"
msgstr ""
#: ../src/toolbar.c:96
-msgid "Fit Horizontaly"
+msgid "Select invert"
msgstr ""
#: ../src/toolbar.c:97
-msgid "Fit vertically"
+msgid "Show file filter"
+msgstr ""
+
+#: ../src/toolbar.c:98
+msgid "Select rectangle"
+msgstr ""
+
+#: ../src/toolbar.c:99
+msgid "Print"
+msgstr ""
+
+#: ../src/toolbar.c:101
+msgid "Configure this window"
msgstr ""
#: ../src/toolbar.c:102
-msgid "Zoom1:3"
-msgstr ""
-
-#: ../src/toolbar.c:107
-msgid "Slideshow Faster"
-msgstr ""
-
-#: ../src/toolbar.c:108
-msgid "Slideshow Slower"
-msgstr ""
-
-#: ../src/toolbar.c:110 ../src/window.c:287 ../src/window.c:308
-msgid "Help"
-msgstr ""
-
-#: ../src/toolbar.c:112
-msgid "Show thumbnails"
+msgid "Cache maintenance"
msgstr ""
#: ../src/toolbar.c:113
+msgid "Fit Horizontaly"
+msgstr ""
+
+#: ../src/toolbar.c:114
+msgid "Fit vertically"
+msgstr ""
+
+#: ../src/toolbar.c:119
+msgid "Zoom1:3"
+msgstr ""
+
+#: ../src/toolbar.c:124
+msgid "Slideshow Faster"
+msgstr ""
+
+#: ../src/toolbar.c:125
+msgid "Slideshow Slower"
+msgstr ""
+
+#: ../src/toolbar.c:127 ../src/window.c:287 ../src/window.c:308
+msgid "Help"
+msgstr ""
+
+#: ../src/toolbar.c:129
+msgid "Show thumbnails"
+msgstr ""
+
+#: ../src/toolbar.c:130
msgid "Show marks"
msgstr ""
-#: ../src/toolbar.c:503
+#: ../src/toolbar.c:131
+msgid "Show guidelines"
+msgstr ""
+
+#: ../src/toolbar.c:522
msgid "Add Toolbar Item"
msgstr ""
-#: ../src/trash.c:88 ../src/utilops.c:2645 ../src/utilops.c:2656
-#: ../src/utilops.c:2713
+#: ../src/trash.c:88 ../src/utilops.c:2653 ../src/utilops.c:2664
+#: ../src/utilops.c:2721
msgid "Delete failed"
msgstr ""
@@ -5843,15 +5846,15 @@
msgid "Unable to remove old file from trash folder"
msgstr "Unable to remove old file from Rubbish Bin folder"
-#: ../src/trash.c:146
+#: ../src/trash.c:148
msgid "Could not create folder"
msgstr ""
-#: ../src/trash.c:168
+#: ../src/trash.c:170
msgid "Permission denied"
msgstr ""
-#: ../src/trash.c:178
+#: ../src/trash.c:180
#, c-format
msgid ""
"Unable to access or create the trash folder.\n"
@@ -5860,32 +5863,28 @@
"Unable to access or create the Rubbish Bin folder.\n"
"\"%s\""
-#: ../src/trash.c:182
-msgid "Turn off safe delete"
-msgstr ""
-
-#: ../src/trash.c:201
+#: ../src/trash.c:210
msgid "Deletion by external command"
msgstr ""
-#: ../src/trash.c:209
+#: ../src/trash.c:220
#, c-format
msgid " (max. %d MB)"
msgstr ""
-#: ../src/trash.c:213
+#. ~ buf = g_strdup_printf(_("Safe delete: %s%s\nTrash: %s"), _("on"), buf2, options->file_ops.safe_delete_path);
+#: ../src/trash.c:225
#, c-format
msgid ""
-"Safe delete: %s%s\n"
-"Trash: %s"
-msgstr ""
-"Safe delete: %s%s\n"
-"Rubbish Bin: %s"
-
-#: ../src/trash.c:218
-#, c-format
-msgid "Safe delete: %s"
-msgstr ""
+"Using Geeqie Trash bin\n"
+"%s"
+msgstr ""
+"Using Geeqie Rubbish bin\n"
+"%s"
+
+#: ../src/trash.c:230
+msgid "Using system Trash bin"
+msgstr "Using system Rubbish bin"
#: ../src/ui_bookmark.c:139 ../src/ui_bookmark.c:202
msgid "New Bookmark"
@@ -5979,8 +5978,13 @@
"%s"
msgstr ""
-#: ../src/ui_pathsel.c:433 ../src/ui_pathsel.c:439 ../src/utilops.c:2344
-#: ../src/utilops.c:2371 ../src/utilops.c:2837
+#: ../src/ui_pathsel.c:432
+#, c-format
+msgid "A file with name %s already exists."
+msgstr ""
+
+#: ../src/ui_pathsel.c:433 ../src/ui_pathsel.c:439 ../src/utilops.c:2352
+#: ../src/utilops.c:2379 ../src/utilops.c:2845
msgid "Rename failed"
msgstr ""
@@ -5997,14 +6001,6 @@
msgid "Add _Bookmark"
msgstr ""
-#: ../src/ui_pathsel.c:644
-msgid "_Delete"
-msgstr ""
-
-#: ../src/ui_pathsel.c:752 ../src/ui_pathsel.c:1058 ../src/utilops.c:2871
-msgid "New folder"
-msgstr ""
-
#: ../src/ui_pathsel.c:762
#, c-format
msgid ""
@@ -6028,11 +6024,11 @@
msgid "Filter:"
msgstr ""
-#: ../src/ui_tabcomp.c:941
+#: ../src/ui_tabcomp.c:942
msgid "Select path"
msgstr ""
-#: ../src/ui_tabcomp.c:963
+#: ../src/ui_tabcomp.c:964
msgid "All files"
msgstr ""
@@ -6195,121 +6191,121 @@
msgid "The following metadata tags will be written to the image file itself."
msgstr ""
-#: ../src/utilops.c:2181
+#: ../src/utilops.c:2182
+msgid "This will move the following files to the Trash bin"
+msgstr "This will move the following files to the Rubbish bin"
+
+#: ../src/utilops.c:2186
+msgid "This will permanently delete the following files"
+msgstr ""
+
+#: ../src/utilops.c:2189
msgid "Delete files?"
msgstr ""
-#: ../src/utilops.c:2182
-msgid "This will delete the following files"
-msgstr ""
-
-#: ../src/utilops.c:2201
+#: ../src/utilops.c:2209
msgid "Can't write metadata"
msgstr ""
-#: ../src/utilops.c:2224
+#: ../src/utilops.c:2232
msgid "Write metadata"
msgstr ""
-#: ../src/utilops.c:2225
+#: ../src/utilops.c:2233
msgid "Write metadata?"
msgstr ""
-#: ../src/utilops.c:2226
+#: ../src/utilops.c:2234
msgid "This will write the changed metadata into the following files"
msgstr ""
-#: ../src/utilops.c:2228
+#: ../src/utilops.c:2236
msgid "Metadata writing failed"
msgstr ""
-#: ../src/utilops.c:2247 ../src/utilops.c:2275
+#: ../src/utilops.c:2255 ../src/utilops.c:2283
msgid "Move failed"
msgstr ""
-#: ../src/utilops.c:2272
+#: ../src/utilops.c:2280
msgid "Move files?"
msgstr ""
-#: ../src/utilops.c:2273
+#: ../src/utilops.c:2281
msgid "This will move the following files"
msgstr ""
-#: ../src/utilops.c:2297 ../src/utilops.c:2325
+#: ../src/utilops.c:2305 ../src/utilops.c:2333
msgid "Copy failed"
msgstr ""
-#: ../src/utilops.c:2322
+#: ../src/utilops.c:2330
msgid "Copy files?"
msgstr ""
-#: ../src/utilops.c:2323 ../src/utilops.c:2457
+#: ../src/utilops.c:2331 ../src/utilops.c:2465
msgid "This will copy the following files"
msgstr ""
-#: ../src/utilops.c:2367 ../src/utilops.c:2833
-msgid "Rename"
-msgstr ""
-
-#: ../src/utilops.c:2368
+#: ../src/utilops.c:2376
msgid "Rename files?"
msgstr ""
-#: ../src/utilops.c:2369
+#: ../src/utilops.c:2377
msgid "This will rename the following files"
msgstr ""
-#: ../src/utilops.c:2421
+#: ../src/utilops.c:2429
msgid "Can't run external editor"
msgstr ""
-#: ../src/utilops.c:2455
+#: ../src/utilops.c:2463
msgid "Editor"
msgstr ""
-#: ../src/utilops.c:2456
+#: ../src/utilops.c:2464
msgid "Run editor?"
msgstr ""
-#: ../src/utilops.c:2459
+#: ../src/utilops.c:2467
msgid "External command failed"
msgstr ""
-#: ../src/utilops.c:2628 ../src/utilops.c:2701
+#: ../src/utilops.c:2636 ../src/utilops.c:2709
msgid "Delete folder"
msgstr ""
-#: ../src/utilops.c:2629
+#: ../src/utilops.c:2637
msgid "Delete symbolic link?"
msgstr ""
-#: ../src/utilops.c:2631
+#: ../src/utilops.c:2639
msgid ""
"This will delete the symbolic link.\n"
"The folder this link points to will not be deleted."
msgstr ""
-#: ../src/utilops.c:2633
+#: ../src/utilops.c:2641
msgid "Link deletion failed"
msgstr ""
-#: ../src/utilops.c:2643
+#: ../src/utilops.c:2651
#, c-format
msgid ""
"Unable to remove folder %s\n"
"Permissions do not allow writing to the folder."
msgstr ""
-#: ../src/utilops.c:2655 ../src/utilops.c:2712
+#: ../src/utilops.c:2663 ../src/utilops.c:2720
#, c-format
msgid "Unable to list contents of folder %s"
msgstr ""
-#: ../src/utilops.c:2669 ../src/utilops.c:2677
+#: ../src/utilops.c:2677 ../src/utilops.c:2685
msgid "Folder contains subfolders"
msgstr ""
-#: ../src/utilops.c:2673
+#: ../src/utilops.c:2681
#, c-format
msgid ""
"Unable to delete the folder:\n"
@@ -6319,140 +6315,136 @@
"This folder contains subfolders which must be moved before it can be deleted."
msgstr ""
-#: ../src/utilops.c:2681
+#: ../src/utilops.c:2689
msgid "Subfolders:"
msgstr ""
-#: ../src/utilops.c:2702
+#: ../src/utilops.c:2710
msgid "Delete folder?"
msgstr ""
-#: ../src/utilops.c:2703
+#: ../src/utilops.c:2711
msgid "The folder contains these files:"
msgstr ""
-#: ../src/utilops.c:2704
+#: ../src/utilops.c:2712
msgid ""
"This will delete the folder.\n"
"The contents of this folder will also be deleted."
msgstr ""
-#: ../src/utilops.c:2834
+#: ../src/utilops.c:2842
msgid "Rename folder?"
msgstr ""
-#: ../src/utilops.c:2835
+#: ../src/utilops.c:2843
msgid "The folder contains the following files"
msgstr ""
-#: ../src/utilops.c:2881
+#: ../src/utilops.c:2889
msgid "Create Folder"
msgstr ""
-#: ../src/utilops.c:2882
+#: ../src/utilops.c:2890
msgid "Create folder?"
msgstr ""
-#: ../src/utilops.c:2885
+#: ../src/utilops.c:2893
msgid "Can't create folder"
msgstr ""
-#: ../src/view_dir.c:406
+#: ../src/view_dir.c:409
msgid "_Copy"
msgstr ""
-#: ../src/view_dir.c:408
+#: ../src/view_dir.c:411
msgid "_Move"
msgstr ""
-#: ../src/view_dir.c:662
+#: ../src/view_dir.c:665
msgid "_Up to parent"
msgstr ""
-#: ../src/view_dir.c:667
+#: ../src/view_dir.c:670
msgid "_Slideshow"
msgstr ""
-#: ../src/view_dir.c:669
+#: ../src/view_dir.c:672
msgid "Slideshow recursive"
msgstr ""
-#: ../src/view_dir.c:673
+#: ../src/view_dir.c:676
msgid "Find _duplicates..."
msgstr ""
-#: ../src/view_dir.c:675
+#: ../src/view_dir.c:678
msgid "Find duplicates recursive..."
msgstr ""
-#: ../src/view_dir.c:680
+#: ../src/view_dir.c:683
msgid "_New folder..."
msgstr ""
-#: ../src/view_dir.c:697 ../src/view_file/view_file.c:664
+#: ../src/view_dir.c:700 ../src/view_file/view_file.c:672
msgid "View as _List"
msgstr ""
-#: ../src/view_dir.c:700
+#: ../src/view_dir.c:703
msgid "View as _Tree"
msgstr ""
-#: ../src/view_dir.c:705
+#: ../src/view_dir.c:708
msgid "Show _hidden files"
msgstr ""
-#: ../src/view_dir.c:708 ../src/view_file/view_file.c:694
+#: ../src/view_dir.c:711 ../src/view_file/view_file.c:702
msgid "Re_fresh"
msgstr ""
-#: ../src/view_file/view_file.c:667
+#: ../src/view_file/view_file.c:675
msgid "View as _Icons"
msgstr ""
-#: ../src/view_file/view_file.c:673
+#: ../src/view_file/view_file.c:681
msgid "Show _thumbnails"
msgstr ""
-#: ../src/view_file/view_file.c:685 ../src/view_file/view_file.c:689
-msgid "Show star rating"
-msgstr ""
-
-#: ../src/view_file/view_file.c:809
+#: ../src/view_file/view_file.c:817
msgid "Mark text"
msgstr ""
-#: ../src/view_file/view_file.c:812
+#: ../src/view_file/view_file.c:820
msgid "Set mark text"
msgstr ""
-#: ../src/view_file/view_file.c:813
+#: ../src/view_file/view_file.c:821
msgid "This will set or clear the mark text."
msgstr ""
-#: ../src/view_file/view_file.c:1273
+#: ../src/view_file/view_file.c:1448
msgid "Loading meta..."
msgstr ""
-#: ../src/view_file/view_file_icon.c:2022 ../src/view_file/view_file_list.c:910
+#: ../src/view_file/view_file_icon.c:2031 ../src/view_file/view_file_list.c:919
msgid " [NO GROUPING]"
msgstr ""
-#: ../src/view_file/view_file_list.c:511
+#: ../src/view_file/view_file_list.c:513
#, c-format
msgid ""
"Invalid file name:\n"
"%s"
msgstr ""
-#: ../src/view_file/view_file_list.c:512
+#: ../src/view_file/view_file_list.c:514
msgid "Error renaming file"
msgstr ""
-#: ../src/view_file/view_file_list.c:2063
+#: ../src/view_file/view_file_list.c:2074
msgid "NameStars"
msgstr ""
-#: ../src/view_file/view_file_list.c:2067
+#: ../src/view_file/view_file_list.c:2078
msgid "Stars"
msgstr ""
@@ -6467,3 +6459,16 @@
#: ../src/window.c:387
msgid "Search terms:"
msgstr ""
+
+#~ msgid ""
+#~ "Safe delete: %s%s\n"
+#~ "Trash: %s"
+#~ msgstr ""
+#~ "Safe delete: %s%s\n"
+#~ "Rubbish Bin: %s"
+
+#~ msgid "millimeters"
+#~ msgstr "millimetres"
+
+#~ msgid "centimeters"
+#~ msgstr "centimetres"
diff -r c79d70e18076 -r 49bd0d974e88 src/Makefile.am
--- a/src/Makefile.am Tue Oct 02 22:50:14 2018 +0300
+++ b/src/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -222,6 +222,8 @@
misc.h \
options.c \
options.h \
+ osd.c \
+ osd.h \
pan-view.h \
pixbuf-renderer.c \
pixbuf-renderer.h \
diff -r c79d70e18076 -r 49bd0d974e88 src/bar_exif.c
--- a/src/bar_exif.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/bar_exif.c Wed Dec 12 21:56:30 2018 +0200
@@ -709,6 +709,7 @@
write_char_option(outstr, indent, "id", ped->pane.id);
write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(ped->pane.title)));
WRITE_BOOL(ped->pane, expanded);
+ WRITE_BOOL(*ped, show_all);
WRITE_STRING(">");
indent++;
@@ -802,7 +803,7 @@
#endif
}
-static GtkWidget *bar_pane_exif_new(const gchar *id, const gchar *title, gboolean expanded)
+static GtkWidget *bar_pane_exif_new(const gchar *id, const gchar *title, gboolean expanded, gboolean show_all)
{
PaneExifData *ped;
@@ -815,6 +816,7 @@
ped->pane.id = g_strdup(id);
ped->pane.expanded = expanded;
ped->pane.type = PANE_EXIF;
+ ped->show_all = show_all;
ped->size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
ped->widget = gtk_event_box_new();
@@ -850,6 +852,7 @@
gchar *title = NULL;
gchar *id = g_strdup("exif");
gboolean expanded = TRUE;
+ gboolean show_all = FALSE;
GtkWidget *ret;
while (*attribute_names)
@@ -860,12 +863,13 @@
if (READ_CHAR_FULL("id", id)) continue;
if (READ_CHAR_FULL("title", title)) continue;
if (READ_BOOL_FULL("expanded", expanded)) continue;
+ if (READ_BOOL_FULL("show_all", show_all)) continue;
log_printf("unknown attribute %s = %s\n", option, value);
}
bar_pane_translate_title(PANE_EXIF, id, &title);
- ret = bar_pane_exif_new(id, title, expanded);
+ ret = bar_pane_exif_new(id, title, expanded, show_all);
g_free(title);
g_free(id);
return ret;
@@ -886,6 +890,7 @@
if (READ_CHAR_FULL("title", title)) continue;
if (READ_BOOL_FULL("expanded", ped->pane.expanded)) continue;
+ if (READ_BOOL_FULL("show_all", ped->show_all)) continue;
if (READ_CHAR_FULL("id", ped->pane.id)) continue;
diff -r c79d70e18076 -r 49bd0d974e88 src/bar_sort.c
--- a/src/bar_sort.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/bar_sort.c Wed Dec 12 21:56:30 2018 +0200
@@ -260,6 +260,7 @@
work = g_list_append(work, file_data_new_group(delete_list->data));
delete_list = delete_list->next;
}
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, work, button);
}
break;
diff -r c79d70e18076 -r 49bd0d974e88 src/collect-table.c
--- a/src/collect-table.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/collect-table.c Wed Dec 12 21:56:30 2018 +0200
@@ -34,6 +34,7 @@
#include "layout_image.h"
#include "menu.h"
#include "metadata.h"
+#include "pixbuf_util.h"
#include "print.h"
#include "utilops.h"
#include "ui_fileops.h"
@@ -733,6 +734,15 @@
{
CollectTable *ct = data;
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(NULL, collection_table_popup_file_list(ct), ct->listview);
+}
+
+static void collection_table_popup_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ CollectTable *ct = data;
+
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, collection_table_popup_file_list(ct), ct->listview);
}
@@ -994,10 +1004,18 @@
G_CALLBACK(collection_table_popup_copy_path_cb), ct);
menu_item_add_sensitive(menu, _("_Copy path unquoted"), over_icon,
G_CALLBACK(collection_table_popup_copy_path_unquoted_cb), ct);
- menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, over_icon,
- G_CALLBACK(collection_table_popup_delete_cb), ct);
+
menu_item_add_divider(menu);
-
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH, over_icon,
+ G_CALLBACK(collection_table_popup_move_to_trash_cb), ct);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE, over_icon,
+ G_CALLBACK(collection_table_popup_delete_cb), ct);
+
+ menu_item_add_divider(menu);
submenu = submenu_add_sort(NULL, G_CALLBACK(collection_table_popup_sort_cb), ct, FALSE, TRUE, FALSE, 0);
menu_item_add_divider(submenu);
menu_item_add(submenu, _("Randomize"),
diff -r c79d70e18076 -r 49bd0d974e88 src/collect.c
--- a/src/collect.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/collect.c Wed Dec 12 21:56:30 2018 +0200
@@ -923,6 +923,7 @@
file_util_rename(NULL, collection_table_selection_get_list(cw->table), cw->window);
break;
case 'D': case 'd':
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, collection_table_selection_get_list(cw->table), cw->window);
break;
case 'S': case 's':
diff -r c79d70e18076 -r 49bd0d974e88 src/desktop_file.c
--- a/src/desktop_file.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/desktop_file.c Wed Dec 12 21:56:30 2018 +0200
@@ -414,6 +414,7 @@
{
gint n = GPOINTER_TO_INT(data);
gint ret = 0;
+ gboolean bool1, bool2;
switch (n)
{
@@ -441,6 +442,25 @@
g_free(s2);
}
break;
+ case DESKTOP_FILE_COLUMN_DISABLED:
+ {
+ gtk_tree_model_get(model, a, n, &bool1, -1);
+ gtk_tree_model_get(model, b, n, &bool2, -1);
+
+ if (bool1 == bool2)
+ {
+ ret = 0;
+ }
+ else if (bool1 > bool2)
+ {
+ ret = -1;
+ }
+ else
+ {
+ ret = 1;
+ }
+ break;
+ }
default:
g_return_val_if_reached(0);
@@ -449,6 +469,67 @@
return ret;
}
+static void plugin_disable_cb(GtkCellRendererToggle *renderer, gchar *path_str, gpointer data)
+{
+ EditorListWindow *ewl = data;
+ GtkTreePath *tpath;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gboolean disabled;
+ gchar *path;
+ GList *list;
+ gchar *haystack;
+
+ tpath = gtk_tree_path_new_from_string(path_str);
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, DESKTOP_FILE_COLUMN_DISABLED, &disabled, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, DESKTOP_FILE_COLUMN_PATH, &path, -1);
+
+ gtk_list_store_set(GTK_LIST_STORE(desktop_file_list), &iter, DESKTOP_FILE_COLUMN_DISABLED, !disabled, -1);
+
+ if (!disabled)
+ {
+ options->disabled_plugins = g_list_append((options->disabled_plugins), g_strdup(path));
+ }
+ else
+ {
+ list = options->disabled_plugins;
+ while (list)
+ {
+ haystack = list->data;
+
+ if (haystack && strcmp(haystack, path) == 0)
+ {
+ g_free(haystack);
+ options->disabled_plugins = g_list_remove(options->disabled_plugins, haystack);
+ }
+
+ list = list->next;
+ }
+ }
+
+ layout_editors_reload_start();
+ layout_editors_reload_finish();
+}
+
+static void plugin_disable_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+ GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+ gboolean disabled;
+
+ gtk_tree_model_get(tree_model, iter, DESKTOP_FILE_COLUMN_DISABLED, &disabled, -1);
+
+ if (disabled)
+ {
+ g_object_set(GTK_CELL_RENDERER(cell), "active", TRUE, NULL);
+ }
+ else
+ {
+ g_object_set(GTK_CELL_RENDERER(cell), "active", FALSE, NULL);
+ }
+}
+
static void editor_list_window_create(void)
{
GtkWidget *win_vbox;
@@ -532,6 +613,19 @@
gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ewl->view), FALSE);
column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Disabled"));
+ gtk_tree_view_column_set_resizable(column, TRUE);
+
+ renderer = gtk_cell_renderer_toggle_new();
+ g_signal_connect(G_OBJECT(renderer), "toggled",
+ G_CALLBACK(plugin_disable_cb), ewl);
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_cell_data_func(column, renderer, plugin_disable_set_func,
+ NULL, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
+ gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_DISABLED);
+
+ column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(column, _("Name"));
gtk_tree_view_column_set_resizable(column, TRUE);
renderer = gtk_cell_renderer_text_new();
@@ -579,6 +673,8 @@
GINT_TO_POINTER(DESKTOP_FILE_COLUMN_NAME), NULL);
gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_PATH, editor_list_window_sort_cb,
GINT_TO_POINTER(DESKTOP_FILE_COLUMN_PATH), NULL);
+ gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_DISABLED, editor_list_window_sort_cb,
+ GINT_TO_POINTER(DESKTOP_FILE_COLUMN_DISABLED), NULL);
/* set initial sort order */
gtk_tree_sortable_set_sort_column_id(sortable, DESKTOP_FILE_COLUMN_NAME, GTK_SORT_ASCENDING);
diff -r c79d70e18076 -r 49bd0d974e88 src/dupe.c
--- a/src/dupe.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/dupe.c Wed Dec 12 21:56:30 2018 +0200
@@ -36,6 +36,7 @@
#include "md5-util.h"
#include "menu.h"
#include "misc.h"
+#include "pixbuf_util.h"
#include "print.h"
#include "thumb.h"
#include "ui_fileops.h"
@@ -2249,6 +2250,15 @@
{
DupeWindow *dw = data;
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(NULL, dupe_listview_get_selection(dw, dw->listview), dw->window);
+}
+
+static void dupe_menu_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ DupeWindow *dw = data;
+
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, dupe_listview_get_selection(dw, dw->listview), dw->window);
}
@@ -2379,8 +2389,17 @@
G_CALLBACK(dupe_menu_copy_path_cb), dw);
menu_item_add_sensitive(menu, _("_Copy path unquoted"), on_row,
G_CALLBACK(dupe_menu_copy_path_unquoted_cb), dw);
- menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, on_row,
+
+ menu_item_add_divider(menu);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH, on_row,
+ G_CALLBACK(dupe_menu_move_to_trash_cb), dw);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE, on_row,
G_CALLBACK(dupe_menu_delete_cb), dw);
+
menu_item_add_divider(menu);
menu_item_add_stock_sensitive(menu, _("Rem_ove"), GTK_STOCK_REMOVE, on_row,
G_CALLBACK(dupe_menu_remove_cb), dw);
@@ -3069,6 +3088,7 @@
file_util_rename(NULL, dupe_listview_get_selection(dw, listview), dw->window);
break;
case 'D': case 'd':
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, dupe_listview_get_selection(dw, listview), dw->window);
break;
default:
diff -r c79d70e18076 -r 49bd0d974e88 src/editors.c
--- a/src/editors.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/editors.c Wed Dec 12 21:56:30 2018 +0200
@@ -185,6 +185,8 @@
gchar *try_exec;
GtkTreeIter iter;
gboolean category_geeqie = FALSE;
+ GList *work;
+ gboolean disabled;
if (g_hash_table_lookup(editors, key)) return FALSE; /* the file found earlier wins */
@@ -353,9 +355,25 @@
if (editor->ignored) return TRUE;
+ work = options->disabled_plugins;
+
+ disabled = FALSE;
+ while (work)
+ {
+ if (g_strcmp0(path, work->data) == 0)
+ {
+ disabled = TRUE;
+ break;
+ }
+ work = work->next;
+ }
+
+ editor->disabled = disabled;
+
gtk_list_store_append(desktop_file_list, &iter);
gtk_list_store_set(desktop_file_list, &iter,
DESKTOP_FILE_COLUMN_KEY, key,
+ DESKTOP_FILE_COLUMN_DISABLED, editor->disabled,
DESKTOP_FILE_COLUMN_NAME, editor->name,
DESKTOP_FILE_COLUMN_HIDDEN, editor->hidden ? _("yes") : _("no"),
DESKTOP_FILE_COLUMN_WRITABLE, access_file(path, W_OK),
@@ -384,7 +402,7 @@
}
else
{
- desktop_file_list = gtk_list_store_new(DESKTOP_FILE_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
+ desktop_file_list = gtk_list_store_new(DESKTOP_FILE_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
}
if (editors)
{
@@ -471,6 +489,11 @@
strcmp(editor->key, CMD_DELETE) == 0 ||
strcmp(editor->key, CMD_FOLDER) == 0) return;
+ if (editor->disabled)
+ {
+ return;
+ }
+
*listp = g_list_prepend(*listp, editor);
}
diff -r c79d70e18076 -r 49bd0d974e88 src/editors.h
--- a/src/editors.h Tue Oct 02 22:50:14 2018 +0300
+++ b/src/editors.h Wed Dec 12 21:56:30 2018 +0200
@@ -58,6 +58,7 @@
EditorFlags flags;
gboolean hidden; /* explicitly hidden, shown in configuration dialog */
gboolean ignored; /* not interesting, do not show at all */
+ gboolean disabled; /* display disabled by user */
};
#define EDITOR_ERRORS(flags) ((flags) & EDITOR_ERROR_MASK)
@@ -74,6 +75,7 @@
enum {
DESKTOP_FILE_COLUMN_KEY,
+ DESKTOP_FILE_COLUMN_DISABLED,
DESKTOP_FILE_COLUMN_NAME,
DESKTOP_FILE_COLUMN_HIDDEN,
DESKTOP_FILE_COLUMN_WRITABLE,
diff -r c79d70e18076 -r 49bd0d974e88 src/exif-common.c
--- a/src/exif-common.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/exif-common.c Wed Dec 12 21:56:30 2018 +0200
@@ -662,7 +662,7 @@
/**
* @brief Gets timezone data from an exif structure
* @param[in] exif
- * @returns TRUE if timezone data found
+ * @returns TRUE if timezone data found AND GPS date and time found
* @param[out] exif_date_time exif date/time in the form 2018:11:30:17:05:04
* @param[out] timezone in the form "Europe/London"
* @param[out] countryname in the form "United Kingdom"
@@ -696,11 +696,8 @@
text_date = exif_get_data_as_text(exif, "Exif.GPSInfo.GPSDateStamp");
text_time = exif_get_data_as_text(exif, "Exif.GPSInfo.GPSTimeStamp");
- if (text_latitude && text_longitude && text_latitude_ref &&
- text_longitude_ref && text_date && text_time)
+ if (text_latitude && text_longitude && text_latitude_ref && text_longitude_ref)
{
- *exif_date_time = g_strconcat(text_date, ":", text_time, NULL);
-
lat_deg = strtok(text_latitude, "deg'");
lat_min = strtok(NULL, "deg'");
latitude = atof(lat_deg) + atof(lat_min) / 60;
@@ -738,6 +735,14 @@
g_free(zd_path);
}
+ if (ret && text_date && text_time)
+ {
+ *exif_date_time = g_strconcat(text_date, ":", text_time, NULL);
+ }
+ else
+ {
+ ret = FALSE;
+ }
return ret;
}
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/Makefile.am
--- a/src/icons/Makefile.am Tue Oct 02 22:50:14 2018 +0300
+++ b/src/icons/Makefile.am Wed Dec 12 21:56:30 2018 +0200
@@ -40,8 +40,14 @@
icon_select_none.png \
icon_select_invert.png \
icon_select_rectangle.png \
- icon_file_filter.png
-
+ icon_file_filter.png \
+ icon_rotate_clockwise.png \
+ icon_rotate_counter_clockwise.png \
+ icon_rotate_180.png \
+ icon_mirror.png \
+ icon_flip.png \
+ icon_original.png \
+ icon_trash.png
ICONS_INLINE_PAIRS = \
folder_closed $(srcdir)/folder_closed.png \
@@ -80,7 +86,14 @@
icon_select_none $(srcdir)/icon_select_none.png \
icon_select_invert $(srcdir)/icon_select_invert.png \
icon_select_rectangle $(srcdir)/icon_select_rectangle.png \
- icon_file_filter $(srcdir)/icon_file_filter.png
+ icon_file_filter $(srcdir)/icon_file_filter.png \
+ icon_rotate_clockwise $(srcdir)/icon_rotate_clockwise.png \
+ icon_rotate_counter_clockwise $(srcdir)/icon_rotate_counter_clockwise.png \
+ icon_rotate_180 $(srcdir)/icon_rotate_180.png \
+ icon_mirror $(srcdir)/icon_mirror.png \
+ icon_flip $(srcdir)/icon_flip.png \
+ icon_original $(srcdir)/icon_original.png \
+ icon_trash $(srcdir)/icon_trash.png
icons_inline.h: $(ICONS_INLINE) Makefile.in
@sh -ec "echo '/* Auto generated file, do not edit */'; echo; \
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_flip.png
Binary file src/icons/icon_flip.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_mirror.png
Binary file src/icons/icon_mirror.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_original.png
Binary file src/icons/icon_original.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_rotate_180.png
Binary file src/icons/icon_rotate_180.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_rotate_clockwise.png
Binary file src/icons/icon_rotate_clockwise.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_rotate_counter_clockwise.png
Binary file src/icons/icon_rotate_counter_clockwise.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/icons/icon_trash.png
Binary file src/icons/icon_trash.png has changed
diff -r c79d70e18076 -r 49bd0d974e88 src/image-overlay.c
--- a/src/image-overlay.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/image-overlay.c Wed Dec 12 21:56:30 2018 +0200
@@ -22,19 +22,16 @@
#include "main.h"
#include "image-overlay.h"
-#include "collect.h"
-#include "exif.h"
#include "filedata.h"
#include "histogram.h"
#include "image.h"
#include "img-view.h"
#include "layout.h"
-#include "metadata.h"
+#include "osd.h"
#include "pixbuf-renderer.h"
#include "pixbuf_util.h"
#include "ui_fileops.h"
#include "image-load.h"
-#include "glua.h"
/*
*----------------------------------------------------------------------------
@@ -232,287 +229,6 @@
}
}
-static gchar *keywords_to_string(FileData *fd)
-{
- GList *keywords;
- GString *kwstr = NULL;
- gchar *ret = NULL;
-
- g_assert(fd);
-
- keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
-
- if (keywords)
- {
- GList *work = keywords;
-
- while (work)
- {
- gchar *kw = work->data;
- work = work->next;
-
- if (!kw) continue;
- if (!kwstr)
- kwstr = g_string_new("");
- else
- g_string_append(kwstr, ", ");
-
- g_string_append(kwstr, kw);
- }
- string_list_free(keywords);
- }
-
- if (kwstr)
- {
- ret = kwstr->str;
- g_string_free(kwstr, FALSE);
- }
-
- return ret;
-}
-
-static gchar *image_osd_mkinfo(const gchar *str, ImageWindow *imd, GHashTable *vars)
-{
- gchar delim = '%', imp = '|', sep[] = " - ";
- gchar *start, *end;
- guint pos, prev;
- gboolean want_separator = FALSE;
- gchar *name, *data;
- GString *new;
- gchar *ret;
-
- if (!str || !*str) return g_strdup("");
-
- new = g_string_new(str);
-
- prev = -1;
-
- while (TRUE)
- {
- guint limit = 0;
- gchar *trunc = NULL;
- gchar *limpos = NULL;
- gchar *extra = NULL;
- gchar *extrapos = NULL;
- gchar *p;
-
- start = strchr(new->str + (prev + 1), delim);
- if (!start)
- break;
- end = strchr(start+1, delim);
- if (!end)
- break;
-
- /* Search for optionnal modifiers
- * %name:99:extra% -> name = "name", limit=99, extra = "extra"
- */
- for (p = start + 1; p < end; p++)
- {
- if (p[0] == ':')
- {
- if (g_ascii_isdigit(p[1]) && !limpos)
- {
- limpos = p + 1;
- if (!trunc) trunc = p;
- }
- else
- {
- extrapos = p + 1;
- if (!trunc) trunc = p;
- break;
- }
- }
- }
-
- if (limpos)
- limit = (guint) atoi(limpos);
-
- if (extrapos)
- extra = g_strndup(extrapos, end - extrapos);
-
- name = g_strndup(start+1, (trunc ? trunc : end)-start-1);
- pos = start - new->str;
- data = NULL;
-
- if (strcmp(name, "keywords") == 0)
- {
- data = keywords_to_string(imd->image_fd);
- }
- else if (strcmp(name, "comment") == 0)
- {
- data = metadata_read_string(imd->image_fd, COMMENT_KEY, METADATA_PLAIN);
- }
- else if (strcmp(name, "imagecomment") == 0)
- {
- data = exif_get_image_comment(imd->image_fd);
- }
- else if (strcmp(name, "rating") == 0)
- {
- data = metadata_read_string(imd->image_fd, RATING_KEY, METADATA_PLAIN);
- }
-#ifdef HAVE_LUA
- else if (strncmp(name, "lua/", 4) == 0)
- {
- gchar *tmp;
- tmp = strchr(name+4, '/');
- if (!tmp)
- break;
- *tmp = '\0';
- data = lua_callvalue(imd->image_fd, name+4, tmp+1);
- }
-#endif
- else
- {
- data = g_strdup(g_hash_table_lookup(vars, name));
- if (!data)
- data = metadata_read_string(imd->image_fd, name, METADATA_FORMATTED);
- }
-
- if (data && *data && limit > 0 && strlen(data) > limit + 3)
- {
- gchar *new_data = g_strdup_printf("%-*.*s...", limit, limit, data);
- g_free(data);
- data = new_data;
- }
-
- if (data)
- {
- /* Since we use pango markup to display, we need to escape here */
- gchar *escaped = g_markup_escape_text(data, -1);
- g_free(data);
- data = escaped;
- }
-
- if (extra)
- {
- if (data && *data)
- {
- /* Display data between left and right parts of extra string
- * the data is expressed by a '*' character. A '*' may be escaped
- * by a \. You should escape all '*' characters, do not rely on the
- * current implementation which only replaces the first unescaped '*'.
- * If no "*" is present, the extra string is just appended to data string.
- * Pango mark up is accepted in left and right parts.
- * Any \n is replaced by a newline
- * Examples:
- * "*\n" -> data is displayed in italics ended with a newline
- * "\n" -> ended with newline
- * "ISO *" -> prefix data with "ISO " (ie. "ISO 100")
- * "\**\*" -> prefix data with a star, and append a star (ie. "*100*")
- * "\\*" -> prefix data with an anti slash (ie "\100")
- * "Collection *\n" -> display data in bold prefixed by "Collection " and a newline is appended
- *
- * FIXME: using background / foreground colors lead to weird results.
- */
- gchar *new_data;
- gchar *left = NULL;
- gchar *right = extra;
- gchar *p;
- guint len = strlen(extra);
-
- /* Search for left and right parts and unescape characters */
- for (p = extra; *p; p++, len--)
- if (p[0] == '\\')
- {
- if (p[1] == 'n')
- {
- memmove(p+1, p+2, --len);
- p[0] = '\n';
- }
- else if (p[1] != '\0')
- memmove(p, p+1, len--); // includes \0
- }
- else if (p[0] == '*' && !left)
- {
- right = p + 1;
- left = extra;
- }
-
- if (left) right[-1] = '\0';
-
- new_data = g_strdup_printf("%s%s%s", left ? left : "", data, right);
- g_free(data);
- data = new_data;
- }
- g_free(extra);
- }
-
- g_string_erase(new, pos, end-start+1);
- if (data && *data)
- {
- if (want_separator)
- {
- /* insert separator */
- g_string_insert(new, pos, sep);
- pos += strlen(sep);
- want_separator = FALSE;
- }
-
- g_string_insert(new, pos, data);
- pos += strlen(data);
- }
-
- if (pos-prev >= 1 && new->str[pos] == imp)
- {
- /* pipe character is replaced by a separator, delete it
- * and raise a flag if needed */
- g_string_erase(new, pos--, 1);
- want_separator |= (data && *data);
- }
-
- if (new->str[pos] == '\n') want_separator = FALSE;
-
- prev = pos - 1;
-
- g_free(name);
- g_free(data);
- }
-
- /* search and destroy empty lines */
- end = new->str;
- while ((start = strchr(end, '\n')))
- {
- end = start;
- while (*++(end) == '\n')
- ;
- g_string_erase(new, start-new->str, end-start-1);
- }
-
- g_strchomp(new->str);
-
- ret = new->str;
- g_string_free(new, FALSE);
-
- return ret;
-}
-
-typedef enum {
- OSDT_NONE = 0,
- OSDT_FREE = 1 << 0,
- OSDT_NO_DUP = 1 << 1
-} OsdTemplateFlags;
-
-static void osd_template_insert(GHashTable *vars, gchar *keyword, gchar *value, OsdTemplateFlags flags)
-{
- if (!value)
- {
- g_hash_table_insert(vars, keyword, g_strdup(""));
- return;
- }
-
- if (flags & OSDT_NO_DUP)
- {
- g_hash_table_insert(vars, keyword, value);
- return;
- }
- else
- {
- g_hash_table_insert(vars, keyword, g_strdup(value));
- }
-
- if (flags & OSDT_FREE) g_free((gpointer) value);
-}
-
static GdkPixbuf *image_osd_info_render(OverlayStateData *osd)
{
GdkPixbuf *pixbuf = NULL;
@@ -624,7 +340,7 @@
osd_template_insert(vars, "res", NULL, OSDT_NONE);
}
- text = image_osd_mkinfo(options->image_overlay.template_string, imd, vars);
+ text = image_osd_mkinfo(options->image_overlay.template_string, imd->image_fd, vars);
g_hash_table_destroy(vars);
} else {
diff -r c79d70e18076 -r 49bd0d974e88 src/image.c
--- a/src/image.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/image.c Wed Dec 12 21:56:30 2018 +0200
@@ -154,8 +154,24 @@
pixbuf_start_x = event->x;
pixbuf_start_y = event->y;
- image_start_x = x_pixel;
- image_start_y = y_pixel;
+
+ if (x_pixel == -1)
+ {
+ image_start_x = 0;
+ }
+ else
+ {
+ image_start_x = x_pixel;
+ }
+
+ if (y_pixel == -1)
+ {
+ image_start_y = 0;
+ }
+ else
+ {
+ image_start_y = y_pixel;
+ }
}
if (rect_id)
@@ -180,13 +196,32 @@
gint rect_height;
GdkPixbuf *rect_pixbuf;
gint x_pixel, y_pixel;
+ gint image_x_pixel, image_y_pixel;
if (options->draw_rectangle)
{
pixbuf_renderer_get_image_size(pr, &width, &height);
pixbuf_renderer_get_mouse_position(pr, &x_pixel, &y_pixel);
- switch_coords_orientation(imd, x_pixel, y_pixel, width, height);
+
+ if (x_pixel == -1)
+ {
+ image_x_pixel = width;
+ }
+ else
+ {
+ image_x_pixel = x_pixel;
+ }
+ if (y_pixel == -1)
+ {
+ image_y_pixel = height;
+ }
+ else
+ {
+ image_y_pixel = y_pixel;
+ }
+
+ switch_coords_orientation(imd, image_x_pixel, image_y_pixel, width, height);
if (rect_id)
{
pixbuf_renderer_overlay_remove((PixbufRenderer *)imd->pr, rect_id);
@@ -1121,6 +1156,8 @@
void image_attach_window(ImageWindow *imd, GtkWidget *window,
const gchar *title, const gchar *title_right, gboolean show_zoom)
{
+ LayoutWindow *lw;
+
imd->top_window = window;
g_free(imd->title);
imd->title = g_strdup(title);
@@ -1128,7 +1165,9 @@
imd->title_right = g_strdup(title_right);
imd->title_show_zoom = show_zoom;
- if (!options->image.fit_window_to_image) window = NULL;
+ lw = layout_find_by_image(imd);
+
+ if (!(options->image.fit_window_to_image && lw && lw->options.tools_float)) window = NULL;
pixbuf_renderer_set_parent((PixbufRenderer *)imd->pr, (GtkWindow *)window);
diff -r c79d70e18076 -r 49bd0d974e88 src/img-view.c
--- a/src/img-view.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/img-view.c Wed Dec 12 21:56:30 2018 +0200
@@ -29,6 +29,7 @@
#include "filedata.h"
#include "fullscreen.h"
#include "image.h"
+#include "image-load.h"
#include "image-overlay.h"
#include "layout.h"
#include "layout_image.h"
@@ -406,6 +407,7 @@
file_util_rename(image_get_fd(imd), NULL, imd->widget);
break;
case 'D': case 'd':
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(image_get_fd(imd), NULL, imd->widget);
break;
case 'W': case 'w':
@@ -445,6 +447,13 @@
filelist_copy(vw->list), vw->window);
}
break;
+ case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
+ if (options->file_ops.enable_delete_key)
+ {
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(image_get_fd(imd), NULL, imd->widget);
+ }
+ break;
default:
stop_signal = FALSE;
break;
@@ -540,6 +549,7 @@
case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
if (options->file_ops.enable_delete_key)
{
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(image_get_fd(imd), NULL, imd->widget);
}
break;
@@ -861,6 +871,9 @@
if (cd && info)
{
image_change_from_collection(vw->imd, cd, info, image_zoom_get_default(NULL));
+ /* Grab the fd so we can correctly size the window in
+ the call to image_load_dimensions() below. */
+ fd = info->fd;
if (options->image.enable_read_ahead)
{
CollectInfo * r_info = collection_next_by_info(cd, info);
@@ -886,21 +899,8 @@
}
/* Wait until image is loaded otherwise size is not defined */
- int count;
- for (count = 10; count && !w && !h; count++)
- {
- image_get_image_size(vw->imd, &w, &h);
- usleep(100000);
- }
+ image_load_dimensions(fd, &w, &h);
- if (image_zoom_get(vw->imd) == 0.0)
- {
- image_get_image_size(vw->imd, &w, &h);
- }
- else
- {
- pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(vw->imd->pr), &w, &h);
- }
if (options->image.limit_window_size)
{
gint mw = gdk_screen_width() * options->image.max_window_size / 100;
@@ -920,6 +920,7 @@
gtk_widget_set_size_request(vw->imd->pr, w, h);
#endif
+ gtk_window_set_focus_on_map(GTK_WINDOW(vw->window), FALSE);
gtk_widget_show(vw->window);
view_window_list = g_list_append(view_window_list, vw);
@@ -1170,6 +1171,17 @@
ImageWindow *imd;
imd = view_window_active_image(vw);
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(image_get_fd(imd), NULL, imd->widget);
+}
+
+static void view_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ ViewWindow *vw = data;
+ ImageWindow *imd;
+
+ imd = view_window_active_image(vw);
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(image_get_fd(imd), NULL, imd->widget);
}
@@ -1334,7 +1346,16 @@
menu_item_add(menu, _("_Rename..."), G_CALLBACK(view_rename_cb), vw);
menu_item_add(menu, _("_Copy path"), G_CALLBACK(view_copy_path_cb), vw);
menu_item_add(menu, _("_Copy path unquoted"), G_CALLBACK(view_copy_path_unquoted_cb), vw);
- menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(view_delete_cb), vw);
+
+ menu_item_add_divider(menu);
+ menu_item_add_stock(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH,
+ G_CALLBACK(view_move_to_trash_cb), vw);
+ menu_item_add_stock(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE,
+ G_CALLBACK(view_delete_cb), vw);
menu_item_add_divider(menu);
diff -r c79d70e18076 -r 49bd0d974e88 src/layout.c
--- a/src/layout.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/layout.c Wed Dec 12 21:56:30 2018 +0200
@@ -2532,6 +2532,14 @@
WRITE_NL(); WRITE_BOOL(*layout, toolbar_hidden);
WRITE_NL(); WRITE_BOOL(*layout, show_info_pixel);
+ WRITE_SEPARATOR();
+
+ WRITE_NL(); WRITE_BOOL(*layout, bars_state.info);
+ WRITE_NL(); WRITE_BOOL(*layout, bars_state.sort);
+ WRITE_NL(); WRITE_BOOL(*layout, bars_state.tools_float);
+ WRITE_NL(); WRITE_BOOL(*layout, bars_state.tools_hidden);
+ WRITE_NL(); WRITE_BOOL(*layout, bars_state.hidden);
+ WRITE_SEPARATOR();
WRITE_NL(); WRITE_UINT(*layout, image_overlay.state);
WRITE_NL(); WRITE_INT(*layout, image_overlay.histogram_channel);
@@ -2618,6 +2626,12 @@
if (READ_BOOL(*layout, toolbar_hidden)) continue;
if (READ_BOOL(*layout, show_info_pixel)) continue;
+ if (READ_BOOL(*layout, bars_state.info)) continue;
+ if (READ_BOOL(*layout, bars_state.sort)) continue;
+ if (READ_BOOL(*layout, bars_state.tools_float)) continue;
+ if (READ_BOOL(*layout, bars_state.tools_hidden)) continue;
+ if (READ_BOOL(*layout, bars_state.hidden)) continue;
+
if (READ_UINT(*layout, image_overlay.state)) continue;
if (READ_INT(*layout, image_overlay.histogram_channel)) continue;
if (READ_INT(*layout, image_overlay.histogram_mode)) continue;
diff -r c79d70e18076 -r 49bd0d974e88 src/layout_image.c
--- a/src/layout_image.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/layout_image.c Wed Dec 12 21:56:30 2018 +0200
@@ -544,6 +544,16 @@
{
LayoutWindow *lw = data;
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(layout_image_get_fd(lw), NULL,
+ li_pop_menu_click_parent(widget, lw));
+}
+
+static void li_pop_menu_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ LayoutWindow *lw = data;
+
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(layout_image_get_fd(lw), NULL,
li_pop_menu_click_parent(widget, lw));
}
@@ -705,7 +715,17 @@
item = menu_item_add(menu, _("_Copy path"), G_CALLBACK(li_pop_menu_copy_path_cb), lw);
item = menu_item_add(menu, _("_Copy path unquoted"), G_CALLBACK(li_pop_menu_copy_path_unquoted_cb), lw);
if (!path) gtk_widget_set_sensitive(item, FALSE);
- item = menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(li_pop_menu_delete_cb), lw);
+ menu_item_add_divider(menu);
+
+ item = menu_item_add_stock(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH,
+ G_CALLBACK(li_pop_menu_move_to_trash_cb), lw);
+ if (!path) gtk_widget_set_sensitive(item, FALSE);
+ item = menu_item_add_stock(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE,
+ G_CALLBACK(li_pop_menu_delete_cb), lw);
if (!path) gtk_widget_set_sensitive(item, FALSE);
menu_item_add_divider(menu);
diff -r c79d70e18076 -r 49bd0d974e88 src/layout_util.c
--- a/src/layout_util.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/layout_util.c Wed Dec 12 21:56:30 2018 +0200
@@ -372,6 +372,15 @@
{
LayoutWindow *lw = data;
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
+}
+
+static void layout_menu_move_to_trash_cb(GtkAction *action, gpointer data)
+{
+ LayoutWindow *lw = data;
+
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
}
@@ -381,6 +390,17 @@
if (options->file_ops.enable_delete_key)
{
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
+ }
+}
+static void layout_menu_move_to_trash_key_cb(GtkAction *action, gpointer data)
+{
+ LayoutWindow *lw = data;
+
+ if (options->file_ops.enable_delete_key)
+ {
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
}
}
@@ -1094,6 +1114,10 @@
{
LayoutWindow *lw = data;
+ if (lw->options.bars_state.hidden == gtk_toggle_action_get_active(action))
+ {
+ return;
+ }
layout_bars_hide_toggle(lw);
}
@@ -1877,16 +1901,17 @@
{ "Copy", GTK_STOCK_COPY, N_("_Copy..."), "C", N_("Copy..."), CB(layout_menu_copy_cb) },
{ "Move", PIXBUF_INLINE_ICON_MOVE, N_("_Move..."), "M", N_("Move..."), CB(layout_menu_move_cb) },
{ "Rename", PIXBUF_INLINE_ICON_RENAME, N_("_Rename..."), "R", N_("Rename..."), CB(layout_menu_rename_cb) },
- { "Delete", GTK_STOCK_DELETE, N_("_Delete..."), "D", N_("Delete..."), CB(layout_menu_delete_cb) },
- { "DeleteAlt1", GTK_STOCK_DELETE, N_("_Delete..."), "Delete", N_("Delete..."), CB(layout_menu_delete_key_cb) },
- { "DeleteAlt2", GTK_STOCK_DELETE, N_("_Delete..."), "KP_Delete", N_("Delete..."), CB(layout_menu_delete_key_cb) },
+ { "Delete", PIXBUF_INLINE_ICON_TRASH, N_("Move to Trash..."), "D", N_("Move to Trash..."), CB(layout_menu_move_to_trash_cb) },
+ { "DeleteAlt1", PIXBUF_INLINE_ICON_TRASH,N_("Move to Trash..."), "Delete", N_("Move to Trash..."), CB(layout_menu_move_to_trash_key_cb) },
+ { "DeleteAlt2", PIXBUF_INLINE_ICON_TRASH,N_("Move to Trash..."), "KP_Delete", N_("Move to Trash..."), CB(layout_menu_move_to_trash_key_cb) },
+ { "PermanentDelete", GTK_STOCK_DELETE, N_("Delete..."), "Delete",N_("Delete..."), CB(layout_menu_delete_cb) },
{ "EnableGrouping", NULL, N_("Enable file _grouping"), NULL, N_("Enable file grouping"), CB(layout_menu_enable_grouping_cb) },
{ "DisableGrouping", NULL, N_("Disable file groupi_ng"), NULL, N_("Disable file grouping"), CB(layout_menu_disable_grouping_cb) },
{ "CopyPath", NULL, N_("_Copy path to clipboard"), NULL, N_("Copy path to clipboard"), CB(layout_menu_copy_path_cb) },
{ "CopyPathUnquoted", NULL, N_("_Copy path unquoted to clipboard"), NULL, N_("Copy path unquoted to clipboard"), CB(layout_menu_copy_path_unquoted_cb) },
{ "CloseWindow", GTK_STOCK_CLOSE, N_("C_lose window"), "W", N_("Close window"), CB(layout_menu_close_cb) },
{ "Quit", GTK_STOCK_QUIT, N_("_Quit"), "Q", N_("Quit"), CB(layout_menu_exit_cb) },
- { "RotateCW", NULL, N_("_Rotate clockwise"), "bracketright", N_("Rotate clockwise"), CB(layout_menu_alter_90_cb) },
+ { "RotateCW", PIXBUF_INLINE_ICON_CW, N_("_Rotate clockwise"), "bracketright", N_("Rotate clockwise"), CB(layout_menu_alter_90_cb) },
{ "Rating0", NULL, N_("_Rating 0"), "KP_0", N_("Rating 0"), CB(layout_menu_rating_0_cb) },
{ "Rating1", NULL, N_("_Rating 1"), "KP_1", N_("Rating 1"), CB(layout_menu_rating_1_cb) },
{ "Rating2", NULL, N_("_Rating 2"), "KP_2", N_("Rating 2"), CB(layout_menu_rating_2_cb) },
@@ -1894,11 +1919,11 @@
{ "Rating4", NULL, N_("_Rating 4"), "KP_4", N_("Rating 4"), CB(layout_menu_rating_4_cb) },
{ "Rating5", NULL, N_("_Rating 5"), "KP_5", N_("Rating 5"), CB(layout_menu_rating_5_cb) },
{ "RatingM1", NULL, N_("_Rating -1"), "KP_Subtract", N_("Rating -1"), CB(layout_menu_rating_m1_cb) },
- { "RotateCCW", NULL, N_("Rotate _counterclockwise"), "bracketleft", N_("Rotate counterclockwise"), CB(layout_menu_alter_90cc_cb) },
- { "Rotate180", NULL, N_("Rotate 1_80"), "R", N_("Rotate 180"), CB(layout_menu_alter_180_cb) },
- { "Mirror", NULL, N_("_Mirror"), "M", N_("Mirror"), CB(layout_menu_alter_mirror_cb) },
- { "Flip", NULL, N_("_Flip"), "F", N_("Flip"), CB(layout_menu_alter_flip_cb) },
- { "AlterNone", NULL, N_("_Original state"), "O", N_("Original state"), CB(layout_menu_alter_none_cb) },
+ { "RotateCCW", PIXBUF_INLINE_ICON_CCW, N_("Rotate _counterclockwise"), "bracketleft", N_("Rotate counterclockwise"), CB(layout_menu_alter_90cc_cb) },
+ { "Rotate180", PIXBUF_INLINE_ICON_180, N_("Rotate 1_80"), "R", N_("Rotate 180"), CB(layout_menu_alter_180_cb) },
+ { "Mirror", PIXBUF_INLINE_ICON_MIRROR, N_("_Mirror"), "M", N_("Mirror"), CB(layout_menu_alter_mirror_cb) },
+ { "Flip", PIXBUF_INLINE_ICON_FLIP, N_("_Flip"), "F", N_("Flip"), CB(layout_menu_alter_flip_cb) },
+ { "AlterNone", PIXBUF_INLINE_ICON_ORIGINAL, N_("_Original state"), "O", N_("Original state"), CB(layout_menu_alter_none_cb) },
{ "SelectAll", PIXBUF_INLINE_ICON_SELECT_ALL, N_("Select _all"), "A", N_("Select all"), CB(layout_menu_select_all_cb) },
{ "SelectNone", PIXBUF_INLINE_ICON_SELECT_NONE, N_("Select _none"), "A", N_("Select none"), CB(layout_menu_unselect_all_cb) },
{ "SelectInvert", PIXBUF_INLINE_ICON_SELECT_INVERT, N_("_Invert Selection"), "I", N_("Invert Selection"), CB(layout_menu_invert_selection_cb) },
@@ -2066,7 +2091,10 @@
" "
" "
" "
+" "
" "
+" "
+" "
" "
" "
" "
@@ -3131,6 +3159,9 @@
action = gtk_action_group_get_action(lw->action_group, "ShowFileFilter");
gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.show_file_filter);
+ action = gtk_action_group_get_action(lw->action_group, "HideBars");
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), (lw->options.bars_state.hidden));
+
if (osd_flags & OSD_SHOW_HISTOGRAM)
{
action = gtk_action_group_get_action(lw->action_group, "HistogramChanR");
@@ -3383,7 +3414,14 @@
lw->options.bars_state.hidden = FALSE;
if (lw->options.bars_state.sort)
{
- gtk_widget_show(lw->bar_sort);
+ if (lw->bar_sort)
+ {
+ gtk_widget_show(lw->bar_sort);
+ }
+ else
+ {
+ layout_bar_sort_set_default(lw);
+ }
}
if (lw->options.bars_state.info)
{
@@ -3400,7 +3438,11 @@
lw->options.bars_state.tools_float = lw->options.tools_float;
lw->options.bars_state.tools_hidden = lw->options.tools_hidden;
- gtk_widget_hide(lw->bar);
+ if (lw->bar)
+ {
+ gtk_widget_hide(lw->bar);
+ }
+
if (lw->bar_sort)
gtk_widget_hide(lw->bar_sort);
layout_tools_float_set(lw, lw->options.tools_float, TRUE);
diff -r c79d70e18076 -r 49bd0d974e88 src/options.c
--- a/src/options.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/options.c Wed Dec 12 21:56:30 2018 +0200
@@ -65,9 +65,11 @@
options->show_window_ids = FALSE;
options->file_ops.confirm_delete = TRUE;
+ options->file_ops.confirm_move_to_trash = TRUE;
options->file_ops.enable_delete_key = TRUE;
+ options->file_ops.use_system_trash = TRUE;
options->file_ops.enable_in_place_rename = TRUE;
- options->file_ops.safe_delete_enable = FALSE;
+ options->file_ops.safe_delete_enable = TRUE;
options->file_ops.safe_delete_folder_maxsize = 128;
options->file_ops.safe_delete_path = NULL;
@@ -195,13 +197,15 @@
options->star_rating.star = STAR_RATING_STAR;
options->star_rating.rejected = STAR_RATING_REJECTED;
+ options->printer.template_string = NULL;
options->printer.image_font = g_strdup("Serif 10");
options->printer.page_font = g_strdup("Serif 10");
options->printer.page_text = NULL;
- options->printer.text_fields = 1;
options->printer.image_text_position = 1;
options->printer.page_text_position = 3;
+ options->disabled_plugins = NULL;
+
return options;
}
diff -r c79d70e18076 -r 49bd0d974e88 src/options.h
--- a/src/options.h Tue Oct 02 22:50:14 2018 +0300
+++ b/src/options.h Wed Dec 12 21:56:30 2018 +0200
@@ -95,8 +95,10 @@
gboolean enable_in_place_rename;
gboolean confirm_delete;
+ gboolean confirm_move_to_trash;
gboolean enable_delete_key;
gboolean safe_delete_enable;
+ gboolean use_system_trash;
gchar *safe_delete_path;
gint safe_delete_folder_maxsize;
} file_ops;
@@ -305,15 +307,17 @@
struct {
gchar *image_font;
gchar *page_font;
- gint text_fields;
gboolean show_image_text;
gboolean show_page_text;
gchar *page_text;
gint image_text_position;
gint page_text_position;
+ gchar *template_string;
} printer;
gboolean read_metadata_in_idle;
+
+ GList *disabled_plugins;
};
ConfOptions *options;
diff -r c79d70e18076 -r 49bd0d974e88 src/osd.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/osd.c Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2018 The Geeqie Team
+ *
+ * Author: Colin Clark
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Routines for creating the Overlay Screen Display text. Also
+ * used for the same purposes by the Print routines
+ */
+
+#include "main.h"
+#include "osd.h"
+
+#include "dnd.h"
+#include "exif.h"
+#include "glua.h"
+#include "metadata.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+
+#include
+
+static const gchar *predefined_tags[][2] = {
+ {"%name%", N_("Name")},
+ {"%path:60%", N_("Path")},
+ {"%date%", N_("Date")},
+ {"%size%", N_("Size")},
+ {"%zoom%", N_("Zoom")},
+ {"%dimensions%", N_("Dimensions")},
+ {"%collection%", N_("Collection")},
+ {"%number%", N_("Image index")},
+ {"%total%", N_("Images total")},
+ {"%comment%", N_("Comment")},
+ {"%keywords%", N_("Keywords")},
+ {"%file.ctime%", N_("File ctime")},
+ {"%file.mode%", N_("File mode")},
+ {"%file.owner%", N_("File owner")},
+ {"%file.group%", N_("File group")},
+ {"%file.link%", N_("File link")},
+ {"%file.class%", N_("File class")},
+ {"%formatted.DateTime%", N_("Image date")},
+ {"%formatted.DateTimeDigitized%", N_("Date digitized")},
+ {"%formatted.ShutterSpeed%", N_("ShutterSpeed")},
+ {"%formatted.Aperture%", N_("Aperture")},
+ {"%formatted.ExposureBias%", N_("Exposure bias")},
+ {"%formatted.Resolution%", N_("Resolution")},
+ {"%formatted.Camera%", N_("Camera")},
+ {"%formatted.ISOSpeedRating%", N_("ISO")},
+ {"%formatted.FocalLength%", N_("Focal length")},
+ {"%formatted.FocalLength35mmFilm%", N_("Focal len. 35mm")},
+ {"%formatted.SubjectDistance%", N_("Subject distance")},
+ {"%formatted.Flash%", N_("Flash")},
+ {"%formatted.ColorProfile%", N_("Color profile")},
+ {"%formatted.GPSPosition%", N_("Lat, Long")},
+ {"%formatted.GPSAltitude%", N_("Altitude")},
+ {"%formatted.localtime%", N_("Local time")},
+ {"%formatted.timezone%", N_("Timezone")},
+ {"%formatted.countryname%", N_("Country name")},
+ {"%formatted.countrycode%", N_("Country code")},
+ {"%rating%", N_("Rating")},
+ {"%formatted.star_rating%", N_("Star rating")},
+ {"%Xmp.dc.creator%", N_("© Creator")},
+ {"%Xmp.dc.contributor%", N_("© Contributor")},
+ {"%Xmp.dc.rights%", N_("© Rights")},
+ {NULL, NULL}};
+
+static GtkTargetEntry osd_drag_types[] = {
+ { "text/plain", GTK_TARGET_SAME_APP, TARGET_TEXT_PLAIN }
+};
+
+typedef struct _TagData TagData;
+struct _TagData
+{
+ gchar *key;
+ gchar *title;
+};
+
+static void tag_button_cb(GtkWidget *widget, gpointer data)
+{
+ GtkTextView *image_overlay_template_view = data;
+ GtkTextBuffer *buffer;
+ TagData *td;
+
+ buffer = gtk_text_view_get_buffer(image_overlay_template_view);
+ td = g_object_get_data(G_OBJECT(widget), "tag_data");
+ gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(buffer), td->key, -1);
+
+ gtk_widget_grab_focus(GTK_WIDGET(image_overlay_template_view));
+}
+
+static void osd_dnd_get_cb(GtkWidget *btn, GdkDragContext *context,
+ GtkSelectionData *selection_data, guint info,
+ guint time, gpointer data)
+{
+ TagData *td;
+ GtkTextView *image_overlay_template_view = data;
+
+ td = g_object_get_data(G_OBJECT(btn), "tag_data");
+ gtk_selection_data_set_text(selection_data, td->key, -1);
+
+ gtk_widget_grab_focus(GTK_WIDGET(image_overlay_template_view));
+}
+
+static void osd_btn_destroy_cb(GtkWidget *btn, GdkDragContext *context,
+ GtkSelectionData *selection_data, guint info,
+ guint time, gpointer data)
+{
+ TagData *td;
+
+ td = g_object_get_data(G_OBJECT(btn), "tag_data");
+ g_free(td->key);
+ g_free(td->title);
+}
+
+static void set_osd_button(GtkTable *table, const gint rows, const gint cols, const gchar *key, const gchar *title, GtkWidget *template_view)
+{
+ GtkWidget *new_button;
+ TagData *td;
+
+ new_button = gtk_button_new_with_label(title);
+ g_signal_connect(G_OBJECT(new_button), "clicked", G_CALLBACK(tag_button_cb), template_view);
+ gtk_widget_show(new_button);
+
+ td = g_new0(TagData, 1);
+ td->key = g_strdup(key);
+ td->title = g_strdup(title);
+
+ g_object_set_data(G_OBJECT(new_button), "tag_data", td);
+
+ gtk_drag_source_set(new_button, GDK_BUTTON1_MASK, osd_drag_types, 1, GDK_ACTION_COPY);
+ g_signal_connect(G_OBJECT(new_button), "drag_data_get",
+ G_CALLBACK(osd_dnd_get_cb), template_view);
+ g_signal_connect(G_OBJECT(new_button), "destroy",
+ G_CALLBACK(osd_btn_destroy_cb), new_button);
+
+ gtk_table_attach_defaults(table, new_button, cols, cols+1, rows, rows+1);
+
+}
+
+GtkWidget *osd_new(gint max_cols, GtkWidget *template_view)
+{
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+ GtkWidget *vbox_buttons;
+ GtkWidget *group;
+ GtkWidget *button;
+ GtkWidget *scrolled;
+ GtkTextBuffer *buffer;
+ GtkWidget *label;
+ GtkWidget * subgroup;
+ gint i = 0;
+ gint rows = 0;
+ gint max_rows = 0;
+ gint col = 0;
+ gint cols = 0;
+ gdouble entries;
+ GtkWidget *viewport;
+
+ vbox = gtk_vbox_new(FALSE, 0);
+
+ pref_label_new(vbox, _("To include predefined tags in the template, click a button or drag-and-drop"));
+
+ scrolled = gtk_scrolled_window_new(NULL, NULL);
+ gtk_box_pack_start(GTK_BOX(vbox), scrolled, FALSE, FALSE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ label = gtk_label_new("title");
+ gtk_widget_show(scrolled);
+ gtk_widget_set_size_request(scrolled, -1, 140);
+
+ viewport = gtk_viewport_new(NULL, NULL);
+ gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
+ gtk_container_add(GTK_CONTAINER(scrolled), viewport);
+ gtk_widget_show(viewport);
+
+ entries = (sizeof(predefined_tags) / sizeof(predefined_tags[0])) - 1;
+ max_rows = ceil(entries / max_cols);
+
+ GtkTable *table;
+ table = GTK_TABLE(gtk_table_new(max_rows, max_cols, FALSE));
+ gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(table));
+ gtk_widget_show(GTK_WIDGET(table));
+
+ for (rows = 0; rows < max_rows; rows++)
+ {
+ cols = 0;
+
+ while (cols < max_cols && predefined_tags[i][0])
+ {
+ set_osd_button(table, rows, cols, predefined_tags[i][0], predefined_tags[i][1], template_view);
+ i = i + 1;
+ cols++;
+ }
+ }
+ return vbox;
+}
+static gchar *keywords_to_string(FileData *fd)
+{
+ GList *keywords;
+ GString *kwstr = NULL;
+ gchar *ret = NULL;
+
+ g_assert(fd);
+
+ keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
+
+ if (keywords)
+ {
+ GList *work = keywords;
+
+ while (work)
+ {
+ gchar *kw = work->data;
+ work = work->next;
+
+ if (!kw) continue;
+ if (!kwstr)
+ kwstr = g_string_new("");
+ else
+ g_string_append(kwstr, ", ");
+
+ g_string_append(kwstr, kw);
+ }
+ string_list_free(keywords);
+ }
+
+ if (kwstr)
+ {
+ ret = kwstr->str;
+ g_string_free(kwstr, FALSE);
+ }
+
+ return ret;
+}
+
+gchar *image_osd_mkinfo(const gchar *str, FileData *fd, GHashTable *vars)
+{
+ gchar delim = '%', imp = '|', sep[] = " - ";
+ gchar *start, *end;
+ guint pos, prev;
+ gboolean want_separator = FALSE;
+ gchar *name, *data;
+ GString *new;
+ gchar *ret;
+
+ if (!str || !*str) return g_strdup("");
+
+ new = g_string_new(str);
+
+ prev = -1;
+
+ while (TRUE)
+ {
+ guint limit = 0;
+ gchar *trunc = NULL;
+ gchar *limpos = NULL;
+ gchar *extra = NULL;
+ gchar *extrapos = NULL;
+ gchar *p;
+
+ start = strchr(new->str + (prev + 1), delim);
+ if (!start)
+ break;
+ end = strchr(start+1, delim);
+ if (!end)
+ break;
+
+ /* Search for optionnal modifiers
+ * %name:99:extra% -> name = "name", limit=99, extra = "extra"
+ */
+ for (p = start + 1; p < end; p++)
+ {
+ if (p[0] == ':')
+ {
+ if (g_ascii_isdigit(p[1]) && !limpos)
+ {
+ limpos = p + 1;
+ if (!trunc) trunc = p;
+ }
+ else
+ {
+ extrapos = p + 1;
+ if (!trunc) trunc = p;
+ break;
+ }
+ }
+ }
+
+ if (limpos)
+ limit = (guint) atoi(limpos);
+
+ if (extrapos)
+ extra = g_strndup(extrapos, end - extrapos);
+
+ name = g_strndup(start+1, (trunc ? trunc : end)-start-1);
+ pos = start - new->str;
+ data = NULL;
+
+ if (strcmp(name, "keywords") == 0)
+ {
+ data = keywords_to_string(fd);
+ }
+ else if (strcmp(name, "comment") == 0)
+ {
+ data = metadata_read_string(fd, COMMENT_KEY, METADATA_PLAIN);
+ }
+ else if (strcmp(name, "imagecomment") == 0)
+ {
+ data = exif_get_image_comment(fd);
+ }
+ else if (strcmp(name, "rating") == 0)
+ {
+ data = metadata_read_string(fd, RATING_KEY, METADATA_PLAIN);
+ }
+#ifdef HAVE_LUA
+ else if (strncmp(name, "lua/", 4) == 0)
+ {
+ gchar *tmp;
+ tmp = strchr(name+4, '/');
+ if (!tmp)
+ break;
+ *tmp = '\0';
+ data = lua_callvalue(fd, name+4, tmp+1);
+ }
+#endif
+ else
+ {
+ data = g_strdup(g_hash_table_lookup(vars, name));
+ if (!data)
+ data = metadata_read_string(fd, name, METADATA_FORMATTED);
+ }
+
+ if (data && *data && limit > 0 && strlen(data) > limit + 3)
+ {
+ gchar *new_data = g_strdup_printf("%-*.*s...", limit, limit, data);
+ g_free(data);
+ data = new_data;
+ }
+
+ if (data)
+ {
+ /* Since we use pango markup to display, we need to escape here */
+ gchar *escaped = g_markup_escape_text(data, -1);
+ g_free(data);
+ data = escaped;
+ }
+
+ if (extra)
+ {
+ if (data && *data)
+ {
+ /* Display data between left and right parts of extra string
+ * the data is expressed by a '*' character. A '*' may be escaped
+ * by a \. You should escape all '*' characters, do not rely on the
+ * current implementation which only replaces the first unescaped '*'.
+ * If no "*" is present, the extra string is just appended to data string.
+ * Pango mark up is accepted in left and right parts.
+ * Any \n is replaced by a newline
+ * Examples:
+ * "*\n" -> data is displayed in italics ended with a newline
+ * "\n" -> ended with newline
+ * "ISO *" -> prefix data with "ISO " (ie. "ISO 100")
+ * "\**\*" -> prefix data with a star, and append a star (ie. "*100*")
+ * "\\*" -> prefix data with an anti slash (ie "\100")
+ * "Collection *\n" -> display data in bold prefixed by "Collection " and a newline is appended
+ *
+ * FIXME: using background / foreground colors lead to weird results.
+ */
+ gchar *new_data;
+ gchar *left = NULL;
+ gchar *right = extra;
+ gchar *p;
+ guint len = strlen(extra);
+
+ /* Search for left and right parts and unescape characters */
+ for (p = extra; *p; p++, len--)
+ if (p[0] == '\\')
+ {
+ if (p[1] == 'n')
+ {
+ memmove(p+1, p+2, --len);
+ p[0] = '\n';
+ }
+ else if (p[1] != '\0')
+ memmove(p, p+1, len--); // includes \0
+ }
+ else if (p[0] == '*' && !left)
+ {
+ right = p + 1;
+ left = extra;
+ }
+
+ if (left) right[-1] = '\0';
+
+ new_data = g_strdup_printf("%s%s%s", left ? left : "", data, right);
+ g_free(data);
+ data = new_data;
+ }
+ g_free(extra);
+ }
+
+ g_string_erase(new, pos, end-start+1);
+ if (data && *data)
+ {
+ if (want_separator)
+ {
+ /* insert separator */
+ g_string_insert(new, pos, sep);
+ pos += strlen(sep);
+ want_separator = FALSE;
+ }
+
+ g_string_insert(new, pos, data);
+ pos += strlen(data);
+ }
+
+ if (pos-prev >= 1 && new->str[pos] == imp)
+ {
+ /* pipe character is replaced by a separator, delete it
+ * and raise a flag if needed */
+ g_string_erase(new, pos--, 1);
+ want_separator |= (data && *data);
+ }
+
+ if (new->str[pos] == '\n') want_separator = FALSE;
+
+ prev = pos - 1;
+
+ g_free(name);
+ g_free(data);
+ }
+
+ /* search and destroy empty lines */
+ end = new->str;
+ while ((start = strchr(end, '\n')))
+ {
+ end = start;
+ while (*++(end) == '\n')
+ ;
+ g_string_erase(new, start-new->str, end-start-1);
+ }
+
+ g_strchomp(new->str);
+
+ ret = new->str;
+ g_string_free(new, FALSE);
+
+ return ret;
+}
+
+void osd_template_insert(GHashTable *vars, gchar *keyword, gchar *value, OsdTemplateFlags flags)
+{
+ if (!value)
+ {
+ g_hash_table_insert(vars, keyword, g_strdup(""));
+ return;
+ }
+
+ if (flags & OSDT_NO_DUP)
+ {
+ g_hash_table_insert(vars, keyword, value);
+ return;
+ }
+ else
+ {
+ g_hash_table_insert(vars, keyword, g_strdup(value));
+ }
+
+ if (flags & OSDT_FREE) g_free((gpointer) value);
+}
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r c79d70e18076 -r 49bd0d974e88 src/osd.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/osd.h Wed Dec 12 21:56:30 2018 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Geeqie Team
+ *
+ * Author: Colin Clark
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef OSD_H
+#define OSD_H
+
+typedef enum {
+ OSDT_NONE = 0,
+ OSDT_FREE = 1 << 0,
+ OSDT_NO_DUP = 1 << 1
+} OsdTemplateFlags;
+
+GtkWidget *osd_new(gint max_cols, GtkWidget *template_view);
+gchar *image_osd_mkinfo(const gchar *str, FileData *fd, GHashTable *vars);
+void osd_template_insert(GHashTable *vars, gchar *keyword, gchar *value, OsdTemplateFlags flags);
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r c79d70e18076 -r 49bd0d974e88 src/pan-view/pan-view.c
--- a/src/pan-view/pan-view.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/pan-view/pan-view.c Wed Dec 12 21:56:30 2018 +0200
@@ -1211,7 +1211,11 @@
if (fd) file_util_rename(fd, NULL, GTK_WIDGET(pr));
break;
case 'D': case 'd':
- if (fd) file_util_delete(fd, NULL, GTK_WIDGET(pr));
+ if (fd)
+ {
+ options->file_ops.safe_delete_enable = TRUE;
+ file_util_delete(fd, NULL, GTK_WIDGET(pr));
+ }
break;
case 'F': case 'f':
pan_search_toggle_visible(pw, TRUE);
@@ -2151,7 +2155,24 @@
FileData *fd;
fd = pan_menu_click_fd(pw);
- if (fd) file_util_delete(fd, NULL, pw->imd->widget);
+ if (fd)
+ {
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(fd, NULL, pw->imd->widget);
+ }
+}
+
+static void pan_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ PanWindow *pw = data;
+ FileData *fd;
+
+ fd = pan_menu_click_fd(pw);
+ if (fd)
+ {
+ options->file_ops.safe_delete_enable = TRUE;
+ file_util_delete(fd, NULL, pw->imd->widget);
+ }
}
static void pan_copy_path_cb(GtkWidget *widget, gpointer data)
@@ -2301,8 +2322,16 @@
G_CALLBACK(pan_copy_path_cb), pw);
menu_item_add_sensitive(menu, _("_Copy path unquoted"), active,
G_CALLBACK(pan_copy_path_unquoted_cb), pw);
- menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
- G_CALLBACK(pan_delete_cb), pw);
+
+ menu_item_add_divider(menu);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH, active,
+ G_CALLBACK(pan_move_to_trash_cb), pw);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE, active,
+ G_CALLBACK(pan_delete_cb), pw);
menu_item_add_divider(menu);
diff -r c79d70e18076 -r 49bd0d974e88 src/pixbuf-renderer.c
--- a/src/pixbuf-renderer.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/pixbuf-renderer.c Wed Dec 12 21:56:30 2018 +0200
@@ -2879,10 +2879,15 @@
x_pixel_clamped = CLAMP(x_pixel, 0, pr->image_width - 1);
y_pixel_clamped = CLAMP(y_pixel, 0, pr->image_height - 1);
- if(x_pixel != x_pixel_clamped || y_pixel != y_pixel_clamped)
+ if (x_pixel != x_pixel_clamped)
{
/* mouse is not on pr */
- x_pixel = y_pixel = -1;
+ x_pixel = -1;
+ }
+ if (y_pixel != y_pixel_clamped)
+ {
+ /* mouse is not on pr */
+ y_pixel = -1;
}
*x_pixel_return = x_pixel;
diff -r c79d70e18076 -r 49bd0d974e88 src/pixbuf_util.c
--- a/src/pixbuf_util.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/pixbuf_util.c Wed Dec 12 21:56:30 2018 +0200
@@ -139,6 +139,13 @@
{ PIXBUF_INLINE_ICON_SELECT_INVERT, icon_select_invert },
{ PIXBUF_INLINE_ICON_SELECT_RECTANGLE, icon_select_rectangle },
{ PIXBUF_INLINE_ICON_FILE_FILTER, icon_file_filter },
+ { PIXBUF_INLINE_ICON_CW, icon_rotate_clockwise },
+ { PIXBUF_INLINE_ICON_CCW, icon_rotate_counter_clockwise },
+ { PIXBUF_INLINE_ICON_180, icon_rotate_180 },
+ { PIXBUF_INLINE_ICON_MIRROR, icon_mirror },
+ { PIXBUF_INLINE_ICON_FLIP, icon_flip },
+ { PIXBUF_INLINE_ICON_ORIGINAL, icon_original },
+ { PIXBUF_INLINE_ICON_TRASH, icon_trash },
{ NULL, NULL }
};
@@ -228,6 +235,15 @@
{
DEBUG_1("Couldn't load icon %s: %s", icon2, error->message);
g_error_free(error);
+ error = NULL;
+
+ /* try as an absolute path */
+ pixbuf = gdk_pixbuf_new_from_file(icon, &error);
+ if (error)
+ {
+ DEBUG_1("Couldn't load icon as absolute path %s: %s", icon, error->message);
+ g_error_free(error);
+ }
}
g_free(icon2);
}
diff -r c79d70e18076 -r 49bd0d974e88 src/pixbuf_util.h
--- a/src/pixbuf_util.h Tue Oct 02 22:50:14 2018 +0300
+++ b/src/pixbuf_util.h Wed Dec 12 21:56:30 2018 +0200
@@ -73,6 +73,14 @@
#define PIXBUF_INLINE_ICON_SELECT_INVERT "icon_select_invert"
#define PIXBUF_INLINE_ICON_SELECT_RECTANGLE "icon_select_rectangle"
#define PIXBUF_INLINE_ICON_FILE_FILTER "icon_file_filter"
+#define PIXBUF_INLINE_ICON_TRASH "icon_trash"
+
+#define PIXBUF_INLINE_ICON_CW "icon_rotate_clockwise"
+#define PIXBUF_INLINE_ICON_CCW "icon_rotate_counter_clockwise"
+#define PIXBUF_INLINE_ICON_180 "icon_rotate_180"
+#define PIXBUF_INLINE_ICON_MIRROR "icon_mirror"
+#define PIXBUF_INLINE_ICON_FLIP "icon_flip"
+#define PIXBUF_INLINE_ICON_ORIGINAL "icon_original"
GdkPixbuf *pixbuf_copy_rotate_90(GdkPixbuf *src, gboolean counter_clockwise);
GdkPixbuf *pixbuf_copy_mirror(GdkPixbuf *src, gboolean mirror, gboolean flip);
diff -r c79d70e18076 -r 49bd0d974e88 src/preferences.c
--- a/src/preferences.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/preferences.c Wed Dec 12 21:56:30 2018 +0200
@@ -39,6 +39,7 @@
#include "layout_config.h"
#include "layout_util.h"
#include "metadata.h"
+#include "osd.h"
#include "pixbuf_util.h"
#include "slideshow.h"
#include "toolbar.h"
@@ -52,8 +53,6 @@
#include "window.h"
#include "zonedetect.h"
-#include
-
#ifdef HAVE_LCMS
#ifdef HAVE_LCMS2
#include
@@ -261,7 +260,8 @@
options->file_ops.confirm_delete = c_options->file_ops.confirm_delete;
options->file_ops.enable_delete_key = c_options->file_ops.enable_delete_key;
- options->file_ops.safe_delete_enable = c_options->file_ops.safe_delete_enable;
+ options->file_ops.confirm_move_to_trash = c_options->file_ops.confirm_move_to_trash;
+ options->file_ops.use_system_trash = c_options->file_ops.use_system_trash;
options->file_ops.safe_delete_folder_maxsize = c_options->file_ops.safe_delete_folder_maxsize;
options->tools_restore_state = c_options->tools_restore_state;
options->save_window_positions = c_options->save_window_positions;
@@ -2055,116 +2055,7 @@
options->fullscreen.disable_saver, &c_options->fullscreen.disable_saver);
}
-/* overlay screen display tab */
-static const gchar *predefined_tags[][2] = {
- {"%name%", N_("Name")},
- {"%path:60%*", N_("Path")},
- {"%date%", N_("Date")},
- {"%size%", N_("Size")},
- {"%zoom%", N_("Zoom")},
- {"%dimensions%", N_("Dimensions")},
- {"%collection%", N_("Collection")},
- {"%number%", N_("Collection number")},
- {"%total%", N_("Collection total")},
- {"%file.ctime%", N_("File ctime")},
- {"%file.mode%", N_("File mode")},
- {"%file.owner%", N_("File owner")},
- {"%file.group%", N_("File group")},
- {"%file.link%", N_("File link")},
- {"%file.class%", N_("File class")},
- {"%formatted.DateTime%", N_("Image date")},
- {"%formatted.DateTimeDigitized%", N_("Date digitized")},
- {"%formatted.ShutterSpeed%", N_("ShutterSpeed")},
- {"%formatted.Aperture%", N_("Aperture")},
- {"%formatted.ExposureBias%", N_("Exposure bias")},
- {"%formatted.Resolution%", N_("Resolution")},
- {"%formatted.Camera%", N_("Camera")},
- {"%formatted.ShutterSpeed%", N_("Shutter speed")},
- {"%formatted.ISOSpeedRating%", N_("ISO")},
- {"%formatted.FocalLength%", N_("Focal length")},
- {"%formatted.FocalLength35mmFilm%", N_("Focal len. 35mm")},
- {"%formatted.SubjectDistance%", N_("Subject distance")},
- {"%formatted.Flash%", N_("Flash")},
- {"%formatted.ColorProfile%", N_("Color profile")},
- {"%formatted.GPSPosition%", N_("Lat, Long")},
- {"%formatted.GPSAltitude%", N_("Altitude")},
- {"%formatted.localtime%", N_("Local time")},
- {"%formatted.timezone%", N_("Timezone")},
- {"%formatted.countryname%", N_("Country name")},
- {"%formatted.countrycode%", N_("Country code")},
- {"%formatted.star_rating%", N_("Star rating")},
- {NULL, NULL}};
-
-static GtkTargetEntry osd_drag_types[] = {
- { "text/plain", GTK_TARGET_SAME_APP, TARGET_TEXT_PLAIN }
-};
-
-typedef struct _TagData TagData;
-struct _TagData
-{
- gchar *key;
- gchar *title;
-};
-
-static void tag_button_cb(GtkWidget *widget, gpointer data)
-{
- GtkTextView *image_overlay_template_view = data;
- GtkTextBuffer *buffer;
- TagData *td;
-
- buffer = gtk_text_view_get_buffer(image_overlay_template_view);
- td = g_object_get_data(G_OBJECT(widget), "tag_data");
- gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(buffer), td->key, -1);
-
- gtk_widget_grab_focus(GTK_WIDGET(image_overlay_template_view));
-}
-
-static void osd_dnd_get_cb(GtkWidget *btn, GdkDragContext *context,
- GtkSelectionData *selection_data, guint info,
- guint time, gpointer data)
-{
- TagData *td;
- GtkTextView *image_overlay_template_view = data;
-
- td = g_object_get_data(G_OBJECT(btn), "tag_data");
- gtk_selection_data_set_text(selection_data, td->key, -1);
-
- gtk_widget_grab_focus(GTK_WIDGET(image_overlay_template_view));
-}
-
-static void osd_btn_destroy_cb(GtkWidget *btn, GdkDragContext *context,
- GtkSelectionData *selection_data, guint info,
- guint time, gpointer data)
-{
- TagData *td;
-
- td = g_object_get_data(G_OBJECT(btn), "tag_data");
- g_free(td->key);
- g_free(td->title);
-}
-
-static void set_osd_button(GtkWidget *widget, const gchar *key, const gchar *title,
- GtkWidget *image_overlay_template_view)
-{
- GtkWidget *new_button;
- TagData *td;
-
- new_button = pref_button_new(widget, NULL, _(title), TRUE,
- G_CALLBACK(tag_button_cb), image_overlay_template_view);
-
- td = g_new0(TagData, 1);
- td->key = g_strdup(key);
- td->title = g_strdup(title);
-
- g_object_set_data(G_OBJECT(new_button), "tag_data", td);
-
- gtk_drag_source_set(new_button, GDK_BUTTON1_MASK, osd_drag_types, 1, GDK_ACTION_COPY);
- g_signal_connect(G_OBJECT(new_button), "drag_data_get",
- G_CALLBACK(osd_dnd_get_cb), image_overlay_template_view);
- g_signal_connect(G_OBJECT(new_button), "destroy",
- G_CALLBACK(osd_btn_destroy_cb), new_button);
-}
-
+#define PRE_FORMATTED_COLUMNS 5
static void config_tab_osd(GtkWidget *notebook)
{
GtkWidget *hbox;
@@ -2174,6 +2065,7 @@
GtkWidget *button;
GtkWidget *image_overlay_template_view;
GtkWidget *scrolled;
+ GtkWidget *scrolled_pre_formatted;
GtkTextBuffer *buffer;
GtkWidget *label;
GtkWidget * subgroup;
@@ -2187,33 +2079,13 @@
group = pref_group_new(vbox, FALSE, _("Overlay Screen Display"), GTK_ORIENTATION_VERTICAL);
- hbox = gtk_hbox_new(FALSE, 0);
-
- gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- pref_label_new(hbox, _("To include predefined tags in the template, click a button or drag-and-drop"));
-
subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(subgroup), hbox, FALSE, FALSE, 0);
- gtk_widget_show(hbox);
-
- for (cols = 0; cols < 6; cols++)
- {
- vbox_buttons = gtk_vbox_new(FALSE, 0);
- rows = 0;
-
- gtk_box_pack_start(GTK_BOX(hbox), vbox_buttons, FALSE, FALSE, 0);
-
- while (rows < 6 && predefined_tags[i][0])
- {
- set_osd_button(vbox_buttons, predefined_tags[i][0], predefined_tags[i][1], image_overlay_template_view);
- i = i + 1;
- rows++;
- }
- gtk_widget_show(vbox_buttons);
- }
+
+ scrolled_pre_formatted = osd_new(PRE_FORMATTED_COLUMNS, image_overlay_template_view);
+ gtk_widget_set_size_request(scrolled_pre_formatted, 200, 150);
+ gtk_box_pack_start(GTK_BOX(subgroup), scrolled_pre_formatted, FALSE, FALSE, 0);
+ gtk_widget_show(scrolled_pre_formatted);
+ gtk_widget_show(subgroup);
pref_line(group, PREF_PAD_GAP);
@@ -3081,6 +2953,22 @@
}
/* advanced entry tab */
+static void use_geeqie_trash_cb(GtkWidget *widget, gpointer data)
+{
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+ {
+ c_options->file_ops.use_system_trash = FALSE;
+ }
+}
+
+static void use_system_trash_cb(GtkWidget *widget, gpointer data)
+{
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+ {
+ c_options->file_ops.use_system_trash = TRUE;
+ }
+}
+
static void config_tab_behavior(GtkWidget *notebook)
{
GtkWidget *hbox;
@@ -3099,13 +2987,15 @@
group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL);
- pref_checkbox_new_int(group, _("Confirm file delete"),
+ pref_checkbox_new_int(group, _("Confirm permanent file delete"),
options->file_ops.confirm_delete, &c_options->file_ops.confirm_delete);
+ pref_checkbox_new_int(group, _("Confirm move file to Trash"),
+ options->file_ops.confirm_move_to_trash, &c_options->file_ops.confirm_move_to_trash);
pref_checkbox_new_int(group, _("Enable Delete key"),
options->file_ops.enable_delete_key, &c_options->file_ops.enable_delete_key);
- ct_button = pref_checkbox_new_int(group, _("Safe delete"),
- options->file_ops.safe_delete_enable, &c_options->file_ops.safe_delete_enable);
+ ct_button = pref_radiobutton_new(group, NULL, _("Use Geeqie trash location"),
+ !options->file_ops.use_system_trash, G_CALLBACK(use_geeqie_trash_cb),NULL);
hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
pref_checkbox_link_sensitivity(ct_button, hbox);
@@ -3133,8 +3023,12 @@
button = pref_button_new(NULL, GTK_STOCK_CLEAR, NULL, FALSE,
G_CALLBACK(safe_delete_clear_cb), NULL);
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ pref_radiobutton_new(group, ct_button, _("Use system Trash bin"),
+ options->file_ops.use_system_trash, G_CALLBACK(use_system_trash_cb), NULL);
gtk_widget_show(button);
+ pref_spacer(group, PREF_PAD_GROUP);
+
group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
@@ -3168,6 +3062,8 @@
table = pref_table_new(group, 2, 1, FALSE, FALSE);
add_clipboard_selection_menu(table, 0, 0, _("Copy path clipboard selection:"), options->clipboard_selection, &c_options->clipboard_selection);
+ pref_spacer(group, PREF_PAD_GROUP);
+
group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
@@ -3185,6 +3081,8 @@
#ifdef DEBUG
+ pref_spacer(group, PREF_PAD_GROUP);
+
group = pref_group_new(vbox, FALSE, _("Debugging"), GTK_ORIENTATION_VERTICAL);
pref_spin_new_int(group, _("Debug level:"), NULL,
diff -r c79d70e18076 -r 49bd0d974e88 src/print.c
--- a/src/print.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/print.c Wed Dec 12 21:56:30 2018 +0200
@@ -21,8 +21,11 @@
#include "main.h"
#include "print.h"
+#include "exif.h"
#include "filedata.h"
#include "image-load.h"
+#include "osd.h"
+#include "pixbuf_util.h"
#include "ui_misc.h"
#include "ui_fileops.h"
@@ -35,14 +38,6 @@
/* method to use when scaling down image data */
#define PRINT_MAX_INTERP GDK_INTERP_HYPER
-typedef enum {
- TEXT_INFO_FILENAME = 1 << 0,
- TEXT_INFO_FILEDATE = 1 << 1,
- TEXT_INFO_FILESIZE = 1 << 2,
- TEXT_INFO_DIMENSIONS = 1 << 3,
- TEXT_INFO_FILEPATH = 1 << 4
-} TextInfo;
-
/* reverse order is important */
typedef enum {
FOOTER_2,
@@ -57,9 +52,10 @@
GtkWidget *vbox;
GList *source_selection;
- TextInfo text_fields;
- gint job_page;
+ gint job_page;
GtkTextBuffer *page_text;
+ gchar *template_string;
+ GtkWidget *parent;
ImageLoader *job_loader;
GList *print_pixbuf_queue;
@@ -125,63 +121,6 @@
return TRUE;
}
-static void print_text_field_set(PrintWindow *pw, TextInfo field, gboolean active)
-{
- if (active)
- {
- pw->text_fields |= field;
- }
- else
- {
- pw->text_fields &= ~field;
- }
-}
-
-static void print_text_cb_name(GtkWidget *widget, gpointer data)
-{
- PrintWindow *pw = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- print_text_field_set(pw, TEXT_INFO_FILENAME, active);
-}
-
-static void print_text_cb_path(GtkWidget *widget, gpointer data)
-{
- PrintWindow *pw = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- print_text_field_set(pw, TEXT_INFO_FILEPATH, active);
-}
-
-static void print_text_cb_date(GtkWidget *widget, gpointer data)
-{
- PrintWindow *pw = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- print_text_field_set(pw, TEXT_INFO_FILEDATE, active);
-}
-
-static void print_text_cb_size(GtkWidget *widget, gpointer data)
-{
- PrintWindow *pw = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- print_text_field_set(pw, TEXT_INFO_FILESIZE, active);
-}
-
-static void print_text_cb_dims(GtkWidget *widget, gpointer data)
-{
- PrintWindow *pw = data;
- gboolean active;
-
- active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- print_text_field_set(pw, TEXT_INFO_DIMENSIONS, active);
-}
-
static void print_set_font_cb(GtkWidget *widget, gpointer data)
{
gpointer option;
@@ -369,6 +308,32 @@
}
}
+static void set_print_image_text_string(gchar **template_string, const gchar *value)
+{
+ g_assert(template_string);
+
+ g_free(*template_string);
+ *template_string = g_strdup(value);
+}
+
+static void image_text_template_view_changed_cb(GtkWidget *widget, gpointer data)
+{
+ GtkWidget *pTextView;
+ GtkTextBuffer *pTextBuffer;
+ GtkTextIter iStart;
+ GtkTextIter iEnd;
+
+ pTextView = GTK_WIDGET(data);
+
+ pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pTextView));
+ gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
+ gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
+
+ set_print_image_text_string(&options->printer.template_string,
+ gtk_text_buffer_get_text(pTextBuffer, &iStart, &iEnd, TRUE));
+}
+
+#define PRE_FORMATTED_COLUMNS 4
static void print_text_menu(GtkWidget *box, PrintWindow *pw)
{
GtkWidget *group;
@@ -380,6 +345,10 @@
GtkWidget *page_text_button;
GtkWidget *subgroup;
GtkWidget *page_text_view;
+ GtkWidget *image_text_template_view;
+ GtkWidget *scrolled;
+ GtkWidget *scrolled_pre_formatted;
+ GtkTextBuffer *buffer;
group = pref_group_new(box, FALSE, _("Image text"), GTK_ORIENTATION_VERTICAL);
@@ -409,16 +378,31 @@
gtk_widget_show(hbox);
pw->image_group = (gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1)));
- pref_checkbox_new(subgroup, _("Name"), (pw->text_fields & TEXT_INFO_FILENAME),
- G_CALLBACK(print_text_cb_name), pw);
- pref_checkbox_new(subgroup, _("Path"), (pw->text_fields & TEXT_INFO_FILEPATH),
- G_CALLBACK(print_text_cb_path), pw);
- pref_checkbox_new(subgroup, _("Date"), (pw->text_fields & TEXT_INFO_FILEDATE),
- G_CALLBACK(print_text_cb_date), pw);
- pref_checkbox_new(subgroup, _("Size"), (pw->text_fields & TEXT_INFO_FILESIZE),
- G_CALLBACK(print_text_cb_size), pw);
- pref_checkbox_new(subgroup, _("Dimensions"), (pw->text_fields & TEXT_INFO_DIMENSIONS),
- G_CALLBACK(print_text_cb_dims), pw);
+ image_text_template_view = gtk_text_view_new();
+
+ scrolled_pre_formatted = osd_new(PRE_FORMATTED_COLUMNS, image_text_template_view);
+ gtk_box_pack_start(GTK_BOX(subgroup), scrolled_pre_formatted, FALSE, FALSE, 0);
+ gtk_widget_show(scrolled_pre_formatted);
+ gtk_widget_show(subgroup);
+
+ gtk_widget_set_tooltip_markup(image_text_template_view,
+ _("Extensive formatting options are shown in the Help file"));
+
+ scrolled = gtk_scrolled_window_new(NULL, NULL);
+ gtk_widget_set_size_request(scrolled, 200, 50);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start(GTK_BOX(subgroup), scrolled, TRUE, TRUE, 5);
+ gtk_widget_show(scrolled);
+
+ gtk_container_add(GTK_CONTAINER(scrolled), image_text_template_view);
+ gtk_widget_show(image_text_template_view);
+
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(image_text_template_view));
+ if (options->printer.template_string) gtk_text_buffer_set_text(buffer, options->printer.template_string, -1);
+ g_signal_connect(G_OBJECT(buffer), "changed",
+ G_CALLBACK(image_text_template_view_changed_cb), image_text_template_view);
hbox = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
@@ -464,8 +448,6 @@
gtk_widget_show(hbox);
pw->page_group = (gtk_radio_button_get_group(GTK_RADIO_BUTTON(button2)));
- GtkWidget *scrolled;
-
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_size_request(scrolled, 50, 50);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
@@ -515,6 +497,69 @@
}
}
+gchar *form_image_text(const gchar *template_string, FileData *fd, PrintWindow *pw, gint page_nr, gint total)
+{
+ const gchar *name;
+ gchar *text = NULL;
+ GHashTable *vars;
+ gchar *window_title;
+ gchar *delimiter;
+ gchar *collection_name;
+
+ if (!fd) return NULL;
+
+ name = fd->name;
+
+ vars = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+
+ window_title = g_strdup(gtk_window_get_title(GTK_WINDOW(pw->parent)));
+ delimiter = g_strstr_len(window_title, -1, " - Collection - ");
+ if (delimiter)
+ {
+ collection_name = g_strndup(window_title, delimiter - window_title);
+ }
+ else
+ {
+ collection_name = NULL;
+ }
+ g_free(window_title);
+
+ if (collection_name)
+ {
+ osd_template_insert(vars, "collection", collection_name, OSDT_NONE);
+ }
+
+ osd_template_insert(vars, "number", g_strdup_printf("%d", page_nr + 1), OSDT_NO_DUP);
+ osd_template_insert(vars, "total", g_strdup_printf("%d", total), OSDT_NO_DUP);
+ osd_template_insert(vars, "name", (gchar *) name, OSDT_NONE);
+ osd_template_insert(vars, "date", fd ? ((gchar *) text_from_time(fd->date)) : "", OSDT_NONE);
+ osd_template_insert(vars, "size", fd ? (text_from_size_abrev(fd->size)) : g_strdup(""), OSDT_FREE);
+
+ if (fd->pixbuf)
+ {
+ gint w, h;
+ w = gdk_pixbuf_get_width(fd->pixbuf);
+ h = gdk_pixbuf_get_height(fd->pixbuf);
+
+ osd_template_insert(vars, "width", g_strdup_printf("%d", w), OSDT_NO_DUP);
+ osd_template_insert(vars, "height", g_strdup_printf("%d", h), OSDT_NO_DUP);
+ osd_template_insert(vars, "res", g_strdup_printf("%d × %d", w, h), OSDT_FREE);
+ }
+ else
+ {
+ osd_template_insert(vars, "width", NULL, OSDT_NONE);
+ osd_template_insert(vars, "height", NULL, OSDT_NONE);
+ osd_template_insert(vars, "res", NULL, OSDT_NONE);
+ }
+
+ text = image_osd_mkinfo(template_string, fd, vars);
+ g_hash_table_destroy(vars);
+
+ g_free(collection_name);
+
+ return text;
+}
+
static void draw_page(GtkPrintOperation *operation, GtkPrintContext *context,
gint page_nr, gpointer data)
{
@@ -527,6 +572,7 @@
gdouble height_offset;
GdkPixbuf *pixbuf;
GdkPixbuf *pixbuf_scaled;
+ GdkPixbuf *rotated = NULL;
PangoLayout *layout_image = NULL;
PangoLayout *layout_page = NULL;
PangoFontDescription *desc;
@@ -542,45 +588,24 @@
gdouble pango_page_height;
GtkTextIter start, end;
gchar *tmp;
+ gint total;
+
+ fd = g_list_nth_data(pw->source_selection, page_nr);
+ total = g_list_length(pw->source_selection);
pixbuf = g_list_nth_data(pw->print_pixbuf_queue, page_nr);
+ if (fd->exif_orientation != EXIF_ORIENTATION_TOP_LEFT)
+ {
+ rotated = pixbuf_apply_orientation(pixbuf, fd->exif_orientation);
+ pixbuf = rotated;
+ }
+
pixbuf_image_width = gdk_pixbuf_get_width(pixbuf);
pixbuf_image_height = gdk_pixbuf_get_height(pixbuf);
- fd = g_list_nth_data(pw->source_selection, page_nr);
-
if (options->printer.show_image_text)
{
- if (pw->text_fields & TEXT_INFO_FILENAME)
- {
- image_text = g_string_append(image_text, g_strdup(fd->name));
- image_text = g_string_append(image_text, "\n");
- }
- if (pw->text_fields & TEXT_INFO_FILEDATE)
- {
- image_text = g_string_append(image_text, g_strdup(text_from_time(fd->date)));
- image_text = g_string_append(image_text, "\n");
- }
- if (pw->text_fields & TEXT_INFO_FILESIZE)
- {
- image_text = g_string_append(image_text, g_strdup(text_from_size(fd->size)));
- image_text = g_string_append(image_text, "\n");
- }
- if (pw->text_fields & TEXT_INFO_DIMENSIONS)
- {
- g_string_append_printf(image_text, "%d x %d", (gint)pixbuf_image_width,
- (gint)pixbuf_image_height);
- image_text = g_string_append(image_text, "\n");
- }
- if (pw->text_fields & TEXT_INFO_FILEPATH)
- {
- image_text = g_string_append(image_text, g_strdup(fd->path));
- image_text = g_string_append(image_text, "\n");
- }
- if (image_text->len > 0)
- {
- image_text = g_string_truncate(image_text, image_text->len - 1);
- }
+ image_text = g_string_append(image_text, form_image_text(options->printer.template_string, fd, pw, page_nr, total));
}
if (options->printer.show_page_text)
@@ -749,6 +774,7 @@
}
g_object_unref(pixbuf_scaled);
+ if (rotated) g_object_unref(rotated);
return;
}
@@ -779,8 +805,6 @@
gchar *tmp;
GtkTextIter start, end;
- options->printer.text_fields = pw->text_fields;
-
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(pw->page_text), &start, &end);
tmp = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(pw->page_text), &start, &end, FALSE);
g_free(options->printer.page_text);
@@ -857,13 +881,14 @@
pw = g_new0(PrintWindow, 1);
pw->source_selection = file_data_process_groups_in_selection(selection, FALSE, NULL);
- pw->text_fields = options->printer.text_fields;
if (print_layout_page_count(pw) == 0)
{
return;
}
+ pw->parent = parent;
+
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
gtk_widget_show(vbox);
diff -r c79d70e18076 -r 49bd0d974e88 src/rcfile.c
--- a/src/rcfile.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/rcfile.c Wed Dec 12 21:56:30 2018 +0200
@@ -355,7 +355,9 @@
/* File operations Options */
WRITE_NL(); WRITE_BOOL(*options, file_ops.enable_in_place_rename);
WRITE_NL(); WRITE_BOOL(*options, file_ops.confirm_delete);
+ WRITE_NL(); WRITE_BOOL(*options, file_ops.confirm_move_to_trash);
WRITE_NL(); WRITE_BOOL(*options, file_ops.enable_delete_key);
+ WRITE_NL(); WRITE_BOOL(*options, file_ops.use_system_trash);
WRITE_NL(); WRITE_BOOL(*options, file_ops.safe_delete_enable);
WRITE_NL(); WRITE_CHAR(*options, file_ops.safe_delete_path);
WRITE_NL(); WRITE_INT(*options, file_ops.safe_delete_folder_maxsize);
@@ -495,15 +497,18 @@
WRITE_NL(); WRITE_CHAR(*options, cp_mv_rn.auto_end);
WRITE_NL(); WRITE_INT(*options, cp_mv_rn.formatted_start);
- /* printer */
+ WRITE_SEPARATOR();
+
+ /* Print Text */
+ WRITE_NL(); WRITE_CHAR(*options, printer.template_string);
WRITE_NL(); WRITE_CHAR(*options, printer.image_font);
WRITE_NL(); WRITE_CHAR(*options, printer.page_font);
WRITE_NL(); WRITE_CHAR(*options, printer.page_text);
- WRITE_NL(); WRITE_INT(*options, printer.text_fields);
WRITE_NL(); WRITE_INT(*options, printer.image_text_position);
WRITE_NL(); WRITE_INT(*options, printer.page_text_position);
WRITE_NL(); WRITE_BOOL(*options, printer.show_image_text);
WRITE_NL(); WRITE_BOOL(*options, printer.show_page_text);
+ WRITE_SEPARATOR();
}
static void write_color_profile(GString *outstr, gint indent)
@@ -551,6 +556,38 @@
WRITE_NL(); WRITE_STRING("");
}
+static void write_disabled_plugins(GString *outstr, gint indent)
+{
+ GtkTreeIter iter;
+ gboolean valid;
+ gboolean disabled;
+ gchar *desktop_path;
+
+ WRITE_NL(); WRITE_STRING("");
+ indent++;
+
+ if (desktop_file_list)
+ {
+ valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(desktop_file_list), &iter);
+ while (valid)
+ {
+ gtk_tree_model_get(GTK_TREE_MODEL(desktop_file_list), &iter, DESKTOP_FILE_COLUMN_DISABLED, &disabled, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(desktop_file_list), &iter, DESKTOP_FILE_COLUMN_PATH, &desktop_path, -1);
+
+ if (disabled)
+ {
+ WRITE_NL();
+ write_char_option(outstr, indent, "");
+ }
+ g_free(desktop_path);
+ valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(desktop_file_list), &iter);
+ }
+ }
+
+ indent--;
+ WRITE_NL(); WRITE_STRING("");
+}
/*
*-----------------------------------------------------------------------------
@@ -608,6 +645,9 @@
write_marks_tooltips(outstr, indent);
WRITE_SEPARATOR();
+ write_disabled_plugins(outstr, indent);
+
+ WRITE_SEPARATOR();
keyword_tree_write_config(outstr, indent);
indent--;
WRITE_NL(); WRITE_STRING("\n");
@@ -751,7 +791,9 @@
/* File operations *options */
if (READ_BOOL(*options, file_ops.enable_in_place_rename)) continue;
if (READ_BOOL(*options, file_ops.confirm_delete)) continue;
+ if (READ_BOOL(*options, file_ops.confirm_move_to_trash)) continue;
if (READ_BOOL(*options, file_ops.enable_delete_key)) continue;
+ if (READ_BOOL(*options, file_ops.use_system_trash)) continue;
if (READ_BOOL(*options, file_ops.safe_delete_enable)) continue;
if (READ_CHAR(*options, file_ops.safe_delete_path)) continue;
if (READ_INT(*options, file_ops.safe_delete_folder_maxsize)) continue;
@@ -839,11 +881,11 @@
if (READ_CHAR(*options, cp_mv_rn.auto_end)) continue;
if (READ_INT(*options, cp_mv_rn.formatted_start)) continue;
- /* printer */
+ /* Printer text */
+ if (READ_CHAR(*options, printer.template_string)) continue;
if (READ_CHAR(*options, printer.image_font)) continue;
if (READ_CHAR(*options, printer.page_font)) continue;
if (READ_CHAR(*options, printer.page_text)) continue;
- if (READ_INT(*options, printer.text_fields)) continue;
if (READ_INT(*options, printer.image_text_position)) continue;
if (READ_INT(*options, printer.page_text_position)) continue;
if (READ_BOOL(*options, printer.show_image_text)) continue;
@@ -914,6 +956,30 @@
}
+static void options_load_disabled_plugins(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
+{
+ gint i = GPOINTER_TO_INT(data);
+ struct {
+ gchar *path;
+ } tmp;
+
+ while (*attribute_names)
+ {
+ const gchar *option = *attribute_names++;
+ const gchar *value = *attribute_values++;
+ tmp.path = NULL;
+ if (READ_CHAR_FULL("path", tmp.path))
+ {
+ options->disabled_plugins = g_list_append(options->disabled_plugins, g_strdup(tmp.path));
+ continue;
+ }
+
+ log_printf("unknown attribute %s = %s\n", option, value);
+ }
+ i++;
+ options_parse_func_set_data(parser_data, GINT_TO_POINTER(i));
+}
+
/*
*-----------------------------------------------------------------------------
* xml file structure (private)
@@ -973,6 +1039,20 @@
}
}
+static void options_parse_disabled_plugins(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
+{
+ if (g_ascii_strcasecmp(element_name, "plugin") == 0)
+ {
+ options_load_disabled_plugins(parser_data, context, element_name, attribute_names, attribute_values, data, error);
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
+ else
+ {
+ log_printf("unexpected in : <%s>\n", element_name);
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
+}
+
static void options_parse_filter(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
{
if (g_ascii_strcasecmp(element_name, "file_type") == 0)
@@ -1053,6 +1133,11 @@
if (!keyword_tree) keyword_tree_new();
options_parse_func_push(parser_data, options_parse_keyword_tree, NULL, NULL);
}
+ else if (g_ascii_strcasecmp(element_name, "disabled_plugins") == 0)
+ {
+ options_load_disabled_plugins(parser_data, context, element_name, attribute_names, attribute_values, data, error);
+ options_parse_func_push(parser_data, options_parse_disabled_plugins, NULL, NULL);
+ }
else
{
log_printf("unexpected in : <%s>\n", element_name);
diff -r c79d70e18076 -r 49bd0d974e88 src/remote.c
--- a/src/remote.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/remote.c Wed Dec 12 21:56:30 2018 +0200
@@ -718,6 +718,35 @@
}
}
+static void gr_render_intent(const gchar *text, GIOChannel *channel, gpointer data)
+{
+ gchar *render_intent;
+
+ switch (options->color_profile.render_intent)
+ {
+ case 0:
+ render_intent = g_strdup("Perceptual");
+ break;
+ case 1:
+ render_intent = g_strdup("Relative Colorimetric");
+ break;
+ case 2:
+ render_intent = g_strdup("Saturation");
+ break;
+ case 3:
+ render_intent = g_strdup("Absolute Colorimetric");
+ break;
+ default:
+ render_intent = g_strdup("none");
+ break;
+ }
+
+ g_io_channel_write_chars(channel, render_intent, -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+
+ g_free(render_intent);
+}
+
static void gr_file_tell(const gchar *text, GIOChannel *channel, gpointer data)
{
if (!layout_valid(&lw_id)) return;
@@ -910,6 +939,7 @@
{ NULL, "--tell", gr_file_tell, FALSE, FALSE, NULL, N_("print filename of current image") },
{ NULL, "--pixel-info", gr_pixel_info, FALSE, FALSE, NULL, N_("print pixel info of mouse pointer on current image") },
{ NULL, "--get-rectangle", gr_rectangle, FALSE, FALSE, NULL, N_("get rectangle co-ordinates") },
+ { NULL, "--get-render-intent", gr_render_intent, FALSE, FALSE, NULL, N_("get render intent") },
{ NULL, "view:", gr_file_view, TRUE, FALSE, N_(""), N_("open FILE in new window") },
{ NULL, "--list-clear", gr_list_clear, FALSE, FALSE, NULL, N_("clear command line collection list") },
{ NULL, "--list-add:", gr_list_add, TRUE, FALSE, N_(""), N_("add FILE to command line collection list") },
diff -r c79d70e18076 -r 49bd0d974e88 src/search.c
--- a/src/search.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/search.c Wed Dec 12 21:56:30 2018 +0200
@@ -37,6 +37,7 @@
#include "menu.h"
#include "metadata.h"
#include "misc.h"
+#include "pixbuf_util.h"
#include "print.h"
#include "thumb.h"
#include "ui_bookmark.h"
@@ -1015,6 +1016,15 @@
{
SearchData *sd = data;
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(NULL, search_result_selection_list(sd), sd->window);
+}
+
+static void sr_menu_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ SearchData *sd = data;
+
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, search_result_selection_list(sd), sd->window);
}
@@ -1128,13 +1138,16 @@
G_CALLBACK(sr_menu_copy_path_cb), sd);
menu_item_add_sensitive(menu, _("_Copy path unquoted"), on_row,
G_CALLBACK(sr_menu_copy_path_unquoted_cb), sd);
- menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, on_row,
- G_CALLBACK(sr_menu_delete_cb), sd);
+
menu_item_add_divider(menu);
- menu_item_add_stock_sensitive(menu, _("Rem_ove"), GTK_STOCK_REMOVE, on_row,
- G_CALLBACK(sr_menu_remove_cb), sd);
- menu_item_add_stock_sensitive(menu, _("C_lear"), GTK_STOCK_CLEAR, !empty,
- G_CALLBACK(sr_menu_clear_cb), sd);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH, on_row,
+ G_CALLBACK(sr_menu_move_to_trash_cb), sd);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE, on_row,
+ G_CALLBACK(sr_menu_delete_cb), sd);
return menu;
}
@@ -1345,6 +1358,7 @@
file_util_rename(NULL, search_result_selection_list(sd), widget);
break;
case 'D': case 'd':
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, search_result_selection_list(sd), widget);
break;
case 'A': case 'a':
diff -r c79d70e18076 -r 49bd0d974e88 src/toolbar.c
--- a/src/toolbar.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/toolbar.c Wed Dec 12 21:56:30 2018 +0200
@@ -100,6 +100,12 @@
{"Preferences", N_("Preferences"), GTK_STOCK_PREFERENCES},
{"LayoutConfig", N_("Configure this window"), GTK_STOCK_PREFERENCES},
{"Maintenance", N_("Cache maintenance"), PIXBUF_INLINE_ICON_MAINTENANCE},
+ {"RotateCW", N_("Rotate clockwise"), PIXBUF_INLINE_ICON_CW},
+ {"RotateCCW", N_("Rotate counterclockwise"), PIXBUF_INLINE_ICON_CCW},
+ {"Rotate180", N_("Rotate 180"), PIXBUF_INLINE_ICON_180},
+ {"Mirror", N_("Mirror"), PIXBUF_INLINE_ICON_MIRROR},
+ {"Flip", N_("Flip"), PIXBUF_INLINE_ICON_FLIP},
+ {"AlterNone", N_("Original state"), PIXBUF_INLINE_ICON_ORIGINAL},
{"ZoomIn", N_("Zoom in"), GTK_STOCK_ZOOM_IN},
{"ZoomOut", N_("Zoom out"), GTK_STOCK_ZOOM_OUT},
{"Zoom100", N_("Zoom 1:1"), GTK_STOCK_ZOOM_100},
diff -r c79d70e18076 -r 49bd0d974e88 src/trash.c
--- a/src/trash.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/trash.c Wed Dec 12 21:56:30 2018 +0200
@@ -118,11 +118,6 @@
return dest;
}
-static void file_util_safe_del_toggle_cb(GtkWidget *button, gpointer data)
-{
- options->file_ops.safe_delete_enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-}
-
static void file_util_safe_del_close_cb(GtkWidget *dialog, gpointer data)
{
GenericDialog **gd = data;
@@ -138,55 +133,55 @@
if (!isfile(path)) return FALSE;
- if (!isdir(options->file_ops.safe_delete_path))
- {
- DEBUG_1("creating trash: %s", options->file_ops.safe_delete_path);
- if (!options->file_ops.safe_delete_path || !mkdir_utf8(options->file_ops.safe_delete_path, 0755))
- {
- result = _("Could not create folder");
- success = FALSE;
- }
- }
-
- if (success)
+ if (!options->file_ops.use_system_trash)
{
- gchar *dest;
-
- dest = file_util_safe_dest(path);
- if (dest)
+ if (!isdir(options->file_ops.safe_delete_path))
{
- DEBUG_1("safe deleting %s to %s", path, dest);
- success = move_file(path, dest);
- }
- else
- {
- success = FALSE;
+ DEBUG_1("creating trash: %s", options->file_ops.safe_delete_path);
+ if (!options->file_ops.safe_delete_path || !mkdir_utf8(options->file_ops.safe_delete_path, 0755))
+ {
+ result = _("Could not create folder");
+ success = FALSE;
+ }
}
- if (!success && !access_file(path, W_OK))
+ if (success)
{
- result = _("Permission denied");
- }
- g_free(dest);
- }
+ gchar *dest;
- if (result && !gd)
- {
- GtkWidget *button;
- gchar *buf;
+ dest = file_util_safe_dest(path);
+ if (dest)
+ {
+ DEBUG_1("safe deleting %s to %s", path, dest);
+ success = move_file(path, dest);
+ }
+ else
+ {
+ success = FALSE;
+ }
- buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), options->file_ops.safe_delete_path);
- gd = file_util_warning_dialog(result, buf, GTK_STOCK_DIALOG_WARNING, NULL);
- g_free(buf);
+ if (!success && !access_file(path, W_OK))
+ {
+ result = _("Permission denied");
+ }
+ g_free(dest);
+ }
- button = gtk_check_button_new_with_label(_("Turn off safe delete"));
- g_signal_connect(G_OBJECT(button), "toggled",
- G_CALLBACK(file_util_safe_del_toggle_cb), NULL);
- gtk_box_pack_start(GTK_BOX(gd->vbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
+ if (result && !gd)
+ {
+ GtkWidget *button;
+ gchar *buf;
- g_signal_connect(G_OBJECT(gd->dialog), "destroy",
- G_CALLBACK(file_util_safe_del_close_cb), &gd);
+ buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), options->file_ops.safe_delete_path);
+ gd = file_util_warning_dialog(result, buf, GTK_STOCK_DIALOG_WARNING, NULL);
+ g_free(buf);
+ }
+ }
+ else
+ {
+ GFile *tmp = g_file_new_for_path (path);
+ g_file_trash(tmp, FALSE, NULL);
+ g_object_unref(tmp);
}
return success;
@@ -194,7 +189,7 @@
gchar *file_util_safe_delete_status(void)
{
- gchar *buf;
+ gchar *buf = NULL;
if (is_valid_editor_command(CMD_DELETE))
{
@@ -204,18 +199,21 @@
{
if (options->file_ops.safe_delete_enable)
{
- gchar *buf2;
- if (options->file_ops.safe_delete_folder_maxsize > 0)
- buf2 = g_strdup_printf(_(" (max. %d MB)"), options->file_ops.safe_delete_folder_maxsize);
- else
- buf2 = g_strdup("");
+ if (!options->file_ops.use_system_trash)
+ {
+ gchar *buf2;
+ if (options->file_ops.safe_delete_folder_maxsize > 0)
+ buf2 = g_strdup_printf(_(" (max. %d MB)"), options->file_ops.safe_delete_folder_maxsize);
+ else
+ buf2 = g_strdup("");
- buf = g_strdup_printf(_("Safe delete: %s%s\nTrash: %s"), _("on"), buf2, options->file_ops.safe_delete_path);
- g_free(buf2);
- }
- else
- {
- buf = g_strdup_printf(_("Safe delete: %s"), _("off"));
+ buf = g_strdup_printf(_("Using Geeqie Trash bin\n%s"), buf2);
+ g_free(buf2);
+ }
+ else
+ {
+ buf = g_strdup(_("Using system Trash bin"));
+ }
}
}
diff -r c79d70e18076 -r 49bd0d974e88 src/typedefs.h
--- a/src/typedefs.h Tue Oct 02 22:50:14 2018 +0300
+++ b/src/typedefs.h Wed Dec 12 21:56:30 2018 +0200
@@ -992,6 +992,7 @@
GdkPixbuf *open;
GdkPixbuf *deny;
GdkPixbuf *parent;
+ GdkPixbuf *link;
};
struct _SecureSaveInfo {
diff -r c79d70e18076 -r 49bd0d974e88 src/ui_fileops.c
--- a/src/ui_fileops.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/ui_fileops.c Wed Dec 12 21:56:30 2018 +0200
@@ -570,36 +570,27 @@
{
gchar *absolute;
- char *lastslash = strrchr(sl, G_DIR_SEPARATOR);
- int len = lastslash - sl + 1;
+ gchar *lastslash = strrchr(sl, G_DIR_SEPARATOR);
+ gint len = lastslash - sl + 1;
- int path_max;
-#ifdef PATH_MAX
- path_max = PATH_MAX;
-#else
- path_max = pathconf(sl, _PC_PATH_MAX);
- if (path_max <= 0)
- path_max = 4096;
-#endif
-
- absolute = g_malloc(path_max + 1);
-
+ absolute = g_malloc(len + st.st_size + 1);
strncpy(absolute, sl, len);
strcpy(absolute + len, link_target);
- strcpy(link_target, absolute);
+ g_free(link_target);
+ link_target = absolute;
- char *realPath;
- realPath = realpath(link_target, absolute);
+ gchar *realPath;
+ realPath = realpath(link_target, NULL);
if (realPath != NULL) // successfully resolved into an absolute path
{
g_free(link_target);
- link_target = absolute;
+ link_target = g_strdup(realPath);
+ g_free(realPath);
}
else // could not get absolute path, got some error instead
{
g_free(link_target);
- g_free(absolute);
goto orig_copy; // so try a "normal" copy
}
}
diff -r c79d70e18076 -r 49bd0d974e88 src/utilops.c
--- a/src/utilops.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/utilops.c Wed Dec 12 21:56:30 2018 +0200
@@ -2144,6 +2144,7 @@
{
UtilityData *ud;
GList *ungrouped = NULL;
+ gchar *message;
if (source_fd)
flist = g_list_append(flist, file_data_ref(source_fd));
@@ -2176,10 +2177,17 @@
ud->parent = parent;
ud->details_func = file_util_details_dialog;
-
+ if(options->file_ops.safe_delete_enable)
+ {
+ message = _("This will move the following files to the Trash bin");
+ }
+ else
+ {
+ message = _("This will permanently delete the following files");
+ }
ud->messages.title = _("Delete");
ud->messages.question = _("Delete files?");
- ud->messages.desc_flist = _("This will delete the following files");
+ ud->messages.desc_flist = message;
ud->messages.desc_source_fd = "";
ud->messages.fail = _("File deletion failed");
diff -r c79d70e18076 -r 49bd0d974e88 src/view_dir.c
--- a/src/view_dir.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/view_dir.c Wed Dec 12 21:56:30 2018 +0200
@@ -49,6 +49,8 @@
pf->open = gtk_widget_render_icon(widget, GTK_STOCK_OPEN, size, NULL);
pf->deny = gtk_widget_render_icon(widget, GTK_STOCK_STOP, size, NULL);
pf->parent = gtk_widget_render_icon(widget, GTK_STOCK_GO_UP, size, NULL);
+ /* FIXME: this is not a suitable icon */
+ pf->link = gtk_widget_render_icon(widget, GTK_STOCK_REDO, size, NULL);
#else
/* GQView legacy icons */
pf->close = pixbuf_inline(PIXBUF_INLINE_FOLDER_CLOSED);
@@ -67,6 +69,7 @@
g_object_unref(pf->open);
g_object_unref(pf->deny);
g_object_unref(pf->parent);
+ g_object_unref(pf->link);
g_free(pf);
}
diff -r c79d70e18076 -r 49bd0d974e88 src/view_dir.h
--- a/src/view_dir.h Tue Oct 02 22:50:14 2018 +0300
+++ b/src/view_dir.h Wed Dec 12 21:56:30 2018 +0200
@@ -27,6 +27,7 @@
DIR_COLUMN_NAME,
DIR_COLUMN_COLOR,
DIR_COLUMN_DATE,
+ DIR_COLUMN_LINK,
DIR_COLUMN_COUNT
};
diff -r c79d70e18076 -r 49bd0d974e88 src/view_dir_list.c
--- a/src/view_dir_list.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/view_dir_list.c Wed Dec 12 21:56:30 2018 +0200
@@ -149,6 +149,7 @@
FileData *fd;
SortType sort_type = SORT_NAME;
gboolean sort_ascend = TRUE;
+ gchar *link;
old_list = VDLIST(vd)->list;
@@ -190,7 +191,11 @@
if (access_file(fd->path, R_OK | X_OK) && fd->name)
{
- if (fd->name[0] == '.' && fd->name[1] == '\0')
+ if (islink(fd->path))
+ {
+ pixbuf = vd->pf->link;
+ }
+ else if (fd->name[0] == '.' && fd->name[1] == '\0')
{
pixbuf = vd->pf->open;
}
@@ -237,6 +242,15 @@
match = -1;
}
+ if (islink(fd->path))
+ {
+ link = realpath(fd->path, NULL);
+ }
+ else
+ {
+ link = NULL;
+ }
+
if (match < 0)
{
GtkTreeIter new;
@@ -254,6 +268,7 @@
DIR_COLUMN_POINTER, fd,
DIR_COLUMN_ICON, pixbuf,
DIR_COLUMN_NAME, fd->name,
+ DIR_COLUMN_LINK, link,
DIR_COLUMN_DATE, date,
-1);
@@ -268,6 +283,7 @@
gtk_list_store_set(store, &iter,
DIR_COLUMN_ICON, pixbuf,
DIR_COLUMN_NAME, fd->name,
+ DIR_COLUMN_LINK, link,
DIR_COLUMN_DATE, date,
-1);
@@ -292,6 +308,7 @@
vd->drop_fd = NULL;
filelist_free(old_list);
+ g_free(link);
return ret;
}
@@ -433,7 +450,7 @@
vd->type = DIRVIEW_LIST;
- store = gtk_list_store_new(5, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
+ store = gtk_list_store_new(6, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
vd->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
g_object_unref(store);
@@ -463,6 +480,8 @@
gtk_tree_view_append_column(GTK_TREE_VIEW(vd->view), column);
+ gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(vd->view), DIR_COLUMN_LINK);
+
return vd;
}
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r c79d70e18076 -r 49bd0d974e88 src/view_dir_tree.c
--- a/src/view_dir_tree.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/view_dir_tree.c Wed Dec 12 21:56:30 2018 +0200
@@ -133,6 +133,8 @@
{
GtkTreeModel *store;
GtkTreePath *tpath;
+ NodeData *nd;
+ FileData *fd = NULL;
store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
tpath = gtk_tree_model_get_path(store, iter);
@@ -143,7 +145,18 @@
that the iter is populated */
g_signal_handlers_block_by_func(G_OBJECT(vd->view), vdtree_row_expanded, vd);
gtk_tree_view_expand_row(GTK_TREE_VIEW(vd->view), tpath, FALSE);
- vdtree_icon_set_by_iter(vd, iter, vd->pf->open);
+ gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
+ fd = (nd) ? nd->fd : NULL;
+
+ if (fd && islink(fd->path))
+ {
+ vdtree_icon_set_by_iter(vd, iter, vd->pf->link);
+ }
+ else
+ {
+ vdtree_icon_set_by_iter(vd, iter, vd->pf->open);
+ }
+
g_signal_handlers_unblock_by_func(G_OBJECT(vd->view), vdtree_row_expanded, vd);
}
else
@@ -379,12 +392,20 @@
GdkPixbuf *pixbuf;
NodeData *end;
GtkTreeIter empty;
+ gchar *link = NULL;
if (!fd) return;
if (access_file(fd->path, R_OK | X_OK))
{
- pixbuf = vd->pf->close;
+ if (islink(fd->path))
+ {
+ pixbuf = vd->pf->link;
+ }
+ else
+ {
+ pixbuf = vd->pf->close;
+ }
}
else
{
@@ -397,11 +418,21 @@
nd->expanded = FALSE;
nd->last_update = time(NULL);
+ if (islink(fd->path))
+ {
+ link = realpath(fd->path, NULL);
+ }
+ else
+ {
+ link = NULL;
+ }
+
store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)));
gtk_tree_store_append(store, &child, parent);
gtk_tree_store_set(store, &child, DIR_COLUMN_POINTER, nd,
DIR_COLUMN_ICON, pixbuf,
DIR_COLUMN_NAME, nd->fd->name,
+ DIR_COLUMN_LINK, link,
DIR_COLUMN_COLOR, FALSE, -1);
/* all nodes are created with an "empty" node, so that the expander is shown
@@ -429,6 +460,8 @@
}
gtk_tree_path_free(tpath);
}
+
+ g_free(link);
}
gboolean vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean force, FileData *target_fd)
@@ -441,6 +474,7 @@
GtkTreeIter child;
NodeData *nd;
gboolean add_hidden = FALSE;
+ gchar *link = NULL;
store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
@@ -542,6 +576,18 @@
}
gtk_tree_store_set(GTK_TREE_STORE(store), &child, DIR_COLUMN_NAME, fd->name, -1);
+
+ if (islink(fd->path))
+ {
+ link = realpath(fd->path, NULL);
+ }
+ else
+ {
+ link = NULL;
+ }
+
+ gtk_tree_store_set(GTK_TREE_STORE(store), &child, DIR_COLUMN_LINK, link, -1);
+
cnd->version = fd->version;
old = g_list_remove(old, cnd);
file_data_unref(fd);
@@ -577,6 +623,8 @@
nd->expanded = TRUE;
nd->last_update = current_time;
+ g_free(link);
+
return TRUE;
}
@@ -783,7 +831,15 @@
if (fd)
{
vdtree_populate_path_by_iter(vd, &iter, FALSE, vd->dir_fd);
- vdtree_icon_set_by_iter(vd, &iter, vd->pf->open);
+
+ if (islink(fd->path))
+ {
+ vdtree_icon_set_by_iter(vd, &iter, vd->pf->link);
+ }
+ else
+ {
+ vdtree_icon_set_by_iter(vd, &iter, vd->pf->open);
+ }
}
break;
}
@@ -822,6 +878,7 @@
GtkTreeViewColumn *column;
GtkTreeIter iter;
NodeData *nd = NULL;
+ FileData *fd;
if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
&tpath, &column, NULL, NULL))
@@ -846,7 +903,16 @@
!gtk_tree_view_row_expanded(GTK_TREE_VIEW(vd->view), tpath))
{
vdtree_populate_path_by_iter(vd, &iter, FALSE, vd->dir_fd);
- vdtree_icon_set_by_iter(vd, &iter, vd->pf->open);
+
+ fd = (nd) ? nd->fd : NULL;
+ if (fd && islink(fd->path))
+ {
+ vdtree_icon_set_by_iter(vd, &iter, vd->pf->link);
+ }
+ else
+ {
+ vdtree_icon_set_by_iter(vd, &iter, vd->pf->open);
+ }
}
gtk_tree_path_free(tpath);
@@ -872,16 +938,51 @@
static void vdtree_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data)
{
ViewDir *vd = data;
+ GtkTreeModel *store;
+ NodeData *nd = NULL;
+ FileData *fd;
+
+ gtk_tree_view_set_tooltip_column(treeview, DIR_COLUMN_LINK);
vdtree_populate_path_by_iter(vd, iter, FALSE, NULL);
- vdtree_icon_set_by_iter(vd, iter, vd->pf->open);
+ store = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+
+ gtk_tree_model_get_iter(store, iter, tpath);
+ gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
+
+ fd = (nd) ? nd->fd : NULL;
+ if (fd && islink(fd->path))
+ {
+ vdtree_icon_set_by_iter(vd, iter, vd->pf->link);
+ }
+ else
+ {
+ vdtree_icon_set_by_iter(vd, iter, vd->pf->open);
+ }
}
static void vdtree_row_collapsed(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data)
{
ViewDir *vd = data;
+ GtkTreeModel *store;
+ NodeData *nd = NULL;
+ FileData *fd;
- vdtree_icon_set_by_iter(vd, iter, vd->pf->close);
+ vdtree_populate_path_by_iter(vd, iter, FALSE, NULL);
+ store = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+
+ gtk_tree_model_get_iter(store, iter, tpath);
+ gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
+
+ fd = (nd) ? nd->fd : NULL;
+ if (fd && islink(fd->path))
+ {
+ vdtree_icon_set_by_iter(vd, iter, vd->pf->link);
+ }
+ else
+ {
+ vdtree_icon_set_by_iter(vd, iter, vd->pf->close);
+ }
}
static gint vdtree_sort_cb(GtkTreeModel *store, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
@@ -958,7 +1059,7 @@
vd->dnd_drop_leave_func = vdtree_dnd_drop_expand_cancel;
vd->dnd_drop_update_func = vdtree_dnd_drop_expand;
- store = gtk_tree_store_new(4, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT);
+ store = gtk_tree_store_new(6, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING);
vd->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
g_object_unref(store);
@@ -987,6 +1088,8 @@
gtk_tree_view_append_column(GTK_TREE_VIEW(vd->view), column);
+ gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(vd->view), DIR_COLUMN_LINK);
+
vdtree_setup_root(vd);
g_signal_connect(G_OBJECT(vd->view), "row_expanded",
diff -r c79d70e18076 -r 49bd0d974e88 src/view_file.h
--- a/src/view_file.h Tue Oct 02 22:50:14 2018 +0300
+++ b/src/view_file.h Wed Dec 12 21:56:30 2018 +0200
@@ -54,7 +54,6 @@
guint vf_count(ViewFile *vf, gint64 *bytes);
GList *vf_get_list(ViewFile *vf);
-gint vf_index_is_selected(ViewFile *vf, gint row);
guint vf_selection_count(ViewFile *vf, gint64 *bytes);
GList *vf_selection_get_list(ViewFile *vf);
GList *vf_selection_get_list_by_index(ViewFile *vf);
diff -r c79d70e18076 -r 49bd0d974e88 src/view_file/view_file.c
--- a/src/view_file/view_file.c Tue Oct 02 22:50:14 2018 +0300
+++ b/src/view_file/view_file.c Wed Dec 12 21:56:30 2018 +0200
@@ -28,6 +28,7 @@
#include "history_list.h"
#include "layout.h"
#include "menu.h"
+#include "pixbuf_util.h"
#include "thumb.h"
#include "ui_menu.h"
#include "ui_fileops.h"
@@ -170,16 +171,6 @@
*-----------------------------------------------------------------------------
*/
-gboolean vf_index_is_selected(ViewFile *vf, gint row)
-{
- switch (vf->type)
- {
- case FILEVIEW_LIST: return vflist_index_is_selected(vf, row);
- case FILEVIEW_ICON: return vficon_index_is_selected(vf, row);
- }
-}
-
-
guint vf_selection_count(ViewFile *vf, gint64 *bytes)
{
switch (vf->type)
@@ -353,6 +344,15 @@
{
ViewFile *vf = data;
+ options->file_ops.safe_delete_enable = FALSE;
+ file_util_delete(NULL, vf_pop_menu_file_list(vf), vf->listview);
+}
+
+static void vf_pop_menu_move_to_trash_cb(GtkWidget *widget, gpointer data)
+{
+ ViewFile *vf = data;
+
+ options->file_ops.safe_delete_enable = TRUE;
file_util_delete(NULL, vf_pop_menu_file_list(vf), vf->listview);
}
@@ -634,8 +634,15 @@
G_CALLBACK(vf_pop_menu_copy_path_cb), vf);
menu_item_add_sensitive(menu, _("_Copy path unquoted"), active,
G_CALLBACK(vf_pop_menu_copy_path_unquoted_cb), vf);
- menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
- G_CALLBACK(vf_pop_menu_delete_cb), vf);
+ menu_item_add_divider(menu);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_move_to_trash ? _("Move to Trash...") :
+ _("Move to Trash"), PIXBUF_INLINE_ICON_TRASH, active,
+ G_CALLBACK(vf_pop_menu_move_to_trash_cb), vf);
+ menu_item_add_stock_sensitive(menu,
+ options->file_ops.confirm_delete ? _("_Delete...") :
+ _("_Delete"), GTK_STOCK_DELETE, active,
+ G_CALLBACK(vf_pop_menu_delete_cb), vf);
menu_item_add_divider(menu);
menu_item_add_sensitive(menu, _("Enable file _grouping"), active,
diff -r c79d70e18076 -r 49bd0d974e88 web/geeqie-install-debian.sh
--- a/web/geeqie-install-debian.sh Tue Oct 02 22:50:14 2018 +0300
+++ b/web/geeqie-install-debian.sh Wed Dec 12 21:56:30 2018 +0200
@@ -1,5 +1,5 @@
#!/bin/bash
-version="2018-08-20"
+version="2018-10-23"
description=$'
Geeqie is an image viewer.
This script will download, compile, and install Geeqie on Debian-based systems.
@@ -51,8 +51,16 @@
"imagemagick"
"ufraw (for RAW file handling)"
"ufraw"
+"exiv2 command line (for jpeg export)"
+"exiv2"
+"jpgicc (for jpeg export color correction)"
+"liblcms2-utils"
"markdown (for generating README help file)"
"markdown"
+"gphoto2 (for tethered photography and camera download plugins)"
+"gphoto2"
+"libimage-exiftool-perl (for jpeg extraction plugin)"
+"libimage-exiftool-perl"
)
# Optional for GTK3 only
diff -r c79d70e18076 -r 49bd0d974e88 web/help/GuideOptionsBehavior.html
--- a/web/help/GuideOptionsBehavior.html Tue Oct 02 22:50:14 2018 +0300
+++ b/web/help/GuideOptionsBehavior.html Wed Dec 12 21:56:30 2018 +0200
@@ -477,12 +477,18 @@
-
- Confirm file delete
+ Confirm permanent file delete
-
Prompts for confirmation before deleting files.
-
+ Confirm move file to Trash
+
+-
+
Prompts for confirmation before moving files to the trash bin.
+
+-
Enable
Delete key
@@ -510,7 +516,7 @@
-
- Safe Delete
+ Use Geeqie trash location
-
Moves deleted files to a temporary folder, for easy retrieval of deleted files. Files in the temporary folder are retained until the maximum size is reached, at which point deleting additional files will result in the removal of the oldest files to reclaim the space needed for the new files.
@@ -526,6 +532,12 @@
+ Use system Trash bin
+
+
+ Moves deleted files to the system-defined trash bin.
+
+
Folder
diff -r c79d70e18076 -r 49bd0d974e88 web/help/GuidePluginsConfig.html
--- a/web/help/GuidePluginsConfig.html Tue Oct 02 22:50:14 2018 +0300
+++ b/web/help/GuidePluginsConfig.html Wed Dec 12 21:56:30 2018 +0200
@@ -492,6 +492,12 @@
-
+ Disabled
+
+-
+
If the checkbox is ticked, the plugin will not be displayed in Geeqie menus.
+
+-
Name
-
diff -r c79d70e18076 -r 49bd0d974e88 web/help/GuideReferenceKeyboardShortcuts.html
--- a/web/help/GuideReferenceKeyboardShortcuts.html Tue Oct 02 22:50:14 2018 +0300
+++ b/web/help/GuideReferenceKeyboardShortcuts.html Wed Dec 12 21:56:30 2018 +0200
@@ -894,11 +894,20 @@
|
-Delete selected images. |
+Move selected images to trash bin. |
+ Shift + Delete
+
+ |
+ |
+Permanently delete selected images. |
+
+
+
+
Ctrl +
W
@@ -906,7 +915,7 @@
| |
Close window, Geeqie exits when last window is closed. |
-
+
Ctrl +
@@ -916,19 +925,19 @@
| |
Quit Geeqie. |
-
+
|
|
|
-
+
Edit Menu
|
|
|
-
+
Ctrl +
@@ -938,7 +947,7 @@
| |
Open Geeqie preferences window. |
-
+
Ctrl +
@@ -948,19 +957,19 @@
| |
Save metadata |
-
+
|
|
|
-
+
Select Menu
|
|
|
-
+
1
...
@@ -969,7 +978,7 @@
| |
Toggle mark 1 ... 6 |
-
+
Ctrl +
@@ -984,7 +993,7 @@
| |
Select mark 1 ... 6 |
-
+
Ctrl +
@@ -994,7 +1003,7 @@
| |
Select all images. |
-
+
Ctrl + SHIFT +
@@ -1004,7 +1013,7 @@
| |
Unselect all images. |
-
+
Ctrl + SHIFT +
@@ -1014,7 +1023,7 @@
| |
Invert selection. |
-
+
Alt +
@@ -1024,33 +1033,33 @@
| |
Toggle rectangular selection mode in icon view. |
-
+
M
|
|
Show marks. |
-
+
|
|
|
-
+
View Menu
|
|
|
-
+
T
|
|
Toggle display of thumbnails when in list view. |
-
+
Ctrl +
@@ -1060,7 +1069,7 @@
| |
Display file list as detailed list view. |
-
+
Ctrl +
@@ -1070,7 +1079,7 @@
| |
Display file list as icon view. |
-
+
Ctrl +
@@ -1080,21 +1089,21 @@
| |
Toggle folder display between list and tree views. |
-
+
R
|
|
Refresh file list. |
-
+
L
|
|
Toggle floating of file display. |
-
+
Ctrl +
@@ -1104,7 +1113,7 @@
| |
Toggle hiding of file display. |
-
+
Ctrl +
@@ -1114,7 +1123,7 @@
| |
Toggle EXIF sidebar. |
-
+
Shift +
@@ -1124,7 +1133,7 @@
| |
Toggle Sort Manager sidebar. |
-
+
Ctrl +
@@ -1134,35 +1143,35 @@
| |
Toggle Keywords sidebar. |
-
+
V
|
|
Toggle full screen. |
-
+
I
|
|
Toggle information overlay. |
-
+
S
|
|
Toggle slideshow. |
-
+
P
|
|
Pause slideshow. |
-
+
Ctrl +
@@ -1172,7 +1181,7 @@
| |
Slideshow faster. |
-
+
Ctrl +
@@ -1182,49 +1191,49 @@
| |
Slideshow slower. |
-
+
E
|
|
Split panes horizontal. |
-
+
U
|
|
Split panes vertical. |
-
+
Y
|
|
Single pane. |
-
+
Alt + Right Arrow
|
|
Next split pane. |
-
+
Alt + Left Arrow
|
|
Previous split pane. |
-
+
Alt + Up Arrow
|
|
Up or previous split pane. |
-
+
Alt + Down Arrow
|