[gnome-software/987-removing-layered-local-package-on-silverblue-does-not-notify-the-user-that-it-was-actually] gs-app: Introduce pending install and pending remove application states
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/987-removing-layered-local-package-on-silverblue-does-not-notify-the-user-that-it-was-actually] gs-app: Introduce pending install and pending remove application states
- Date: Fri, 16 Apr 2021 10:18:45 +0000 (UTC)
commit b67500feab8ec91c1c9e5aefb7a1d8f80d1266a1
Author: Milan Crha <mcrha redhat com>
Date: Fri Apr 16 12:06:24 2021 +0200
gs-app: Introduce pending install and pending remove application states
These can be used to indicate that the application had been installed/removed,
but there's needed certain action to finish the operation, like a machine reboot.
lib/gs-app.c | 18 +++++++++++++++---
lib/gs-app.h | 6 ++++++
src/gs-app-addon-row.c | 8 ++++++++
src/gs-app-row.c | 8 ++++++++
src/gs-details-page.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 81 insertions(+), 3 deletions(-)
---
diff --git a/lib/gs-app.c b/lib/gs-app.c
index e8eb9d48b..a967ec9d1 100644
--- a/lib/gs-app.c
+++ b/lib/gs-app.c
@@ -236,6 +236,10 @@ gs_app_state_to_string (GsAppState state)
return "updatable-live";
if (state == GS_APP_STATE_UNAVAILABLE)
return "unavailable";
+ if (state == GS_APP_STATE_PENDING_INSTALL)
+ return "pending-install";
+ if (state == GS_APP_STATE_PENDING_REMOVE)
+ return "pending-remove";
return NULL;
}
@@ -1029,7 +1033,9 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
state == GS_APP_STATE_AVAILABLE_LOCAL ||
state == GS_APP_STATE_UPDATABLE ||
state == GS_APP_STATE_UPDATABLE_LIVE ||
- state == GS_APP_STATE_UNAVAILABLE)
+ state == GS_APP_STATE_UNAVAILABLE ||
+ state == GS_APP_STATE_PENDING_INSTALL ||
+ state == GS_APP_STATE_PENDING_REMOVE)
state_change_ok = TRUE;
break;
case GS_APP_STATE_INSTALLED:
@@ -1060,7 +1066,8 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
state == GS_APP_STATE_INSTALLED ||
state == GS_APP_STATE_UPDATABLE ||
state == GS_APP_STATE_UPDATABLE_LIVE ||
- state == GS_APP_STATE_AVAILABLE)
+ state == GS_APP_STATE_AVAILABLE ||
+ state == GS_APP_STATE_PENDING_INSTALL)
state_change_ok = TRUE;
break;
case GS_APP_STATE_REMOVING:
@@ -1068,7 +1075,8 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
if (state == GS_APP_STATE_UNKNOWN ||
state == GS_APP_STATE_UNAVAILABLE ||
state == GS_APP_STATE_AVAILABLE ||
- state == GS_APP_STATE_INSTALLED)
+ state == GS_APP_STATE_INSTALLED ||
+ state == GS_APP_STATE_PENDING_REMOVE)
state_change_ok = TRUE;
break;
case GS_APP_STATE_UPDATABLE:
@@ -1097,6 +1105,10 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
state == GS_APP_STATE_INSTALLING)
state_change_ok = TRUE;
break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
+ state_change_ok = TRUE;
+ break;
default:
g_warning ("state %s unhandled",
gs_app_state_to_string (priv->state));
diff --git a/lib/gs-app.h b/lib/gs-app.h
index 2961da4b4..01c2c6d52 100644
--- a/lib/gs-app.h
+++ b/lib/gs-app.h
@@ -43,6 +43,10 @@ struct _GsAppClass
* @GS_APP_STATE_UPDATABLE_LIVE: Application is installed and updatable live
* @GS_APP_STATE_PURCHASABLE: Application is available for purchasing
* @GS_APP_STATE_PURCHASING: Application is being purchased
+ * @GS_APP_STATE_PENDING_INSTALL: Application is installed, but may have pending some actions,
+ * like restart, to finish it
+ * @GS_APP_STATE_PENDING_REMOVE: Application is removed, but may have pending some actions,
+ * like restart, to finish it
*
* The application state.
**/
@@ -59,6 +63,8 @@ typedef enum {
GS_APP_STATE_UPDATABLE_LIVE, /* Since: 0.5.4 */
GS_APP_STATE_PURCHASABLE, /* Since: 0.5.17 */
GS_APP_STATE_PURCHASING, /* Since: 0.5.17 */
+ GS_APP_STATE_PENDING_INSTALL, /* Since: 41 */
+ GS_APP_STATE_PENDING_REMOVE, /* Since: 41 */
GS_APP_STATE_LAST /*< skip >*/
} GsAppState;
diff --git a/src/gs-app-addon-row.c b/src/gs-app-addon-row.c
index 4de05d763..bc610e0d0 100644
--- a/src/gs-app-addon-row.c
+++ b/src/gs-app-addon-row.c
@@ -96,6 +96,14 @@ gs_app_addon_row_refresh (GsAppAddonRow *row)
gtk_widget_set_visible (row->label, TRUE);
gtk_label_set_label (GTK_LABEL (row->label), _("Pending"));
break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ gtk_widget_set_visible (row->label, TRUE);
+ gtk_label_set_label (GTK_LABEL (row->label), _("Pending install"));
+ break;
+ case GS_APP_STATE_PENDING_REMOVE:
+ gtk_widget_set_visible (row->label, TRUE);
+ gtk_label_set_label (GTK_LABEL (row->label), _("Pending remove"));
+ break;
case GS_APP_STATE_UPDATABLE:
case GS_APP_STATE_UPDATABLE_LIVE:
case GS_APP_STATE_INSTALLED:
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index 039efc541..e3c5d0802 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -412,6 +412,14 @@ gs_app_row_actually_refresh (GsAppRow *app_row)
gtk_widget_set_visible (priv->label, TRUE);
gtk_label_set_label (GTK_LABEL (priv->label), _("Pending"));
break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ gtk_widget_set_visible (priv->label, TRUE);
+ gtk_label_set_label (GTK_LABEL (priv->label), _("Pending install"));
+ break;
+ case GS_APP_STATE_PENDING_REMOVE:
+ gtk_widget_set_visible (priv->label, TRUE);
+ gtk_label_set_label (GTK_LABEL (priv->label), _("Pending remove"));
+ break;
default:
gtk_widget_set_visible (priv->label, FALSE);
break;
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 00b0030b0..e7d98e042 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -381,6 +381,21 @@ gs_details_page_refresh_progress (GsDetailsPage *self)
gtk_label_set_label (GTK_LABEL (self->label_progress_status),
_("Installing"));
break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ gtk_widget_set_visible (self->label_progress_status, TRUE);
+ if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT))
+ gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Requires restart to
finish install"));
+ else
+ gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Pending install"));
+ break;
+ case GS_APP_STATE_PENDING_REMOVE:
+ gtk_widget_set_visible (self->label_progress_status, TRUE);
+ if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT))
+ gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Requires restart to
finish remove"));
+ else
+ gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Pending remove"));
+ break;
+
default:
gtk_widget_set_visible (self->label_progress_status, FALSE);
break;
@@ -455,6 +470,12 @@ gs_details_page_refresh_progress (GsDetailsPage *self)
/* align text together with the spinner if we're showing it */
gtk_widget_set_halign (self->box_progress2, GTK_ALIGN_START);
break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
+ gtk_widget_set_halign (self->box_progress2, GTK_ALIGN_START);
+ gtk_widget_set_visible (self->spinner_remove, FALSE);
+ gtk_spinner_stop (GTK_SPINNER (self->spinner_remove));
+ break;
default:
gtk_widget_set_visible (self->spinner_remove, FALSE);
gtk_spinner_stop (GTK_SPINNER (self->spinner_remove));
@@ -466,6 +487,8 @@ gs_details_page_refresh_progress (GsDetailsPage *self)
switch (state) {
case GS_APP_STATE_REMOVING:
case GS_APP_STATE_INSTALLING:
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
gtk_widget_set_visible (self->box_progress, TRUE);
break;
default:
@@ -1007,6 +1030,15 @@ gs_details_page_refresh_buttons (GsDetailsPage *self)
case GS_APP_STATE_QUEUED_FOR_INSTALL:
gtk_widget_set_visible (self->button_install, FALSE);
break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
+ if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT)) {
+ gtk_widget_set_visible (self->button_install, TRUE);
+ gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Restart"));
+ } else {
+ gtk_widget_set_visible (self->button_install, FALSE);
+ }
+ break;
case GS_APP_STATE_UPDATABLE_LIVE:
if (gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) {
gtk_widget_set_visible (self->button_install, TRUE);
@@ -1087,6 +1119,8 @@ gs_details_page_refresh_buttons (GsDetailsPage *self)
case GS_APP_STATE_UNAVAILABLE:
case GS_APP_STATE_UNKNOWN:
case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
gtk_widget_set_visible (self->button_remove, FALSE);
break;
default:
@@ -2309,6 +2343,16 @@ gs_details_page_app_install_button_cb (GtkWidget *widget, GsDetailsPage *self)
{
g_autoptr(GList) addons = NULL;
+ switch (gs_app_get_state (self->app)) {
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
+ g_return_if_fail (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT));
+ gs_utils_invoke_reboot (NULL, NULL, NULL);
+ return;
+ default:
+ break;
+ }
+
/* Mark ticked addons to be installed together with the app */
addons = gtk_container_get_children (GTK_CONTAINER (self->list_box_addons));
for (GList *l = addons; l; l = l->next) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]