diff --git a/src/Makefile.am b/src/Makefile.am index 153ed67..f56fb33 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -199,15 +199,8 @@ gpk_service_pack_LDADD = \ $(NULL)  gpk_prefs_SOURCES = \ - egg-debug.c \ - egg-debug.h \ - egg-unique.c \ - egg-unique.h \ gpk-prefs.c \ - gpk-gnome.c \ - gpk-gnome.h \ - gpk-enum.c \ - gpk-enum.h \ + $(shared_SOURCES) \ $(NULL)  gpk_prefs_LDADD = \ @@ -244,9 +237,8 @@ gpk_log_LDADD = \ $(NULL)  gpk_backend_status_SOURCES = \ - egg-debug.c \ - egg-debug.h \ gpk-backend-status.c \ + $(shared_SOURCES) \ $(NULL)  gpk_backend_status_LDADD = \ diff --git a/src/gpk-backend-status.c b/src/gpk-backend-status.c index 2dc58eb..3713b47 100644 --- a/src/gpk-backend-status.c +++ b/src/gpk-backend-status.c @@ -35,6 +35,8 @@  #include "egg-debug.h"  +#include "gpk-common.h" + /** * pk_updates_close_cb: **/ @@ -127,6 +129,7 @@ main (int argc, char *argv[]) glade_xml = glade_xml_new (GPK_DATA "/gpk-backend-status.glade", NULL, NULL);  widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect (widget, "clicked", G_CALLBACK (pk_updates_close_cb), loop);  diff --git a/src/gpk-client-chooser.c b/src/gpk-client-chooser.c index 9a67691..b1320fc 100644 --- a/src/gpk-client-chooser.c +++ b/src/gpk-client-chooser.c @@ -204,6 +204,7 @@ gpk_client_chooser_show (GtkWindow *window, PkPackageList *list, const gchar *ti widget = glade_xml_get_widget (glade_xml, "button_help"); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_chooser_button_help_cb), NULL); widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_chooser_button_close_cb), NULL);  /* set icon name */ diff --git a/src/gpk-client-dialog.c b/src/gpk-client-dialog.c index 1dce319..96f3a85 100644 --- a/src/gpk-client-dialog.c +++ b/src/gpk-client-dialog.c @@ -757,6 +757,7 @@ gpk_client_dialog_init (GpkClientDialog *dialog) widget = glade_xml_get_widget (dialog->priv->glade_xml, "window_client"); g_signal_connect (widget, "delete_event", G_CALLBACK (gpk_client_dialog_window_delete_cb), dialog); widget = glade_xml_get_widget (dialog->priv->glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_dialog_button_close_cb), dialog); widget = glade_xml_get_widget (dialog->priv->glade_xml, "button_help"); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_dialog_button_help_cb), dialog); diff --git a/src/gpk-client-eula.c b/src/gpk-client-eula.c index 74f76d8..971e887 100644 --- a/src/gpk-client-eula.c +++ b/src/gpk-client-eula.c @@ -82,6 +82,7 @@ gpk_client_eula_show (GtkWindow *window, const gchar *eula_id, const gchar *pack widget = glade_xml_get_widget (glade_xml, "window_eula"); g_signal_connect_swapped (widget, "delete_event", G_CALLBACK (gtk_main_quit), NULL); widget = glade_xml_get_widget (glade_xml, "button_cancel"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL);  /* set icon name */ diff --git a/src/gpk-client-run.c b/src/gpk-client-run.c index 8ec7398..228671a 100644 --- a/src/gpk-client-run.c +++ b/src/gpk-client-run.c @@ -318,6 +318,7 @@ gpk_client_run_show (gchar **package_ids) widget = glade_xml_get_widget (glade_xml, "button_help"); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_run_button_help_cb), NULL); widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_run_button_close_cb), NULL); widget = glade_xml_get_widget (glade_xml, "button_action"); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_client_run_button_action_cb), NULL); diff --git a/src/gpk-client-signature.c b/src/gpk-client-signature.c index 3ec6a76..937dd15 100644 --- a/src/gpk-client-signature.c +++ b/src/gpk-client-signature.c @@ -76,6 +76,7 @@ gpk_client_signature_show (const gchar *package_id, const gchar *repository_name widget = glade_xml_get_widget (glade_xml, "window_gpg"); g_signal_connect_swapped (widget, "delete_event", G_CALLBACK (gtk_main_quit), NULL); widget = glade_xml_get_widget (glade_xml, "button_no"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL);  /* set icon name */ diff --git a/src/gpk-client-untrusted.c b/src/gpk-client-untrusted.c index af2d6f6..c75fb0c 100644 --- a/src/gpk-client-untrusted.c +++ b/src/gpk-client-untrusted.c @@ -77,6 +77,7 @@ gpk_client_untrusted_show (PkErrorCodeEnum code)  /* close button */ widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL);  /* title */ diff --git a/src/gpk-common.c b/src/gpk-common.c index d81c9e3..4c1bbca 100644 --- a/src/gpk-common.c +++ b/src/gpk-common.c @@ -31,6 +31,7 @@ #include  #include  #include  +#include   #include "egg-debug.h" #include "egg-string.h" @@ -41,6 +42,53 @@ #include "gpk-error.h"  /** + * gpk_button_activate_on_escape: + **/ +void +gpk_button_activate_on_escape (GtkButton *button) +{ + GtkAccelGroup *accel_group; + GtkWidget *toplevel; + GSList *slist; + GtkAccelGroupEntry *entry_array; + guint n_entries; + guint i; + + g_return_if_fail (GTK_IS_BUTTON (button)); + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button)); + g_return_if_fail (GTK_WIDGET_TOPLEVEL (toplevel)); + + slist = gtk_accel_groups_from_object (G_OBJECT (toplevel)); + if (slist) + accel_group = slist->data; + else + accel_group = NULL; + + for (; slist; slist = slist->next) { + entry_array = gtk_accel_group_query (slist->data, +  GDK_Escape, 0, +  &n_entries); + /* if Escape is already in use we disconnect it */ + for (i = 0; i < n_entries; ++i) { + gtk_accel_group_disconnect (slist->data, +  entry_array[i].closure); + } + } + + if (accel_group) { + /* use an existing accel group */ + gtk_widget_add_accelerator (GTK_WIDGET (button), "activate", +  accel_group, GDK_Escape, 0, 0); + } else { + accel_group = gtk_accel_group_new (); + gtk_widget_add_accelerator (GTK_WIDGET (button), "activate", +  accel_group, GDK_Escape, 0, 0); + gtk_window_add_accel_group (GTK_WINDOW (toplevel), accel_group); + } +} + +/** * gpk_window_set_size_request: **/ gboolean diff --git a/src/gpk-common.h b/src/gpk-common.h index 713d347..f33d233 100644 --- a/src/gpk-common.h +++ b/src/gpk-common.h @@ -94,6 +94,7 @@ GtkEntryCompletion *gpk_package_entry_completion_new (void); gboolean gpk_window_set_size_request (GtkWindow *window, guint width, guint height); +void gpk_button_activate_on_escape (GtkButton *button);  G_END_DECLS  diff --git a/src/gpk-error.c b/src/gpk-error.c index 8f33c90..dd3d941 100644 --- a/src/gpk-error.c +++ b/src/gpk-error.c @@ -69,6 +69,7 @@ gpk_error_dialog_modal_with_time (GtkWindow *window, const gchar *title, const g  /* close button */ widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL);  /* title */ diff --git a/src/gpk-log.c b/src/gpk-log.c index 6623267..79ff5d4 100644 --- a/src/gpk-log.c +++ b/src/gpk-log.c @@ -651,6 +651,7 @@ main (int argc, char *argv[]) g_signal_connect_swapped (widget, "delete_event", G_CALLBACK (gtk_main_quit), NULL);  widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_grab_default (widget);  diff --git a/src/gpk-prefs.c b/src/gpk-prefs.c index 17db46e..d0afa60 100644 --- a/src/gpk-prefs.c +++ b/src/gpk-prefs.c @@ -336,21 +336,6 @@ gpk_prefs_activated_cb (EggUnique *egg_unique, gpointer data) }  /** - * gpk_prefs_key_event_cb - **/ -static gboolean -gpk_prefs_key_event_cb (GtkWidget *widget, GdkEventKey *event, gpointer data) -{ - if (event->keyval == GDK_Escape) { - /* user pressed escape key, close the window */ - gtk_main_quit (); - return TRUE; - } - /* returns FALSE to propagate event further */ - return FALSE; -} - -/** * main: **/ int @@ -415,8 +400,6 @@ main (int argc, char *argv[])  glade_xml = glade_xml_new (GPK_DATA "/gpk-prefs.glade", NULL, NULL); main_window = glade_xml_get_widget (glade_xml, "window_prefs"); - g_signal_connect (main_window, "key_press_event", - G_CALLBACK (gpk_prefs_key_event_cb), NULL);  /* Hide window first so that the dialogue resizes itself without redrawing */ gtk_widget_hide (main_window); @@ -432,6 +415,7 @@ main (int argc, char *argv[]) pk_prefs_notify_checkbutton_setup (widget, GPK_CONF_NOTIFY_COMPLETED);  widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL); widget = glade_xml_get_widget (glade_xml, "button_help"); g_signal_connect (widget, "clicked", diff --git a/src/gpk-repo.c b/src/gpk-repo.c index c85ae1d..572e46c 100644 --- a/src/gpk-repo.c +++ b/src/gpk-repo.c @@ -402,6 +402,7 @@ main (int argc, char *argv[]) g_signal_connect_swapped (main_window, "delete_event", G_CALLBACK (gtk_main_quit), NULL);  widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL); widget = glade_xml_get_widget (glade_xml, "button_help"); g_signal_connect (widget, "clicked", diff --git a/src/gpk-service-pack.c b/src/gpk-service-pack.c index c85abc1..305fefc 100644 --- a/src/gpk-service-pack.c +++ b/src/gpk-service-pack.c @@ -617,6 +617,7 @@ main (int argc, char *argv[]) g_signal_connect (widget, "clicked", G_CALLBACK (gpk_pack_radio_copy_cb), NULL);  widget = glade_xml_get_widget (glade_xml, "button_close"); + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect_swapped (widget, "clicked", G_CALLBACK (gtk_main_quit), NULL); widget = glade_xml_get_widget (glade_xml, "button_create"); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_pack_button_create_cb), NULL); diff --git a/src/gpk-update-viewer.c b/src/gpk-update-viewer.c index c759b2f..3c875fb 100644 --- a/src/gpk-update-viewer.c +++ b/src/gpk-update-viewer.c @@ -126,7 +126,7 @@ pk_button_help_cb (GtkWidget *widget, gpointer data) static void gpk_update_viewer_set_page (PkPageEnum page) { - GtkWidget *widget; + GtkWidget *widget, *button; GList *list, *l; guint i;  @@ -155,13 +155,31 @@ gpk_update_viewer_set_page (PkPageEnum page) gtk_widget_hide (widget); }  + switch (page) { + case PAGE_PREVIEW: + button = glade_xml_get_widget (glade_xml, "button_close3"); + break; + case PAGE_DETAILS: + button = glade_xml_get_widget (glade_xml, "button_close2"); + break; + case PAGE_CONFIRM: + button = glade_xml_get_widget (glade_xml, "button_close4"); + break; + default: + g_assert_not_reached (); + } + widget = glade_xml_get_widget (glade_xml, "hbox_hidden"); list = gtk_container_get_children (GTK_CONTAINER (widget)); for (l=list, i=0; l; l=l->next, i++) { - if (i == page) + if (i == page) { + /* we need to do this every time since the toplevel +  window is always the same */ + gpk_button_activate_on_escape (GTK_BUTTON (button)); gtk_widget_show (l->data); - else + } else { gtk_widget_hide (l->data); + } } }  @@ -1943,6 +1961,8 @@ main (int argc, char *argv[]) g_signal_connect (widget, "clicked", G_CALLBACK (gpk_update_viewer_button_close_and_cancel_cb), NULL); widget = glade_xml_get_widget (glade_xml, "button_close3"); + /* this is the first close button shown */ + gpk_button_activate_on_escape (GTK_BUTTON (widget)); g_signal_connect (widget, "clicked", G_CALLBACK (gpk_update_viewer_button_close_and_cancel_cb), NULL);