diff options
author | nsylvain@chromium.org <nsylvain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-02 03:04:48 +0000 |
---|---|---|
committer | nsylvain@chromium.org <nsylvain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-02 03:04:48 +0000 |
commit | 6470a9eb1c4fdcfb45b504e9b6ce57941ff956de (patch) | |
tree | 15a92868417ba6bae45f1e40f017792eaa1f6dbc /chrome/browser/gtk/constrained_window_gtk.cc | |
parent | b2b53acbce69a10ee521baae5e558b748dd71002 (diff) | |
download | chromium_src-6470a9eb1c4fdcfb45b504e9b6ce57941ff956de.zip chromium_src-6470a9eb1c4fdcfb45b504e9b6ce57941ff956de.tar.gz chromium_src-6470a9eb1c4fdcfb45b504e9b6ce57941ff956de.tar.bz2 |
Revert 58259 - reland r57885 with a fix for linux/views.
We believe this caused a lot of login prompt auth tests to fail with :
[5860:5871:2463125642585:FATAL:chrome/browser/gtk/owned_widget_gtk.cc(39)] Check failed: ((((GObject*) g_type_check_instance_cast ((GTypeInstance*) ((widget)), (((GType) ((20) << (2))))))))->ref_count == 1U (3 vs. 1)
Backtrace:
StackTrace::StackTrace() [0x8b2d896]
logging::LogMessage::~LogMessage() [0x8b47321]
OwnedWidgetGtk::Destroy() [0x81b2536]
LoginHandlerGtk::~LoginHandlerGtk() [0x860a419]
base::RefCountedThreadSafe<>::DeleteInternal() [0x82911a4]
base::DefaultRefCountedThreadSafeTraits<>::Destruct() [0x82911b7]
base::RefCountedThreadSafe<>::Release() [0x8291215]
------
Original message:
[GTK] a couple of constrained window fixes:
1) don't grab focus when the parent tab isn't showing. Grab the focus when the tab is brought to the front.
2) handle escape via normal key handling rather than accelerator keys
3) don't allow the content view to take focus (via tab) when the constrained window is showing.
BUG=53242, 50799
TEST=see bugs. Also, tabbing between constrained window and url bar should work as expected.
Review URL: http://codereview.chromium.org/3235010
TBR=estade@chromium.org
Review URL: http://codereview.chromium.org/3293005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58308 0039d316-1c4b-4281-b951-d872f2087c98
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); } + |