Index: chrome/browser/gtk/task_manager_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/task_manager_gtk.cc (revision 20196) |
+++ chrome/browser/gtk/task_manager_gtk.cc (working copy) |
@@ -4,6 +4,8 @@ |
#include "chrome/browser/gtk/task_manager_gtk.h" |
+#include <gdk/gdkkeysyms.h> |
+ |
#include <vector> |
#include "app/l10n_util.h" |
@@ -312,6 +314,8 @@ |
kTaskManagerResponseKill, |
NULL); |
+ ConnectAccelerators(); |
+ |
gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog_)->vbox), |
gtk_util::kContentAreaSpacing); |
@@ -362,6 +366,19 @@ |
model_->SetObserver(this); |
} |
+void TaskManagerGtk::ConnectAccelerators() { |
+ GtkAccelGroup* accel_group = gtk_accel_group_new(); |
+ gtk_window_add_accel_group(GTK_WINDOW(dialog_), accel_group); |
+ |
+ // Drop the initial ref on |accel_group| so |dialog_| will own it. |
+ g_object_unref(accel_group); |
+ |
+ gtk_accel_group_connect(accel_group, GDK_w, GDK_CONTROL_MASK, |
+ GtkAccelFlags(0), |
+ g_cclosure_new(G_CALLBACK(OnGtkAccelerator), this, |
+ NULL)); |
+} |
+ |
void TaskManagerGtk::CreateTaskManagerTreeview() { |
treeview_ = gtk_tree_view_new(); |
@@ -544,3 +561,20 @@ |
return FALSE; |
} |
+ |
+// static |
+gboolean TaskManagerGtk::OnGtkAccelerator(GtkAccelGroup* accel_group, |
+ GObject* acceleratable, |
+ guint keyval, |
+ GdkModifierType modifier, |
+ TaskManagerGtk* task_manager) { |
+ if (keyval == GDK_w && modifier == GDK_CONTROL_MASK) { |
+ // The GTK_RESPONSE_DELETE_EVENT response must be sent before the widget |
+ // is destroyed. The deleted object will receive gtk signals otherwise. |
+ gtk_dialog_response(GTK_DIALOG(task_manager->dialog_), |
+ GTK_RESPONSE_DELETE_EVENT); |
+ gtk_widget_destroy(task_manager->dialog_); |
+ } |
+ |
+ return TRUE; |
+} |