| Index: chrome/browser/gtk/constrained_window_gtk.cc
|
| diff --git a/chrome/browser/gtk/constrained_window_gtk.cc b/chrome/browser/gtk/constrained_window_gtk.cc
|
| index 321aa160d7d3a342c8fc39289f50e3435d97f650..8ec51953b96f2cf2e18b3c8b884b778426e68c5f 100644
|
| --- a/chrome/browser/gtk/constrained_window_gtk.cc
|
| +++ b/chrome/browser/gtk/constrained_window_gtk.cc
|
| @@ -15,8 +15,7 @@ ConstrainedWindowGtk::ConstrainedWindowGtk(
|
| TabContents* owner, ConstrainedWindowGtkDelegate* delegate)
|
| : owner_(owner),
|
| delegate_(delegate),
|
| - visible_(false),
|
| - accel_group_(gtk_accel_group_new()) {
|
| + visible_(false) {
|
| DCHECK(owner);
|
| DCHECK(delegate);
|
| GtkWidget* dialog = delegate->GetWidgetRoot();
|
| @@ -34,20 +33,14 @@ ConstrainedWindowGtk::ConstrainedWindowGtk(
|
| gtk_container_add(GTK_CONTAINER(frame), alignment);
|
| gtk_container_add(GTK_CONTAINER(ebox), frame);
|
| border_.Own(ebox);
|
| - ConnectAccelerators();
|
| +
|
| + gtk_widget_add_events(widget(), GDK_KEY_PRESS_MASK);
|
| + g_signal_connect(widget(), "key-press-event", G_CALLBACK(OnKeyPressThunk),
|
| + this);
|
| }
|
|
|
| ConstrainedWindowGtk::~ConstrainedWindowGtk() {
|
| border_.Destroy();
|
| -
|
| - gtk_accel_group_disconnect_key(accel_group_, GDK_Escape,
|
| - static_cast<GdkModifierType>(0));
|
| - if (ContainingView() && ContainingView()->GetTopLevelNativeWindow()) {
|
| - gtk_window_remove_accel_group(
|
| - GTK_WINDOW(ContainingView()->GetTopLevelNativeWindow()),
|
| - accel_group_);
|
| - }
|
| - g_object_unref(accel_group_);
|
| }
|
|
|
| void ConstrainedWindowGtk::ShowConstrainedWindow() {
|
| @@ -66,36 +59,23 @@ void ConstrainedWindowGtk::CloseConstrainedWindow() {
|
| delegate_->DeleteDelegate();
|
| owner_->WillClose(this);
|
|
|
| - delete this;
|
| + // Let the stack unwind so any relevant event handler can release its ref
|
| + // on widget().
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| }
|
|
|
| TabContentsViewGtk* ConstrainedWindowGtk::ContainingView() {
|
| return static_cast<TabContentsViewGtk*>(owner_->view());
|
| }
|
|
|
| -void ConstrainedWindowGtk::ConnectAccelerators() {
|
| - gtk_accel_group_connect(accel_group_,
|
| - GDK_Escape, static_cast<GdkModifierType>(0),
|
| - static_cast<GtkAccelFlags>(0),
|
| - g_cclosure_new(G_CALLBACK(OnEscapeThunk),
|
| - this, NULL));
|
| - gtk_window_add_accel_group(
|
| - GTK_WINDOW(ContainingView()->GetTopLevelNativeWindow()),
|
| - accel_group_);
|
| -}
|
| -
|
| -
|
| -gboolean ConstrainedWindowGtk::OnEscape(GtkAccelGroup* group,
|
| - GObject* acceleratable,
|
| - guint keyval,
|
| - GdkModifierType modifier) {
|
| - // Handle this accelerator only if this is on the currently selected tab.
|
| - Browser* browser = BrowserList::GetLastActive();
|
| - if (!browser || browser->GetSelectedTabContents() != owner_)
|
| - return FALSE;
|
| +gboolean ConstrainedWindowGtk::OnKeyPress(GtkWidget* sender,
|
| + GdkEventKey* key) {
|
| + if (key->keyval == GDK_Escape) {
|
| + CloseConstrainedWindow();
|
| + return TRUE;
|
| + }
|
|
|
| - CloseConstrainedWindow();
|
| - return TRUE;
|
| + return FALSE;
|
| }
|
|
|
| // static
|
| @@ -104,4 +84,3 @@ ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog(
|
| ConstrainedWindowGtkDelegate* delegate) {
|
| return new ConstrainedWindowGtk(parent, delegate);
|
| }
|
| -
|
|
|