Index: content/browser/renderer_host/render_widget_host_view_gtk.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.cc b/content/browser/renderer_host/render_widget_host_view_gtk.cc |
index c6999c26f79c112fe8d29e036bd98b4c31dcca4c..859ecfff17ea5bb4d366b45081aa981ea3e2414a 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_gtk.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_gtk.cc |
@@ -43,6 +43,7 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/x11/WebScreenInfoFactory.h" |
#include "ui/base/gtk/gtk_compat.h" |
#include "ui/base/text/text_elider.h" |
+#include "ui/base/x/active_window_watcher_x.h" |
#include "ui/base/x/x11_util.h" |
#include "ui/gfx/gtk_native_view_id_manager.h" |
#include "ui/gfx/gtk_preserve_window.h" |
@@ -574,6 +575,7 @@ RenderWidgetHostViewGtk::RenderWidgetHostViewGtk( |
was_imcontext_focused_before_grab_(false), |
do_x_grab_(false), |
is_fullscreen_(false), |
+ made_active_(false), |
Daniel Erat
2012/06/13 19:18:43
actually, having this variable contain false infor
|
destroy_handler_id_(0), |
dragged_at_horizontal_edge_(0), |
dragged_at_vertical_edge_(0), |
@@ -659,16 +661,14 @@ void RenderWidgetHostViewGtk::InitAsFullscreen( |
GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); |
gtk_window_set_decorated(window, FALSE); |
gtk_window_fullscreen(window); |
- g_signal_connect(GTK_WIDGET(window), |
- "window-state-event", |
- G_CALLBACK(&OnWindowStateEventThunk), |
- this); |
destroy_handler_id_ = g_signal_connect(GTK_WIDGET(window), |
"destroy", |
G_CALLBACK(OnDestroyThunk), |
this); |
gtk_container_add(GTK_CONTAINER(window), view_.get()); |
+ ui::ActiveWindowWatcherX::AddObserver(this); |
+ |
// Try to move and resize the window to cover the screen in case the window |
// manager doesn't support _NET_WM_STATE_FULLSCREEN. |
GdkScreen* screen = gtk_window_get_screen(window); |
@@ -766,6 +766,17 @@ bool RenderWidgetHostViewGtk::HasFocus() const { |
return gtk_widget_is_focus(view_.get()); |
} |
+void RenderWidgetHostViewGtk::ActiveWindowChanged(GdkWindow *window) { |
+ DCHECK(is_fullscreen_); |
+ GdkWindow* our_window = gtk_widget_get_parent_window(view_.get()); |
+ // If the window was previously active, but isn't active anymore, shut it |
+ // down. |
+ if (our_window == window) |
+ made_active_ = true; |
+ else if (made_active_) |
+ host_->Shutdown(); |
+} |
+ |
bool RenderWidgetHostViewGtk::IsSurfaceAvailableForCopy() const { |
return !!host_->GetBackingStore(false); |
} |
@@ -877,8 +888,10 @@ void RenderWidgetHostViewGtk::Destroy() { |
GtkWidget* window = gtk_widget_get_parent(view_.get()); |
// Disconnect the destroy handler so that we don't try to shutdown twice. |
- if (is_fullscreen_) |
+ if (is_fullscreen_) { |
g_signal_handler_disconnect(window, destroy_handler_id_); |
+ ui::ActiveWindowWatcherX::RemoveObserver(this); |
+ } |
gtk_widget_destroy(window); |
} |
@@ -951,24 +964,6 @@ gfx::NativeView RenderWidgetHostViewGtk::BuildInputMethodsGtkMenu() { |
return im_context_->BuildInputMethodsGtkMenu(); |
} |
-gboolean RenderWidgetHostViewGtk::OnWindowStateEvent( |
- GtkWidget* widget, |
- GdkEventWindowState* event) { |
- if (is_fullscreen_) { |
- // If a fullscreen widget got unfullscreened (e.g. by the window manager), |
- // close it. |
- bool unfullscreened = |
- (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) && |
- !(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN); |
- if (unfullscreened) { |
- host_->Shutdown(); |
- return TRUE; |
- } |
- } |
- |
- return FALSE; |
-} |
- |
void RenderWidgetHostViewGtk::OnDestroy(GtkWidget* widget) { |
DCHECK(is_fullscreen_); |
host_->Shutdown(); |