X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fmessage-dialog.c;h=af1886c98a7f619fdd5706259ebf21d4548dcb48;hb=3a61659a8fc11c51ad5af02b20f5613dcde50382;hp=cf1fb851c9af322a77b77b8b0d4dcda57c50cb1a;hpb=9f1d9ea8ac4f5e35a773581cf3d5ebd9e219bff8;p=pspp diff --git a/src/ui/gui/message-dialog.c b/src/ui/gui/message-dialog.c index cf1fb851c9..af1886c98a 100644 --- a/src/ui/gui/message-dialog.c +++ b/src/ui/gui/message-dialog.c @@ -24,6 +24,10 @@ #include #include +#include +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + #include #include "message-dialog.h" #include "progname.h" @@ -31,23 +35,80 @@ #include #include +#include #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; + + +static void +msg_location (struct msg_locator *loc) +{ + loc->file_name = NULL; + loc->line_number = -1; +} + void message_dialog_init (void) { - msg_init(handle_msg); + message_queue = g_queue_new(); + msg_init (enqueue_msg, msg_location); +} + + +void +message_dialog_done (void) +{ + 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; @@ -103,13 +164,3 @@ handle_msg(const struct msg *m) 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; -} -