# 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 @@

11.11.1. Delete

- 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