X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fmessage-dialog.c;h=af1886c98a7f619fdd5706259ebf21d4548dcb48;hb=4fb6f8878aa476e411f7d490a514e0892d3e51e2;hp=693db49f70f2a9ddd1dcfd281b8d6a8820a0f5bd;hpb=3f2ed1c5fe6dc692ca00bb18a15e41617fa2d37d;p=pspp diff --git a/src/ui/gui/message-dialog.c b/src/ui/gui/message-dialog.c index 693db49f70..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,62 +35,114 @@ #include #include +#include #include "helper.h" extern GladeXML *xml; -#define _(A) A + + +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) +{ + 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 +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 -vmsg(int klass, const char *fmt, va_list args) +popup_message(const struct msg *m) { - gchar *msg = 0; - gchar *text = g_strdup_vprintf (fmt, args); + GtkWindow *parent; + GtkWidget *dialog; - GtkWindow *parent ; - GtkWidget *dialog ; - gint message_type; + const char *msg; - switch (klass) + switch (m->severity) { - case SE: - case DE: - case ME: + case MSG_ERROR: message_type = GTK_MESSAGE_ERROR; break; - case SW: - case DW: - case MW: + case MSG_WARNING: message_type = GTK_MESSAGE_WARNING; break; - case SM: - case MM: + case MSG_NOTE: default: message_type = GTK_MESSAGE_INFO; break; }; - switch (klass) + switch (m->category) { - case SE: - case SW: - case SM: - msg = g_strdup(_("Script Error")); + case MSG_SYNTAX: + msg = _("Script Error"); break; - case DE: - case DW: - msg = g_strdup(_("Data File Error")); + case MSG_DATA: + msg = _("Data File Error"); break; - case ME: - case MW: - case MM: + case MSG_GENERAL: default: - msg = g_strdup(_("PSPP Error")); + msg = _("PSPP Error"); break; }; @@ -98,58 +154,13 @@ vmsg(int klass, const char *fmt, va_list args) GTK_BUTTONS_CLOSE, msg); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), text); - - g_free(text); - g_free(msg); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + "%s", m->text); gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); - -} - - -void -msg(int klass, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vmsg(klass, fmt, ap); - va_end(ap); -} - - -void -err_vmsg (const struct error *e, const char *format, va_list args) -{ - vmsg(e->class, format, args); -} - - -void -err_assert_fail(const char *expr, const char *file, int line) -{ - msg(ME, "Assertion failed: %s:%d; (%s)\n",file,line,expr); -} - -/* Writes MESSAGE formatted with printf, to stderr, if the - verbosity level is at least LEVEL. */ -void -verbose_msg (int level, const char *format, ...) -{ - /* Do nothing for now. */ -} - -/* FIXME: This is a stub . - * A temporary workaround until getl.c is rearranged - */ -void -err_location (struct file_locator *f) -{ - f->file_name = 0; - f->line_number = -1; }