diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -3238,16 +3238,18 @@ void nsWindow::OnWindowStateEvent(GtkWid // We don't care about anything but changes in the maximized/icon/fullscreen // states if ((aEvent->changed_mask & (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)) == 0) { return; } + nsSizeMode lastSizeState = mSizeState; + if (aEvent->new_window_state & GDK_WINDOW_STATE_ICONIFIED) { LOG(("\tIconified\n")); mSizeState = nsSizeMode_Minimized; #ifdef ACCESSIBILITY DispatchMinimizeEventAccessible(); #endif // ACCESSIBILITY } else if (aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) { LOG(("\tFullscreen\n")); @@ -3261,16 +3263,28 @@ void nsWindow::OnWindowStateEvent(GtkWid } else { LOG(("\tNormal\n")); mSizeState = nsSizeMode_Normal; #ifdef ACCESSIBILITY DispatchRestoreEventAccessible(); #endif // ACCESSIBILITY } + // Fullscreen video playback may generate bogus alpha values which blends + // with desktop background in fullscreen video playback (Bug 1568569). + // As a workaround enable to draw mShell background in fullscreen mode + // if we draw to mContainer. + if (gtk_widget_get_has_window(GTK_WIDGET(mContainer))) { + if (mSizeState == nsSizeMode_Fullscreen) { + gtk_widget_set_app_paintable(mShell, FALSE); + } else if (lastSizeState == nsSizeMode_Fullscreen) { + gtk_widget_set_app_paintable(mShell, TRUE); + } + } + if (mWidgetListener) { mWidgetListener->SizeModeChanged(mSizeState); if (aEvent->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { mWidgetListener->FullscreenChanged(aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN); } } @@ -3787,16 +3801,21 @@ nsresult nsWindow::Create(nsIWidget* aPa eventWidget = (drawToContainer) ? container : mShell; // Prevent GtkWindow from painting a background to avoid flickering. gtk_widget_set_app_paintable(eventWidget, TRUE); gtk_widget_add_events(eventWidget, kEvents); if (drawToContainer) { gtk_widget_add_events(mShell, GDK_PROPERTY_CHANGE_MASK); + // Don't paint mShell background when we draw to mContainer. + // Otherwise we see mShell backround to shine through + // mContainer (Bug 1507608). + // But it may also lead to various bugs where mContainer has unintended + // transparent parts which blend with underlying desktop (Bug 1516224). gtk_widget_set_app_paintable(mShell, TRUE); } if (mTransparencyBitmapForTitlebar) { moz_container_force_default_visual(mContainer); } // If we draw to mContainer window then configure it now because // gtk_container_add() realizes the child widget.