summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/gtk/constrained_window_gtk.cc37
-rw-r--r--chrome/browser/gtk/constrained_window_gtk.h19
2 files changed, 54 insertions, 2 deletions
diff --git a/chrome/browser/gtk/constrained_window_gtk.cc b/chrome/browser/gtk/constrained_window_gtk.cc
index cd562b1..0b72fe6 100644
--- a/chrome/browser/gtk/constrained_window_gtk.cc
+++ b/chrome/browser/gtk/constrained_window_gtk.cc
@@ -4,6 +4,9 @@
#include "chrome/browser/gtk/constrained_window_gtk.h"
+#include <gdk/gdkkeysyms.h>
+
+#include "chrome/browser/browser_list.h"
#include "chrome/browser/gtk/gtk_util.h"
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/browser/tab_contents/tab_contents_view_gtk.h"
@@ -12,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();
@@ -30,10 +34,18 @@ ConstrainedWindowGtk::ConstrainedWindowGtk(
gtk_container_add(GTK_CONTAINER(frame), alignment);
gtk_container_add(GTK_CONTAINER(ebox), frame);
border_.Own(ebox);
+ ConnectAccelerators();
}
ConstrainedWindowGtk::~ConstrainedWindowGtk() {
border_.Destroy();
+
+ gtk_accel_group_disconnect_key(accel_group_, GDK_Escape,
+ static_cast<GdkModifierType>(0));
+ gtk_window_remove_accel_group(
+ GTK_WINDOW(ContainingView()->GetTopLevelNativeWindow()),
+ accel_group_);
+ g_object_unref(accel_group_);
}
void ConstrainedWindowGtk::ShowConstrainedWindow() {
@@ -59,9 +71,32 @@ 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() {
+ // 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
ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog(
TabContents* parent,
ConstrainedWindowGtkDelegate* delegate) {
return new ConstrainedWindowGtk(parent, delegate);
}
+
diff --git a/chrome/browser/gtk/constrained_window_gtk.h b/chrome/browser/gtk/constrained_window_gtk.h
index fdfedf1..0af6e63 100644
--- a/chrome/browser/gtk/constrained_window_gtk.h
+++ b/chrome/browser/gtk/constrained_window_gtk.h
@@ -5,9 +5,10 @@
#ifndef CHROME_BROWSER_GTK_CONSTRAINED_WINDOW_GTK_H_
#define CHROME_BROWSER_GTK_CONSTRAINED_WINDOW_GTK_H_
-#include "chrome/browser/tab_contents/constrained_window.h"
+#include <gtk/gtk.h>
#include "base/basictypes.h"
+#include "chrome/browser/tab_contents/constrained_window.h"
#include "chrome/common/owned_widget_gtk.h"
class TabContents;
@@ -53,6 +54,20 @@ class ConstrainedWindowGtk : public ConstrainedWindow {
ConstrainedWindowGtk(TabContents* owner,
ConstrainedWindowGtkDelegate* delegate);
+ // Connects the ESC accelerator to the window.
+ void ConnectAccelerators();
+
+ // Handles an ESC accelerator being pressed.
+ static gboolean OnEscapeThunk(GtkAccelGroup* accel_group,
+ GObject* acceleratable,
+ guint keyval,
+ GdkModifierType modifier,
+ gpointer user_data) {
+ return reinterpret_cast<ConstrainedWindowGtk*>(user_data)->OnEscape();
+ }
+
+ gboolean OnEscape();
+
// The TabContents that owns and constrains this ConstrainedWindow.
TabContents* owner_;
@@ -65,6 +80,8 @@ class ConstrainedWindowGtk : public ConstrainedWindow {
// Stores if |ShowConstrainedWindow()| has been called.
bool visible_;
+ GtkAccelGroup* accel_group_;
+
DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowGtk);
};