Merge remote-tracking branch 'github/merge-requests/463'
authorKlaus Ethgen <Klaus@Ethgen.de>
Wed, 15 Feb 2017 22:59:15 +0000 (23:59 +0100)
committerKlaus Ethgen <Klaus@Ethgen.de>
Wed, 15 Feb 2017 22:59:15 +0000 (23:59 +0100)
* github/merge-requests/463:
  Update Polish translation
  Correct the location of pan-view files in POTFILES.in

36 files changed:
doc/docbook/GuideFaq.xml
doc/docbook/GuideImageSearchFindingDuplicates.xml
doc/docbook/GuideMainWindowMenus.xml
doc/docbook/GuideMainWindowStatusBar.xml
doc/docbook/GuideOptionsBehavior.xml
doc/docbook/GuideOptionsImage.xml
doc/docbook/GuideOptionsMetadata.xml
doc/docbook/GuideReferenceCommandLine.xml
doc/docbook/GuideReferenceKeyboardShortcuts.xml
src/bar_gps.c
src/cache_maint.c
src/collect-table.c
src/collect.c
src/dupe.c
src/dupe.h
src/editors.c
src/filedata.h
src/history_list.c
src/image.c
src/image.h
src/img-view.c
src/layout.c
src/layout_image.c
src/layout_image.h
src/layout_util.c
src/options.h
src/pan-view/pan-view.c
src/preferences.c
src/rcfile.c
src/remote.c
src/search.c
src/typedefs.h
src/ui_menu.c
src/view_dir.c
src/view_file.c
src/view_file_icon.c

index 55f9bb8..592988f 100644 (file)
       <para />\r
     </section>\r
   </section>\r
-</chapter>
+  <section id="ExifRotation">\r
+    <title>Exif Auto Rotation</title>\r
+    <para />\r
+    <section id="HowdotheExifauto-rotationcommandswork">\r
+      <title>How do the Exif auto-rotation commands work?</title>\r
+      <para>\r
+        Image auto-rotation works in either of two modes, set by\r
+        <link linkend="MetadataMiscellaneous">Write altered image orientation to the metadata</link>\r
+        option.\r
+      </para>\r
+      <para>\r
+        <guilabel>Write altered image orientation to the metadata not set</guilabel>\r
+        <para />\r
+        If you change the orientation of an image using any of the available commands, the image will always be displayed in the modified orientation. This new orientation is stored in temporary data structures associated with each image file. When Geeqie closes, these changes will be lost.\r
+      </para>\r
+      <warning>\r
+        <para>It is not possible to determine if the image as displayed is the original image or one which has been temporarily rotated.</para>\r
+      </warning>\r
+      <para>\r
+        If the option\r
+        <link linkend="Editmenu">Auto rotate image using EXIF information</link>\r
+        is selected, any images which have Exif orientation data will also be shown rotated. However, any rotation you have selected manually will always over-ride the embedded Exif rotation value.\r
+      </para>\r
+      <para>\r
+        <guilabel>Write altered image orientation to the metadata set</guilabel>\r
+        <para />\r
+        <para>If you change the orientation of an image using any of the available commands, this new orientation is stored in a metadata write queue.</para>\r
+        <para>\r
+          If the option\r
+          <link linkend="Editmenu">Auto rotate image using EXIF information</link>\r
+          is selected, any images which have Exif orientation data will be shown rotated, including any in the metadata write queue.\r
+        </para>\r
+        <para>\r
+          However if the option\r
+          <link linkend="Editmenu">Auto rotate image using EXIF information</link>\r
+          is not selected, no images will be auto-rotated. If you have manually rotated any images, the metadata write icon on the status bar will alert you to that fact. Clicking the icon will give a list of the modified files.\r
+        </para>\r
+      </para>\r
+      <para />\r
+    </section>\r
+  </section>\r
+</chapter>\r
index 648f6a5..b963f33 100644 (file)
         </term>\r
         <listitem>\r
           <para>\r
-            Similar image content, the value to use to consider two images a match is configured in the\r
-            <link linkend="GuideOptionsBehavior">Behaviour tab</link>\r
-            of the preferences dialog by setting <emphasis>Custom similarity threshold</emphasis>.\r
+            The percentage value to used to consider two images a match is configured in the spin box at the bottom of the window.\r
           </para>\r
         </listitem>\r
       </varlistentry>\r
     <title>Thumbnails</title>\r
     <para>Thumbnails can be displayed beside each image in the result list by enabling the Thumbnails check box.</para>\r
   </section>\r
+  <section id="Rotation">\r
+    <title>Ignore Rotation</title>\r
+    <para>When checked, the rotational orientation of images will be ignored.</para>\r
+  </section>\r
   <section id="Comparetwofilesets">\r
     <title>Compare two file sets</title>\r
     <para>Sometimes it is useful to compare one group of files to another, different group of files. Enable this check box to compare two groups of files. When enabled, a second list will appear and files can be added to this list using the same methods for the main list.</para>\r
index 8c13af8..fd4df7b 100644 (file)
       </varlistentry>\r
       <varlistentry>\r
         <term>\r
-          <guimenu>Find duplicates…</guimenu>\r
+          <menuchoice>\r
+            <shortcut>\r
+              <keycombo>\r
+                <keycap>D</keycap>\r
+              </keycombo>\r
+            </shortcut>\r
+            <guimenu>Find duplicates...</guimenu>\r
+          </menuchoice>\r
         </term>\r
         <listitem>\r
           <para>Opens a new Find Duplicates window.</para>\r
           <menuchoice>\r
             <shortcut>\r
               <keycombo>\r
-                <keycap>4</keycap>\r
+                <keycap>Backspace</keycap>\r
               </keycombo>\r
             </shortcut>\r
             <guimenu>Previous Image</guimenu>\r
       <varlistentry>\r
         <term>\r
           <menuchoice>\r
+            <shortcut>\r
+              <keycombo>\r
+                <keycap>Ctrl</keycap>\r
+                <keycap>A</keycap>\r
+              </keycombo>\r
+            </shortcut>\r
             <guimenu>Select all</guimenu>\r
           </menuchoice>\r
         </term>\r
       <varlistentry>\r
         <term>\r
           <menuchoice>\r
+            <shortcut>\r
+              <keycombo>\r
+                <keycap>Ctrl</keycap>\r
+                <keycap>Shift</keycap>\r
+                <keycap>A</keycap>\r
+              </keycombo>\r
+            </shortcut>\r
             <guimenu>Select none</guimenu>\r
           </menuchoice>\r
         </term>\r
       <varlistentry>\r
         <term>\r
           <menuchoice>\r
-            <guimenu>Invert Selection</guimenu>\r
+            <shortcut>\r
+              <keycombo>\r
+                <keycap>Ctrl</keycap>\r
+                <keycap>Shift</keycap>\r
+                <keycap>I</keycap>\r
+              </keycombo>\r
+            </shortcut>\r
+            <guimenu>Invert selection</guimenu>\r
           </menuchoice>\r
         </term>\r
         <listitem>\r
           <para>Inverts current selection</para>\r
         </listitem>\r
       </varlistentry>\r
+      <varlistentry>\r
+        <term>\r
+          <menuchoice>\r
+            <shortcut>\r
+              <keycombo>\r
+                <keycap>Alt</keycap>\r
+                <keycap>R</keycap>\r
+              </keycombo>\r
+            </shortcut>\r
+            <guimenu>Rectangular selection</guimenu>\r
+          </menuchoice>\r
+        </term>\r
+        <listitem>\r
+          <para>Toggles rectangular selection mode for icons</para>\r
+        </listitem>\r
+      </varlistentry>\r
       <varlistentry>\r
         <term>\r
           <menuchoice>\r
       <varlistentry>\r
         <term>\r
           <menuchoice>\r
+            <shortcut>\r
+              <keycombo>\r
+                <keycap>M</keycap>\r
+              </keycombo>\r
+            </shortcut>\r
             <guimenu>Show marks</guimenu>\r
           </menuchoice>\r
         </term>\r
         </term>\r
         <listitem>\r
           <para>Swaps the top and bottom sides of the image, does not modify the file on disk.</para>\r
+          <warning>\r
+            <para>\r
+              The above orientation commands - Rotate, Mirror and Flip - do not change the image on disk. The changes will be lost when Geeqie closes. Refer to the\r
+              <link linkend="MetadataMiscellaneous">Metadata tab of the Preferences Dialog</link>\r
+              if you wish these changes to be written to metadata.\r
+            </para>\r
+            <para>\r
+              Refer also to the\r
+              <link linkend="HowdotheExifauto-rotationcommandswork">FAQ</link>\r
+              .\r
+            </para>\r
+          </warning>\r
         </listitem>\r
       </varlistentry>\r
       <varlistentry>\r
           </menuchoice>\r
         </term>\r
         <listitem>\r
-          <para>Removes all effects applied through the Adjust menu, reverting image to its original state.</para>\r
+          <para>Removes all temporary effects applied through the above commands, reverting the image according to its Exif Orientation tag.</para>\r
+        </listitem>\r
+      </varlistentry>\r
+      <varlistentry>\r
+        <term>\r
+          <guilabel>Auto rotate image using EXIF information</guilabel>\r
+        </term>\r
+        <listitem>\r
+          <para>\r
+            Auto rotates images based on metadata stored in images that have Exif data. Refer also to the\r
+            <link linkend="HowdotheExifauto-rotationcommandswork">FAQ</link>\r
+            .\r
+          </para>\r
         </listitem>\r
       </varlistentry>\r
       <varlistentry>\r
           </menuchoice>\r
         </term>\r
         <listitem>\r
-          The commands above modifies image metadata only. This commands actually transforms image pixels. See\r
-          <link linkend="GuideImageManagementExternalEditing">Editors section</link>\r
-          for details\r
+          <para>This command affects only jpeg, tiff and png files. The image file on disk is rotated to the orientation as specified by its Exif Orientation tag.</para>\r
+          <warning>\r
+            <para>\r
+              The file rotate.desktop, using external commands exiftran, exiv2 and mogrify, is used to implement this command. Refer to\r
+              <link linkend="GuideImageManagementExternalEditing">Editors section</link>\r
+              for details.\r
+            </para>\r
+          </warning>\r
         </listitem>\r
       </varlistentry>\r
       <varlistentry>\r
index e4a5159..255fc60 100644 (file)
     <title>Buttons</title>\r
     <para>Statusbar buttons corresponds to selected menu action.</para>\r
     <para />\r
+    <section id="ExifRotate">\r
+      <title>Exif rotate</title>\r
+      <para>\r
+        <guiicon>\r
+          <inlinegraphic fileref="gtk-color-picker.png" />\r
+        </guiicon>\r
+        Toggles the auto-rotation of images if they have Exif orientation data. \r
+        Refer also to the\r
+        <link linkend="HowdotheExifauto-rotationcommandswork">FAQ</link>\r
+        .\r
+      </para>\r
+      <para />\r
+    </section>\r
     <section id="ShowPixelInfo">\r
       <title>Show Pixel Info</title>\r
       <para>\r
       <para />\r
     </section>\r
   </section>\r
-</section>
+</section>\r
index 5b12fb7..36ad068 100644 (file)
   <section id="Behaviour">\r
     <title>Behavior</title>\r
     <variablelist>\r
-      <varlistentry>\r
-        <term>\r
-          <guilabel>Rectangular selection in icon view</guilabel>\r
-        </term>\r
-        <listitem>\r
-          <para>Enable this to change the selection method used when selecting multiple items in an icon view.</para>\r
-        </listitem>\r
-      </varlistentry>\r
       <varlistentry>\r
         <term>\r
           <guilabel>Descend folders in tree view</guilabel>\r
       </varlistentry>\r
       <varlistentry>\r
         <term>\r
