From bb316e53767cf8e25e9088b3a6699c253f889cb9 Mon Sep 17 00:00:00 2001 From: Jehan Date: Sun, 29 Dec 2019 10:51:59 +0100 Subject: [PATCH] app: add alternative "Check for updates" button in the About dialog. When an update is available, a big frame is visible, proposing to go to the download page. Now a button is also available to explicitly request for an update check in other cases (bypassing the wait delay for a future startup). (cherry picked from commit 827473fd881627eed63188cf70d8a04fe9d1cda8) --- app/app.c | 2 +- app/dialogs/about-dialog.c | 126 ++++++++++++++++++++++++++++--------- app/gimp-update.c | 23 ++++++- app/gimp-update.h | 3 +- 4 files changed, 119 insertions(+), 35 deletions(-) diff --git a/app/app.c b/app/app.c index 94be6e7c3e..6e852cd513 100644 --- a/app/app.c +++ b/app/app.c @@ -287,7 +287,7 @@ app_run (const gchar *full_prog_name, * Thus we have to add a special flag when we make an update * check so that the timestamp is saved. */ - save_gimprc_at_exit = gimp_update_check (gimp->config); + save_gimprc_at_exit = gimp_update_auto_check (gimp->config); /* Initialize the error handling after creating/migrating the config * directory because it will create some folders for backup and crash diff --git a/app/dialogs/about-dialog.c b/app/dialogs/about-dialog.c index 510c041b9f..4bac38b49a 100644 --- a/app/dialogs/about-dialog.c +++ b/app/dialogs/about-dialog.c @@ -40,6 +40,7 @@ #include "about-dialog.h" #include "authors.h" +#include "gimp-update.h" #include "gimp-intl.h" @@ -55,6 +56,8 @@ typedef struct { GtkWidget *dialog; + GtkWidget *update_frame; + GtkWidget *anim_area; PangoLayout *layout; @@ -81,9 +84,8 @@ static void about_dialog_add_animation (GtkWidget *vbox, static gboolean about_dialog_anim_expose (GtkWidget *widget, GdkEventExpose *event, GimpAboutDialog *dialog); -static void about_dialog_add_update (GtkWidget *vbox, - GimpCoreConfig *config, - GimpAboutDialog *dialog); +static void about_dialog_add_update (GimpAboutDialog *dialog, + GimpCoreConfig *config); static void about_dialog_reshuffle (GimpAboutDialog *dialog); static gboolean about_dialog_timer (gpointer data); @@ -92,6 +94,10 @@ static void about_dialog_add_unstable_message (GtkWidget *vbox); #endif /* GIMP_UNSTABLE */ +static void about_dialog_last_release_changed + (GimpCoreConfig *config, + const GParamSpec *pspec, + GimpAboutDialog *dialog); GtkWidget * about_dialog_create (GimpCoreConfig *config) @@ -161,12 +167,11 @@ about_dialog_create (GimpCoreConfig *config) if (GTK_IS_BOX (children->data)) { - about_dialog_add_update (children->data, - config, &dialog); about_dialog_add_animation (children->data, &dialog); #ifdef GIMP_UNSTABLE about_dialog_add_unstable_message (children->data); #endif /* GIMP_UNSTABLE */ + about_dialog_add_update (&dialog, config); } else g_warning ("%s: ooops, no box in this container?", G_STRLOC); @@ -259,34 +264,44 @@ about_dialog_add_animation (GtkWidget *vbox, } static void -about_dialog_add_update (GtkWidget *vbox, - GimpCoreConfig *config, - GimpAboutDialog *dialog) +about_dialog_add_update (GimpAboutDialog *dialog, + GimpCoreConfig *config) { + GtkWidget *container; + GList *children; + GtkWidget *vbox; + + GtkWidget *frame; + GtkWidget *box; + GtkWidget *label; + GDateTime *datetime; + gchar *date; + gchar *text; + + /* Get the dialog vbox. */ + container = gtk_dialog_get_content_area (GTK_DIALOG (dialog->dialog)); + children = gtk_container_get_children (GTK_CONTAINER (container)); + g_return_if_fail (GTK_IS_BOX (children->data)); + vbox = children->data; + g_list_free (children); + + /* The preferred localized date representation without the time. */ + datetime = g_date_time_new_from_unix_local (config->check_update_timestamp); + date = g_date_time_format (datetime, "%x"); + g_date_time_unref (datetime); + + /* The update frame. */ + frame = gtk_frame_new (NULL); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 2); + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (frame), box); if (config->last_known_release != NULL) { /* There is a newer version. */ GtkWidget *link; GtkWidget *box2; GtkWidget *image; - GtkWidget *frame; - GtkWidget *box; - GtkWidget *label; - GDateTime *datetime; - gchar *date; - gchar *text; - - /* The update frame. */ - frame = gtk_frame_new (NULL); - gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 2); - - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (frame), box); - - /* The preferred localized date representation without the time. */ - datetime = g_date_time_new_from_unix_local (config->check_update_timestamp); - date = g_date_time_format (datetime, "%x"); - g_date_time_unref (datetime); /* We want the frame to stand out. */ label = gtk_label_new (NULL); @@ -298,7 +313,7 @@ about_dialog_add_update (GtkWidget *vbox, gtk_frame_set_label_widget (GTK_FRAME (frame), label); gtk_frame_set_label_align (GTK_FRAME (frame), 0.5, 0.5); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); - gtk_box_reorder_child (GTK_BOX (vbox), frame, 2); + gtk_box_reorder_child (GTK_BOX (vbox), frame, 3); /* Explanation text with update image. */ box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); @@ -314,7 +329,6 @@ about_dialog_add_update (GtkWidget *vbox, "It is recommended to update."), config->last_known_release, date); label = gtk_label_new (text); - g_free (date); g_free (text); gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0); @@ -325,10 +339,43 @@ about_dialog_add_update (GtkWidget *vbox, _("Go to download page")); gtk_box_pack_start (GTK_BOX (box), link, FALSE, FALSE, 0); gtk_widget_show (link); - - gtk_widget_show (box); - gtk_widget_show (frame); } + else + { + /* Show a check update version. */ + GtkWidget *button; + gchar *text2; + + gtk_box_reorder_child (GTK_BOX (vbox), frame, 4); + + text2 = g_strdup_printf (_("Last checked on %s"), date); + text = g_strdup_printf ("%s\n%s", + _("Check for updates"), text2); + + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), text); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER); + g_free (text); + g_free (text2); + + button = gtk_button_new (); + gtk_container_add (GTK_CONTAINER (button), label); + gtk_widget_show (label); + + g_signal_connect (config, "notify::last-known-release", + (GCallback) about_dialog_last_release_changed, + dialog); + g_signal_connect_swapped (button, "clicked", + (GCallback) gimp_update_check, config); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + gtk_widget_show (button); + } + g_free (date); + + gtk_widget_show (box); + gtk_widget_show (frame); + + dialog->update_frame = frame; } static void @@ -698,3 +745,20 @@ about_dialog_add_unstable_message (GtkWidget *vbox) } #endif /* GIMP_UNSTABLE */ + +static void +about_dialog_last_release_changed (GimpCoreConfig *config, + const GParamSpec *pspec, + GimpAboutDialog *dialog) +{ + g_signal_handlers_disconnect_by_func (config, + (GCallback) about_dialog_last_release_changed, + dialog); + if (dialog->update_frame) + { + gtk_widget_destroy (dialog->update_frame); + dialog->update_frame = NULL; + } + + about_dialog_add_update (dialog, config); +} diff --git a/app/gimp-update.c b/app/gimp-update.c index 29c284bd07..471bfbf20b 100644 --- a/app/gimp-update.c +++ b/app/gimp-update.c @@ -162,10 +162,15 @@ gimp_check_updates_callback (GObject *source, } } +/* + * gimp_update_auto_check: + * @config: + * + * Run the check for newer versions of GIMP if conditions are right. + */ gboolean -gimp_update_check (GimpCoreConfig *config) +gimp_update_auto_check (GimpCoreConfig *config) { - GFile *gimp_versions; gint64 prev_update_timestamp; gint64 current_timestamp; @@ -187,6 +192,20 @@ gimp_update_check (GimpCoreConfig *config) return FALSE; #endif + return gimp_update_check (config); +} + +/* + * gimp_update_check: + * @config: + * + * Run the check for newer versions of GIMP inconditionnally. + */ +gboolean +gimp_update_check (GimpCoreConfig *config) +{ + GFile *gimp_versions; + #ifdef GIMP_UNSTABLE if (g_getenv ("GIMP_DEV_VERSIONS_JSON")) gimp_versions = g_file_new_for_path (g_getenv ("GIMP_DEV_VERSIONS_JSON")); diff --git a/app/gimp-update.h b/app/gimp-update.h index 43e841102d..dcc665d94a 100644 --- a/app/gimp-update.h +++ b/app/gimp-update.h @@ -22,7 +22,8 @@ #define __APP_GIMP_UPDATE_H__ -gboolean gimp_update_check (GimpCoreConfig *config); +gboolean gimp_update_auto_check (GimpCoreConfig *config); +gboolean gimp_update_check (GimpCoreConfig *config); #endif /* __APP_GIMP_UPDATE_H__ */