Hello community,

here is the log from the commit of package xviewer for openSUSE:Factory checked 
in at 2020-12-13 17:30:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xviewer (Old)
 and      /work/SRC/openSUSE:Factory/.xviewer.new.2328 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xviewer"

Sun Dec 13 17:30:26 2020 rev:19 rq:855395 version:2.8.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/xviewer/xviewer.changes  2020-08-21 
19:20:41.912932880 +0200
+++ /work/SRC/openSUSE:Factory/.xviewer.new.2328/xviewer.changes        
2020-12-13 17:30:55.488421656 +0100
@@ -1,0 +2,13 @@
+Tue Dec  8 19:22:56 UTC 2020 - andy great <[email protected]>
+
+- Update to version 2.8.0.
+  * Configure Mouse Wheel
+  * Make the mouse preferences tab look a bit more consistent with 
+    the other tabs and other apps.
+  * Stop Centering Window
+  * Delete Dialog Focus
+  * Delete Dialog Focus
+  * Add favorites to the file menu.
+  * l10n: Update POT
+
+-------------------------------------------------------------------

Old:
----
  xviewer-2.6.2.tar.gz

New:
----
  xviewer-2.8.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xviewer.spec ++++++
--- /var/tmp/diff_new_pack.lWOEI3/_old  2020-12-13 17:30:56.076422253 +0100
+++ /var/tmp/diff_new_pack.lWOEI3/_new  2020-12-13 17:30:56.076422253 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           xviewer
-Version:        2.6.2
+Version:        2.8.0
 Release:        0
 Summary:        Fast and functional graphics viewer
 License:        GPL-2.0-or-later AND LGPL-2.1-or-later
@@ -28,6 +28,7 @@
 BuildRequires:  gnome-common
 BuildRequires:  hicolor-icon-theme
 BuildRequires:  libjpeg-devel
+BuildRequires:  libxapp-devel
 BuildRequires:  pkgconfig
 BuildRequires:  update-desktop-files
 BuildRequires:  yelp-tools

++++++ xviewer-2.6.2.tar.gz -> xviewer-2.8.0.tar.gz ++++++
++++ 2448 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/configure.ac new/xviewer-2.8.0/configure.ac
--- old/xviewer-2.6.2/configure.ac      2020-06-24 13:49:13.000000000 +0200
+++ new/xviewer-2.8.0/configure.ac      2020-11-30 12:22:18.000000000 +0100
@@ -1,8 +1,8 @@
 AC_PREREQ(2.59)
 
 m4_define(xviewer_major_version,  2)
