Some dialogs do not close with Escape key

These dialogs are based on GtkWindow and as such do not natively
respond to the escape key being pressed so to fix this a call back has
been added for 'key_press_event' which checks for the escape key.
This commit is contained in:
Robert Fewell 2020-10-11 11:22:39 +01:00
parent 05c96f6642
commit 8e220976be
5 changed files with 172 additions and 39 deletions

View File

@ -743,6 +743,7 @@ tax_table_window_close_handler (gpointer data)
TaxTableWindow *ttw = data; TaxTableWindow *ttw = data;
g_return_if_fail (ttw); g_return_if_fail (ttw);
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(ttw->dialog));
gtk_widget_destroy (ttw->dialog); gtk_widget_destroy (ttw->dialog);
} }
@ -750,9 +751,19 @@ void
tax_table_window_close (GtkWidget *widget, gpointer data) tax_table_window_close (GtkWidget *widget, gpointer data)
{ {
TaxTableWindow *ttw = data; TaxTableWindow *ttw = data;
gnc_close_gui_component (ttw->component_id);
}
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(ttw->dialog)); static gboolean
gnc_ui_tax_table_window_destroy (ttw); tax_table_window_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
TaxTableWindow *ttw = user_data;
// this cb allows the window size to be saved on closing with the X
gnc_save_window_size (GNC_PREFS_GROUP,
GTK_WINDOW(ttw->dialog));
return FALSE;
} }
void void
@ -764,13 +775,33 @@ tax_table_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_unregister_gui_component (ttw->component_id); gnc_unregister_gui_component (ttw->component_id);
if (ttw->dialog)
{
gtk_widget_destroy (ttw->dialog);
ttw->dialog = NULL;
}
g_free (ttw); g_free (ttw);
} }
static gboolean static gboolean
find_handler (gpointer find_data, gpointer user_data) tax_table_window_key_press_cb (GtkWidget *widget, GdkEventKey *event,
gpointer data)
{ {
TaxTableWindow *ttw = user_data; TaxTableWindow *ttw = data;
if (event->keyval == GDK_KEY_Escape)
{
tax_table_window_close_handler (ttw);
return TRUE;
}
else
return FALSE;
}
static gboolean
find_handler (gpointer find_data, gpointer data)
{
TaxTableWindow *ttw = data;
QofBook *book = find_data; QofBook *book = find_data;
return (ttw != NULL && ttw->book == book); return (ttw != NULL && ttw->book == book);
@ -819,6 +850,12 @@ gnc_ui_tax_table_window_new (GtkWindow *parent, QofBook *book)
gtk_widget_set_name (GTK_WIDGET(ttw->dialog), "gnc-id-new-tax-table"); gtk_widget_set_name (GTK_WIDGET(ttw->dialog), "gnc-id-new-tax-table");
gnc_widget_style_context_add_class (GTK_WIDGET(ttw->dialog), "gnc-class-taxes"); gnc_widget_style_context_add_class (GTK_WIDGET(ttw->dialog), "gnc-class-taxes");
g_signal_connect (ttw->dialog, "delete-event",
G_CALLBACK(tax_table_window_delete_event_cb), ttw);
g_signal_connect (ttw->dialog, "key_press_event",
G_CALLBACK (tax_table_window_key_press_cb), ttw);
/* Create the tax tables view */ /* Create the tax tables view */
view = GTK_TREE_VIEW(ttw->names_view); view = GTK_TREE_VIEW(ttw->names_view);
store = gtk_list_store_new (NUM_TAX_TABLE_COLS, G_TYPE_STRING, store = gtk_list_store_new (NUM_TAX_TABLE_COLS, G_TYPE_STRING,
@ -890,16 +927,6 @@ gnc_ui_tax_table_window_new (GtkWindow *parent, QofBook *book)
return ttw; return ttw;
} }
/* Destroy a tax-table window */
void
gnc_ui_tax_table_window_destroy (TaxTableWindow *ttw)
{
if (!ttw)
return;
gnc_close_gui_component (ttw->component_id);
}
/* Create a new tax-table by name */ /* Create a new tax-table by name */
GncTaxTable * GncTaxTable *
gnc_ui_tax_table_new_from_name (GtkWindow *parent, QofBook *book, const char *name) gnc_ui_tax_table_new_from_name (GtkWindow *parent, QofBook *book, const char *name)

View File

@ -718,8 +718,7 @@ void
billterms_window_close (GtkWidget *widget, gpointer data) billterms_window_close (GtkWidget *widget, gpointer data)
{ {
BillTermsWindow *btw = data; BillTermsWindow *btw = data;
gnc_close_gui_component (btw->component_id);
gnc_ui_billterms_window_destroy (btw);
} }
void void
@ -731,13 +730,33 @@ billterms_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_unregister_gui_component (btw->component_id); gnc_unregister_gui_component (btw->component_id);
if (btw->window)
{
gtk_widget_destroy (btw->window);
btw->window = NULL;
}
g_free (btw); g_free (btw);
} }
static gboolean static gboolean
find_handler (gpointer find_data, gpointer user_data) billterms_window_key_press_cb (GtkWidget *widget, GdkEventKey *event,
gpointer data)
{ {
BillTermsWindow *btw = user_data; BillTermsWindow *btw = data;
if (event->keyval == GDK_KEY_Escape)
{
billterms_window_close_handler (btw);
return TRUE;
}
else
return FALSE;
}
static gboolean
find_handler (gpointer find_data, gpointer data)
{
BillTermsWindow *btw = data;
QofBook *book = find_data; QofBook *book = find_data;
return (btw != NULL && btw->book == book); return (btw != NULL && btw->book == book);
@ -789,6 +808,9 @@ gnc_ui_billterms_window_new (GtkWindow *parent, QofBook *book)
gtk_widget_set_name (GTK_WIDGET(btw->window), "gnc-id-bill-terms"); gtk_widget_set_name (GTK_WIDGET(btw->window), "gnc-id-bill-terms");
gnc_widget_style_context_add_class (GTK_WIDGET(btw->window), "gnc-class-bill-terms"); gnc_widget_style_context_add_class (GTK_WIDGET(btw->window), "gnc-class-bill-terms");
g_signal_connect (btw->window, "key_press_event",
G_CALLBACK (billterms_window_key_press_cb), btw);
/* Initialize the view */ /* Initialize the view */
view = GTK_TREE_VIEW(btw->terms_view); view = GTK_TREE_VIEW(btw->terms_view);
store = gtk_list_store_new (NUM_BILL_TERM_COLS, G_TYPE_STRING, G_TYPE_POINTER); store = gtk_list_store_new (NUM_BILL_TERM_COLS, G_TYPE_STRING, G_TYPE_POINTER);
@ -836,16 +858,6 @@ gnc_ui_billterms_window_new (GtkWindow *parent, QofBook *book)
return btw; return btw;
} }
/* Destroy a billterms window */
void
gnc_ui_billterms_window_destroy (BillTermsWindow *btw)
{
if (!btw)
return;
gnc_close_gui_component (btw->component_id);
}
#if 0 #if 0
/* Create a new billterms by name */ /* Create a new billterms by name */
GncBillTerm * GncBillTerm *

