[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#994710: bullseye-pu: package nautilus/3.38.2-1+deb11u1



On Mon, 20 Sep 2021 at 11:08:49 +0100, Simon McVittie wrote:
> It seems #994710 didn't make it to the list because the diff was too big.
> Here's another try, removing the translation updates from the diff.

... now with diff. Sorry, not enough coffee yet this morning...
Diff filtered to exclude .pc, debian/patches/ content, po/ content.
diffstat filtered to exclude .pc only.

 debian/changelog                                                                                   |   14 
 debian/control                                                                                     |    2 
 debian/control.in                                                                                  |    2 
 debian/gbp.conf                                                                                    |    4 
 debian/patches/series                                                                              |   18 
 debian/watch                                                                                       |    2 
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Bengali-India-translation.patch                    |only
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Catalan-translation.patch                          |only
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Karbi-translation.patch                            |only
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Norwegian-Bokm-l-translation.patch                 |only
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Turkish-translation-1.patch                        |only
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Turkish-translation.patch                          |only
 nautilus-3.38.2-1+deb11u1/debian/patches/Update-Vietnamese-translation.patch                       |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-action-Fix-reinstated-regression.patch               |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-actions-Add-all-portal-opened-files-to-recents.patch |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-actions-Check-flatpak-info-only-once.patch           |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-actions-Don-t-leak-error.patch                       |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-actions-Drop-dead-code-path.patch                    |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-actions-Open-files-as-groups-if-not-sandboxed.patch  |only
 nautilus-3.38.2-1+deb11u1/debian/patches/mime-actions-Revert-unintended-string-freeze-break.patch  |only
 nautilus-3.38.2-1+deb11u1/debian/patches/toolbar-Don-t-leak-menu-models.patch                      |only
 nautilus-3.38.2-1+deb11u1/debian/patches/window-Don-t-save-state-when-tiled.patch                  |only
 nautilus-3.38.2-1+deb11u1/debian/patches/window-slot-Don-t-leak-menus-on-destruction.patch         |only
 po/bn_IN.po                                                                                        |10181 +++++-----
 po/ca.po                                                                                           |    4 
 po/mjw.po                                                                                          | 1897 -
 po/nb.po                                                                                           | 2020 +
 po/tr.po                                                                                           |  140 
 po/vi.po                                                                                           | 2008 +
 src/nautilus-mime-actions.c                                                                        |  268 
 src/nautilus-toolbar.c                                                                             |   10 
 src/nautilus-window-slot.c                                                                         |    3 
 src/nautilus-window.c                                                                              |   15 
 33 files changed, 9438 insertions(+), 7150 deletions(-)

diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/debian/changelog nautilus-3.38.2-1+deb11u1/debian/changelog
--- nautilus-3.38.2-1/debian/changelog	2020-12-07 14:54:18.000000000 +0000
+++ nautilus-3.38.2-1+deb11u1/debian/changelog	2021-09-19 17:45:00.000000000 +0100
@@ -1,3 +1,17 @@
+nautilus (3.38.2-1+deb11u1) bullseye; urgency=medium
+
+  * Update from upstream gnome-3-38 branch
+    - Don't save window size and position when tiled.
+      Tiling is more like a special case of maximization than an
+      ordinary floating window position.
+    - Fix some memory leaks
+    - Translation updates: bn_IN, ca, mjw, nb, tr, vi
+  * Backport patches from GNOME 40 to avoid opening multiple selected
+    files in multiple application instances (Closes: #993137)
+  * d/gbp.conf, d/control.in, d/watch: Target 3.38.x for bullseye
+
+ -- Simon McVittie <smcv@debian.org>  Sun, 19 Sep 2021 17:45:00 +0100
+
 nautilus (3.38.2-1) unstable; urgency=medium
 
   * New upstream release
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/debian/control nautilus-3.38.2-1+deb11u1/debian/control
--- nautilus-3.38.2-1/debian/control	2020-12-07 14:54:18.000000000 +0000
+++ nautilus-3.38.2-1+deb11u1/debian/control	2021-09-19 17:45:00.000000000 +0100
@@ -39,7 +39,7 @@
 Rules-Requires-Root: no
 Homepage: https://wiki.gnome.org/action/show/Apps/Nautilus
 Vcs-Browser: https://salsa.debian.org/gnome-team/nautilus
-Vcs-Git: https://salsa.debian.org/gnome-team/nautilus.git
+Vcs-Git: https://salsa.debian.org/gnome-team/nautilus.git -b debian/bullseye
 Standards-Version: 4.5.0
 
 Package: nautilus
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/debian/control.in nautilus-3.38.2-1+deb11u1/debian/control.in
--- nautilus-3.38.2-1/debian/control.in	2020-12-07 14:54:18.000000000 +0000
+++ nautilus-3.38.2-1+deb11u1/debian/control.in	2021-09-19 17:45:00.000000000 +0100
@@ -35,7 +35,7 @@
 Rules-Requires-Root: no
 Homepage: https://wiki.gnome.org/action/show/Apps/Nautilus
 Vcs-Browser: https://salsa.debian.org/gnome-team/nautilus
-Vcs-Git: https://salsa.debian.org/gnome-team/nautilus.git
+Vcs-Git: https://salsa.debian.org/gnome-team/nautilus.git -b debian/bullseye
 Standards-Version: 4.5.0
 
 Package: nautilus
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/debian/gbp.conf nautilus-3.38.2-1+deb11u1/debian/gbp.conf
--- nautilus-3.38.2-1/debian/gbp.conf	2020-12-07 14:54:18.000000000 +0000
+++ nautilus-3.38.2-1+deb11u1/debian/gbp.conf	2021-09-19 17:45:00.000000000 +0100
@@ -1,7 +1,7 @@
 [DEFAULT]
 pristine-tar = True
-debian-branch = debian/master
-upstream-branch = upstream/latest
+debian-branch = debian/bullseye
+upstream-branch = upstream/3.38.x
 upstream-vcs-tag = %(version)s
 
 [buildpackage]
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/debian/patches/series nautilus-3.38.2-1+deb11u1/debian/patches/series
--- nautilus-3.38.2-1/debian/patches/series	2020-12-07 14:54:18.000000000 +0000
+++ nautilus-3.38.2-1+deb11u1/debian/patches/series	2021-09-19 17:45:00.000000000 +0100
@@ -1,3 +1,19 @@
+Update-Karbi-translation.patch
+Update-Vietnamese-translation.patch
+Update-Norwegian-Bokm-l-translation.patch
+Update-Bengali-India-translation.patch
+Update-Catalan-translation.patch
+window-Don-t-save-state-when-tiled.patch
+window-slot-Don-t-leak-menus-on-destruction.patch
+toolbar-Don-t-leak-menu-models.patch
+Update-Turkish-translation.patch
+Update-Turkish-translation-1.patch
+mime-actions-Open-files-as-groups-if-not-sandboxed.patch
+mime-actions-Check-flatpak-info-only-once.patch
+mime-actions-Drop-dead-code-path.patch
+mime-actions-Add-all-portal-opened-files-to-recents.patch
+mime-actions-Don-t-leak-error.patch
+mime-action-Fix-reinstated-regression.patch
+mime-actions-Revert-unintended-string-freeze-break.patch
 multiarch_fallback.patch
 revert_tracker_update.patch
-
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/debian/watch nautilus-3.38.2-1+deb11u1/debian/watch
--- nautilus-3.38.2-1/debian/watch	2020-12-07 14:54:18.000000000 +0000
+++ nautilus-3.38.2-1+deb11u1/debian/watch	2021-09-19 17:45:00.000000000 +0100
@@ -1,3 +1,3 @@
 version=4
-https://download.gnome.org/sources/@PACKAGE@/([\d\.]+[02468])/ \
+https://download.gnome.org/sources/@PACKAGE@/3.38/ \
 	@PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/src/nautilus-mime-actions.c nautilus-3.38.2-1+deb11u1/src/nautilus-mime-actions.c
--- nautilus-3.38.2-1/src/nautilus-mime-actions.c	2020-11-20 14:04:26.827528000 +0000
+++ nautilus-3.38.2-1+deb11u1/src/nautilus-mime-actions.c	2021-09-20 10:57:10.000000000 +0100
@@ -63,6 +63,12 @@
 
 typedef struct
 {
+    GAppInfo *application;
+    GList *uris;
+} ApplicationLaunchParameters;
+
+typedef struct
+{
     NautilusWindowSlot *slot;
     gpointer window;
     GtkWindow *parent_window;
@@ -84,8 +90,7 @@
 {
     ActivateParameters *activation_params;
     GQueue *uris;
-    GQueue *unhandled_uris;
-} ApplicationLaunchParameters;
+} ApplicationLaunchAsyncParameters;
 
 /* Microsoft mime types at https://blogs.msdn.microsoft.com/vsofficedeveloper/2008/05/08/office-2007-file-format-mime-types-for-http-content-streaming-2/ */
 struct
@@ -244,6 +249,20 @@
                                gpointer callback_data);
 static void activation_mount_not_mounted (ActivateParameters *parameters);
 
+static gboolean
+is_sandboxed (void)
+{
+    static gboolean ret;
+
+    static gsize init = 0;
+    if (g_once_init_enter (&init))
+    {
+        ret = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS);
+        g_once_init_leave (&init, 1);
+    }
+
+    return ret;
+}
 
 static void
 launch_location_free (LaunchLocation *location)