-m4_define(xviewer_minor_version, 6)
-m4_define(xviewer_micro_version,  2)
+m4_define(xviewer_minor_version, 8)
+m4_define(xviewer_micro_version,  0)
 m4_define(xviewer_version, 
xviewer_major_version.xviewer_minor_version.xviewer_micro_version)
 
 AC_INIT([xviewer], xviewer_version, 
[https://github.com/linuxmint/xviewer/issues], [xviewer])
@@ -94,6 +94,7 @@
 EXEMPI_REQUIRED=1.99.5
 LIBPEAS_REQUIRED=0.7.4
 LIBPEAS_GTK_REQUIRED=0.7.4
+XAPP_REQUIRED=1.9.0
 
 XVIEWER_MODULES="gtk+-3.0 >= $GTK_REQUIRED \
              glib-2.0 >= $GLIB_REQUIRED \
@@ -104,7 +105,8 @@
              gtk+-unix-print-3.0 >= $GTK_PRINT_REQUIRED \
              shared-mime-info >= $SHARED_MIME_INFO_REQUIRED \
              libpeas-1.0 >= $LIBPEAS_REQUIRED \
-             libpeas-gtk-1.0 >= $LIBPEAS_GTK_REQUIRED"
+             libpeas-gtk-1.0 >= $LIBPEAS_GTK_REQUIRED \
+             xapp >= $XAPP_REQUIRED"
 
 # Introspection
 GOBJECT_INTROSPECTION_CHECK([0.9.3])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/data/org.x.viewer.gschema.xml.in 
new/xviewer-2.8.0/data/org.x.viewer.gschema.xml.in
--- old/xviewer-2.6.2/data/org.x.viewer.gschema.xml.in  2020-06-24 
13:49:13.000000000 +0200
+++ new/xviewer-2.8.0/data/org.x.viewer.gschema.xml.in  2020-11-30 
12:22:18.000000000 +0100
@@ -37,6 +37,62 @@
       <summary>Scroll wheel zoom</summary>
       <description>Whether the scroll wheel should be used for 
zooming.</description>
     </key>
+    <key name="scroll-action" type="i">
+      <default>0</default>
+      <summary>Mouse scroll wheel action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="shift-scroll-action" type="i">
+      <default>2</default>
+      <summary>Mouse scroll wheel + shift action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="control-scroll-action" type="i">
+      <default>1</default>
+      <summary>Mouse scroll wheel + ctrl action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="shift-control-scroll-action" type="i">
+      <default>2</default>
+      <summary>Mouse scroll wheel + shift action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="tilt-action" type="i">
+      <default>0</default>
+      <summary>Mouse scroll wheel action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="shift-tilt-action" type="i">
+      <default>1</default>
+      <summary>Mouse scroll wheel + shift action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="control-tilt-action" type="i">
+      <default>2</default>
+      <summary>Mouse scroll wheel + ctrl action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
+    <key name="shift-control-tilt-action" type="i">
+      <default>1</default>
+      <summary>Mouse scroll wheel + shift action</summary>
+      <description>Action for mouse scroll wheel. Values are 0 = zoom,
+          1 = Vertical pan, 2 = horizontal pan, 3 = next/prev image,
+          4 = rotate 90 deg CW or CCW, 5 = no action</description>
+    </key>
     <key name="zoom-multiplier" type="d">
       <default>0.05</default>
       <summary>Zoom multiplier</summary>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/data/xviewer-preferences-dialog.ui 
new/xviewer-2.8.0/data/xviewer-preferences-dialog.ui
--- old/xviewer-2.6.2/data/xviewer-preferences-dialog.ui        2020-06-24 
13:49:13.000000000 +0200
+++ new/xviewer-2.8.0/data/xviewer-preferences-dialog.ui        2020-11-30 
12:22:18.000000000 +0100
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.3 -->
+<!-- Generated with glade 3.22.2 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
   <requires lib="libpeas-gtk" version="1.0"/>
@@ -15,6 +15,9 @@
     <property name="border_width">5</property>
     <property name="title" translatable="yes">Preferences</property>
     <property name="type_hint">dialog</property>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
@@ -84,8 +87,8 @@
                       <object class="GtkLabel" id="label6">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
                         <property name="label" translatable="yes">Image 
Enhancements</property>
+                        <property name="xalign">0</property>
                         <attributes>
                           <attribute name="weight" value="bold"/>
                         </attributes>
@@ -180,8 +183,8 @@
                       <object class="GtkLabel" id="label1">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
                         <property name="label" 
translatable="yes">Background</property>
+                        <property name="xalign">0</property>
                         <attributes>
                           <attribute name="weight" value="bold"/>
                         </attributes>
@@ -257,8 +260,8 @@
                       <object class="GtkLabel" id="label8">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
                         <property name="label" translatable="yes">Transparent 
Parts</property>
+                        <property name="xalign">0</property>
                         <attributes>
                           <attribute name="weight" value="bold"/>
                         </attributes>
@@ -403,8 +406,8 @@
                       <object class="GtkLabel" id="label13">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
                         <property name="label" translatable="yes">Image 
Zoom</property>
+                        <property name="xalign">0</property>
                         <attributes>
                           <attribute name="weight" value="bold"/>
                         </attributes>
@@ -442,8 +445,8 @@
                       <object class="GtkLabel" id="label15">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
                         <property name="label" 
translatable="yes">Sequence</property>
+                        <property name="xalign">0</property>
                         <attributes>
                           <attribute name="weight" value="bold"/>
                         </attributes>
@@ -474,9 +477,9 @@
                                   <object class="GtkLabel" id="label36">
                                     <property name="visible">True</property>
                                     <property name="can_focus">False</property>
-                                    <property name="xalign">0</property>
                                     <property name="label" translatable="yes" 
comments="I18N: This sentence will be displayed above a horizonzal scale to 
select a number of seconds in xviewer's preferences dialog.">_Time between 
images:</property>
                                     <property 
name="use_underline">True</property>
+                                    <property name="xalign">0</property>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
@@ -563,6 +566,345 @@
               </packing>
             </child>
             <child>
+              <object class="GtkBox" id="Box1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="border_width">12</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkLabel" id="labelM2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" 
translatable="yes">Scroll-wheel:</property>
+                    <property name="xalign">0</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkGrid" id="Grid1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_left">16</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_homogeneous">True</property>
+                    <child>
+                      <object class="GtkLabel" id="labelM4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Scroll</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" id="ScrollTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" 
id="ScrollShiftTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" 
id="ScrollCtrlTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" 
id="ScrollShiftCtrlTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM13">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Shift+Scroll</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM15">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Control+Scroll</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM16">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Shift+Control+Scroll</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="labelM3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" 
translatable="yes">Tilt-wheel:</property>
+                    <property name="xalign">0</property>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkGrid" id="Grid2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_left">16</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_homogeneous">True</property>
+                    <child>
+                      <object class="GtkComboBoxText" id="TiltTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" 
id="TiltShiftTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" 
id="TiltCtrlTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" 
id="TiltShiftCtrlTextComboBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">0</property>
+                        <property name="active_id">0</property>
+                        <items>
+                          <item id="0" translatable="yes">Zoom</item>
+                          <item id="1" translatable="yes">Vetical Pan</item>
+                          <item id="2" translatable="yes">Horizontal Pan</item>
+                          <item id="3" translatable="yes">Next/Previous 
Image</item>
+                          <item id="4" translatable="yes">Rotate 90 
degrees</item>
+                          <item id="5" translatable="yes">No Action</item>
+                        </items>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM17">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Tilt</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM18">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Shift+Tilt</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM19">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Control+Tilt</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="labelM">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">Shift+Control+Tilt</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">3</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="labelM1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Mouse</property>
+              </object>
+              <packing>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
               <object class="GtkBox" id="plugin_manager_container">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
@@ -582,7 +924,7 @@
                 </child>
               </object>
               <packing>
-                <property name="position">2</property>
+                <property name="position">3</property>
               </packing>
             </child>
             <child type="tab">
@@ -592,7 +934,7 @@
                 <property name="label" translatable="yes">Plugins</property>
               </object>
               <packing>
-                <property name="position">2</property>
+                <property name="position">3</property>
                 <property name="tab_fill">False</property>
               </packing>
             </child>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/data/xviewer-ui.xml new/xviewer-2.8.0/data/xviewer-ui.xml
--- old/xviewer-2.6.2/data/xviewer-ui.xml       2020-06-24 13:49:13.000000000 
+0200
+++ new/xviewer-2.8.0/data/xviewer-ui.xml       2020-11-30 12:22:18.000000000 
+0100
@@ -16,7 +16,14 @@
       <separator/>
       <menuitem action="ImageProperties"/>
       <separator/>
-      <placeholder name="RecentDocuments"/>
+      <menu name="XAppFavorites" action="XAppFavorites">
+        <placeholder name="XAppFavoritesPlaceholder">
+        </placeholder>
+      </menu>
+      <menu name="RecentDocuments" action="RecentDocuments">
+        <placeholder name="RecentDocumentsPlaceholder">
+        </placeholder>
+      </menu>
       <separator/>
       <menuitem action="ImageClose"/>
     </menu>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/debian/changelog new/xviewer-2.8.0/debian/changelog
--- old/xviewer-2.6.2/debian/changelog  2020-06-24 13:49:13.000000000 +0200
+++ new/xviewer-2.8.0/debian/changelog  2020-11-30 12:22:18.000000000 +0100
@@ -1,3 +1,24 @@
+xviewer (2.8.0) ulyssa; urgency=medium
+
+  [ programmer-ceds ]
+  * Configure Mouse Wheel (#111)
+
+  [ Michael Webster ]
+  * Make the mouse preferences tab look a bit more consistent with the other 
tabs and other apps.
+
+  [ programmer-ceds ]
+  * Stop Centering Window
+  * Delete Dialog Focus
+  * Delete Dialog Focus
+
+  [ Michael Webster ]
+  * Add favorites to the file menu.
+
+  [ Clement Lefebvre ]
+  * l10n: Update POT
+
+ -- Clement Lefebvre <[email protected]>  Mon, 30 Nov 2020 11:21:50 +0000
+
 xviewer (2.6.2) ulyana; urgency=medium
 
   * CI: Update targets
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/debian/control new/xviewer-2.8.0/debian/control
--- old/xviewer-2.6.2/debian/control    2020-06-24 13:49:13.000000000 +0200
+++ new/xviewer-2.8.0/debian/control    2020-11-30 12:22:18.000000000 +0100
@@ -27,6 +27,7 @@
                librsvg2-dev (>= 2.36.2),
                libxml2-dev (>= 2.0),
                libatk1.0-dev (>= 1.32.0-2~),
+               libxapp-dev (>= 1.9.0),
                gobject-introspection (>= 0.9.12-4~),
                libgirepository1.0-dev (>= 0.9.12)
 Build-Depends-Indep: libgdk-pixbuf2.0-doc, libglib2.0-doc, libgtk-3-doc
@@ -39,7 +40,7 @@
          shared-mime-info (>= 0.20),
          gsettings-desktop-schemas (>= 2.91.92),
          gir1.2-peas-1.0,
-         xapps-common (>= 1.8.4)
+         xapps-common (>= 1.9.0)
 Recommends: librsvg2-common,
             yelp
 Description: Image viewer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/doc/reference/version.xml 
new/xviewer-2.8.0/doc/reference/version.xml
--- old/xviewer-2.6.2/doc/reference/version.xml 2020-06-24 13:49:13.000000000 
+0200
+++ new/xviewer-2.8.0/doc/reference/version.xml 2020-11-30 12:22:18.000000000 
+0100
@@ -1 +1 @@
-2.4.3
+2.6.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/src/xviewer-config-keys.h 
new/xviewer-2.8.0/src/xviewer-config-keys.h
--- old/xviewer-2.6.2/src/xviewer-config-keys.h 2020-06-24 13:49:13.000000000 
+0200
+++ new/xviewer-2.8.0/src/xviewer-config-keys.h 2020-11-30 12:22:18.000000000 
+0100
@@ -42,6 +42,16 @@
 #define XVIEWER_CONF_VIEW_INTERPOLATE          "interpolate"
 #define XVIEWER_CONF_VIEW_EXTRAPOLATE          "extrapolate"
 #define XVIEWER_CONF_VIEW_SCROLL_WHEEL_ZOOM            "scroll-wheel-zoom"
+
+#define XVIEWER_CONF_VIEW_SCROLL_ACTION             "scroll-action"
+#define XVIEWER_CONF_VIEW_SCROLL_SHIFT_ACTION       "shift-scroll-action"
+#define XVIEWER_CONF_VIEW_SCROLL_CTRL_ACTION        "control-scroll-action"
+#define XVIEWER_CONF_VIEW_SCROLL_SHIFT_CTRL_ACTION  
"shift-control-scroll-action"
+#define XVIEWER_CONF_VIEW_TILT_ACTION               "tilt-action"
+#define XVIEWER_CONF_VIEW_TILT_SHIFT_ACTION         "shift-tilt-action"
+#define XVIEWER_CONF_VIEW_TILT_CTRL_ACTION          "control-tilt-action"
+#define XVIEWER_CONF_VIEW_TILT_SHIFT_CTRL_ACTION    "shift-control-tilt-action"
+
 #define XVIEWER_CONF_VIEW_ZOOM_MULTIPLIER              "zoom-multiplier"
 #define XVIEWER_CONF_VIEW_AUTOROTATE                "autorotate"
 #define XVIEWER_CONF_VIEW_TRANSPARENCY         "transparency"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/src/xviewer-preferences-dialog.c 
new/xviewer-2.8.0/src/xviewer-preferences-dialog.c
--- old/xviewer-2.6.2/src/xviewer-preferences-dialog.c  2020-06-24 
13:49:13.000000000 +0200
+++ new/xviewer-2.8.0/src/xviewer-preferences-dialog.c  2020-11-30 
12:22:18.000000000 +0100
@@ -58,6 +58,15 @@
        GtkWidget     *seconds_scale;
 
        GtkWidget     *plugin_manager;
+
+    GtkWidget     *ScrollTextComboBox;
+    GtkWidget     *ScrollShiftTextComboBox;
+    GtkWidget     *ScrollCtrlTextComboBox;
+    GtkWidget     *ScrollShiftCtrlTextComboBox;
+    GtkWidget     *TiltTextComboBox;
+    GtkWidget     *TiltShiftTextComboBox;
+    GtkWidget     *TiltCtrlTextComboBox;
+    GtkWidget     *TiltShiftCtrlTextComboBox;
 };
 
 static GObject *instance = NULL;
@@ -190,6 +199,31 @@
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      XviewerPreferencesDialog,
                                                      plugin_manager);
+
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     ScrollTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     ScrollShiftTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     ScrollCtrlTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     
ScrollShiftCtrlTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     TiltTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     TiltShiftTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     TiltCtrlTextComboBox);
+       gtk_widget_class_bind_template_child_private (widget_class,
+                                                     XviewerPreferencesDialog,
+                                                     
TiltShiftCtrlTextComboBox);
 }
 
 static void