-          <guilabel>Open recent list maximum size</guilabel>\r
+          <guilabel>Recent folder list maximum size</guilabel>\r
         </term>\r
         <listitem>\r
-          <para>This is the number of entries saved in the recent open file list.</para>\r
+          <para>This is the number of entries to be saved from the recent open folder list drop-down box. The number of entries displayed in the current session is unlimited.</para>\r
         </listitem>\r
       </varlistentry>\r
       <varlistentry>\r
       </varlistentry>\r
     </variablelist>\r
   </section>\r
-  <section id="Miscellaneous">\r
-    <title>Miscellaneous</title>\r
-    <variablelist>\r
-      <varlistentry>\r
-        <term>\r
-          <guilabel>Custom similarity threshold</guilabel>\r
-        </term>\r
-        <listitem>\r
-          <para>\r
-            This setting is used by the compare method\r
-            <emphasis>Similarity (custom)</emphasis>\r
-            , located in the\r
-            <link linkend="GuideImageSearchFindingDuplicates" endterm="titleGuideImageSearchFindingDuplicates" />\r
-            section.\r
-          </para>\r
-        </listitem>\r
-      </varlistentry>\r
-    </variablelist>\r
-  </section>\r
   <section id="Debugging">\r
     <title>Debugging</title>\r
     <variablelist>\r
index a9286d0..076b8f2 100644 (file)
   <section id="Convenience">\r
     <title>Convenience</title>\r
     <variablelist>\r
-      <varlistentry>\r
-        <term>\r
-          <guilabel>Auto rotate image using EXIF information</guilabel>\r
-        </term>\r
-        <listitem>\r
-          <para>Auto rotates images based on metadata stored in images that have Exif data.</para>\r
-        </listitem>\r
-      </varlistentry>\r
-      <varlistentry>\r
+       <varlistentry>\r
         <term>\r
           <guilabel>Auto rotate proofs using EXIF information</guilabel>\r
         </term>\r
         <listitem>\r
-          <para>TBD</para>\r
+          <para>Auto rotate images on print proof sheet.</para>\r
         </listitem>\r
       </varlistentry>\r
     </variablelist>\r
index 11595cc..2a315a6 100644 (file)
         <para>\r
           <guilabel>Write altered image orientation to the metadata</guilabel>\r
           <para />\r
-          TBD\r
+          If checked, the results of orientation commands (Rotate, Mirror and Flip) issued on an image will be written to metadata either automatically as specified below or when manually initiated. This option also affects the\r
+          <link linkend="Editmenu">Auto rotate image using EXIF information</link>\r
+          menu item.\r
         </para>\r
+        <warning>\r
+          <para>If this option is not checked, the results of orientation commands will be lost when Geeqie closes.</para>\r
+          <para>Do not change this option while you have temporary rotations applied to images.</para>\r
+        </warning>\r
       </listitem>\r
     </itemizedlist>\r
     <para />\r
index 145d09f..da17bef 100644 (file)
             <entry>file:&lt;file&gt;</entry>\r
             <entry>Change main window to display &lt;file&gt;</entry>\r
           </row>\r
+          <row>\r
+            <entry />\r
+            <entry>--tell</entry>\r
+            <entry>Print filename of current image</entry>\r
+          </row>\r
           <row>\r
             <entry />\r
             <entry>view:&lt;file&gt;</entry>\r
index 57761ca..d36c197 100644 (file)
 <?xml version="1.0" encoding="utf-8"?>\r
 <section id="GuideReferenceKeyboardShortcuts">\r
+  <title id="titleGuideReferenceKeyboardShortcuts">Keyboard and Mouse Shortcuts</title>\r
   <para>\r
-    The table below shows the defaults for keyboard shortcuts. The current settings for all shortcuts may be found in the\r
+    The tables below shows the defaults for keyboard shortcuts. The current settings for all shortcuts may be found in the\r
     <link linkend="GuideOptionsKeyboard" endterm="titleGuideOptionsKeyboard" />\r
     dialogue.\r
   </para>\r