@@ -345,19 +364,27 @@
 }
 
 static ApplicationLaunchParameters *
-application_launch_parameters_new (ActivateParameters *activation_params,
-                                   GQueue             *uris)
+application_launch_parameters_new (GAppInfo *application,
+                                   GList    *uris)
 {
     ApplicationLaunchParameters *result;
 
     result = g_new0 (ApplicationLaunchParameters, 1);
-    result->activation_params = activation_params;
-    result->uris = uris;
-    result->unhandled_uris = g_queue_new ();
+    result->application = g_object_ref (application);
+    result->uris = g_list_copy_deep (uris, (GCopyFunc) g_strdup, NULL);
 
     return result;
 }
 
+static void
+application_launch_parameters_free (ApplicationLaunchParameters *parameters)
+{
+    g_object_unref (parameters->application);
+    g_list_free_full (parameters->uris, g_free);
+
+    g_free (parameters);
+}
+
 static gboolean
 nautilus_mime_actions_check_if_required_attributes_ready (NautilusFile *file)
 {
@@ -792,6 +819,114 @@
     return (activation_action == ACTIVATION_ACTION_OPEN_IN_APPLICATION);
 }
 
+
+static unsigned int
+mime_application_hash (GAppInfo *app)
+{
+    const char *id;
+
+    id = g_app_info_get_id (app);
+
+    if (id == NULL)
+    {
+        return GPOINTER_TO_UINT (app);
+    }
+
+    return g_str_hash (id);
+}
+
+static void
+list_to_parameters_foreach (GAppInfo  *application,
+                            GList     *uris,
+                            GList    **ret)
+{
+    ApplicationLaunchParameters *parameters;
+
+    uris = g_list_reverse (uris);
+
+    parameters = application_launch_parameters_new
+                     (application, uris);
+    *ret = g_list_prepend (*ret, parameters);
+}
+
+
+/**
+ * make_activation_parameters
+ *
+ * Construct a list of ApplicationLaunchParameters from a list of NautilusFiles,
+ * where files that have the same default application are put into the same
+ * launch parameter, and others are put into the unhandled_files list.
+ *
+ * @files: Files to use for construction.
+ * @unhandled_files: Files without any default application will be put here.
+ *
+ * Return value: Newly allocated list of ApplicationLaunchParameters.
+ **/
+static GList *
+make_activation_parameters (GList  *uris,
+                            GList **unhandled_uris)
+{
+    GList *ret, *l, *app_uris;
+    NautilusFile *file;
+    GAppInfo *app, *old_app;
+    GHashTable *app_table;
+    char *uri;
+
+    ret = NULL;
+    *unhandled_uris = NULL;
+
+    app_table = g_hash_table_new_full
+                    ((GHashFunc) mime_application_hash,
+                    (GEqualFunc) g_app_info_equal,
+                    (GDestroyNotify) g_object_unref,
+                    (GDestroyNotify) g_list_free);
+
+    for (l = uris; l != NULL; l = l->next)
+    {
+        uri = l->data;
+        file = nautilus_file_get_by_uri (uri);
+
+        app = nautilus_mime_get_default_application_for_file (file);
+        if (app != NULL)
+        {
+            app_uris = NULL;
+
+            if (g_hash_table_lookup_extended (app_table, app,
+                                              (gpointer *) &old_app,
+                                              (gpointer *) &app_uris))
+            {
+                g_hash_table_steal (app_table, old_app);
+
+                app_uris = g_list_prepend (app_uris, uri);
+
+                g_object_unref (app);
+                app = old_app;
+            }
+            else
+            {
+                app_uris = g_list_prepend (NULL, uri);
+            }
+
+            g_hash_table_insert (app_table, app, app_uris);
+        }
+        else
+        {
+            *unhandled_uris = g_list_prepend (*unhandled_uris, uri);
+        }
+        nautilus_file_unref (file);
+    }
+
+    g_hash_table_foreach (app_table,
+                          (GHFunc) list_to_parameters_foreach,
+                          &ret);
+
+    g_hash_table_destroy (app_table);
+
+    *unhandled_uris = g_list_reverse (*unhandled_uris);
+
+    return g_list_reverse (ret);
+}
+
 static gboolean
 file_was_cancelled (NautilusFile *file)
 {
@@ -844,9 +979,8 @@
 }
 
 static void
-application_launch_parameters_free (ApplicationLaunchParameters *parameters)
+application_launch_async_parameters_free (ApplicationLaunchAsyncParameters *parameters)
 {
-    g_queue_free (parameters->unhandled_uris);
     g_queue_free (parameters->uris);
     activation_parameters_free (parameters->activation_params);
 
@@ -1370,25 +1504,23 @@
 }
 
 static void
-on_launch_default_for_uri (GObject      *source_object,
-                           GAsyncResult *res,
-                           gpointer      user_data)
+launch_default_for_uris_callback (GObject      *source_object,
+                                  GAsyncResult *res,
+                                  gpointer      user_data)
 {
-    ApplicationLaunchParameters *params;
+    ApplicationLaunchAsyncParameters *params;
     ActivateParameters *activation_params;
     char *uri;
-    gboolean sandboxed;
-    GError *error = NULL;
+    g_autoptr (GError) error = NULL;
 
     params = user_data;
     activation_params = params->activation_params;
     uri = g_queue_pop_head (params->uris);
-    sandboxed = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS);
 
     nautilus_launch_default_for_uri_finish (res, &error);
-    if (!sandboxed && error != NULL && error->code != G_IO_ERROR_CANCELLED)
+    if (error == NULL)
     {
-        g_queue_push_tail (params->unhandled_uris, uri);
+        gtk_recent_manager_add_item (gtk_recent_manager_get_default (), uri);
     }
 
     if (!g_queue_is_empty (params->uris))
