[gnome-software/wip/kalev/fix-offline-updates: 1/2] Make offline update triggering work when online updates are available
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/kalev/fix-offline-updates: 1/2] Make offline update triggering work when online updates are available
- Date: Thu, 23 Mar 2017 17:46:27 +0000 (UTC)
commit 9409669f13c4898904d90730ec6cba6d57d9d526
Author: Kalev Lember <klember redhat com>
Date: Thu Mar 23 17:39:57 2017 +0100
Make offline update triggering work when online updates are available
Depending on what kind of updates are available, the "Restart & Update"
and "Update All" buttons can be either up in the header bar or down in a
section header. The code paths that the button click handlers were
taking were completely different: one triggered
gs_plugin_loader_app_action_async (app, GS_PLUGIN_ACTION_UPDATE) with
each updatable app, and the other one triggered
gs_plugin_loader_update_async (apps) with all the apps.
This commit rewires this so that we take the same backend path with
either one, and also makes the offline updates triggering work again
when the "Restart & Update" button is down in the section header.
src/gs-update-list.c | 38 +++++++++++++++++++++++++++-----------
src/gs-update-list.h | 2 ++
src/gs-updates-page.c | 28 ++++++++++++++++++++++------
3 files changed, 51 insertions(+), 17 deletions(-)
---
diff --git a/src/gs-update-list.c b/src/gs-update-list.c
index 1a442a0..1e66d06 100644
--- a/src/gs-update-list.c
+++ b/src/gs-update-list.c
@@ -48,6 +48,7 @@ typedef struct
enum {
SIGNAL_BUTTON_CLICKED,
+ SIGNAL_UPDATE_ALL,
SIGNAL_LAST
};
@@ -166,44 +167,52 @@ gs_update_list_get_apps (GsUpdateList *update_list)
return apps;
}
-static void
-gs_update_list_emit_clicked_for_section (GsUpdateList *update_list,
- GsUpdateListSection section)
+static GsAppList *
+gs_update_list_get_apps_for_section (GsUpdateList *update_list,
+ GsUpdateListSection section)
{
+ GsAppList *apps;
+ GList *l;
g_autoptr(GList) children = NULL;
+
+ apps = gs_app_list_new ();
children = gtk_container_get_children (GTK_CONTAINER (update_list));
- for (GList *l = children; l != NULL; l = l->next) {
+ for (l = children; l != NULL; l = l->next) {
GsAppRow *app_row = GS_APP_ROW (l->data);
GsApp *app = gs_app_row_get_app (app_row);
if (gs_update_list_get_app_section (app) != section)
continue;
- g_signal_emit (update_list, signals[SIGNAL_BUTTON_CLICKED], 0, app);
+ gs_app_list_add (apps, gs_app_row_get_app (app_row));
}
+ return apps;
}
static void
gs_update_list_update_offline_firmware_cb (GtkButton *button,
GsUpdateList *update_list)
{
+ g_autoptr(GsAppList) apps = gs_update_list_get_apps_for_section (update_list,
+
GS_UPDATE_LIST_SECTION_OFFLINE_FIRMWARE);
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
- gs_update_list_emit_clicked_for_section (update_list,
- GS_UPDATE_LIST_SECTION_OFFLINE_FIRMWARE);
+ g_signal_emit (update_list, signals[SIGNAL_UPDATE_ALL], 0, apps);
}
static void
gs_update_list_update_offline_cb (GtkButton *button, GsUpdateList *update_list)
{
+ g_autoptr(GsAppList) apps = gs_update_list_get_apps_for_section (update_list,
+ GS_UPDATE_LIST_SECTION_OFFLINE);
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
- gs_update_list_emit_clicked_for_section (update_list,
- GS_UPDATE_LIST_SECTION_OFFLINE);
+ g_signal_emit (update_list, signals[SIGNAL_UPDATE_ALL], 0, apps);
}
static void
gs_update_list_update_online_cb (GtkButton *button, GsUpdateList *update_list)
{
+ g_autoptr(GsAppList) apps = gs_update_list_get_apps_for_section (update_list,
+ GS_UPDATE_LIST_SECTION_ONLINE);
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
- gs_update_list_emit_clicked_for_section (update_list,
- GS_UPDATE_LIST_SECTION_ONLINE);
+ g_signal_emit (update_list, signals[SIGNAL_UPDATE_ALL], 0, apps);
}
static GtkWidget *
@@ -424,6 +433,13 @@ gs_update_list_class_init (GsUpdateListClass *klass)
NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, GS_TYPE_APP);
+ signals [SIGNAL_UPDATE_ALL] =
+ g_signal_new ("update-all",
+ G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GsUpdateListClass, update_all),
+ NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, GS_TYPE_APP_LIST);
+
object_class->dispose = gs_update_list_dispose;
}
diff --git a/src/gs-update-list.h b/src/gs-update-list.h
index f89af51..9da6a52 100644
--- a/src/gs-update-list.h
+++ b/src/gs-update-list.h
@@ -37,6 +37,8 @@ struct _GsUpdateListClass
GtkListBoxClass parent_class;
void (*button_clicked) (GsUpdateList *update_list,
GsApp *app);
+ void (*update_all) (GsUpdateList *update_list,
+ GsAppList *apps);
};
GtkWidget *gs_update_list_new (void);
diff --git a/src/gs-updates-page.c b/src/gs-updates-page.c
index e9219bb..668c206 100644
--- a/src/gs-updates-page.c
+++ b/src/gs-updates-page.c
@@ -957,25 +957,39 @@ gs_updates_page_perform_update_cb (GsPluginLoader *plugin_loader,
}
static void
-gs_updates_page_button_update_all_cb (GtkButton *button,
- GsUpdatesPage *self)
+update_all (GsUpdatesPage *self, GsAppList *apps)
{
g_autoptr(GError) error = NULL;
- g_autoptr(GsAppList) apps = NULL;
g_autoptr(GCancellable) cancellable = g_cancellable_new ();
- /* do the offline update */
g_set_object (&self->cancellable, cancellable);
- apps = gs_update_list_get_apps (GS_UPDATE_LIST (self->list_box_updates));
gs_plugin_loader_update_async (self->plugin_loader,
apps,
GS_PLUGIN_FAILURE_FLAGS_USE_EVENTS,
self->cancellable,
(GAsyncReadyCallback) gs_updates_page_perform_update_cb,
self);
+}
+
+static void
+gs_updates_page_header_update_all_cb (GtkButton *button,
+ GsUpdatesPage *self)
+{
+ g_autoptr(GsAppList) apps = NULL;
+
+ apps = gs_update_list_get_apps (GS_UPDATE_LIST (self->list_box_updates));
+ update_all (self, apps);
gtk_widget_set_sensitive (GTK_WIDGET (self->button_update_all), FALSE);
}
+static void
+gs_updates_page_update_all_cb (GsUpdateList *update_list,
+ GsAppList *apps,
+ GsUpdatesPage *self)
+{
+ update_all (self, apps);
+}
+
typedef struct {
GsApp *app;
GsUpdatesPage *self;
@@ -1338,6 +1352,8 @@ gs_updates_page_setup (GsPage *page,
G_CALLBACK (gs_updates_page_activated_cb), self);
g_signal_connect (self->list_box_updates, "button-clicked",
G_CALLBACK (gs_updates_page_button_clicked_cb), self);
+ g_signal_connect (self->list_box_updates, "update-all",
+ G_CALLBACK (gs_updates_page_update_all_cb), self);
/* setup system upgrades */
g_signal_connect (self->upgrade_banner, "download-clicked",
@@ -1358,7 +1374,7 @@ gs_updates_page_setup (GsPage *page,
gtk_widget_set_visible (self->button_update_all, TRUE);
gtk_style_context_add_class (gtk_widget_get_style_context (self->button_update_all),
"suggested-action");
gtk_container_add (GTK_CONTAINER (self->header_end_box), self->button_update_all);
- g_signal_connect (self->button_update_all, "clicked", G_CALLBACK
(gs_updates_page_button_update_all_cb), self);
+ g_signal_connect (self->button_update_all, "clicked", G_CALLBACK
(gs_updates_page_header_update_all_cb), self);
self->header_start_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
gtk_widget_set_visible (self->header_start_box, TRUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]