diff options
Diffstat (limited to 'chrome/browser/gtk/constrained_window_gtk.cc')
| -rw-r--r-- | chrome/browser/gtk/constrained_window_gtk.cc | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/chrome/browser/gtk/constrained_window_gtk.cc b/chrome/browser/gtk/constrained_window_gtk.cc index 8ec5195..321aa16 100644 --- a/chrome/browser/gtk/constrained_window_gtk.cc +++ b/chrome/browser/gtk/constrained_window_gtk.cc @@ -15,7 +15,8 @@ ConstrainedWindowGtk::ConstrainedWindowGtk( TabContents* owner, ConstrainedWindowGtkDelegate* delegate) : owner_(owner), delegate_(delegate), - visible_(false) { + visible_(false), + accel_group_(gtk_accel_group_new()) { DCHECK(owner); DCHECK(delegate); GtkWidget* dialog = delegate->GetWidgetRoot(); @@ -33,14 +34,20 @@ ConstrainedWindowGtk::ConstrainedWindowGtk( gtk_container_add(GTK_CONTAINER(frame), alignment); gtk_container_add(GTK_CONTAINER(ebox), frame); border_.Own(ebox); - - gtk_widget_add_events(widget(), GDK_KEY_PRESS_MASK); - g_signal_connect(widget(), "key-press-event", G_CALLBACK(OnKeyPressThunk), - this); + ConnectAccelerators(); } 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() { @@ -59,23 +66,36 @@ void ConstrainedWindowGtk::CloseConstrainedWindow() { delegate_->DeleteDelegate(); owner_->WillClose(this); - // Let the stack unwind so any relevant event handler can release its ref - // on widget(). - MessageLoop::current()->DeleteSoon(FROM_HERE, this); + delete this; } TabContentsViewGtk* ConstrainedWindowGtk::ContainingView() { return static_cast<TabContentsViewGtk*>(owner_->view()); } -gboolean ConstrainedWindowGtk::OnKeyPress(GtkWidget* sender, - GdkEventKey* key) { - if (key->keyval == GDK_Escape) { - CloseConstrainedWindow(); - return TRUE; - } +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_); +} + - return FALSE; +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; + + CloseConstrainedWindow(); + return TRUE; } // static @@ -84,3 +104,4 @@ ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog( ConstrainedWindowGtkDelegate* delegate) { return new ConstrainedWindowGtk(parent, delegate); } + |
