/*
PSPPIRE --- A Graphical User Interface for PSPP
Copyright (C) 2004,2005 Free Software Foundation
- Written by John Darrington
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <stdarg.h>
#include <config.h>
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
#include <libpspp/message.h>
+#include <libpspp/msg-locator.h>
#include "message-dialog.h"
#include "progname.h"
#include <gtk/gtk.h>
#include <glade/glade.h>
+#include <glib.h>
#include "helper.h"
extern GladeXML *xml;
-#define _(A) A
-static void handle_msg(const struct msg *);
+
+static void enqueue_msg (const struct msg *m);
+
+
+static GQueue *message_queue;
+
+
+void
+message_dialog_init (struct source_stream *ss)
+{
+ message_queue = g_queue_new();
+ msg_init (ss, enqueue_msg);
+}
void
-message_dialog_init (void)
+message_dialog_done (void)
{
- msg_init(handle_msg);
+ msg_done();
+ g_queue_free(message_queue);
+}
+
+static gboolean
+dequeue_message(gpointer data)
+{
+ struct msg * m ;
+
+ /* 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_pointer_is_grabbed())
+ return TRUE;
+
+ m = g_queue_pop_tail(message_queue);
+
+ if ( m )
+ {
+ popup_message(m);
+ msg_destroy(m);
+ return TRUE;
+ }
+
+ return FALSE;
}
static void
-handle_msg(const struct msg *m)
+enqueue_msg(const struct msg *msg)
+{
+ struct msg *m = msg_dup(msg);
+
+ g_queue_push_head(message_queue, m);
+
+ g_idle_add(dequeue_message, 0);
+}
+
+
+void
+popup_message(const struct msg *m)
{
GtkWindow *parent;
GtkWidget *dialog;
gtk_widget_destroy (dialog);
}
-/* FIXME: This is a stub .
- * A temporary workaround until getl.c is rearranged
- */
-void
-msg_location (struct msg_locator *loc)
-{
- loc->file_name = 0;
- loc->line_number = -1;
-}
-