-  <title id="titleGuideReferenceKeyboardShortcuts">Keyboard and Mouse Shortcuts</title>\r
-  <table frame="all">\r
-    <title>Default keyboard shortcuts</title>\r
-    <tgroup cols="3" rowsep="1" colsep="1">\r
-      <thead>\r
-        <row>\r
-          <entry>Shortcut</entry>\r
-          <entry>Mouse</entry>\r
-          <entry>Action</entry>\r
-        </row>\r
-      </thead>\r
-      <tbody>\r
-        <row colsep="0">\r
-          <entry colsep="0">\r
-            <emphasis role="strong">Image Navigation</emphasis>\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>PageDown</keycap>\r
-          </entry>\r
-          <entry>\r
-            <code>Left Click</code>\r
-            ,\r
-            <para />\r
-            <code>Mouse Wheel down</code>\r
-            <footnote id='ref1'>\r
-              <para>\r
-                Default Mouse wheel functions can be altered by changing the\r
-                <link linkend="GuideOptionsBehavior">Mouse wheel scrolls image</link>\r
-                option.\r
-              </para>\r
-            </footnote>\r
-          </entry>\r
-          <entry>Change to next image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>PageUp</keycap>\r
-          </entry>\r
-          <entry>\r
-            <code>Middle Click</code>\r
-            ,\r
-            <para />\r
-            <code>Mouse Wheel up</code>\r
-            <footnoteref linkend='ref1' />\r
-          </entry>\r
-          <entry>Change to previous image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Home</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Change to first image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>End</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Change to last image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Space</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Change to next image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Backspace</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Change to previous image.</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">Image viewing</emphasis>\r
-            (image has keyboard focus)\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Arrow key</keycap>\r
-          </entry>\r
-          <entry>\r
-            <code>Left click and Drag</code>\r
-            <footnoteref linkend='ref1' />\r
-          </entry>\r
-          <entry>Pan image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Shift + Arrows</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Pan Image faster.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Ctrl + Arrow key</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Pan to respective edge of image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry />\r
-          <entry>\r
-            <code>Shift + right-click</code>\r
-          </entry>\r
-          <entry>Smooth scroll</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>]</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Rotate image clockwise 90 degrees.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>[</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Rotate image counterclockwise 90 degree.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Shift + R</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Rotate image 180 degrees.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Shift + M</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Flip image horizontally (mirror).</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Shift + F</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Flip image vertically.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>+</keycap>\r
-            ,\r
-            <keycap>=</keycap>\r
-          </entry>\r
-          <entry>\r
-            <code>Ctrl + Mouse Wheel up</code>\r
-          </entry>\r
-          <entry>Zoom image in.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>-</keycap>\r
-          </entry>\r
-          <entry>\r
-            <code>Ctrl + Mouse Wheel down</code>\r
-          </entry>\r
-          <entry>Zoom image out.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Z</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Reset zoom to original size (1:1).</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>X</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Fit image to window size.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>W</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Zoom image to fit window width.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>H</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Zoom image to fit window height.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>1</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 1:1</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>2</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 2:1</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>3</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 3:1</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>4</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 4:1</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>7</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 1:4</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>8</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 1:3</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>9</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Set zoom to 1:2</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">File Menu</emphasis>\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>N</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>New Window</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>C</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open a new empty collection window.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>O</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Display open collection dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>F3</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open new search window.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Shift +\r
-              <keycap>P</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open print dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>F</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Create new folder in current path.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>C</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Copy selected images, opens destination selection dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>M</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Move selected images, opens destination selection dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>R</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Rename selected images, opens rename dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>D</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Delete selected images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+  <section id="AllWindows">\r
+    <title>Keyboard shortcuts in all windows</title>\r
+    <table frame="all">\r
+      <title>Standard keyboard shortcuts</title>\r
+      <tgroup cols="3" rowsep="1" colsep="1">\r
+        <thead>\r
+          <row>\r
+            <entry>Shortcut</entry>\r
+            <entry>Mouse</entry>\r
+            <entry>Action</entry>\r
+          </row>\r
+        </thead>\r
+        <tbody>\r
+          <row>\r
+            <entry>\r
+              <keycap>F1</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Help.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Menu</keycap>\r
+            </entry>\r
+            <entry>Right-click</entry>\r
+            <entry>Context menu.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>F10</keycap>\r
+            </entry>\r
+            <entry>Right-click</entry>\r
+            <entry>Context menu.</entry>\r
+          </row>\r
+        </tbody>\r
+      </tgroup>\r
+    </table>\r
+  </section>\r
+  <section id="mainKeyboard">\r
+    <title>Main window keyboard shortcuts</title>\r
+    <table frame="all">\r
+      <title>\r
+        <link linkend="GuideMainWindow">Main window</link>\r
+        keyboard shortcuts\r
+      </title>\r
+      <tgroup cols="3" rowsep="1" colsep="1">\r
+        <thead>\r
+          <row>\r
+            <entry>Shortcut</entry>\r
+            <entry>Mouse</entry>\r
+            <entry>Action</entry>\r
+          </row>\r
+        </thead>\r
+        <tbody>\r
+          <row colsep="0">\r
+            <entry colsep="0">\r
+              <emphasis role="strong">Image Navigation</emphasis>\r
+            </entry>\r
+            <entry colsep="0" />\r
+            <entry />\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>PageDown</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Left Click</code>\r
+              ,\r
+              <para />\r
+              <code>Mouse Wheel down</code>\r
+              <footnote id='ref1'>\r
+                <para>\r
+                  Default Mouse wheel functions can be altered by changing the\r
+                  <link linkend="GuideOptionsBehavior">Mouse wheel scrolls image</link>\r
+                  option.\r
+                </para>\r
+              </footnote>\r
+            </entry>\r
+            <entry>Change to next image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>PageUp</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Middle Click</code>\r
+              ,\r
+              <para />\r
+              <code>Mouse Wheel up</code>\r
+              <footnoteref linkend='ref1' />\r
+            </entry>\r
+            <entry>Change to previous image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Home</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Change to first image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>End</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Change to last image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Space</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Change to next image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Backspace</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Change to previous image.</entry>\r
+          </row>\r
+          <row rowsep="0">\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry colsep="0">\r
+              <emphasis role="strong">Image viewing</emphasis>\r
+              (image has keyboard focus)\r
+            </entry>\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Arrow key</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Left click and Drag</code>\r
+              <footnoteref linkend='ref1' />\r
+            </entry>\r
+            <entry>Pan image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Shift + Arrows</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Pan Image faster.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Ctrl + Arrow key</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Pan to respective edge of image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry />\r
+            <entry>\r
+              <code>Shift + right-click</code>\r
+            </entry>\r
+            <entry>Smooth scroll</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>]</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rotate image clockwise 90 degrees.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>[</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rotate image counterclockwise 90 degree.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Shift + R</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rotate image 180 degrees.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Shift + M</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Flip image horizontally (mirror).</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Shift + F</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Flip image vertically.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>+</keycap>\r
+              ,\r
+              <keycap>=</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Ctrl + Mouse Wheel up</code>\r
+            </entry>\r
+            <entry>Zoom image in.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>-</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Ctrl + Mouse Wheel down</code>\r
+            </entry>\r
+            <entry>Zoom image out.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Z</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Reset zoom to original size (1:1).</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>X</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Fit image to window size.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>W</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Close window, Geeqie exits when last window is closed.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>Q</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Quit Geeqie.</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">Edit Menu</emphasis>\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+            </entry>\r
+            <entry />\r
+            <entry>Zoom image to fit window width.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>H</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Zoom image to fit window height.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>1</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>2</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 2:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>3</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 3:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>4</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 4:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>7</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:4</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>8</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:3</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>9</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:2</entry>\r
+          </row>\r
+          <row rowsep="0">\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry colsep="0">\r
+              <emphasis role="strong">File Menu</emphasis>\r
+            </entry>\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>N</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>New Window</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>C</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open a new empty collection window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>O</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open Geeqie preferences window.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>S</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Save metadata</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">Select Menu</emphasis>\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>1</keycap>\r
-            ...\r
-            <keycap>6</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle mark 1 ... 6</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+            </entry>\r
+            <entry />\r
+            <entry>Display open collection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>F3</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open new search window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Shift +\r
+                <keycap>P</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open print dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>F</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Create new folder in current path.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>C</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Copy selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>M</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rename selected images, opens rename dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>D</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Delete selected images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>W</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Close window, Geeqie exits when last window is closed.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>Q</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Quit Geeqie.</entry>\r
+          </row>\r
+          <row rowsep="0">\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry colsep="0">\r
+              <emphasis role="strong">Edit Menu</emphasis>\r
+            </entry>\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>O</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open Geeqie preferences window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>S</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Save metadata</entry>\r
+          </row>\r
+          <row rowsep="0">\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry colsep="0">\r
+              <emphasis role="strong">Select Menu</emphasis>\r
+            </entry>\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>1</keycap>\r
-            </code>\r
-            ...\r
-            <code>\r
-              Ctrl +\r
+              ...\r
               <keycap>6</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select mark 1 ... 6</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>A</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select all images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl + SHIFT +\r
-              <keycap>A</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Unselect all images.</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">View Menu</emphasis>\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>T</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle display of thumbnails when in list view.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle mark 1 ... 6</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>1</keycap>\r
+              </code>\r
+              ...\r
+              <code>\r
+                Ctrl +\r
+                <keycap>6</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select mark 1 ... 6</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select all images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl + SHIFT +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Unselect all images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl + SHIFT +\r
+                <keycap>I</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Invert selection.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Alt +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle rectangular selection mode in icon view.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>M</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Show marks.</entry>\r
+          </row>\r
+          <row rowsep="0">\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry colsep="0">\r
+              <emphasis role="strong">View Menu</emphasis>\r
+            </entry>\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>T</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle display of thumbnails when in list view.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>L</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Display file list as detailed list view.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>I</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Display file list as icon view.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>T</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle folder display between list and tree views.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>R</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Refresh file list.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>L</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Display file list as detailed list view.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle floating of file display.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>H</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle hiding of file display.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>E</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle EXIF sidebar.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Shift +\r
+                <keycap>S</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle Sort Manager sidebar.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>K</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle Keywords sidebar.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>V</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle full screen.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>I</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Display file list as icon view.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>T</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle folder display between list and tree views.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>R</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Refresh file list.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>L</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle floating of file display.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>H</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle hiding of file display.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>E</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle EXIF sidebar.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Shift +\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle information overlay.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>S</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle Sort Manager sidebar.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>K</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle Keywords sidebar.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>V</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle full screen.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>I</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle information overlay.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>S</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle slideshow.</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">Help Menu</emphasis>\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>F1</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open User Manual in browser.</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle slideshow.</entry>\r
+          </row>\r
+        </tbody>\r
+      </tgroup>\r
+    </table>\r
+  </section>\r
+  <section id="CollectionsKeyboardShortcuts">\r
+    <title>Collections keyboard shortcuts</title>\r
+    <table frame="all">\r
+      <title>\r
+        <link linkend="GuideCollections">Collections window</link>\r
+        keyboard shortcuts\r
+      </title>\r
+      <tgroup cols="3" rowsep="1" colsep="1">\r
+        <thead>\r
+          <row>\r
+            <entry>Shortcut</entry>\r
+            <entry>Mouse</entry>\r
+            <entry>Action</entry>\r
+          </row>\r
+        </thead>\r
+        <tbody>\r
           <entry colsep="0">\r
             <emphasis role="strong">Collection Window</emphasis>\r
           </entry>\r
           <entry colsep="0" />\r
           <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Arrows</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Move selection.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Shift + Arrow key</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select multiple images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Ctrl + Arrow</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Move focus without changing selection.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Space</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select only image with focus.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>Ctrl + Space</code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle selection of image with focus.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Home</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Move focus to first image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>End</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Move focus to last image.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>A</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select all images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl + Shift +\r
+          <row>\r
+            <entry>\r
+              <keycap>Arrows</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move selection.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Shift + Arrow key</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select multiple images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Alt +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle rectangular selection mode.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Space</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select only image with focus.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Ctrl + Space</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle selection of image with focus.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Home</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move focus to first image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>End</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move focus to last image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select all images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl + Shift +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Unselect all images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Delete</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Remove selected image from collection, does not delete image from disk.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>L</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Add images from main window's file list.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>T</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle display of icon filenames.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>N</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Sort collection by name.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>D</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Sort collection by file date.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>B</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Sort collection by file size.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>P</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Sort collection by file path.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>I</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Sort collection by natural numerical order.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Enter</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>View image with focus in main window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>V</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>View image with focus in new window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Shift +\r
+                <keycap>P</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open print dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>S</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Save collection.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>S</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Save collection as, opens destination dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>A</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Unselect all images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Delete</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Remove selected image from collection, does not delete image from disk.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>L</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Add images from main window's file list.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>T</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Toggle display of icon filenames.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>N</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Sort collection by name.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>D</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Sort collection by file date.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>B</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Sort collection by file size.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>P</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Sort collection by file path.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>I</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Sort collection by natural numerical order.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>Enter</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>View image with focus in main window.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>V</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>View image with focus in new window.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+            </entry>\r
+            <entry />\r
+            <entry>Append to collection, opens append dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>C</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Copy selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>M</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rename selected images, opens rename dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>D</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Delete selected images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>W</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Close collection window.</entry>\r
+          </row>\r
+          <row rowsep="0">\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+            <entry colsep="0" />\r
+          </row>\r
+        </tbody>\r
+      </tgroup>\r
+    </table>\r
+  </section>\r
+  <section id="DuplicatesKeyboardShortcuts">\r
+    <title>Duplicates keyboard shortcuts</title>\r
+    <table frame="all">\r
+      <title>\r
+        <link linkend="GuideImageSearchFindingDuplicates">Duplicates window</link>\r
+        keyboard shortcuts\r
+      </title>\r
+      <tgroup cols="3" rowsep="1" colsep="1">\r
+        <thead>\r
+          <row>\r
+            <entry>Shortcut</entry>\r
+            <entry>Mouse</entry>\r
+            <entry>Action</entry>\r
+          </row>\r
+        </thead>\r
+        <tbody>\r
+          <row>\r
+            <entry>\r
               <keycap>1</keycap>\r
-            </code>\r
-            ...\r
-            <code>\r
-              Ctrl +\r
-              <keycap>0</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Run external edit command on selected images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>S</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Save collection.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>S</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Save collection as, opens destination dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>A</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Append to collection, opens append dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
+            </entry>\r
+            <entry />\r
+            <entry>Select group 1 duplicates.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>2</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select group 2 duplicates.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
               <keycap>C</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Copy selected images, opens destination selection dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>M</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Move selected images, opens destination selection dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>R</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Rename selected images, opens rename dialog.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>D</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Delete selected images.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>P</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open image properties window.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <code>\r
-              Ctrl +\r
-              <keycap>W</keycap>\r
-            </code>\r
-          </entry>\r
-          <entry />\r
-          <entry>Close collection window.</entry>\r
-        </row>\r
-        <row rowsep="0">\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <anchor id="FindDuplicatesWindow" />\r
-        <row>\r
-          <entry colsep="0">\r
-            <emphasis role="strong">Find Duplicates Window</emphasis>\r
-            (same as Collection Window above, with the following additions)\r
-          </entry>\r
-          <entry colsep="0" />\r
-          <entry colsep="0" />\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>1</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select group 1 duplicates.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>2</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Select group 2 duplicates.</entry>\r
-        </row>\r
-        <row>\r
-          <entry>\r
-            <keycap>C</keycap>\r
-          </entry>\r
-          <entry />\r
-          <entry>Open new collection window and add selected images.</entry>\r
-        </row>\r
-      </tbody>\r
-    </tgroup>\r
-  </table>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open new collection window and add selected images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>L</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Add images from main window's list.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>V</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>View selected item in new window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>T</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle thumbnails.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select all.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl + shift +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Deselect all.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>C</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Copy selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>M</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rename selected images, opens rename dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>D</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Delete selected images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Ctrl + Delete</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Remove all items from list.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>W</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Close window.</entry>\r
+          </row>\r
+        </tbody>\r
+      </tgroup>\r
+    </table>\r
+  </section>\r
+  <section id="SearchKeyboardShortcuts">\r
+    <title>Search keyboard shortcuts</title>\r
+    <table frame="all">\r
+      <title>\r
+        <link linkend="GuideImageSearchSearch">Search window</link>\r
+        keyboard shortcuts\r
+      </title>\r
+      <tgroup cols="3" rowsep="1" colsep="1">\r
+        <thead>\r
+          <row>\r
+            <entry>Shortcut</entry>\r
+            <entry>Mouse</entry>\r
+            <entry>Action</entry>\r
+          </row>\r
+        </thead>\r
+        <tbody>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>C</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Copy selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>M</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move selected images, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rename selected images, opens rename dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>D</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Delete selected images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Select all.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl + shift +\r
+                <keycap>A</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Deselect all.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Delete</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Remove selected items from list.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>Ctrl + Delete</code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Remove all items from list.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>V</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>View selected item in new window.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>C</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Open new collection window and add selected images.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>T</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle thumbnails.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>W</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Close window.</entry>\r
+          </row>\r
+        </tbody>\r
+      </tgroup>\r
+    </table>\r
+  </section>\r
+  <section id="PanViewKeyboardShortcuts">\r
+    <title>Pan view keyboard shortcuts</title>\r
+    <table frame="all">\r
+      <title>\r
+        <link linkend="GuideOtherWindowsPanView">Pan View window</link>\r
+        keyboard shortcuts\r
+      </title>\r
+      <tgroup cols="3" rowsep="1" colsep="1">\r
+        <thead>\r
+          <row>\r
+            <entry>Shortcut</entry>\r
+            <entry>Mouse</entry>\r
+            <entry>Action</entry>\r
+          </row>\r
+        </thead>\r
+        <tbody>\r
+          <row>\r
+            <entry>\r
+              <keycap>Arrow key</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Left click and Drag</code>\r
+              <footnoteref linkend='ref1' />\r
+            </entry>\r
+            <entry>Scroll display.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Page Up</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Scroll display half screen up.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Page Down</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Scroll display half screen down.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Home</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Scroll display half screen left.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>End</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Scroll display half screen right.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>F</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Display Find search bar.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>/</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Display Find search bar.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>G</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Start search.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>F11, F, V</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Toggle Fullscreen.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Esc</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Exit fullscreen or clear search bar.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>+</keycap>\r
+              ,\r
+              <keycap>=</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Ctrl + Mouse Wheel up</code>\r
+            </entry>\r
+            <entry>Zoom image in.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>-</keycap>\r
+            </entry>\r
+            <entry>\r
+              <code>Ctrl + Mouse Wheel down</code>\r
+            </entry>\r
+            <entry>Zoom image out.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>Z</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Reset zoom to original size (1:1).</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>1</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>2</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 2:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>3</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 3:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>4</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 4:1</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>7</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:4</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>8</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:3</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <keycap>9</keycap>\r
+            </entry>\r
+            <entry />\r
+            <entry>Set zoom to 1:2</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>C</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Copy selected image, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>M</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Move selected image, opens destination selection dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>R</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Rename selected image, opens rename dialog.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>D</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Delete selected image.</entry>\r
+          </row>\r
+          <row>\r
+            <entry>\r
+              <code>\r
+                Ctrl +\r
+                <keycap>W</keycap>\r
+              </code>\r
+            </entry>\r
+            <entry />\r
+            <entry>Close window.</entry>\r
+          </row>\r
+        </tbody>\r
+      </tgroup>\r
+    </table>\r
+  </section>\r
 </section>\r
index 8bc1c93..a112be6 100644 (file)
@@ -761,6 +761,10 @@ GtkWidget *bar_pane_gps_new(const gchar *id, const gchar *title, const gchar *ma
        gtk_scale_button_set_value(GTK_SCALE_BUTTON(slider), (gdouble)zoom);
 
        progress = gtk_progress_bar_new();
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), "");
+       gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(progress), TRUE);
+#endif
        state = gtk_label_new("");
        gtk_label_set_justify(GTK_LABEL(state), GTK_JUSTIFY_CENTER);
 
