diff options
-rw-r--r-- | src/apt-watcher.c | 117 | ||||
-rw-r--r-- | src/device-menu-mgr.c | 59 | ||||
-rw-r--r-- | src/indicator-session.c | 3 | ||||
-rw-r--r-- | src/session-dbus.c | 4 | ||||
-rw-r--r-- | src/session-dbus.xml | 3 |
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> |