View File

@ -70,6 +70,9 @@ void gnc_commodities_dialog_edit_clicked (GtkWidget *widget, gpointer data);
void gnc_commodities_dialog_remove_clicked (GtkWidget *widget, gpointer data); void gnc_commodities_dialog_remove_clicked (GtkWidget *widget, gpointer data);
void gnc_commodities_dialog_close_clicked (GtkWidget *widget, gpointer data); void gnc_commodities_dialog_close_clicked (GtkWidget *widget, gpointer data);
void gnc_commodities_show_currencies_toggled (GtkToggleButton *toggle, CommoditiesDialog *cd); void gnc_commodities_show_currencies_toggled (GtkToggleButton *toggle, CommoditiesDialog *cd);
gboolean gnc_commodities_window_key_press_cb (GtkWidget *widget,
GdkEventKey *event,
gpointer data);
void void
@ -79,12 +82,24 @@ gnc_commodities_window_destroy_cb (GtkWidget *object, CommoditiesDialog *cd)
if (cd->window) if (cd->window)
{ {
gtk_widget_destroy(cd->window); gtk_widget_destroy (cd->window);
cd->window = NULL; cd->window = NULL;
} }
g_free (cd); g_free (cd);
} }
static gboolean
gnc_commodities_window_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer data)
{
CommoditiesDialog *cd = data;
// this cb allows the window size to be saved on closing with the X
gnc_save_window_size (GNC_PREFS_GROUP,
GTK_WINDOW(cd->window));
return FALSE;
}
void void
gnc_commodities_dialog_edit_clicked (GtkWidget *widget, gpointer data) gnc_commodities_dialog_edit_clicked (GtkWidget *widget, gpointer data)
{ {
@ -247,6 +262,7 @@ void
gnc_commodities_dialog_close_clicked (GtkWidget *widget, gpointer data) gnc_commodities_dialog_close_clicked (GtkWidget *widget, gpointer data)
{ {
CommoditiesDialog *cd = data; CommoditiesDialog *cd = data;
gnc_close_gui_component_by_data (DIALOG_COMMODITIES_CM_CLASS, cd); gnc_close_gui_component_by_data (DIALOG_COMMODITIES_CM_CLASS, cd);
} }
@ -361,6 +377,12 @@ gnc_commodities_dialog_create (GtkWidget * parent, CommoditiesDialog *cd)
g_signal_connect (cd->window, "destroy", g_signal_connect (cd->window, "destroy",
G_CALLBACK(gnc_commodities_window_destroy_cb), cd); G_CALLBACK(gnc_commodities_window_destroy_cb), cd);
g_signal_connect (cd->window, "delete-event",
G_CALLBACK(gnc_commodities_window_delete_event_cb), cd);
g_signal_connect (cd->window, "key_press_event",
G_CALLBACK (gnc_commodities_window_key_press_cb), cd);
gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, cd); gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, cd);
g_object_unref (G_OBJECT(builder)); g_object_unref (G_OBJECT(builder));
@ -401,6 +423,21 @@ show_handler (const char *klass, gint component_id,
return(TRUE); return(TRUE);
} }
gboolean
gnc_commodities_window_key_press_cb (GtkWidget *widget, GdkEventKey *event,
gpointer data)
{
CommoditiesDialog *cd = data;
if (event->keyval == GDK_KEY_Escape)
{
close_handler (cd);
return TRUE;
}
else
return FALSE;
}
/********************************************************************\ /********************************************************************\
* gnc_commodities_dialog * * gnc_commodities_dialog *
* opens up a window to edit price information * * opens up a window to edit price information *

View File

@ -378,6 +378,22 @@ gnc_doclink_get_uri_dialog (GtkWindow *parent, const gchar *title,
static void close_handler (gpointer user_data); static void close_handler (gpointer user_data);
static gboolean
gnc_doclink_dialog_window_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
DoclinkDialog *doclink_dialog = user_data;
// this cb allows the window size to be saved on closing with the X
if (doclink_dialog->is_list_trans)
gnc_save_window_size (GNC_PREFS_GROUP_TRANS,
GTK_WINDOW(doclink_dialog->window));
else
gnc_save_window_size (GNC_PREFS_GROUP_BUS,
GTK_WINDOW(doclink_dialog->window));
return FALSE;
}
static void static void
gnc_doclink_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data) gnc_doclink_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data)
{ {
@ -976,6 +992,9 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
G_CALLBACK (gnc_doclink_dialog_window_destroy_cb), G_CALLBACK (gnc_doclink_dialog_window_destroy_cb),
doclink_dialog); doclink_dialog);
g_signal_connect (doclink_dialog->window, "delete-event",
G_CALLBACK(gnc_doclink_dialog_window_delete_event_cb), doclink_dialog);
g_signal_connect (doclink_dialog->window, "key_press_event", g_signal_connect (doclink_dialog->window, "key_press_event",
G_CALLBACK (gnc_doclink_dialog_window_key_press_cb), G_CALLBACK (gnc_doclink_dialog_window_key_press_cb),
doclink_dialog); doclink_dialog);
@ -996,8 +1015,6 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
g_signal_connect (doclink_dialog->view, "row-activated", g_signal_connect (doclink_dialog->view, "row-activated",
G_CALLBACK (row_selected_trans_cb), G_CALLBACK (row_selected_trans_cb),
(gpointer)doclink_dialog); (gpointer)doclink_dialog);
gnc_restore_window_size (GNC_PREFS_GROUP_TRANS,
GTK_WINDOW (doclink_dialog->window), parent);
get_trans_info (doclink_dialog); get_trans_info (doclink_dialog);
} }
else else
@ -1019,8 +1036,6 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
g_signal_connect (doclink_dialog->view, "row-activated", g_signal_connect (doclink_dialog->view, "row-activated",
G_CALLBACK (row_selected_bus_cb), G_CALLBACK (row_selected_bus_cb),
(gpointer)doclink_dialog); (gpointer)doclink_dialog);
gnc_restore_window_size (GNC_PREFS_GROUP_BUS,
GTK_WINDOW (doclink_dialog->window), parent);
get_bus_info (doclink_dialog); get_bus_info (doclink_dialog);
} }
@ -1029,8 +1044,6 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
g_object_unref (G_OBJECT(builder)); g_object_unref (G_OBJECT(builder));
gtk_widget_show_all (GTK_WIDGET(window));
gtk_tree_view_column_set_expand (expanding_column, TRUE); gtk_tree_view_column_set_expand (expanding_column, TRUE);
gtk_tree_view_columns_autosize (GTK_TREE_VIEW(doclink_dialog->view)); gtk_tree_view_columns_autosize (GTK_TREE_VIEW(doclink_dialog->view));
LEAVE(" "); LEAVE(" ");
@ -1108,6 +1121,9 @@ gnc_doclink_business_dialog (GtkWindow *parent)
gnc_gui_component_set_session (doclink_dialog->component_id, gnc_gui_component_set_session (doclink_dialog->component_id,
doclink_dialog->session); doclink_dialog->session);
gnc_restore_window_size (GNC_PREFS_GROUP_BUS,
GTK_WINDOW(doclink_dialog->window), parent);
gtk_widget_show_all (GTK_WIDGET(doclink_dialog->window));
LEAVE(" "); LEAVE(" ");
} }
@ -1136,5 +1152,8 @@ gnc_doclink_trans_dialog (GtkWindow *parent)
gnc_gui_component_set_session (doclink_dialog->component_id, gnc_gui_component_set_session (doclink_dialog->component_id,
doclink_dialog->session); doclink_dialog->session);
gnc_restore_window_size (GNC_PREFS_GROUP_TRANS,
GTK_WINDOW(doclink_dialog->window), parent);
gtk_widget_show_all (GTK_WIDGET(doclink_dialog->window));
LEAVE(" "); LEAVE(" ");
} }

View File

@ -59,13 +59,16 @@
static QofLogModule log_module = GNC_MOD_GUI; static QofLogModule log_module = GNC_MOD_GUI;
void gnc_prices_dialog_window_destroy_cb (GtkWidget *object, gpointer data); void gnc_prices_dialog_destroy_cb (GtkWidget *object, gpointer data);
void gnc_prices_dialog_close_cb (GtkDialog *dialog, gpointer data); void gnc_prices_dialog_close_cb (GtkDialog *dialog, gpointer data);
void gnc_prices_dialog_edit_clicked (GtkWidget *widget, gpointer data); void gnc_prices_dialog_edit_clicked (GtkWidget *widget, gpointer data);
void gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data); void gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data);
void gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data); void gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data);
void gnc_prices_dialog_add_clicked (GtkWidget *widget, gpointer data); void gnc_prices_dialog_add_clicked (GtkWidget *widget, gpointer data);
void gnc_prices_dialog_get_quotes_clicked (GtkWidget *widget, gpointer data); void gnc_prices_dialog_get_quotes_clicked (GtkWidget *widget, gpointer data);
static gboolean gnc_prices_dialog_key_press_cb (GtkWidget *widget,
GdkEventKey *event,
gpointer data);
typedef struct typedef struct
@ -88,7 +91,7 @@ typedef struct
void void
gnc_prices_dialog_window_destroy_cb (GtkWidget *object, gpointer data) gnc_prices_dialog_destroy_cb (GtkWidget *object, gpointer data)
{ {
PricesDialog *pdb_dialog = data; PricesDialog *pdb_dialog = data;
@ -97,7 +100,7 @@ gnc_prices_dialog_window_destroy_cb (GtkWidget *object, gpointer data)
if (pdb_dialog->window) if (pdb_dialog->window)
{ {
gtk_widget_destroy(pdb_dialog->window); gtk_widget_destroy (pdb_dialog->window);
pdb_dialog->window = NULL; pdb_dialog->window = NULL;
} }
@ -106,6 +109,19 @@ gnc_prices_dialog_window_destroy_cb (GtkWidget *object, gpointer data)
} }
static gboolean
gnc_prices_dialog_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer data)
{
PricesDialog *pdb_dialog = data;
// this cb allows the window size to be saved on closing with the X
gnc_save_window_size (GNC_PREFS_GROUP,
GTK_WINDOW(pdb_dialog->window));
return FALSE;
}
void void
gnc_prices_dialog_close_cb (GtkDialog *dialog, gpointer data) gnc_prices_dialog_close_cb (GtkDialog *dialog, gpointer data)
{ {
@ -713,6 +729,12 @@ gnc_prices_dialog_create (GtkWidget * parent, PricesDialog *pdb_dialog)
pdb_dialog->book = qof_session_get_book(pdb_dialog->session); pdb_dialog->book = qof_session_get_book(pdb_dialog->session);
pdb_dialog->price_db = gnc_pricedb_get_db(pdb_dialog->book); pdb_dialog->price_db = gnc_pricedb_get_db(pdb_dialog->book);
g_signal_connect (pdb_dialog->window, "delete-event",
G_CALLBACK(gnc_prices_dialog_delete_event_cb), pdb_dialog);
g_signal_connect (pdb_dialog->window, "key_press_event",
G_CALLBACK (gnc_prices_dialog_key_press_cb), pdb_dialog);
/* price tree */ /* price tree */
scrolled_window = GTK_WIDGET(gtk_builder_get_object (builder, "price_list_window")); scrolled_window = GTK_WIDGET(gtk_builder_get_object (builder, "price_list_window"));
view = gnc_tree_view_price_new(pdb_dialog->book, view = gnc_tree_view_price_new(pdb_dialog->book,
@ -761,7 +783,7 @@ gnc_prices_dialog_create (GtkWidget * parent, PricesDialog *pdb_dialog)
} }
g_signal_connect (pdb_dialog->window, "destroy", g_signal_connect (pdb_dialog->window, "destroy",
G_CALLBACK(gnc_prices_dialog_window_destroy_cb), pdb_dialog); G_CALLBACK(gnc_prices_dialog_destroy_cb), pdb_dialog);
gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pdb_dialog); gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pdb_dialog);
g_object_unref(G_OBJECT(builder)); g_object_unref(G_OBJECT(builder));
@ -811,6 +833,22 @@ show_handler (const char *klass, gint component_id,
} }
gboolean
gnc_prices_dialog_key_press_cb (GtkWidget *widget, GdkEventKey *event,
gpointer data)
{
PricesDialog *pdb_dialog = data;
if (event->keyval == GDK_KEY_Escape)
{
close_handler (pdb_dialog);
return TRUE;
}
else
return FALSE;
}
/********************************************************************\ /********************************************************************\
* gnc_prices_dialog * * gnc_prices_dialog *
* opens up a window showing all price information * * opens up a window showing all price information *