index 8e3ca76..230ce10 100644 (file)
@@ -950,6 +950,9 @@ static void cache_manager_standard_process(GtkWidget *widget, gboolean clear)
 
        cd->progress = gtk_progress_bar_new();
        gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("click start to begin"));
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(cd->progress), TRUE);
+#endif
        gtk_box_pack_start(GTK_BOX(cd->gd->vbox), cd->progress, FALSE, FALSE, 0);
        gtk_widget_show(cd->progress);
 
index 2695640..e692780 100644 (file)
@@ -62,14 +62,6 @@ enum {
        CTABLE_COLUMN_COUNT
 };
 
-typedef enum {
-       SELECTION_NONE          = 0,
-       SELECTION_SELECTED      = 1 << 0,
-       SELECTION_PRELIGHT      = 1 << 1,
-       SELECTION_FOCUS         = 1 << 2
-} SelectionType;
-
-
 #define INFO_SELECTED(x) (x->flag_mask & SELECTION_SELECTED)
 
 
@@ -808,6 +800,13 @@ static void collection_table_popup_select_invert_cb(GtkWidget *widget, gpointer
        ct->prev_selection= ct->click_info;
 }
 
+static void collection_table_popup_rectangular_selection_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       options->collections.rectangular_selection = !(options->collections.rectangular_selection);
+}
+
 static void collection_table_popup_remove_cb(GtkWidget *widget, gpointer data)
 {
        CollectTable *ct = data;
@@ -854,7 +853,7 @@ static void collection_table_popup_find_dupes_cb(GtkWidget *widget, gpointer dat
        CollectTable *ct = data;
        DupeWindow *dw;
 
-       dw = dupe_window_new(DUPE_MATCH_NAME);
+       dw = dupe_window_new();
        dupe_window_add_collection(dw, ct->cd);
 }
 
@@ -924,6 +923,8 @@ static GtkWidget *collection_table_popup_menu(CollectTable *ct, gboolean over_ic
                        G_CALLBACK(collection_table_popup_unselectall_cb), ct);
        menu_item_add(submenu, _("Invert selection"),
                        G_CALLBACK(collection_table_popup_select_invert_cb), ct);
+       menu_item_add_check(submenu, _("Rectangular selection"), (options->collections.rectangular_selection != FALSE),
+                       G_CALLBACK(collection_table_popup_rectangular_selection_cb), ct);
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
        menu_item_add_divider(menu);
 
index c4de037..28879cc 100644 (file)
@@ -908,6 +908,12 @@ static gboolean collection_window_keypress(GtkWidget *widget, GdkEventKey *event
                                        collection_set_sort_method(cw->cd, SORT_PATH);
                                        }
                                break;
+                       case 'R': case 'r':
+                               if (event->state & GDK_MOD1_MASK)
+                                       {
+                                               options->collections.rectangular_selection = !(options->collections.rectangular_selection);
+                                       }
+                               break;
                        case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
                                list = g_list_copy(cw->table->selection);
                                if (list)
@@ -920,6 +926,9 @@ static gboolean collection_window_keypress(GtkWidget *widget, GdkEventKey *event
                                        collection_remove_by_info(cw->cd, collection_table_get_focus_info(cw->table));
                                        }
                                break;
+                       case GDK_KEY_F1:
+                               help_window_show("GuideReferenceKeyboardShortcuts.html#CollectionsKeyboardShortcuts");
+                               break;
                        default:
                                stop_signal = FALSE;
                                break;
@@ -1210,6 +1219,10 @@ CollectWindow *collection_window_new(const gchar *path)
 
        extra_label = gtk_progress_bar_new();
        gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(extra_label), 0.0);
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(extra_label), "");
+       gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(extra_label), TRUE);
+#endif
        gtk_box_pack_start(GTK_BOX(cw->status_box), extra_label, TRUE, TRUE, 0);
        gtk_widget_show(extra_label);
 
index a92fa3f..08c801b 100644 (file)
@@ -574,6 +574,8 @@ static void dupe_listview_add(DupeWindow *dw, DupeItem *parent, DupeItem *child)
        g_free(text[DUPE_COLUMN_DIMENSIONS]);
 }
 
+static void dupe_listview_select_dupes(DupeWindow *dw, DupeSelectType parents);
+
 static void dupe_listview_populate(DupeWindow *dw)
 {
        GtkListStore *store;
@@ -607,6 +609,16 @@ static void dupe_listview_populate(DupeWindow *dw)
                }
 
        gtk_tree_view_columns_autosize(GTK_TREE_VIEW(dw->listview));
+
+       if (options->duplicates_select_type == DUPE_SELECT_GROUP1)
+               {
+               dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP1);
+               }
+       else if (options->duplicates_select_type == DUPE_SELECT_GROUP2)
+               {
+               dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP2);
+               }
+
 }
 
 static void dupe_listview_remove(DupeWindow *dw, DupeItem *di)
@@ -712,7 +724,7 @@ static gboolean dupe_listview_item_is_selected(DupeWindow *dw, DupeItem *di, Gtk
        return found;
 }
 
-static void dupe_listview_select_dupes(DupeWindow *dw, gint parents)
+static void dupe_listview_select_dupes(DupeWindow *dw, DupeSelectType parents)
 {
        GtkTreeModel *store;
        GtkTreeSelection *selection;
@@ -729,7 +741,7 @@ static void dupe_listview_select_dupes(DupeWindow *dw, gint parents)
                DupeItem *di;
 
                gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
-               if ( (dupe_match_find_parent(dw, di) == di) == (parents) )
+               if ((dupe_match_find_parent(dw, di) == di) == (parents == DUPE_SELECT_GROUP1))
                        {
                        gtk_tree_selection_select_iter(selection, &iter);
                        }
@@ -1756,6 +1768,40 @@ static void dupe_files_add(DupeWindow *dw, CollectionData *collection, CollectIn
 
        if (!di) return;
 
+       /* Ensure images in the lists have unique FileDatas */
+       GList *work;
+       DupeItem *di_list;
+       work = g_list_first(dw->list);
+       while (work)
+               {
+               di_list = work->data;
+               if (di_list->fd == di->fd)
+                       {
+                       return;
+                       }
+               else
+                       {
+                       work = work->next;
+                       }
+               }
+
+       if (dw->second_list)
+               {
+               work = g_list_first(dw->second_list);
+               while (work)
+                       {
+                       di_list = work->data;
+                       if (di_list->fd == di->fd)
+                               {
+                               return;
+                               }
+                       else
+                               {
+                               work = work->next;
+                               }
+                       }
+               }
+
        if (dw->second_drop)
                {
                dupe_second_add(dw, di);
@@ -2095,6 +2141,7 @@ static void dupe_menu_select_all_cb(GtkWidget *widget, gpointer data)
        DupeWindow *dw = data;
        GtkTreeSelection *selection;
 
+       options->duplicates_select_type = DUPE_SELECT_NONE;
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
        gtk_tree_selection_select_all(selection);
 }
@@ -2104,6 +2151,7 @@ static void dupe_menu_select_none_cb(GtkWidget *widget, gpointer data)
        DupeWindow *dw = data;
        GtkTreeSelection *selection;
 
+       options->duplicates_select_type = DUPE_SELECT_NONE;
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
        gtk_tree_selection_unselect_all(selection);
 }
@@ -2112,14 +2160,16 @@ static void dupe_menu_select_dupes_set1_cb(GtkWidget *widget, gpointer data)
 {
        DupeWindow *dw = data;
 
-       dupe_listview_select_dupes(dw, TRUE);
+       options->duplicates_select_type = DUPE_SELECT_GROUP1;
+       dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP1);
 }
 
 static void dupe_menu_select_dupes_set2_cb(GtkWidget *widget, gpointer data)
 {
        DupeWindow *dw = data;
 
-       dupe_listview_select_dupes(dw, FALSE);
+       options->duplicates_select_type = DUPE_SELECT_GROUP2;
+       dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP2);
 }
 
 static void dupe_menu_edit_cb(GtkWidget *widget, gpointer data)
@@ -2619,6 +2669,8 @@ static void dupe_menu_type_cb(GtkWidget *combo, gpointer data)
        if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
        gtk_tree_model_get(store, &iter, DUPE_MENU_COLUMN_MASK, &dw->match_mask, -1);
 
+       options->duplicates_match = dw->match_mask;
+
        dupe_window_recompare(dw);
 }
 
@@ -2793,6 +2845,7 @@ static void dupe_window_show_thumb_cb(GtkWidget *widget, gpointer data)
        DupeWindow *dw = data;
 
        dw->show_thumbs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       options->duplicates_thumbnails = dw->show_thumbs;
 
        if (dw->show_thumbs)
                {
@@ -2821,6 +2874,41 @@ static void dupe_window_show_thumb_cb(GtkWidget *widget, gpointer data)
        dupe_listview_set_height(dw->listview, dw->show_thumbs);
 }
 
+static void dupe_window_rotation_invariant_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       options->rot_invariant_sim = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       dupe_window_recompare(dw);
+}
+
+static void dupe_window_custom_threshold_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+       DupeMatchType match_type;
+       GtkTreeModel *store;
+       gboolean valid;
+       GtkTreeIter iter;
+
+       options->duplicates_similarity_threshold = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
+       dw->match_mask = DUPE_MATCH_SIM_CUSTOM;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(dw->combo));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               gtk_tree_model_get(store, &iter, DUPE_MENU_COLUMN_MASK, &match_type, -1);
+               if (match_type == DUPE_MATCH_SIM_CUSTOM)
+                       {
+                       break;
+                       }
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+
+       gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dw->combo), &iter);
+       dupe_window_recompare(dw);
+}
+
 static void dupe_popup_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
 {
        GtkWidget *view = data;
@@ -2989,10 +3077,12 @@ static gboolean dupe_window_keypress_cb(GtkWidget *widget, GdkEventKey *event, g
                                        }
                                break;
                        case '1':
-                               dupe_listview_select_dupes(dw, TRUE);
+                               options->duplicates_select_type == DUPE_SELECT_GROUP1;
+                               dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP1);
                                break;
                        case '2':
-                               dupe_listview_select_dupes(dw, FALSE);
+                               options->duplicates_select_type == DUPE_SELECT_GROUP2;
+                               dupe_listview_select_dupes(dw, DUPE_SELECT_GROUP2);
                                break;
                        case GDK_KEY_Menu:
                        case GDK_KEY_F10:
@@ -3013,6 +3103,9 @@ static gboolean dupe_window_keypress_cb(GtkWidget *widget, GdkEventKey *event, g
                                                       dupe_popup_menu_pos_cb, listview, 0, GDK_CURRENT_TIME);
                                        }
                                break;
+                       case GDK_KEY_F1:
+                               help_window_show("GuideReferenceKeyboardShortcuts.html#DuplicatesKeyboardShortcuts");
+                               break;
                        default:
                                stop_signal = FALSE;
                                break;
@@ -3071,7 +3164,7 @@ static gint dupe_window_delete(GtkWidget *widget, GdkEvent *event, gpointer data
 }
 
 /* collection and files can be NULL */
-DupeWindow *dupe_window_new(DupeMatchType match_mask)
+DupeWindow *dupe_window_new()
 {
        DupeWindow *dw;
        GtkWidget *vbox;
@@ -3086,7 +3179,18 @@ DupeWindow *dupe_window_new(DupeMatchType match_mask)
 
        dw = g_new0(DupeWindow, 1);
 
-       dw->match_mask = match_mask;
+       dw->match_mask = DUPE_MATCH_NAME;
+       if (options->duplicates_match == DUPE_MATCH_NAME) dw->match_mask = DUPE_MATCH_NAME;
+       if (options->duplicates_match == DUPE_MATCH_SIZE) dw->match_mask = DUPE_MATCH_SIZE;
+       if (options->duplicates_match == DUPE_MATCH_DATE) dw->match_mask = DUPE_MATCH_DATE;
+       if (options->duplicates_match == DUPE_MATCH_DIM) dw->match_mask = DUPE_MATCH_DIM;
+       if (options->duplicates_match == DUPE_MATCH_SUM) dw->match_mask = DUPE_MATCH_SUM;
+       if (options->duplicates_match == DUPE_MATCH_PATH) dw->match_mask = DUPE_MATCH_PATH;
+       if (options->duplicates_match == DUPE_MATCH_SIM_HIGH) dw->match_mask = DUPE_MATCH_SIM_HIGH;
+       if (options->duplicates_match == DUPE_MATCH_SIM_MED) dw->match_mask = DUPE_MATCH_SIM_MED;
+       if (options->duplicates_match == DUPE_MATCH_SIM_LOW) dw->match_mask = DUPE_MATCH_SIM_LOW;
+       if (options->duplicates_match == DUPE_MATCH_SIM_CUSTOM) dw->match_mask = DUPE_MATCH_SIM_CUSTOM;
+       if (options->duplicates_match == DUPE_MATCH_NAME_CI) dw->match_mask = DUPE_MATCH_NAME_CI;
 
        dw->window = window_new(GTK_WINDOW_TOPLEVEL, "dupe", NULL, NULL, _("Find duplicates"));
 
@@ -3192,12 +3296,21 @@ DupeWindow *dupe_window_new(DupeMatchType match_mask)
        gtk_widget_show(dw->combo);
 
        dw->button_thumbs = gtk_check_button_new_with_label(_("Thumbnails"));
+       dw->show_thumbs = options->duplicates_thumbnails;
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dw->button_thumbs), dw->show_thumbs);
        g_signal_connect(G_OBJECT(dw->button_thumbs), "toggled",
                         G_CALLBACK(dupe_window_show_thumb_cb), dw);
        gtk_box_pack_start(GTK_BOX(status_box), dw->button_thumbs, FALSE, FALSE, PREF_PAD_SPACE);
        gtk_widget_show(dw->button_thumbs);
 
+       dw->button_rotation_invariant = gtk_check_button_new_with_label(_("Ignore Rotation"));
+       gtk_widget_set_tooltip_text(GTK_WIDGET(dw->button_rotation_invariant), "Ignore image orientation");
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dw->button_rotation_invariant), options->rot_invariant_sim);
+       g_signal_connect(G_OBJECT(dw->button_rotation_invariant), "toggled",
+                        G_CALLBACK(dupe_window_rotation_invariant_cb), dw);
+       gtk_box_pack_start(GTK_BOX(status_box), dw->button_rotation_invariant, FALSE, FALSE, PREF_PAD_SPACE);
+       gtk_widget_show(dw->button_rotation_invariant);
+
        button = gtk_check_button_new_with_label(_("Compare two file sets"));
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), dw->second_set);
        g_signal_connect(G_OBJECT(button), "toggled",
@@ -3218,6 +3331,17 @@ DupeWindow *dupe_window_new(DupeMatchType match_mask)
        gtk_container_add(GTK_CONTAINER(frame), dw->status_label);
        gtk_widget_show(dw->status_label);
 
+       label = gtk_label_new(_("Custom Threshold"));
+       gtk_box_pack_start(GTK_BOX(status_box), label, FALSE, FALSE, PREF_PAD_SPACE);
+       gtk_widget_show(label);
+       dw->custom_threshold = gtk_spin_button_new_with_range(1, 100, 1);
+       gtk_widget_set_tooltip_text(GTK_WIDGET(dw->custom_threshold), "Custom similarity threshold");
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(dw->custom_threshold), options->duplicates_similarity_threshold);
+       g_signal_connect(G_OBJECT(dw->custom_threshold), "value_changed",
+                                                                                                       G_CALLBACK(dupe_window_custom_threshold_cb), dw);
+       gtk_box_pack_start(GTK_BOX(status_box), dw->custom_threshold, FALSE, FALSE, PREF_PAD_SPACE);
+       gtk_widget_show(dw->custom_threshold);
+
        dw->extra_label = gtk_progress_bar_new();
        gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dw->extra_label), 0.0);
 #if GTK_CHECK_VERSION(3,0,0)
index 92ae273..3e97055 100644 (file)
@@ -41,6 +41,13 @@ typedef enum
        DUPE_MATCH_NAME_CI = 1 << 10    /* same as name, but case insensitive */
 } DupeMatchType;
 
+typedef enum
+{
+       DUPE_SELECT_NONE,
+       DUPE_SELECT_GROUP1,
+       DUPE_SELECT_GROUP2
+} DupeSelectType;
+
 typedef struct _DupeItem DupeItem;
 struct _DupeItem
 {
@@ -85,6 +92,8 @@ struct _DupeWindow
        GtkWidget *status_label;
        GtkWidget *extra_label;
        GtkWidget *button_thumbs;
+       GtkWidget *button_rotation_invariant;
+       GtkWidget *custom_threshold;
 
        gboolean show_thumbs;
 
@@ -119,7 +128,7 @@ struct _DupeWindow
 };
 
 
-DupeWindow *dupe_window_new(DupeMatchType match_mask);
+DupeWindow *dupe_window_new(void);
 
 void dupe_window_clear(DupeWindow *dw);
 void dupe_window_close(DupeWindow *dw);
index 059df73..6b9d764 100644 (file)
@@ -566,6 +566,10 @@ static EditorVerboseData *editor_verbose_window(EditorData *ed, const gchar *tex
        vd->progress = gtk_progress_bar_new();
        gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), 0.0);
        gtk_box_pack_start(GTK_BOX(hbox), vd->progress, TRUE, TRUE, 0);
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(vd->progress), "");
+       gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(vd->progress), TRUE);
+#endif
        gtk_widget_show(vd->progress);
 
        vd->spinner = spinner_new(NULL, SPINNER_SPEED);
index 57efbd4..ea29f2f 100644 (file)
@@ -161,5 +161,6 @@ void file_data_send_notification(FileData *fd, NotifyType type);
 gboolean file_data_register_real_time_monitor(FileData *fd);
 gboolean file_data_unregister_real_time_monitor(FileData *fd);
 
+void read_exif_time_data(FileData *file);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 299840d..505c499 100644 (file)
@@ -130,6 +130,7 @@ gboolean history_list_save(const gchar *path)
        SecureSaveInfo *ssi;
        GList *list;
        gchar *pathl;
+       gint list_count;
 
        pathl = path_from_utf8(path);
        ssi = secure_open(pathl);
@@ -157,10 +158,15 @@ gboolean history_list_save(const gchar *path)
                 * so that when reading they are added correctly
                 */
                work = g_list_last(hd->list);
+               list_count = g_list_position(hd->list, g_list_last(hd->list)) + 1;
                while (work && secsave_errno == SS_ERR_NONE)
                        {
-                       secure_fprintf(ssi, "\"%s\"\n", (gchar *)work->data);
+                       if (!(strcmp(hd->key, "path_list") == 0 && list_count > options->open_recent_list_maxsize))
+                               {
+                               secure_fprintf(ssi, "\"%s\"\n", (gchar *)work->data);
+                               }
                        work = work->prev;
+                       list_count--;
                        }
                secure_fputc(ssi, '\n');
                }
index b80908e..57e1d05 100644 (file)
@@ -375,7 +375,7 @@ static void image_post_process_tile_color_cb(PixbufRenderer *pr, GdkPixbuf **pix
 
 }
 
-void image_alter_orientation(ImageWindow *imd, AlterType type)
+void image_alter_orientation(ImageWindow *imd, FileData *fd_n, AlterType type)
 {
        static const gint rotate_90[]    = {1,   6, 7, 8, 5, 2, 3, 4, 1};
        static const gint rotate_90_cc[] = {1,   8, 5, 6, 7, 4, 1, 2, 3};
@@ -383,37 +383,49 @@ void image_alter_orientation(ImageWindow *imd, AlterType type)
        static const gint mirror[]       = {1,   2, 1, 4, 3, 6, 5, 8, 7};
        static const gint flip[]         = {1,   4, 3, 2, 1, 8, 7, 6, 5};
 
+       gint orientation;
 
-       if (!imd || !imd->pr || !imd->image_fd) return;
+       if (!imd || !imd->pr || !imd->image_fd || !fd_n) return;
 
-       if (imd->orientation < 1 || imd->orientation > 8) imd->orientation = 1;
+       orientation = EXIF_ORIENTATION_TOP_LEFT;
+       {
+       if (fd_n->user_orientation)
+               {
+               orientation = fd_n->user_orientation;
+               }
+       else
+               if (options->metadata.write_orientation)
+                       {
+                       orientation = metadata_read_int(fd_n, ORIENTATION_KEY, EXIF_ORIENTATION_TOP_LEFT);
+                       }
+       }
 
        switch (type)
                {
                case ALTER_ROTATE_90:
-                       imd->orientation = rotate_90[imd->orientation];
+                       orientation = rotate_90[orientation];
                        break;
                case ALTER_ROTATE_90_CC:
-                       imd->orientation = rotate_90_cc[imd->orientation];
+                       orientation = rotate_90_cc[orientation];
                        break;
                case ALTER_ROTATE_180:
-                       imd->orientation = rotate_180[imd->orientation];
+                       orientation = rotate_180[orientation];
                        break;
                case ALTER_MIRROR:
-                       imd->orientation = mirror[imd->orientation];
+                       orientation = mirror[orientation];
                        break;
                case ALTER_FLIP:
-                       imd->orientation = flip[imd->orientation];
+                       orientation = flip[orientation];
                        break;
                case ALTER_NONE:
-                       imd->orientation = imd->image_fd->exif_orientation ? imd->image_fd->exif_orientation : 1;
+                       orientation = fd_n->exif_orientation ? fd_n->exif_orientation : 1;
                        break;
                default:
                        return;
                        break;
                }
 
-       if (imd->orientation != imd->image_fd->exif_orientation ? imd->image_fd->exif_orientation : 1)
+       if (orientation != (fd_n->exif_orientation ? fd_n->exif_orientation : 1))
                {
                if (!options->metadata.write_orientation)
                        {
@@ -422,29 +434,33 @@ void image_alter_orientation(ImageWindow *imd, AlterType type)
                           we must however handle switching metadata.write_orientation on and off, therefore
                           we just disable referencing new fd's, not unreferencing the old ones
                        */
-                       if (imd->image_fd->user_orientation == 0) file_data_ref(imd->image_fd);
-                       imd->image_fd->user_orientation = imd->orientation;
+                       if (fd_n->user_orientation == 0) file_data_ref(fd_n);
+                       fd_n->user_orientation = orientation;
                        }
                }
        else
                {
-               if (imd->image_fd->user_orientation != 0) file_data_unref(imd->image_fd);
-               imd->image_fd->user_orientation = 0;
+               if (fd_n->user_orientation != 0) file_data_unref(fd_n);
+               fd_n->user_orientation = 0;
                }
 
        if (options->metadata.write_orientation)
                {
                if (type == ALTER_NONE)
                        {
-                       metadata_write_revert(imd->image_fd, ORIENTATION_KEY);
+                       metadata_write_revert(fd_n, ORIENTATION_KEY);
                        }
                else
                        {
-                       metadata_write_int(imd->image_fd, ORIENTATION_KEY, imd->orientation);
+                       metadata_write_int(fd_n, ORIENTATION_KEY, orientation);
                        }
                }
 
-       pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation);
+       if (imd->image_fd == fd_n && !(options->metadata.write_orientation && !options->image.exif_rotate_enable))
+               {
+               imd->orientation = orientation;
+               pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, orientation);
+               }
 }
 
 void image_set_desaturate(ImageWindow *imd, gboolean desaturate)
@@ -1070,6 +1086,7 @@ void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboo
           here before it is taken over by the renderer. */
        if (pixbuf) g_object_ref(pixbuf);
 
+       imd->orientation = EXIF_ORIENTATION_TOP_LEFT;
        if (imd->image_fd)
                {
                if (imd->image_fd->user_orientation)
index b429861..38e7e00 100644 (file)
@@ -85,7 +85,7 @@ void image_scroll_to_point(ImageWindow *imd, gint x, gint y,
                           gdouble x_align, gdouble y_align);
 void image_get_scroll_center(ImageWindow *imd, gdouble *x, gdouble *y);
 void image_set_scroll_center(ImageWindow *imd, gdouble x, gdouble y);
-void image_alter_orientation(ImageWindow *imd, AlterType type);
+void image_alter_orientation(ImageWindow *imd, FileData *fd, AlterType type);
 void image_set_desaturate(ImageWindow *imd, gboolean desaturate);
 gboolean image_get_desaturate(ImageWindow *imd);
 
index f4768dd..35b0ca3 100644 (file)
@@ -421,13 +421,13 @@ static gboolean view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event,
                switch (event->keyval)
                        {
                        case 'R': case 'r':
-                               image_alter_orientation(imd, ALTER_ROTATE_180);
+                               image_alter_orientation(imd, imd->image_fd, ALTER_ROTATE_180);
                                break;
                        case 'M': case 'm':
-                               image_alter_orientation(imd, ALTER_MIRROR);
+                               image_alter_orientation(imd, imd->image_fd, ALTER_MIRROR);
                                break;
                        case 'F': case 'f':
-                               image_alter_orientation(imd, ALTER_FLIP);
+                               image_alter_orientation(imd, imd->image_fd, ALTER_FLIP);
                                break;
                        case 'G': case 'g':
                                image_set_desaturate(imd, !image_get_desaturate(imd));
@@ -531,10 +531,10 @@ static gboolean view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event,
                                view_overlay_toggle(vw);
                                break;
                        case ']':
-                               image_alter_orientation(imd, ALTER_ROTATE_90);
+                               image_alter_orientation(imd, imd->image_fd, ALTER_ROTATE_90);
                                break;
                        case '[':
-                               image_alter_orientation(imd, ALTER_ROTATE_90_CC);
+                               image_alter_orientation(imd, imd->image_fd, ALTER_ROTATE_90_CC);
                                break;
                        case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
                                if (options->file_ops.enable_delete_key)
@@ -1081,7 +1081,7 @@ static void view_alter_cb(GtkWidget *widget, gpointer data)
        type = GPOINTER_TO_INT(data);
 
        if (!vw) return;
-       image_alter_orientation(vw->imd, type);
+       image_alter_orientation(vw->imd, vw->imd->image_fd, type);
 }
 
 static void view_wallpaper_cb(GtkWidget *widget, gpointer data)
index 64579d6..1e4347f 100644 (file)
@@ -292,8 +292,13 @@ static GtkWidget *layout_tool_setup(LayoutWindow *lw)
        gtk_box_pack_start(GTK_BOX(box), tabcomp, FALSE, FALSE, 0);
        gtk_widget_show(tabcomp);
 
+#if GTK_CHECK_VERSION(3,20,0)
+       g_signal_connect(G_OBJECT(gtk_widget_get_parent(gtk_widget_get_parent(lw->path_entry))), "changed",
+                        G_CALLBACK(layout_path_entry_changed_cb), lw);
+#else
        g_signal_connect(G_OBJECT(gtk_widget_get_parent(lw->path_entry)), "changed",
                         G_CALLBACK(layout_path_entry_changed_cb), lw);
+#endif
 
        lw->vd = vd_new(lw->options.dir_view_type, lw->dir_fd);
        vd_set_layout(lw->vd, lw);
@@ -602,14 +607,20 @@ static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gboolean small
                }
        lw->info_progress_bar = gtk_progress_bar_new();
        gtk_widget_set_size_request(lw->info_progress_bar, PROGRESS_WIDTH, -1);
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(lw->info_progress_bar), "");
+       gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(lw->info_progress_bar), TRUE);
+#endif
        gtk_box_pack_start(GTK_BOX(hbox), lw->info_progress_bar, FALSE, FALSE, 0);
        gtk_widget_show(lw->info_progress_bar);
 
        lw->info_sort = layout_sort_button(lw);
+       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_sort), _("Select sort order"));
        gtk_box_pack_start(GTK_BOX(hbox), lw->info_sort, FALSE, FALSE, 0);
        gtk_widget_show(lw->info_sort);
 
        lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format));
+       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_status), _("Folder contents (files selected)"));
 
        if (small_format)
                {
@@ -618,6 +629,7 @@ static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gboolean small
                gtk_widget_show(hbox);
                }
        lw->info_details = layout_status_label(NULL, hbox, TRUE, 0, TRUE);
+       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_details), _("(Image dimensions) Image size"));
        toolbar = layout_actions_toolbar(lw, TOOLBAR_STATUS);
 
        toolbar_frame = gtk_frame_new(NULL);
@@ -627,6 +639,7 @@ static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gboolean small
        gtk_widget_show(toolbar);
        gtk_box_pack_end(GTK_BOX(hbox), toolbar_frame, FALSE, FALSE, 0);
        lw->info_zoom = layout_status_label(NULL, hbox, FALSE, ZOOM_LABEL_WIDTH, FALSE);
+       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_zoom), _("Image zoom level"));
        if (small_format)
                {
                hbox = gtk_hbox_new(FALSE, 0);
@@ -634,6 +647,7 @@ static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gboolean small
                gtk_widget_show(hbox);
                }
        lw->info_pixel = layout_status_label(NULL, hbox, FALSE, 0, small_format); /* expand only in small format */
+       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_pixel), _("[Pixel x,y coord]: (Pixel R,G,B value)"));
        if (!lw->options.show_info_pixel) gtk_widget_hide(gtk_widget_get_parent(lw->info_pixel));
 }
 
@@ -1174,7 +1188,7 @@ gboolean layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w,
                return FALSE;
                }
 
-       window = gtk_widget_get_window(lw->window);
+       window = gtk_widget_get_window(lw->tools);
        gdk_window_get_root_origin(window, x, y);
        *w = gdk_window_get_width(window);
        *h = gdk_window_get_height(window);
@@ -2284,6 +2298,8 @@ void layout_write_attributes(LayoutOptions *layout, GString *outstr, gint indent
        WRITE_NL(); WRITE_UINT(*layout, image_overlay.state);
        WRITE_NL(); WRITE_INT(*layout, image_overlay.histogram_channel);
        WRITE_NL(); WRITE_INT(*layout, image_overlay.histogram_mode);
+
+       WRITE_NL(); WRITE_BOOL(*layout, animate);
 }
 
 
@@ -2353,6 +2369,8 @@ void layout_load_attributes(LayoutOptions *layout, const gchar **attribute_names
                if (READ_INT(*layout, image_overlay.histogram_channel)) continue;
                if (READ_INT(*layout, image_overlay.histogram_mode)) continue;
 
+               if (READ_BOOL(*layout, animate)) continue;
+
                log_printf("unknown attribute %s = %s\n", option, value);
                }
        if (id && strcmp(id, LAYOUT_ID_CURRENT) != 0)
index e5e5659..049e328 100644 (file)
@@ -26,6 +26,7 @@
 #include "color-man.h"
 #include "dnd.h"
 #include "editors.h"
+#include "exif.h"
 #include "filedata.h"
 #include "fullscreen.h"
 #include "image.h"
@@ -34,6 +35,7 @@
 #include "layout.h"
 #include "layout_util.h"
 #include "menu.h"
+#include "metadata.h"
 #include "misc.h"
 #include "pixbuf_util.h"
 #include "pixbuf-renderer.h"
@@ -46,6 +48,7 @@
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
+#define FILE_COLUMN_POINTER 0
 
 static GtkWidget *layout_image_pop_menu(LayoutWindow *lw);
 static void layout_image_set_buttons(LayoutWindow *lw);
@@ -406,11 +409,17 @@ static gboolean layout_image_animate_new_file(LayoutWindow *lw)
        return TRUE;
 }
 
-static void layout_image_animate_toggle(LayoutWindow *lw)
+void layout_image_animate_toggle(LayoutWindow *lw)
 {
+       GtkAction *action;
+
        if (!lw) return;
 
        lw->options.animate = !lw->options.animate;
+
+       action = gtk_action_group_get_action(lw->action_group, "Animate");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.animate);
+
        layout_image_animate_new_file(lw);
 }
 
@@ -476,7 +485,7 @@ static void li_pop_menu_alter_cb(GtkWidget *widget, gpointer data)
        lw = submenu_item_get_data(widget);
        type = (AlterType)GPOINTER_TO_INT(data);
 
-       image_alter_orientation(lw->image, type);
+       image_alter_orientation(lw->image, lw->image->image_fd, type);
 }
 
 static void li_pop_menu_new_cb(GtkWidget *widget, gpointer data)
