[gimp] app: keep track of all messages displayed by GimpErrorDialog.
- From: Jehan Pagès <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: keep track of all messages displayed by GimpErrorDialog.
- Date: Wed, 7 Jun 2017 14:07:25 +0000 (UTC)
commit 6c2658ea4d37b325e14715acbfd62e466cac94fc
Author: Jehan <jehan girinstud io>
Date: Wed Jun 7 15:09:43 2017 +0200
app: keep track of all messages displayed by GimpErrorDialog.
This way, you can increment repeated messages even when not the last
one and you don't overflow the error dialog needelessly when 2 errors
repeat one after another.
app/widgets/gimperrordialog.c | 101 +++++++++++++++++++++++------------------
app/widgets/gimperrordialog.h | 6 +--
2 files changed, 58 insertions(+), 49 deletions(-)
---
diff --git a/app/widgets/gimperrordialog.c b/app/widgets/gimperrordialog.c
index c858f8b..a8fff8d 100644
--- a/app/widgets/gimperrordialog.c
+++ b/app/widgets/gimperrordialog.c
@@ -37,10 +37,18 @@
#define GIMP_ERROR_DIALOG_MAX_MESSAGES 3
-static void gimp_error_dialog_finalize (GObject *object);
-static void gimp_error_dialog_response (GtkDialog *dialog,
- gint response_id);
+typedef struct
+{
+ GtkWidget *box;
+ gchar *domain;
+ gchar *message;
+} GimpErrorDialogMessage;
+
+static void gimp_error_dialog_finalize (GObject *object);
+static void gimp_error_dialog_response (GtkDialog *dialog,
+ gint response_id);
+static void gimp_error_dialog_message_destroy (gpointer data);
G_DEFINE_TYPE (GimpErrorDialog, gimp_error_dialog, GIMP_TYPE_DIALOG)
@@ -78,10 +86,8 @@ gimp_error_dialog_init (GimpErrorDialog *dialog)
dialog->vbox, TRUE, TRUE, 0);
gtk_widget_show (dialog->vbox);
- dialog->last_box = NULL;
- dialog->last_domain = NULL;
- dialog->last_message = NULL;
- dialog->num_messages = 0;
+ dialog->messages = NULL;
+ dialog->overflow = FALSE;
}
static void
@@ -89,17 +95,8 @@ gimp_error_dialog_finalize (GObject *object)
{
GimpErrorDialog *dialog = GIMP_ERROR_DIALOG (object);
- if (dialog->last_domain)
- {
- g_free (dialog->last_domain);
- dialog->last_domain = NULL;
- }
- if (dialog->last_message)
- {
- g_free (dialog->last_message);
- dialog->last_message = NULL;
- }
-
+ g_list_free_full (dialog->messages,
+ gimp_error_dialog_message_destroy);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -110,6 +107,15 @@ gimp_error_dialog_response (GtkDialog *dialog,
gtk_widget_destroy (GTK_WIDGET (dialog));
}
+static void
+gimp_error_dialog_message_destroy (gpointer data)
+{
+ GimpErrorDialogMessage *item = (GimpErrorDialogMessage *) data;
+
+ g_free (item->domain);
+ g_free (item->message);
+ g_free (item);
+}
/* public functions */
@@ -129,22 +135,30 @@ gimp_error_dialog_add (GimpErrorDialog *dialog,
const gchar *domain,
const gchar *message)
{
- GtkWidget *box;
- gboolean overflow = FALSE;
+ GimpErrorDialogMessage *item;
+ gboolean overflow = FALSE;
g_return_if_fail (GIMP_IS_ERROR_DIALOG (dialog));
g_return_if_fail (domain != NULL);
g_return_if_fail (message != NULL);
- if (dialog->last_box &&
- dialog->last_domain && strcmp (dialog->last_domain, domain) == 0 &&
- dialog->last_message && strcmp (dialog->last_message, message) == 0)
+ if (dialog->messages)
{
- if (gimp_message_box_repeat (GIMP_MESSAGE_BOX (dialog->last_box)))
- return;
+ GList *iter = dialog->messages;
+
+ for (; iter; iter = iter->next)
+ {
+ item = iter->data;
+ if (strcmp (item->domain, domain) == 0 &&
+ strcmp (item->message, message) == 0)
+ {
+ if (gimp_message_box_repeat (GIMP_MESSAGE_BOX (item->box)))
+ return;
+ }
+ }
}
- if (dialog->num_messages >= GIMP_ERROR_DIALOG_MAX_MESSAGES)
+ if (g_list_length (dialog->messages) >= GIMP_ERROR_DIALOG_MAX_MESSAGES)
{
g_printerr ("%s: %s\n\n", domain, message);
@@ -153,39 +167,36 @@ gimp_error_dialog_add (GimpErrorDialog *dialog,
domain = _("Too many error messages!");
message = _("Messages are redirected to stderr.");
- if (dialog->last_domain && strcmp (dialog->last_domain, domain) == 0 &&
- dialog->last_message && strcmp (dialog->last_message, message) == 0)
+ if (dialog->overflow)
{
+ /* We were already overflowing. */
return;
}
+ dialog->overflow = TRUE;
}
- box = g_object_new (GIMP_TYPE_MESSAGE_BOX,
- "icon-name", icon_name,
- NULL);
-
- dialog->num_messages++;
+ item = g_new0 (GimpErrorDialogMessage, 1);
+ item->box = g_object_new (GIMP_TYPE_MESSAGE_BOX,
+ "icon-name", icon_name,
+ NULL);
+ item->domain = g_strdup (domain);
+ item->message = g_strdup (message);
if (overflow)
- gimp_message_box_set_primary_text (GIMP_MESSAGE_BOX (box), "%s", domain);
+ gimp_message_box_set_primary_text (GIMP_MESSAGE_BOX (item->box),
+ "%s", domain);
else
- gimp_message_box_set_primary_text (GIMP_MESSAGE_BOX (box),
+ gimp_message_box_set_primary_text (GIMP_MESSAGE_BOX (item->box),
/* %s is a message domain,
* like "GIMP Message" or
* "PNG Message"
*/
_("%s Message"), domain);
- gimp_message_box_set_text (GIMP_MESSAGE_BOX (box), "%s", message);
-
- gtk_box_pack_start (GTK_BOX (dialog->vbox), box, TRUE, TRUE, 0);
- gtk_widget_show (box);
-
- dialog->last_box = box;
+ gimp_message_box_set_text (GIMP_MESSAGE_BOX (item->box), "%s", message);
- g_free (dialog->last_domain);
- dialog->last_domain = g_strdup (domain);
+ gtk_box_pack_start (GTK_BOX (dialog->vbox), item->box, TRUE, TRUE, 0);
+ gtk_widget_show (item->box);
- g_free (dialog->last_message);
- dialog->last_message = g_strdup (message);
+ dialog->messages = g_list_prepend (dialog->messages, item);
}
diff --git a/app/widgets/gimperrordialog.h b/app/widgets/gimperrordialog.h
index 9f31ce6..2994201 100644
--- a/app/widgets/gimperrordialog.h
+++ b/app/widgets/gimperrordialog.h
@@ -40,10 +40,8 @@ struct _GimpErrorDialog
GtkWidget *vbox;
- GtkWidget *last_box;
- gchar *last_domain;
- gchar *last_message;
- gint num_messages;
+ GList *messages;
+ gboolean overflow;
};
struct _GimpErrorDialogClass
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]