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;
g_return_if_fail (ttw);
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(ttw->dialog));
gtk_widget_destroy (ttw->dialog);
}
@ -750,9 +751,19 @@ void
tax_table_window_close (GtkWidget *widget, gpointer data)
{
TaxTableWindow *ttw = data;
gnc_close_gui_component (ttw->component_id);
}
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(ttw->dialog));
gnc_ui_tax_table_window_destroy (ttw);
static gboolean
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
@ -764,13 +775,33 @@ tax_table_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_unregister_gui_component (ttw->component_id);
if (ttw->dialog)
{
gtk_widget_destroy (ttw->dialog);
ttw->dialog = NULL;
}
g_free (ttw);
}
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;
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");
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 */
view = GTK_TREE_VIEW(ttw->names_view);
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;
}
/* 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 */
GncTaxTable *
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)
{
BillTermsWindow *btw = data;
gnc_ui_billterms_window_destroy (btw);
gnc_close_gui_component (btw->component_id);
}
void
@ -731,13 +730,33 @@ billterms_window_destroy_cb (GtkWidget *widget, gpointer data)
gnc_unregister_gui_component (btw->component_id);
if (btw->window)
{
gtk_widget_destroy (btw->window);
btw->window = NULL;
}
g_free (btw);
}
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;
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");
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 */
view = GTK_TREE_VIEW(btw->terms_view);
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;
}
/* Destroy a billterms window */
void
gnc_ui_billterms_window_destroy (BillTermsWindow *btw)
{
if (!btw)
return;
gnc_close_gui_component (btw->component_id);
}
#if 0
/* Create a new billterms by name */
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_close_clicked (GtkWidget *widget, gpointer data);
void gnc_commodities_show_currencies_toggled (GtkToggleButton *toggle, CommoditiesDialog *cd);
gboolean gnc_commodities_window_key_press_cb (GtkWidget *widget,
GdkEventKey *event,
gpointer data);
void
@ -79,12 +82,24 @@ gnc_commodities_window_destroy_cb (GtkWidget *object, CommoditiesDialog *cd)
if (cd->window)
{
gtk_widget_destroy(cd->window);
gtk_widget_destroy (cd->window);
cd->window = NULL;
}
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
gnc_commodities_dialog_edit_clicked (GtkWidget *widget, gpointer data)
{
@ -247,6 +262,7 @@ void
gnc_commodities_dialog_close_clicked (GtkWidget *widget, gpointer data)
{
CommoditiesDialog *cd = data;
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_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);
g_object_unref (G_OBJECT(builder));
@ -401,6 +423,21 @@ show_handler (const char *klass, gint component_id,
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 *
* 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 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
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),
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_CALLBACK (gnc_doclink_dialog_window_key_press_cb),
doclink_dialog);
@ -996,8 +1015,6 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
g_signal_connect (doclink_dialog->view, "row-activated",
G_CALLBACK (row_selected_trans_cb),
(gpointer)doclink_dialog);
gnc_restore_window_size (GNC_PREFS_GROUP_TRANS,
GTK_WINDOW (doclink_dialog->window), parent);
get_trans_info (doclink_dialog);
}
else
@ -1019,8 +1036,6 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
g_signal_connect (doclink_dialog->view, "row-activated",
G_CALLBACK (row_selected_bus_cb),
(gpointer)doclink_dialog);
gnc_restore_window_size (GNC_PREFS_GROUP_BUS,
GTK_WINDOW (doclink_dialog->window), parent);
get_bus_info (doclink_dialog);
}
@ -1029,8 +1044,6 @@ gnc_doclink_dialog_create (GtkWindow *parent, DoclinkDialog *doclink_dialog)
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_columns_autosize (GTK_TREE_VIEW(doclink_dialog->view));
LEAVE(" ");
@ -1108,6 +1121,9 @@ gnc_doclink_business_dialog (GtkWindow *parent)
gnc_gui_component_set_session (doclink_dialog->component_id,
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(" ");
}
@ -1136,5 +1152,8 @@ gnc_doclink_trans_dialog (GtkWindow *parent)
gnc_gui_component_set_session (doclink_dialog->component_id,
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(" ");
}

View File

@ -59,13 +59,16 @@
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_edit_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_add_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
@ -88,7 +91,7 @@ typedef struct
void
gnc_prices_dialog_window_destroy_cb (GtkWidget *object, gpointer data)
gnc_prices_dialog_destroy_cb (GtkWidget *object, gpointer data)
{
PricesDialog *pdb_dialog = data;
@ -97,7 +100,7 @@ gnc_prices_dialog_window_destroy_cb (GtkWidget *object, gpointer data)
if (pdb_dialog->window)
{
gtk_widget_destroy(pdb_dialog->window);
gtk_widget_destroy (pdb_dialog->window);
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
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->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 */
scrolled_window = GTK_WIDGET(gtk_builder_get_object (builder, "price_list_window"));
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_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);
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 *
* opens up a window showing all price information *