@@ -1054,7 +1063,71 @@ void layout_image_alter_orientation(LayoutWindow *lw, AlterType type)
 {
        if (!layout_valid(&lw)) return;
 
-       image_alter_orientation(lw->image, type);
+       GtkTreeModel *store;
+       GList *work;
+       GtkTreeSelection *selection;
+       GtkTreePath *tpath;
+       FileData *fd_n;
+       GtkTreeIter iter;
+       IconData *id;
+
+       if (!lw || !lw->vf) return;
+
+       if (lw->vf->type == FILEVIEW_ICON)
+               {
+               if (!VFICON(lw->vf)->selection) return;
+               work = VFICON(lw->vf)->selection;
+               }
+       else
+               {
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(lw->vf->listview));
+               work = gtk_tree_selection_get_selected_rows(selection, &store);
+               }
+
+       while (work)
+               {
+               if (lw->vf->type == FILEVIEW_ICON)
+                       {
+                       id = work->data;
+                       fd_n = id->fd;
+                       work = work->next;
+                       }
+               else
+                       {
+                       tpath = work->data;
+                       gtk_tree_model_get_iter(store, &iter, tpath);
+                       gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
+                       work = work->next;
+                       }
+
+               image_alter_orientation(lw->image, fd_n, type);
+               }
+}
+
+void layout_image_reset_orientation(LayoutWindow *lw)
+{
+       ImageWindow *imd= lw->image;
+
+       if (!layout_valid(&lw)) return;
+       if (!imd || !imd->pr || !imd->image_fd) return;
+
+       if (imd->orientation < 1 || imd->orientation > 8) imd->orientation = 1;
+
+       if (options->image.exif_rotate_enable)
+               {
+               imd->orientation = metadata_read_int(imd->image_fd, ORIENTATION_KEY, EXIF_ORIENTATION_TOP_LEFT);
+               }
+       else
+               {
+               imd->orientation = 1;
+               }
+
+       if (imd->image_fd->user_orientation != 0)
+               {
+                imd->orientation = imd->image_fd->user_orientation;
+               }
+
+       pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation);
 }
 
 void layout_image_set_desaturate(LayoutWindow *lw, gboolean desaturate)
index 383a214..54c2822 100644 (file)
@@ -95,10 +95,11 @@ gboolean layout_image_slideshow_active(LayoutWindow *lw);
 gboolean layout_image_slideshow_pause_toggle(LayoutWindow *lw);
 gboolean layout_image_slideshow_paused(LayoutWindow *lw);
 
+void layout_image_animate_toggle(LayoutWindow *lw);
 
 void layout_image_overlay_toggle(LayoutWindow *lw);
 
 void layout_image_notify_cb(FileData *fd, NotifyType type, gpointer data);
-
+void layout_image_reset_orientation(LayoutWindow *lw);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 5dd98f4..65fc1d5 100644 (file)
@@ -248,7 +248,7 @@ static void layout_menu_dupes_cb(GtkAction *action, gpointer data)
        LayoutWindow *lw = data;
 
        layout_exit_fullscreen(lw);
-       dupe_window_new(DUPE_MATCH_NAME);
+       dupe_window_new();
 }
 
 static void layout_menu_pan_cb(GtkAction *action, gpointer data)
@@ -308,6 +308,16 @@ static void layout_menu_delete_cb(GtkAction *action, gpointer data)
        file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
 }
 
+static void layout_menu_delete_key_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (options->file_ops.enable_delete_key)
+               {
+               file_util_delete(NULL, layout_selection_list(lw), layout_window(lw));
+               }
+}
+
 static void layout_menu_disable_grouping_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
@@ -384,6 +394,14 @@ static void layout_menu_alter_none_cb(GtkAction *action, gpointer data)
        layout_image_alter_orientation(lw, ALTER_NONE);
 }
 
+static void layout_menu_exif_rotate_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       options->image.exif_rotate_enable = gtk_toggle_action_get_active(action);
+       layout_image_reset_orientation(lw);
+}
+
 static void layout_menu_config_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
@@ -695,6 +713,21 @@ static void layout_menu_histogram_cb(GtkToggleAction *action, gpointer data)
                }
 }
 
+static void layout_menu_animate_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->options.animate == gtk_toggle_action_get_active(action)) return;
+       layout_image_animate_toggle(lw);
+}
+
+static void layout_menu_rectangular_selection_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       options->collections.rectangular_selection = gtk_toggle_action_get_active(action);
+}
+
 static void layout_menu_histogram_toggle_channel_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
@@ -1480,8 +1513,8 @@ static GtkActionEntry menu_entries[] = {
   { "Move",            NULL,                   N_("_Move..."),                         "<control>M",           N_("Move..."),                          CB(layout_menu_move_cb) },
   { "Rename",          NULL,                   N_("_Rename..."),                       "<control>R",           N_("Rename..."),                        CB(layout_menu_rename_cb) },
   { "Delete",          GTK_STOCK_DELETE,       N_("_Delete..."),                       "<control>D",           N_("Delete..."),                        CB(layout_menu_delete_cb) },
-  { "DeleteAlt1",      GTK_STOCK_DELETE,       N_("_Delete..."),                       "Delete",               N_("Delete..."),                        CB(layout_menu_delete_cb) },
-  { "DeleteAlt2",      GTK_STOCK_DELETE,       N_("_Delete..."),                       "KP_Delete",            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) },
   { "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) },
@@ -1571,6 +1604,9 @@ static GtkToggleActionEntry menu_toggle_entries[] = {
   { "Grayscale",       NULL,                   N_("Toggle _grayscale"),                "<shift>G",             N_("Toggle grayscale"),                 CB(layout_menu_alter_desaturate_cb), FALSE},
   { "ImageOverlay",    NULL,                   N_("Image _Overlay"),                   NULL,                   N_("Image Overlay"),                    CB(layout_menu_overlay_cb),      FALSE },
   { "ImageHistogram",  NULL,                   N_("_Show Histogram"),                  NULL,                   N_("Show Histogram"),                   CB(layout_menu_histogram_cb),    FALSE },
+  { "RectangularSelection",    NULL,                   N_("Rectangular Selection"),                    "<alt>R",                       N_("Rectangular Selection"),                    CB(layout_menu_rectangular_selection_cb),        FALSE },
+  { "Animate", NULL,   N_("GIF _animation"),           "A",                    N_("Toggle GIF animation"),                     CB(layout_menu_animate_cb),      FALSE  },
+  { "ExifRotate",      GTK_STOCK_ORIENTATION_PORTRAIT,                 N_("_Exif rotate"),             "<alt>X",               N_("Exif rotate"),                      CB(layout_menu_exif_rotate_cb), FALSE },
 };
 
 static GtkRadioActionEntry menu_radio_entries[] = {
@@ -1666,6 +1702,7 @@ static const gchar *menu_ui_description =
 "      <menuitem action='SelectAll'/>"
 "      <menuitem action='SelectNone'/>"
 "      <menuitem action='SelectInvert'/>"
+"      <menuitem action='RectangularSelection'/>"
 "      <placeholder name='SelectSection'/>"
 "      <separator/>"
 "      <menuitem action='CopyPath'/>"
@@ -1687,6 +1724,9 @@ static const gchar *menu_ui_description =
 "        <menuitem action='Mirror'/>"
 "        <menuitem action='Flip'/>"
 "        <menuitem action='AlterNone'/>"
+"        <separator/>"
+"        <menuitem action='ExifRotate'/>"
+"        <separator/>"
 "      </menu>"
 "      <menuitem action='SaveMetadata'/>"
 "      <placeholder name='PropertiesSection'/>"
@@ -1802,6 +1842,7 @@ static const gchar *menu_ui_description =
 "      <menuitem action='ShowInfoPixel'/>"
 "      <placeholder name='ToolsSection'/>"
 "      <separator/>"
+"      <menuitem action='Animate'/>"
 "      <menuitem action='SlideShow'/>"
 "      <menuitem action='SlideShowPause'/>"
 "      <menuitem action='Refresh'/>"
@@ -1836,6 +1877,7 @@ static const gchar *menu_ui_description =
 "    <toolitem action='FloatTools'/>"
 "  </toolbar>"
 "  <toolbar name='StatusBar'>"
+"    <toolitem action='ExifRotate'/>"
 "    <toolitem action='ShowInfoPixel'/>"
 "    <toolitem action='UseColorProfiles'/>"
 "    <toolitem action='SaveMetadata'/>"
@@ -2440,12 +2482,21 @@ static void layout_util_sync_views(LayoutWindow *lw)
        action = gtk_action_group_get_action(lw->action_group, "SlideShow");
        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), layout_image_slideshow_active(lw));
 
+       action = gtk_action_group_get_action(lw->action_group, "Animate");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.animate);
+
        action = gtk_action_group_get_action(lw->action_group, "ImageOverlay");
        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags != OSD_SHOW_NOTHING);
 
        action = gtk_action_group_get_action(lw->action_group, "ImageHistogram");
        gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags & OSD_SHOW_HISTOGRAM);
 
+       action = gtk_action_group_get_action(lw->action_group, "ExifRotate");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), options->image.exif_rotate_enable);
+
+       action = gtk_action_group_get_action(lw->action_group, "RectangularSelection");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), options->collections.rectangular_selection);
+
        if (osd_flags & OSD_SHOW_HISTOGRAM)
                {
                action = gtk_action_group_get_action(lw->action_group, "HistogramChanR");
index 021b22a..9423679 100644 (file)
@@ -41,6 +41,9 @@ struct _ConfOptions
        gboolean update_on_time_change;
 
        guint duplicates_similarity_threshold;
+       guint duplicates_match;
+       gboolean duplicates_thumbnails;
+       guint duplicates_select_type;
        gboolean rot_invariant_sim;
 
        gint open_recent_list_maxsize;
index a75424d..db70b65 100644 (file)
@@ -1298,6 +1298,9 @@ static gboolean pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, g
                                case '/':
                                        pan_search_toggle_visible(pw, TRUE);
                                        break;
+                               case GDK_KEY_F1:
+                                       help_window_show("GuideReferenceKeyboardShortcuts.html#PanViewKeyboardShortcuts");
+                                       break;
                                default:
                                        stop_signal = FALSE;
                                        break;
index 6eecaf4..669fb73 100644 (file)
@@ -276,8 +276,6 @@ static void config_window_apply(void)
 
        options->file_ops.enable_in_place_rename = c_options->file_ops.enable_in_place_rename;
 
-       options->collections.rectangular_selection = c_options->collections.rectangular_selection;
-
        options->image.tile_cache_max = c_options->image.tile_cache_max;
        options->image.image_cache_max = c_options->image.image_cache_max;
 
@@ -318,7 +316,6 @@ static void config_window_apply(void)
        options->image_overlay.background_blue = c_options->image_overlay.background_blue;
        options->image_overlay.background_alpha = c_options->image_overlay.background_alpha;
        options->update_on_time_change = c_options->update_on_time_change;
-       options->image.exif_rotate_enable = c_options->image.exif_rotate_enable;
        options->image.exif_proof_rotate_enable = c_options->image.exif_proof_rotate_enable;
 
        options->duplicates_similarity_threshold = c_options->duplicates_similarity_threshold;
@@ -410,7 +407,7 @@ static void config_window_close_cb(GtkWidget *widget, gpointer data)
 
 static void config_window_help_cb(GtkWidget *widget, gpointer data)
 {
-       GtkWidget *notebook = GTK_WIDGET(data);
+       GtkWidget *notebook = data;
        gint i;
 
        static gchar *html_section[] =
@@ -1552,9 +1549,6 @@ static void config_tab_image(GtkWidget *notebook)
 
        group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
 
-       pref_checkbox_new_int(group, _("Auto rotate image using Exif information"),
-                             options->image.exif_rotate_enable, &c_options->image.exif_rotate_enable);
-
        pref_checkbox_new_int(group, _("Auto rotate proofs using Exif information"),
                              options->image.exif_proof_rotate_enable, &c_options->image.exif_proof_rotate_enable);
 }
@@ -2147,9 +2141,6 @@ static void config_tab_behavior(GtkWidget *notebook)
 
        group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
 
-       pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
-                             options->collections.rectangular_selection, &c_options->collections.rectangular_selection);
-
        pref_checkbox_new_int(group, _("Descend folders in tree view"),
                              options->tree_descend_subdirs, &c_options->tree_descend_subdirs);
 