@@ -230,6 +264,32 @@
                                      pd_string_to_rgba_mapping,
                                      pd_rgba_to_string_mapping,
                                      NULL, NULL);
+
+       g_settings_bind (priv->view_settings, XVIEWER_CONF_VIEW_SCROLL_ACTION,
+                        priv->ScrollTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, 
XVIEWER_CONF_VIEW_SCROLL_SHIFT_ACTION,
+                        priv->ScrollShiftTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, 
XVIEWER_CONF_VIEW_SCROLL_CTRL_ACTION,
+                        priv->ScrollCtrlTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, 
XVIEWER_CONF_VIEW_SCROLL_SHIFT_CTRL_ACTION,
+                        priv->ScrollShiftCtrlTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, XVIEWER_CONF_VIEW_TILT_ACTION,
+                        priv->TiltTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, 
XVIEWER_CONF_VIEW_TILT_SHIFT_ACTION,
+                        priv->TiltShiftTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, 
XVIEWER_CONF_VIEW_TILT_CTRL_ACTION,
+                        priv->TiltCtrlTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->view_settings, 
XVIEWER_CONF_VIEW_TILT_SHIFT_CTRL_ACTION,
+                        priv->TiltShiftCtrlTextComboBox, "active",
+                        G_SETTINGS_BIND_DEFAULT);
+
        g_object_set_data (G_OBJECT (priv->color_radio),
                           RADIO_VALUE,
                           GINT_TO_POINTER (XVIEWER_TRANSP_COLOR));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/src/xviewer-scroll-view.c 
