[gnome-packagekit] Inhibit the icon in GpkCheckUpdate rather than having last-set policy. Should fix rh#492005
- From: Richard Hughes <rhughes src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-packagekit] Inhibit the icon in GpkCheckUpdate rather than having last-set policy. Should fix rh#492005
- Date: Wed, 27 May 2009 09:35:25 -0400 (EDT)
commit 09c1823644e0cd949964c346db9b59b12ce27d89
Author: Richard Hughes <richard hughsie com>
Date: Wed May 27 14:33:55 2009 +0100
Inhibit the icon in GpkCheckUpdate rather than having last-set policy. Should fix rh#492005
---
src/gpk-check-update.c | 127 ++++++++++++++++++++++++++++++++++--------------
1 files changed, 90 insertions(+), 37 deletions(-)
diff --git a/src/gpk-check-update.c b/src/gpk-check-update.c
index 9987910..5c16521 100644
--- a/src/gpk-check-update.c
+++ b/src/gpk-check-update.c
@@ -63,7 +63,10 @@ static void gpk_check_update_finalize (GObject *object);
struct GpkCheckUpdatePrivate
{
GtkStatusIcon *status_icon;
- PkConnection *pconnection;
+ gboolean icon_inhibit_update_in_progress;
+ gboolean icon_inhibit_network_offline;
+ gboolean icon_inhibit_update_viewer_connected;
+ gchar *icon_name;
PkTaskList *tlist;
PkControl *control;
GpkHelperRepoSignature *helper_repo_signature;
@@ -80,6 +83,58 @@ struct GpkCheckUpdatePrivate
G_DEFINE_TYPE (GpkCheckUpdate, gpk_check_update, G_TYPE_OBJECT)
/**
+ * gpk_check_update_set_icon_visibility:
+ **/
+static gboolean
+gpk_check_update_set_icon_visibility (GpkCheckUpdate *cupdate)
+{
+ gboolean ret = FALSE;
+
+ /* check we have data */
+ if (cupdate->priv->icon_name == NULL) {
+ egg_debug ("not showing icon as nothing to show");
+ goto out;
+ }
+
+ /* check we have no inhibits */
+ if (cupdate->priv->icon_inhibit_update_in_progress) {
+ egg_debug ("not showing icon as update in progress");
+ goto out;
+ }
+ if (cupdate->priv->icon_inhibit_network_offline) {
+ egg_debug ("not showing icon as network offline");
+ goto out;
+ }
+ if (cupdate->priv->icon_inhibit_update_viewer_connected) {
+ egg_debug ("not showing icon as update viewer showing");
+ goto out;
+ }
+
+ /* all okay, show icon */
+ ret = TRUE;
+out:
+ /* show or hide icon */
+ if (ret) {
+ gtk_status_icon_set_from_icon_name (cupdate->priv->status_icon, cupdate->priv->icon_name);
+ gtk_status_icon_set_visible (cupdate->priv->status_icon, TRUE);
+ } else {
+ gtk_status_icon_set_visible (cupdate->priv->status_icon, FALSE);
+ }
+ return ret;
+}
+
+/**
+ * gpk_check_update_set_icon_name:
+ **/
+static void
+gpk_check_update_set_icon_name (GpkCheckUpdate *cupdate, const gchar *icon_name)
+{
+ g_free (cupdate->priv->icon_name);
+ cupdate->priv->icon_name = g_strdup (icon_name);
+ gpk_check_update_set_icon_visibility (cupdate);
+}
+
+/**
* gpk_check_update_class_init:
* @klass: The GpkCheckUpdateClass
**/
@@ -313,7 +368,7 @@ gpk_check_update_update_system (GpkCheckUpdate *cupdate)
/* we failed, show the icon */
egg_warning ("cannot update system: %s", error->message);
g_error_free (error);
- gtk_status_icon_set_visible (cupdate->priv->status_icon, FALSE);
+ gpk_check_update_set_icon_name (cupdate, NULL);
/* we failed, so re-get the update list */
g_timeout_add_seconds (2, (GSourceFunc) gpk_check_update_get_updates_post_update_cb, cupdate);
}
@@ -382,16 +437,6 @@ gpk_check_update_activate_update_cb (GtkStatusIcon *status_icon, GpkCheckUpdate
}
/**
- * pk_connection_changed_cb:
- **/
-static void
-pk_connection_changed_cb (PkConnection *pconnection, gboolean connected, GpkCheckUpdate *cupdate)
-{
- g_return_if_fail (GPK_IS_CHECK_UPDATE (cupdate));
- egg_debug ("connected=%i", connected);
-}
-
-/**
* gpk_check_update_libnotify_cb:
**/
static void
@@ -820,7 +865,7 @@ gpk_check_update_process_updates (GpkCheckUpdate *cupdate, PkPackageList *list,
/* we have no updates */
if (length == 0) {
egg_debug ("no updates");
- gtk_status_icon_set_visible (cupdate->priv->status_icon, FALSE);
+ gpk_check_update_set_icon_name (cupdate, NULL);
goto out;
}
@@ -855,8 +900,7 @@ gpk_check_update_process_updates (GpkCheckUpdate *cupdate, PkPackageList *list,
/* work out icon (cannot be NULL) */
icon = gpk_check_update_get_best_update_icon (cupdate, list);
- gtk_status_icon_set_from_icon_name (cupdate->priv->status_icon, icon);
- gtk_status_icon_set_visible (cupdate->priv->status_icon, TRUE);
+ gpk_check_update_set_icon_name (cupdate, icon);
/* make tooltip */
if (status_security->len != 0)
@@ -1018,11 +1062,12 @@ static void
gpk_check_update_task_list_changed_cb (PkTaskList *tlist, GpkCheckUpdate *cupdate)
{
g_return_if_fail (GPK_IS_CHECK_UPDATE (cupdate));
- /* hide icon if we are updating */
- if (pk_task_list_contains_role (tlist, PK_ROLE_ENUM_UPDATE_SYSTEM) ||
- pk_task_list_contains_role (tlist, PK_ROLE_ENUM_UPDATE_PACKAGES)) {
- gtk_status_icon_set_visible (cupdate->priv->status_icon, FALSE);
- }
+
+ /* inhibit icon if we are updating */
+ cupdate->priv->icon_inhibit_update_in_progress =
+ (pk_task_list_contains_role (tlist, PK_ROLE_ENUM_UPDATE_SYSTEM) ||
+ pk_task_list_contains_role (tlist, PK_ROLE_ENUM_UPDATE_PACKAGES));
+ gpk_check_update_set_icon_visibility (cupdate);
}
/**
@@ -1160,11 +1205,9 @@ out:
static void
gpk_check_update_network_status_changed_cb (PkControl *control, PkNetworkEnum state, GpkCheckUpdate *cupdate)
{
- //TODO: check that set_visible (TRUE) on a unset icon doesn't cause an icon to show
- if (state == PK_NETWORK_ENUM_OFFLINE)
- gtk_status_icon_set_visible (cupdate->priv->status_icon, FALSE);
- else
- gtk_status_icon_set_visible (cupdate->priv->status_icon, TRUE);
+ /* inhibit icon when we are offline */
+ cupdate->priv->icon_inhibit_network_offline = (state == PK_NETWORK_ENUM_OFFLINE);
+ gpk_check_update_set_icon_visibility (cupdate);
}
/**
@@ -1174,10 +1217,10 @@ static void
gpk_cupdate_connection_changed_cb (EggDbusMonitor *monitor, gboolean connected, GpkCheckUpdate *cupdate)
{
g_return_if_fail (GPK_IS_CHECK_UPDATE (cupdate));
- if (connected) {
- egg_debug ("update viewer on the bus, so hiding icon");
- gtk_status_icon_set_visible (cupdate->priv->status_icon, FALSE);
- }
+ /* inhibit icon when update viewer open */
+ egg_debug ("update viewer on the bus: %i", connected);
+ cupdate->priv->icon_inhibit_update_viewer_connected = connected;
+ gpk_check_update_set_icon_visibility (cupdate);
}
/**
@@ -1438,10 +1481,14 @@ gpk_check_update_finished_cb (PkClient *client, PkExitEnum exit_enum, guint runt
static void
gpk_check_update_init (GpkCheckUpdate *cupdate)
{
+ gboolean ret;
+ PkNetworkEnum state;
+
cupdate->priv = GPK_CHECK_UPDATE_GET_PRIVATE (cupdate);
cupdate->priv->notification_updates_available = NULL;
cupdate->priv->important_updates_array = NULL;
+ cupdate->priv->icon_name = NULL;
cupdate->priv->number_updates_critical_last_shown = 0;
cupdate->priv->status_icon = gtk_status_icon_new ();
@@ -1496,13 +1543,6 @@ gpk_check_update_init (GpkCheckUpdate *cupdate)
cupdate->priv->helper_repo_signature = gpk_helper_repo_signature_new ();
g_signal_connect (cupdate->priv->helper_repo_signature, "event", G_CALLBACK (gpk_check_update_repo_signature_event_cb), NULL);
- cupdate->priv->pconnection = pk_connection_new ();
- g_signal_connect (cupdate->priv->pconnection, "connection-changed",
- G_CALLBACK (pk_connection_changed_cb), cupdate);
- if (pk_connection_valid (cupdate->priv->pconnection)) {
- pk_connection_changed_cb (cupdate->priv->pconnection, TRUE, cupdate);
- }
-
cupdate->priv->control = pk_control_new ();
g_signal_connect (cupdate->priv->control, "updates-changed",
G_CALLBACK (gpk_check_update_updates_changed_cb), cupdate);
@@ -1515,6 +1555,19 @@ gpk_check_update_init (GpkCheckUpdate *cupdate)
cupdate->priv->tlist = pk_task_list_new ();
g_signal_connect (cupdate->priv->tlist, "changed",
G_CALLBACK (gpk_check_update_task_list_changed_cb), cupdate);
+
+ /* coldplug update in progress */
+ cupdate->priv->icon_inhibit_update_in_progress =
+ (pk_task_list_contains_role (cupdate->priv->tlist, PK_ROLE_ENUM_UPDATE_SYSTEM) ||
+ pk_task_list_contains_role (cupdate->priv->tlist, PK_ROLE_ENUM_UPDATE_PACKAGES));
+
+ /* coldplug network state */
+ state = pk_control_get_network_state (cupdate->priv->control, NULL);
+ cupdate->priv->icon_inhibit_network_offline = (state == PK_NETWORK_ENUM_OFFLINE);
+
+ /* coldplug update viewer connected */
+ ret = egg_dbus_monitor_is_connected (cupdate->priv->dbus_monitor_viewer);
+ cupdate->priv->icon_inhibit_update_viewer_connected = ret;
}
/**
@@ -1533,7 +1586,6 @@ gpk_check_update_finalize (GObject *object)
g_return_if_fail (cupdate->priv != NULL);
g_object_unref (cupdate->priv->status_icon);
- g_object_unref (cupdate->priv->pconnection);
g_object_unref (cupdate->priv->tlist);
g_object_unref (cupdate->priv->arefresh);
g_object_unref (cupdate->priv->gconf_client);
@@ -1546,6 +1598,7 @@ gpk_check_update_finalize (GObject *object)
g_ptr_array_foreach (cupdate->priv->important_updates_array, (GFunc) g_free, NULL);
g_ptr_array_free (cupdate->priv->important_updates_array, TRUE);
}
+ g_free (cupdate->priv->icon_name);
G_OBJECT_CLASS (gpk_check_update_parent_class)->finalize (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]