From 5d581b0d08fdebbefd65541f6f843f56d94db21a Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 6 Feb 2014 12:32:00 +0100 Subject: [PATCH] tui: handle Esc correctly from toplevel windows The main "connect" and "edit" windows set the "escape-exits" flag, but that just closed the form without exiting the app, leaving the user trapped. Fix this by emitting a signal when the form quits, and catching that. (And now we don't need to watch the "clicked" signal on the quit buttons, since they have the "exit-on-activate" flag set.) --- tui/newt/nmt-newt-form.c | 28 +++++++++++++++++++++++++++- tui/newt/nmt-newt-form.h | 4 ++++ tui/nmtui-connect.c | 6 +++--- tui/nmtui-edit.c | 6 +++--- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/tui/newt/nmt-newt-form.c b/tui/newt/nmt-newt-form.c index 20caecc455..19edef7d98 100644 --- a/tui/newt/nmt-newt-form.c +++ b/tui/newt/nmt-newt-form.c @@ -72,6 +72,14 @@ enum { LAST_PROP }; +enum { + QUIT, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + static void nmt_newt_form_redraw (NmtNewtForm *form); /** @@ -400,7 +408,6 @@ nmt_newt_form_quit (NmtNewtForm *form) nmt_newt_form_destroy (form); form_stack = g_slist_remove (form_stack, form); - g_object_unref (form); if (form_stack) nmt_newt_form_iterate (form_stack->data); @@ -408,6 +415,9 @@ nmt_newt_form_quit (NmtNewtForm *form) g_source_destroy (keypress_source); g_clear_pointer (&keypress_source, g_source_unref); } + + g_signal_emit (form, signals[QUIT], 0); + g_object_unref (form); } /** @@ -556,6 +566,22 @@ nmt_newt_form_class_init (NmtNewtFormClass *form_class) form_class->show = nmt_newt_form_real_show; + /* signals */ + + /** + * NmtNewtForm::quit: + * @form: the #NmtNewtForm + * + * Emitted when the form quits. + */ + signals[QUIT] = + g_signal_new ("quit", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NmtNewtFormClass, quit), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + /** * NmtNewtForm:title: * diff --git a/tui/newt/nmt-newt-form.h b/tui/newt/nmt-newt-form.h index e320d8723c..be95eb68ad 100644 --- a/tui/newt/nmt-newt-form.h +++ b/tui/newt/nmt-newt-form.h @@ -38,6 +38,10 @@ struct _NmtNewtForm { typedef struct { NmtNewtContainerClass parent; + /* signals */ + void (*quit) (NmtNewtForm *form); + + /* methods */ void (*show) (NmtNewtForm *form); } NmtNewtFormClass; diff --git a/tui/nmtui-connect.c b/tui/nmtui-connect.c index 9f17e64797..b889815978 100644 --- a/tui/nmtui-connect.c +++ b/tui/nmtui-connect.c @@ -237,8 +237,8 @@ listbox_active_changed (GObject *object, } static void -quit_clicked (NmtNewtButton *button, - gpointer user_data) +form_quit (NmtNewtForm *form, + gpointer user_data) { nmtui_quit (); } @@ -257,6 +257,7 @@ nmt_connect_connection_list (void) "height", screen_height - 4, "escape-exits", TRUE, NULL); + g_signal_connect (form, "quit", G_CALLBACK (form_quit), NULL); grid = nmt_newt_grid_new (); @@ -278,7 +279,6 @@ nmt_connect_connection_list (void) quit = nmt_newt_button_box_add_end (NMT_NEWT_BUTTON_BOX (bbox), _("Quit")); nmt_newt_widget_set_exit_on_activate (quit, TRUE); - g_signal_connect (quit, "clicked", G_CALLBACK (quit_clicked), NULL); nmt_newt_form_set_content (form, grid); nmt_newt_form_show (form); diff --git a/tui/nmtui-edit.c b/tui/nmtui-edit.c index c687a5c09b..34e51a684c 100644 --- a/tui/nmtui-edit.c +++ b/tui/nmtui-edit.c @@ -78,8 +78,8 @@ edit_connection_list_filter (NmtEditConnectionList *list, } static void -quit_clicked (NmtNewtButton *button, - gpointer user_data) +form_quit (NmtNewtForm *form, + gpointer user_data) { nmtui_quit (); } @@ -98,10 +98,10 @@ nmt_edit_main_connection_list (void) "height", screen_height - 4, "escape-exits", TRUE, NULL); + g_signal_connect (form, "quit", G_CALLBACK (form_quit), NULL); quit = nmt_newt_button_new (_("Quit")); nmt_newt_widget_set_exit_on_activate (quit, TRUE); - g_signal_connect (quit, "clicked", G_CALLBACK (quit_clicked), NULL); list = g_object_new (NMT_TYPE_EDIT_CONNECTION_LIST, "extra-widget", quit,