aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/apt-watcher.c117
-rw-r--r--src/device-menu-mgr.c59
-rw-r--r--src/indicator-session.c3
-rw-r--r--src/session-dbus.c4
-rw-r--r--src/session-dbus.xml3
5 files changed, 91 insertions, 95 deletions
diff --git a/src/apt-watcher.c b/src/apt-watcher.c
index a4298a8..f5c9d55 100644
--- a/src/apt-watcher.c
+++ b/src/apt-watcher.c
@@ -27,6 +27,7 @@ static guint watcher_id;
struct _AptWatcher
{
GObject parent_instance;
+ guint reboot_query;
GCancellable * proxy_cancel;
GDBusProxy * proxy;
SessionDbus* session_dbus_interface;
@@ -55,7 +56,7 @@ static void apt_watcher_upgrade_system_cb (GObject * obj,
static void apt_watcher_show_apt_dialog (DbusmenuMenuitem* mi,
guint timestamp,
- gchar * type);
+ gpointer userdata);
static void apt_watcher_signal_cb (GDBusProxy* proxy,
gchar* sender_name,
@@ -64,6 +65,7 @@ static void apt_watcher_signal_cb (GDBusProxy* proxy,
gpointer user_data);
static void apt_watcher_manage_transactions (AptWatcher* self,
gchar* transaction_id);
+static gboolean apt_watcher_query_reboot_status (gpointer self);
@@ -75,6 +77,7 @@ apt_watcher_init (AptWatcher *self)
self->current_state = UP_TO_DATE;
self->proxy_cancel = g_cancellable_new();
self->proxy = NULL;
+ self->reboot_query = 0;
self->current_transaction = NULL;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
@@ -141,7 +144,7 @@ fetch_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
g_signal_connect (self->proxy,
"g-signal",
G_CALLBACK(apt_watcher_signal_cb),
- self);
+ self);
}
@@ -213,14 +216,32 @@ apt_watcher_upgrade_system_cb (GObject * obj,
static void
apt_watcher_show_apt_dialog (DbusmenuMenuitem * mi,
guint timestamp,
- gchar * type)
+ gpointer userdata)
{
GError * error = NULL;
- if (!g_spawn_command_line_async("update-manager", &error))
- {
- g_warning("Unable to show update-manager: %s", error->message);
- g_error_free(error);
- }
+ g_return_if_fail (APT_IS_WATCHER (userdata));
+ AptWatcher* self = APT_WATCHER (userdata);
+ const gchar* disposition = NULL;
+ disposition = dbusmenu_menuitem_property_get (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_DISPOSITION);
+
+ if (g_strcmp0 (disposition, DBUSMENU_MENUITEM_DISPOSITION_ALERT) == 0){
+ gchar * helper = g_build_filename (LIBEXECDIR, "gtk-logout-helper", NULL);
+ gchar * dialog_line = g_strdup_printf ("%s --%s", helper, "restart");
+ g_free(helper);
+ if (!g_spawn_command_line_async(dialog_line, &error)) {
+ g_warning("Unable to show dialog: %s", error->message);
+ g_error_free(error);
+ }
+ g_free(dialog_line);
+ }
+ else{
+ if (!g_spawn_command_line_async("update-manager", &error))
+ {
+ g_warning("Unable to show update-manager: %s", error->message);
+ g_error_free(error);
+ }
+ }
}
static void
@@ -245,7 +266,16 @@ apt_watcher_transaction_state_update_cb (AptTransaction* trans,
== SIMULATION){
g_object_unref (G_OBJECT(self->current_transaction));
self->current_transaction = NULL;
- }
+ }
+ if (self->reboot_query != 0){
+ g_source_remove (self->reboot_query);
+ self->reboot_query = 0;
+ }
+ // Wait a sec before querying for reboot status,
+ // race condition with Apt has been observed.
+ self->reboot_query = g_timeout_add_seconds (1,
+ apt_watcher_query_reboot_status,
+ self);
}
else if (state == UPDATES_AVAILABLE){
dbusmenu_menuitem_property_set (self->apt_item,
@@ -266,27 +296,20 @@ apt_watcher_transaction_state_update_cb (AptTransaction* trans,
_("Updates Installing…"));
}
else if (state == FINISHED){
- GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
- "RebootRequired");
- gboolean reboot;
- g_variant_get (reboot_result, "b", &reboot);
- if (reboot == FALSE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Software Up to Date"));
- }
- else{
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Reboot Required"));
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_DISPOSITION,
- DBUSMENU_MENUITEM_DISPOSITION_ALERT);
- session_dbus_restart_required (self->session_dbus_interface);
- }
- g_debug ("Finished with a reboot value of %i", reboot);
g_object_unref (G_OBJECT(self->current_transaction));
- self->current_transaction = NULL;
+ self->current_transaction = NULL;
+ if (self->reboot_query != 0){
+ g_source_remove (self->reboot_query);
+ self->reboot_query = 0;
+ }
+ // Wait a sec before querying for reboot status,
+ // race condition with Apt has been observed.
+ self->reboot_query = g_timeout_add_seconds (1,
+ apt_watcher_query_reboot_status,
+ self);
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Finished Updating…"));
}
self->current_state = state;
}
@@ -302,8 +325,42 @@ apt_watcher_manage_transactions (AptWatcher* self, gchar* transaction_id)
}
}
+static gboolean
+apt_watcher_query_reboot_status (gpointer data)
+{
+ g_return_val_if_fail (APT_IS_WATCHER (data), FALSE);
+ AptWatcher* self = APT_WATCHER (data);
+
+ GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
+ "RebootRequired");
+ gboolean reboot;
+ g_variant_get (reboot_result, "b", &reboot);
+ g_debug ("apt_watcher_query_reboot_status: reboot prop = %i", reboot);
+
+ if (reboot == FALSE){
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Software Up to Date"));
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_DISPOSITION,
+ DBUSMENU_MENUITEM_DISPOSITION_NORMAL);
+
+ }
+ else{
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Reboot Required"));
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_DISPOSITION,
+ DBUSMENU_MENUITEM_DISPOSITION_ALERT);
+ session_dbus_restart_required (self->session_dbus_interface);
+ }
+ self->reboot_query = 0;
+ return FALSE;
+}
+
// TODO - Ask MVO about this.
-// Signal is of type s not sas which is on d-feet !!!
+// Signal is of type s not sas which is on d-feet.
static void apt_watcher_signal_cb ( GDBusProxy* proxy,
gchar* sender_name,
gchar* signal_name,
diff --git a/src/device-menu-mgr.c b/src/device-menu-mgr.c
index 523ea8d..5a63be3 100644
--- a/src/device-menu-mgr.c
+++ b/src/device-menu-mgr.c
@@ -61,7 +61,6 @@ static DBusGProxyCall * hibernate_call = NULL;
static DbusmenuMenuitem * hibernate_mi = NULL;
static DbusmenuMenuitem * suspend_mi = NULL;
static DbusmenuMenuitem * logout_mi = NULL;
-static DbusmenuMenuitem * restart_mi = NULL;
static DbusmenuMenuitem * shutdown_mi = NULL;
static gboolean can_hibernate = TRUE;
@@ -73,7 +72,6 @@ static DBusGProxy * up_main_proxy = NULL;
static DBusGProxy * up_prop_proxy = NULL;
static void device_menu_mgr_ensure_settings_client (DeviceMenuMgr* self);
-static void setup_restart_watch (DeviceMenuMgr* self);
static void setup_up (DeviceMenuMgr* self);
static void device_menu_mgr_rebuild_items (DeviceMenuMgr *self);
static void lock_if_possible (DeviceMenuMgr* self);
@@ -106,7 +104,6 @@ device_menu_mgr_init (DeviceMenuMgr *self)
{
self->apt_watcher = NULL;
self->root_item = dbusmenu_menuitem_new ();
- setup_restart_watch(self);
setup_up(self);
g_idle_add(lock_screen_setup, NULL);
}
@@ -751,62 +748,6 @@ device_menu_mgr_rebuild_items (DeviceMenuMgr* self)
can_suspend && allow_suspend);
}
-/* When the directory changes we need to figure out how our menu
- item should look. */
-static void
-restart_dir_changed (gpointer userdata)
-{
- DeviceMenuMgr* self = DEVICE_MENU_MGR (userdata);
- gboolean restart_required = g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS);
-
- if (restart_required) {
- if (supress_confirmations()) {
- dbusmenu_menuitem_property_set (restart_mi,
- RESTART_ITEM_LABEL,
- _("Restart to Complete Update"));
- } else {
- dbusmenu_menuitem_property_set (restart_mi,
- RESTART_ITEM_LABEL,
- _("Restart to Complete Update\342\200\246"));
- }
- dbusmenu_menuitem_property_set (restart_mi,
- RESTART_ITEM_ICON,
- "system-restart-panel");
- if (self->session_dbus_interface != NULL) {
- session_dbus_set_name (self->session_dbus_interface, ICON_RESTART);
- }
- } else {
- if (supress_confirmations()) {
- dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart"));
- } else {
- dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart\342\200\246"));
- }
- dbusmenu_menuitem_property_remove(restart_mi, RESTART_ITEM_ICON);
- if (self->session_dbus_interface != NULL) {
- session_dbus_set_name(self->session_dbus_interface, ICON_DEFAULT);
- }
- }
- return;
-}
-
-/* Buids a file watcher for the directory so that when it
- changes we can check to see if our reboot-required is
- there. */
-static void
-setup_restart_watch (DeviceMenuMgr* self)
-{
- GFile * filedir = g_file_new_for_path("/var/run");
- GFileMonitor * filemon = g_file_monitor_directory(filedir, G_FILE_MONITOR_NONE, NULL, NULL);
- if (filemon != NULL) {
- g_signal_connect (G_OBJECT(filemon),
- "changed",
- G_CALLBACK(restart_dir_changed),
- self);
- }
- restart_dir_changed(self);
- return;
-}
-
/* Ensures that we have a GConf client and if we build one
set up the signal handler. */
static void
diff --git a/src/indicator-session.c b/src/indicator-session.c
index fab47b3..aacef49 100644
--- a/src/indicator-session.c
+++ b/src/indicator-session.c
@@ -497,8 +497,7 @@ receive_signal (GDBusProxy * proxy,
&self->users);
}
}
- else if (g_strcmp0(signal_name, "RebootRequired") == 0) {
- // TODO waiting on design to give me a name.
+ else if (g_strcmp0(signal_name, "RestartRequired") == 0) {
self->devices.image = indicator_image_helper (ICON_RESTART);
}
}
diff --git a/src/session-dbus.c b/src/session-dbus.c
index 1cf73ac..232e440 100644
--- a/src/session-dbus.c
+++ b/src/session-dbus.c
@@ -300,11 +300,13 @@ void session_dbus_restart_required (SessionDbus* session)
GError * error = NULL;
if (priv->bus != NULL) {
+ g_debug("About to send RebootRequired signal");
+
g_dbus_connection_emit_signal (priv->bus,
NULL,
INDICATOR_SESSION_SERVICE_DBUS_OBJECT,
INDICATOR_SESSION_SERVICE_DBUS_IFACE,
- "RebootRequired",
+ "RestartRequired",
NULL,
&error);
diff --git a/src/session-dbus.xml b/src/session-dbus.xml
index fd1859f..96e9837 100644
--- a/src/session-dbus.xml
+++ b/src/session-dbus.xml
@@ -8,9 +8,6 @@
<method name="GetUserMenuVisibility">
<arg name="update" direction="out" type="b"/>
</method>
- <method name="IsUpdateNeeded">
- <arg name="update" direction="out" type="b"/>
- </method>
<signal name="UserRealNameUpdated">
<arg name="name" type="s"/>
</signal>