new/xviewer-2.8.0/src/xviewer-scroll-view.c
--- old/xviewer-2.6.2/src/xviewer-scroll-view.c 2020-06-24 13:49:13.000000000 
+0200
+++ new/xviewer-2.8.0/src/xviewer-scroll-view.c 2020-11-30 12:22:18.000000000 
+0100
@@ -3,6 +3,7 @@
 #endif
 
 #include <stdlib.h>
+#include <fcntl.h>
 #include <math.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gdk/gdkkeysyms.h>
@@ -14,6 +15,7 @@
 #include "xviewer-enum-types.h"
 #include "xviewer-scroll-view.h"
 #include "xviewer-debug.h"
+
 #if 0
 #include "uta.h"
 #endif
@@ -122,6 +124,8 @@
        GdkPixbuf *pixbuf;
        cairo_surface_t *surface;
 
+       GSettings           *view_settings;
+
        /* zoom mode, either ZOOM_MODE_FIT or ZOOM_MODE_FREE */
        XviewerZoomMode zoom_mode;
 
@@ -1663,7 +1667,7 @@
 
             if ((gdk_pixbuf_get_width (priv->pixbuf) <= allocation.width)
                 && (gdk_pixbuf_get_height (priv->pixbuf) <= allocation.height))
-                    zoom = 1.0;                         // the 1:1 image fits 
in the window
+                    zoom = 1.0;                         /* the 1:1 image fits 
in the window */
             else
             {
                 if (DOUBLE_EQUAL(priv->zoom, 1.0))
@@ -1672,8 +1676,8 @@
                     zoom = 1.0;
             }
 
-                            // the following two statements are necessary 
otherwise if the 1:1 image
-                            //  is dragged the alignment is thrown out
+                            /* the following two statements are necessary 
otherwise if the 1:1 image
+                               is dragged the alignment is thrown out */
             if (DOUBLE_EQUAL(priv->zoom,zoom_for_fit))
             {
                 priv->xofs = 0;
@@ -1795,11 +1799,7 @@
        return TRUE;
 }
 
