--- gnome-volume-manager-2.22.0/src/manager.c.check-screensaver 2007-12-07 08:55:02.000000000 +0100 +++ gnome-volume-manager-2.22.0/src/manager.c 2007-12-07 08:56:00.000000000 +0100 @@ -62,6 +62,7 @@ static struct gvm_configuration config; static DBusConnection *dbus_connection = NULL; +static DBusConnection *dbus_connection_session; static char *gnome_mount = NULL; static LibHalContext *hal_ctx; @@ -2147,6 +2148,42 @@ gvm_mount_options (GPtrArray *options, g return TRUE; } +static gboolean +gvm_is_screensaver_running (gboolean *is_screensaver_running) +{ + DBusError error; + DBusMessage *msg; + DBusMessage *reply; + DBusMessageIter iter; + + if (!(msg = dbus_message_new_method_call ("org.gnome.ScreenSaver", + "/", + "org.gnome.ScreenSaver", + "GetActive"))) { + dbg ("gvm_is_screensaver_running: could not create dbus message\n"); + return FALSE; + } + + dbus_error_init (&error); + if (!(reply = dbus_connection_send_with_reply_and_block (dbus_connection_session, msg, -1, &error))) { + dbg ("gvm_is_screensaver_running: %s\n", error.message); + dbus_message_unref (msg); + dbus_error_free (&error); + return FALSE; + } + + dbus_message_iter_init (reply, &iter); + if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN) { + dbg ("gvm_is_screensaver_running: Return value is not a bool"); + dbus_message_unref (msg); + dbus_message_unref (reply); + return FALSE; + } + dbus_message_iter_get_basic (&iter, is_screensaver_running); + dbus_message_unref (reply); + dbus_message_unref (msg); + return TRUE; +} /* * gvm_device_mount - mount the given device. @@ -2157,6 +2194,14 @@ static gboolean gvm_device_mount (const char *udi, gboolean interactive) { struct _MountPolicy *policy; + gboolean is_screensaver_running; + + if (gvm_is_screensaver_running (&is_screensaver_running)) { + if (is_screensaver_running) { + dbg ("refusing to mount %s because screensaver is running\n", udi); + return FALSE; + } + } dbg ("mounting %s...\n", udi); @@ -3249,9 +3294,17 @@ gvm_dbus_init (void) dbus_error_free (&error); return FALSE; } + + if (!(dbus_connection_session = dbus_bus_get (DBUS_BUS_SESSION, &error))) { + dbg ("could not get session bus: %s\n", error.message); + dbus_error_free (&error); + return FALSE; + } dbus_connection_setup_with_g_main (dbus_connection, NULL); dbus_connection_set_exit_on_disconnect (dbus_connection, FALSE); + + dbus_connection_setup_with_g_main (dbus_connection_session, NULL); dbus_connection_add_filter (dbus_connection, gvm_dbus_filter_function, NULL, NULL);