@@ -1396,17 +1528,12 @@
         nautilus_launch_default_for_uri_async (g_queue_peek_head (params->uris),
                                                activation_params->parent_window,
                                                activation_params->cancellable,
-                                               on_launch_default_for_uri,
+                                               launch_default_for_uris_callback,
                                                params);
     }
     else
     {
-        while ((uri = g_queue_pop_head (params->unhandled_uris)) != NULL)
-        {
-            application_unhandled_uri (activation_params, uri);
-        }
-
-        application_launch_parameters_free (params);
+        application_launch_async_parameters_free (params);
     }
 }
 
@@ -1415,9 +1542,16 @@
 {
     NautilusFile *file;
     NautilusWindowOpenFlags flags;
+    g_autoptr (GList) open_in_app_parameters = NULL;
+    g_autoptr (GList) unhandled_open_in_app_uris = NULL;
+    ApplicationLaunchParameters *one_parameters;
     int count;
     g_autofree char *old_working_dir = NULL;
     GdkScreen *screen;
+    gint num_apps;
+    gint num_unhandled;
+    gint num_files;
+    gboolean open_files;
     g_autoptr (GQueue) launch_files = NULL;
     g_autoptr (GQueue) launch_in_terminal_files = NULL;
     g_autoptr (GQueue) open_in_app_uris = NULL;
@@ -1612,26 +1746,88 @@
         }
     }
 