-/* Scroll event handler for the image view.  We zoom with an event without
- * modifiers rather than scroll; we use the Shift modifier to scroll.
- * Rationale: images are not primarily vertical, and in XVIEWER you scan 
scroll by
- * dragging the image with button 1 anyways.
- */
+/* Scroll event handler for the image view */
 static gboolean
 xviewer_scroll_view_scroll_event (GtkWidget *widget, GdkEventScroll *event, 
gpointer data)
 {
@@ -1807,63 +1807,216 @@
        XviewerScrollViewPrivate *priv;
        double zoom_factor;
        int xofs, yofs;
+    int button_combination;         /* 0 = scroll, 1 = scroll + shift, 2 = 
scroll + ctrl, 3 = scroll + shift + ctrl
+                                        4..7 as 0..3 but for tilt wheel */
+    int action;                     /* 0 = zoom, 1 = vertical pan, 2 = 
horizontal pan, 3 = next/prev image */
+    static guint32 mouse_wheel_time = 0;     /* used to debounce the mouse 
wheel (scroll and tilt)
+                                                         when used for 
next/previous image or rotate image */
+
+
 
        view = XVIEWER_SCROLL_VIEW (data);
        priv = view->priv;
 
+       priv->view_settings = g_settings_new (XVIEWER_CONF_VIEW);
+
        /* Compute zoom factor and scrolling offsets; we'll only use either of 
them */
        /* same as in gtkscrolledwindow.c */
        xofs = gtk_adjustment_get_page_increment (priv->hadj) / 2;
        yofs = gtk_adjustment_get_page_increment (priv->vadj) / 2;
 
        switch (event->direction) {
-       case GDK_SCROLL_UP:
-               zoom_factor = priv->zoom_multiplier;
-               xofs = 0;
-               yofs = -yofs;
-               break;
+           case GDK_SCROLL_UP:
+            button_combination = 0;     /* scroll wheel */
+                   break;
+
+           case GDK_SCROLL_LEFT:
+            button_combination = 4;     /* tilt wheel */
+                   break;
+
+           case GDK_SCROLL_DOWN:
+            button_combination = 0;     /* scroll wheel */
+                   break;
+
+           case GDK_SCROLL_RIGHT:
+            button_combination = 4;     /* tilt wheel */
+                   break;
+
+           default:
+                   g_assert_not_reached ();
+                   return FALSE;
+       }
+
+    if (event->state & GDK_SHIFT_MASK)
+        button_combination++;
+
+    if (event->state & GDK_CONTROL_MASK)
+        button_combination += 2;
+
+    switch (button_combination)
+    {
+        case 0:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_SCROLL_ACTION);
+            break;
+        case 1:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_SCROLL_SHIFT_ACTION);
+            break;
+        case 2:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_SCROLL_CTRL_ACTION);
+            break;
+        case 3:
+            action = g_settings_get_int(priv->view_settings,
+                                    
XVIEWER_CONF_VIEW_SCROLL_SHIFT_CTRL_ACTION);
+            break;
+        case 4:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_TILT_ACTION);
+            break;
+        case 5:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_TILT_SHIFT_ACTION);
+            break;
+        case 6:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_TILT_CTRL_ACTION);
+            break;
+        case 7:
+            action = g_settings_get_int(priv->view_settings,
+                                    XVIEWER_CONF_VIEW_TILT_SHIFT_CTRL_ACTION);
+            break;
+    }
 
-       case GDK_SCROLL_LEFT:
-               zoom_factor = 1.0 / priv->zoom_multiplier;
-               xofs = -xofs;
-               yofs = 0;
-               break;
+    switch (action)
+    {
+        case 0:                             /* zoom */
+            if ((event->direction == GDK_SCROLL_UP) || (event->direction == 
GDK_SCROLL_RIGHT))
+                zoom_factor = priv->zoom_multiplier;
+            else
+                zoom_factor = 1.0 / priv->zoom_multiplier;
+            set_zoom (view, priv->zoom * zoom_factor, TRUE, event->x, 
event->y);
+            break;
+
+        case 1:                             /* vertical pan */
+            xofs = 0;
+            if ((event->direction == GDK_SCROLL_UP) || (event->direction == 
GDK_SCROLL_RIGHT))
+                yofs = -yofs;
+            else
+                yofs = yofs;
+                       scroll_by (view, xofs, yofs);
+            break;
 
-       case GDK_SCROLL_DOWN:
-               zoom_factor = 1.0 / priv->zoom_multiplier;
-               xofs = 0;
-               yofs = yofs;
-               break;
+        case 2:                             /* horizontal pan */
+            yofs = 0;
+            if ((event->direction == GDK_SCROLL_DOWN) || (event->direction == 
GDK_SCROLL_RIGHT))
+                xofs = xofs;
+            else
+                xofs = -xofs;
+                       scroll_by (view, xofs, yofs);
+            break;
 
-       case GDK_SCROLL_RIGHT:
-               zoom_factor = priv->zoom_multiplier;
-               xofs = xofs;
-               yofs = 0;
-               break;
+        case 3:                             /* move to next/prev image */
+        {
+            GdkEventButton button_event;
+
+            button_event.type = GDK_BUTTON_PRESS;
+            button_event.window = gtk_widget_get_window(widget);
+            button_event.send_event = TRUE;
+            button_event.time = g_get_monotonic_time() / 1000;
+            button_event.x = 0.0;         /* coordinate parameters are 
irrelevant for this button press */
+            button_event.y = 0.0;
+            button_event.axes = NULL;
+            button_event.state = 0;
+            if ((event->direction == GDK_SCROLL_UP) || (event->direction == 
GDK_SCROLL_LEFT))
+                button_event.button = 8;
+            else
+                button_event.button = 9;
 
-       default:
-               g_assert_not_reached ();
-               return FALSE;
-       }
+            button_event.device = event->device;
+            button_event.x_root = 0.0;
+            button_event.y_root = 0.0;
 
-        if (priv->scroll_wheel_zoom) {
-               if (event->state & GDK_SHIFT_MASK)
-                       scroll_by (view, yofs, xofs);
-               else if (event->state & GDK_CONTROL_MASK)
-                       scroll_by (view, xofs, yofs);
-               else
-                       set_zoom (view, priv->zoom * zoom_factor,
-                                 TRUE, event->x, event->y);
-       } else {
-               if (event->state & GDK_SHIFT_MASK)
-                       scroll_by (view, yofs, xofs);
-               else if (event->state & GDK_CONTROL_MASK)
-                       set_zoom (view, priv->zoom * zoom_factor,
-                                 TRUE, event->x, event->y);
-               else
-                       scroll_by (view, xofs, yofs);
+
+            if (button_event.time - mouse_wheel_time > 400) /* 400 msec 
debounce of mouse wheel */
+            {
+                gtk_main_do_event((GdkEvent *)&button_event);
+
+                mouse_wheel_time = button_event.time;
+            }
+
+            break;
+        }
+
+        case 4:                             /* Rotate image 90 CW or CCW */
+        {
+           GdkKeymapKey* keys;
+            gint n_keys;
+            guint keyval;
+            guint state;
+            GdkEventKey key_event;
+
+            keyval = GDK_KEY_R;
+
+            if ((event->direction == GDK_SCROLL_UP) || (event->direction == 
GDK_SCROLL_LEFT))
+                state = GDK_CONTROL_MASK + GDK_SHIFT_MASK;
+            else
+                state = GDK_CONTROL_MASK;
+
+            gdk_keymap_get_entries_for_keyval(gdk_keymap_get_for_display 
(gtk_widget_get_display(widget)),
+                                          keyval,
+                                          &keys,
+                                          &n_keys);
+
+ 
+
+            key_event.type = GDK_KEY_PRESS;
+            key_event.window = gtk_widget_get_window(widget);
+            key_event.send_event = TRUE;
+            key_event.time = g_get_monotonic_time() / 1000;
+            key_event.state = state;
+            key_event.keyval = keyval;
+            key_event.length = 0;
+            key_event.string = NULL;
+            key_event.hardware_keycode = keys[0].keycode;
+            key_event.group = keys[0].group;
+            key_event.is_modifier = FALSE;
+
+            if (key_event.time - mouse_wheel_time > 400) /* 400 msec debounce 
of mouse wheel */
+            {
+                int old_stderr, new_stderr;
+                                /* When generating a mouse button event the 
event structure contains the device
+                                   ID for the mouse (see case 3 above) and no 
Gdk-Warning is generated. The Key
+                                   event structure has no device ID member and 
Gdk reports a warning that:
+
+                                  "Event with type 8 not holding a GdkDevice. 
It is most likely synthesized
+                                   outside Gdk/GTK+"
+
+                                   The following code therefore temporarily 
suppresses stderr to avoid showing
+                                   this warning when (given the Gdk 
implementation) it is expected - and untidy! */
+
+                fflush(stderr);
+                old_stderr = dup(2);
+                new_stderr = open("/dev/null", O_WRONLY);
+                dup2(new_stderr, 2);
+                close(new_stderr);
+
+                gtk_main_do_event((GdkEvent *)&key_event);
+
+                fflush(stderr);             /* restore normal stderr output */
+                dup2(old_stderr, 2);
+                close(old_stderr);
+
+                mouse_wheel_time = key_event.time;
+            }
+            break;
         }
 
+
+        /* case 5 = no action */
+    }
+
        return TRUE;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/xviewer-2.6.2/src/xviewer-window.c new/xviewer-2.8.0/src/xviewer-window.c
