--- a/widget/gtk/nsWindow.cpp
+++ b/widget/gtk/nsWindow.cpp
@@ -213,16 +213,18 @@ static void hierarchy_changed_cb
GtkWidget *previous_toplevel);
static gboolean window_state_event_cb (GtkWidget *widget,
GdkEventWindowState *event);
static void theme_changed_cb (GtkSettings *settings,
GParamSpec *pspec,
nsWindow *data);
static void check_resize_cb (GtkContainer* container,
gpointer user_data);
+static void composited_changed_cb (GtkWidget* widget,
+ gpointer user_data);
#if (MOZ_WIDGET_GTK == 3)
static void scale_changed_cb (GtkWidget* widget,
GParamSpec* aPSpec,
gpointer aPointer);
#endif
#if GTK_CHECK_VERSION(3,4,0)
static gboolean touch_event_cb (GtkWidget* aWidget,
@@ -3411,16 +3413,29 @@ nsWindow::OnDPIChanged()
void
nsWindow::OnCheckResize()
{
mPendingConfigures++;
}
void
+nsWindow::OnCompositedChanged()
+{
+ if (mWidgetListener) {
+ nsIPresShell* presShell = mWidgetListener->GetPresShell();
+ if (presShell) {
+ // Update CSD after the change in alpha visibility
+ presShell->ThemeChanged();
+ }
+ }
+ CleanLayerManagerRecursive();
+}
+
+void
nsWindow::DispatchDragEvent(EventMessage aMsg, const LayoutDeviceIntPoint& aRefPoint,
guint aTime)
{
WidgetDragEvent event(true, aMsg, this);
if (aMsg == eDragOver) {
InitDragEvent(event);
}
@@ -3879,16 +3894,18 @@ nsWindow::Create(nsIWidget* aParent,
g_signal_connect(mShell, "configure_event",
G_CALLBACK(configure_event_cb), nullptr);
g_signal_connect(mShell, "delete_event",
G_CALLBACK(delete_event_cb), nullptr);
g_signal_connect(mShell, "window_state_event",
G_CALLBACK(window_state_event_cb), nullptr);
g_signal_connect(mShell, "check-resize",
G_CALLBACK(check_resize_cb), nullptr);
+ g_signal_connect(mShell, "composited-changed",
+ G_CALLBACK(composited_changed_cb), nullptr);
GtkSettings* default_settings = gtk_settings_get_default();
g_signal_connect_after(default_settings,
"notify::gtk-theme-name",
G_CALLBACK(theme_changed_cb), this);
g_signal_connect_after(default_settings,
"notify::gtk-font-name",
G_CALLBACK(theme_changed_cb), this);
@@ -6087,16 +6104,26 @@ check_resize_cb (GtkContainer* container
{
RefPtr<nsWindow> window = get_window_for_gtk_widget(GTK_WIDGET(container));
if (!window) {
return;
}
window->OnCheckResize();
}
+static void
+composited_changed_cb (GtkWidget* widget, gpointer user_data)
+{
+ RefPtr<nsWindow> window = get_window_for_gtk_widget(widget);
+ if (!window) {
+ return;
+ }
+ window->OnCompositedChanged();
+}
+
#if (MOZ_WIDGET_GTK == 3)
static void
scale_changed_cb (GtkWidget* widget, GParamSpec* aPSpec, gpointer aPointer)
{
RefPtr<nsWindow> window = get_window_for_gtk_widget(widget);
if (!window) {
return;
}
@@ -6826,17 +6853,21 @@ nsWindow::GetLayerManager(PLayerTransact
LayersBackend aBackendHint,
LayerManagerPersistence aPersistence)
{
if (mIsDestroyed) {
// Prevent external code from triggering the re-creation of the LayerManager/Compositor
// during shutdown. Just return what we currently have, which is most likely null.
return mLayerManager;
}
- if (!mLayerManager && eTransparencyTransparent == GetTransparencyMode()) {
+
+ if (!mLayerManager &&
+ (!HasARGBVisual() || !IsComposited()) &&
+ eTransparencyTransparent == GetTransparencyMode())
+ {
mLayerManager = CreateBasicLayerManager();
}
return nsBaseWidget::GetLayerManager(aShadowManager, aBackendHint, aPersistence);
}
void
nsWindow::ClearCachedResources()
--- a/widget/gtk/nsWindow.h
+++ b/widget/gtk/nsWindow.h
@@ -250,16 +250,17 @@ public:
#ifdef MOZ_X11
void SetNonXEmbedPluginFocus(void);
void LoseNonXEmbedPluginFocus(void);
#endif /* MOZ_X11 */
void ThemeChanged(void);
void OnDPIChanged(void);
void OnCheckResize(void);
+ void OnCompositedChanged(void);
#ifdef MOZ_X11
Window mOldFocusWindow;
#endif /* MOZ_X11 */
static guint32 sLastButtonPressTime;
NS_IMETHOD BeginResizeDrag(mozilla::WidgetGUIEvent* aEvent,