[gnome-shell/wip/exalm/dark] ui: Add ScreenTransition
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/exalm/dark] ui: Add ScreenTransition
- Date: Sun, 12 Dec 2021 18:15:03 +0000 (UTC)
commit 58bb904dafa211415b43e31df8ed89e3ecc165ac
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Thu Sep 23 12:45:14 2021 +0500
ui: Add ScreenTransition
.../org.gnome.Shell.ScreenTransition.xml | 22 ++++++
data/gnome-shell-dbus-interfaces.gresource.xml | 1 +
js/js-resources.gresource.xml | 1 +
js/ui/screenTransition.js | 82 ++++++++++++++++++++++
js/ui/shellDBus.js | 2 +
5 files changed, 108 insertions(+)
---
diff --git a/data/dbus-interfaces/org.gnome.Shell.ScreenTransition.xml
b/data/dbus-interfaces/org.gnome.Shell.ScreenTransition.xml
new file mode 100644
index 0000000000..1865a73866
--- /dev/null
+++ b/data/dbus-interfaces/org.gnome.Shell.ScreenTransition.xml
@@ -0,0 +1,22 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Shell.ScreenTransition:
+ @short_description: Screen transition interface
+
+ The interface used to initiate screen transition after changing the system-wide color scheme.
+ -->
+ <interface name="org.gnome.Shell.ScreenTransition">
+
+ <!--
+ Transition:
+
+ Initiate the screen transition.
+ -->
+ <method name="Transition"/>
+
+ </interface>
+</node>
diff --git a/data/gnome-shell-dbus-interfaces.gresource.xml b/data/gnome-shell-dbus-interfaces.gresource.xml
index 6682c462d6..4df7a22d3e 100644
--- a/data/gnome-shell-dbus-interfaces.gresource.xml
+++ b/data/gnome-shell-dbus-interfaces.gresource.xml
@@ -49,6 +49,7 @@
<file preprocess="xml-stripblanks">org.gnome.Shell.PortalHelper.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Shell.Screencast.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Shell.Screenshot.xml</file>
+ <file preprocess="xml-stripblanks">org.gnome.Shell.ScreenTransition.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Shell.Wacom.PadOsd.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Shell.WeatherIntegration.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Shell.xml</file>
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index 93d5932f52..147804cfad 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -94,6 +94,7 @@
<file>ui/runDialog.js</file>
<file>ui/screenShield.js</file>
<file>ui/screenshot.js</file>
+ <file>ui/screenTransition.js</file>
<file>ui/scripting.js</file>
<file>ui/search.js</file>
<file>ui/searchController.js</file>
diff --git a/js/ui/screenTransition.js b/js/ui/screenTransition.js
new file mode 100644
index 0000000000..bdb277c616
--- /dev/null
+++ b/js/ui/screenTransition.js
@@ -0,0 +1,82 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+/* exported ScreenTransitionService */
+
+const { Clutter, Gio, GObject, St } = imports.gi;
+
+const Main = imports.ui.main;
+
+const { loadInterfaceXML } = imports.misc.fileUtils;
+const { DBusSenderChecker } = imports.misc.util;
+
+const ScreenTransitionIface = loadInterfaceXML('org.gnome.Shell.ScreenTransition');
+
+const SCREEN_TRANSITION_DURATION = 500; // milliseconds
+
+var ScreenTransitionService = class {
+ constructor() {
+ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenTransitionIface, this);
+ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/ScreenTransition');
+
+ this._senderChecker = new DBusSenderChecker([
+ 'org.gnome.ControlCenter',
+ ]);
+
+ Gio.DBus.session.own_name('org.gnome.Shell.ScreenTransition', Gio.BusNameOwnerFlags.REPLACE, null,
null);
+ }
+
+ TransitionAsync(params, invocation) {
+ try {
+ this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+ }
+
+ if (this._transition)
+ this._transition.destroy();
+
+ this._transition = new ScreenTransition(() => {
+ this._transition = null;
+ });
+ invocation.return_value(null);
+ }
+};
+
+var ScreenTransition = GObject.registerClass(
+class ScreenTransition extends St.Bin {
+ _init(doneCallback) {
+ super._init();
+
+ Main.uiGroup.add_actor(this);
+ 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,
+ });
+ // FIXME if scale-monitor-framebuffer is enabled, with mixed dpi the lower dpi screen
+ // will be glitchy. Should this be done for every screen separately instead?
+ const [, , , scale] = global.stage.get_capture_final_size(rect);
+ const content = global.stage.paint_to_content(rect, scale, Clutter.PaintFlag.NO_CURSORS);
+ const clone = new St.Widget({ content });
+ this.add_actor(clone);
+
+ this.add_constraint(new Clutter.BindConstraint({
+ source: Main.uiGroup,
+ coordinate: Clutter.BindCoordinate.ALL,
+ }));
+
+ this.ease({
+ opacity: 0,
+ duration: SCREEN_TRANSITION_DURATION,
+ mode: Clutter.AnimationMode.LINEAR,
+ onComplete: () => {
+ if (doneCallback)
+ doneCallback();
+ this.destroy();
+ },
+ });
+ }
+});
diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
index aeabe6d81e..191c947626 100644
--- a/js/ui/shellDBus.js
+++ b/js/ui/shellDBus.js
@@ -8,6 +8,7 @@ const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils;
const Main = imports.ui.main;
const Screenshot = imports.ui.screenshot;
+const ScreenTransition = imports.ui.screenTransition;
const { loadInterfaceXML } = imports.misc.fileUtils;
const { DBusSenderChecker } = imports.misc.util;
@@ -28,6 +29,7 @@ var GnomeShell = class {
this._extensionsService = new GnomeShellExtensions();
this._screenshotService = new Screenshot.ScreenshotService();
+ this._screenTransitionService = new ScreenTransition.ScreenTransitionService();
this._grabbedAccelerators = new Map();
this._grabbers = new Map();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]