-    if (g_queue_is_empty (open_in_app_uris))
-    {
-        activation_parameters_free (parameters);
-    }
-    else
+    if (!g_queue_is_empty (open_in_app_uris) && is_sandboxed ())
     {
         const char *uri;
-        ApplicationLaunchParameters *params;
+        ApplicationLaunchAsyncParameters *async_params;
 
         uri = g_queue_peek_head (open_in_app_uris);
-        params = application_launch_parameters_new (parameters,
-                                                    g_queue_copy (open_in_app_uris));
 
-        gtk_recent_manager_add_item (gtk_recent_manager_get_default (), uri);
+        async_params = g_new0 (ApplicationLaunchAsyncParameters, 1);
+        async_params->activation_params = parameters;
+        async_params->uris = g_steal_pointer (&open_in_app_uris);
+
         nautilus_launch_default_for_uri_async (uri,
                                                parameters->parent_window,
                                                parameters->cancellable,
-                                               on_launch_default_for_uri,
-                                               params);
+                                               launch_default_for_uris_callback,
+                                               async_params);
+        return;
+    }
+
+    if (open_in_app_uris != NULL)
+    {
+        open_in_app_parameters = make_activation_parameters (g_queue_peek_head_link (open_in_app_uris),
+                                                             &unhandled_open_in_app_uris);
     }
+
+    num_apps = g_list_length (open_in_app_parameters);
+    num_unhandled = g_list_length (unhandled_open_in_app_uris);
+    num_files = g_queue_get_length (open_in_app_uris);
+    open_files = TRUE;
+
+    if (!g_queue_is_empty (open_in_app_uris) &&
+        (!parameters->user_confirmation ||
+         num_files + num_unhandled > SILENT_OPEN_LIMIT) &&
+        num_apps > 1)
+    {
+        GtkDialog *dialog;
+        char *prompt;
+        g_autofree char *detail = NULL;
+        int response;
+
+        pause_activation_timed_cancel (parameters);
+
+        prompt = _("Are you sure you want to open all files?");
+        /* TODO: Replace 'window' with 'application' after string freeze. */
+        detail = g_strdup_printf (ngettext ("This will open %d separate window.",
+                                            "This will open %d separate windows.", num_apps), num_apps);
+        dialog = eel_show_yes_no_dialog (prompt, detail,
+                                         _("_OK"), _("_Cancel"),
+                                         parameters->parent_window);
+        response = gtk_dialog_run (dialog);
+        gtk_widget_destroy (GTK_WIDGET (dialog));
+
+        unpause_activation_timed_cancel (parameters);
+
+        if (response != GTK_RESPONSE_YES)
+        {
+            open_files = FALSE;
+        }
+    }
+
+    if (open_files)
+    {
+        for (l = open_in_app_parameters; l != NULL; l = l->next)
+        {
+            one_parameters = l->data;
+
+            nautilus_launch_application_by_uri (one_parameters->application,
+                                                one_parameters->uris,
+                                                parameters->parent_window);
+            application_launch_parameters_free (one_parameters);
+        }
+
+        for (l = unhandled_open_in_app_uris; l != NULL; l = l->next)
+        {
+            char *uri = l->data;
+
+            /* this does not block */
+            application_unhandled_uri (parameters, uri);
+        }
+    }
+
+    activation_parameters_free (parameters);
 }
 
 static void
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/src/nautilus-toolbar.c nautilus-3.38.2-1+deb11u1/src/nautilus-toolbar.c
--- nautilus-3.38.2-1/src/nautilus-toolbar.c	2020-11-20 14:04:26.835528100 +0000
+++ nautilus-3.38.2-1+deb11u1/src/nautilus-toolbar.c	2021-09-20 10:57:10.000000000 +0100
@@ -1297,8 +1297,11 @@
                                             GParamSpec         *param,
                                             NautilusWindowSlot *slot)
 {
+    g_autoptr (GMenuModel) menu = NULL;
+
+    menu = nautilus_window_slot_get_extensions_background_menu (slot);
     nautilus_path_bar_set_extensions_background_menu (NAUTILUS_PATH_BAR (self->path_bar),
-                                                      nautilus_window_slot_get_extensions_background_menu (slot));
+                                                      menu);
 }
 
 static void