@@ -2159,7 +2150,7 @@ static void config_tab_behavior(GtkWidget *notebook)
        pref_checkbox_new_int(group, _("List directory view uses single click to enter"),
                              options->view_dir_list_single_click_enter, &c_options->view_dir_list_single_click_enter);
 
-       pref_spin_new_int(group, _("Open recent list maximum size"), NULL,
+       pref_spin_new_int(group, _("Recent folder list maximum size"), NULL,
                          1, 50, 1, options->open_recent_list_maxsize, &c_options->open_recent_list_maxsize);
 
        pref_spin_new_int(group, _("Drag'n drop icon size"), NULL,
@@ -2176,13 +2167,6 @@ static void config_tab_behavior(GtkWidget *notebook)
        pref_checkbox_new_int(group, _("Navigation by left or middle click on image"),
                              options->image_lm_click_nav, &c_options->image_lm_click_nav);
 
-       group = pref_group_new(vbox, FALSE, _("Similarities"), GTK_ORIENTATION_VERTICAL);
-
-       pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
-                         0, 100, 1, options->duplicates_similarity_threshold, (int *)&c_options->duplicates_similarity_threshold);
-       pref_checkbox_new_int(group, _("Rotation invariant duplicate check"),
-                             options->rot_invariant_sim, &c_options->rot_invariant_sim);
-
 #ifdef DEBUG
        group = pref_group_new(vbox, FALSE, _("Debugging"), GTK_ORIENTATION_VERTICAL);
 
index e80ec2e..c86bf46 100644 (file)
@@ -43,6 +43,7 @@
 #include "bar.h"
 #include "metadata.h"
 #include "bar_gps.h"
+#include "dupe.h"
 
 
 /*
@@ -317,6 +318,9 @@ static void write_global_attributes(GString *outstr, gint indent)
        WRITE_NL(); WRITE_UINT(*options, keyboard_scroll_step);
 
        WRITE_NL(); WRITE_UINT(*options, duplicates_similarity_threshold);
+       WRITE_NL(); WRITE_UINT(*options, duplicates_match);
+       WRITE_NL(); WRITE_UINT(*options, duplicates_select_type);
+       WRITE_NL(); WRITE_BOOL(*options, duplicates_thumbnails);
        WRITE_NL(); WRITE_BOOL(*options, rot_invariant_sim);
        WRITE_SEPARATOR();
 
@@ -594,6 +598,9 @@ static gboolean load_global_params(const gchar **attribute_names, const gchar **
                if (READ_BOOL(*options, update_on_time_change)) continue;
 
                if (READ_UINT_CLAMP(*options, duplicates_similarity_threshold, 0, 100)) continue;
+               if (READ_UINT_CLAMP(*options, duplicates_match, 0, DUPE_MATCH_NAME_CI)) continue;
+               if (READ_UINT_CLAMP(*options, duplicates_select_type, 0, DUPE_SELECT_GROUP2)) continue;
+               if (READ_BOOL(*options, duplicates_thumbnails)) continue;
                if (READ_BOOL(*options, rot_invariant_sim)) continue;
 
                if (READ_BOOL(*options, progressive_key_scrolling)) continue;
index c89eff9..9147bf9 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "collect.h"
 #include "filedata.h"
+#include "image.h"
 #include "img-view.h"
 #include "layout.h"
 #include "layout_image.h"
@@ -522,6 +523,14 @@ static void gr_file_load(const gchar *text, GIOChannel *channel, gpointer data)
        g_free(filename);
 }
 
+static void gr_file_tell(const gchar *text, GIOChannel *channel, gpointer data)
+{
+       LayoutWindow *lw = NULL; /* NULL to force layout_valid() to do some magic */
+       if (!layout_valid(&lw)) return;
+       if (image_get_path(lw->image))
+               printf_term("%s %s\n", GQ_APPNAME, image_get_path(lw->image));
+}
+
 static void gr_config_load(const gchar *text, GIOChannel *channel, gpointer data)
 {
        gchar *filename = expand_tilde(text);
@@ -666,6 +675,7 @@ static RemoteCommandEntry remote_commands[] = {
        { NULL, "--get-sidecars:",      gr_get_sidecars,        TRUE,  FALSE, N_("<FILE>"), N_("get list of sidecars of FILE") },
        { NULL, "--get-destination:",   gr_get_destination,     TRUE,  FALSE, N_("<FILE>"), N_("get destination path of FILE") },
        { NULL, "file:",                gr_file_load,           TRUE,  FALSE, N_("<FILE>"), N_("open FILE") },
+       { NULL, "--tell",               gr_file_tell,           FALSE, FALSE, NULL, N_("print filename of current image") },
        { NULL, "view:",                gr_file_view,           TRUE,  FALSE, N_("<FILE>"), 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_("<FILE>"), N_("add FILE to command line collection list") },
index 070c418..a858ac7 100644 (file)
@@ -160,6 +160,7 @@ struct _SearchData
        GList *search_keyword_list;
        gchar *search_comment;
        gboolean   search_comment_match_case;
+       gboolean   search_date_exif;
 
        MatchType search_type;
 
@@ -1295,12 +1296,19 @@ static gboolean search_result_keypress_cb(GtkWidget *widget, GdkEventKey *event,
                                {
                                GtkWidget *menu;
 
-                               sd->click_fd = mfd->fd;
+                               if (mfd)
+                                       sd->click_fd = mfd->fd;
+                               else
+                                       sd->click_fd = NULL;
+
                                menu = search_result_menu(sd, (mfd != NULL), (search_result_count(sd, NULL) > 0));
                                gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
                                               search_result_menu_pos_cb, sd, 0, GDK_CURRENT_TIME);
                                }
                                break;
+                       case GDK_KEY_F1:
+                               help_window_show("GuideReferenceKeyboardShortcuts.html#SearchKeyboardShortcuts");
+                               break;
                        default:
                                stop_signal = FALSE;
                                break;
@@ -1646,6 +1654,7 @@ static gboolean search_file_next(SearchData *sd)
        gint width = 0;
        gint height = 0;
        gint sim = 0;
+       time_t file_date;
 
        if (!sd->search_file_list) return FALSE;
 
@@ -1722,11 +1731,21 @@ static gboolean search_file_next(SearchData *sd)
                tested = TRUE;
                match = FALSE;
 
+               if (sd->search_date_exif)
+                       {
+                       read_exif_time_data(fd);
+                       file_date = fd->exifdate;
+                       }
+               else
+                       {
+                       file_date = fd->date;
+                       }
+
                if (sd->match_date == SEARCH_MATCH_EQUAL)
                        {
                        struct tm *lt;
 
-                       lt = localtime(&fd->date);
+                       lt = localtime(&file_date);
                        match = (lt &&
                                 lt->tm_year == sd->search_date_y - 1900 &&
                                 lt->tm_mon == sd->search_date_m - 1 &&
@@ -1734,11 +1753,11 @@ static gboolean search_file_next(SearchData *sd)
                        }
                else if (sd->match_date == SEARCH_MATCH_UNDER)
                        {
-                       match = (fd->date < convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y));
+                       match = (file_date < convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y));
                        }
                else if (sd->match_date == SEARCH_MATCH_OVER)
                        {
-                       match = (fd->date > convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y) + 60 * 60 * 24 - 1);
+                       match = (file_date > convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y) + 60 * 60 * 24 - 1);
                        }
                else if (sd->match_date == SEARCH_MATCH_BETWEEN)
                        {
@@ -1753,7 +1772,7 @@ static gboolean search_file_next(SearchData *sd)
                                {
                                a += 60 * 60 * 24 - 1;
                                }
-                       match = MATCH_IS_BETWEEN(fd->date, a, b);
+                       match = MATCH_IS_BETWEEN(file_date, a, b);
                        }
                }
 
@@ -2681,6 +2700,8 @@ void search_new(FileData *dir_fd, FileData *example_file)
        date_selection_time_set(sd->date_sel_end, time(NULL));
        gtk_box_pack_start(GTK_BOX(hbox2), sd->date_sel_end, FALSE, FALSE, 0);
        gtk_widget_show(sd->date_sel_end);
+       pref_checkbox_new_int(hbox, _("Exif date"),
+                               sd->search_date_exif, &sd->search_date_exif);
 
        /* Search for image dimensions */
        hbox = menu_choice(sd->box_search, &sd->check_dimensions, &sd->menu_dimensions,
@@ -2827,6 +2848,10 @@ void search_new(FileData *dir_fd, FileData *example_file)
 
        sd->label_progress = gtk_progress_bar_new();
        gtk_widget_set_size_request(sd->label_progress, 50, -1);
+#if GTK_CHECK_VERSION(3,0,0)
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(sd->label_progress), "");
+       gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(sd->label_progress), TRUE);
+#endif
        gtk_box_pack_start(GTK_BOX(hbox), sd->label_progress, TRUE, TRUE, 0);
        gtk_widget_show(sd->label_progress);
 
index e2642a2..07dd8fd 100644 (file)
@@ -849,7 +849,19 @@ struct _ViewFileInfoList
        guint select_idle_id; /* event source id */
 };
 
-struct _IconData;
+typedef enum {
+       SELECTION_NONE          = 0,
+       SELECTION_SELECTED      = 1 << 0,
+       SELECTION_PRELIGHT      = 1 << 1,
+       SELECTION_FOCUS         = 1 << 2
+} SelectionType;
+
+typedef struct _IconData IconData;
+struct _IconData
+{
+       SelectionType selected;
+       FileData *fd;
+};
 
 struct _ViewFileInfoIcon
 {
index 9e4f41d..9e0505c 100644 (file)
@@ -118,7 +118,7 @@ GtkWidget *menu_item_add_radio(GtkWidget *menu, const gchar *label, gpointer ite
 
 void menu_item_add_divider(GtkWidget *menu)
 {
-       GtkWidget *item = gtk_menu_item_new();
+       GtkWidget *item = gtk_separator_menu_item_new();
        gtk_widget_set_sensitive(item, FALSE);
        gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
        gtk_widget_show(item);
index 139aab8..fe0dd28 100644 (file)
@@ -496,7 +496,7 @@ static void vd_pop_menu_dupe(ViewDir *vd, gint recursive)
                list = filelist_filter(list, FALSE);
                }
 
-       dw = dupe_window_new(DUPE_MATCH_NAME);
+       dw = dupe_window_new();
        dupe_window_add_files(dw, list, recursive);
 
        filelist_free(list);
index 2472594..a2d6cd7 100644 (file)
@@ -409,7 +409,7 @@ static void vf_pop_menu_duplicates_cb(GtkWidget *widget, gpointer data)
        ViewFile *vf = data;
        DupeWindow *dw;
 
-       dw = dupe_window_new(DUPE_MATCH_NAME);
+       dw = dupe_window_new();
        dupe_window_add_files(dw, vf_pop_menu_file_list(vf), FALSE);
 }
 
index 1457f81..920c1e5 100644 (file)
@@ -60,20 +60,6 @@ enum {
        FILE_COLUMN_COUNT
 };
 
-typedef enum {
-       SELECTION_NONE          = 0,
-       SELECTION_SELECTED      = 1 << 0,
-       SELECTION_PRELIGHT      = 1 << 1,
-       SELECTION_FOCUS         = 1 << 2
-} SelectionType;
-
-typedef struct _IconData IconData;
-struct _IconData
-{
-       SelectionType selected;
-       FileData *fd;
-};
-
 static gint vficon_index_by_id(ViewFile *vf, IconData *in_id);
 
 static IconData *vficon_icon_data(ViewFile *vf, FileData *fd)