Bug 1364355 - Add support for using ARGB windows with OMTC when an X11 compositor is active. r?karlt
Authored by Andrew Comminos <andrew@comminos.com>
MozReview-Commit-ID: FIQBHSXgjMh
--- a/widget/gtk/nsWindow.cpp
+++ b/widget/gtk/nsWindow.cpp
@@ -215,16 +215,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,
@@ -3365,16 +3367,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);
InitDragEvent(event);
event.mRefPoint = aRefPoint;
@@ -3832,16 +3847,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);
@@ -5839,16 +5856,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;
}
@@ -6439,17 +6466,20 @@ 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 &&
+ eTransparencyTransparent == GetTransparencyMode())
+ {
mLayerManager = CreateBasicLayerManager();
}
return nsBaseWidget::GetLayerManager(aShadowManager, aBackendHint, aPersistence);
}
void
nsWindow::ClearCachedResources()
@@ -6748,8 +6778,22 @@ void nsWindow::GetCompositorWidgetInitDa
{
#ifdef MOZ_X11
*aInitData = mozilla::widget::CompositorWidgetInitData(
mXWindow,
nsCString(XDisplayString(mXDisplay)),
GetClientSize());
#endif
}
+
+bool
+nsWindow::IsComposited() const
+{
+ if (!mGdkWindow) {
+ NS_WARNING("nsWindow::HasARGBVisual called before realization!");
+ return false;
+ }
+
+ GdkScreen* gdkScreen = gdk_screen_get_default();
+ return gdk_screen_is_composited(gdkScreen) &&
+ (gdk_window_get_visual(mGdkWindow)
+ == gdk_screen_get_rgba_visual(gdkScreen));
+}
--- a/widget/gtk/nsWindow.h
+++ b/widget/gtk/nsWindow.h
@@ -246,16 +246,17 @@ private:
void ReleaseGrabs (void);
void UpdateClientOffset();
public:
void ThemeChanged(void);
void OnDPIChanged(void);
void OnCheckResize(void);
+ void OnCompositedChanged(void);
#ifdef MOZ_X11
Window mOldFocusWindow;
#endif /* MOZ_X11 */
static guint32 sLastButtonPressTime;
virtual MOZ_MUST_USE nsresult
@@ -425,16 +426,18 @@ private:
CheckForRollup(0, 0, false, true);
}
bool GetDragInfo(mozilla::WidgetMouseEvent* aMouseEvent,
GdkWindow** aWindow, gint* aButton,
gint* aRootX, gint* aRootY);
void ClearCachedResources();
nsIWidgetListener* GetListener();
+ bool IsComposited() const;
+
GtkWidget *mShell;
MozContainer *mContainer;
GdkWindow *mGdkWindow;
uint32_t mHasMappedToplevel : 1,
mIsFullyObscured : 1,
mRetryPointerGrab : 1;