@@ -1306,8 +1309,11 @@
                                 GParamSpec         *param,
                                 NautilusWindowSlot *slot)
 {
+    g_autoptr (GMenuModel) menu = NULL;
+
+    menu = nautilus_window_slot_get_templates_menu (slot);
     nautilus_path_bar_set_templates_menu (NAUTILUS_PATH_BAR (self->path_bar),
-                                          nautilus_window_slot_get_templates_menu (slot));
+                                          menu);
 }
 
 static void
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/src/nautilus-window.c nautilus-3.38.2-1+deb11u1/src/nautilus-window.c
--- nautilus-3.38.2-1/src/nautilus-window.c	2020-11-20 14:04:26.838528200 +0000
+++ nautilus-3.38.2-1+deb11u1/src/nautilus-window.c	2021-09-20 10:57:10.000000000 +0100
@@ -2401,12 +2401,23 @@
         gint width;
         gint height;
         GVariant *initial_size;
+        GdkWindowState window_state;
 
         gtk_window_get_size (GTK_WINDOW (window), &width, &height);
 
         initial_size = g_variant_new_parsed ("(%i, %i)", width, height);
-        is_maximized = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window)))
-                       & GDK_WINDOW_STATE_MAXIMIZED;
+
+        window_state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window)));
+
+        /* Don't save the window state for tiled windows. This is a special case,
+         * where the geometry only makes sense in combination with other tiled
+         * windows, that we can't possibly restore. */
+        if (window_state & GDK_WINDOW_STATE_TILED)
+        {
+            return;
+        }
+
+        is_maximized = window_state & GDK_WINDOW_STATE_MAXIMIZED;
 
         if (!is_maximized)
         {
diff -ru '--exclude=.pc' '--exclude=*.patch' '--exclude=*.po' nautilus-3.38.2-1/src/nautilus-window-slot.c nautilus-3.38.2-1+deb11u1/src/nautilus-window-slot.c
--- nautilus-3.38.2-1/src/nautilus-window-slot.c	2020-11-20 14:04:26.837528200 +0000
+++ nautilus-3.38.2-1+deb11u1/src/nautilus-window-slot.c	2021-09-20 10:57:10.000000000 +0100
@@ -3118,6 +3118,9 @@
     g_clear_pointer (&priv->extensions_background_menu_binding, g_binding_unbind);
     g_clear_pointer (&priv->templates_menu_binding, g_binding_unbind);
 
+    g_clear_object (&priv->templates_menu);
+    g_clear_object (&priv->extensions_background_menu);
+
     if (priv->content_view)
     {
         gtk_widget_destroy (GTK_WIDGET (priv->content_view));

Reply to: