diff --git a/js/ui/appSwitcher/appSwitcher3D.js b/js/ui/appSwitcher/appSwitcher3D.js index ddb0b2ae2c..acce992d6e 100644 --- a/js/ui/appSwitcher/appSwitcher3D.js +++ b/js/ui/appSwitcher/appSwitcher3D.js @@ -21,7 +21,7 @@ const PREVIEW_SCALE = 0.5; const TITLE_POSITION = 7/8; // percent position var ANIMATION_TIME = 250; // ms const SWITCH_TIME_DELAY = 100; // milliseconds -const DIM_FACTOR = 0.4; // percent +const DIM_OPACITY = 102; function AppSwitcher3D() { this._init.apply(this, arguments); @@ -37,11 +37,7 @@ AppSwitcher3D.prototype = { this._icon = null; this._lastTime = 0; - if (!Meta.is_wayland_compositor()) { - this._background = Meta.X11BackgroundActor.new_for_display(global.display); - } else { - this._background = new Clutter.Actor(); - } + this._background = Main.createFullScreenBackground(); this._background.hide(); global.overlay_group.add_actor(this._background); @@ -75,7 +71,7 @@ AppSwitcher3D.prototype = { Main.panelManager.panels.forEach(function(panel) { panel.actor.set_reactive(false); }); this._background.ease({ - dim_factor: DIM_FACTOR, + opacity: DIM_OPACITY, duration: ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); @@ -140,7 +136,7 @@ AppSwitcher3D.prototype = { // background this._background.remove_all_transitions(); this._background.ease({ - dim_factor: 1.0, + opacity: 255, duration: ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => this._destroyActors() diff --git a/js/ui/backgroundManager.js b/js/ui/backgroundManager.js index fc5deee1e6..40469f36c3 100644 --- a/js/ui/backgroundManager.js +++ b/js/ui/backgroundManager.js @@ -34,20 +34,14 @@ var BackgroundManager = class { } showBackground() { - if (Meta.is_wayland_compositor()) { - global.bottom_window_group.show(); - } - else { - global.background_actor.show(); + for (let actor of global.get_background_actors()) { + actor.show(); } } hideBackground() { - if (Meta.is_wayland_compositor()) { - global.bottom_window_group.hide(); - } - else { - global.background_actor.hide(); + for (let actor of global.get_background_actors()) { + actor.hide(); } } diff --git a/js/ui/expo.js b/js/ui/expo.js index 014f362eed..a63d778644 100644 --- a/js/ui/expo.js +++ b/js/ui/expo.js @@ -38,12 +38,7 @@ Expo.prototype = { // one. Instances of this class share a single CoglTexture behind the // scenes which allows us to show the background with different // rendering options without duplicating the texture data. - if (!Meta.is_wayland_compositor()) { - this._background = Meta.X11BackgroundActor.new_for_display(global.display); - } else { - this._background = new Clutter.Actor(); - } - + this._background = Main.createFullScreenBackground(); this._background.hide(); global.overlay_group.add_actor(this._background); @@ -349,13 +344,6 @@ Expo.prototype = { this._gradient.show(); Main.panelManager.disablePanels(); - this._background.dim_factor = 1; - this._background.ease({ - dim_factor: 0.4, - duration: Main.animations_enabled ? ANIMATION_TIME : 0, - mode: Clutter.AnimationMode.EASE_OUT_QUAD - }); - activeWorkspace.setOverviewMode(true); this._coverPane.raise_top(); diff --git a/js/ui/expoThumbnail.js b/js/ui/expoThumbnail.js index 43a64973d6..86581f27b1 100644 --- a/js/ui/expoThumbnail.js +++ b/js/ui/expoThumbnail.js @@ -390,10 +390,8 @@ ExpoWorkspaceThumbnail.prototype = { this.background = new Clutter.Group(); this.contents.add_actor(this.background); - if (!Meta.is_wayland_compositor()) { - let desktopBackground = Meta.X11BackgroundActor.new_for_display(global.display); - this.background.add_actor(desktopBackground); - } + let desktopBackground = Main.createFullScreenBackground(); + this.background.add_actor(desktopBackground); let backgroundShade = new St.Bin({style_class: 'workspace-overview-background-shade'}); this.background.add_actor(backgroundShade); diff --git a/js/ui/main.js b/js/ui/main.js index 0fffd906f2..7a5d17b00f 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -672,6 +672,32 @@ function getPanels() { return panelManager.getPanels(); } +/** + * createFullScreenBackground: + * + * Creates a full-stage background actor containing one background per monitor. + * On X11, each child is the root pixmap actor positioned at the monitor's + * location. On Wayland, each child is a clone of the layer-shell background + * surface for that monitor. + * + * Returns: a ClutterActor covering all monitors + */ +function createFullScreenBackground() { + let container = new imports.gi.Clutter.Actor(); + + for (let i = 0; i < layoutManager.monitors.length; i++) { + let monitor = layoutManager.monitors[i]; + let bg = Meta.create_background_for_monitor(global.display, i); + if (bg) { + bg.set_position(monitor.x, monitor.y); + bg.set_size(monitor.width, monitor.height); + container.add_child(bg); + } + } + + return container; +} + let _workspaces = []; let _checkWorkspacesId = 0; diff --git a/js/ui/overrides.js b/js/ui/overrides.js index de2454b413..489b2b73ec 100644 --- a/js/ui/overrides.js +++ b/js/ui/overrides.js @@ -127,13 +127,13 @@ function overrideClutter() { } function overrideMeta() { - Meta.BackgroundActor.new_for_screen = function(screen) { - if (!Meta.is_wayland_compositor()) { - return Meta.X11BackgroundActor.new_for_display(global.display); - } else { - return new Clutter.Actor(); + Meta.BackgroundActor = { + new_for_screen: function(_screen) { + logError("Meta.BackgroundActor.new_for_screen() is deprecated, use Meta.create_background_for_monitor() or Main.createFullScreenBackground()."); + return Meta.X11BackgroundActor.new_for_display(global.display) || + new Clutter.Actor(); } - } + }; Meta.disable_unredirect_for_screen = function(screen) { Meta.disable_unredirect_for_display(global.display); diff --git a/js/ui/overview.js b/js/ui/overview.js index 0406a0f609..5051273c51 100644 --- a/js/ui/overview.js +++ b/js/ui/overview.js @@ -247,19 +247,10 @@ Overview.prototype = { // one. Instances of this class share a single CoglTexture behind the // scenes which allows us to show the background with different // rendering options without duplicating the texture data. - this._background = new Clutter.Actor(); + this._background = Main.createFullScreenBackground(); this._background.set_position(0, 0); this._group.add_actor(this._background); - let desktopBackground; - if (!Meta.is_wayland_compositor()) { - desktopBackground = Meta.X11BackgroundActor.new_for_display(global.display); - } else { - desktopBackground = new Clutter.Actor(); - } - - this._background.add_actor(desktopBackground); - let backgroundShade = new St.Bin({style_class: 'workspace-overview-background-shade'}); backgroundShade.set_size(global.screen_width, global.screen_height); this._background.add_actor(backgroundShade); diff --git a/js/ui/screensaver/screenShield.js b/js/ui/screensaver/screenShield.js index 943098ee72..24047a6db7 100644 --- a/js/ui/screensaver/screenShield.js +++ b/js/ui/screensaver/screenShield.js @@ -1164,23 +1164,13 @@ var ScreenShield = GObject.registerClass({ _createBackgrounds() { this._destroyBackgrounds(); - if (Meta.is_wayland_compositor()) { - // TODO: Waiting on: - // muffin: https://github.com/linuxmint/muffin/pull/784 - // cinnamon-settings-daemon: https://github.com/linuxmint/cinnamon-settings-daemon/pull/437 - // - // Once those are merged we can access the layer-shell surfaces of csd-background and avoid - // having to load them in Cinnamon. - // - // For now, there is only a black background for the screensaver. - return; - } - let nMonitors = Main.layoutManager.monitors.length; for (let i = 0; i < nMonitors; i++) { let monitor = Main.layoutManager.monitors[i]; - let background = Meta.X11BackgroundActor.new_for_display(global.display); + let background = Meta.create_background_for_monitor(global.display, i); + if (!background) + continue; background.reactive = false; diff --git a/src/cinnamon-global.c b/src/cinnamon-global.c index b1a23bee49..7bb3ec48f2 100644 --- a/src/cinnamon-global.c +++ b/src/cinnamon-global.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -145,6 +144,8 @@ cinnamon_global_get_property(GObject *object, g_value_set_object (value, meta_get_top_window_group_for_display (global->meta_display)); break; case PROP_BACKGROUND_ACTOR: + g_warning_once ("global.background_actor is deprecated and X11-only. " + "Use global.get_background_actors() instead."); g_value_set_object (value, meta_get_x11_background_actor_for_display (global->meta_display)); break; case PROP_DESKLET_CONTAINER: @@ -392,9 +393,9 @@ cinnamon_global_class_init (CinnamonGlobalClass *klass) PROP_BACKGROUND_ACTOR, g_param_spec_object ("background-actor", "Background Actor", - "Actor drawing root window background", + "Actor drawing root window background (X11 only, deprecated)", CLUTTER_TYPE_ACTOR, - G_PARAM_READABLE)); + G_PARAM_READABLE | G_PARAM_DEPRECATED)); g_object_class_install_property (gobject_class, PROP_DESKLET_CONTAINER, g_param_spec_object ("desklet-container", @@ -760,6 +761,23 @@ cinnamon_global_get_window_actors (CinnamonGlobal *global) return meta_get_window_actors (global->meta_display); } +/** + * cinnamon_global_get_background_actors: + * + * Gets the list of per-monitor background actors created by + * meta_create_background_for_monitor(). These are the live actors in the + * scene graph and can have effects applied to them directly. + * + * Return value: (element-type Clutter.Actor) (transfer none): the list of background actors + */ +GList * +cinnamon_global_get_background_actors (CinnamonGlobal *global) +{ + g_return_val_if_fail (CINNAMON_IS_GLOBAL (global), NULL); + + return meta_get_background_actors_for_display (global->meta_display); +} + static void global_stage_notify_width (GObject *gobject, GParamSpec *pspec, diff --git a/src/cinnamon-global.h b/src/cinnamon-global.h index 7f9c0f09a0..ad0e429cab 100644 --- a/src/cinnamon-global.h +++ b/src/cinnamon-global.h @@ -32,6 +32,7 @@ ClutterStage *cinnamon_global_get_stage (CinnamonGlobal *global CinnamonScreen *cinnamon_global_get_screen (CinnamonGlobal *global); MetaDisplay *cinnamon_global_get_display (CinnamonGlobal *global); GList *cinnamon_global_get_window_actors (CinnamonGlobal *global); +GList *cinnamon_global_get_background_actors (CinnamonGlobal *global); GSettings *cinnamon_global_get_settings (CinnamonGlobal *global); guint32 cinnamon_global_get_current_time (CinnamonGlobal *global); pid_t cinnamon_global_get_pid (CinnamonGlobal *global);