--- old/xviewer-2.6.2/src/xviewer-window.c      2020-06-24 13:49:13.000000000 
+0200
+++ new/xviewer-2.8.0/src/xviewer-window.c      2020-11-30 12:22:18.000000000 
+0100
@@ -66,6 +66,7 @@
 #include <gdk/gdkkeysyms.h>
 #include <gio/gdesktopappinfo.h>
 #include <gtk/gtk.h>
+#include <libxapp/xapp-favorites.h>
 
 #include <libpeas/peas-extension-set.h>
 #include <libpeas/peas-activatable.h>
@@ -147,6 +148,7 @@
         GtkActionGroup      *actions_image;
         GtkActionGroup      *actions_gallery;
         GtkActionGroup      *actions_recent;
+        GtkActionGroup      *actions_favorites;
 
        GtkWidget           *fullscreen_popup;
        GSource             *fullscreen_timeout_source;
@@ -157,7 +159,8 @@
 
        guint                fullscreen_idle_inhibit_cookie;
 
-        guint               recent_menu_id;
+    guint                recent_menu_id;
+    guint                favorites_menu_id;
 
         XviewerJob              *load_job;
         XviewerJob              *transform_job;
@@ -911,6 +914,7 @@
 {
        XviewerWindowPrivate *priv;
        GFile *file;
+    gboolean is_maximized;
 
        g_return_if_fail (XVIEWER_IS_WINDOW (window));
        g_return_if_fail (XVIEWER_IS_IMAGE (image));
@@ -947,10 +951,17 @@
                         file,
                         (GDestroyNotify) g_object_unref);
 
+    is_maximized = gtk_window_is_maximized (GTK_WINDOW (window));
        if (g_settings_get_boolean (window->priv->window_settings, 
XVIEWER_CONF_WINDOW_MAXIMIZED))
-        gtk_window_maximize (GTK_WINDOW (window));
+    {
+        if (!is_maximized)
+            gtk_window_maximize (GTK_WINDOW (window));
+    }
     else
-        gtk_window_unmaximize (GTK_WINDOW (window));
+    {
+        if (is_maximized)
+            gtk_window_unmaximize (GTK_WINDOW (window));
+    }
 
        xviewer_window_update_openwith_menu (window, image);
 }
@@ -1644,16 +1655,14 @@
 }
 
 static void
-xviewer_window_open_recent_cb (GtkAction *action, XviewerWindow *window)
+xviewer_window_open_by_uri (GtkAction *action, XviewerWindow *window)
 {
-       GtkRecentInfo *info;
        const gchar *uri;
        GSList *list = NULL;
 
-       info = g_object_get_data (G_OBJECT (action), "gtk-recent-info");
-       g_return_if_fail (info != NULL);
+       uri = g_object_get_data (G_OBJECT (action), "xviewer-doc-uri");
+       g_return_if_fail (uri != NULL);
 
-       uri = gtk_recent_info_get_uri (info);
        list = g_slist_prepend (list, g_strdup (uri));
 
        xviewer_application_open_uri_list (XVIEWER_APP,
@@ -1662,8 +1671,7 @@
                                       0,
                                       NULL);
 
-       g_slist_foreach (list, (GFunc) g_free, NULL);
-       g_slist_free (list);
+       g_slist_free_full (list, (GDestroyNotify) g_free);
 }
 
 static void
