summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlukefromdc <[email protected]>2016-10-22 23:14:31 -0400
committerlukefromdc <[email protected]>2016-10-22 23:14:31 -0400
commitec529e70c20c4164fe34179fc1956676bd10e665 (patch)
tree4c3ebe494797ee62b16bd5efa05a99408571b90b /src
parent481d6eeee76b95faec6053280739c6bed1dd23b3 (diff)
downloadcaja-ec529e70c20c4164fe34179fc1956676bd10e665.tar.bz2
caja-ec529e70c20c4164fe34179fc1956676bd10e665.tar.xz
GtkApplication: Notify when ejected volumes safe to unplug
Notify users when an external drive is still writing data on attempt to eject, and again when drive is safe to unmount. Notifications behave as they do in Nemo when ejecting/unmounting a flash drive. Tested with GTK 3.22 and a known slow flash drive. This is in GtkApplication builds only, code is from Nemo. FIXME: build system does not limit libnotify dependency to GtkApplication builds and is rather improvised. Adding libnotify to CORE_MODULES via configure.ac did not work, and using Nemo's changes put -lnotify into CORE rather than ALL libs and that caused build failures on failure to link.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/caja-application.c36
-rw-r--r--src/caja-places-sidebar.c33
3 files changed, 66 insertions, 4 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index e13f5bc2..5ad77ed4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -41,6 +41,7 @@ LDADD = \
$(EXIF_LIBS) \
$(EXEMPI_LIBS) \
$(POPT_LIBS) \
+ -lnotify
$(NULL)
dbus_freedesktop_built_sources = \
diff --git a/src/caja-application.c b/src/caja-application.c
index 23a4ec56..e1d8a892 100644
--- a/src/caja-application.c
+++ b/src/caja-application.c
@@ -90,6 +90,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <libnotify/notify.h>
#else
enum {
COMMAND_0, /* unused: 0 is an invalid command */
@@ -158,8 +159,36 @@ struct _CajaApplicationPriv {
gboolean force_desktop;
gboolean autostart;
gchar *geometry;
+ NotifyNotification *unmount_notify;
};
+void
+caja_application_notify_unmount_show (CajaApplication *application,
+ const gchar *message)
+{
+ gchar **strings;
+
+ strings = g_strsplit (message, "\n", 0);
+
+ if (application->priv->unmount_notify == NULL) {
+ application->priv->unmount_notify =
+ notify_notification_new (strings[0], strings[1],
+ "media-removable");
+
+ notify_notification_set_hint (application->priv->unmount_notify,
+ "transient", g_variant_new_boolean (TRUE));
+ notify_notification_set_urgency (application->priv->unmount_notify,
+ NOTIFY_URGENCY_CRITICAL);
+ } else {
+ notify_notification_update (application->priv->unmount_notify,
+ strings[0], strings[1],
+ "media-removable");
+ }
+
+ notify_notification_show (application->priv->unmount_notify, NULL);
+ g_strfreev (strings);
+}
+
#else
G_DEFINE_TYPE (CajaApplication, caja_application, G_TYPE_OBJECT);
@@ -597,6 +626,7 @@ caja_application_finalize (GObject *object)
}
g_free (application->priv->geometry);
+
#else
if (application->volume_monitor)
{
@@ -634,7 +664,9 @@ caja_application_finalize (GObject *object)
g_object_unref (application->ss_proxy);
application->ss_proxy = NULL;
}
-
+#if ENABLE_LIBUNIQUE == (FALSE)
+ notify_uninit ();
+#endif
G_OBJECT_CLASS (caja_application_parent_class)->finalize (object);
}
@@ -3204,7 +3236,7 @@ caja_application_startup (GApplication *app)
menu_provider_init_callback ();
/* Initialize the UI handler singleton for file operations */
- /*notify_init (GETTEXT_PACKAGE); */
+ notify_init (GETTEXT_PACKAGE);
/* Watch for unmounts so we can close open windows */
/* TODO-gio: This should be using the UNMOUNTED feature of GFileMonitor instead */
diff --git a/src/caja-places-sidebar.c b/src/caja-places-sidebar.c
index a66bbc5c..ae0434e2 100644
--- a/src/caja-places-sidebar.c
+++ b/src/caja-places-sidebar.c
@@ -38,6 +38,9 @@
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
+#if ENABLE_LIBUNIQUE == (FALSE)
+#include <caja-application.h>
+#endif
#include <libcaja-private/caja-debug-log.h>
#include <libcaja-private/caja-dnd.h>
#include <libcaja-private/caja-bookmark.h>
@@ -57,7 +60,9 @@
#include "caja-bookmark-list.h"
#include "caja-places-sidebar.h"
#include "caja-window.h"
-
+#if ENABLE_LIBUNIQUE == (FALSE)
+#include <libnotify/notify.h>
+#endif
#define EJECT_BUTTON_XPAD 6
#define ICON_CELL_XPAD 6
@@ -2241,6 +2246,12 @@ drive_eject_cb (GObject *source_object,
}
g_error_free (error);
}
+#if ENABLE_LIBUNIQUE == (FALSE)
+ else {
+ CajaApplication *app = CAJA_APPLICATION (g_application_get_default ());
+ caja_application_notify_unmount_show (app, "It is now safe to remove the drive");
+ }
+#endif
}
static void
@@ -2270,8 +2281,14 @@ volume_eject_cb (GObject *source_object,
NULL);
g_free (primary);
}
- g_error_free (error);
+ g_error_free (error);
+ }
+#if ENABLE_LIBUNIQUE == (FALSE)
+ else {
+ CajaApplication *app = CAJA_APPLICATION (g_application_get_default ());
+ caja_application_notify_unmount_show (app, "It is now safe to remove the drive");
}
+#endif
}
static void
@@ -2303,6 +2320,12 @@ mount_eject_cb (GObject *source_object,
}
g_error_free (error);
}
+#if ENABLE_LIBUNIQUE == (FALSE)
+ else {
+ CajaApplication *app = CAJA_APPLICATION (g_application_get_default ());
+ caja_application_notify_unmount_show (app, "It is now safe to remove the drive");
+ }
+#endif
}
static void
@@ -2311,9 +2334,11 @@ do_eject (GMount *mount,
GDrive *drive,
CajaPlacesSidebar *sidebar)
{
+
GMountOperation *mount_op;
mount_op = gtk_mount_operation_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))));
+
if (mount != NULL)
{
caja_window_info_set_initiated_unmount (sidebar->window, TRUE);
@@ -2332,6 +2357,10 @@ do_eject (GMount *mount,
g_drive_eject_with_operation (drive, 0, mount_op, NULL, drive_eject_cb,
g_object_ref (sidebar->window));
}
+#if ENABLE_LIBUNIQUE == (FALSE)
+ CajaApplication *app = CAJA_APPLICATION (g_application_get_default ());
+ caja_application_notify_unmount_show (app, "writing data to the drive-do not unplug");
+#endif
g_object_unref (mount_op);
}