Author: mbarnes
Date: Fri Feb  8 14:43:44 2008
New Revision: 34977
URL: http://svn.gnome.org/viewvc/evolution?rev=34977&view=rev

Log:
2008-02-08  Matthew Barnes  <[EMAIL PROTECTED]>

        ** Fixes part of bug #509741

        * mail/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.

        * e-util/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-util/e-error.c (e_error_count_buttons):
        New function counts buttons in a dialog's action area.



Modified:
   trunk/e-util/ChangeLog
   trunk/e-util/e-error.c
   trunk/e-util/e-error.h
   trunk/mail/ChangeLog
   trunk/mail/mail-session.c

Modified: trunk/e-util/e-error.c
==============================================================================
--- trunk/e-util/e-error.c      (original)
+++ trunk/e-util/e-error.c      Fri Feb  8 14:43:44 2008
@@ -533,7 +533,8 @@
                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 @@
        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)
 {

Modified: trunk/e-util/e-error.h
==============================================================================
--- trunk/e-util/e-error.h      (original)
+++ trunk/e-util/e-error.h      Fri Feb  8 14:43:44 2008
@@ -23,6 +23,7 @@
 #define _E_ERROR_H
 
 #include <stdarg.h>
+#include <gtk/gtk.h>
 
 struct _GtkWindow;
 
@@ -54,6 +55,8 @@
 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 */

Modified: trunk/mail/mail-session.c
==============================================================================
--- trunk/mail/mail-session.c   (original)
+++ trunk/mail/mail-session.c   Fri Feb  8 14:43:44 2008
@@ -342,23 +342,31 @@
                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);
        }
 }
 
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit 
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development 
mailing list. Email [EMAIL PROTECTED] if interested.

Reply via email to