+ /* If a pointer grab is in effect, then the combination of that, and
+ a modal dialog box, will cause an impossible situation.
+ So don't pop it up just yet.
+ */
+ if ( gdk_display_pointer_is_grabbed (gtk_widget_get_display (message_dialog)))
+ {
+ ds_destroy (&lead);
+ ds_destroy (&msg);
+ return TRUE;
+ }
+
+ /* Compose the lead-in. */
+ message_cnt = error_cnt + warning_cnt + note_cnt;
+ if (dropped_messages == 0)
+ ds_put_format (
+ &lead,
+ ngettext ("The PSPP processing engine reported the following message:",
+ "The PSPP processing engine reported the following messages:",
+ message_cnt));
+ else
+ {
+ ds_put_format (
+ &lead,
+ ngettext ("The PSPP processing engine reported %d message.",
+ "The PSPP processing engine reported %d messages.",
+ message_cnt),
+ message_cnt);
+ ds_put_cstr (&lead, " ");
+ ds_put_format (
+ &lead,
+ ngettext ("%d of these messages are displayed below.",
+ "%d of these messages are displayed below.",
+ MAX_EARLY_MESSAGES + MAX_LATE_MESSAGES),
+ MAX_EARLY_MESSAGES + MAX_LATE_MESSAGES);
+ }
+
+
+ /* Compose the messages. */
+ while (!g_queue_is_empty (early_queue))
+ format_message (g_queue_pop_head (early_queue), &msg);
+ if (dropped_messages)
+ {
+ ds_put_format (&msg, "...\nOmitting %lu messages\n...\n",
+ dropped_messages);
+ dropped_messages = 0;
+ }
+ while (!g_queue_is_empty (late_queue))
+ format_message (g_queue_pop_head (late_queue), &msg);
+
+ text_buffer = gtk_text_buffer_new (NULL);
+ gtk_text_buffer_get_end_iter (text_buffer, &end);
+ gtk_text_buffer_insert (text_buffer, &end, ds_data (&msg), ds_length (&msg));