| Index: content/browser/renderer_host/render_widget_host_view_gtk.cc
|
| ===================================================================
|
| --- content/browser/renderer_host/render_widget_host_view_gtk.cc (revision 145972)
|
| +++ content/browser/renderer_host/render_widget_host_view_gtk.cc (working copy)
|
| @@ -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"
|
| @@ -575,6 +576,7 @@
|
| was_imcontext_focused_before_grab_(false),
|
| do_x_grab_(false),
|
| is_fullscreen_(false),
|
| + made_active_(false),
|
| destroy_handler_id_(0),
|
| dragged_at_horizontal_edge_(0),
|
| dragged_at_vertical_edge_(0),
|
| @@ -660,10 +662,6 @@
|
| 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),
|
| @@ -767,6 +765,18 @@
|
| return gtk_widget_is_focus(view_.get());
|
| }
|
|
|
| +void RenderWidgetHostViewGtk::ActiveWindowChanged(GdkWindow* window) {
|
| + GdkWindow* our_window = gtk_widget_get_parent_window(view_.get());
|
| +
|
| + if (our_window == window)
|
| + made_active_ = true;
|
| +
|
| + // If the window was previously active, but isn't active anymore, shut it
|
| + // down.
|
| + if (is_fullscreen_ && our_window != window && made_active_)
|
| + host_->Shutdown();
|
| +}
|
| +
|
| bool RenderWidgetHostViewGtk::IsSurfaceAvailableForCopy() const {
|
| return !!host_->GetBackingStore(false);
|
| }
|
| @@ -877,6 +887,8 @@
|
| if (IsPopup() || is_fullscreen_) {
|
| GtkWidget* window = gtk_widget_get_parent(view_.get());
|
|
|
| + ui::ActiveWindowWatcherX::RemoveObserver(this);
|
| +
|
| // Disconnect the destroy handler so that we don't try to shutdown twice.
|
| if (is_fullscreen_)
|
| g_signal_handler_disconnect(window, destroy_handler_id_);
|
| @@ -952,24 +964,6 @@
|
| 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();
|
| @@ -996,6 +990,8 @@
|
| std::min(bounds.height(), kMaxWindowHeight));
|
| host_->WasResized();
|
|
|
| + ui::ActiveWindowWatcherX::AddObserver(this);
|
| +
|
| // Don't set the size when we're going fullscreen. This can confuse the
|
| // window manager into thinking we're resizing a fullscreen window and
|
| // therefore not fullscreen anymore.
|
|
|