diff -pruN 2.24.33-6/debian/changelog 2.24.33-6ubuntu3/debian/changelog
--- 2.24.33-6/debian/changelog	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/changelog	2025-09-18 15:06:55.000000000 +0000
@@ -1,3 +1,72 @@
+gtk+2.0 (2.24.33-6ubuntu3) questing; urgency=medium
+
+  * d/rules: build with -std=gnu17 to avoid FTBFS (LP: #2124953)
+
+ -- Nick Rosbrook <enr0n@ubuntu.com>  Thu, 18 Sep 2025 11:06:55 -0400
+
+gtk+2.0 (2.24.33-6ubuntu2) questing; urgency=medium
+
+  * No-change rebuild for libxml2 soname change.
+
+ -- Matthias Klose <doko@ubuntu.com>  Wed, 21 May 2025 10:04:43 +0200
+
+gtk+2.0 (2.24.33-6ubuntu1) plucky; urgency=medium
+
+  * Merge with Debian. Remaining changes:
+    - d/libgtk2.0-0t64.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+      + debian/patches/Check-for-attribute-availability-before-accessing-it.patch
+        - Cherry-pick patch to fix GFileInfo critical warnings
+
+ -- Alessandro Astone <alessandro.astone@canonical.com>  Thu, 14 Nov 2024 15:13:24 +0100
+
 gtk+2.0 (2.24.33-6) unstable; urgency=medium
 
   * Team upload
@@ -21,6 +90,69 @@ gtk+2.0 (2.24.33-6) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Fri, 30 Aug 2024 18:29:28 +0100
 
+gtk+2.0 (2.24.33-5ubuntu2) oracular; urgency=medium
+
+  * debian: Add patches for building with gcc14
+
+ -- Alessandro Astone <alessandro.astone@canonical.com>  Wed, 21 Aug 2024 16:37:27 +0200
+
+gtk+2.0 (2.24.33-5ubuntu1) oracular; urgency=medium
+
+  * Merge with Debian. Remaining changes:
+    - d/libgtk2.0-0t64.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+      + debian/patches/Check-for-attribute-availability-before-accessing-it.patch
+        - Cherry-pick patch to fix GFileInfo critical warnings
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Thu, 11 Jul 2024 08:53:11 -0400
+
 gtk+2.0 (2.24.33-5) unstable; urgency=high
 
   [ Jeremy Bícha ]
@@ -35,6 +167,65 @@ gtk+2.0 (2.24.33-5) unstable; urgency=hi
 
  -- Jeremy Bícha <jbicha@ubuntu.com>  Thu, 11 Jul 2024 08:38:50 -0400
 
+gtk+2.0 (2.24.33-4ubuntu1) noble; urgency=medium
+
+  * Merge with Debian. Remaining changes:
+    - d/libgtk2.0-0t64.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+      + debian/patches/Check-for-attribute-availability-before-accessing-it.patch
+        - Cherry-pick patch to fix GFileInfo critical warnings
+  * Update overlay scrollbar patch to avoid implicit function declarations
+    for code using these functions
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Thu, 04 Apr 2024 10:23:07 -0400
+
 gtk+2.0 (2.24.33-4) unstable; urgency=medium
 
   * Team upload
@@ -50,6 +241,82 @@ gtk+2.0 (2.24.33-4) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Wed, 06 Mar 2024 12:31:37 +0000
 
+gtk+2.0 (2.24.33-3.1ubuntu4) noble; urgency=medium
+
+  * No-change rebuild for CVE-2024-3094
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Sat, 30 Mar 2024 23:51:43 +0000
+
+gtk+2.0 (2.24.33-3.1ubuntu3) noble; urgency=medium
+
+  * d/patches/print-dialog-show-options-of-remote-dnssd-printers.patch: add
+    prototype for the private CUPS function we call.
+
+ -- Michael Hudson-Doyle <michael.hudson@ubuntu.com>  Thu, 21 Mar 2024 09:11:08 +1300
+
+gtk+2.0 (2.24.33-3.1ubuntu2) noble; urgency=medium
+
+  * No-change rebuild against libcups2t64.
+
+ -- Michael Hudson-Doyle <michael.hudson@ubuntu.com>  Wed, 20 Mar 2024 13:49:13 +1300
+
+gtk+2.0 (2.24.33-3.1ubuntu1) noble; urgency=medium
+
+  * Merge from Debian unstable.  Remaining changes:
+    - d/libgtk2.0-0t64.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+      + debian/patches/Check-for-attribute-availability-before-accessing-it.patch
+        - Cherry-pick patch to fix GFileInfo critical warnings
+
+ -- Amin Bandali <bandali@ubuntu.com>  Thu, 29 Feb 2024 13:39:54 -0500
+
 gtk+2.0 (2.24.33-3.1) unstable; urgency=medium
 
   * Non-maintainer upload.
@@ -68,6 +335,18 @@ gtk+2.0 (2.24.33-3) unstable; urgency=me
 
  -- Jeremy Bícha <jbicha@ubuntu.com>  Wed, 24 Jan 2024 16:02:45 -0500
 
+gtk+2.0 (2.24.33-2ubuntu2) jammy; urgency=medium
+
+  * No-change rebuild for ppc64el baseline bump.
+
+ -- Łukasz 'sil2100' Zemczak <lukasz.zemczak@ubuntu.com>  Wed, 23 Mar 2022 14:56:52 +0100
+
+gtk+2.0 (2.24.33-2ubuntu1) impish; urgency=medium
+
+  * Resynchronize on Debian
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 18 Jun 2021 13:17:20 +0200
+
 gtk+2.0 (2.24.33-2) unstable; urgency=medium
 
   * Team upload
@@ -90,6 +369,63 @@ gtk+2.0 (2.24.33-2) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Wed, 19 May 2021 17:13:33 +0100
 
+gtk+2.0 (2.24.33-1ubuntu1) hirsute; urgency=medium
+
+  * Merge from Debian unstable.  Remaining changes:
+    - d/libgtk2.0-0.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/098_multiarch_module_path.patch
+        - Fallback to the pre-multiarch directory for compatibility.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 21 Jan 2021 20:38:03 +0100
+
 gtk+2.0 (2.24.33-1) unstable; urgency=medium
 
   * Team upload
@@ -142,6 +478,82 @@ gtk+2.0 (2.24.32-5) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Mon, 23 Nov 2020 14:56:29 +0000
 
+gtk+2.0 (2.24.32-4ubuntu4) focal; urgency=medium
+
+  * debian/test/build:
+    - use the cross compiled version of pkg-config too
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 10 Dec 2019 12:19:10 +0100
+
+gtk+2.0 (2.24.32-4ubuntu3) focal; urgency=medium
+
+  * Fix an issue with the previous change
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 10 Dec 2019 10:05:07 +0100
+
+gtk+2.0 (2.24.32-4ubuntu2) focal; urgency=medium
+
+  * Make autopkgtests cross-test-friendly.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Fri, 06 Dec 2019 11:02:19 -0800
+
+gtk+2.0 (2.24.32-4ubuntu1) eoan; urgency=low
+
+  * Merge from Debian unstable.  Remaining changes:
+    - d/libgtk2.0-0.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/098_multiarch_module_path.patch
+        - Fallback to the pre-multiarch directory for compatibility.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+
+ -- Gianfranco Costamagna <locutusofborg@debian.org>  Thu, 12 Sep 2019 10:52:24 +0200
+
 gtk+2.0 (2.24.32-4) unstable; urgency=medium
 
   * Team upload
@@ -198,6 +610,63 @@ gtk+2.0 (2.24.32-4) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Wed, 11 Sep 2019 22:03:10 +0100
 
+gtk+2.0 (2.24.32-3ubuntu1) cosmic; urgency=low
+
+  * Merge from Debian unstable.  Remaining changes:
+    - d/libgtk2.0-0.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/098_multiarch_module_path.patch
+        - Fallback to the pre-multiarch directory for compatibility.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+
+ -- Gianfranco Costamagna <locutusofborg@debian.org>  Fri, 21 Sep 2018 12:54:04 +0200
+
 gtk+2.0 (2.24.32-3) unstable; urgency=medium
 
   * Team upload
@@ -224,6 +693,63 @@ gtk+2.0 (2.24.32-3) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Tue, 21 Aug 2018 14:33:00 +0100
 
+gtk+2.0 (2.24.32-2ubuntu1) cosmic; urgency=low
+
+  * Merge from Debian Sid (LP: #1756372). Remaining changes:
+    - d/libgtk2.0-0.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/098_multiarch_module_path.patch
+        - Fallback to the pre-multiarch directory for compatibility.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+
+ -- Simon Quigley <tsimonq2@ubuntu.com>  Sun, 01 Jul 2018 00:53:11 -0500
+
 gtk+2.0 (2.24.32-2) unstable; urgency=medium
 
   * Team upload
@@ -252,6 +778,67 @@ gtk+2.0 (2.24.32-2) unstable; urgency=me
 
  -- Simon McVittie <smcv@debian.org>  Wed, 27 Jun 2018 10:58:03 +0100
 
+gtk+2.0 (2.24.32-1ubuntu1) bionic; urgency=low
+
+  * Merge from Debian Sid (LP: #1756372). Remaining changes:
+    - d/libgtk2.0-0.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - Add Ubuntu-specific patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido.
+      + debian/patches/062_dnd_menubar.patch
+        - Allow click on menubars for dnd.
+      + debian/patches/063_treeview_almost_fixed.patch
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center).
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing.
+      + debian/patches/090_logging_file_saves.patch
+        - Improve the logging of saved files.
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the "Print to File" function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names."; it will be useful for the indicator stack.
+      + debian/patches/095_git_menus_scrolling.patch
+        - Backported of a gtk3 commit fixing menu scrolling issues.
+      + debian/patches/096_git_gtkprintsettings.patch
+        - Backport an upstream git commit from the gtk3 series; don't ignore
+          the gtkprintsettings resolution settings.
+      + debian/patches/097_statusicon_image_fallback.patch
+        - Make GtkStatusIcon images use fallbacks by default if the property
+          is available.
+      + debian/patches/098_multiarch_module_path.patch
+        - Fallback to the pre-multiarch directory for compatibility.
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default.
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - Add support for dynamically loading overlay scrollbars.
+      + debian/patches/gtk-shell-shows-menubar.patch
+        - List gtk-shell-shows-menubar setting; that's required to have the
+          local menubars hidding under Unity in favor of the Unity ones.
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work.
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable.
+      + debian/patches/menubar_toolbar_dragging.patch
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar.
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+    - Remove reverse-applicable patch:
+      + debian/patches/lp1641912-add-limit-to-list-size.patch
+        - Fix a DOS allowing any application to cause all GTK applications to
+          use an arbitrary amount of memory.
+
+ -- Simon Quigley <tsimonq2@ubuntu.com>  Fri, 23 Mar 2018 23:22:57 -0500
+
 gtk+2.0 (2.24.32-1) unstable; urgency=medium
 
   * New upstream release
@@ -271,6 +858,65 @@ gtk+2.0 (2.24.31-5) unstable; urgency=me
 
  -- Jeremy Bicha <jbicha@debian.org>  Thu, 21 Dec 2017 14:05:20 -0500
 
+gtk+2.0 (2.24.31-4ubuntu1) bionic; urgency=medium
+
+  * Merge with Debian. Remaining changes:
+    - d/libgtk2.0-0.symbols: update symbols file.
+    - Modify 015_default-fallback-icon-theme.patch:
+      - Set fallback icon theme to Adwaita instead of gnome
+    - d/control: Depend on adwaita-icon-theme | gnome-icon-theme instead of
+      the reverse order
+    - add Ubuntu patches:
+      + debian/patches/012_ubuntu-set-grab-add.patch
+        - Added ubuntu_gtk_widget_set_has_grab so we can grab sliders and
+          things in menus, needed by ido
+      + debian/patches/062_dnd_menubar.patch:
+        - Allow click on menubars for dnd
+      + debian/patches/063_treeview_almost_fixed.patch:
+        - Add an ubuntu-almost-fixed-height-mode property, (required for
+          software-center)
+      + debian/patches/071_no_offscreen_widgets_grabbing.patch:
+        - Don't let offscreen widgets do grabbing
+      + debian/patches/090_logging_file_saves.patch:
+        - improve the logging of saved files
+      + debian/patches/092_default_to_xdg_document_dir.patch:
+        - Use $XDG_DOCUMENTS_DIR as default directory rather than the home
+          directory for the 'Print to File' function.
+      + debian/patches/093_gtk3_gtkimage_fallbacks_use.patch:
+        - Backported gtk3 patch to add a "use-fallback" property to GtkImage,
+          using it "icon-name and GIcon type of GtkImages can use automatic
+          fallback names.", it will be useful for the indicator stack
+      + debian/patches/095_git_menus_scrolling.patch:
+        - backported gtk3 commit to fix menu scrolling issues
+      + debian/patches/096_git_gtkprintsettings.patch:
+        - upstream git commit backported from the gtk3 serie, don't ignore the
+          gtkprintsettings resolution settings
+      + debian/patches/097_statusicon_image_fallback.patch: Make GtkStatusIcon
+        images use fallbacks by default if the property is available.
+      + debian/patches/098_multiarch_module_path.patch:
+        - Fallback to the pre-multiarch directory for compatibility
+      + debian/patches/099_printer_filename_fix.patch
+        - Fix to the print dialog for print to file, make sure a non-hidden
+          filename is the default
+      + debian/patches/100_overlay_scrollbar_loading.patch
+        - support for dynamically loading overlay scrollbars
+      + debian/patches/gtk-shell-shows-menubar.patch:
+        - list gtk-shell-shows-menubar setting, that's required to have the
+          local menubars hidding under unity in favor of the unity ones,
+      + debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch:
+        - Make printing on remote DNS-SD/Bonjour-shared printers work
+      + debian/patches/backport_search_printer_location.patch
+        -  The list of printers should be searchable/sortable
+      + debian/patches/menubar_toolbar_dragging.patch:
+        - Allow windows to be dragged using blank spaces in the toolbar as
+          well as the menubar
+      + debian/patches/use-secrets-service-for-cups-auth_info.patch
+      + debian/patches/lp1641912-add-limit-to-list-size.patch, which fixes a
+        - DOS allowing any application to cause all GTK applications to use an
+          arbitrary amount of memory (LP: #1641912).
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Wed, 06 Dec 2017 11:24:35 -0500
+
 gtk+2.0 (2.24.31-4) unstable; urgency=medium
 
   * Don't have gtk2-engines-pixbuf depend on libgtk2.0-0 to allow
diff -pruN 2.24.33-6/debian/control 2.24.33-6ubuntu3/debian/control
--- 2.24.33-6/debian/control	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/control	2025-09-18 13:56:14.000000000 +0000
@@ -1,7 +1,8 @@
 Source: gtk+2.0
 Section: oldlibs
 Priority: optional
-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
 Uploaders: Emilio Pozuelo Monfort <pochu@debian.org>, Jeremy Bícha <jbicha@ubuntu.com>
 Build-Depends: dpkg-dev (>= 1.22.5), debhelper-compat (= 12),
                dh-sequence-gnome,
@@ -47,8 +48,10 @@ Build-Depends-Indep: libglib2.0-doc,
                      libcairo2-doc
 Rules-Requires-Root: no
 Standards-Version: 4.7.0
-Vcs-Browser: https://salsa.debian.org/gnome-team/gtk2
-Vcs-Git: https://salsa.debian.org/gnome-team/gtk2.git
+XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gtk2.git
+XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gtk2
+Vcs-Git: https://salsa.debian.org/gnome-team/gtk2.git -b ubuntu/latest
+Vcs-Browser: https://salsa.debian.org/gnome-team/gtk2/tree/ubuntu/latest
 Homepage: http://www.gtk.org/
 
 Package: libgtk2.0-0t64
diff -pruN 2.24.33-6/debian/gbp.conf 2.24.33-6ubuntu3/debian/gbp.conf
--- 2.24.33-6/debian/gbp.conf	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/gbp.conf	2025-09-18 13:56:14.000000000 +0000
@@ -1,5 +1,6 @@
 [DEFAULT]
 pristine-tar = True
-debian-branch = debian/latest
+debian-branch = ubuntu/latest
 upstream-branch = upstream/latest
+debian-tag = ubuntu/%(version)s
 upstream-vcs-tag = %(version)s
diff -pruN 2.24.33-6/debian/libgtk2.0-0t64.symbols 2.24.33-6ubuntu3/debian/libgtk2.0-0t64.symbols
--- 2.24.33-6/debian/libgtk2.0-0t64.symbols	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/libgtk2.0-0t64.symbols	2025-09-18 13:56:14.000000000 +0000
@@ -4732,3 +4732,6 @@ libgtk-x11-2.0.so.0 libgtk2.0-0t64 #MINV
  gtk_window_unmaximize@Base 2.8.0
  gtk_window_unstick@Base 2.8.0
  gtk_wrap_mode_get_type@Base 2.8.0
+ ubuntu_gtk_get_use_overlay_scrollbar@Base 2.24.6-0ubuntu4
+ ubuntu_gtk_set_use_overlay_scrollbar@Base 2.24.6-0ubuntu4
+ ubuntu_gtk_widget_set_has_grab@Base 2.21.6-1ubuntu3
diff -pruN 2.24.33-6/debian/patches/012_ubuntu-set-grab-add.patch 2.24.33-6ubuntu3/debian/patches/012_ubuntu-set-grab-add.patch
--- 2.24.33-6/debian/patches/012_ubuntu-set-grab-add.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/012_ubuntu-set-grab-add.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,41 @@
+=== modified file 'gtk/gtk.symbols'
+--- a/gtk/gtk.symbols
++++ b/gtk/gtk.symbols
+@@ -5323,6 +5323,7 @@ gtk_widget_set_realized
+ gtk_widget_get_realized
+ gtk_widget_set_mapped
+ gtk_widget_get_mapped
++ubuntu_gtk_widget_set_has_grab
+ #endif
+ #endif
+ 
+--- a/gtk/gtkwidget.c
++++ b/gtk/gtkwidget.c
+@@ -11449,5 +11449,15 @@ gtk_widget_send_focus_change (GtkWidget
+   return res;
+ }
+ 
++void
++ubuntu_gtk_widget_set_has_grab (GtkWidget *widget,
++                                gboolean   has_grab)
++{
++  if (has_grab)
++    GTK_OBJECT_FLAGS (widget) |= GTK_HAS_GRAB;
++  else
++    GTK_OBJECT_FLAGS (widget) &= ~(GTK_HAS_GRAB);
++}
++
+ #define __GTK_WIDGET_C__
+ #include "gtkaliasdef.c"
+--- a/gtk/gtkwidget.h
++++ b/gtk/gtkwidget.h
+@@ -1346,6 +1346,9 @@ void         _gtk_widget_buildable_finis
+ 						       GtkWidget *toplevel,
+ 						       gpointer   user_data);
+ 
++void   ubuntu_gtk_widget_set_has_grab  (GtkWidget *widget,
++                                        gboolean   has_grab);
++
+ G_END_DECLS
+ 
+ #endif /* __GTK_WIDGET_H__ */
diff -pruN 2.24.33-6/debian/patches/062_dnd_menubar.patch 2.24.33-6ubuntu3/debian/patches/062_dnd_menubar.patch
--- 2.24.33-6/debian/patches/062_dnd_menubar.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/062_dnd_menubar.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,73 @@
+# Comment: let click on menubar to do dnd
+# Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=611313
+#
+--- a/gtk/gtkmenushell.c
++++ b/gtk/gtkmenushell.c
+@@ -406,6 +406,14 @@ gtk_menu_shell_class_init (GtkMenuShellC
+ 							 TRUE,
+ 							 GTK_PARAM_READWRITE));
+ 
++
++  gtk_widget_class_install_style_property (widget_class,
++                                           g_param_spec_boolean ("window-dragging",
++                                                                 P_("Window dragging"),
++                                                                 P_("Window dragging"),
++                                                                 FALSE,
++                                                                 GTK_PARAM_READWRITE));
++
+   g_type_class_add_private (object_class, sizeof (GtkMenuShellPrivate));
+ }
+ 
+@@ -609,18 +617,45 @@ gtk_menu_shell_button_press (GtkWidget
+ 
+   if (!menu_shell->active || !menu_shell->button)
+     {
+-      gtk_menu_shell_activate (menu_shell);
++      gboolean initially_active = menu_shell->active;
+ 
+       menu_shell->button = event->button;
+ 
+-      if (menu_item && _gtk_menu_item_is_selectable (menu_item) &&
+-	  menu_item->parent == widget &&
+-          menu_item != menu_shell->active_menu_item)
++      if (menu_item)
++        {
++          if (_gtk_menu_item_is_selectable (menu_item) &&
++              menu_item->parent == widget &&
++              menu_item != menu_shell->active_menu_item)
++            {
++              gtk_menu_shell_activate (menu_shell);
++              menu_shell->button = event->button;
++
++              if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
++                {
++                  menu_shell->activate_time = event->time;
++                  gtk_menu_shell_select_item (menu_shell, menu_item);
++                }
++            }
++        }
++      else
+         {
+-          if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
++          if (!initially_active)
+             {
+-              menu_shell->activate_time = event->time;
+-              gtk_menu_shell_select_item (menu_shell, menu_item);
++              gboolean window_drag = FALSE;
++
++              gtk_widget_style_get (widget,
++                                    "window-dragging", &window_drag,
++                                    NULL);
++
++              if (window_drag)
++                {
++                  gtk_menu_shell_deactivate (menu_shell);
++                  gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
++                                              event->button,
++                                              event->x_root,
++                                              event->y_root,
++                                              event->time);
++                }
+             }
+         }
+     }
diff -pruN 2.24.33-6/debian/patches/063_treeview_almost_fixed.patch 2.24.33-6ubuntu3/debian/patches/063_treeview_almost_fixed.patch
--- 2.24.33-6/debian/patches/063_treeview_almost_fixed.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/063_treeview_almost_fixed.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,79 @@
+# Description: "ubuntu-almost-fixed-height" private property to speed-up software-center
+# Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gtk+2.0/+bug/514879
+# Upstream: https://bugzilla.gnome.org/607447
+=== modified file 'gtk/gtktreeprivate.h'
+Index: gtk+-2.24.12/gtk/gtktreeprivate.h
+===================================================================
+--- gtk+-2.24.12.orig/gtk/gtktreeprivate.h	2011-09-18 09:59:38.000000000 +1200
++++ gtk+-2.24.12/gtk/gtktreeprivate.h	2012-09-04 16:42:48.718564047 +1200
+@@ -265,6 +265,7 @@
+ 
+   guint fixed_height_mode : 1;
+   guint fixed_height_check : 1;
++  guint ubuntu_almost_fixed_height_mode : 1;
+ 
+   guint reorderable : 1;
+   guint header_has_focus : 1;
+Index: gtk+-2.24.12/gtk/gtktreeview.c
+===================================================================
+--- gtk+-2.24.12.orig/gtk/gtktreeview.c	2012-09-04 16:42:43.974564211 +1200
++++ gtk+-2.24.12/gtk/gtktreeview.c	2012-09-04 16:42:48.718564047 +1200
+@@ -137,6 +137,7 @@
+   PROP_ENABLE_SEARCH,
+   PROP_SEARCH_COLUMN,
+   PROP_FIXED_HEIGHT_MODE,
++  PROP_UBUNTU_ALMOST_FIXED_HEIGHT_MODE,
+   PROP_HOVER_SELECTION,
+   PROP_HOVER_EXPAND,
+   PROP_SHOW_EXPANDERS,
+@@ -661,6 +662,15 @@
+                                                            P_("Speeds up GtkTreeView by assuming that all rows have the same height"),
+                                                            FALSE,
+                                                            GTK_PARAM_READWRITE));
++
++    /* Private ubuntu extension to fix bugzilla bug #607447 */
++    g_object_class_install_property (o_class,
++                                     PROP_UBUNTU_ALMOST_FIXED_HEIGHT_MODE,
++                                     g_param_spec_boolean ("ubuntu-almost-fixed-height-mode",
++                                                           "Private Ubuntu extension",
++							   "Private Ubuntu extension",
++                                                           FALSE,
++                                                           GTK_PARAM_READWRITE));
+     
+     /**
+      * GtkTreeView:hover-selection:
+@@ -1354,6 +1364,7 @@
+   tree_view->priv->fixed_height = -1;
+   tree_view->priv->fixed_height_mode = FALSE;
+   tree_view->priv->fixed_height_check = 0;
++  tree_view->priv->ubuntu_almost_fixed_height_mode = FALSE;
+   gtk_tree_view_set_adjustments (tree_view, NULL, NULL);
+   tree_view->priv->selection = _gtk_tree_selection_new_with_tree_view (tree_view);
+   tree_view->priv->enable_search = TRUE;
+@@ -1436,6 +1447,9 @@
+     case PROP_FIXED_HEIGHT_MODE:
+       gtk_tree_view_set_fixed_height_mode (tree_view, g_value_get_boolean (value));
+       break;
++    case PROP_UBUNTU_ALMOST_FIXED_HEIGHT_MODE:
++      tree_view->priv->ubuntu_almost_fixed_height_mode = g_value_get_boolean (value);
++      break;
+     case PROP_HOVER_SELECTION:
+       tree_view->priv->hover_selection = g_value_get_boolean (value);
+       break;
+@@ -8354,7 +8368,15 @@
+   if (tree == NULL)
+     goto done;
+ 
+-  if (tree_view->priv->fixed_height_mode
++  if (tree_view->priv->ubuntu_almost_fixed_height_mode
++      && tree_view->priv->fixed_height >= 0)
++    {
++      _gtk_rbtree_node_mark_invalid (tree, node);
++      validate_visible_area (tree_view);
++      if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
++	gtk_tree_view_node_queue_redraw (tree_view, tree, node);
++    }
++  else if (tree_view->priv->fixed_height_mode
+       && tree_view->priv->fixed_height >= 0)
+     {
+       _gtk_rbtree_node_set_height (tree, node, tree_view->priv->fixed_height);
diff -pruN 2.24.33-6/debian/patches/071_no_offscreen_widgets_grabbing.patch 2.24.33-6ubuntu3/debian/patches/071_no_offscreen_widgets_grabbing.patch
--- 2.24.33-6/debian/patches/071_no_offscreen_widgets_grabbing.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/071_no_offscreen_widgets_grabbing.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,22 @@
+# Description: don't let offscreen widget do grabbing
+# Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=607668
+# Ubuntu: https://bugs.launchpad.net/bugs/512427
+--- a/gtk/gtkmain.c
++++ b/gtk/gtkmain.c
+@@ -1875,9 +1875,14 @@ gtk_grab_add (GtkWidget *widget)
+ {
+   GtkWindowGroup *group;
+   GtkWidget *old_grab_widget;
+-  
++  GtkWidget *toplevel;
++
+   g_return_if_fail (widget != NULL);
+-  
++
++  toplevel = gtk_widget_get_toplevel (widget);
++  if (toplevel && gdk_window_get_window_type (toplevel->window) == GDK_WINDOW_OFFSCREEN)
++    return;
++
+   if (!gtk_widget_has_grab (widget) && gtk_widget_is_sensitive (widget))
+     {
+       _gtk_widget_set_has_grab (widget, TRUE);
diff -pruN 2.24.33-6/debian/patches/090_logging_file_saves.patch 2.24.33-6ubuntu3/debian/patches/090_logging_file_saves.patch
--- 2.24.33-6/debian/patches/090_logging_file_saves.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/090_logging_file_saves.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,24 @@
+--- a/gtk/gtkrecentmanager.c
++++ b/gtk/gtkrecentmanager.c
+@@ -916,7 +916,7 @@ gtk_recent_manager_add_item_query_info (
+   GtkRecentManager *manager = user_data;
+   GtkRecentData recent_data;
+   GFileInfo *file_info;
+-  gchar *uri;
++  gchar *uri, *basename;
+ 
+   uri = g_file_get_uri (file);
+ 
+@@ -940,7 +940,11 @@ gtk_recent_manager_add_item_query_info (
+       g_object_unref (file_info);
+     }
+   else
+-    recent_data.mime_type = g_strdup (GTK_RECENT_DEFAULT_MIME); /* FIXME: maybe we should make up the MIME type from the filename's extension */
++    {
++      basename = g_file_get_basename (file);
++      recent_data.mime_type = g_content_type_guess (basename, NULL, 0, NULL);
++      g_free (basename);
++    }
+ 
+   recent_data.app_name = g_strdup (g_get_application_name ());
+   recent_data.app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL);
diff -pruN 2.24.33-6/debian/patches/092_default_to_xdg_document_dir.patch 2.24.33-6ubuntu3/debian/patches/092_default_to_xdg_document_dir.patch
--- 2.24.33-6/debian/patches/092_default_to_xdg_document_dir.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/092_default_to_xdg_document_dir.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,19 @@
+Description: Use XDG_DOCUMENTS_DIR as default for 'Print to File'
+ This patch uses $XDG_DOCUMENTS_DIR as the default directory rather
+ than the home directory when the user selects Print to File in the
+ GtkPrinterOptionWidget.
+Author: Bilal Akhtar <bilalakhtar@ubuntu.com>
+Bug-Ubuntu: https://launchpad.net/bugs/611011
+Index: gtk+-2.24.12/gtk/gtkprinteroptionwidget.c
+===================================================================
+--- gtk+-2.24.12.orig/gtk/gtkprinteroptionwidget.c	2012-01-11 13:06:05.000000000 +1300
++++ gtk+-2.24.12/gtk/gtkprinteroptionwidget.c	2012-09-04 16:45:23.506558688 +1200
+@@ -833,6 +833,8 @@
+         priv->entry = gtk_entry_new ();
+         priv->combo = gtk_file_chooser_button_new (source->display_text,
+                                                    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
++        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (priv->combo),
++                                                   g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS));
+ 
+         g_object_set (priv->combo, "local-only", FALSE, NULL);
+         gtk_entry_set_activates_default (GTK_ENTRY (priv->entry),
diff -pruN 2.24.33-6/debian/patches/093_gtk3_gtkimage_fallbacks_use.patch 2.24.33-6ubuntu3/debian/patches/093_gtk3_gtkimage_fallbacks_use.patch
--- 2.24.33-6/debian/patches/093_gtk3_gtkimage_fallbacks_use.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/093_gtk3_gtkimage_fallbacks_use.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,114 @@
+From 714d9bc4078898bfb9513e5e17c2bb3c935eef5f Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Tue, 18 Jan 2011 16:13:00 +0000
+Subject: GtkImage: Add "use-fallback" property
+
+So that icon-name and GIcon type of GtkImages can use automatic
+fallback names.
+---
+Index: gtk+2.0-2.24.4/gtk/gtkimage.c
+===================================================================
+--- gtk+2.0-2.24.4.orig/gtk/gtkimage.c	2011-04-13 12:26:48.104712854 -0500
++++ gtk+2.0-2.24.4/gtk/gtkimage.c	2011-04-13 12:28:19.576702233 -0500
+@@ -138,6 +138,7 @@
+ 
+   gint pixel_size;
+   guint need_calc_size : 1;
++  guint                 use_fallback : 1;
+ };
+ 
+ #define GTK_IMAGE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_IMAGE, GtkImagePrivate))
+@@ -188,7 +189,8 @@
+   PROP_PIXBUF_ANIMATION,
+   PROP_ICON_NAME,
+   PROP_STORAGE_TYPE,
+-  PROP_GICON
++  PROP_GICON,
++  PROP_USE_FALLBACK
+ };
+ 
+ G_DEFINE_TYPE (GtkImage, gtk_image, GTK_TYPE_MISC)
+@@ -351,6 +353,24 @@
+                                                       GTK_IMAGE_EMPTY,
+                                                       GTK_PARAM_READABLE));
+ 
++  /**
++   * GtkImage:use-fallback:
++   *
++   * Whether the icon displayed in the GtkImage will use
++   * standard icon names fallback. The value of this property
++   * is only relevant for images of type %GTK_IMAGE_ICON_NAME
++   * and %GTK_IMAGE_GICON.
++   *
++   * Since: 3.0
++   */
++  g_object_class_install_property (gobject_class,
++                                   PROP_USE_FALLBACK,
++                                   g_param_spec_boolean ("use-fallback",
++                                                         P_("Use Fallback"),
++                                                         P_("Whether to use icon names fallback"),
++                                                         FALSE,
++                                                         GTK_PARAM_READWRITE));
++
+   g_type_class_add_private (object_class, sizeof (GtkImagePrivate));
+ }
+ 
+@@ -387,8 +407,10 @@
+ 			GParamSpec   *pspec)
+ {
+   GtkImage *image;
++  GtkImagePrivate *priv;
+ 
+   image = GTK_IMAGE (object);
++  priv = GTK_IMAGE_GET_PRIVATE (image);
+   
+   switch (prop_id)
+     {
+@@ -477,6 +499,18 @@
+ 				image->icon_size);
+       break;
+ 
++    case PROP_USE_FALLBACK:
++      priv->use_fallback = g_value_get_boolean(value);
++      if (image->storage_type == GTK_IMAGE_ICON_NAME)
++        gtk_image_set_from_icon_name (image,
++				      image->data.name.icon_name,
++				      image->icon_size);
++      else if (image->storage_type == GTK_IMAGE_GICON)
++        gtk_image_set_from_gicon (image,
++                                  image->data.gicon.icon,
++                                  image->icon_size);
++      break;
++
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+       break;
+@@ -574,6 +608,10 @@
+     case PROP_STORAGE_TYPE:
+       g_value_set_enum (value, image->storage_type);
+       break;
++
++    case PROP_USE_FALLBACK:
++      g_value_set_boolean (value, priv->use_fallback);
++      break;
+       
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+@@ -1667,6 +1705,8 @@
+   icon_theme = gtk_icon_theme_get_for_screen (screen);
+   settings = gtk_settings_get_for_screen (screen);
+   flags = GTK_ICON_LOOKUP_USE_BUILTIN;
++  if (priv->use_fallback)
++    flags |= GTK_ICON_LOOKUP_GENERIC_FALLBACK;
+   if (image->data.name.pixbuf == NULL)
+     {
+       if (priv->pixel_size != -1)
+@@ -1750,6 +1790,8 @@
+   icon_theme = gtk_icon_theme_get_for_screen (screen);
+   settings = gtk_settings_get_for_screen (screen);
+   flags = GTK_ICON_LOOKUP_USE_BUILTIN;
++  if (priv->use_fallback)
++    flags |= GTK_ICON_LOOKUP_GENERIC_FALLBACK;
+   if (image->data.gicon.pixbuf == NULL)
+     {
+       if (priv->pixel_size != -1)
diff -pruN 2.24.33-6/debian/patches/096_git_gtkprintsettings.patch 2.24.33-6ubuntu3/debian/patches/096_git_gtkprintsettings.patch
--- 2.24.33-6/debian/patches/096_git_gtkprintsettings.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/096_git_gtkprintsettings.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,59 @@
+From 3dde093b71b47e2512d74d6573af4c2eea54043e Mon Sep 17 00:00:00 2001
+From: Marek Kasik <mkasik@redhat.com>
+Date: Fri, 19 Nov 2010 09:55:25 +0000
+Subject: Check whether a resolution has been set in GtkPrintSettings
+
+If resolution has not been set then use default resolution from ppd.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=635254
+
+---
+Index: b/modules/printbackends/cups/gtkprintbackendcups.c
+===================================================================
+--- a/modules/printbackends/cups/gtkprintbackendcups.c
++++ b/modules/printbackends/cups/gtkprintbackendcups.c
+@@ -5226,23 +5226,29 @@
+ 	gtk_printer_option_set (option, cups_value);
+       else
+ 	{
+-	  int res = gtk_print_settings_get_resolution (settings);
+-	  int res_x = gtk_print_settings_get_resolution_x (settings);
+-	  int res_y = gtk_print_settings_get_resolution_y (settings);
++	  if (gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION, -1) != -1 ||
++	      gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_X, -1) != -1 ||
++	      gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_Y, -1) != -1 ||
++	      option->value == NULL || option->value[0] == '\0')
++	    {
++              int res = gtk_print_settings_get_resolution (settings);
++              int res_x = gtk_print_settings_get_resolution_x (settings);
++              int res_y = gtk_print_settings_get_resolution_y (settings);
+ 
+-          if (res_x != res_y)
+-            {
+-	      value = g_strdup_printf ("%dx%ddpi", res_x, res_y);
+-	      gtk_printer_option_set (option, value);
+-	      g_free (value);
++              if (res_x != res_y)
++                {
++                  value = g_strdup_printf ("%dx%ddpi", res_x, res_y);
++                  gtk_printer_option_set (option, value);
++                  g_free (value);
++                }
++              else if (res != 0)
++                {
++                  value = g_strdup_printf ("%ddpi", res);
++                  gtk_printer_option_set (option, value);
++                  g_free (value);
++                }
+             }
+-          else if (res != 0)
+-	    {
+-	      value = g_strdup_printf ("%ddpi", res);
+-	      gtk_printer_option_set (option, value);
+-	      g_free (value);
+-	    }
+-	}
++        }
+     }
+   else if (strcmp (option->name, "gtk-paper-type") == 0)
+     map_settings_to_option (option, media_type_map, G_N_ELEMENTS (media_type_map),
diff -pruN 2.24.33-6/debian/patches/097_statusicon_image_fallback.patch 2.24.33-6ubuntu3/debian/patches/097_statusicon_image_fallback.patch
--- 2.24.33-6/debian/patches/097_statusicon_image_fallback.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/097_statusicon_image_fallback.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,19 @@
+## Description: Makes images in GtkStatusIcon use fallbacks by default if the property is available
+## Origin/Author: Ted Gould <ted@canonical.com>
+## Bug: http://launchpad.net/bugs/729150
+Index: b/gtk/gtkstatusicon.c
+===================================================================
+--- a/gtk/gtkstatusicon.c
++++ b/gtk/gtkstatusicon.c
+@@ -894,6 +894,11 @@
+ 		    	    G_CALLBACK (gtk_status_icon_screen_changed), status_icon);
+   priv->image = gtk_image_new ();
+   gtk_widget_set_can_focus (priv->image, TRUE);
++
++  if (g_object_class_find_property(G_OBJECT_CLASS(GTK_IMAGE_GET_CLASS(priv->image)), "use-fallback") != NULL) {
++    g_object_set(G_OBJECT(priv->image), "use-fallback", TRUE, NULL);
++  }
++
+   gtk_container_add (GTK_CONTAINER (priv->tray_icon), priv->image);
+   gtk_widget_show (priv->image);
+ 
diff -pruN 2.24.33-6/debian/patches/099_printer_filename_fix.patch 2.24.33-6ubuntu3/debian/patches/099_printer_filename_fix.patch
--- 2.24.33-6/debian/patches/099_printer_filename_fix.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/099_printer_filename_fix.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,27 @@
+=== modified file 'gtk/gtkprinteroptionwidget.c'
+Index: b/gtk/gtkprinteroptionwidget.c
+===================================================================
+--- a/gtk/gtkprinteroptionwidget.c
++++ b/gtk/gtkprinteroptionwidget.c
+@@ -938,11 +938,19 @@
+             dirname = g_path_get_dirname (filename);
+             text = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
+ 
++            /* need to update dirname and basename without triggering function to avoid loosing names */
++             g_signal_handlers_block_by_func (priv->entry, G_CALLBACK (filesave_changed_cb), widget);
++             g_signal_handlers_block_by_func (priv->combo, G_CALLBACK (filesave_changed_cb), widget);
++
+             if (text != NULL)
+               gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
+             if (g_path_is_absolute (dirname))
+-              gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (priv->combo),
+-                                                   dirname);
++              gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->combo),
++                                                    dirname);
++
++            g_signal_handlers_unblock_by_func (priv->entry, G_CALLBACK (filesave_changed_cb), widget);
++            g_signal_handlers_unblock_by_func (priv->combo, G_CALLBACK (filesave_changed_cb), widget);
++
+             g_free (text);
+             g_free (basename);
+             g_free (dirname);
diff -pruN 2.24.33-6/debian/patches/100_overlay_scrollbar_loading.patch 2.24.33-6ubuntu3/debian/patches/100_overlay_scrollbar_loading.patch
--- 2.24.33-6/debian/patches/100_overlay_scrollbar_loading.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/100_overlay_scrollbar_loading.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,61 @@
+From: Andrea Cimitan <andrea.cimitan@canonical.com>
+Date: Wed, 30 Mar 2011 08:59:11 -0400
+Subject: Add overlay-scrollbar functions
+
+---
+ gtk/gtk.symbols |  2 ++
+ gtk/gtkmain.c   | 14 ++++++++++++++
+ gtk/gtkmain.h   |  2 ++
+ 3 files changed, 18 insertions(+)
+
+diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
+index aeab98e..7883c53 100644
+--- a/gtk/gtk.symbols
++++ b/gtk/gtk.symbols
+@@ -2470,6 +2470,8 @@ gtk_quit_remove_by_data
+ gtk_key_snooper_install
+ gtk_key_snooper_remove
+ gtk_init
++ubuntu_gtk_get_use_overlay_scrollbar
++ubuntu_gtk_set_use_overlay_scrollbar
+ #ifdef G_OS_WIN32
+ gtk_init_abi_check
+ #endif
+diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
+index 5c23aef..461d3b6 100644
+--- a/gtk/gtkmain.c
++++ b/gtk/gtkmain.c
+@@ -721,6 +721,20 @@ gettext_initialization (void)
+ #endif  
+ }
+ 
++static gboolean use_overlay_scrollbar = FALSE;
++
++gboolean
++ubuntu_gtk_get_use_overlay_scrollbar (void)
++{
++  return use_overlay_scrollbar;
++}
++
++void
++ubuntu_gtk_set_use_overlay_scrollbar (gboolean use)
++{
++  use_overlay_scrollbar = use;
++}
++
+ static void
+ do_post_parse_initialization (int    *argc,
+ 			      char ***argv)
+diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h
+index 2f057e5..bc72827 100644
+--- a/gtk/gtkmain.h
++++ b/gtk/gtkmain.h
+@@ -212,6 +212,8 @@ gboolean        gtk_get_current_event_state (GdkModifierType *state);
+ 
+ GtkWidget* gtk_get_event_widget	   (GdkEvent	   *event);
+ 
++gboolean   ubuntu_gtk_get_use_overlay_scrollbar (void);
++void	   ubuntu_gtk_set_use_overlay_scrollbar (gboolean use);
+ 
+ /* Private routines internal to GTK+ 
+  */
diff -pruN 2.24.33-6/debian/patches/backport_search_printer_location.patch 2.24.33-6ubuntu3/debian/patches/backport_search_printer_location.patch
--- 2.24.33-6/debian/patches/backport_search_printer_location.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/backport_search_printer_location.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,111 @@
+diff -Naurp gtk+3.0-3.4.2/gtk/gtkprintunixdialog.c gtk+3.0-3.4.2.orig/gtk/gtkprintunixdialog.c
+--- gtk+3.0-3.4.2/gtk/gtkprintunixdialog.c	2012-03-19 02:14:22.000000000 +0530
++++ gtk+3.0-3.4.2.orig/gtk/gtkprintunixdialog.c	2014-02-04 11:30:37.677795000 +0530
+@@ -108,7 +108,13 @@ static void     set_cell_sensitivity_fun
+                                                     gpointer           data);
+ static gboolean set_active_printer                 (GtkPrintUnixDialog *dialog,
+                                                     const gchar        *printer_name);
++
+ static void redraw_page_layout_preview             (GtkPrintUnixDialog *dialog);
++static gboolean printer_compare                    (GtkTreeModel       *model,
++                                                    gint                column,
++                                                    const gchar        *key,
++                                                    GtkTreeIter        *iter,
++                                                    gpointer            search_data);
+ 
+ /* GtkBuildable */
+ static void gtk_print_unix_dialog_buildable_init                    (GtkBuildableIface *iface);
+@@ -1929,6 +1935,85 @@ selected_printer_changed (GtkTreeSelecti
+   g_object_notify ( G_OBJECT(dialog), "selected-printer");
+ }
+ 
++static gboolean
++printer_compare (GtkTreeModel *model,
++                 gint          column,
++                 const gchar  *key,
++                 GtkTreeIter  *iter,
++                 gpointer      search_data)
++{
++  gboolean matches = FALSE;
++
++  if (key != NULL)
++    {
++      gchar  *name = NULL;
++      gchar  *location = NULL;
++      gchar  *casefold_key = NULL;
++      gchar  *casefold_name = NULL;
++      gchar  *casefold_location = NULL;
++      gchar **keys;
++      gchar  *tmp1, *tmp2;
++      gint    i;
++
++      gtk_tree_model_get (model, iter,
++                          PRINTER_LIST_COL_NAME, &name,
++                          PRINTER_LIST_COL_LOCATION, &location,
++                          -1);
++
++      casefold_key = g_utf8_casefold (key, -1);
++
++      if (name != NULL)
++        {
++          casefold_name = g_utf8_casefold (name, -1);
++          g_free (name);
++        }
++
++      if (location != NULL)
++        {
++          casefold_location = g_utf8_casefold (location, -1);
++          g_free (location);
++        }
++
++      if (casefold_name != NULL ||
++          casefold_location != NULL)
++        {
++          keys = g_strsplit_set (casefold_key, " \t", 0);
++          if (keys != NULL)
++            {
++              matches = TRUE;
++
++              for (i = 0; keys[i] != NULL; i++)
++                {
++                  if (keys[i][0] != '\0')
++                    {
++                      tmp1 = tmp2 = NULL;
++
++                      if (casefold_name != NULL)
++                        tmp1 = g_strstr_len (casefold_name, -1, keys[i]);
++
++                      if (casefold_location != NULL)
++                        tmp2 = g_strstr_len (casefold_location, -1, keys[i]);
++
++                      if (tmp1 == NULL && tmp2 == NULL)
++                        {
++                          matches = FALSE;
++                          break;
++                        }
++                    }
++                }
++
++              g_strfreev (keys);
++            }
++        }
++
++      g_free (casefold_location);
++      g_free (casefold_name);
++      g_free (casefold_key);
++    }
++
++  return !matches;
++}
++
+ static void
+ update_collate_icon (GtkToggleButton    *toggle_button,
+                      GtkPrintUnixDialog *dialog)
+@@ -2115,6 +2200,7 @@ create_main_page (GtkPrintUnixDialog *di
+   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE);
+   gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), PRINTER_LIST_COL_NAME);
+   gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview), TRUE);
++  gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (treeview), printer_compare, treeview, NULL);
+   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+   gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+   g_signal_connect (selection, "changed", G_CALLBACK (selected_printer_changed), dialog);
diff -pruN 2.24.33-6/debian/patches/gtk-shell-shows-menubar.patch 2.24.33-6ubuntu3/debian/patches/gtk-shell-shows-menubar.patch
--- 2.24.33-6/debian/patches/gtk-shell-shows-menubar.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/gtk-shell-shows-menubar.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,53 @@
+Index: b/gdk/x11/gdksettings.c
+===================================================================
+--- a/gdk/x11/gdksettings.c
++++ b/gdk/x11/gdksettings.c
+@@ -80,7 +80,8 @@
+   "Net/EnableInputFeedbackSounds\0" "gtk-enable-input-feedback-sounds\0"
+   "Net/EnableEventSounds\0"   "gtk-enable-event-sounds\0"
+   "Gtk/CursorBlinkTimeout\0"  "gtk-cursor-blink-timeout\0"
+-  "Gtk/AutoMnemonics\0"       "gtk-auto-mnemonics\0";
++  "Gtk/AutoMnemonics\0"       "gtk-auto-mnemonics\0"
++  "Gtk/ShellShowsMenubar\0"   "gtk-shell-shows-menubar\0";
+ 
+ 
+ static const struct
+@@ -133,5 +134,6 @@
+   { 1573, 1603 },
+   { 1636, 1658 },
+   { 1682, 1705 },
+-  { 1730, 1748 }
++  { 1730, 1748 },
++  { 1767, 1789 }
+ };
+Index: b/gtk/gtksettings.c
+===================================================================
+--- a/gtk/gtksettings.c
++++ b/gtk/gtksettings.c
+@@ -139,7 +139,8 @@
+   PROP_LABEL_SELECT_ON_FOCUS,
+   PROP_COLOR_PALETTE,
+   PROP_IM_PREEDIT_STYLE,
+-  PROP_IM_STATUS_STYLE
++  PROP_IM_STATUS_STYLE,
++  PROP_SHELL_SHOWS_MENUBAR
+ };
+ 
+ /* --- prototypes --- */
+@@ -1205,6 +1206,16 @@
+                                                                 GTK_PARAM_READWRITE),
+                                              gtk_rc_property_parse_enum);
+   g_assert (result == PROP_IM_STATUS_STYLE);
++
++  result = settings_install_property_parser (class,
++                                             g_param_spec_boolean ("gtk-shell-shows-menubar",
++                                                                   P_("Desktop shell shows the menubar"),
++                                                                   P_("Set to TRUE if the desktop environment "
++                                                                      "is displaying the menubar, FALSE if "
++                                                                      "the app should display it itself."),
++                                                                   FALSE, GTK_PARAM_READWRITE),
++                                             NULL);
++  g_assert (result == PROP_SHELL_SHOWS_MENUBAR);
+ }
+ 
+ static void
diff -pruN 2.24.33-6/debian/patches/menubar_toolbar_dragging.patch 2.24.33-6ubuntu3/debian/patches/menubar_toolbar_dragging.patch
--- 2.24.33-6/debian/patches/menubar_toolbar_dragging.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/menubar_toolbar_dragging.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,240 @@
+# Comment: Allow windows to be dragged by clicking on empty areas (menubar and toolbar)
+# Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=611313 and commit 7491e9e97aa6b0f9950897c4f1282b470c79d451
+# Author: Adam Smith, https://launchpad.net/~adamsmith
+#
+Index: b/gtk/gtkseparatortoolitem.c
+===================================================================
+--- a/gtk/gtkseparatortoolitem.c
++++ b/gtk/gtkseparatortoolitem.c
+@@ -45,11 +45,19 @@
+ 							   GParamSpec                *pspec);
+ static void     gtk_separator_tool_item_size_request      (GtkWidget                 *widget,
+ 							   GtkRequisition            *requisition);
++static void     gtk_separator_tool_item_size_allocate     (GtkWidget                 *widget,
++                                                           GtkAllocation             *allocation);
+ static gboolean gtk_separator_tool_item_expose            (GtkWidget                 *widget,
+ 							   GdkEventExpose            *event);
+ static void     gtk_separator_tool_item_add               (GtkContainer              *container,
+ 							   GtkWidget                 *child);
+ static gint     get_space_size                            (GtkToolItem               *tool_item);
++static void     gtk_separator_tool_item_realize           (GtkWidget                 *widget);
++static void     gtk_separator_tool_item_unrealize         (GtkWidget                 *widget);
++static void     gtk_separator_tool_item_map               (GtkWidget                 *widget);
++static void     gtk_separator_tool_item_unmap             (GtkWidget                 *widget);
++static gboolean gtk_separator_tool_item_button_event      (GtkWidget                 *widget,
++                                                           GdkEventButton            *event);
+ 
+ 
+ 
+@@ -57,6 +65,7 @@
+ 
+ struct _GtkSeparatorToolItemPrivate
+ {
++  GdkWindow *event_window;
+   guint draw : 1;
+ };
+ 
+@@ -94,7 +103,15 @@
+   object_class->set_property = gtk_separator_tool_item_set_property;
+   object_class->get_property = gtk_separator_tool_item_get_property;
+   widget_class->size_request = gtk_separator_tool_item_size_request;
++  widget_class->size_allocate = gtk_separator_tool_item_size_allocate;
+   widget_class->expose_event = gtk_separator_tool_item_expose;
++  widget_class->realize = gtk_separator_tool_item_realize;
++  widget_class->unrealize = gtk_separator_tool_item_unrealize;
++  widget_class->map = gtk_separator_tool_item_map;
++  widget_class->unmap = gtk_separator_tool_item_unmap;
++  widget_class->button_press_event = gtk_separator_tool_item_button_event;
++  widget_class->button_release_event = gtk_separator_tool_item_button_event;
++
+   toolitem_class->create_menu_proxy = gtk_separator_tool_item_create_menu_proxy;
+   
+   container_class->add = gtk_separator_tool_item_add;
+@@ -115,6 +132,8 @@
+ {
+   separator_item->priv = GTK_SEPARATOR_TOOL_ITEM_GET_PRIVATE (separator_item);
+   separator_item->priv->draw = TRUE;
++
++  gtk_widget_set_has_window (GTK_WIDGET (separator_item), FALSE);
+ }
+ 
+ static void
+@@ -193,6 +212,116 @@
+     }
+ }
+ 
++static void
++gtk_separator_tool_item_size_allocate (GtkWidget     *widget,
++                                       GtkAllocation *allocation)
++{
++  GtkSeparatorToolItem *separator = GTK_SEPARATOR_TOOL_ITEM (widget);
++  GtkSeparatorToolItemPrivate *priv = separator->priv;
++
++  widget->allocation = *allocation;
++
++  if (gtk_widget_get_realized (widget))
++    gdk_window_move_resize (priv->event_window,
++                            widget->allocation.x,
++                            widget->allocation.y,
++                            widget->allocation.width,
++                            widget->allocation.height);
++
++}
++
++static void
++gtk_separator_tool_item_realize (GtkWidget *widget)
++{
++  GtkSeparatorToolItem *separator = GTK_SEPARATOR_TOOL_ITEM (widget);
++  GtkSeparatorToolItemPrivate *priv = separator->priv;
++  GdkWindowAttr attributes;
++  gint attributes_mask;
++
++  gtk_widget_set_realized (widget, TRUE);
++
++  attributes.window_type = GDK_WINDOW_CHILD;
++  attributes.x = widget->allocation.x;
++  attributes.y = widget->allocation.y;
++  attributes.width = widget->allocation.width;
++  attributes.height = widget->allocation.height;
++  attributes.wclass = GDK_INPUT_ONLY;
++  attributes.visual = gtk_widget_get_visual (widget);
++  attributes.colormap = gtk_widget_get_colormap (widget);
++  attributes.event_mask = gtk_widget_get_events (widget) |
++                          GDK_BUTTON_PRESS_MASK |
++                          GDK_BUTTON_RELEASE_MASK;
++  attributes_mask = GDK_WA_X | GDK_WA_Y;
++
++  widget->window = gtk_widget_get_parent_window (widget);
++  g_object_ref (widget->window);
++
++  priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
++                                       &attributes, attributes_mask);
++  gdk_window_set_user_data (priv->event_window, widget);
++
++  widget->style = gtk_style_attach (widget->style, widget->window);
++}
++
++static void
++gtk_separator_tool_item_unrealize (GtkWidget *widget)
++{
++  GtkSeparatorToolItem *separator = GTK_SEPARATOR_TOOL_ITEM (widget);
++  GtkSeparatorToolItemPrivate *priv = separator->priv;
++
++  if (priv->event_window)
++    {
++      gdk_window_set_user_data (priv->event_window, NULL);
++      gdk_window_destroy (priv->event_window);
++      priv->event_window = NULL;
++    }
++
++  GTK_WIDGET_CLASS (gtk_separator_tool_item_parent_class)->unrealize (widget);
++}
++
++static void
++gtk_separator_tool_item_map (GtkWidget *widget)
++{
++  GtkSeparatorToolItem *separator = GTK_SEPARATOR_TOOL_ITEM (widget);
++  GtkSeparatorToolItemPrivate *priv = separator->priv;
++
++  GTK_WIDGET_CLASS (gtk_separator_tool_item_parent_class)->map (widget);
++
++  if (priv->event_window)
++    gdk_window_show (priv->event_window);
++}
++
++static void
++gtk_separator_tool_item_unmap (GtkWidget *widget)
++{
++  GtkSeparatorToolItem *separator = GTK_SEPARATOR_TOOL_ITEM (widget);
++  GtkSeparatorToolItemPrivate *priv = separator->priv;
++
++  if (priv->event_window)
++    gdk_window_hide (priv->event_window);
++
++  GTK_WIDGET_CLASS (gtk_separator_tool_item_parent_class)->unmap (widget);
++}
++
++static gboolean
++gtk_separator_tool_item_button_event (GtkWidget      *widget,
++                                      GdkEventButton *event)
++{
++  GtkSeparatorToolItem *separator = GTK_SEPARATOR_TOOL_ITEM (widget);
++  GtkSeparatorToolItemPrivate *priv = separator->priv;
++
++  /* We want window dragging to work on empty toolbar areas,
++   * so we only eat button events on visible separators
++   */
++  return priv->draw;
++}
++
++#define DEFAULT_SPACE_SIZE  12
++#define DEFAULT_SPACE_STYLE GTK_TOOLBAR_SPACE_LINE
++#define SPACE_LINE_DIVISION 10.0
++#define SPACE_LINE_START    2.0
++#define SPACE_LINE_END      8.0
++
+ static gboolean
+ gtk_separator_tool_item_expose (GtkWidget      *widget,
+ 				GdkEventExpose *event)
+Index: b/gtk/gtktoolbar.c
+===================================================================
+--- a/gtk/gtktoolbar.c
++++ b/gtk/gtktoolbar.c
+@@ -2701,6 +2701,8 @@
+ gtk_toolbar_button_press (GtkWidget      *toolbar,
+     			  GdkEventButton *event)
+ {
++  GtkWidget *window;
++
+   if (_gtk_button_event_triggers_context_menu (event))
+     {
+       gboolean return_value;
+@@ -2711,7 +2713,29 @@
+       
+       return return_value;
+     }
+-  
++
++  window = gtk_widget_get_toplevel (toolbar);
++
++  if (window)
++    {
++      gboolean window_drag = FALSE;
++
++      gtk_widget_style_get (toolbar,
++                            "window-dragging", &window_drag,
++                            NULL);
++
++      if (window_drag)
++        {
++          gtk_window_begin_move_drag (GTK_WINDOW (window),
++                                      event->button,
++                                      event->x_root,
++                                      event->y_root,
++                                      event->time);
++
++          return TRUE;
++        }
++    }
++
+   return FALSE;
+ }
+ 
+Index: b/gtk/gtkwidget.c
+===================================================================
+--- a/gtk/gtkwidget.c
++++ b/gtk/gtkwidget.c
+@@ -2466,6 +2466,13 @@
+ 							       P_("Aspect ratio with which to draw insertion cursor"),
+ 							       0.0, 1.0, 0.04,
+ 							       GTK_PARAM_READABLE));
++  gtk_widget_class_install_style_property (klass,
++					   g_param_spec_boolean ("window-dragging",
++							       P_("Window dragging"),
++							       P_("Whether windows can be dragged by clicking on empty areas"),
++							       FALSE,
++							       GTK_PARAM_READWRITE));
++
+ 
+   /**
+    * GtkWidget:draw-border:
diff -pruN 2.24.33-6/debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch 2.24.33-6ubuntu3/debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch
--- 2.24.33-6/debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/print-dialog-show-options-of-remote-dnssd-printers.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,37 @@
+--- a/modules/printbackends/cups/gtkprintbackendcups.c
++++ b/modules/printbackends/cups/gtkprintbackendcups.c
+@@ -2189,6 +2189,14 @@
+ 
+ }
+ 
++/* This is a private CUPS function, naughty us */
++
++extern const char       *_httpResolveURI(const char *uri, char *resolved_uri,
++                                         size_t resolved_size, int options,
++                                         int (*cb)(void *context),
++                                         void *context);
++
++
+ static GtkPrinter*
+ cups_create_printer (GtkPrintBackendCups *cups_backend,
+ 		     PrinterSetupInfo *info)
+@@ -2242,6 +2250,19 @@
+ 		resource);
+ #endif
+ 
++  if (strncmp (method, "dnssd", 5) == 0)
++    {
++      _httpResolveURI(cups_printer->printer_uri,
++		      uri, sizeof(uri), 0, NULL, NULL);
++      httpSeparateURI (HTTP_URI_CODING_ALL,
++		       uri,
++		       method, sizeof (method),
++		       username, sizeof (username),
++		       hostname, sizeof (hostname),
++		       &port,
++		       resource, sizeof (resource));
++    }
++
+   if (strncmp (resource, "/printers/", 10) == 0)
+     {
+       cups_printer->ppd_name = g_strdup (resource + 10);
diff -pruN 2.24.33-6/debian/patches/series 2.24.33-6ubuntu3/debian/patches/series
--- 2.24.33-6/debian/patches/series	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/series	2025-09-18 13:56:14.000000000 +0000
@@ -1,10 +1,26 @@
 004_gtk+-ximian-gtk2-filesel-navbutton-5.patch
 005_support_disabling_x11_extensions.patch
+012_ubuntu-set-grab-add.patch
 015_default-fallback-icon-theme.patch
 042_treeview_single-focus.patch
 044_tracker_fts.patch
 060_ignore-random-icons.patch
 061_use_pdf_as_default_printing_standard.patch
+062_dnd_menubar.patch
+063_treeview_almost_fixed.patch
+071_no_offscreen_widgets_grabbing.patch
+090_logging_file_saves.patch
+092_default_to_xdg_document_dir.patch
+093_gtk3_gtkimage_fallbacks_use.patch
+096_git_gtkprintsettings.patch
+097_statusicon_image_fallback.patch
+099_printer_filename_fix.patch
+100_overlay_scrollbar_loading.patch
+print-dialog-show-options-of-remote-dnssd-printers.patch
+gtk-shell-shows-menubar.patch
+backport_search_printer_location.patch
+menubar_toolbar_dragging.patch
+use-secrets-service-for-cups-auth_info.patch
 Reinstate-marshallers-that-accidentally-became-part-of-th.patch
 d-i/textlayout-Clamp-width-to-the-value-we-asked-for-as-a-hac.patch
 Check-for-attribute-availability-before-accessing-it.patch
diff -pruN 2.24.33-6/debian/patches/use-secrets-service-for-cups-auth_info.patch 2.24.33-6ubuntu3/debian/patches/use-secrets-service-for-cups-auth_info.patch
--- 2.24.33-6/debian/patches/use-secrets-service-for-cups-auth_info.patch	1970-01-01 00:00:00.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/patches/use-secrets-service-for-cups-auth_info.patch	2025-09-18 13:56:14.000000000 +0000
@@ -0,0 +1,1567 @@
+Description: Use secrets service for cups auth_info
+ When a printer requires auth_info (e.g. a printer connected
+ over the samba protocol) it is now possible to save the
+ credentials necessary for printing if a secrets service
+ is available over dbus.
+ The auth_info is then stored / loaded from the default
+ collection of that secrets service.
+ If no such service is available the user is not shown
+ the option to remember the password and the behavior
+ remains the same as before.
+ .
+ gtk+2.0 (2.24.25-0ubuntu2) vivid; urgency=medium
+ .
+   * debian/patches/use-secrets-service-for-cups-auth_info.patch
+     - Backport of auth_info storing (LP: #445333)
+Author: Andre Heinecke <aheinecke@intevation.de>
+Origin: upstream, https://git.gnome.org/browse/gtk+/commit/?id=382d68ff8e5701a10aa8d4f879c46c63c21e075f
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/445333
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=674264
+
+Index: b/gtk/gtkmarshalers.list
+===================================================================
+--- a/gtk/gtkmarshalers.list
++++ b/gtk/gtkmarshalers.list
+@@ -111,4 +111,3 @@
+ VOID:UINT,UINT
+ VOID:VOID
+ OBJECT:OBJECT,INT,INT
+-VOID:POINTER,POINTER,POINTER,POINTER,STRING
+Index: b/gtk/gtkprintbackend.c
+===================================================================
+--- a/gtk/gtkprintbackend.c
++++ b/gtk/gtkprintbackend.c
+@@ -51,6 +51,7 @@
+   GtkPrintBackendStatus status;
+   char **auth_info_required;
+   char **auth_info;
++  gboolean store_auth_info;
+ };
+ 
+ enum {
+@@ -366,7 +367,8 @@
+                                                                     gpointer             auth_info_default,
+                                                                     gpointer             auth_info_display,
+                                                                     gpointer             auth_info_visible,
+-                                                                    const gchar         *prompt);
++                                                                    const gchar         *prompt,
++                                                                    gboolean             can_store_auth_info);
+   
+ static void
+ gtk_print_backend_class_init (GtkPrintBackendClass *class)
+@@ -445,9 +447,9 @@
+ 		  G_TYPE_FROM_CLASS (class),
+ 		  G_SIGNAL_RUN_LAST,
+ 		  G_STRUCT_OFFSET (GtkPrintBackendClass, request_password),
+-		  NULL, NULL,
+-		  _gtk_marshal_VOID__POINTER_POINTER_POINTER_POINTER_STRING,
+-		  G_TYPE_NONE, 5, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_STRING);
++		  NULL, NULL, NULL,
++		  G_TYPE_NONE, 6, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER,
++		  G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN);
+ }
+ 
+ static void
+@@ -670,12 +672,24 @@
+ void 
+ gtk_print_backend_set_password (GtkPrintBackend  *backend,
+                                 gchar           **auth_info_required,
+-                                gchar           **auth_info)
++                                gchar           **auth_info,
++                                gboolean          store_auth_info)
+ {
+   g_return_if_fail (GTK_IS_PRINT_BACKEND (backend));
+ 
+   if (GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password)
+-    GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password (backend, auth_info_required, auth_info);
++    GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password (backend,
++                                                         auth_info_required,
++                                                         auth_info,
++                                                         store_auth_info);
++}
++
++static void
++store_auth_info_toggled (GtkCheckButton *chkbtn,
++                         gpointer        user_data)
++{
++  gboolean *data = (gboolean *) user_data;
++  *data = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chkbtn));
+ }
+ 
+ static void
+@@ -702,9 +716,9 @@
+   gint i;
+ 
+   if (response_id == GTK_RESPONSE_OK)
+-    gtk_print_backend_set_password (backend, priv->auth_info_required, priv->auth_info);
++    gtk_print_backend_set_password (backend, priv->auth_info_required, priv->auth_info, priv->store_auth_info);
+   else
+-    gtk_print_backend_set_password (backend, priv->auth_info_required, NULL);
++    gtk_print_backend_set_password (backend, priv->auth_info_required, NULL, FALSE);
+ 
+   for (i = 0; i < g_strv_length (priv->auth_info_required); i++)
+     if (priv->auth_info[i] != NULL)
+@@ -729,10 +743,11 @@
+                   gpointer          auth_info_default,
+                   gpointer          auth_info_display,
+                   gpointer          auth_info_visible,
+-                  const gchar      *prompt)
++                  const gchar      *prompt,
++                  gboolean          can_store_auth_info)
+ {
+   GtkPrintBackendPrivate *priv = backend->priv;
+-  GtkWidget *dialog, *box, *main_box, *label, *icon, *vbox, *entry;
++  GtkWidget *dialog, *box, *main_box, *label, *icon, *vbox, *entry, *chkbtn;
+   GtkWidget *focus = NULL;
+   gchar     *markup;
+   gint       length;
+@@ -745,6 +760,7 @@
+   priv->auth_info_required = g_strdupv (ai_required);
+   length = g_strv_length (ai_required);
+   priv->auth_info = g_new0 (gchar *, length + 1);
++  priv->store_auth_info = FALSE;
+ 
+   dialog = gtk_dialog_new_with_buttons ( _("Authentication"), NULL, GTK_DIALOG_MODAL, 
+                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+@@ -813,6 +829,16 @@
+         }
+     }
+ 
++  if (can_store_auth_info)
++    {
++      chkbtn = gtk_check_button_new_with_mnemonic (_("_Remember password"));
++      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chkbtn), FALSE);
++      gtk_box_pack_start (GTK_BOX (vbox), chkbtn, FALSE, FALSE, 6);
++      g_signal_connect (chkbtn, "toggled",
++                        G_CALLBACK (store_auth_info_toggled),
++                        &(priv->store_auth_info));
++    }
++
+   if (focus != NULL)
+     {
+       gtk_widget_grab_focus (focus);
+Index: b/gtk/gtkprintbackend.h
+===================================================================
+--- a/gtk/gtkprintbackend.h
++++ b/gtk/gtkprintbackend.h
+@@ -125,12 +125,14 @@
+                                                               gpointer             auth_info_default,
+                                                               gpointer             auth_info_display,
+                                                               gpointer             auth_info_visible,
+-                                                              const gchar         *prompt);
++                                                              const gchar         *prompt,
++                                                              gboolean             can_store_auth_info);
+ 
+   /* not a signal */
+   void                  (*set_password)                      (GtkPrintBackend     *backend,
+                                                               gchar              **auth_info_required,
+-                                                              gchar              **auth_info);
++                                                              gchar              **auth_info,
++                                                              gboolean             store_auth_info);
+ 
+   /* Padding for future expansion */
+   void (*_gtk_reserved1) (void);
+@@ -155,7 +157,8 @@
+ void        gtk_print_backend_destroy              (GtkPrintBackend         *print_backend);
+ void        gtk_print_backend_set_password         (GtkPrintBackend         *backend, 
+                                                     gchar                  **auth_info_required,
+-                                                    gchar                  **auth_info);
++                                                    gchar                  **auth_info,
++                                                    gboolean                 can_store_auth_info);
+ 
+ /* Backend-only functions for GtkPrintBackend */
+ 
+Index: b/modules/printbackends/cups/Makefile.am
+===================================================================
+--- a/modules/printbackends/cups/Makefile.am
++++ b/modules/printbackends/cups/Makefile.am
+@@ -27,12 +27,14 @@
+ libprintbackend_cups_la_SOURCES =	\
+ 	gtkprintbackendcups.c		\
+ 	gtkprintercups.c		\
+-	gtkcupsutils.c
++	gtkcupsutils.c			\
++	gtkcupssecretsutils.c
+ 
+ noinst_HEADERS =			\
+ 	gtkprintbackendcups.h		\
+ 	gtkprintercups.h		\
+-	gtkcupsutils.h
++	gtkcupsutils.h			\
++	gtkcupssecretsutils.h
+ 
+ libprintbackend_cups_la_LDFLAGS =  -avoid-version -module $(no_undefined)
+ libprintbackend_cups_la_LIBADD = $(LDADDS) $(CUPS_LIBS)
+Index: b/modules/printbackends/cups/gtkcupssecretsutils.c
+===================================================================
+--- /dev/null
++++ b/modules/printbackends/cups/gtkcupssecretsutils.c
+@@ -0,0 +1,1044 @@
++/* gtkcupssecretsutils.h: Helper to use a secrets service for printer passwords
++ * Copyright (C) 2014, Intevation GmbH
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <glib.h>
++#include <gio/gio.h>
++#include <string.h>
++
++#include <gtk/gtk.h>
++
++#include "gtkcupssecretsutils.h"
++
++#define SECRETS_BUS              "org.freedesktop.secrets"
++#define SECRETS_IFACE(interface) "org.freedesktop.Secret."interface
++#define SECRETS_PATH             "/org/freedesktop/secrets"
++#define SECRETS_TIMEOUT          5000
++
++typedef enum
++{
++  SECRETS_SERVICE_ACTION_QUERY,
++  SECRETS_SERVICE_ACTION_STORE
++} SecretsServiceAction;
++
++typedef struct
++{
++  GDBusConnection       *dbus_connection;
++  SecretsServiceAction   action;
++  gchar                **auth_info,
++                       **auth_info_labels,
++                       **auth_info_required,
++                        *printer_uri,
++                        *session_path,
++                        *collection_path;
++  GDBusProxy            *item_proxy;
++  guint                  prompt_subscription;
++} SecretsServiceData;
++
++/**
++ * create_attributes:
++ * @printer_uri: URI for the printer
++ * @additional_labels: Optional labels for additional attributes
++ * @additional_attrs: Optional additional attributes
++ *
++ * Creates a GVariant dictionary with key / value pairs that
++ * can be used to identify a secret item.
++ *
++ * Returns: A GVariant dictionary of string pairs or NULL on error.
++ */
++static GVariant *
++create_attributes (const gchar  *printer_uri,
++                   gchar       **additional_attrs,
++                   gchar       **additional_labels)
++{
++  GVariantBuilder *attr_builder = NULL;
++  GVariant        *ret = NULL;
++
++  if (printer_uri == NULL)
++    {
++      GTK_NOTE (PRINTING,
++                g_print ("create_attributes called with invalid parameters.\n"));
++      return NULL;
++    }
++
++  attr_builder = g_variant_builder_new (G_VARIANT_TYPE_DICTIONARY);
++  /* The printer uri is the main identifying part */
++  g_variant_builder_add (attr_builder, "{ss}", "uri", printer_uri);
++
++  if (additional_labels != NULL)
++    {
++      int i;
++      for (i = 0; additional_labels[i] != NULL; i++)
++        {
++          g_variant_builder_add (attr_builder, "{ss}",
++                                 additional_labels[i],
++                                 additional_attrs[i]);
++        }
++    }
++
++  ret = g_variant_builder_end (attr_builder);
++  g_variant_builder_unref (attr_builder);
++
++  return ret;
++}
++
++static void
++get_secret_cb (GObject      *source_object,
++               GAsyncResult *res,
++               gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++  GVariant           *output,
++                     *attributes;
++  gchar             **auth_info = NULL,
++                     *key = NULL,
++                     *value = NULL;
++  GVariantIter       *iter = NULL;
++  guint               i;
++  gint                pw_field = -1;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  output = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
++                                     res,
++                                     &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  attributes = g_dbus_proxy_get_cached_property (task_data->item_proxy,
++                                                 "Attributes");
++  if (attributes == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Failed to lookup attributes.\n"));
++      g_variant_unref (output);
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  /* Iterate over the attributes to fill the auth info */
++  g_variant_get (attributes, "a{ss}", &iter);
++
++  auth_info = g_new0 (gchar *,
++                      g_strv_length (task_data->auth_info_required) + 1);
++
++  while (g_variant_iter_loop (iter, "{ss}", &key, &value))
++    {
++      /* Match attributes with required auth info */
++      for (i = 0; task_data->auth_info_required[i] != NULL; i++)
++        {
++          if ((strcmp (key, "user") == 0 ||
++               strcmp (key, "username") == 0) &&
++              strcmp (task_data->auth_info_required[i],
++                      "username") == 0)
++            {
++              auth_info[i] = g_strdup (value);
++            }
++          else if (strcmp (key, "domain") == 0 &&
++                   strcmp (task_data->auth_info_required[i], "domain") == 0)
++            {
++              auth_info[i] = g_strdup (value);
++            }
++          else if ((strcmp (key, "hostname") == 0 ||
++                    strcmp (key, "server") == 0 ) &&
++                   strcmp (task_data->auth_info_required[i], "hostname") == 0)
++            {
++              auth_info[i] = g_strdup (value);
++            }
++          else if (strcmp (task_data->auth_info_required[i], "password") == 0)
++            {
++              pw_field = i;
++            }
++        }
++    }
++
++  if (pw_field == -1)
++    {
++      /* should not happen... */
++      GTK_NOTE (PRINTING, g_print ("No password required?.\n"));
++      g_variant_unref (output);
++      goto fail;
++    }
++  else
++    {
++      GVariant      *secret,
++                    *s_value;
++      gconstpointer  ba_passwd = NULL;
++      gsize          len = 0;
++
++      secret = g_variant_get_child_value (output, 0);
++      g_variant_unref (output);
++      if (secret == NULL || g_variant_n_children (secret) != 4)
++        {
++          GTK_NOTE (PRINTING, g_print ("Get secret response invalid.\n"));
++          if (secret != NULL)
++            g_variant_unref (secret);
++          goto fail;
++        }
++      s_value = g_variant_get_child_value (secret, 2);
++      ba_passwd = g_variant_get_fixed_array (s_value,
++                                             &len,
++                                             sizeof (guchar));
++
++      g_variant_unref (secret);
++
++      if (ba_passwd == NULL || strlen (ba_passwd) > len + 1)
++        {
++          /* No secret or the secret is not a zero terminated value */
++          GTK_NOTE (PRINTING, g_print ("Invalid secret.\n"));
++          g_variant_unref (s_value);
++          goto fail;
++        }
++
++      auth_info[pw_field] = g_strndup (ba_passwd, len);
++      g_variant_unref (s_value);
++    }
++
++  for (i = 0; task_data->auth_info_required[i] != NULL; i++)
++    {
++      if (auth_info[i] == NULL)
++        {
++          /* Error out if we did not find everything */
++          GTK_NOTE (PRINTING, g_print ("Failed to lookup required attribute: %s.\n",
++                                       task_data->auth_info_required[i]));
++          goto fail;
++        }
++    }
++
++  g_task_return_pointer (task, auth_info, NULL);
++  return;
++
++fail:
++  /* Error out */
++  GTK_NOTE (PRINTING, g_print ("Failed to lookup secret.\n"));
++  for (i = 0; i < g_strv_length (task_data->auth_info_required); i++)
++    {
++      /* Not all fields of auth_info are neccessarily written so we can not
++         use strfreev here */
++      g_free (auth_info[i]);
++    }
++  g_free (auth_info);
++  g_task_return_pointer (task, NULL, NULL);
++}
++
++static void
++create_item_cb (GObject      *source_object,
++                GAsyncResult *res,
++                gpointer      user_data)
++{
++  GTask    *task;
++  GError   *error = NULL;
++  GVariant *output;
++  gchar    *item = NULL;
++
++  task = user_data;
++
++  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
++                                          res,
++                                          &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  g_variant_get (output, "(&o&o)", &item, NULL);
++  if (item != NULL && strlen (item) > 1)
++    {
++      GTK_NOTE (PRINTING, g_print ("Successfully stored auth info.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++  g_variant_unref (output);
++}
++
++static void
++do_store_auth_info (GTask *task)
++{
++  GVariant            *attributes = NULL,
++                      *properties = NULL,
++                      *secret = NULL;
++  gchar              **additional_attrs = NULL,
++                     **additional_labels = NULL,
++                      *password = NULL;
++  SecretsServiceData  *task_data = g_task_get_task_data (task);
++  guint                i,
++                       length,
++                       additional_count = 0;
++  GVariantBuilder     *prop_builder = NULL;
++
++  length = g_strv_length (task_data->auth_info_labels);
++
++  additional_attrs = g_new0 (gchar *, length + 1);
++  additional_labels = g_new0 (gchar *, length + 1);
++  /* The labels user and server are chosen to be compatible with
++     the attributes used by system-config-printer */
++  for (i = 0; task_data->auth_info_labels[i] != NULL; i++)
++    {
++      if (g_strcmp0 (task_data->auth_info_labels[i], "username") == 0)
++        {
++          additional_attrs[additional_count] = task_data->auth_info[i];
++          additional_labels[additional_count++] = "user";
++        }
++      else if (g_strcmp0 (task_data->auth_info_labels[i], "hostname") == 0)
++        {
++          additional_attrs[additional_count] = task_data->auth_info[i];
++          additional_labels[additional_count++] = "server";
++        }
++      else if (g_strcmp0 (task_data->auth_info_labels[i], "password") == 0)
++        {
++          password = task_data->auth_info[i];
++        }
++    }
++
++  attributes = create_attributes (task_data->printer_uri,
++                                  additional_attrs,
++                                  additional_labels);
++  g_free (additional_labels);
++  g_free (additional_attrs);
++  if (attributes == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Failed to create attributes.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  if (password == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("No secret to store.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  prop_builder = g_variant_builder_new (G_VARIANT_TYPE_DICTIONARY);
++
++  g_variant_builder_add (prop_builder, "{sv}", SECRETS_IFACE ("Item.Label"),
++                         g_variant_new_string (task_data->printer_uri));
++  g_variant_builder_add (prop_builder, "{sv}", SECRETS_IFACE ("Item.Attributes"),
++                         attributes);
++
++  properties = g_variant_builder_end (prop_builder);
++
++  g_variant_builder_unref (prop_builder);
++
++  secret = g_variant_new ("(oay@ays)",
++                          task_data->session_path,
++                          NULL,
++                          g_variant_new_bytestring (password),
++                          "text/plain");
++
++  g_dbus_connection_call (task_data->dbus_connection,
++                          SECRETS_BUS,
++                          task_data->collection_path,
++                          SECRETS_IFACE ("Collection"),
++                          "CreateItem",
++                          g_variant_new ("(@a{sv}@(oayays)b)",
++                                         properties,
++                                         secret,
++                                         TRUE),
++                          G_VARIANT_TYPE ("(oo)"),
++                          G_DBUS_CALL_FLAGS_NONE,
++                          SECRETS_TIMEOUT,
++                          g_task_get_cancellable (task),
++                          create_item_cb,
++                          task);
++}
++
++static void
++prompt_completed_cb (GDBusConnection *connection,
++                     const gchar     *sender_name,
++                     const gchar     *object_path,
++                     const gchar     *interface_name,
++                     const gchar     *signal_name,
++                     GVariant        *parameters,
++                     gpointer         user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GVariant           *dismissed;
++  gboolean            is_dismissed = TRUE;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  g_dbus_connection_signal_unsubscribe (task_data->dbus_connection,
++                                        task_data->prompt_subscription);
++  task_data->prompt_subscription = 0;
++
++  dismissed = g_variant_get_child_value (parameters, 0);
++
++  if (dismissed == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Invalid prompt signal.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  g_variant_get (dismissed, "b", &is_dismissed);
++  g_variant_unref (dismissed);
++
++  if (is_dismissed)
++    {
++      GTK_NOTE (PRINTING, g_print ("Collection unlock dismissed.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  /* Prompt successfull, proceed to get or store secret */
++  switch (task_data->action)
++    {
++      case SECRETS_SERVICE_ACTION_STORE:
++        do_store_auth_info (task);
++        break;
++
++      case SECRETS_SERVICE_ACTION_QUERY:
++        g_dbus_proxy_call (task_data->item_proxy,
++                           "GetSecret",
++                           g_variant_new ("(o)",
++                                          task_data->session_path),
++                           G_DBUS_CALL_FLAGS_NONE,
++                           SECRETS_TIMEOUT,
++                           g_task_get_cancellable (task),
++                           get_secret_cb,
++                           task);
++        break;
++    }
++}
++
++static void
++prompt_cb (GObject      *source_object,
++           GAsyncResult *res,
++           gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++  GVariant           *output;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
++                                          res,
++                                          &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  g_variant_unref (output);
++
++  /* Connect to the prompt's completed signal */
++  task_data->prompt_subscription =
++    g_dbus_connection_signal_subscribe (task_data->dbus_connection,
++                                        NULL,
++                                        SECRETS_IFACE ("Prompt"),
++                                        "Completed",
++                                        NULL,
++                                        NULL,
++                                        G_DBUS_SIGNAL_FLAGS_NONE,
++                                        prompt_completed_cb,
++                                        task,
++                                        NULL);
++}
++
++static void
++unlock_collection_cb (GObject      *source_object,
++                      GAsyncResult *res,
++                      gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++  GVariant           *output;
++  const gchar        *prompt_path;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
++                                          res,
++                                          &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  g_variant_get (output, "(@ao&o)", NULL, &prompt_path);
++
++  if (prompt_path != NULL && strlen (prompt_path) > 1)
++    {
++      g_dbus_connection_call (task_data->dbus_connection,
++                              SECRETS_BUS,
++                              prompt_path,
++                              SECRETS_IFACE ("Prompt"),
++                              "Prompt",
++                              g_variant_new ("(s)", "0"),
++                              G_VARIANT_TYPE ("()"),
++                              G_DBUS_CALL_FLAGS_NONE,
++                              SECRETS_TIMEOUT,
++                              g_task_get_cancellable (task),
++                              prompt_cb,
++                              task);
++    }
++  else
++    {
++      switch (task_data->action)
++        {
++          case SECRETS_SERVICE_ACTION_STORE:
++            do_store_auth_info (task);
++            break;
++
++          case SECRETS_SERVICE_ACTION_QUERY:
++            /* Prompt successfull proceed to get secret */
++            g_dbus_proxy_call (task_data->item_proxy,
++                               "GetSecret",
++                               g_variant_new ("(o)",
++                                              task_data->session_path),
++                               G_DBUS_CALL_FLAGS_NONE,
++                               SECRETS_TIMEOUT,
++                               g_task_get_cancellable (task),
++                               get_secret_cb,
++                               task);
++            break;
++        }
++    }
++  g_variant_unref (output);
++}
++
++static void
++unlock_read_alias_cb (GObject      *source_object,
++                      GAsyncResult *res,
++                      gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++  GVariant           *output,
++                     *subresult;
++  gsize               path_len = 0;
++  const gchar        *collection_path;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
++                                          res,
++                                          &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  subresult = g_variant_get_child_value (output, 0);
++  g_variant_unref (output);
++
++  if (subresult == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Invalid ReadAlias response.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  collection_path = g_variant_get_string (subresult, &path_len);
++
++  const gchar * const to_unlock[] =
++  {
++    collection_path, NULL
++  };
++
++  task_data->collection_path = g_strdup (collection_path);
++
++  g_dbus_connection_call (task_data->dbus_connection,
++                          SECRETS_BUS,
++                          SECRETS_PATH,
++                          SECRETS_IFACE ("Service"),
++                          "Unlock",
++                          g_variant_new ("(^ao)", to_unlock),
++                          G_VARIANT_TYPE ("(aoo)"),
++                          G_DBUS_CALL_FLAGS_NONE,
++                          SECRETS_TIMEOUT,
++                          g_task_get_cancellable (task),
++                          unlock_collection_cb,
++                          task);
++
++  g_variant_unref (subresult);
++}
++
++static void
++item_proxy_cb (GObject      *source_object,
++               GAsyncResult *res,
++               gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++  GDBusProxy         *item_proxy;
++  GVariant           *locked;
++  gboolean            is_locked;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  item_proxy = g_dbus_proxy_new_finish (res,
++                                        &error);
++  if (item_proxy == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  task_data->item_proxy = item_proxy;
++
++  locked = g_dbus_proxy_get_cached_property (item_proxy, "Locked");
++
++  if (locked == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Failed to look up \"Locked\" property on item.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  g_variant_get (locked, "b", &is_locked);
++  g_variant_unref (locked);
++
++  if (is_locked)
++    {
++      /* Go down the unlock -> lookup path */
++      g_dbus_connection_call (task_data->dbus_connection,
++                              SECRETS_BUS,
++                              SECRETS_PATH,
++                              SECRETS_IFACE ("Service"),
++                              "ReadAlias",
++                              g_variant_new ("(s)", "default"),
++                              G_VARIANT_TYPE ("(o)"),
++                              G_DBUS_CALL_FLAGS_NONE,
++                              SECRETS_TIMEOUT,
++                              g_task_get_cancellable (task),
++                              unlock_read_alias_cb,
++                              task);
++      return;
++    }
++
++  /* Unlocked proceed to get or store secret */
++  switch (task_data->action)
++    {
++      case SECRETS_SERVICE_ACTION_STORE:
++        do_store_auth_info (task);
++        break;
++
++      case SECRETS_SERVICE_ACTION_QUERY:
++        g_dbus_proxy_call (item_proxy,
++                           "GetSecret",
++                           g_variant_new ("(o)",
++                                          task_data->session_path),
++                           G_DBUS_CALL_FLAGS_NONE,
++                           SECRETS_TIMEOUT,
++                           g_task_get_cancellable (task),
++                           get_secret_cb,
++                           task);
++        break;
++    }
++}
++
++static void
++search_items_cb (GObject      *source_object,
++                 GAsyncResult *res,
++                 gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++  GVariant           *output;
++  gsize               array_cnt,
++                      i;
++  gboolean            found_item = FALSE;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
++                                          res,
++                                          &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  array_cnt = g_variant_n_children (output);
++
++  for (i = 0; i < array_cnt; i++)
++    {
++      GVariant * const   item_paths = g_variant_get_child_value (output, i);
++      const gchar      **items = NULL;
++
++      if (item_paths == NULL)
++        {
++          GTK_NOTE (PRINTING,
++                    g_print ("SearchItems returned invalid result.\n"));
++          continue;
++        }
++
++      items = g_variant_get_objv (item_paths, NULL);
++
++      if (*items == NULL)
++        {
++          g_variant_unref (item_paths);
++          g_free ((gpointer) items);
++          continue;
++        }
++
++      /* Access the first found item. */
++      found_item = TRUE;
++      g_dbus_proxy_new (task_data->dbus_connection,
++                        G_DBUS_PROXY_FLAGS_NONE,
++                        NULL,
++                        SECRETS_BUS,
++                        *items,
++                        SECRETS_IFACE ("Item"),
++                        g_task_get_cancellable (task),
++                        item_proxy_cb,
++                        task);
++      g_free ((gpointer) items);
++      g_variant_unref (item_paths);
++      break;
++    }
++  g_variant_unref (output);
++
++  if (!found_item)
++    {
++      GTK_NOTE (PRINTING, g_print ("No match found in secrets service.\n"));
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++}
++
++static void
++open_session_cb (GObject      *source_object,
++                 GAsyncResult *res,
++                 gpointer      user_data)
++{
++  GTask              *task;
++  GVariant           *output,
++                     *session_variant;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
++                                          res,
++                                          &error);
++  if (output == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  session_variant = g_variant_get_child_value (output, 1);
++
++  if (session_variant == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Invalid session path response.\n"));
++      g_variant_unref (output);
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  task_data->session_path = g_variant_dup_string (session_variant, NULL);
++
++  if (task_data->session_path == NULL)
++    {
++      GTK_NOTE (PRINTING, g_print ("Invalid session path string value.\n"));
++      g_variant_unref (session_variant);
++      g_variant_unref (output);
++      g_task_return_pointer (task, NULL, NULL);
++      return;
++    }
++
++  g_variant_unref (session_variant);
++  g_variant_unref (output);
++
++  switch (task_data->action)
++    {
++      case SECRETS_SERVICE_ACTION_QUERY:
++        {
++          /* Search for the secret item */
++          GVariant *secrets_attrs;
++
++          secrets_attrs = create_attributes (task_data->printer_uri, NULL, NULL);
++          if (secrets_attrs == NULL)
++            {
++              GTK_NOTE (PRINTING, g_print ("Failed to create attributes.\n"));
++              g_task_return_pointer (task, NULL, NULL);
++              return;
++            }
++
++          g_dbus_connection_call (task_data->dbus_connection,
++                                  SECRETS_BUS,
++                                  SECRETS_PATH,
++                                  SECRETS_IFACE ("Service"),
++                                  "SearchItems",
++                                  g_variant_new ("(@a{ss})", secrets_attrs),
++                                  G_VARIANT_TYPE ("(aoao)"),
++                                  G_DBUS_CALL_FLAGS_NONE,
++                                  SECRETS_TIMEOUT,
++                                  g_task_get_cancellable (task),
++                                  search_items_cb,
++                                  task);
++          break;
++        }
++
++      case SECRETS_SERVICE_ACTION_STORE:
++        {
++          /* Look up / unlock the default collection for storing */
++          g_dbus_connection_call (task_data->dbus_connection,
++                                  SECRETS_BUS,
++                                  SECRETS_PATH,
++                                  SECRETS_IFACE ("Service"),
++                                  "ReadAlias",
++                                  g_variant_new ("(s)", "default"),
++                                  G_VARIANT_TYPE ("(o)"),
++                                  G_DBUS_CALL_FLAGS_NONE,
++                                  SECRETS_TIMEOUT,
++                                  g_task_get_cancellable (task),
++                                  unlock_read_alias_cb,
++                                  task);
++          break;
++        }
++    }
++}
++
++static void
++get_connection_cb (GObject      *source_object,
++                   GAsyncResult *res,
++                   gpointer      user_data)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++  GError             *error = NULL;
++
++  task = user_data;
++  task_data = g_task_get_task_data (task);
++
++  task_data->dbus_connection = g_bus_get_finish (res, &error);
++  if (task_data->dbus_connection == NULL)
++    {
++      g_task_return_error (task, error);
++      return;
++    }
++
++  /* Now open a session */
++  g_dbus_connection_call (task_data->dbus_connection,
++                          SECRETS_BUS,
++                          SECRETS_PATH,
++                          SECRETS_IFACE ("Service"),
++                          "OpenSession",
++                          g_variant_new ("(sv)", "plain",
++                                         g_variant_new_string ("")),
++                          G_VARIANT_TYPE ("(vo)"),
++                          G_DBUS_CALL_FLAGS_NONE,
++                          SECRETS_TIMEOUT,
++                          g_task_get_cancellable (task),
++                          open_session_cb,
++                          task);
++}
++
++/**
++ * gtk_cups_secrets_service_watch:
++ * @appeared: The callback to call when the service interface appears
++ * @vanished: The callback to call when the service interface vanishes
++ * @user_data: A reference to the watching printbackend
++ *
++ * Registers a watch for the secrets service interface.
++ *
++ * Returns: The watcher id
++ */
++guint
++gtk_cups_secrets_service_watch (GBusNameAppearedCallback appeared,
++                                GBusNameVanishedCallback vanished,
++                                gpointer                 user_data)
++{
++  return g_bus_watch_name (G_BUS_TYPE_SESSION,
++                           SECRETS_BUS,
++                           G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
++                           appeared,
++                           vanished,
++                           user_data,
++                           NULL);
++}
++
++void
++cleanup_task_data (gpointer data)
++{
++  gint                i;
++  SecretsServiceData *task_data = data;
++
++  g_free (task_data->collection_path);
++  g_strfreev (task_data->auth_info_labels);
++  g_strfreev (task_data->auth_info_required);
++  g_free (task_data->printer_uri);
++
++  if (task_data->auth_info != NULL)
++    {
++      for (i = 0; task_data->auth_info[i] != NULL; i++)
++        {
++          memset (task_data->auth_info[i], 0, strlen (task_data->auth_info[i]));
++          g_clear_pointer (&task_data->auth_info[i], g_free);
++        }
++      g_clear_pointer (&task_data->auth_info, g_free);
++    }
++
++  if (task_data->prompt_subscription != 0)
++    {
++      g_dbus_connection_signal_unsubscribe (task_data->dbus_connection,
++                                            task_data->prompt_subscription);
++      task_data->prompt_subscription = 0;
++    }
++
++  if (task_data->session_path != NULL)
++    {
++      g_dbus_connection_call (task_data->dbus_connection,
++                              SECRETS_BUS,
++                              task_data->session_path,
++                              SECRETS_IFACE ("Session"),
++                              "Close",
++                              NULL,
++                              G_VARIANT_TYPE ("()"),
++                              G_DBUS_CALL_FLAGS_NONE,
++                              SECRETS_TIMEOUT,
++                              NULL,
++                              NULL,
++                              NULL);
++    }
++
++  g_clear_object (&task_data->dbus_connection);
++  g_clear_pointer (&task_data->session_path, g_free);
++  g_clear_object (&task_data->item_proxy);
++}
++
++/**
++ * gtk_cups_secrets_service_query_task:
++ * @source_object: Source object for this task
++ * @cancellable: Cancellable to cancel this task
++ * @callback: Callback to call once the query is finished
++ * @user_data: The user_data passed to the callback
++ * @printer_uri: URI of the printer
++ * @auth_info_required: Info required for authentication
++ *
++ * Checks if a secrets service as described by the secrets-service standard
++ * is available and if so it tries to find the authentication info in the
++ * default collection of the service.
++ *
++ * This is the entry point to a chain of async calls to open a session,
++ * search the secret, unlock the collection (if necessary) and finally
++ * to lookup the secret.
++ *
++ * See: http://standards.freedesktop.org/secret-service/ for documentation
++ * of the used API.
++ */
++void
++gtk_cups_secrets_service_query_task (gpointer              source_object,
++                                     GCancellable         *cancellable,
++                                     GAsyncReadyCallback   callback,
++                                     gpointer              user_data,
++                                     const gchar          *printer_uri,
++                                     gchar               **auth_info_required)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++
++  task_data = g_new0 (SecretsServiceData, 1);
++  task_data->action = SECRETS_SERVICE_ACTION_QUERY;
++  task_data->printer_uri = g_strdup (printer_uri);
++  task_data->auth_info_required = g_strdupv (auth_info_required);
++
++  task = g_task_new (source_object, cancellable, callback, user_data);
++
++  g_task_set_task_data (task, task_data, cleanup_task_data);
++
++  g_bus_get (G_BUS_TYPE_SESSION, cancellable,
++             get_connection_cb, task);
++}
++
++static void
++store_done_cb (GObject      *source_object,
++               GAsyncResult *res,
++               gpointer      user_data)
++{
++  GTask  *task = (GTask *) res;
++  GError *error = NULL;
++
++  g_task_propagate_pointer (task, &error);
++
++  if (error != NULL)
++    {
++      GTK_NOTE (PRINTING,
++                g_print ("Failed to store auth info: %s\n", error->message));
++      g_error_free (error);
++    }
++
++  g_object_unref (task);
++  GTK_NOTE (PRINTING,
++            g_print ("gtk_cups_secrets_service_store finished.\n"));
++}
++
++/**
++ * gtk_cups_secrets_service_store:
++ * @auth_info: Auth info that should be stored
++ * @auth_info_labels: The keys to use for the auth info
++ * @printer_uri: URI of the printer
++ *
++ * Tries to store the auth_info in a secrets service.
++ */
++void
++gtk_cups_secrets_service_store (gchar       **auth_info,
++                                gchar       **auth_info_labels,
++                                const gchar  *printer_uri)
++{
++  GTask              *task;
++  SecretsServiceData *task_data;
++
++  if (auth_info == NULL || auth_info_labels == NULL || printer_uri == NULL)
++    {
++      GTK_NOTE (PRINTING,
++                g_print ("Invalid call to gtk_cups_secrets_service_store.\n"));
++      return;
++    }
++
++  task_data = g_new0 (SecretsServiceData, 1);
++  task_data->action = SECRETS_SERVICE_ACTION_STORE;
++  task_data->printer_uri = g_strdup (printer_uri);
++  task_data->auth_info = g_strdupv (auth_info);
++  task_data->auth_info_labels = g_strdupv (auth_info_labels);
++
++  task = g_task_new (NULL, NULL, store_done_cb, NULL);
++
++  g_task_set_task_data (task, task_data, cleanup_task_data);
++
++  g_bus_get (G_BUS_TYPE_SESSION, NULL,
++             get_connection_cb, task);
++}
+Index: b/modules/printbackends/cups/gtkcupssecretsutils.h
+===================================================================
+--- /dev/null
++++ b/modules/printbackends/cups/gtkcupssecretsutils.h
+@@ -0,0 +1,41 @@
++/* gtkcupssecretsutils.h: Helper to use a secrets service for printer passwords
++ * Copyright (C) 2014 Intevation GmbH
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
++ */
++#ifndef __GTK_SECRETS_UTILS_H__
++#define __GTK_SECRETS_UTILS_H__
++
++#include <glib.h>
++
++#include "gtkcupsutils.h"
++
++G_BEGIN_DECLS
++
++void  gtk_cups_secrets_service_query_task (gpointer                   source_object,
++                                           GCancellable              *cancellable,
++                                           GAsyncReadyCallback        callback,
++                                           gpointer                   user_data,
++                                           const gchar               *printer_uri,
++                                           gchar                    **auth_info_required);
++guint gtk_cups_secrets_service_watch      (GBusNameAppearedCallback   appeared,
++                                           GBusNameVanishedCallback   vanished,
++                                           gpointer                   user_data);
++void  gtk_cups_secrets_service_store      (gchar                    **auth_info,
++                                           gchar                    **auth_info_labels,
++                                           const gchar               *printer_uri);
++
++G_END_DECLS
++
++#endif /* __GTK_SECRETS_UTILS_H__ */
+Index: b/modules/printbackends/cups/gtkprintbackendcups.c
+===================================================================
+--- a/modules/printbackends/cups/gtkprintbackendcups.c
++++ b/modules/printbackends/cups/gtkprintbackendcups.c
+@@ -60,6 +60,7 @@
+ #include "gtkprintercups.h"
+ 
+ #include "gtkcupsutils.h"
++#include "gtkcupssecretsutils.h"
+ 
+ 
+ typedef struct _GtkPrintBackendCupsClass GtkPrintBackendCupsClass;
+@@ -152,6 +153,9 @@
+   gchar           *avahi_service_browser_paths[2];
+   GCancellable    *avahi_cancellable;
+ #endif
++  gboolean      secrets_service_available;
++  guint         secrets_service_watch_id;
++  GCancellable *secrets_service_cancellable;
+ };
+ 
+ static GObjectClass *backend_parent_class;
+@@ -212,16 +216,26 @@
+ 
+ static void                 gtk_print_backend_cups_set_password    (GtkPrintBackend                   *backend, 
+                                                                     gchar                            **auth_info_required,
+-                                                                    gchar                            **auth_info);
++                                                                    gchar                            **auth_info,
++                                                                    gboolean                           store_auth_info);
+ 
+ void                        overwrite_and_free                      (gpointer                          data);
+ static gboolean             is_address_local                        (const gchar                      *address);
+ static gboolean             request_auth_info                       (gpointer                          data);
++static void                 lookup_auth_info                        (gpointer                          data);
+ 
+ #ifdef HAVE_CUPS_API_1_6
+ static void                 avahi_request_printer_list              (GtkPrintBackendCups              *cups_backend);
+ #endif
+ 
++static void                 secrets_service_appeared_cb             (GDBusConnection *connection,
++                                                                     const gchar *name,
++                                                                     const gchar *name_owner,
++                                                                     gpointer user_data);
++static void                 secrets_service_vanished_cb             (GDBusConnection *connection,
++                                                                     const gchar *name,
++                                                                     gpointer user_data);
++
+ static void
+ gtk_print_backend_cups_register_type (GTypeModule *module)
+ {
+@@ -788,6 +802,13 @@
+ #endif
+ 
+   cups_get_local_default_printer (backend_cups);
++
++  backend_cups->secrets_service_available = FALSE;
++  backend_cups->secrets_service_cancellable = g_cancellable_new ();
++  backend_cups->secrets_service_watch_id =
++    gtk_cups_secrets_service_watch (secrets_service_appeared_cb,
++                                    secrets_service_vanished_cb,
++                                    backend_cups);
+ }
+ 
+ static void
+@@ -820,6 +841,12 @@
+   g_clear_object (&backend_cups->dbus_connection);
+ #endif
+ 
++  g_clear_object (&backend_cups->secrets_service_cancellable);
++  if (backend_cups->secrets_service_watch_id != 0)
++    {
++      g_bus_unwatch_name (backend_cups->secrets_service_watch_id);
++    }
++
+   backend_parent_class->finalize (object);
+ }
+ 
+@@ -935,7 +962,8 @@
+ static void
+ gtk_print_backend_cups_set_password (GtkPrintBackend  *backend,
+                                      gchar           **auth_info_required,
+-                                     gchar           **auth_info)
++                                     gchar           **auth_info,
++                                     gboolean          store_auth_info)
+ {
+   GtkPrintBackendCups *cups_backend = GTK_PRINT_BACKEND_CUPS (backend);
+   GList *l;
+@@ -970,7 +998,7 @@
+   cups_backend->username = g_strdup (username);
+ 
+   GTK_NOTE (PRINTING,
+-            g_print ("CUPS backend: storing password for %s\n", key));
++            g_print ("CUPS backend: caching password for %s\n", key));
+ 
+   for (l = cups_backend->requests; l; l = l->next)
+     {
+@@ -988,6 +1016,17 @@
+               for (i = 0; i < length; i++)
+                 dispatch->request->auth_info[i] = g_strdup (auth_info[i]);
+             }
++          /* Save the password if the user requested it */
++          if (password != NULL && store_auth_info)
++            {
++              const gchar *printer_uri =
++                  gtk_cups_request_ipp_get_string (dispatch->request,
++                                                   IPP_TAG_URI,
++                                                   "printer-uri");
++
++              gtk_cups_secrets_service_store (auth_info, auth_info_required,
++                                              printer_uri);
++            }
+           dispatch->backend->authentication_lock = FALSE;
+           dispatch->request->need_auth_info = FALSE;
+         }
+@@ -1115,8 +1154,9 @@
+       g_free (printer_name);
+ 
+       g_signal_emit_by_name (dispatch->backend, "request-password", 
+-                             auth_info_required, auth_info_default, auth_info_display, auth_info_visible, prompt);
+-
++                             auth_info_required, auth_info_default,
++                             auth_info_display, auth_info_visible, prompt,
++                             FALSE); /* Cups password is only cached not stored. */
+       g_free (prompt);
+     }
+ 
+@@ -1223,6 +1263,98 @@
+   return TRUE;
+ }
+ 
++static void
++lookup_auth_info_cb (GObject      *source_object,
++                     GAsyncResult *res,
++                     gpointer      user_data)
++{
++  GTask                      *task;
++  GtkPrintCupsDispatchWatch  *dispatch;
++  gchar                     **auth_info;
++  GError                     *error = NULL;
++  gint                        i;
++
++  task = (GTask *) res;
++  dispatch = user_data;
++  auth_info = g_task_propagate_pointer (task, &error);
++
++  if (auth_info == NULL)
++    {
++      if (error != NULL)
++        {
++          GTK_NOTE (PRINTING,
++                    g_print ("Failed to look up auth info: %s\n", error->message));
++          g_error_free (error);
++        }
++      else
++        {
++          /* Error note should have been shown by the function causing this */
++          GTK_NOTE (PRINTING, g_print ("Failed to look up auth info.\n"));
++        }
++      dispatch->backend->authentication_lock = FALSE;
++      g_object_unref (task);
++      request_auth_info (dispatch);
++      return;
++    }
++
++  gtk_print_backend_cups_set_password (GTK_PRINT_BACKEND (dispatch->backend),
++                                       dispatch->request->auth_info_required, auth_info,
++                                       FALSE);
++  for (i = 0; auth_info[i] != NULL; i++)
++    {
++      overwrite_and_free (auth_info[i]);
++      auth_info[i] = NULL;
++    }
++  g_clear_pointer (auth_info, g_free);
++
++  g_object_unref (task);
++}
++
++static void
++lookup_auth_info (gpointer user_data)
++{
++  GtkPrintCupsDispatchWatch  *dispatch;
++  gsize                       length,
++                              i;
++  gboolean                    need_secret_auth_info = FALSE;
++  const gchar                *printer_uri;
++
++  dispatch = user_data;
++
++  if (dispatch->backend->authentication_lock)
++    return;
++
++  length = g_strv_length (dispatch->request->auth_info_required);
++
++  for (i = 0; i < length; i++)
++    {
++      if (g_strcmp0 (dispatch->request->auth_info_required[i], "password") == 0)
++        {
++          need_secret_auth_info = TRUE;
++          break;
++        }
++    }
++
++  g_idle_add (check_auth_info, user_data);
++
++  if (dispatch->backend->secrets_service_available && need_secret_auth_info)
++    {
++      dispatch->backend->authentication_lock = TRUE;
++      printer_uri = gtk_cups_request_ipp_get_string (dispatch->request,
++                                                     IPP_TAG_URI,
++                                                     "printer-uri");
++      gtk_cups_secrets_service_query_task (dispatch->backend,
++                                           dispatch->backend->secrets_service_cancellable,
++                                           lookup_auth_info_cb,
++                                           dispatch,
++                                           printer_uri,
++                                           dispatch->request->auth_info_required);
++      return;
++    }
++
++  request_auth_info (user_data);
++}
++
+ static gboolean
+ request_auth_info (gpointer user_data)
+ {
+@@ -1299,7 +1431,8 @@
+                          auth_info_default,
+                          auth_info_display,
+                          auth_info_visible,
+-                         prompt);
++                         prompt,
++                         dispatch->backend->secrets_service_available);
+ 
+   for (i = 0; i < length; i++)
+     {
+@@ -1312,8 +1445,6 @@
+   g_free (printer_name);
+   g_free (prompt);
+ 
+-  g_idle_add (check_auth_info, user_data);
+-
+   return FALSE;
+ }
+ 
+@@ -1514,7 +1645,7 @@
+     {
+       dispatch->callback = callback;
+       dispatch->callback_data = user_data;
+-      request_auth_info (dispatch);
++      lookup_auth_info (dispatch);
+     }
+   else
+     {
+@@ -5783,3 +5914,24 @@
+ 
+   return capabilities;
+ }
++
++static void
++secrets_service_appeared_cb (GDBusConnection *connection,
++                             const gchar     *name,
++                             const gchar     *name_owner,
++                             gpointer         user_data)
++{
++  GtkPrintBackendCups *backend = GTK_PRINT_BACKEND_CUPS (user_data);
++
++  backend->secrets_service_available = TRUE;
++}
++
++static void
++secrets_service_vanished_cb (GDBusConnection *connection,
++                             const gchar     *name,
++                             gpointer         user_data)
++{
++  GtkPrintBackendCups *backend = GTK_PRINT_BACKEND_CUPS (user_data);
++
++  backend->secrets_service_available = FALSE;
++}
diff -pruN 2.24.33-6/debian/rules 2.24.33-6ubuntu3/debian/rules
--- 2.24.33-6/debian/rules	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/rules	2025-09-18 15:06:55.000000000 +0000
@@ -29,6 +29,19 @@ endif
 # default CFLAGS; these can be expanded with $(call flavor_get, )
 CFLAGS += -Wall -g -O$(if $(findstring noopt,$(DEB_BUILD_OPTIONS)),0,2)
 
+# LP: #2124953. Building with GCC 15 fails with:
+#
+# ../../../../gtk/gtkitemfactory.c: In function 'IA__gtk_item_factory_create_menu_entries':
+# ../../../../gtk/gtkitemfactory.c:1187:22: error: assignment to 'GtkItemFactoryCallback' {aka 'void (*)(void)'}
+# from incompatible pointer type 'GtkMenuCallback' {aka 'void (*)(struct _GtkWidget *, void *)'} [-Wincompatible-pointer-types]
+# 1187 | entry.callback = entries[i].callback;
+#      | ^
+#
+# There is no good way to fix this without breaking compatibility (see the
+# comment near the top of gtkitemfactory.h), so continue to build with
+# -std=gnu17.
+CFLAGS += -std=gnu17
+
 # default LDFLAGS; these can be expanded with $(call flavor_get, )
 # currently fails in the cups gtkprint backend
 #LDFLAGS += -Wl,-z,defs
diff -pruN 2.24.33-6/debian/tests/manual/.gitignore 2.24.33-6ubuntu3/debian/tests/manual/.gitignore
--- 2.24.33-6/debian/tests/manual/.gitignore	2024-08-30 17:29:28.000000000 +0000
+++ 2.24.33-6ubuntu3/debian/tests/manual/.gitignore	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-/local-*.sources
