commit
0c80c5f851
@ -0,0 +1 @@
|
|||||||
|
SOURCES/nautilus-40.2.tar.xz
|
@ -0,0 +1 @@
|
|||||||
|
c1b959b40074dd0e8e2df8289c61a3abf5fa8d5a SOURCES/nautilus-40.2.tar.xz
|
@ -0,0 +1,92 @@
|
|||||||
|
From 5b40335c34a3b920348633274a03d073d1338a09 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Mon, 9 Jan 2023 13:12:17 +0100
|
||||||
|
Subject: [PATCH] Revert "application: add common startup code"
|
||||||
|
|
||||||
|
This reverts commit 23ae53870a39afe43548111b6432db39511a6e97. This
|
||||||
|
change was needed for split of desktop-related functionality, but it
|
||||||
|
seems no more needed to me. Let's revert those changes to make the
|
||||||
|
code a bit easier as a preparation for the next commits.
|
||||||
|
---
|
||||||
|
src/nautilus-application.c | 32 ++++++--------------------------
|
||||||
|
src/nautilus-application.h | 1 -
|
||||||
|
2 files changed, 6 insertions(+), 27 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
|
||||||
|
index 5deae5cc9..9cc435ec3 100644
|
||||||
|
--- a/src/nautilus-application.c
|
||||||
|
+++ b/src/nautilus-application.c
|
||||||
|
@@ -1298,9 +1298,10 @@ icon_theme_changed_callback (GtkIconTheme *icon_theme,
|
||||||
|
emit_change_signals_for_all_files_in_all_directories ();
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
-nautilus_application_startup_common (NautilusApplication *self)
|
||||||
|
+static void
|
||||||
|
+nautilus_application_startup (GApplication *app)
|
||||||
|
{
|
||||||
|
+ NautilusApplication *self = NAUTILUS_APPLICATION (app);
|
||||||
|
NautilusApplicationPrivate *priv;
|
||||||
|
|
||||||
|
nautilus_profile_start (NULL);
|
||||||
|
@@ -1319,6 +1320,9 @@ nautilus_application_startup_common (NautilusApplication *self)
|
||||||
|
|
||||||
|
setup_theme_extensions ();
|
||||||
|
|
||||||
|
+ /* create DBus manager */
|
||||||
|
+ priv->fdb_manager = nautilus_freedesktop_dbus_new ();
|
||||||
|
+
|
||||||
|
/* initialize preferences and create the global GSettings objects */
|
||||||
|
nautilus_global_preferences_init ();
|
||||||
|
|
||||||
|
@@ -1352,22 +1356,6 @@ nautilus_application_startup_common (NautilusApplication *self)
|
||||||
|
NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-nautilus_application_startup (GApplication *app)
|
||||||
|
-{
|
||||||
|
- NautilusApplication *self = NAUTILUS_APPLICATION (app);
|
||||||
|
- NautilusApplicationPrivate *priv;
|
||||||
|
-
|
||||||
|
- nautilus_profile_start (NULL);
|
||||||
|
- priv = nautilus_application_get_instance_private (self);
|
||||||
|
-
|
||||||
|
- /* create DBus manager */
|
||||||
|
- priv->fdb_manager = nautilus_freedesktop_dbus_new ();
|
||||||
|
- nautilus_application_startup_common (self);
|
||||||
|
-
|
||||||
|
- nautilus_profile_end (NULL);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static gboolean
|
||||||
|
nautilus_application_dbus_register (GApplication *app,
|
||||||
|
GDBusConnection *connection,
|
||||||
|
@@ -1443,14 +1431,6 @@ update_dbus_opened_locations (NautilusApplication *self)
|
||||||
|
g_return_if_fail (NAUTILUS_IS_APPLICATION (self));
|
||||||
|
|
||||||
|
priv = nautilus_application_get_instance_private (self);
|
||||||
|
-
|
||||||
|
- /* Children of nautilus application could not handle the dbus, so don't
|
||||||
|
- * do anything in that case */
|
||||||
|
- if (!priv->fdb_manager)
|
||||||
|
- {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
dbus_object_path = g_application_get_dbus_object_path (G_APPLICATION (self));
|
||||||
|
|
||||||
|
g_return_if_fail (dbus_object_path);
|
||||||
|
diff --git a/src/nautilus-application.h b/src/nautilus-application.h
|
||||||
|
index f915b0d4d..d5cfc11b3 100644
|
||||||
|
--- a/src/nautilus-application.h
|
||||||
|
+++ b/src/nautilus-application.h
|
||||||
|
@@ -85,5 +85,4 @@ GtkWidget * nautilus_application_connect_server (NautilusApplication *applicatio
|
||||||
|
|
||||||
|
void nautilus_application_search (NautilusApplication *application,
|
||||||
|
NautilusQuery *query);
|
||||||
|
-void nautilus_application_startup_common (NautilusApplication *application);
|
||||||
|
G_END_DECLS
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,160 @@
|
|||||||
|
From 7de08188d8d012d9aa8f49fe27b7992d081a7307 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Wed, 11 Jan 2023 09:44:25 +0100
|
||||||
|
Subject: [PATCH] Revert "freedesktop-dbus: Defer D-Bus property setting"
|
||||||
|
|
||||||
|
This reverts commit 3014f69485a120bedf0eec5af441346a95fe27f7 and part of
|
||||||
|
the commit a1751d3d870c6cdc092f893755623c4ff20e1ef3. This extra handling
|
||||||
|
was needed because `NautilusFreedesktopDBus` methods might be called before
|
||||||
|
establishing its own D-Bus connection. The follow-up commit is going to use
|
||||||
|
the already established connection from the `dbus_register` vfunc. It
|
||||||
|
should be ensured that the `dbus_register` vfunc is called before the
|
||||||
|
`window_added`, `window_removed`, or `startup` vfunc. Consequently, this
|
||||||
|
extra handling is going to be redundant. Let's remove it as a preparation
|
||||||
|
for the next commit.
|
||||||
|
---
|
||||||
|
src/nautilus-freedesktop-dbus.c | 79 ++-------------------------------
|
||||||
|
1 file changed, 3 insertions(+), 76 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-freedesktop-dbus.c b/src/nautilus-freedesktop-dbus.c
|
||||||
|
index 5cbbbad01..c75678399 100644
|
||||||
|
--- a/src/nautilus-freedesktop-dbus.c
|
||||||
|
+++ b/src/nautilus-freedesktop-dbus.c
|
||||||
|
@@ -40,11 +40,6 @@ struct _NautilusFreedesktopDBus
|
||||||
|
|
||||||
|
/* Our DBus implementation skeleton */
|
||||||
|
NautilusFreedesktopFileManager1 *skeleton;
|
||||||
|
-
|
||||||
|
- GStrv pending_open_locations;
|
||||||
|
- GVariant *pending_open_windows_with_locations;
|
||||||
|
-
|
||||||
|
- gboolean name_lost;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (NautilusFreedesktopDBus, nautilus_freedesktop_dbus, G_TYPE_OBJECT);
|
||||||
|
@@ -162,24 +157,6 @@ bus_acquired_cb (GDBusConnection *conn,
|
||||||
|
G_CALLBACK (skeleton_handle_show_item_properties_cb), fdb);
|
||||||
|
|
||||||
|
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (fdb->skeleton), conn, NAUTILUS_FDO_DBUS_PATH, NULL);
|
||||||
|
-
|
||||||
|
- if (G_UNLIKELY (fdb->pending_open_locations != NULL))
|
||||||
|
- {
|
||||||
|
- g_auto (GStrv) locations = NULL;
|
||||||
|
-
|
||||||
|
- locations = g_steal_pointer (&fdb->pending_open_locations);
|
||||||
|
-
|
||||||
|
- nautilus_freedesktop_dbus_set_open_locations (fdb, (const gchar **) locations);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (G_UNLIKELY (fdb->pending_open_windows_with_locations != NULL))
|
||||||
|
- {
|
||||||
|
- g_autoptr (GVariant) locations = NULL;
|
||||||
|
-
|
||||||
|
- locations = g_steal_pointer (&fdb->pending_open_windows_with_locations);
|
||||||
|
-
|
||||||
|
- nautilus_freedesktop_dbus_set_open_windows_with_locations (fdb, locations);
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -195,13 +172,7 @@ name_lost_cb (GDBusConnection *connection,
|
||||||
|
const gchar *name,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
- NautilusFreedesktopDBus *fdb;
|
||||||
|
-
|
||||||
|
DEBUG ("Lost (or failed to acquire) the name %s on the session message bus\n", name);
|
||||||
|
-
|
||||||
|
- fdb = NAUTILUS_FREEDESKTOP_DBUS (user_data);
|
||||||
|
-
|
||||||
|
- fdb->name_lost = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -225,24 +196,12 @@ nautilus_freedesktop_dbus_dispose (GObject *object)
|
||||||
|
G_OBJECT_CLASS (nautilus_freedesktop_dbus_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-nautilus_freedesktop_dbus_finalize (GObject *object)
|
||||||
|
-{
|
||||||
|
- NautilusFreedesktopDBus *fdb;
|
||||||
|
-
|
||||||
|
- fdb = NAUTILUS_FREEDESKTOP_DBUS (object);
|
||||||
|
-
|
||||||
|
- g_clear_pointer (&fdb->pending_open_locations, g_strfreev);
|
||||||
|
- g_clear_pointer (&fdb->pending_open_windows_with_locations, g_variant_unref);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void
|
||||||
|
nautilus_freedesktop_dbus_class_init (NautilusFreedesktopDBusClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->dispose = nautilus_freedesktop_dbus_dispose;
|
||||||
|
- object_class->finalize = nautilus_freedesktop_dbus_finalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -256,10 +215,6 @@ nautilus_freedesktop_dbus_init (NautilusFreedesktopDBus *fdb)
|
||||||
|
name_lost_cb,
|
||||||
|
fdb,
|
||||||
|
NULL);
|
||||||
|
- fdb->skeleton = NULL;
|
||||||
|
- fdb->pending_open_locations = NULL;
|
||||||
|
- fdb->pending_open_windows_with_locations = NULL;
|
||||||
|
- fdb->name_lost = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -268,21 +223,7 @@ nautilus_freedesktop_dbus_set_open_locations (NautilusFreedesktopDBus *fdb,
|
||||||
|
{
|
||||||
|
g_return_if_fail (NAUTILUS_IS_FREEDESKTOP_DBUS (fdb));
|
||||||
|
|
||||||
|
- if (G_UNLIKELY (fdb->skeleton == NULL))
|
||||||
|
- {
|
||||||
|
- if (G_LIKELY (fdb->name_lost))
|
||||||
|
- {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- g_clear_pointer (&fdb->pending_open_locations, g_strfreev);
|
||||||
|
-
|
||||||
|
- fdb->pending_open_locations = g_strdupv ((gchar **) locations);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- nautilus_freedesktop_file_manager1_set_open_locations (fdb->skeleton, locations);
|
||||||
|
- }
|
||||||
|
+ nautilus_freedesktop_file_manager1_set_open_locations (fdb->skeleton, locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -301,22 +242,8 @@ nautilus_freedesktop_dbus_set_open_windows_with_locations (NautilusFreedesktopDB
|
||||||
|
{
|
||||||
|
g_return_if_fail (NAUTILUS_IS_FREEDESKTOP_DBUS (fdb));
|
||||||
|
|
||||||
|
- if (G_UNLIKELY (fdb->skeleton == NULL))
|
||||||
|
- {
|
||||||
|
- if (G_LIKELY (fdb->name_lost))
|
||||||
|
- {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- g_clear_pointer (&fdb->pending_open_windows_with_locations, g_variant_unref);
|
||||||
|
-
|
||||||
|
- fdb->pending_open_windows_with_locations = g_variant_ref (locations);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- nautilus_freedesktop_file_manager1_set_open_windows_with_locations (fdb->skeleton,
|
||||||
|
- locations);
|
||||||
|
- }
|
||||||
|
+ nautilus_freedesktop_file_manager1_set_open_windows_with_locations (fdb->skeleton,
|
||||||
|
+ locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tries to own the org.freedesktop.FileManager1 service name */
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,305 @@
|
|||||||
|
From 1fa3039c67671fe53416b2575f3c305029ef4854 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Wed, 11 Jan 2023 09:55:41 +0100
|
||||||
|
Subject: [PATCH] application: Export FileManager1 iface from dbus_register
|
||||||
|
vfunc
|
||||||
|
|
||||||
|
The `org/freedesktop/FileManager1` interface is not currently exported
|
||||||
|
from the `dbus_register` vfunc. This causes issues for projects (e.g.
|
||||||
|
desktop-icons extension) that want to use all the Nautilus intefaces
|
||||||
|
over the `org.gnome.Nautilus` connection. Let's use the already established
|
||||||
|
connection and export the `FileManager1` interface from the `dbus_register`
|
||||||
|
vfunc.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2150894
|
||||||
|
---
|
||||||
|
src/nautilus-application.c | 17 ++--
|
||||||
|
src/nautilus-freedesktop-dbus.c | 153 +++++++++++++++++++++++++-------
|
||||||
|
src/nautilus-freedesktop-dbus.h | 6 +-
|
||||||
|
3 files changed, 138 insertions(+), 38 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
|
||||||
|
index 9cc435ec3..16725932d 100644
|
||||||
|
--- a/src/nautilus-application.c
|
||||||
|
+++ b/src/nautilus-application.c
|
||||||
|
@@ -578,8 +578,6 @@ nautilus_application_finalize (GObject *object)
|
||||||
|
g_clear_object (&priv->progress_handler);
|
||||||
|
g_clear_object (&priv->bookmark_list);
|
||||||
|
|
||||||
|
- g_clear_object (&priv->fdb_manager);
|
||||||
|
-
|
||||||
|
g_list_free (priv->windows);
|
||||||
|
|
||||||
|
g_hash_table_destroy (priv->notifications);
|
||||||
|
@@ -1320,9 +1318,6 @@ nautilus_application_startup (GApplication *app)
|
||||||
|
|
||||||
|
setup_theme_extensions ();
|
||||||
|
|
||||||
|
- /* create DBus manager */
|
||||||
|
- priv->fdb_manager = nautilus_freedesktop_dbus_new ();
|
||||||
|
-
|
||||||
|
/* initialize preferences and create the global GSettings objects */
|
||||||
|
nautilus_global_preferences_init ();
|
||||||
|
|
||||||
|
@@ -1372,6 +1367,12 @@ nautilus_application_dbus_register (GApplication *app,
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ priv->fdb_manager = nautilus_freedesktop_dbus_new (connection);
|
||||||
|
+ if (!nautilus_freedesktop_dbus_register (priv->fdb_manager, error))
|
||||||
|
+ {
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
priv->search_provider = nautilus_shell_search_provider_new ();
|
||||||
|
if (!nautilus_shell_search_provider_register (priv->search_provider, connection, error))
|
||||||
|
{
|
||||||
|
@@ -1398,6 +1399,12 @@ nautilus_application_dbus_unregister (GApplication *app,
|
||||||
|
g_clear_object (&priv->dbus_manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (priv->fdb_manager)
|
||||||
|
+ {
|
||||||
|
+ nautilus_freedesktop_dbus_unregister (priv->fdb_manager);
|
||||||
|
+ g_clear_object (&priv->fdb_manager);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (priv->search_provider)
|
||||||
|
{
|
||||||
|
nautilus_shell_search_provider_unregister (priv->search_provider);
|
||||||
|
diff --git a/src/nautilus-freedesktop-dbus.c b/src/nautilus-freedesktop-dbus.c
|
||||||
|
index c75678399..c253cfaba 100644
|
||||||
|
--- a/src/nautilus-freedesktop-dbus.c
|
||||||
|
+++ b/src/nautilus-freedesktop-dbus.c
|
||||||
|
@@ -40,6 +40,14 @@ struct _NautilusFreedesktopDBus
|
||||||
|
|
||||||
|
/* Our DBus implementation skeleton */
|
||||||
|
NautilusFreedesktopFileManager1 *skeleton;
|
||||||
|
+
|
||||||
|
+ GDBusConnection *connection;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+enum
|
||||||
|
+{
|
||||||
|
+ PROP_0,
|
||||||
|
+ PROP_CONNECTION,
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (NautilusFreedesktopDBus, nautilus_freedesktop_dbus, G_TYPE_OBJECT);
|
||||||
|
@@ -138,27 +146,6 @@ skeleton_handle_show_item_properties_cb (NautilusFreedesktopFileManager1 *object
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-bus_acquired_cb (GDBusConnection *conn,
|
||||||
|
- const gchar *name,
|
||||||
|
- gpointer user_data)
|
||||||
|
-{
|
||||||
|
- NautilusFreedesktopDBus *fdb = user_data;
|
||||||
|
-
|
||||||
|
- DEBUG ("Bus acquired at %s", name);
|
||||||
|
-
|
||||||
|
- fdb->skeleton = nautilus_freedesktop_file_manager1_skeleton_new ();
|
||||||
|
-
|
||||||
|
- g_signal_connect (fdb->skeleton, "handle-show-items",
|
||||||
|
- G_CALLBACK (skeleton_handle_show_items_cb), fdb);
|
||||||
|
- g_signal_connect (fdb->skeleton, "handle-show-folders",
|
||||||
|
- G_CALLBACK (skeleton_handle_show_folders_cb), fdb);
|
||||||
|
- g_signal_connect (fdb->skeleton, "handle-show-item-properties",
|
||||||
|
- G_CALLBACK (skeleton_handle_show_item_properties_cb), fdb);
|
||||||
|
-
|
||||||
|
- g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (fdb->skeleton), conn, NAUTILUS_FDO_DBUS_PATH, NULL);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void
|
||||||
|
name_acquired_cb (GDBusConnection *connection,
|
||||||
|
const gchar *name,
|
||||||
|
@@ -175,6 +162,20 @@ name_lost_cb (GDBusConnection *connection,
|
||||||
|
DEBUG ("Lost (or failed to acquire) the name %s on the session message bus\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+nautilus_freedesktop_dbus_constructed (GObject *object)
|
||||||
|
+{
|
||||||
|
+ NautilusFreedesktopDBus *fdb = NAUTILUS_FREEDESKTOP_DBUS (object);
|
||||||
|
+
|
||||||
|
+ fdb->owner_id = g_bus_own_name_on_connection (fdb->connection,
|
||||||
|
+ NAUTILUS_FDO_DBUS_NAME,
|
||||||
|
+ G_BUS_NAME_OWNER_FLAGS_NONE,
|
||||||
|
+ name_acquired_cb,
|
||||||
|
+ name_lost_cb,
|
||||||
|
+ fdb,
|
||||||
|
+ NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
nautilus_freedesktop_dbus_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
@@ -188,33 +189,87 @@ nautilus_freedesktop_dbus_dispose (GObject *object)
|
||||||
|
|
||||||
|
if (fdb->skeleton != NULL)
|
||||||
|
{
|
||||||
|
- g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (fdb->skeleton));
|
||||||
|
g_object_unref (fdb->skeleton);
|
||||||
|
fdb->skeleton = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ g_clear_object (&fdb->connection);
|
||||||
|
+
|
||||||
|
G_OBJECT_CLASS (nautilus_freedesktop_dbus_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+nautilus_freedesktop_dbus_set_property (GObject *object,
|
||||||
|
+ guint prop_id,
|
||||||
|
+ const GValue *value,
|
||||||
|
+ GParamSpec *pspec)
|
||||||
|
+{
|
||||||
|
+ NautilusFreedesktopDBus *fdb = NAUTILUS_FREEDESKTOP_DBUS (object);
|
||||||
|
+
|
||||||
|
+ switch (prop_id)
|
||||||
|
+ {
|
||||||
|
+ case PROP_CONNECTION:
|
||||||
|
+ {
|
||||||
|
+ g_set_object (&fdb->connection, g_value_get_object (value));
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ {
|
||||||
|
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+nautilus_freedesktop_dbus_get_property (GObject *object,
|
||||||
|
+ guint prop_id,
|
||||||
|
+ GValue *value,
|
||||||
|
+ GParamSpec *pspec)
|
||||||
|
+{
|
||||||
|
+ NautilusFreedesktopDBus *fdb = NAUTILUS_FREEDESKTOP_DBUS (object);
|
||||||
|
+
|
||||||
|
+ switch (prop_id)
|
||||||
|
+ {
|
||||||
|
+ case PROP_CONNECTION:
|
||||||
|
+ {
|
||||||
|
+ g_value_set_object (value, fdb->connection);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ {
|
||||||
|
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
nautilus_freedesktop_dbus_class_init (NautilusFreedesktopDBusClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->dispose = nautilus_freedesktop_dbus_dispose;
|
||||||
|
+ object_class->constructed = nautilus_freedesktop_dbus_constructed;
|
||||||
|
+ object_class->get_property = nautilus_freedesktop_dbus_get_property;
|
||||||
|
+ object_class->set_property = nautilus_freedesktop_dbus_set_property;
|
||||||
|
+
|
||||||
|
+ g_object_class_install_property (object_class,
|
||||||
|
+ PROP_CONNECTION,
|
||||||
|
+ g_param_spec_object ("connection",
|
||||||
|
+ "Connection",
|
||||||
|
+ "GDBus connection property",
|
||||||
|
+ G_TYPE_DBUS_CONNECTION,
|
||||||
|
+ G_PARAM_CONSTRUCT_ONLY |
|
||||||
|
+ G_PARAM_READWRITE));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nautilus_freedesktop_dbus_init (NautilusFreedesktopDBus *fdb)
|
||||||
|
{
|
||||||
|
- fdb->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
|
||||||
|
- NAUTILUS_FDO_DBUS_NAME,
|
||||||
|
- G_BUS_NAME_OWNER_FLAGS_NONE,
|
||||||
|
- bus_acquired_cb,
|
||||||
|
- name_acquired_cb,
|
||||||
|
- name_lost_cb,
|
||||||
|
- fdb,
|
||||||
|
- NULL);
|
||||||
|
+ fdb->skeleton = nautilus_freedesktop_file_manager1_skeleton_new ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -248,7 +303,41 @@ nautilus_freedesktop_dbus_set_open_windows_with_locations (NautilusFreedesktopDB
|
||||||
|
|
||||||
|
/* Tries to own the org.freedesktop.FileManager1 service name */
|
||||||
|
NautilusFreedesktopDBus *
|
||||||
|
-nautilus_freedesktop_dbus_new (void)
|
||||||
|
+nautilus_freedesktop_dbus_new (GDBusConnection *connection)
|
||||||
|
+{
|
||||||
|
+ return g_object_new (NAUTILUS_TYPE_FREEDESKTOP_DBUS,
|
||||||
|
+ "connection", connection,
|
||||||
|
+ NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+gboolean
|
||||||
|
+nautilus_freedesktop_dbus_register (NautilusFreedesktopDBus *fdb,
|
||||||
|
+ GError **error)
|
||||||
|
+{
|
||||||
|
+ gboolean success;
|
||||||
|
+
|
||||||
|
+ success = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (fdb->skeleton),
|
||||||
|
+ fdb->connection,
|
||||||
|
+ NAUTILUS_FDO_DBUS_PATH,
|
||||||
|
+ error);
|
||||||
|
+
|
||||||
|
+ if (success)
|
||||||
|
+ {
|
||||||
|
+ g_signal_connect (fdb->skeleton, "handle-show-items",
|
||||||
|
+ G_CALLBACK (skeleton_handle_show_items_cb), fdb);
|
||||||
|
+ g_signal_connect (fdb->skeleton, "handle-show-folders",
|
||||||
|
+ G_CALLBACK (skeleton_handle_show_folders_cb), fdb);
|
||||||
|
+ g_signal_connect (fdb->skeleton, "handle-show-item-properties",
|
||||||
|
+ G_CALLBACK (skeleton_handle_show_item_properties_cb), fdb);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return success;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+nautilus_freedesktop_dbus_unregister (NautilusFreedesktopDBus *fdb)
|
||||||
|
{
|
||||||
|
- return g_object_new (NAUTILUS_TYPE_FREEDESKTOP_DBUS, NULL);
|
||||||
|
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (fdb->skeleton));
|
||||||
|
+
|
||||||
|
+ g_signal_handlers_disconnect_by_data (fdb->skeleton, fdb);
|
||||||
|
}
|
||||||
|
diff --git a/src/nautilus-freedesktop-dbus.h b/src/nautilus-freedesktop-dbus.h
|
||||||
|
index 416900eb9..8fb09e498 100644
|
||||||
|
--- a/src/nautilus-freedesktop-dbus.h
|
||||||
|
+++ b/src/nautilus-freedesktop-dbus.h
|
||||||
|
@@ -21,6 +21,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
+#include <gio/gio.h>
|
||||||
|
|
||||||
|
#define NAUTILUS_FDO_DBUS_IFACE "org.freedesktop.FileManager1"
|
||||||
|
#define NAUTILUS_FDO_DBUS_NAME "org.freedesktop.FileManager1"
|
||||||
|
@@ -30,7 +31,10 @@
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE (NautilusFreedesktopDBus, nautilus_freedesktop_dbus, NAUTILUS, FREEDESKTOP_DBUS, GObject);
|
||||||
|
|
||||||
|
-NautilusFreedesktopDBus * nautilus_freedesktop_dbus_new (void);
|
||||||
|
+NautilusFreedesktopDBus * nautilus_freedesktop_dbus_new (GDBusConnection *connection);
|
||||||
|
+
|
||||||
|
+gboolean nautilus_freedesktop_dbus_register (NautilusFreedesktopDBus *fdb, GError **error);
|
||||||
|
+void nautilus_freedesktop_dbus_unregister (NautilusFreedesktopDBus *fdb);
|
||||||
|
|
||||||
|
void nautilus_freedesktop_dbus_set_open_locations (NautilusFreedesktopDBus *fdb, const gchar **locations);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,611 @@
|
|||||||
|
From 98c79d46ab05bd86fc1309d9ae560edc19f62071 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Fri, 30 Jul 2021 10:52:55 +0200
|
||||||
|
Subject: [PATCH] compress-dialog: Add support for encrypted .zip
|
||||||
|
|
||||||
|
Currently, it is not possible to create encrypted archives over
|
||||||
|
Nautilus. Let's add support for encrypted .zip files to not have
|
||||||
|
to install a dedicated archive manager.
|
||||||
|
|
||||||
|
Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/822
|
||||||
|
---
|
||||||
|
data/org.gnome.nautilus.gschema.xml | 1 +
|
||||||
|
meson.build | 2 +-
|
||||||
|
src/nautilus-compress-dialog-controller.c | 136 +++++++++++++++++++
|
||||||
|
src/nautilus-compress-dialog-controller.h | 1 +
|
||||||
|
src/nautilus-file-operations.c | 8 +-
|
||||||
|
src/nautilus-file-operations.h | 1 +
|
||||||
|
src/nautilus-file-undo-operations.c | 7 +-
|
||||||
|
src/nautilus-file-undo-operations.h | 3 +-
|
||||||
|
src/nautilus-files-view.c | 10 ++
|
||||||
|
src/nautilus-global-preferences.h | 3 +-
|
||||||
|
src/resources/css/nautilus.css | 9 ++
|
||||||
|
src/resources/ui/nautilus-compress-dialog.ui | 57 ++++++++
|
||||||
|
12 files changed, 233 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/data/org.gnome.nautilus.gschema.xml b/data/org.gnome.nautilus.gschema.xml
|
||||||
|
index 3f89466de..7585be8cd 100644
|
||||||
|
--- a/data/org.gnome.nautilus.gschema.xml
|
||||||
|
+++ b/data/org.gnome.nautilus.gschema.xml
|
||||||
|
@@ -65,6 +65,7 @@
|
||||||
|
<value value="0" nick="zip"/>
|
||||||
|
<value value="1" nick="tar.xz"/>
|
||||||
|
<value value="2" nick="7z"/>
|
||||||
|
+ <value value="3" nick="encrypted_zip"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<schema path="/org/gnome/nautilus/" id="org.gnome.nautilus" gettext-domain="nautilus">
|
||||||
|
diff --git a/meson.build b/meson.build
|
||||||
|
index d5316475d..446b25614 100644
|
||||||
|
--- a/meson.build
|
||||||
|
+++ b/meson.build
|
||||||
|
@@ -117,7 +117,7 @@ gio = dependency('gio-2.0', version: glib_ver)
|
||||||
|
gio_unix = dependency('gio-unix-2.0', version: glib_ver)
|
||||||
|
glib = dependency('glib-2.0', version: glib_ver)
|
||||||
|
gmodule = dependency('gmodule-no-export-2.0', version: glib_ver)
|
||||||
|
-gnome_autoar = dependency('gnome-autoar-0', version: '>= 0.3.0')
|
||||||
|
+gnome_autoar = dependency('gnome-autoar-0', version: '>= 0.4.0')
|
||||||
|
gnome_desktop = dependency('gnome-desktop-3.0', version: '>= 3.0.0')
|
||||||
|
gtk = dependency('gtk+-3.0', version: '>= 3.22.27')
|
||||||
|
libhandy = dependency('libhandy-1', version: '>= 1.1.90')
|
||||||
|
diff --git a/src/nautilus-compress-dialog-controller.c b/src/nautilus-compress-dialog-controller.c
|
||||||
|
index 154573c0f..e1ba5a803 100644
|
||||||
|
--- a/src/nautilus-compress-dialog-controller.c
|
||||||
|
+++ b/src/nautilus-compress-dialog-controller.c
|
||||||
|
@@ -32,17 +32,24 @@ struct _NautilusCompressDialogController
|
||||||
|
NautilusFileNameWidgetController parent_instance;
|
||||||
|
|
||||||
|
GtkWidget *compress_dialog;
|
||||||
|
+ GtkWidget *activate_button;
|
||||||
|
+ GtkWidget *error_label;
|
||||||
|
GtkWidget *name_entry;
|
||||||
|
GtkWidget *extension_stack;
|
||||||
|
GtkWidget *zip_label;
|
||||||
|
+ GtkWidget *encrypted_zip_label;
|
||||||
|
GtkWidget *tar_xz_label;
|
||||||
|
GtkWidget *seven_zip_label;
|
||||||
|
GtkWidget *extension_popover;
|
||||||
|
GtkWidget *zip_checkmark;
|
||||||
|
+ GtkWidget *encrypted_zip_checkmark;
|
||||||
|
GtkWidget *tar_xz_checkmark;
|
||||||
|
GtkWidget *seven_zip_checkmark;
|
||||||
|
+ GtkWidget *passphrase_label;
|
||||||
|
+ GtkWidget *passphrase_entry;
|
||||||
|
|
||||||
|
const char *extension;
|
||||||
|
+ gchar *passphrase;
|
||||||
|
|
||||||
|
gulong response_handler_id;
|
||||||
|
};
|
||||||
|
@@ -142,6 +149,7 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
const char *extension;
|
||||||
|
GtkWidget *active_label;
|
||||||
|
GtkWidget *active_checkmark;
|
||||||
|
+ gboolean show_passphrase = FALSE;
|
||||||
|
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
@@ -153,6 +161,15 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case NAUTILUS_COMPRESSION_ENCRYPTED_ZIP:
|
||||||
|
+ {
|
||||||
|
+ extension = ".zip";
|
||||||
|
+ active_label = self->encrypted_zip_label;
|
||||||
|
+ active_checkmark = self->encrypted_zip_checkmark;
|
||||||
|
+ show_passphrase = TRUE;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case NAUTILUS_COMPRESSION_TAR_XZ:
|
||||||
|
{
|
||||||
|
extension = ".tar.xz";
|
||||||
|
@@ -178,12 +195,26 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
|
||||||
|
self->extension = extension;
|
||||||
|
|
||||||
|
+ gtk_widget_set_visible (self->passphrase_label, show_passphrase);
|
||||||
|
+ gtk_widget_set_visible (self->passphrase_entry, show_passphrase);
|
||||||
|
+ if (!show_passphrase)
|
||||||
|
+ {
|
||||||
|
+ gtk_entry_set_text (GTK_ENTRY (self->passphrase_entry), "");
|
||||||
|
+ gtk_entry_set_visibility (GTK_ENTRY (self->passphrase_entry), FALSE);
|
||||||
|
+ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->passphrase_entry),
|
||||||
|
+ GTK_ENTRY_ICON_SECONDARY,
|
||||||
|
+ "view-conceal");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
gtk_stack_set_visible_child (GTK_STACK (self->extension_stack),
|
||||||
|
active_label);
|
||||||
|
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (self->zip_checkmark),
|
||||||
|
NULL,
|
||||||
|
GTK_ICON_SIZE_BUTTON);
|
||||||
|
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->encrypted_zip_checkmark),
|
||||||
|
+ NULL,
|
||||||
|
+ GTK_ICON_SIZE_BUTTON);
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (self->tar_xz_checkmark),
|
||||||
|
NULL,
|
||||||
|
GTK_ICON_SIZE_BUTTON);
|
||||||
|
@@ -200,6 +231,7 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
/* Since the extension changes when the button is toggled, force a
|
||||||
|
* verification of the new file name by simulating an entry change
|
||||||
|
*/
|
||||||
|
+ gtk_widget_set_sensitive (self->activate_button, FALSE);
|
||||||
|
g_signal_emit_by_name (self->name_entry, "changed");
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -216,6 +248,19 @@ zip_row_on_activated (HdyActionRow *row,
|
||||||
|
NAUTILUS_COMPRESSION_ZIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+encrypted_zip_row_on_activated (HdyActionRow *row,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ NautilusCompressDialogController *controller;
|
||||||
|
+
|
||||||
|
+ controller = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
+
|
||||||
|
+ gtk_popover_popdown (GTK_POPOVER (controller->extension_popover));
|
||||||
|
+ update_selected_format (controller,
|
||||||
|
+ NAUTILUS_COMPRESSION_ENCRYPTED_ZIP);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
tar_xz_row_on_activated (HdyActionRow *row,
|
||||||
|
gpointer user_data)
|
||||||
|
@@ -242,6 +287,67 @@ seven_zip_row_on_activated (HdyActionRow *row,
|
||||||
|
NAUTILUS_COMPRESSION_7ZIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+passphrase_entry_on_changed (GtkEditable *editable,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ NautilusCompressDialogController *self;
|
||||||
|
+ const gchar *error_message;
|
||||||
|
+
|
||||||
|
+ self = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
+
|
||||||
|
+ g_free (self->passphrase);
|
||||||
|
+ self->passphrase = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->passphrase_entry)));
|
||||||
|
+
|
||||||
|
+ /* Simulate a change of the name_entry to ensure the correct sensitivity of
|
||||||
|
+ * the activate_button, but only if the name_entry is valid in order to
|
||||||
|
+ * avoid changes of the error_revealer.
|
||||||
|
+ */
|
||||||
|
+ error_message = gtk_label_get_text (GTK_LABEL (self->error_label));
|
||||||
|
+ if (error_message[0] == '\0')
|
||||||
|
+ {
|
||||||
|
+ gtk_widget_set_sensitive (self->activate_button, FALSE);
|
||||||
|
+ g_signal_emit_by_name (self->name_entry, "changed");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+passphrase_entry_on_icon_press (GtkEntry *entry,
|
||||||
|
+ GtkEntryIconPosition icon_pos,
|
||||||
|
+ GdkEvent *event,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ NautilusCompressDialogController *self;
|
||||||
|
+ gboolean visibility;
|
||||||
|
+
|
||||||
|
+ self = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
+ visibility = gtk_entry_get_visibility (GTK_ENTRY (self->passphrase_entry));
|
||||||
|
+
|
||||||
|
+ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->passphrase_entry),
|
||||||
|
+ GTK_ENTRY_ICON_SECONDARY,
|
||||||
|
+ visibility ? "view-conceal" : "view-reveal");
|
||||||
|
+ gtk_entry_set_visibility (GTK_ENTRY (self->passphrase_entry), !visibility);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+activate_button_on_sensitive_notify (GObject *gobject,
|
||||||
|
+ GParamSpec *pspec,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ NautilusCompressDialogController *self;
|
||||||
|
+ NautilusCompressionFormat format;
|
||||||
|
+
|
||||||
|
+ self = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
+ format = g_settings_get_enum (nautilus_compression_preferences,
|
||||||
|
+ NAUTILUS_PREFERENCES_DEFAULT_COMPRESSION_FORMAT);
|
||||||
|
+ if (format == NAUTILUS_COMPRESSION_ENCRYPTED_ZIP &&
|
||||||
|
+ (self->passphrase == NULL || self->passphrase[0] == '\0'))
|
||||||
|
+ {
|
||||||
|
+ /* Reset sensitivity of the activate_button if password is not set. */
|
||||||
|
+ gtk_widget_set_sensitive (self->activate_button, FALSE);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
NautilusCompressDialogController *
|
||||||
|
nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
NautilusDirectory *destination_directory,
|
||||||
|
@@ -256,12 +362,16 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
GtkWidget *activate_button;
|
||||||
|
GtkWidget *extension_stack;
|
||||||
|
GtkWidget *zip_label;
|
||||||
|
+ GtkWidget *encrypted_zip_label;
|
||||||
|
GtkWidget *tar_xz_label;
|
||||||
|
GtkWidget *seven_zip_label;
|
||||||
|
GtkWidget *extension_popover;
|
||||||
|
GtkWidget *zip_checkmark;
|
||||||
|
+ GtkWidget *encrypted_zip_checkmark;
|
||||||
|
GtkWidget *tar_xz_checkmark;
|
||||||
|
GtkWidget *seven_zip_checkmark;
|
||||||
|
+ GtkWidget *passphrase_label;
|
||||||
|
+ GtkWidget *passphrase_entry;
|
||||||
|
NautilusCompressionFormat format;
|
||||||
|
|
||||||
|
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-compress-dialog.ui");
|
||||||
|
@@ -272,12 +382,16 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
activate_button = GTK_WIDGET (gtk_builder_get_object (builder, "activate_button"));
|
||||||
|
extension_stack = GTK_WIDGET (gtk_builder_get_object (builder, "extension_stack"));
|
||||||
|
zip_label = GTK_WIDGET (gtk_builder_get_object (builder, "zip_label"));
|
||||||
|
+ encrypted_zip_label = GTK_WIDGET (gtk_builder_get_object (builder, "encrypted_zip_label"));
|
||||||
|
tar_xz_label = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_label"));
|
||||||
|
seven_zip_label = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_label"));
|
||||||
|
extension_popover = GTK_WIDGET (gtk_builder_get_object (builder, "extension_popover"));
|
||||||
|
zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "zip_checkmark"));
|
||||||
|
+ encrypted_zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "encrypted_zip_checkmark"));
|
||||||
|
tar_xz_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_checkmark"));
|
||||||
|
seven_zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_checkmark"));
|
||||||
|
+ passphrase_label = GTK_WIDGET (gtk_builder_get_object (builder, "passphrase_label"));
|
||||||
|
+ passphrase_entry = GTK_WIDGET (gtk_builder_get_object (builder, "passphrase_entry"));
|
||||||
|
|
||||||
|
gtk_window_set_transient_for (GTK_WINDOW (compress_dialog),
|
||||||
|
parent_window);
|
||||||
|
@@ -290,16 +404,22 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
"containing-directory", destination_directory, NULL);
|
||||||
|
|
||||||
|
self->compress_dialog = compress_dialog;
|
||||||
|
+ self->activate_button = activate_button;
|
||||||
|
+ self->error_label = error_label;
|
||||||
|
self->extension_stack = extension_stack;
|
||||||
|
self->zip_label = zip_label;
|
||||||
|
+ self->encrypted_zip_label = encrypted_zip_label;
|
||||||
|
self->tar_xz_label = tar_xz_label;
|
||||||
|
self->seven_zip_label = seven_zip_label;
|
||||||
|
self->name_entry = name_entry;
|
||||||
|
self->extension_popover = extension_popover;
|
||||||
|
self->zip_checkmark = zip_checkmark;
|
||||||
|
+ self->encrypted_zip_checkmark = encrypted_zip_checkmark;
|
||||||
|
self->tar_xz_checkmark = tar_xz_checkmark;
|
||||||
|
self->seven_zip_checkmark = seven_zip_checkmark;
|
||||||
|
self->name_entry = name_entry;
|
||||||
|
+ self->passphrase_label = passphrase_label;
|
||||||
|
+ self->passphrase_entry = passphrase_entry;
|
||||||
|
|
||||||
|
self->response_handler_id = g_signal_connect (compress_dialog,
|
||||||
|
"response",
|
||||||
|
@@ -309,10 +429,18 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
gtk_builder_add_callback_symbols (builder,
|
||||||
|
"zip_row_on_activated",
|
||||||
|
G_CALLBACK (zip_row_on_activated),
|
||||||
|
+ "encrypted_zip_row_on_activated",
|
||||||
|
+ G_CALLBACK (encrypted_zip_row_on_activated),
|
||||||
|
"tar_xz_row_on_activated",
|
||||||
|
G_CALLBACK (tar_xz_row_on_activated),
|
||||||
|
"seven_zip_row_on_activated",
|
||||||
|
G_CALLBACK (seven_zip_row_on_activated),
|
||||||
|
+ "passphrase_entry_on_changed",
|
||||||
|
+ G_CALLBACK (passphrase_entry_on_changed),
|
||||||
|
+ "passphrase_entry_on_icon_press",
|
||||||
|
+ G_CALLBACK (passphrase_entry_on_icon_press),
|
||||||
|
+ "activate_button_on_sensitive_notify",
|
||||||
|
+ G_CALLBACK (activate_button_on_sensitive_notify),
|
||||||
|
NULL);
|
||||||
|
gtk_builder_connect_signals (builder, self);
|
||||||
|
|
||||||
|
@@ -350,6 +478,8 @@ nautilus_compress_dialog_controller_finalize (GObject *object)
|
||||||
|
self->compress_dialog = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ g_free (self->passphrase);
|
||||||
|
+
|
||||||
|
G_OBJECT_CLASS (nautilus_compress_dialog_controller_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -364,3 +494,9 @@ nautilus_compress_dialog_controller_class_init (NautilusCompressDialogController
|
||||||
|
parent_class->get_new_name = nautilus_compress_dialog_controller_get_new_name;
|
||||||
|
parent_class->name_is_valid = nautilus_compress_dialog_controller_name_is_valid;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+const gchar *
|
||||||
|
+nautilus_compress_dialog_controller_get_passphrase (NautilusCompressDialogController *self)
|
||||||
|
+{
|
||||||
|
+ return self->passphrase;
|
||||||
|
+}
|
||||||
|
diff --git a/src/nautilus-compress-dialog-controller.h b/src/nautilus-compress-dialog-controller.h
|
||||||
|
index 2421b8115..6c96d68fa 100644
|
||||||
|
--- a/src/nautilus-compress-dialog-controller.h
|
||||||
|
+++ b/src/nautilus-compress-dialog-controller.h
|
||||||
|
@@ -31,3 +31,4 @@ G_DECLARE_FINAL_TYPE (NautilusCompressDialogController, nautilus_compress_dialog
|
||||||
|
NautilusCompressDialogController * nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
NautilusDirectory *destination_directory,
|
||||||
|
gchar *initial_name);
|
||||||
|
+const gchar * nautilus_compress_dialog_controller_get_passphrase (NautilusCompressDialogController *controller);
|
||||||
|
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
|
||||||
|
index 59beecd7e..f909173f9 100644
|
||||||
|
--- a/src/nautilus-file-operations.c
|
||||||
|
+++ b/src/nautilus-file-operations.c
|
||||||
|
@@ -222,6 +222,7 @@ typedef struct
|
||||||
|
|
||||||
|
AutoarFormat format;
|
||||||
|
AutoarFilter filter;
|
||||||
|
+ gchar *passphrase;
|
||||||
|
|
||||||
|
guint64 total_size;
|
||||||
|
guint total_files;
|
||||||
|
@@ -8753,6 +8754,7 @@ compress_task_done (GObject *source_object,
|
||||||
|
|
||||||
|
g_object_unref (compress_job->output_file);
|
||||||
|
g_list_free_full (compress_job->source_files, g_object_unref);
|
||||||
|
+ g_free (compress_job->passphrase);
|
||||||
|
|
||||||
|
finalize_common ((CommonJob *) compress_job);
|
||||||
|
|
||||||
|
@@ -9027,6 +9029,7 @@ compress_task_thread_func (GTask *task,
|
||||||
|
compress_job->format,
|
||||||
|
compress_job->filter,
|
||||||
|
FALSE);
|
||||||
|
+ autoar_compressor_set_passphrase (compressor, compress_job->passphrase);
|
||||||
|
|
||||||
|
autoar_compressor_set_output_is_dest (compressor, TRUE);
|
||||||
|
|
||||||
|
@@ -9057,6 +9060,7 @@ nautilus_file_operations_compress (GList *files,
|
||||||
|
GFile *output,
|
||||||
|
AutoarFormat format,
|
||||||
|
AutoarFilter filter,
|
||||||
|
+ const gchar *passphrase,
|
||||||
|
GtkWindow *parent_window,
|
||||||
|
NautilusFileOperationsDBusData *dbus_data,
|
||||||
|
NautilusCreateCallback done_callback,
|
||||||
|
@@ -9072,6 +9076,7 @@ nautilus_file_operations_compress (GList *files,
|
||||||
|
compress_job->output_file = g_object_ref (output);
|
||||||
|
compress_job->format = format;
|
||||||
|
compress_job->filter = filter;
|
||||||
|
+ compress_job->passphrase = g_strdup (passphrase);
|
||||||
|
compress_job->done_callback = done_callback;
|
||||||
|
compress_job->done_callback_data = done_callback_data;
|
||||||
|
|
||||||
|
@@ -9082,7 +9087,8 @@ nautilus_file_operations_compress (GList *files,
|
||||||
|
compress_job->common.undo_info = nautilus_file_undo_info_compress_new (files,
|
||||||
|
output,
|
||||||
|
format,
|
||||||
|
- filter);
|
||||||
|
+ filter,
|
||||||
|
+ passphrase);
|
||||||
|
}
|
||||||
|
|
||||||
|
task = g_task_new (NULL, compress_job->common.cancellable,
|
||||||
|
diff --git a/src/nautilus-file-operations.h b/src/nautilus-file-operations.h
|
||||||
|
index 8236e0e06..14d664f80 100644
|
||||||
|
--- a/src/nautilus-file-operations.h
|
||||||
|
+++ b/src/nautilus-file-operations.h
|
||||||
|
@@ -159,6 +159,7 @@ void nautilus_file_operations_compress (GList *files,
|
||||||
|
GFile *output,
|
||||||
|
AutoarFormat format,
|
||||||
|
AutoarFilter filter,
|
||||||
|
+ const gchar *passphrase,
|
||||||
|
GtkWindow *parent_window,
|
||||||
|
NautilusFileOperationsDBusData *dbus_data,
|
||||||
|
NautilusCreateCallback done_callback,
|
||||||
|
diff --git a/src/nautilus-file-undo-operations.c b/src/nautilus-file-undo-operations.c
|
||||||
|
index a6a3b2025..64f9ce76c 100644
|
||||||
|
--- a/src/nautilus-file-undo-operations.c
|
||||||
|
+++ b/src/nautilus-file-undo-operations.c
|
||||||
|
@@ -2495,6 +2495,7 @@ struct _NautilusFileUndoInfoCompress
|
||||||
|
GFile *output;
|
||||||
|
AutoarFormat format;
|
||||||
|
AutoarFilter filter;
|
||||||
|
+ gchar *passphrase;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (NautilusFileUndoInfoCompress, nautilus_file_undo_info_compress, NAUTILUS_TYPE_FILE_UNDO_INFO)
|
||||||
|
@@ -2562,6 +2563,7 @@ compress_redo_func (NautilusFileUndoInfo *info,
|
||||||
|
self->output,
|
||||||
|
self->format,
|
||||||
|
self->filter,
|
||||||
|
+ self->passphrase,
|
||||||
|
parent_window,
|
||||||
|
dbus_data,
|
||||||
|
compress_callback,
|
||||||
|
@@ -2597,6 +2599,7 @@ nautilus_file_undo_info_compress_finalize (GObject *obj)
|
||||||
|
|
||||||
|
g_list_free_full (self->sources, g_object_unref);
|
||||||
|
g_clear_object (&self->output);
|
||||||
|
+ g_free (self->passphrase);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (nautilus_file_undo_info_compress_parent_class)->finalize (obj);
|
||||||
|
}
|
||||||
|
@@ -2618,7 +2621,8 @@ NautilusFileUndoInfo *
|
||||||
|
nautilus_file_undo_info_compress_new (GList *sources,
|
||||||
|
GFile *output,
|
||||||
|
AutoarFormat format,
|
||||||
|
- AutoarFilter filter)
|
||||||
|
+ AutoarFilter filter,
|
||||||
|
+ const gchar *passphrase)
|
||||||
|
{
|
||||||
|
NautilusFileUndoInfoCompress *self;
|
||||||
|
|
||||||
|
@@ -2631,6 +2635,7 @@ nautilus_file_undo_info_compress_new (GList *sources,
|
||||||
|
self->output = g_object_ref (output);
|
||||||
|
self->format = format;
|
||||||
|
self->filter = filter;
|
||||||
|
+ self->passphrase = g_strdup (passphrase);
|
||||||
|
|
||||||
|
return NAUTILUS_FILE_UNDO_INFO (self);
|
||||||
|
}
|
||||||
|
diff --git a/src/nautilus-file-undo-operations.h b/src/nautilus-file-undo-operations.h
|
||||||
|
index f96f2fe69..09ae17cef 100644
|
||||||
|
--- a/src/nautilus-file-undo-operations.h
|
||||||
|
+++ b/src/nautilus-file-undo-operations.h
|
||||||
|
@@ -226,4 +226,5 @@ G_DECLARE_FINAL_TYPE (NautilusFileUndoInfoCompress, nautilus_file_undo_info_comp
|
||||||
|
NautilusFileUndoInfo * nautilus_file_undo_info_compress_new (GList *sources,
|
||||||
|
GFile *output,
|
||||||
|
AutoarFormat format,
|
||||||
|
- AutoarFilter filter);
|
||||||
|
+ AutoarFilter filter,
|
||||||
|
+ const gchar *passphrase);
|
||||||
|
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
|
||||||
|
index b4a91226b..47aed3cc1 100644
|
||||||
|
--- a/src/nautilus-files-view.c
|
||||||
|
+++ b/src/nautilus-files-view.c
|
||||||
|
@@ -2235,6 +2235,7 @@ compress_dialog_controller_on_name_accepted (NautilusFileNameWidgetController *c
|
||||||
|
NautilusFilesViewPrivate *priv;
|
||||||
|
AutoarFormat format;
|
||||||
|
AutoarFilter filter;
|
||||||
|
+ const gchar *passphrase = NULL;
|
||||||
|
|
||||||
|
view = NAUTILUS_FILES_VIEW (callback_data->view);
|
||||||
|
priv = nautilus_files_view_get_instance_private (view);
|
||||||
|
@@ -2280,6 +2281,14 @@ compress_dialog_controller_on_name_accepted (NautilusFileNameWidgetController *c
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case NAUTILUS_COMPRESSION_ENCRYPTED_ZIP:
|
||||||
|
+ {
|
||||||
|
+ format = AUTOAR_FORMAT_ZIP;
|
||||||
|
+ filter = AUTOAR_FILTER_NONE;
|
||||||
|
+ passphrase = nautilus_compress_dialog_controller_get_passphrase (priv->compress_controller);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case NAUTILUS_COMPRESSION_TAR_XZ:
|
||||||
|
{
|
||||||
|
format = AUTOAR_FORMAT_TAR;
|
||||||
|
@@ -2301,6 +2310,7 @@ compress_dialog_controller_on_name_accepted (NautilusFileNameWidgetController *c
|
||||||
|
nautilus_file_operations_compress (source_files, output,
|
||||||
|
format,
|
||||||
|
filter,
|
||||||
|
+ passphrase,
|
||||||
|
nautilus_files_view_get_containing_window (view),
|
||||||
|
NULL,
|
||||||
|
compress_done,
|
||||||
|
diff --git a/src/nautilus-global-preferences.h b/src/nautilus-global-preferences.h
|
||||||
|
index 8c482f7ce..2e8753b3c 100644
|
||||||
|
--- a/src/nautilus-global-preferences.h
|
||||||
|
+++ b/src/nautilus-global-preferences.h
|
||||||
|
@@ -77,7 +77,8 @@ typedef enum
|
||||||
|
{
|
||||||
|
NAUTILUS_COMPRESSION_ZIP = 0,
|
||||||
|
NAUTILUS_COMPRESSION_TAR_XZ,
|
||||||
|
- NAUTILUS_COMPRESSION_7ZIP
|
||||||
|
+ NAUTILUS_COMPRESSION_7ZIP,
|
||||||
|
+ NAUTILUS_COMPRESSION_ENCRYPTED_ZIP
|
||||||
|
} NautilusCompressionFormat;
|
||||||
|
|
||||||
|
/* Icon View */
|
||||||
|
diff --git a/src/resources/css/nautilus.css b/src/resources/css/nautilus.css
|
||||||
|
index 2e46b7abe..ee25a36a8 100644
|
||||||
|
--- a/src/resources/css/nautilus.css
|
||||||
|
+++ b/src/resources/css/nautilus.css
|
||||||
|
@@ -3,3 +3,12 @@
|
||||||
|
padding-left: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+label.encrypted_zip,
|
||||||
|
+row.encrypted_zip label.title {
|
||||||
|
+ background-image: -gtk-icontheme('system-lock-screen-symbolic');
|
||||||
|
+ background-position: right center;
|
||||||
|
+ background-repeat: no-repeat;
|
||||||
|
+ background-size: 16px 16px;
|
||||||
|
+ padding-right: 24px;
|
||||||
|
+}
|
||||||
|
diff --git a/src/resources/ui/nautilus-compress-dialog.ui b/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
index b36539294..a57765eed 100644
|
||||||
|
--- a/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
+++ b/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
@@ -28,6 +28,26 @@
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="HdyActionRow" id="encrypted_zip_row">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="activatable">True</property>
|
||||||
|
+ <property name="title" translatable="no">.zip</property>
|
||||||
|
+ <property name="subtitle" translatable="yes">Password protected .zip, must be installed on Windows and Mac.</property>
|
||||||
|
+ <signal name="activated" handler="encrypted_zip_row_on_activated"/>
|
||||||
|
+ <style>
|
||||||
|
+ <class name="encrypted_zip"/>
|
||||||
|
+ </style>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkImage" id="encrypted_zip_checkmark">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="width-request">16</property>
|
||||||
|
+ <property name="margin-start">12</property>
|
||||||
|
+ <property name="margin-end">12</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
<child>
|
||||||
|
<object class="HdyActionRow">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
@@ -129,6 +149,15 @@
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="encrypted_zip_label">
|
||||||
|
+ <property name="label" translatable="no">.zip</property>
|
||||||
|
+ <property name="xalign">0</property>
|
||||||
|
+ <style>
|
||||||
|
+ <class name="encrypted_zip"/>
|
||||||
|
+ </style>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="tar_xz_label">
|
||||||
|
<property name="label" translatable="no">.tar.xz</property>
|
||||||
|
@@ -179,6 +208,33 @@
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="passphrase_label">
|
||||||
|
+ <property name="label" translatable="yes">Password</property>
|
||||||
|
+ <property name="margin-top">6</property>
|
||||||
|
+ <property name="xalign">0</property>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">4</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkEntry" id="passphrase_entry">
|
||||||
|
+ <property name="placeholder-text" translatable="yes">Enter a password here.</property>
|
||||||
|
+ <property name="input-purpose">password</property>
|
||||||
|
+ <property name="visibility">False</property>
|
||||||
|
+ <property name="secondary-icon-name">view-conceal</property>
|
||||||
|
+ <signal name="changed" handler="passphrase_entry_on_changed"/>
|
||||||
|
+ <signal name="icon-press" handler="passphrase_entry_on_icon_press"/>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">5</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="action">
|
||||||
|
@@ -197,6 +253,7 @@
|
||||||
|
<property name="can_default">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
+ <signal name="notify::sensitive" handler="activate_button_on_sensitive_notify"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<action-widgets>
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -0,0 +1,173 @@
|
|||||||
|
From f3b1a749669c241ae3802e72a22a4eb7d1a44eed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Clyde Laforge <clyde.laforge@protonmail.ch>
|
||||||
|
Date: Mon, 16 Aug 2021 14:41:39 +0200
|
||||||
|
Subject: [PATCH] compress-dialog: Set keyboard focus on the row with the
|
||||||
|
selected archive format
|
||||||
|
|
||||||
|
Currently the keyboard focus for the type of archive choice is always on
|
||||||
|
the first element.
|
||||||
|
|
||||||
|
This patch allows the focus to be on the currently selected item instead.
|
||||||
|
|
||||||
|
Fixes https://gitlab.gnome.org/GNOME/nautilus/-/issues/1944
|
||||||
|
---
|
||||||
|
src/nautilus-compress-dialog-controller.c | 62 ++++++++++++++++++++
|
||||||
|
src/resources/ui/nautilus-compress-dialog.ui | 7 ++-
|
||||||
|
2 files changed, 66 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-compress-dialog-controller.c b/src/nautilus-compress-dialog-controller.c
|
||||||
|
index e1ba5a803..3f7711ccb 100644
|
||||||
|
--- a/src/nautilus-compress-dialog-controller.c
|
||||||
|
+++ b/src/nautilus-compress-dialog-controller.c
|
||||||
|
@@ -36,9 +36,13 @@ struct _NautilusCompressDialogController
|
||||||
|
GtkWidget *error_label;
|
||||||
|
GtkWidget *name_entry;
|
||||||
|
GtkWidget *extension_stack;
|
||||||
|
+ GtkWidget *zip_row;
|
||||||
|
GtkWidget *zip_label;
|
||||||
|
+ GtkWidget *encrypted_zip_row;
|
||||||
|
GtkWidget *encrypted_zip_label;
|
||||||
|
+ GtkWidget *tar_xz_row;
|
||||||
|
GtkWidget *tar_xz_label;
|
||||||
|
+ GtkWidget *seven_zip_row;
|
||||||
|
GtkWidget *seven_zip_label;
|
||||||
|
GtkWidget *extension_popover;
|
||||||
|
GtkWidget *zip_checkmark;
|
||||||
|
@@ -348,6 +352,50 @@ activate_button_on_sensitive_notify (GObject *gobject,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+popover_on_show (GtkWidget *widget,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ NautilusCompressDialogController *self;
|
||||||
|
+ NautilusCompressionFormat format;
|
||||||
|
+
|
||||||
|
+ self = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
+ format = g_settings_get_enum (nautilus_compression_preferences,
|
||||||
|
+ NAUTILUS_PREFERENCES_DEFAULT_COMPRESSION_FORMAT);
|
||||||
|
+ switch (format)
|
||||||
|
+ {
|
||||||
|
+ case NAUTILUS_COMPRESSION_ZIP:
|
||||||
|
+ {
|
||||||
|
+ gtk_widget_grab_focus (self->zip_row);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case NAUTILUS_COMPRESSION_ENCRYPTED_ZIP:
|
||||||
|
+ {
|
||||||
|
+ gtk_widget_grab_focus (self->encrypted_zip_row);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case NAUTILUS_COMPRESSION_TAR_XZ:
|
||||||
|
+ {
|
||||||
|
+ gtk_widget_grab_focus (self->tar_xz_row);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case NAUTILUS_COMPRESSION_7ZIP:
|
||||||
|
+ {
|
||||||
|
+ gtk_widget_grab_focus (self->seven_zip_row);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ {
|
||||||
|
+ g_assert_not_reached ();
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
NautilusCompressDialogController *
|
||||||
|
nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
NautilusDirectory *destination_directory,
|
||||||
|
@@ -361,9 +409,13 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
GtkWidget *name_entry;
|
||||||
|
GtkWidget *activate_button;
|
||||||
|
GtkWidget *extension_stack;
|
||||||
|
+ GtkWidget *zip_row;
|
||||||
|
GtkWidget *zip_label;
|
||||||
|
+ GtkWidget *encrypted_zip_row;
|
||||||
|
GtkWidget *encrypted_zip_label;
|
||||||
|
+ GtkWidget *tar_xz_row;
|
||||||
|
GtkWidget *tar_xz_label;
|
||||||
|
+ GtkWidget *seven_zip_row;
|
||||||
|
GtkWidget *seven_zip_label;
|
||||||
|
GtkWidget *extension_popover;
|
||||||
|
GtkWidget *zip_checkmark;
|
||||||
|
@@ -392,6 +444,10 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
seven_zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_checkmark"));
|
||||||
|
passphrase_label = GTK_WIDGET (gtk_builder_get_object (builder, "passphrase_label"));
|
||||||
|
passphrase_entry = GTK_WIDGET (gtk_builder_get_object (builder, "passphrase_entry"));
|
||||||
|
+ zip_row = GTK_WIDGET (gtk_builder_get_object (builder, "zip_row"));
|
||||||
|
+ encrypted_zip_row = GTK_WIDGET (gtk_builder_get_object (builder, "encrypted_zip_row"));
|
||||||
|
+ tar_xz_row = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_row"));
|
||||||
|
+ seven_zip_row = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_row"));
|
||||||
|
|
||||||
|
gtk_window_set_transient_for (GTK_WINDOW (compress_dialog),
|
||||||
|
parent_window);
|
||||||
|
@@ -420,6 +476,10 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
self->name_entry = name_entry;
|
||||||
|
self->passphrase_label = passphrase_label;
|
||||||
|
self->passphrase_entry = passphrase_entry;
|
||||||
|
+ self->zip_row = zip_row;
|
||||||
|
+ self->encrypted_zip_row = encrypted_zip_row;
|
||||||
|
+ self->tar_xz_row = tar_xz_row;
|
||||||
|
+ self->seven_zip_row = seven_zip_row;
|
||||||
|
|
||||||
|
self->response_handler_id = g_signal_connect (compress_dialog,
|
||||||
|
"response",
|
||||||
|
@@ -441,6 +501,8 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
G_CALLBACK (passphrase_entry_on_icon_press),
|
||||||
|
"activate_button_on_sensitive_notify",
|
||||||
|
G_CALLBACK (activate_button_on_sensitive_notify),
|
||||||
|
+ "popover_on_show",
|
||||||
|
+ G_CALLBACK (popover_on_show),
|
||||||
|
NULL);
|
||||||
|
gtk_builder_connect_signals (builder, self);
|
||||||
|
|
||||||
|
diff --git a/src/resources/ui/nautilus-compress-dialog.ui b/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
index a57765eed..a6bf9c1fb 100644
|
||||||
|
--- a/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
+++ b/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
@@ -2,6 +2,7 @@
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="3.14"/>
|
||||||
|
<object class="GtkPopover" id="extension_popover">
|
||||||
|
+ <signal name="show" handler="popover_on_show"/>
|
||||||
|
<property name="position">bottom</property>
|
||||||
|
<property name="constrain-to">none</property>
|
||||||
|
<child>
|
||||||
|
@@ -12,7 +13,7 @@
|
||||||
|
<property name="margin-start">12</property>
|
||||||
|
<property name="margin-end">12</property>
|
||||||
|
<child>
|
||||||
|
- <object class="HdyActionRow">
|
||||||
|
+ <object class="HdyActionRow" id="zip_row">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="activatable">True</property>
|
||||||
|
<property name="title" translatable="no">.zip</property>
|
||||||
|
@@ -49,7 +50,7 @@
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
- <object class="HdyActionRow">
|
||||||
|
+ <object class="HdyActionRow" id="tar_xz_row">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="activatable">True</property>
|
||||||
|
<property name="title" translatable="no">.tar.xz</property>
|
||||||
|
@@ -66,7 +67,7 @@
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
- <object class="HdyActionRow">
|
||||||
|
+ <object class="HdyActionRow" id="seven_zip_row">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="activatable">True</property>
|
||||||
|
<property name="title" translatable="no">.7z</property>
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -0,0 +1,564 @@
|
|||||||
|
From e71b54bafcbfffcb352600ebff4be8776de171f9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Fri, 30 Jul 2021 11:01:42 +0200
|
||||||
|
Subject: [PATCH] compress-dialog: Update dialog design
|
||||||
|
|
||||||
|
Let's update the Compress dialog design as per the mockup for the
|
||||||
|
encrypted archives support. The most visible change is `GtkPopover`
|
||||||
|
with `HdyActionRow` rows for the format selection instead of the
|
||||||
|
`GtkRadioButton` buttons.
|
||||||
|
|
||||||
|
https://gitlab.gnome.org/GNOME/nautilus/-/issues/822
|
||||||
|
---
|
||||||
|
src/nautilus-compress-dialog-controller.c | 132 ++++++-----
|
||||||
|
src/resources/ui/nautilus-compress-dialog.ui | 229 ++++++++++---------
|
||||||
|
2 files changed, 199 insertions(+), 162 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-compress-dialog-controller.c b/src/nautilus-compress-dialog-controller.c
|
||||||
|
index d8aa792ee..154573c0f 100644
|
||||||
|
--- a/src/nautilus-compress-dialog-controller.c
|
||||||
|
+++ b/src/nautilus-compress-dialog-controller.c
|
||||||
|
@@ -19,6 +19,7 @@
|
||||||
|
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
#include <gnome-autoar/gnome-autoar.h>
|
||||||
|
+#include <libhandy-1/handy.h>
|
||||||
|
|
||||||
|
#include <eel/eel-vfs-extensions.h>
|
||||||
|
|
||||||
|
@@ -31,11 +32,15 @@ struct _NautilusCompressDialogController
|
||||||
|
NautilusFileNameWidgetController parent_instance;
|
||||||
|
|
||||||
|
GtkWidget *compress_dialog;
|
||||||
|
- GtkWidget *description_stack;
|
||||||
|
GtkWidget *name_entry;
|
||||||
|
- GtkWidget *zip_radio_button;
|
||||||
|
- GtkWidget *tar_xz_radio_button;
|
||||||
|
- GtkWidget *seven_zip_radio_button;
|
||||||
|
+ GtkWidget *extension_stack;
|
||||||
|
+ GtkWidget *zip_label;
|
||||||
|
+ GtkWidget *tar_xz_label;
|
||||||
|
+ GtkWidget *seven_zip_label;
|
||||||
|
+ GtkWidget *extension_popover;
|
||||||
|
+ GtkWidget *zip_checkmark;
|
||||||
|
+ GtkWidget *tar_xz_checkmark;
|
||||||
|
+ GtkWidget *seven_zip_checkmark;
|
||||||
|
|
||||||
|
const char *extension;
|
||||||
|
|
||||||
|
@@ -135,32 +140,32 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
NautilusCompressionFormat format)
|
||||||
|
{
|
||||||
|
const char *extension;
|
||||||
|
- const char *description_label_name;
|
||||||
|
- GtkWidget *active_button;
|
||||||
|
+ GtkWidget *active_label;
|
||||||
|
+ GtkWidget *active_checkmark;
|
||||||
|
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case NAUTILUS_COMPRESSION_ZIP:
|
||||||
|
{
|
||||||
|
extension = ".zip";
|
||||||
|
- description_label_name = "zip-description-label";
|
||||||
|
- active_button = self->zip_radio_button;
|
||||||
|
+ active_label = self->zip_label;
|
||||||
|
+ active_checkmark = self->zip_checkmark;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NAUTILUS_COMPRESSION_TAR_XZ:
|
||||||
|
{
|
||||||
|
extension = ".tar.xz";
|
||||||
|
- description_label_name = "tar-xz-description-label";
|
||||||
|
- active_button = self->tar_xz_radio_button;
|
||||||
|
+ active_label = self->tar_xz_label;
|
||||||
|
+ active_checkmark = self->tar_xz_checkmark;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NAUTILUS_COMPRESSION_7ZIP:
|
||||||
|
{
|
||||||
|
extension = ".7z";
|
||||||
|
- description_label_name = "seven-zip-description-label";
|
||||||
|
- active_button = self->seven_zip_radio_button;
|
||||||
|
+ active_label = self->seven_zip_label;
|
||||||
|
+ active_checkmark = self->seven_zip_checkmark;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -173,11 +178,21 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
|
||||||
|
self->extension = extension;
|
||||||
|
|
||||||
|
- gtk_stack_set_visible_child_name (GTK_STACK (self->description_stack),
|
||||||
|
- description_label_name);
|
||||||
|
-
|
||||||
|
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (active_button),
|
||||||
|
- TRUE);
|
||||||
|
+ gtk_stack_set_visible_child (GTK_STACK (self->extension_stack),
|
||||||
|
+ active_label);
|
||||||
|
+
|
||||||
|
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->zip_checkmark),
|
||||||
|
+ NULL,
|
||||||
|
+ GTK_ICON_SIZE_BUTTON);
|
||||||
|
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->tar_xz_checkmark),
|
||||||
|
+ NULL,
|
||||||
|
+ GTK_ICON_SIZE_BUTTON);
|
||||||
|
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->seven_zip_checkmark),
|
||||||
|
+ NULL,
|
||||||
|
+ GTK_ICON_SIZE_BUTTON);
|
||||||
|
+ gtk_image_set_from_icon_name (GTK_IMAGE (active_checkmark),
|
||||||
|
+ "object-select-symbolic",
|
||||||
|
+ GTK_ICON_SIZE_BUTTON);
|
||||||
|
|
||||||
|
g_settings_set_enum (nautilus_compression_preferences,
|
||||||
|
NAUTILUS_PREFERENCES_DEFAULT_COMPRESSION_FORMAT,
|
||||||
|
@@ -189,52 +204,40 @@ update_selected_format (NautilusCompressDialogController *self,
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-zip_radio_button_on_toggled (GtkToggleButton *toggle_button,
|
||||||
|
- gpointer user_data)
|
||||||
|
+zip_row_on_activated (HdyActionRow *row,
|
||||||
|
+ gpointer user_data)
|
||||||
|
{
|
||||||
|
NautilusCompressDialogController *controller;
|
||||||
|
|
||||||
|
controller = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
|
||||||
|
- if (!gtk_toggle_button_get_active (toggle_button))
|
||||||
|
- {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ gtk_popover_popdown (GTK_POPOVER (controller->extension_popover));
|
||||||
|
update_selected_format (controller,
|
||||||
|
NAUTILUS_COMPRESSION_ZIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-tar_xz_radio_button_on_toggled (GtkToggleButton *toggle_button,
|
||||||
|
- gpointer user_data)
|
||||||
|
+tar_xz_row_on_activated (HdyActionRow *row,
|
||||||
|
+ gpointer user_data)
|
||||||
|
{
|
||||||
|
NautilusCompressDialogController *controller;
|
||||||
|
|
||||||
|
controller = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
|
||||||
|
- if (!gtk_toggle_button_get_active (toggle_button))
|
||||||
|
- {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ gtk_popover_popdown (GTK_POPOVER (controller->extension_popover));
|
||||||
|
update_selected_format (controller,
|
||||||
|
NAUTILUS_COMPRESSION_TAR_XZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-seven_zip_radio_button_on_toggled (GtkToggleButton *toggle_button,
|
||||||
|
- gpointer user_data)
|
||||||
|
+seven_zip_row_on_activated (HdyActionRow *row,
|
||||||
|
+ gpointer user_data)
|
||||||
|
{
|
||||||
|
NautilusCompressDialogController *controller;
|
||||||
|
|
||||||
|
controller = NAUTILUS_COMPRESS_DIALOG_CONTROLLER (user_data);
|
||||||
|
|
||||||
|
- if (!gtk_toggle_button_get_active (toggle_button))
|
||||||
|
- {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ gtk_popover_popdown (GTK_POPOVER (controller->extension_popover));
|
||||||
|
update_selected_format (controller,
|
||||||
|
NAUTILUS_COMPRESSION_7ZIP);
|
||||||
|
}
|
||||||
|
@@ -251,10 +254,14 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
GtkWidget *error_label;
|
||||||
|
GtkWidget *name_entry;
|
||||||
|
GtkWidget *activate_button;
|
||||||
|
- GtkWidget *description_stack;
|
||||||
|
- GtkWidget *zip_radio_button;
|
||||||
|
- GtkWidget *tar_xz_radio_button;
|
||||||
|
- GtkWidget *seven_zip_radio_button;
|
||||||
|
+ GtkWidget *extension_stack;
|
||||||
|
+ GtkWidget *zip_label;
|
||||||
|
+ GtkWidget *tar_xz_label;
|
||||||
|
+ GtkWidget *seven_zip_label;
|
||||||
|
+ GtkWidget *extension_popover;
|
||||||
|
+ GtkWidget *zip_checkmark;
|
||||||
|
+ GtkWidget *tar_xz_checkmark;
|
||||||
|
+ GtkWidget *seven_zip_checkmark;
|
||||||
|
NautilusCompressionFormat format;
|
||||||
|
|
||||||
|
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/ui/nautilus-compress-dialog.ui");
|
||||||
|
@@ -263,10 +270,14 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
error_label = GTK_WIDGET (gtk_builder_get_object (builder, "error_label"));
|
||||||
|
name_entry = GTK_WIDGET (gtk_builder_get_object (builder, "name_entry"));
|
||||||
|
activate_button = GTK_WIDGET (gtk_builder_get_object (builder, "activate_button"));
|
||||||
|
- zip_radio_button = GTK_WIDGET (gtk_builder_get_object (builder, "zip_radio_button"));
|
||||||
|
- tar_xz_radio_button = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_radio_button"));
|
||||||
|
- seven_zip_radio_button = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_radio_button"));
|
||||||
|
- description_stack = GTK_WIDGET (gtk_builder_get_object (builder, "description_stack"));
|
||||||
|
+ extension_stack = GTK_WIDGET (gtk_builder_get_object (builder, "extension_stack"));
|
||||||
|
+ zip_label = GTK_WIDGET (gtk_builder_get_object (builder, "zip_label"));
|
||||||
|
+ tar_xz_label = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_label"));
|
||||||
|
+ seven_zip_label = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_label"));
|
||||||
|
+ extension_popover = GTK_WIDGET (gtk_builder_get_object (builder, "extension_popover"));
|
||||||
|
+ zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "zip_checkmark"));
|
||||||
|
+ tar_xz_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "tar_xz_checkmark"));
|
||||||
|
+ seven_zip_checkmark = GTK_WIDGET (gtk_builder_get_object (builder, "seven_zip_checkmark"));
|
||||||
|
|
||||||
|
gtk_window_set_transient_for (GTK_WINDOW (compress_dialog),
|
||||||
|
parent_window);
|
||||||
|
@@ -279,10 +290,15 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
"containing-directory", destination_directory, NULL);
|
||||||
|
|
||||||
|
self->compress_dialog = compress_dialog;
|
||||||
|
- self->zip_radio_button = zip_radio_button;
|
||||||
|
- self->tar_xz_radio_button = tar_xz_radio_button;
|
||||||
|
- self->seven_zip_radio_button = seven_zip_radio_button;
|
||||||
|
- self->description_stack = description_stack;
|
||||||
|
+ self->extension_stack = extension_stack;
|
||||||
|
+ self->zip_label = zip_label;
|
||||||
|
+ self->tar_xz_label = tar_xz_label;
|
||||||
|
+ self->seven_zip_label = seven_zip_label;
|
||||||
|
+ self->name_entry = name_entry;
|
||||||
|
+ self->extension_popover = extension_popover;
|
||||||
|
+ self->zip_checkmark = zip_checkmark;
|
||||||
|
+ self->tar_xz_checkmark = tar_xz_checkmark;
|
||||||
|
+ self->seven_zip_checkmark = seven_zip_checkmark;
|
||||||
|
self->name_entry = name_entry;
|
||||||
|
|
||||||
|
self->response_handler_id = g_signal_connect (compress_dialog,
|
||||||
|
@@ -291,20 +307,18 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
self);
|
||||||
|
|
||||||
|
gtk_builder_add_callback_symbols (builder,
|
||||||
|
- "zip_radio_button_on_toggled",
|
||||||
|
- G_CALLBACK (zip_radio_button_on_toggled),
|
||||||
|
- "tar_xz_radio_button_on_toggled",
|
||||||
|
- G_CALLBACK (tar_xz_radio_button_on_toggled),
|
||||||
|
- "seven_zip_radio_button_on_toggled",
|
||||||
|
- G_CALLBACK (seven_zip_radio_button_on_toggled),
|
||||||
|
+ "zip_row_on_activated",
|
||||||
|
+ G_CALLBACK (zip_row_on_activated),
|
||||||
|
+ "tar_xz_row_on_activated",
|
||||||
|
+ G_CALLBACK (tar_xz_row_on_activated),
|
||||||
|
+ "seven_zip_row_on_activated",
|
||||||
|
+ G_CALLBACK (seven_zip_row_on_activated),
|
||||||
|
NULL);
|
||||||
|
gtk_builder_connect_signals (builder, self);
|
||||||
|
|
||||||
|
format = g_settings_get_enum (nautilus_compression_preferences,
|
||||||
|
NAUTILUS_PREFERENCES_DEFAULT_COMPRESSION_FORMAT);
|
||||||
|
|
||||||
|
- update_selected_format (self, format);
|
||||||
|
-
|
||||||
|
if (initial_name != NULL)
|
||||||
|
{
|
||||||
|
gtk_entry_set_text (GTK_ENTRY (name_entry), initial_name);
|
||||||
|
@@ -312,6 +326,8 @@ nautilus_compress_dialog_controller_new (GtkWindow *parent_window,
|
||||||
|
|
||||||
|
gtk_widget_show_all (compress_dialog);
|
||||||
|
|
||||||
|
+ update_selected_format (self, format);
|
||||||
|
+
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/resources/ui/nautilus-compress-dialog.ui b/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
index 526e9eed2..b36539294 100644
|
||||||
|
--- a/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
+++ b/src/resources/ui/nautilus-compress-dialog.ui
|
||||||
|
@@ -1,6 +1,70 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="3.14"/>
|
||||||
|
+ <object class="GtkPopover" id="extension_popover">
|
||||||
|
+ <property name="position">bottom</property>
|
||||||
|
+ <property name="constrain-to">none</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="HdyPreferencesGroup">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="margin-top">12</property>
|
||||||
|
+ <property name="margin-bottom">12</property>
|
||||||
|
+ <property name="margin-start">12</property>
|
||||||
|
+ <property name="margin-end">12</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="HdyActionRow">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="activatable">True</property>
|
||||||
|
+ <property name="title" translatable="no">.zip</property>
|
||||||
|
+ <property name="subtitle" translatable="yes">Compatible with all operating systems.</property>
|
||||||
|
+ <signal name="activated" handler="zip_row_on_activated"/>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkImage" id="zip_checkmark">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="width-request">16</property>
|
||||||
|
+ <property name="margin-start">12</property>
|
||||||
|
+ <property name="margin-end">12</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="HdyActionRow">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="activatable">True</property>
|
||||||
|
+ <property name="title" translatable="no">.tar.xz</property>
|
||||||
|
+ <property name="subtitle" translatable="yes">Smaller archives but Linux and Mac only.</property>
|
||||||
|
+ <signal name="activated" handler="tar_xz_row_on_activated"/>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkImage" id="tar_xz_checkmark">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="width-request">16</property>
|
||||||
|
+ <property name="margin-start">12</property>
|
||||||
|
+ <property name="margin-end">12</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="HdyActionRow">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="activatable">True</property>
|
||||||
|
+ <property name="title" translatable="no">.7z</property>
|
||||||
|
+ <property name="subtitle" translatable="yes">Smaller archives but must be installed on Windows and Mac.</property>
|
||||||
|
+ <signal name="activated" handler="seven_zip_row_on_activated"/>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkImage" id="seven_zip_checkmark">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="width-request">16</property>
|
||||||
|
+ <property name="margin-start">12</property>
|
||||||
|
+ <property name="margin-end">12</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
<object class="GtkDialog" id="compress_dialog">
|
||||||
|
<property name="title" translatable="yes">Create Archive</property>
|
||||||
|
<property name="resizable">False</property>
|
||||||
|
@@ -9,19 +73,26 @@
|
||||||
|
<property name="destroy_with_parent">True</property>
|
||||||
|
<property name="type_hint">dialog</property>
|
||||||
|
<property name="use-header-bar">1</property>
|
||||||
|
+ <property name="default-width">500</property>
|
||||||
|
+ <property name="default-height">210</property>
|
||||||
|
<child internal-child="vbox">
|
||||||
|
<object class="GtkBox" id="vbox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
- <property name="margin_top">18</property>
|
||||||
|
- <property name="margin_bottom">12</property>
|
||||||
|
- <property name="margin_start">18</property>
|
||||||
|
- <property name="margin_end">18</property>
|
||||||
|
+ <property name="margin-top">30</property>
|
||||||
|
+ <property name="margin-bottom">30</property>
|
||||||
|
+ <property name="margin-start">30</property>
|
||||||
|
+ <property name="margin-end">30</property>
|
||||||
|
+ <property name="width-request">390</property>
|
||||||
|
+ <property name="halign">center</property>
|
||||||
|
<property name="spacing">6</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="name_label">
|
||||||
|
<property name="label" translatable="yes">Archive name</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
+ <attributes>
|
||||||
|
+ <attribute name="weight" value="bold"/>
|
||||||
|
+ </attributes>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
@@ -30,132 +101,82 @@
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
- <object class="GtkEntry" id="name_entry">
|
||||||
|
- <property name="visible">True</property>
|
||||||
|
- <property name="can_focus">True</property>
|
||||||
|
- </object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="expand">False</property>
|
||||||
|
- <property name="fill">True</property>
|
||||||
|
- <property name="position">2</property>
|
||||||
|
- </packing>
|
||||||
|
- </child>
|
||||||
|
- <child>
|
||||||
|
- <object class="GtkRevealer" id="error_revealer">
|
||||||
|
- <child>
|
||||||
|
- <object class="GtkLabel" id="error_label">
|
||||||
|
- <property name="margin_top">4</property>
|
||||||
|
- <property name="margin_bottom">4</property>
|
||||||
|
- <property name="visible">True</property>
|
||||||
|
- <property name="xalign">0</property>
|
||||||
|
- </object>
|
||||||
|
- </child>
|
||||||
|
- </object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="expand">False</property>
|
||||||
|
- <property name="fill">True</property>
|
||||||
|
- <property name="position">3</property>
|
||||||
|
- </packing>
|
||||||
|
- </child>
|
||||||
|
- <child>
|
||||||
|
- <object class="GtkBox" id="hbox">
|
||||||
|
+ <object class="GtkBox">
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
- <property name="homogeneous">True</property>
|
||||||
|
- <property name="spacing">0</property>
|
||||||
|
- <child>
|
||||||
|
- <object class="GtkRadioButton" id="zip_radio_button">
|
||||||
|
- <property name="label" translatable="no">.zip</property>
|
||||||
|
- <property name="draw_indicator">True</property>
|
||||||
|
- <signal name="toggled" handler="zip_radio_button_on_toggled"/>
|
||||||
|
- </object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="expand">True</property>
|
||||||
|
- <property name="fill">True</property>
|
||||||
|
- <property name="position">0</property>
|
||||||
|
- </packing>
|
||||||
|
- </child>
|
||||||
|
+ <property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
- <object class="GtkRadioButton" id="tar_xz_radio_button">
|
||||||
|
- <property name="label" translatable="no">.tar.xz</property>
|
||||||
|
- <property name="group">zip_radio_button</property>
|
||||||
|
- <property name="draw_indicator">True</property>
|
||||||
|
- <signal name="toggled" handler="tar_xz_radio_button_on_toggled"/>
|
||||||
|
+ <object class="GtkEntry" id="name_entry">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">True</property>
|
||||||
|
+ <property name="width-chars">30</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
- <property name="fill">True</property>
|
||||||
|
- <property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
- <object class="GtkRadioButton" id="seven_zip_radio_button">
|
||||||
|
- <property name="label" translatable="no">.7z</property>
|
||||||
|
- <property name="group">zip_radio_button</property>
|
||||||
|
- <property name="draw_indicator">True</property>
|
||||||
|
- <signal name="toggled" handler="seven_zip_radio_button_on_toggled"/>
|
||||||
|
+ <object class="GtkMenuButton" id="extension_button">
|
||||||
|
+ <property name="popover">extension_popover</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkBox">
|
||||||
|
+ <property name="orientation">horizontal</property>
|
||||||
|
+ <property name="spacing">6</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkStack" id="extension_stack">
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="zip_label">
|
||||||
|
+ <property name="label" translatable="no">.zip</property>
|
||||||
|
+ <property name="xalign">0</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="tar_xz_label">
|
||||||
|
+ <property name="label" translatable="no">.tar.xz</property>
|
||||||
|
+ <property name="xalign">0</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="seven_zip_label">
|
||||||
|
+ <property name="label" translatable="no">.7z</property>
|
||||||
|
+ <property name="xalign">0</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">True</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkImage">
|
||||||
|
+ <property name="icon-name">pan-down-symbolic</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
</object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="expand">True</property>
|
||||||
|
- <property name="fill">True</property>
|
||||||
|
- <property name="position">2</property>
|
||||||
|
- </packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
- <property name="position">4</property>
|
||||||
|
+ <property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
- <object class="GtkStack" id="description_stack">
|
||||||
|
- <property name="visible">True</property>
|
||||||
|
- <property name="can_focus">False</property>
|
||||||
|
- <property name="homogeneous">True</property>
|
||||||
|
- <child>
|
||||||
|
- <object class="GtkLabel" id="zip_description_label">
|
||||||
|
- <property name="visible">True</property>
|
||||||
|
- <property name="label" translatable="yes">Compatible with all operating systems.</property>
|
||||||
|
- <property name="xalign">0</property>
|
||||||
|
- <style>
|
||||||
|
- <class name="dim-label"/>
|
||||||
|
- </style>
|
||||||
|
- </object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="name">zip-description-label</property>
|
||||||
|
- </packing>
|
||||||
|
- </child>
|
||||||
|
- <child>
|
||||||
|
- <object class="GtkLabel" id="tar_xz_description_label">
|
||||||
|
- <property name="visible">True</property>
|
||||||
|
- <property name="label" translatable="yes">Smaller archives but Linux and Mac only.</property>
|
||||||
|
- <property name="xalign">0</property>
|
||||||
|
- <style>
|
||||||
|
- <class name="dim-label"/>
|
||||||
|
- </style>
|
||||||
|
- </object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="name">tar-xz-description-label</property>
|
||||||
|
- </packing>
|
||||||
|
- </child>
|
||||||
|
+ <object class="GtkRevealer" id="error_revealer">
|
||||||
|
<child>
|
||||||
|
- <object class="GtkLabel" id="seven_zip_description_label">
|
||||||
|
+ <object class="GtkLabel" id="error_label">
|
||||||
|
+ <property name="margin_top">4</property>
|
||||||
|
+ <property name="margin_bottom">4</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
- <property name="label" translatable="yes">Smaller archives but must be installed on Windows and Mac.</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
- <style>
|
||||||
|
- <class name="dim-label"/>
|
||||||
|
- </style>
|
||||||
|
</object>
|
||||||
|
- <packing>
|
||||||
|
- <property name="name">seven-zip-description-label</property>
|
||||||
|
- </packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
- <property name="position">5</property>
|
||||||
|
+ <property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
From 203d24f1e57991340b2870b0b956922144f0152a Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Ant=C3=B3nio=20Fernandes?= <antoniojpfernandes@gmail.com>
|
||||||
|
Date: Mon, 8 Nov 2021 18:48:47 +0000
|
||||||
|
Subject: [PATCH] compress-dialog-controller: Fit popover fit on X11
|
||||||
|
|
||||||
|
Under X11, GTK3 cannot draw a GtkPopover outside of the main window area.
|
||||||
|
|
||||||
|
This means the popover for compress formats is clipped under X11.
|
||||||
|
|
||||||
|
As a workaround, make the window twice as tal when the popover is shown.
|
||||||
|
|
||||||
|
Fixes https://gitlab.gnome.org/GNOME/nautilus/-/issues/2018
|
||||||
|
---
|
||||||
|
src/nautilus-compress-dialog-controller.c | 15 +++++++++++++++
|
||||||
|
1 file changed, 15 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-compress-dialog-controller.c b/src/nautilus-compress-dialog-controller.c
|
||||||
|
index 3f7711ccb..de83b3717 100644
|
||||||
|
--- a/src/nautilus-compress-dialog-controller.c
|
||||||
|
+++ b/src/nautilus-compress-dialog-controller.c
|
||||||
|
@@ -21,6 +21,10 @@
|
||||||
|
#include <gnome-autoar/gnome-autoar.h>
|
||||||
|
#include <libhandy-1/handy.h>
|
||||||
|
|
||||||
|
+#ifdef GDK_WINDOWING_X11
|
||||||
|
+#include <gdk/gdkx.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#include <eel/eel-vfs-extensions.h>
|
||||||
|
|
||||||
|
#include "nautilus-compress-dialog-controller.h"
|
||||||
|
@@ -394,6 +398,17 @@ popover_on_show (GtkWidget *widget,
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#ifdef GDK_WINDOWING_X11
|
||||||
|
+ if (GDK_IS_X11_DISPLAY (gdk_display_get_default ()))
|
||||||
|
+ {
|
||||||
|
+ int w, h;
|
||||||
|
+
|
||||||
|
+ /* Workaround for https://gitlab.gnome.org/GNOME/nautilus/-/issues/2018 */
|
||||||
|
+ gtk_window_get_default_size (GTK_WINDOW (self->compress_dialog), &w, &h);
|
||||||
|
+ gtk_window_resize (GTK_WINDOW (self->compress_dialog), w, h * 2);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
NautilusCompressDialogController *
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -0,0 +1,113 @@
|
|||||||
|
From d4e00000d46e0407841424a478eab833cf59cc12 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Fri, 24 Sep 2021 09:42:54 +0200
|
||||||
|
Subject: [PATCH] file-operations: Do not offer skipping when extracting one
|
||||||
|
file
|
||||||
|
|
||||||
|
In case of extraction failure, the "Skip" and "Cancel" actions are offered
|
||||||
|
everytime, but skipping doesn't make sense when extracting one file only.
|
||||||
|
Let's use the same approach as it is used also for other operations, which
|
||||||
|
is based on total number of files and remaining files. Also the "Skip All"
|
||||||
|
action will be offered as a side-effect of this change.
|
||||||
|
---
|
||||||
|
src/nautilus-file-operations.c | 38 ++++++++++++++++++++++------------
|
||||||
|
1 file changed, 25 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
|
||||||
|
index 14dcf64d0..c95748ccc 100644
|
||||||
|
--- a/src/nautilus-file-operations.c
|
||||||
|
+++ b/src/nautilus-file-operations.c
|
||||||
|
@@ -210,6 +210,7 @@ typedef struct
|
||||||
|
|
||||||
|
guint64 archive_compressed_size;
|
||||||
|
guint64 total_compressed_size;
|
||||||
|
+ gint total_files;
|
||||||
|
|
||||||
|
NautilusExtractCallback done_callback;
|
||||||
|
gpointer done_callback_data;
|
||||||
|
@@ -8332,6 +8333,7 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||||||
|
GFile *source_file;
|
||||||
|
GFile *destination;
|
||||||
|
gint response_id;
|
||||||
|
+ gint remaining_files;
|
||||||
|
g_autofree gchar *basename = NULL;
|
||||||
|
|
||||||
|
source_file = autoar_extractor_get_source_file (extractor);
|
||||||
|
@@ -8357,25 +8359,35 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||||||
|
g_object_unref (destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (extract_job->common.skip_all_error)
|
||||||
|
+ {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
basename = get_basename (source_file);
|
||||||
|
nautilus_progress_info_take_status (extract_job->common.progress,
|
||||||
|
g_strdup_printf (_("Error extracting “%s”"),
|
||||||
|
basename));
|
||||||
|
|
||||||
|
- response_id = run_warning ((CommonJob *) extract_job,
|
||||||
|
- g_strdup_printf (_("There was an error while extracting “%s”."),
|
||||||
|
- basename),
|
||||||
|
- g_strdup (error->message),
|
||||||
|
- NULL,
|
||||||
|
- FALSE,
|
||||||
|
- CANCEL,
|
||||||
|
- SKIP,
|
||||||
|
- NULL);
|
||||||
|
+ remaining_files = g_list_length (g_list_find_custom (extract_job->source_files,
|
||||||
|
+ source_file,
|
||||||
|
+ (GCompareFunc) g_file_equal)) - 1;
|
||||||
|
+ response_id = run_cancel_or_skip_warning ((CommonJob *) extract_job,
|
||||||
|
+ g_strdup_printf (_("There was an error while extracting “%s”."),
|
||||||
|
+ basename),
|
||||||
|
+ g_strdup (error->message),
|
||||||
|
+ NULL,
|
||||||
|
+ extract_job->total_files,
|
||||||
|
+ remaining_files);
|
||||||
|
|
||||||
|
if (response_id == 0 || response_id == GTK_RESPONSE_DELETE_EVENT)
|
||||||
|
{
|
||||||
|
abort_job ((CommonJob *) extract_job);
|
||||||
|
}
|
||||||
|
+ else if (response_id == 1)
|
||||||
|
+ {
|
||||||
|
+ extract_job->common.skip_all_error = TRUE;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -8607,7 +8619,6 @@ extract_task_thread_func (GTask *task,
|
||||||
|
{
|
||||||
|
ExtractJob *extract_job = task_data;
|
||||||
|
GList *l;
|
||||||
|
- gint total_files;
|
||||||
|
g_autofree guint64 *archive_compressed_sizes = NULL;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
@@ -8618,9 +8629,10 @@ extract_task_thread_func (GTask *task,
|
||||||
|
nautilus_progress_info_set_details (extract_job->common.progress,
|
||||||
|
_("Preparing to extract"));
|
||||||
|
|
||||||
|
- total_files = g_list_length (extract_job->source_files);
|
||||||
|
+ extract_job->total_files = g_list_length (extract_job->source_files);
|
||||||
|
|
||||||
|
- archive_compressed_sizes = g_malloc0_n (total_files, sizeof (guint64));
|
||||||
|
+ archive_compressed_sizes = g_malloc0_n (extract_job->total_files,
|
||||||
|
+ sizeof (guint64));
|
||||||
|
extract_job->total_compressed_size = 0;
|
||||||
|
|
||||||
|
for (l = extract_job->source_files, i = 0;
|
||||||
|
@@ -8691,7 +8703,7 @@ extract_task_thread_func (GTask *task,
|
||||||
|
|
||||||
|
if (!job_aborted ((CommonJob *) extract_job))
|
||||||
|
{
|
||||||
|
- report_extract_final_progress (extract_job, total_files);
|
||||||
|
+ report_extract_final_progress (extract_job, extract_job->total_files);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extract_job->common.undo_info)
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -0,0 +1,113 @@
|
|||||||
|
From c3b8e0d6dee8ae8d86cbc47a0745b3e9b2b814e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Fri, 24 Sep 2021 09:56:07 +0200
|
||||||
|
Subject: [PATCH] file-operations: Fix progress when skipping during extraction
|
||||||
|
|
||||||
|
The progress is wrong when extracting multiple files and some of them
|
||||||
|
are skipped. Let's try to fix this.
|
||||||
|
---
|
||||||
|
src/nautilus-file-operations.c | 35 ++++++++++++++++++++++++++--------
|
||||||
|
1 file changed, 27 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
|
||||||
|
index c95748ccc..5fc8af2f3 100644
|
||||||
|
--- a/src/nautilus-file-operations.c
|
||||||
|
+++ b/src/nautilus-file-operations.c
|
||||||
|
@@ -205,6 +205,7 @@ typedef struct
|
||||||
|
GFile *destination_directory;
|
||||||
|
GList *output_files;
|
||||||
|
gboolean destination_decided;
|
||||||
|
+ gboolean extraction_failed;
|
||||||
|
|
||||||
|
gdouble base_progress;
|
||||||
|
|
||||||
|
@@ -8346,6 +8347,8 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ extract_job->extraction_failed = TRUE;
|
||||||
|
+
|
||||||
|
/* It is safe to use extract_job->output_files->data only when the
|
||||||
|
* extract_job->destination_decided variable was set, see comment in the
|
||||||
|
* extract_job_on_decide_destination function.
|
||||||
|
@@ -8571,8 +8574,7 @@ extract_job_on_scanned (AutoarExtractor *extractor,
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-report_extract_final_progress (ExtractJob *extract_job,
|
||||||
|
- gint total_files)
|
||||||
|
+report_extract_final_progress (ExtractJob *extract_job)
|
||||||
|
{
|
||||||
|
char *status;
|
||||||
|
g_autofree gchar *basename_dest = NULL;
|
||||||
|
@@ -8582,7 +8584,11 @@ report_extract_final_progress (ExtractJob *extract_job,
|
||||||
|
extract_job->destination_directory);
|
||||||
|
basename_dest = get_basename (extract_job->destination_directory);
|
||||||
|
|
||||||
|
- if (total_files == 1)
|
||||||
|
+ /* The g_list_length function is used intentionally here instead of the
|
||||||
|
+ * extract_job->total_files variable to avoid printing wrong basename in
|
||||||
|
+ * the case of skipped files.
|
||||||
|
+ */
|
||||||
|
+ if (g_list_length (extract_job->source_files) == 1)
|
||||||
|
{
|
||||||
|
GFile *source_file;
|
||||||
|
g_autofree gchar *basename = NULL;
|
||||||
|
@@ -8597,8 +8603,8 @@ report_extract_final_progress (ExtractJob *extract_job,
|
||||||
|
{
|
||||||
|
status = g_strdup_printf (ngettext ("Extracted %'d file to “%s”",
|
||||||
|
"Extracted %'d files to “%s”",
|
||||||
|
- total_files),
|
||||||
|
- total_files,
|
||||||
|
+ extract_job->total_files),
|
||||||
|
+ extract_job->total_files,
|
||||||
|
basename_dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -8609,6 +8615,8 @@ report_extract_final_progress (ExtractJob *extract_job,
|
||||||
|
g_strdup_printf (_("%s / %s"),
|
||||||
|
formatted_size,
|
||||||
|
formatted_size));
|
||||||
|
+
|
||||||
|
+ nautilus_progress_info_set_progress (extract_job->common.progress, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -8690,6 +8698,7 @@ extract_task_thread_func (GTask *task,
|
||||||
|
|
||||||
|
extract_job->archive_compressed_size = archive_compressed_sizes[i];
|
||||||
|
extract_job->destination_decided = FALSE;
|
||||||
|
+ extract_job->extraction_failed = FALSE;
|
||||||
|
|
||||||
|
autoar_extractor_start (extractor,
|
||||||
|
extract_job->common.cancellable);
|
||||||
|
@@ -8697,13 +8706,23 @@ extract_task_thread_func (GTask *task,
|
||||||
|
g_signal_handlers_disconnect_by_data (extractor,
|
||||||
|
extract_job);
|
||||||
|
|
||||||
|
- extract_job->base_progress += (gdouble) extract_job->archive_compressed_size /
|
||||||
|
- (gdouble) extract_job->total_compressed_size;
|
||||||
|
+ if (!extract_job->extraction_failed)
|
||||||
|
+ {
|
||||||
|
+ extract_job->base_progress += (gdouble) extract_job->archive_compressed_size /
|
||||||
|
+ (gdouble) extract_job->total_compressed_size;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ extract_job->total_files--;
|
||||||
|
+ extract_job->base_progress *= extract_job->total_compressed_size;
|
||||||
|
+ extract_job->total_compressed_size -= extract_job->archive_compressed_size;
|
||||||
|
+ extract_job->base_progress /= extract_job->total_compressed_size;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!job_aborted ((CommonJob *) extract_job))
|
||||||
|
{
|
||||||
|
- report_extract_final_progress (extract_job, extract_job->total_files);
|
||||||
|
+ report_extract_final_progress (extract_job);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extract_job->common.undo_info)
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
From d09b34cde210c4f817d2442cc9378b1ddf73aee9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Fri, 24 Sep 2021 08:40:23 +0200
|
||||||
|
Subject: [PATCH] file-operations: Remove leftover files after extraction
|
||||||
|
failure
|
||||||
|
|
||||||
|
Empty, or corrupted files are left in the output directory in the case
|
||||||
|
of extraction failure, e.g. when wrong password is supplied. This is
|
||||||
|
in most cases undesired. Let's recursively delete all the leftover
|
||||||
|
files in the case of extraction failure.
|
||||||
|
|
||||||
|
Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/1954
|
||||||
|
---
|
||||||
|
src/nautilus-file-operations.c | 17 +++++++++++++++++
|
||||||
|
1 file changed, 17 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
|
||||||
|
index 7927bd504..13da2cb39 100644
|
||||||
|
--- a/src/nautilus-file-operations.c
|
||||||
|
+++ b/src/nautilus-file-operations.c
|
||||||
|
@@ -204,6 +204,7 @@ typedef struct
|
||||||
|
GList *source_files;
|
||||||
|
GFile *destination_directory;
|
||||||
|
GList *output_files;
|
||||||
|
+ gboolean destination_decided;
|
||||||
|
|
||||||
|
gdouble base_progress;
|
||||||
|
|
||||||
|
@@ -8202,8 +8203,14 @@ extract_job_on_decide_destination (AutoarExtractor *extractor,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* The extract_job->destination_decided variable signalizes whether the
|
||||||
|
+ * extract_job->output_files list already contains the final location as
|
||||||
|
+ * its first link. There is no way to get this over the AutoarExtractor
|
||||||
|
+ * API currently.
|
||||||
|
+ */
|
||||||
|
extract_job->output_files = g_list_prepend (extract_job->output_files,
|
||||||
|
decided_destination);
|
||||||
|
+ extract_job->destination_decided = TRUE;
|
||||||
|
|
||||||
|
return g_object_ref (decided_destination);
|
||||||
|
}
|
||||||
|
@@ -8336,6 +8343,15 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* It is safe to use extract_job->output_files->data only when the
|
||||||
|
+ * extract_job->destination_decided variable was set, see comment in the
|
||||||
|
+ * extract_job_on_decide_destination function.
|
||||||
|
+ */
|
||||||
|
+ if (extract_job->destination_decided)
|
||||||
|
+ {
|
||||||
|
+ delete_file_recursively (extract_job->output_files->data, NULL, NULL, NULL);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
basename = get_basename (source_file);
|
||||||
|
nautilus_progress_info_take_status (extract_job->common.progress,
|
||||||
|
g_strdup_printf (_("Error extracting “%s”"),
|
||||||
|
@@ -8657,6 +8673,7 @@ extract_task_thread_func (GTask *task,
|
||||||
|
extract_job);
|
||||||
|
|
||||||
|
extract_job->archive_compressed_size = archive_compressed_sizes[i];
|
||||||
|
+ extract_job->destination_decided = FALSE;
|
||||||
|
|
||||||
|
autoar_extractor_start (extractor,
|
||||||
|
extract_job->common.cancellable);
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -0,0 +1,74 @@
|
|||||||
|
From bdd317d999458fc35b23ee9c6141a9d0c9ec66f7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Fri, 24 Sep 2021 08:45:27 +0200
|
||||||
|
Subject: [PATCH] file-operations: Simplify output files handling when
|
||||||
|
extracting
|
||||||
|
|
||||||
|
Currently, output files are checked for existence. But the files are
|
||||||
|
explicitely deleted in the case of extraction failure, so this extra
|
||||||
|
check is no more needed. Let's drop the redundant check and just update
|
||||||
|
the list when deleting the files.
|
||||||
|
---
|
||||||
|
src/nautilus-file-operations.c | 25 ++++++-------------------
|
||||||
|
1 file changed, 6 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
|
||||||
|
index 13da2cb39..14dcf64d0 100644
|
||||||
|
--- a/src/nautilus-file-operations.c
|
||||||
|
+++ b/src/nautilus-file-operations.c
|
||||||
|
@@ -8330,6 +8330,7 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||||||
|
{
|
||||||
|
ExtractJob *extract_job = user_data;
|
||||||
|
GFile *source_file;
|
||||||
|
+ GFile *destination;
|
||||||
|
gint response_id;
|
||||||
|
g_autofree gchar *basename = NULL;
|
||||||
|
|
||||||
|
@@ -8349,7 +8350,11 @@ extract_job_on_error (AutoarExtractor *extractor,
|
||||||
|
*/
|
||||||
|
if (extract_job->destination_decided)
|
||||||
|
{
|
||||||
|
- delete_file_recursively (extract_job->output_files->data, NULL, NULL, NULL);
|
||||||
|
+ destination = extract_job->output_files->data;
|
||||||
|
+ delete_file_recursively (destination, NULL, NULL, NULL);
|
||||||
|
+ extract_job->output_files = g_list_delete_link (extract_job->output_files,
|
||||||
|
+ extract_job->output_files);
|
||||||
|
+ g_object_unref (destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
basename = get_basename (source_file);
|
||||||
|
@@ -8602,7 +8607,6 @@ extract_task_thread_func (GTask *task,
|
||||||
|
{
|
||||||
|
ExtractJob *extract_job = task_data;
|
||||||
|
GList *l;
|
||||||
|
- GList *existing_output_files = NULL;
|
||||||
|
gint total_files;
|
||||||
|
g_autofree guint64 *archive_compressed_sizes = NULL;
|
||||||
|
gint i;
|
||||||
|
@@ -8690,23 +8694,6 @@ extract_task_thread_func (GTask *task,
|
||||||
|
report_extract_final_progress (extract_job, total_files);
|
||||||
|
}
|
||||||
|
|
||||||
|
- for (l = extract_job->output_files; l != NULL; l = l->next)
|
||||||
|
- {
|
||||||
|
- GFile *output_file;
|
||||||
|
-
|
||||||
|
- output_file = G_FILE (l->data);
|
||||||
|
-
|
||||||
|
- if (g_file_query_exists (output_file, NULL))
|
||||||
|
- {
|
||||||
|
- existing_output_files = g_list_prepend (existing_output_files,
|
||||||
|
- g_object_ref (output_file));
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- g_list_free_full (extract_job->output_files, g_object_unref);
|
||||||
|
-
|
||||||
|
- extract_job->output_files = existing_output_files;
|
||||||
|
-
|
||||||
|
if (extract_job->common.undo_info)
|
||||||
|
{
|
||||||
|
if (extract_job->output_files)
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -0,0 +1,89 @@
|
|||||||
|
From 18fd27b5789758a7cbf97c8ab59b57d890923779 Mon Sep 17 00:00:00 2001
|
||||||
|
From: utkarshvg2401 <utkarshvg2401@gmail.com>
|
||||||
|
Date: Fri, 1 Apr 2022 10:48:08 +0530
|
||||||
|
Subject: [PATCH] files-view: Add menu item to copy current path
|
||||||
|
|
||||||
|
Currently, there is no option to directly copy the path of the current open directory.
|
||||||
|
|
||||||
|
This can be useful when users want to use the path of the directory in the terminal or some code.
|
||||||
|
|
||||||
|
Close https://gitlab.gnome.org/GNOME/nautilus/-/issues/1966
|
||||||
|
---
|
||||||
|
src/nautilus-files-view.c | 29 +++++++++++++++++++
|
||||||
|
.../ui/nautilus-files-view-context-menus.ui | 6 ++++
|
||||||
|
2 files changed, 35 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
|
||||||
|
index 378e6bdba..1e1025eed 100644
|
||||||
|
--- a/src/nautilus-files-view.c
|
||||||
|
+++ b/src/nautilus-files-view.c
|
||||||
|
@@ -6123,6 +6123,30 @@ action_cut (GSimpleAction *action,
|
||||||
|
nautilus_file_list_free (selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+action_copy_current_location (GSimpleAction *action,
|
||||||
|
+ GVariant *state,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ NautilusFilesView *view;
|
||||||
|
+ GtkClipboard *clipboard;
|
||||||
|
+ GList *files;
|
||||||
|
+ NautilusFilesViewPrivate *priv;
|
||||||
|
+
|
||||||
|
+ view = NAUTILUS_FILES_VIEW (user_data);
|
||||||
|
+ priv = nautilus_files_view_get_instance_private (view);
|
||||||
|
+
|
||||||
|
+ if (priv->directory_as_file != NULL)
|
||||||
|
+ {
|
||||||
|
+ files = g_list_append (NULL, nautilus_file_ref (priv->directory_as_file));
|
||||||
|
+
|
||||||
|
+ clipboard = nautilus_clipboard_get (GTK_WIDGET (view));
|
||||||
|
+ nautilus_clipboard_prepare_for_files (clipboard, files, FALSE);
|
||||||
|
+
|
||||||
|
+ nautilus_file_list_free (files);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
action_create_links_in_place (GSimpleAction *action,
|
||||||
|
GVariant *state,
|
||||||
|
@@ -7154,6 +7178,7 @@ const GActionEntry view_entries[] =
|
||||||
|
{ "select-all", action_select_all },
|
||||||
|
{ "paste", action_paste_files },
|
||||||
|
{ "paste_accel", action_paste_files_accel },
|
||||||
|
+ { "copy-current-location", action_copy_current_location },
|
||||||
|
{ "create-link", action_create_links },
|
||||||
|
{ "new-document" },
|
||||||
|
/* Selection menu */
|
||||||
|
@@ -7789,6 +7814,10 @@ real_update_actions_state (NautilusFilesView *view)
|
||||||
|
g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
|
||||||
|
can_move_files && !selection_contains_recent &&
|
||||||
|
!selection_contains_starred);
|
||||||
|
+ action = g_action_map_lookup_action (G_ACTION_MAP (view_action_group),
|
||||||
|
+ "copy-current-location");
|
||||||
|
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
|
||||||
|
+ !selection_contains_search);
|
||||||
|
|
||||||
|
/* Drive menu */
|
||||||
|
show_mount = (selection != NULL);
|
||||||
|
diff --git a/src/resources/ui/nautilus-files-view-context-menus.ui b/src/resources/ui/nautilus-files-view-context-menus.ui
|
||||||
|
index 27764c9a7..22a1cb231 100644
|
||||||
|
--- a/src/resources/ui/nautilus-files-view-context-menus.ui
|
||||||
|
+++ b/src/resources/ui/nautilus-files-view-context-menus.ui
|
||||||
|
@@ -14,6 +14,12 @@
|
||||||
|
<attribute name="label" translatable="yes">Add to _Bookmarks</attribute>
|
||||||
|
<attribute name="action">win.bookmark-current-location</attribute>
|
||||||
|
</item>
|
||||||
|
+ <section>
|
||||||
|
+ <item>
|
||||||
|
+ <attribute name="label" translatable="yes">_Copy Location</attribute>
|
||||||
|
+ <attribute name="action">view.copy-current-location</attribute>
|
||||||
|
+ </item>
|
||||||
|
+ </section>
|
||||||
|
<section>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Create _Link</attribute>
|
||||||
|
--
|
||||||
|
2.36.1
|
||||||
|
|
@ -0,0 +1,117 @@
|
|||||||
|
From 67c7bdbf8757c51d3b1bc1f5c40eaeddef9e3a89 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anubhav Tyagi <tyagianubhav619@gmail.com>
|
||||||
|
Date: Sat, 17 Jul 2021 12:39:20 +0530
|
||||||
|
Subject: [PATCH] files-view: Store selected files list for compressing
|
||||||
|
|
||||||
|
The selected files list is chosen after the user confirmed the compress
|
||||||
|
operation in the compress-dialog which may result in files other than
|
||||||
|
chosen file being compressed.
|
||||||
|
|
||||||
|
Store the list of selected files when the user chooses the "Compress"
|
||||||
|
option from the menu, to avoid that
|
||||||
|
|
||||||
|
Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/1900
|
||||||
|
|
||||||
|
|
||||||
|
(cherry picked from commit 6c7eacd20302046521e89dd28240c6b0193ba942)
|
||||||
|
---
|
||||||
|
src/nautilus-files-view.c | 37 +++++++++++++++++++++++++++----------
|
||||||
|
1 file changed, 27 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
|
||||||
|
index 378e6bdba..b4a91226b 100644
|
||||||
|
--- a/src/nautilus-files-view.c
|
||||||
|
+++ b/src/nautilus-files-view.c
|
||||||
|
@@ -302,6 +302,12 @@ typedef struct
|
||||||
|
NautilusDirectory *directory;
|
||||||
|
} FileAndDirectory;
|
||||||
|
|
||||||
|
+typedef struct
|
||||||
|
+{
|
||||||
|
+ NautilusFilesView *view;
|
||||||
|
+ GList *selection;
|
||||||
|
+} CompressCallbackData;
|
||||||
|
+
|
||||||
|
/* forward declarations */
|
||||||
|
|
||||||
|
static gboolean display_selection_info_idle_callback (gpointer data);
|
||||||
|
@@ -2217,9 +2223,9 @@ static void
|
||||||
|
compress_dialog_controller_on_name_accepted (NautilusFileNameWidgetController *controller,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
+ CompressCallbackData *callback_data = user_data;
|
||||||
|
NautilusFilesView *view;
|
||||||
|
g_autofree gchar *name = NULL;
|
||||||
|
- GList *selection;
|
||||||
|
GList *source_files = NULL;
|
||||||
|
GList *l;
|
||||||
|
CompressData *data;
|
||||||
|
@@ -2230,12 +2236,10 @@ compress_dialog_controller_on_name_accepted (NautilusFileNameWidgetController *c
|
||||||
|
AutoarFormat format;
|
||||||
|
AutoarFilter filter;
|
||||||
|
|
||||||
|
- view = NAUTILUS_FILES_VIEW (user_data);
|
||||||
|
+ view = NAUTILUS_FILES_VIEW (callback_data->view);
|
||||||
|
priv = nautilus_files_view_get_instance_private (view);
|
||||||
|
|
||||||
|
- selection = nautilus_files_view_get_selection_for_file_transfer (view);
|
||||||
|
-
|
||||||
|
- for (l = selection; l != NULL; l = l->next)
|
||||||
|
+ for (l = callback_data->selection; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
source_files = g_list_prepend (source_files,
|
||||||
|
nautilus_file_get_location (l->data));
|
||||||
|
@@ -2302,7 +2306,6 @@ compress_dialog_controller_on_name_accepted (NautilusFileNameWidgetController *c
|
||||||
|
compress_done,
|
||||||
|
data);
|
||||||
|
|
||||||
|
- nautilus_file_list_free (selection);
|
||||||
|
g_list_free_full (source_files, g_object_unref);
|
||||||
|
g_clear_object (&priv->compress_controller);
|
||||||
|
}
|
||||||
|
@@ -2320,6 +2323,12 @@ compress_dialog_controller_on_cancelled (NautilusNewFolderDialogController *cont
|
||||||
|
g_clear_object (&priv->compress_controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+compress_callback_data_free (CompressCallbackData *data)
|
||||||
|
+{
|
||||||
|
+ nautilus_file_list_free (data->selection);
|
||||||
|
+ g_free (data);
|
||||||
|
+}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nautilus_files_view_compress_dialog_new (NautilusFilesView *view)
|
||||||
|
@@ -2328,6 +2337,7 @@ nautilus_files_view_compress_dialog_new (NautilusFilesView *view)
|
||||||
|
NautilusFilesViewPrivate *priv;
|
||||||
|
g_autolist (NautilusFile) selection = NULL;
|
||||||
|
g_autofree char *common_prefix = NULL;
|
||||||
|
+ CompressCallbackData *data;
|
||||||
|
|
||||||
|
priv = nautilus_files_view_get_instance_private (view);
|
||||||
|
|
||||||
|
@@ -2365,10 +2375,17 @@ nautilus_files_view_compress_dialog_new (NautilusFilesView *view)
|
||||||
|
containing_directory,
|
||||||
|
common_prefix);
|
||||||
|
|
||||||
|
- g_signal_connect (priv->compress_controller,
|
||||||
|
- "name-accepted",
|
||||||
|
- (GCallback) compress_dialog_controller_on_name_accepted,
|
||||||
|
- view);
|
||||||
|
+ data = g_new0 (CompressCallbackData, 1);
|
||||||
|
+ data->view = view;
|
||||||
|
+ data->selection = nautilus_files_view_get_selection_for_file_transfer (view);
|
||||||
|
+
|
||||||
|
+ g_signal_connect_data (priv->compress_controller,
|
||||||
|
+ "name-accepted",
|
||||||
|
+ (GCallback) compress_dialog_controller_on_name_accepted,
|
||||||
|
+ data,
|
||||||
|
+ (GClosureNotify) compress_callback_data_free,
|
||||||
|
+ G_CONNECT_AFTER);
|
||||||
|
+
|
||||||
|
g_signal_connect (priv->compress_controller,
|
||||||
|
"cancelled",
|
||||||
|
(GCallback) compress_dialog_controller_on_cancelled,
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -0,0 +1,96 @@
|
|||||||
|
From ba878013689114bf199ba2260f9282ae82b352c4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Holy <oholy@redhat.com>
|
||||||
|
Date: Wed, 22 Feb 2023 16:22:43 +0100
|
||||||
|
Subject: [PATCH] freedesktop-dbus: Try to own the name until after exporting
|
||||||
|
skeleton
|
||||||
|
|
||||||
|
Currently, the `g_bus_own_name_on_connection` function is called for the
|
||||||
|
`org.freedesktop.FileManager1` name before exporting the
|
||||||
|
`/org/freedesktop/FileManager1` skeleton. This seemingly works fine in most
|
||||||
|
cases, but occasionally the name is acquired too early and D-Bus clients
|
||||||
|
can get `No such interface` error. This is regression caused by the commit
|
||||||
|
2293e813d3cd1cc47b2b8750f7140647aa066fc8. Let's try to own the nam until
|
||||||
|
after exporting the skeleton to avoid this error.
|
||||||
|
---
|
||||||
|
src/nautilus-freedesktop-dbus.c | 31 +++++++++++++++----------------
|
||||||
|
1 file changed, 15 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/nautilus-freedesktop-dbus.c b/src/nautilus-freedesktop-dbus.c
|
||||||
|
index c253cfaba..c20166abb 100644
|
||||||
|
--- a/src/nautilus-freedesktop-dbus.c
|
||||||
|
+++ b/src/nautilus-freedesktop-dbus.c
|
||||||
|
@@ -162,20 +162,6 @@ name_lost_cb (GDBusConnection *connection,
|
||||||
|
DEBUG ("Lost (or failed to acquire) the name %s on the session message bus\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-nautilus_freedesktop_dbus_constructed (GObject *object)
|
||||||
|
-{
|
||||||
|
- NautilusFreedesktopDBus *fdb = NAUTILUS_FREEDESKTOP_DBUS (object);
|
||||||
|
-
|
||||||
|
- fdb->owner_id = g_bus_own_name_on_connection (fdb->connection,
|
||||||
|
- NAUTILUS_FDO_DBUS_NAME,
|
||||||
|
- G_BUS_NAME_OWNER_FLAGS_NONE,
|
||||||
|
- name_acquired_cb,
|
||||||
|
- name_lost_cb,
|
||||||
|
- fdb,
|
||||||
|
- NULL);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void
|
||||||
|
nautilus_freedesktop_dbus_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
@@ -252,7 +238,6 @@ nautilus_freedesktop_dbus_class_init (NautilusFreedesktopDBusClass *klass)
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->dispose = nautilus_freedesktop_dbus_dispose;
|
||||||
|
- object_class->constructed = nautilus_freedesktop_dbus_constructed;
|
||||||
|
object_class->get_property = nautilus_freedesktop_dbus_get_property;
|
||||||
|
object_class->set_property = nautilus_freedesktop_dbus_set_property;
|
||||||
|
|
||||||
|
@@ -301,7 +286,6 @@ nautilus_freedesktop_dbus_set_open_windows_with_locations (NautilusFreedesktopDB
|
||||||
|
locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Tries to own the org.freedesktop.FileManager1 service name */
|
||||||
|
NautilusFreedesktopDBus *
|
||||||
|
nautilus_freedesktop_dbus_new (GDBusConnection *connection)
|
||||||
|
{
|
||||||
|
@@ -310,6 +294,7 @@ nautilus_freedesktop_dbus_new (GDBusConnection *connection)
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Tries to own the org.freedesktop.FileManager1 service name */
|
||||||
|
gboolean
|
||||||
|
nautilus_freedesktop_dbus_register (NautilusFreedesktopDBus *fdb,
|
||||||
|
GError **error)
|
||||||
|
@@ -331,12 +316,26 @@ nautilus_freedesktop_dbus_register (NautilusFreedesktopDBus *fdb,
|
||||||
|
G_CALLBACK (skeleton_handle_show_item_properties_cb), fdb);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ fdb->owner_id = g_bus_own_name_on_connection (fdb->connection,
|
||||||
|
+ NAUTILUS_FDO_DBUS_NAME,
|
||||||
|
+ G_BUS_NAME_OWNER_FLAGS_NONE,
|
||||||
|
+ name_acquired_cb,
|
||||||
|
+ name_lost_cb,
|
||||||
|
+ fdb,
|
||||||
|
+ NULL);
|
||||||
|
+
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nautilus_freedesktop_dbus_unregister (NautilusFreedesktopDBus *fdb)
|
||||||
|
{
|
||||||
|
+ if (fdb->owner_id != 0)
|
||||||
|
+ {
|
||||||
|
+ g_bus_unown_name (fdb->owner_id);
|
||||||
|
+ fdb->owner_id = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (fdb->skeleton));
|
||||||
|
|
||||||
|
g_signal_handlers_disconnect_by_data (fdb->skeleton, fdb);
|
||||||
|
--
|
||||||
|
2.39.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue