X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fmessage-dialog.c;h=7513295323988677b38c26807cff73b96d10b04a;hb=b5c82cc9aabe7e641011130240ae1b2e84348e23;hp=525fca40e22894b6ff70823efa359cf56499d153;hpb=e598cda225c4f98025ec43b72eb1a9dd691b77cd;p=pspp-builds.git diff --git a/src/ui/gui/message-dialog.c b/src/ui/gui/message-dialog.c index 525fca40..75132953 100644 --- a/src/ui/gui/message-dialog.c +++ b/src/ui/gui/message-dialog.c @@ -24,13 +24,13 @@ #define N_(msgid) msgid #include +#include #include #include "message-dialog.h" #include "progname.h" #include -#include #include #include "helper.h" @@ -48,8 +48,8 @@ static GQueue *late_queue; static int error_cnt, warning_cnt, note_cnt; -static GladeXML *message_xml; -static GtkDialog *message_dialog; +static GtkBuilder *message_xml; +static GtkWidget *message_dialog; void message_dialog_init (struct source_stream *ss) @@ -59,9 +59,12 @@ message_dialog_init (struct source_stream *ss) late_queue = g_queue_new (); error_cnt = warning_cnt = note_cnt = 0; msg_init (ss, enqueue_msg); - message_xml = XML_NEW ("message-dialog.glade"); - message_dialog = GTK_DIALOG (get_widget_assert (message_xml, - "message-dialog")); + message_xml = builder_new ("message-dialog.ui"); + message_dialog = get_widget_assert (message_xml, "message-dialog"); + + GTK_WIDGET_SET_FLAGS (get_widget_assert (message_xml, "close-button"), + GTK_CAN_DEFAULT); + } void @@ -71,7 +74,7 @@ message_dialog_done (void) g_queue_free (early_queue); dropped_messages = 0; g_queue_free (late_queue); - gtk_widget_destroy (GTK_WIDGET (message_dialog)); + gtk_widget_destroy (message_dialog); g_object_unref (message_xml); } @@ -182,26 +185,37 @@ enqueue_msg (const struct msg *msg) } } -gboolean +static gboolean popup_messages (gpointer unused UNUSED) { GtkTextBuffer *text_buffer; GtkTextIter end; GtkTextView *text_view; GtkLabel *label; - struct string lead, msg; + struct string lead = DS_EMPTY_INITIALIZER; + struct string msg = DS_EMPTY_INITIALIZER; int message_cnt; + gdk_threads_enter (); + + /* Set up the dialog. */ + if (message_xml == NULL || message_dialog == NULL) + goto use_fallback; + /* 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; + if ( gdk_display_pointer_is_grabbed (gtk_widget_get_display (message_dialog))) + { + ds_destroy (&lead); + ds_destroy (&msg); + gdk_threads_leave (); + return TRUE; + } /* Compose the lead-in. */ message_cnt = error_cnt + warning_cnt + note_cnt; - ds_init_empty (&lead); if (dropped_messages == 0) ds_put_format ( &lead, @@ -227,7 +241,6 @@ popup_messages (gpointer unused UNUSED) /* Compose the messages. */ - ds_init_empty (&msg); while (!g_queue_is_empty (early_queue)) format_message (g_queue_pop_head (early_queue), &msg); if (dropped_messages) @@ -239,14 +252,9 @@ popup_messages (gpointer unused UNUSED) while (!g_queue_is_empty (late_queue)) format_message (g_queue_pop_head (late_queue), &msg); - /* Set up the dialog. */ - if (message_xml == NULL || message_dialog == NULL) - goto use_fallback; - 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)); - ds_destroy (&msg); label = GTK_LABEL (get_widget_assert (message_xml, "lead-in")); if (label == NULL) @@ -258,9 +266,15 @@ popup_messages (gpointer unused UNUSED) goto use_fallback; gtk_text_view_set_buffer (text_view, text_buffer); - gtk_dialog_run (message_dialog); - gtk_widget_hide (GTK_WIDGET (message_dialog)); + gtk_widget_grab_default (get_widget_assert (message_xml, "close-button")); + gtk_widget_grab_focus (get_widget_assert (message_xml, "close-button")); + gtk_dialog_run ( GTK_DIALOG (message_dialog)); + gtk_widget_hide (message_dialog); + + ds_destroy (&lead); + ds_destroy (&msg); + gdk_threads_leave (); return FALSE; use_fallback: @@ -269,6 +283,7 @@ use_fallback: fputs (ds_cstr (&msg), stderr); ds_destroy (&lead); ds_destroy (&msg); + gdk_threads_leave (); return FALSE; }