@@ -2303,6 +2311,7 @@
 {
        XviewerWindowPrivate *priv;
        GtkWidget *menubar;
+    gboolean is_maximized;
 
        xviewer_debug (DEBUG_WINDOW);
 
@@ -2354,10 +2363,18 @@
                xviewer_window_update_fullscreen_action (window);
        }
 
+    is_maximized = gtk_window_is_maximized (GTK_WINDOW (window));
        if (g_settings_get_boolean (window->priv->window_settings, 
XVIEWER_CONF_WINDOW_MAXIMIZED))
-        gtk_window_maximize (GTK_WINDOW (window));
+    {
+        if (!is_maximized)
+            gtk_window_maximize (GTK_WINDOW (window));
+    }
     else
-        gtk_window_unmaximize (GTK_WINDOW (window));
+    {
+        if (is_maximized)
+            gtk_window_unmaximize (GTK_WINDOW (window));
+    }
+
 
        xviewer_scroll_view_show_cursor (XVIEWER_SCROLL_VIEW (priv->view));
 
@@ -3395,6 +3412,7 @@
        gchar     *prompt;
        guint      n_images;
        gint       response;
+    GtkWidget *delete_button;
 
        /* assume agreement, if the user doesn't want to be asked and deletion 
is available */
        if (dont_ask_again_force_delete)
@@ -3432,10 +3450,12 @@
        /* add buttons to the dialog */
        if (n_images == 1) {
                gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Cancel"), 
GTK_RESPONSE_CANCEL);
-               gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Delete"), 
GTK_RESPONSE_OK);
+               delete_button = gtk_dialog_add_button (GTK_DIALOG (dialog), 
_("_Delete"), GTK_RESPONSE_OK);
+        gtk_style_context_add_class (gtk_widget_get_style_context 
(delete_button), GTK_STYLE_CLASS_DESTRUCTIVE_ACTION);
        } else {
                gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Cancel"), 
GTK_RESPONSE_CANCEL);
-               gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Yes")   , 
GTK_RESPONSE_OK);
+               delete_button = gtk_dialog_add_button (GTK_DIALOG (dialog), 
_("_Yes")   , GTK_RESPONSE_OK);
+        gtk_style_context_add_class (gtk_widget_get_style_context 
(delete_button), GTK_STYLE_CLASS_DESTRUCTIVE_ACTION);
        }
 
        /* add 'dont ask again' button */
@@ -3450,6 +3470,7 @@
                          TRUE,
                          0);
 
+    gtk_widget_grab_focus (delete_button);
        /* show dialog and get user response */
        gtk_widget_show_all (dialog);
        response = gtk_dialog_run (GTK_DIALOG (dialog));
@@ -4119,7 +4140,9 @@
        { "View",  NULL, N_("_View") },
        { "Go",    NULL, N_("_Go") },
        { "Tools", NULL, N_("_Tools") },
