| 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;
|
| +}
|
|
|