aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/ChangeLog12
-rw-r--r--e-util/e-error.c33
-rw-r--r--e-util/e-error.h3
-rw-r--r--mail/ChangeLog9
-rw-r--r--mail/mail-session.c34
5 files changed, 77 insertions, 14 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index b9489d1a25..98cea5349d 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,15 @@
+2008-02-08 Matthew Barnes <mbarnes@redhat.com>
+
+ ** Fixes part of bug #509741
+
+ * e-error.c (e_error_newv):
+ If the error dialog has no primary text, fallback to the window
+ title for the "primary" data key. This is what gets displayed
+ in the status bar.
+
+ * e-error.c (e_error_count_buttons):
+ New function counts buttons in a dialog's action area.
+
2008-01-24 Tor Lillqvist <tml@novell.com>
* e-icon-factory.c (e_icon_factory_init): Construct pathname under
diff --git a/e-util/e-error.c b/e-util/e-error.c
index 007d910f0d..e47869f32a 100644
--- a/e-util/e-error.c
+++ b/e-util/e-error.c
@@ -533,7 +533,8 @@ e_error_newv(GtkWindow *parent, const char *tag, const char *arg0, va_list ap)
ee_build_label(oerr, dgettext(table->translation_domain, e->primary), args);
perr = g_strdup (oerr->str);
g_string_free (oerr, TRUE);
- }
+ } else
+ perr = g_strdup (gtk_window_get_title (GTK_WINDOW (dialog)));
if (e->secondary) {
ee_build_label(out, dgettext(table->translation_domain, e->secondary), args);
@@ -640,6 +641,36 @@ e_error_run(GtkWindow *parent, const char *tag, const char *arg0, ...)
return res;
}
+/**
+ * e_error_count_buttons:
+ * @dialog: a #GtkDialog
+ *
+ * Counts the number of buttons in @dialog's action area.
+ *
+ * Returns: number of action area buttons
+ **/
+guint
+e_error_count_buttons (GtkDialog *dialog)
+{
+ GtkContainer *action_area;
+ GList *children, *iter;
+ guint n_buttons = 0;
+
+ g_return_val_if_fail (GTK_DIALOG (dialog), 0);
+
+ action_area = GTK_CONTAINER (dialog->action_area);
+ children = gtk_container_get_children (action_area);
+
+ /* Iterate over the children looking for buttons. */
+ for (iter = children; iter != NULL; iter = iter->next)
+ if (GTK_IS_BUTTON (iter->data))
+ n_buttons++;
+
+ g_list_free (children);
+
+ return n_buttons;
+}
+
static void
remove_parent(GtkWidget *w, GtkWidget *parent)
{
diff --git a/e-util/e-error.h b/e-util/e-error.h
index cb32a4dadb..1cf3aca3bb 100644
--- a/e-util/e-error.h
+++ b/e-util/e-error.h
@@ -23,6 +23,7 @@
#define _E_ERROR_H
#include <stdarg.h>
+#include <gtk/gtk.h>
struct _GtkWindow;
@@ -54,6 +55,8 @@ struct _GtkWidget *e_error_newv(struct _GtkWindow *parent, const char *tag, cons
int e_error_run(struct _GtkWindow *parent, const char *tag, const char *arg0, ...);
int e_error_runv(struct _GtkWindow *parent, const char *tag, const char *arg0, va_list ap);
+guint e_error_count_buttons (GtkDialog *dialog);
+
void e_error_default_parent(struct _GtkWindow *parent);
#endif /* !_E_ERROR_H */
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 37f91f43c4..aadafa8a63 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,12 @@
+2008-02-08 Matthew Barnes <mbarnes@redhat.com>
+
+ ** Fixes part of bug #509741
+
+ * mail-session.c (user_message_exec):
+ Use the number of dialog buttons as a heuristic for whether to
+ display a message in the status bar or immediately present the
+ dialog to the user.
+
2008-01-29 Matthew Barnes <mbarnes@redhat.com>
* mail-send-recv.c:
diff --git a/mail/mail-session.c b/mail/mail-session.c
index 793796f330..9f9a2712b7 100644
--- a/mail/mail-session.c
+++ b/mail/mail-session.c
@@ -342,23 +342,31 @@ user_message_exec (struct _user_message_msg *m)
user_message_dialog, "allow_shrink", TRUE,
"allow_grow", TRUE, NULL);
- /* We only need to wait for the result if we allow cancel
- * otherwise show but send result back instantly */
- if (m->allow_cancel && m->ismain) {
- gint response = gtk_dialog_run (user_message_dialog);
- user_message_response (user_message_dialog, response, m);
+ /* Use the number of dialog buttons as a heuristic for whether to
+ * emit a status bar message or present the dialog immediately, the
+ * thought being if there's more than one button then something is
+ * probably blocked until the user responds. */
+ if (e_error_count_buttons (user_message_dialog) > 1) {
+ if (m->ismain) {
+ gint response;
+
+ response = gtk_dialog_run (user_message_dialog);
+ user_message_response (
+ user_message_dialog, response, m);
+ } else {
+ g_signal_connect (
+ user_message_dialog, "response",
+ G_CALLBACK (user_message_response), m);
+ gtk_widget_show (user_message_dialog);
+ }
} else {
- g_object_set_data ((GObject *) user_message_dialog, "response-handled", GINT_TO_POINTER(TRUE));
g_signal_connect (
user_message_dialog, "response",
G_CALLBACK (user_message_response), m);
-
- /* If the dialog has no "primary" text, there's nothing to
- * display in the status bar. So just show the dialog. */
- if (g_object_get_data (user_message_dialog, "primary"))
- em_utils_show_error_silent (user_message_dialog);
- else
- gtk_widget_show (user_message_dialog);
+ g_object_set_data (
+ user_message_dialog, "response-handled",
+ GINT_TO_POINTER (TRUE));
+ em_utils_show_error_silent (user_message_dialog);
}
}