-       { "Help",  NULL, N_("_Help") },
+    { "Help",  NULL, N_("_Help") },
+    { "XAppFavorites",  NULL, N_("_Favorites") },
+    { "RecentDocuments",  NULL, N_("_Recents") },
 
        { "ImageOpen", "document-open-symbolic",  N_("_Open…"), "<control>O",
          N_("Open a file"),
@@ -4592,7 +4615,7 @@
 
        for (li = actions; li != NULL; li = li->next) {
                g_signal_handlers_disconnect_by_func (GTK_ACTION (li->data),
-                                                     
G_CALLBACK(xviewer_window_open_recent_cb),
+                                                     
G_CALLBACK(xviewer_window_open_by_uri),
                                                      window);
 
                gtk_action_group_remove_action (priv->actions_recent,
@@ -4642,14 +4665,14 @@
                action = gtk_action_new (action_name, label, tip, NULL);
                gtk_action_set_always_show_image (action, TRUE);
 
-               g_object_set_data_full (G_OBJECT (action), "gtk-recent-info",
-                                       gtk_recent_info_ref (info),
-                                       (GDestroyNotify) gtk_recent_info_unref);
+        g_object_set_data_full (G_OBJECT (action), "xviewer-doc-uri",
+                                g_strdup (gtk_recent_info_get_uri (info)),
+                                (GDestroyNotify) g_free);
 
                g_object_set (G_OBJECT (action), "icon-name", 
"image-x-generic", NULL);
 
                g_signal_connect (action, "activate",
-                                 G_CALLBACK (xviewer_window_open_recent_cb),
+                                 G_CALLBACK (xviewer_window_open_by_uri),
                                  window);
 
                gtk_action_group_add_action (priv->actions_recent, action);
@@ -4657,7 +4680,7 @@
                g_object_unref (action);
 
                gtk_ui_manager_add_ui (priv->ui_mgr, priv->recent_menu_id,
-                                      "/MainMenu/Image/RecentDocuments",
+                                      
"/MainMenu/Image/RecentDocuments/RecentDocumentsPlaceholder",
                                       action_name, action_name,
                                       GTK_UI_MANAGER_AUTO, FALSE);
 
@@ -4676,6 +4699,120 @@
        xviewer_window_update_recent_files_menu (window);
 }
 
+// This should be generated in the build and shared between the desktop file 
and here
+const gchar *supported_mimetypes[] = {
+    "image/bmp",
+    "image/gif",
+    "image/jpeg",
+    "image/jpg",
+    "image/pjpeg",
+    "image/png",
+    "image/tiff",
+    "image/x-bmp",
+    "image/x-gray",
+    "image/x-icb",
+    "image/x-ico",
+    "image/x-png",
+    "image/x-portable-anymap",
+    "image/x-portable-bitmap",
+    "image/x-portable-graymap",
+    "image/x-portable-pixmap",
+    "image/x-xbitmap",
+    "image/x-xpixmap",
+    "image/x-pcx",
+    "image/svg+xml",
+    "image/svg+xml-compressed",
+    "image/vnd.wap.wbmp"
+};
+
+static void
+xviewer_window_update_favorites_menu (XviewerWindow *window)
+{
+    XviewerWindowPrivate *priv;
+    GList *actions = NULL, *li = NULL, *items = NULL;
+    gint count;
+    priv = window->priv;
+
+    if (priv->favorites_menu_id != 0)
+        gtk_ui_manager_remove_ui (priv->ui_mgr, priv->favorites_menu_id);
+
+    actions = gtk_action_group_list_actions (priv->actions_favorites);
+
+    for (li = actions; li != NULL; li = li->next) {
+        g_signal_handlers_disconnect_by_func (GTK_ACTION (li->data),
+                              G_CALLBACK(xviewer_window_open_by_uri),
+                              window);
+
+        gtk_action_group_remove_action (priv->actions_favorites,
+                        GTK_ACTION (li->data));
+    }
+
+    g_list_free (actions);
+
+    priv->favorites_menu_id = gtk_ui_manager_new_merge_id (priv->ui_mgr);
+
+    items = xapp_favorites_get_favorites (xapp_favorites_get_default (),
+                                          supported_mimetypes);
+    count = 1;
+
+    for (li = items; li != NULL; li = li->next) {
+        gchar *action_name;
+        gchar *label;
+        gchar *tip;
+        gchar **display_name;
+        gchar *label_filename;
+        GtkAction *action;
+        XAppFavoriteInfo *info = li->data;
+
+        action_name = g_strdup_printf ("favorite-%d", count);
+        display_name = g_strsplit (info->display_name, "_", -1);
+        label_filename = g_strjoinv ("__", display_name);
+        label = g_strdup_printf ("%s_%d. %s",
+                (is_rtl ? "\xE2\x80\x8F" : ""), count, label_filename);
+        g_free (label_filename);
+        g_strfreev (display_name);
+
+        tip = g_uri_unescape_string (info->uri, NULL);
+
+        action = gtk_action_new (action_name, label, tip, NULL);
+        gtk_action_set_always_show_image (action, TRUE);
+
+        g_object_set_data_full (G_OBJECT (action), "xviewer-doc-uri",
+                                g_strdup (info->uri),
+                                (GDestroyNotify) g_free);
+
+        g_object_set (G_OBJECT (action), "icon-name", "image-x-generic", NULL);
+
+        g_signal_connect (action, "activate",
+                  G_CALLBACK (xviewer_window_open_by_uri),
+                  window);
+
+        gtk_action_group_add_action (priv->actions_favorites, action);
+
+        g_object_unref (action);
+
+        gtk_ui_manager_add_ui (priv->ui_mgr, priv->favorites_menu_id,
+                       
"/MainMenu/Image/XAppFavorites/XAppFavoritesPlaceholder",
+                       action_name, action_name,
+                       GTK_UI_MANAGER_AUTO, FALSE);
+
+        g_free (action_name);
+        g_free (label);
+        g_free (tip);
+
+        count++;
+    }
+
+    g_list_foreach (items, (GFunc) xapp_favorite_info_free, NULL);
+    g_list_free (items);
+}
+
+static void
+xviewer_window_favorites_changed_cb (GtkRecentManager *manager, XviewerWindow 
*window)
+{
+    xviewer_window_update_favorites_menu (window);
+}
+
 static void
 xviewer_window_drag_data_received (GtkWidget *widget,
                                GdkDragContext *context,
@@ -5050,6 +5187,18 @@
 
        gtk_ui_manager_insert_action_group (priv->ui_mgr, priv->actions_recent, 
0);
 
+    priv->actions_favorites = gtk_action_group_new ("XAppFavoriteActions");
+    gtk_action_group_set_translation_domain (priv->actions_favorites,
+                         GETTEXT_PACKAGE);
+
+    g_signal_connect (xapp_favorites_get_default (), "changed",
+                      G_CALLBACK (xviewer_window_favorites_changed_cb),
+                      window);
+
+    xviewer_window_update_favorites_menu (window);
+
+    gtk_ui_manager_insert_action_group (priv->ui_mgr, priv->actions_favorites, 
0);
+
        priv->cbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
        gtk_box_pack_start (GTK_BOX (priv->box), priv->cbox, TRUE, TRUE, 0);
        gtk_widget_show (priv->cbox);
@@ -5280,7 +5429,8 @@
                xviewer_window_get_display_profile (GTK_WIDGET (window));
 #endif
 
-       window->priv->recent_menu_id = 0;
+    window->priv->recent_menu_id = 0;
+       window->priv->favorites_menu_id = 0;
 
        window->priv->gallery_position = 0;
        window->priv->gallery_resizable = FALSE;
@@ -5371,6 +5521,11 @@
                priv->actions_recent = NULL;
        }
 
+    if (priv->actions_favorites != NULL) {
+        g_object_unref (priv->actions_favorites);
+        priv->actions_favorites = NULL;
+    }
+
         if (priv->actions_open_with != NULL) {
                 g_object_unref (priv->actions_open_with);
                 priv->actions_open_with = NULL;
@@ -5392,6 +5547,12 @@
 
        priv->recent_menu_id = 0;
 
+    g_signal_handlers_disconnect_by_func (xapp_favorites_get_default (),
+                                          G_CALLBACK 
(xviewer_window_favorites_changed_cb),
+                                          window);
+
+    priv->favorites_menu_id = 0;
+
        xviewer_window_clear_load_job (window);
 
        xviewer_window_clear_transform_job (window);
_______________________________________________
openSUSE Commits mailing list -- [email protected]
To unsubscribe, email [email protected]
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives: 
https://lists.opensuse.org/archives/list/[email protected]

Reply via email to