shellDBus: Add ScreenTransition()

Settings will use this when switching between light and dark styles.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2070>
This commit is contained in:
Alexander Mikhaylenko 2021-09-23 12:45:14 +05:00
parent 03e307f328
commit de485c8f47
4 changed files with 70 additions and 0 deletions

View File

@ -35,6 +35,7 @@
<arg type="au" direction="in" name="action"/> <arg type="au" direction="in" name="action"/>
<arg type="b" direction="out" name="success"/> <arg type="b" direction="out" name="success"/>
</method> </method>
<method name="ScreenTransition"/>
<signal name="AcceleratorActivated"> <signal name="AcceleratorActivated">
<arg name="action" type="u"/> <arg name="action" type="u"/>
<arg name="parameters" type="a{sv}"/> <arg name="parameters" type="a{sv}"/>

View File

@ -733,6 +733,11 @@ var BackgroundManager = class BackgroundManager {
this._newBackgroundActor = null; this._newBackgroundActor = null;
this.emit('changed'); this.emit('changed');
if (Main.layoutManager.screenTransition.visible) {
oldBackgroundActor.destroy();
return;
}
oldBackgroundActor.ease({ oldBackgroundActor.ease({
opacity: 0, opacity: 0,
duration: FADE_ANIMATION_TIME, duration: FADE_ANIMATION_TIME,

View File

@ -18,6 +18,9 @@ var BACKGROUND_FADE_ANIMATION_TIME = 1000;
var HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels var HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
const SCREEN_TRANSITION_DELAY = 250; // ms
const SCREEN_TRANSITION_DURATION = 500; // ms
function isPopupMetaWindow(actor) { function isPopupMetaWindow(actor) {
switch (actor.meta_window.get_window_type()) { switch (actor.meta_window.get_window_type()) {
case Meta.WindowType.DROPDOWN_MENU: case Meta.WindowType.DROPDOWN_MENU:
@ -298,6 +301,13 @@ var LayoutManager = GObject.registerClass({
monitorManager.connect('monitors-changed', monitorManager.connect('monitors-changed',
this._monitorsChanged.bind(this)); this._monitorsChanged.bind(this));
this._monitorsChanged(); this._monitorsChanged();
this.screenTransition = new ScreenTransition();
this.uiGroup.add_child(this.screenTransition);
this.screenTransition.add_constraint(new Clutter.BindConstraint({
source: this.uiGroup,
coordinate: Clutter.BindCoordinate.ALL,
}));
} }
// This is called by Main after everything else is constructed // This is called by Main after everything else is constructed
@ -309,6 +319,7 @@ var LayoutManager = GObject.registerClass({
showOverview() { showOverview() {
this.overviewGroup.show(); this.overviewGroup.show();
this.screenTransition.hide();
this._inOverview = true; this._inOverview = true;
this._updateVisibility(); this._updateVisibility();
@ -316,6 +327,7 @@ var LayoutManager = GObject.registerClass({
hideOverview() { hideOverview() {
this.overviewGroup.hide(); this.overviewGroup.hide();
this.screenTransition.hide();
this._inOverview = false; this._inOverview = false;
this._updateVisibility(); this._updateVisibility();
@ -1369,3 +1381,42 @@ var PressureBarrier = class PressureBarrier {
} }
}; };
Signals.addSignalMethods(PressureBarrier.prototype); Signals.addSignalMethods(PressureBarrier.prototype);
var ScreenTransition = GObject.registerClass(
class ScreenTransition extends Clutter.Actor {
_init() {
super._init({ visible: false });
}
vfunc_hide() {
this.content = null;
super.vfunc_hide();
}
run() {
if (this.visible)
return;
Main.uiGroup.set_child_above_sibling(this, null);
const rect = new imports.gi.cairo.RectangleInt({
x: 0,
y: 0,
width: global.screen_width,
height: global.screen_height,
});
const [, , , scale] = global.stage.get_capture_final_size(rect);
this.content = global.stage.paint_to_content(rect, scale, Clutter.PaintFlag.NO_CURSORS);
this.opacity = 255;
this.show();
this.ease({
opacity: 0,
duration: SCREEN_TRANSITION_DURATION,
delay: SCREEN_TRANSITION_DELAY,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onStopped: () => this.hide(),
});
}
});

View File

@ -251,6 +251,19 @@ var GnomeShell = class {
invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded])); invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
} }
ScreenTransitionAsync(params, invocation) {
try {
this._senderChecker.checkInvocation(invocation);
} catch (e) {
invocation.return_gerror(e);
return;
}
Main.layoutManager.screenTransition.run();
invocation.return_value(null);
}
_emitAcceleratorActivated(action, device, timestamp) { _emitAcceleratorActivated(action, device, timestamp) {
let destination = this._grabbedAccelerators.get(action); let destination = this._grabbedAccelerators.get(action);
if (!destination) if (!destination)