diff --git a/.gitignore b/.gitignore
index d50ac39..51c61dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,3 @@ __pycache__
gschemas.compiled
out/
*.po~
-gnome-44-max/
diff --git a/.gitmodules b/.gitmodules
index e7a2906..4c613c2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -11,3 +11,11 @@
[submodule "ui/modules/PyXRLinuxDriverIPC"]
path = ui/modules/PyXRLinuxDriverIPC
url = https://github.com/wheaney/PyXRLinuxDriverIPC.git
+[submodule "gnome/backports/gnome-44-max"]
+ path = gnome/backports/gnome-44-max
+ url = https://github.com/wheaney/breezy-desktop
+ branch = gnome-44-max
+[submodule "gnome/backports/gnome-45"]
+ path = gnome/backports/gnome-45
+ url = https://github.com/wheaney/breezy-desktop
+ branch = gnome-45
diff --git a/bin/breezy_gnome_setup b/bin/breezy_gnome_setup
index fc0c3a0..f93c496 100755
--- a/bin/breezy_gnome_setup
+++ b/bin/breezy_gnome_setup
@@ -23,7 +23,13 @@ check_command "gnome-shell"
ARCH=$(uname -m)
FILE_NAME="breezyGNOME-$ARCH.tar.gz"
-if [ "$(gnome-shell --version | cut -d' ' -f3 | cut -d'.' -f1)" -lt 45 ]; then
+GNOME_VERSION=$(gnome-shell --version | cut -d' ' -f3 | cut -d'.' -f1)
+VERSION_SPECIFIC_FILENAME="breezyGNOME-$GNOME_VERSION-$ARCH.tar.gz"
+LATEST_RELEASE=$(curl -s "https://api.github.com/repos/wheaney/breezy-desktop/releases/latest")
+if echo "$LATEST_RELEASE" | jq -e --arg filename "$VERSION_SPECIFIC_FILENAME" '.assets[] | select(.name == $filename)' > /dev/null; then
+ echo "Performing setup for GNOME $GNOME_VERSION ($ARCH)"
+ FILE_NAME=$VERSION_SPECIFIC_FILENAME
+elif [ "$GNOME_VERSION" -lt 45 ]; then
echo "Performing setup for GNOME 44 and below ($ARCH)"
FILE_NAME="breezyGNOME-44-max-$ARCH.tar.gz"
else
@@ -32,7 +38,6 @@ fi
start_dir=$(pwd)
-
# create temp directory
tmp_dir=$(mktemp -d -t breezy-gnome-XXXXXXXXXX)
pushd $tmp_dir > /dev/null
diff --git a/bin/package_gnome b/bin/package_gnome
index ce388c3..b79b467 100755
--- a/bin/package_gnome
+++ b/bin/package_gnome
@@ -10,26 +10,21 @@ SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
ROOT_DIR=$(realpath $SCRIPT_DIR/..)
VULKAN_DIR=$ROOT_DIR/vulkan
-if [ -z "$GNOME_44_MAX" ]; then
+if [ -z "$GNOME_BACKPORT" ]; then
# standard build for GNOME 45 and up
echo "Building Breezy GNOME for $ARCH, GNOME versions 45 and up"
GNOME_DIR=$ROOT_DIR/gnome
BUILD_FILE_NAME=breezyGNOME-$ARCH.tar.gz
else
- # special patched build for GNOME 44 and below
- echo "Building Breezy GNOME for $ARCH, GNOME versions 44 and below"
+ # special build process for backports
+ echo "Building Breezy GNOME backport \"$GNOME_BACKPORT\" for $ARCH, GNOME versions 44 and below"
- # use a special directory for the GNOME 44 max build, ignored by git
- GNOME_DIR=$ROOT_DIR/gnome-44-max
- rm -rf $GNOME_DIR
- mkdir $GNOME_DIR
- BUILD_FILE_NAME=breezyGNOME-44-max-$ARCH.tar.gz
+ # strip the prefix "gnome-" from the backport name, if it's there
+ GNOME_BACKPORT_NAME=${GNOME_BACKPORT#gnome-}
- # copy the GNOME extension source code to the new directory and apply
- # a patch that makes it compatible with GNOME 44 and below
- cp -ra $ROOT_DIR/gnome/* $GNOME_DIR
+ GNOME_DIR=$ROOT_DIR/gnome/backports/$GNOME_BACKPORT/gnome/
+ BUILD_FILE_NAME=breezyGNOME-$GNOME_BACKPORT_NAME-$ARCH.tar.gz
rm -rf $GNOME_DIR/build
- git apply gnome-44-max.patch
fi
GNOME_BUILD_DIR=$GNOME_DIR/build
diff --git a/gnome-44-max.patch b/gnome-44-max.patch
deleted file mode 100644
index 2b12d3c..0000000
--- a/gnome-44-max.patch
+++ /dev/null
@@ -1,477 +0,0 @@
-diff --git a/gnome-44-max/bin/setup b/gnome-44-max/bin/setup
-index bd4c8b5..2cf0a03 100755
---- a/gnome-44-max/bin/setup
-+++ b/gnome-44-max/bin/setup
-@@ -84,8 +84,10 @@ echo "Copying the manifest file to ${BREEZY_GNOME_DATA_DIR}"
- mkdir -p $BREEZY_GNOME_DATA_DIR
- cp manifest $BREEZY_GNOME_DATA_DIR
-
--echo "Installing the breezydesktop@xronlinux.com GNOME extension"
--gnome-extensions install --force breezydesktop@xronlinux.com.shell-extension.zip
-+EXTENSION_UUID="breezydesktop@xronlinux.com"
-+echo "Installing the $EXTENSION_UUID GNOME extension"
-+gnome-extensions install --force "$EXTENSION_UUID.shell-extension.zip"
-+glib-compile-schemas "$GNOME_SHELL_DATA_DIR/extensions/$EXTENSION_UUID/schemas"
-
- echo "Installing the Breezy Desktop UI application"
- cp -r breezy_ui/data/* $XDG_DATA_HOME
-diff --git a/gnome-44-max/src/cursor.js b/gnome-44-max/src/cursor.js
-index 36ad7ee..41102a0 100644
---- a/gnome-44-max/src/cursor.js
-+++ b/gnome-44-max/src/cursor.js
-@@ -15,11 +15,11 @@
- // You should have received a copy of the GNU General Public License
- // along with this program. If not, see .
-
--import Clutter from 'gi://Clutter';
--import GObject from 'gi://GObject';
-+const Clutter = imports.gi.Clutter;
-+const GObject = imports.gi.GObject;
-
- // Copied almost verbatim from ui/magnifier.js.
--export const MouseSpriteContent = GObject.registerClass({
-+var MouseSpriteContent = GObject.registerClass({
- Implements: [Clutter.Content],
- }, class MouseSpriteContent extends GObject.Object {
- _init() {
-diff --git a/gnome-44-max/src/cursormanager.js b/gnome-44-max/src/cursormanager.js
-index dd4a77d..bbb8872 100644
---- a/gnome-44-max/src/cursormanager.js
-+++ b/gnome-44-max/src/cursormanager.js
-@@ -1,11 +1,15 @@
--import Clutter from 'gi://Clutter';
--import Meta from 'gi://Meta';
--import * as PointerWatcher from 'resource:///org/gnome/shell/ui/pointerWatcher.js';
--import { MouseSpriteContent } from './cursor.js';
--import Globals from './globals.js';
-+const Clutter = imports.gi.Clutter;
-+const Meta = imports.gi.Meta;
-+const PointerWatcher = imports.ui.pointerWatcher;
-+
-+const ExtensionUtils = imports.misc.extensionUtils;
-+const Me = ExtensionUtils.getCurrentExtension();
-+
-+const Globals = Me.imports.globals;
-+const { MouseSpriteContent } = Me.imports.cursor;
-
- // Taken from https://github.com/jkitching/soft-brightness-plus
--export class CursorManager {
-+var CursorManager = class CursorManager {
- constructor(targetMonitors, refreshRate) {
- this._targetMonitors = targetMonitors;
- this._refreshRate = refreshRate;
-diff --git a/gnome-44-max/src/devicedatastream.js b/gnome-44-max/src/devicedatastream.js
-index e396403..f047067 100644
---- a/gnome-44-max/src/devicedatastream.js
-+++ b/gnome-44-max/src/devicedatastream.js
-@@ -1,8 +1,12 @@
--import Gio from 'gi://Gio';
--import GObject from 'gi://GObject';
-+const Gio = imports.gi.Gio;
-+const GObject = imports.gi.GObject;
-
--import Globals from './globals.js';
--import {
-+const ExtensionUtils = imports.misc.extensionUtils;
-+const Me = ExtensionUtils.getCurrentExtension();
-+
-+const Globals = Me.imports.globals;
-+const { isValidKeepAlive, getEpochSec, toSec } = Me.imports.time;
-+const {
- dataViewEnd,
- dataViewUint8,
- dataViewBigUint,
-@@ -14,8 +18,7 @@ import {
- FLOAT_SIZE,
- UINT_SIZE,
- UINT8_SIZE
--} from "./ipc.js";
--import { isValidKeepAlive, getEpochSec, toSec } from "./time.js";
-+} = Me.imports.ipc;
-
- const IPC_FILE_PATH = "/dev/shm/breezy_desktop_imu";
- const KEEPALIVE_REFRESH_INTERVAL_SEC = 1;
-@@ -75,7 +78,7 @@ function nextDebugIMUQuaternion(counter) {
- return [x, y, z, w];
- }
-
--export const DeviceDataStream = GObject.registerClass({
-+var DeviceDataStream = GObject.registerClass({
- Properties: {
- 'breezy-desktop-running': GObject.ParamSpec.boolean(
- 'breezy-desktop-running',
-diff --git a/gnome-44-max/src/extension.js b/gnome-44-max/src/extension.js
-index b3363d5..d5be026 100644
---- a/gnome-44-max/src/extension.js
-+++ b/gnome-44-max/src/extension.js
-@@ -1,28 +1,32 @@
--import Gio from 'gi://Gio';
--import GLib from 'gi://GLib';
--import Meta from 'gi://Meta';
--import Shell from 'gi://Shell';
--import St from 'gi://St';
--
--import { CursorManager } from './cursormanager.js';
--import { DeviceDataStream } from './devicedatastream.js';
--import Globals from './globals.js';
--import { Logger } from './logger.js';
--import { MonitorManager, NESTED_MONITOR_PRODUCT, SUPPORTED_MONITOR_PRODUCTS, VIRTUAL_MONITOR_PRODUCT } from './monitormanager.js';
--import { VirtualDisplaysActor } from './virtualdisplaysactor.js';
--
--import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
--import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-+const Clutter = imports.gi.Clutter;
-+const Gio = imports.gi.Gio;
-+const GLib = imports.gi.GLib;
-+const Meta = imports.gi.Meta;
-+const Shell = imports.gi.Shell;
-+const St = imports.gi.St;
-+
-+const Main = imports.ui.main;
-+
-+const ExtensionUtils = imports.misc.extensionUtils;
-+const Me = ExtensionUtils.getCurrentExtension();
-+
-+const Globals = Me.imports.globals;
-+const { CursorManager } = Me.imports.cursormanager;
-+const { DeviceDataStream } = Me.imports.devicedatastream;
-+const { Logger } = Me.imports.logger;
-+const { MonitorManager, NESTED_MONITOR_PRODUCT, SUPPORTED_MONITOR_PRODUCTS, VIRTUAL_MONITOR_PRODUCT } = Me.imports.monitormanager;
-+const { VirtualDisplaysActor } = Me.imports.virtualdisplaysactor;
-+
-
- const BIN_HOME = GLib.getenv('XDG_BIN_HOME') || GLib.build_filenamev([GLib.get_home_dir(), '.local', 'bin']);
- const XDG_CLI_PATH = GLib.build_filenamev([BIN_HOME, 'xr_driver_cli']);
- const ALT_CLI_PATH = '/usr/bin/xr_driver_cli';
-
--export default class BreezyDesktopExtension extends Extension {
-- constructor(metadata, uuid) {
-- super(metadata, uuid);
--
-- this.settings = this.getSettings();
-+class BreezyDesktopExtension {
-+ constructor(extensionPath) {
-+ this.path = extensionPath;
-+
-+ this.settings = ExtensionUtils.getSettings();
-
- // Set/destroyed by enable/disable
- this._cursor_manager = null;
-@@ -645,6 +649,6 @@ export default class BreezyDesktopExtension extends Extension {
- }
- }
-
--function init() {
-- return new Extension();
-+function init(meta) {
-+ return new BreezyDesktopExtension(meta.path);
- }
-diff --git a/gnome-44-max/src/globals.js b/gnome-44-max/src/globals.js
-index f11451c..4b5c65b 100644
---- a/gnome-44-max/src/globals.js
-+++ b/gnome-44-max/src/globals.js
-@@ -1,7 +1,6 @@
--const Globals = {
-+var Globals = {
- logger: null,
- ipc_file: null, // Gio.File instance, file exists if set
- extension_dir: null, // string path
- data_stream: null, // DeviceDataStream instance
--}
--export default Globals;
-\ No newline at end of file
-+}
-\ No newline at end of file
-diff --git a/gnome-44-max/src/ipc.js b/gnome-44-max/src/ipc.js
-index a729368..d5f7ab0 100644
---- a/gnome-44-max/src/ipc.js
-+++ b/gnome-44-max/src/ipc.js
-@@ -1,30 +1,30 @@
--export const UINT8_SIZE = 1;
--export const BOOL_SIZE = UINT8_SIZE;
--export const UINT_SIZE = 4;
--export const FLOAT_SIZE = 4;
-+var UINT8_SIZE = 1;
-+var BOOL_SIZE = UINT8_SIZE;
-+var UINT_SIZE = 4;
-+var FLOAT_SIZE = 4;
-
--export const DATA_VIEW_INFO_OFFSET_INDEX = 0;
--export const DATA_VIEW_INFO_SIZE_INDEX = 1;
--export const DATA_VIEW_INFO_COUNT_INDEX = 2;
-+var DATA_VIEW_INFO_OFFSET_INDEX = 0;
-+var DATA_VIEW_INFO_SIZE_INDEX = 1;
-+var DATA_VIEW_INFO_COUNT_INDEX = 2;
-
- // computes the end offset, exclusive
--export function dataViewEnd(dataViewInfo) {
-+function dataViewEnd(dataViewInfo) {
- return dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX] + dataViewInfo[DATA_VIEW_INFO_SIZE_INDEX] * dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX];
- }
-
--export function dataViewUint8(dataView, dataViewInfo) {
-+function dataViewUint8(dataView, dataViewInfo) {
- return dataView.getUint8(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX]);
- }
-
--export function dataViewUint(dataView, dataViewInfo) {
-+function dataViewUint(dataView, dataViewInfo) {
- return dataView.getUint32(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX], true);
- }
-
--export function dataViewBigUint(dataView, dataViewInfo) {
-+function dataViewBigUint(dataView, dataViewInfo) {
- return Number(dataView.getBigUint64(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX], true));
- }
-
--export function dataViewUint32Array(dataView, dataViewInfo) {
-+function dataViewUint32Array(dataView, dataViewInfo) {
- const uintArray = []
- let offset = dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX];
- for (let i = 0; i < dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; i++) {
-@@ -34,7 +34,7 @@ export function dataViewUint32Array(dataView, dataViewInfo) {
- return uintArray;
- }
-
--export function dataViewUint8Array(dataView, dataViewInfo) {
-+function dataViewUint8Array(dataView, dataViewInfo) {
- const uintArray = []
- let offset = dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX];
- for (let i = 0; i < dataViewInfo[DATA_VIEW_INFO_SIZE_INDEX] * dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; i++) {
-@@ -44,11 +44,11 @@ export function dataViewUint8Array(dataView, dataViewInfo) {
- return uintArray;
- }
-
--export function dataViewFloat(dataView, dataViewInfo) {
-+function dataViewFloat(dataView, dataViewInfo) {
- return dataView.getFloat32(dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX], true);
- }
-
--export function dataViewFloatArray(dataView, dataViewInfo) {
-+function dataViewFloatArray(dataView, dataViewInfo) {
- const floatArray = []
- let offset = dataViewInfo[DATA_VIEW_INFO_OFFSET_INDEX];
- for (let i = 0; i < dataViewInfo[DATA_VIEW_INFO_COUNT_INDEX]; i++) {
-diff --git a/gnome-44-max/src/logger.js b/gnome-44-max/src/logger.js
-index 5bdf115..138a98a 100644
---- a/gnome-44-max/src/logger.js
-+++ b/gnome-44-max/src/logger.js
-@@ -14,15 +14,15 @@
- // You should have received a copy of the GNU General Public License
- // along with this program. If not, see .
-
--import * as Config from 'resource:///org/gnome/shell/misc/config.js';
--import Gio from 'gi://Gio';
--import GLib from 'gi://GLib';
--import GObject from 'gi://GObject';
--import System from 'system';
-+const Config = imports.misc.config;
-+const Gio = imports.gi.Gio;
-+const GLib = imports.gi.GLib;
-+const GObject = imports.gi.GObject;
-+const System = imports.system;
-
- const LOG_DIR_NAME = 'breezy_gnome/logs/gjs';
-
--export const Logger = GObject.registerClass({
-+var Logger = GObject.registerClass({
- GTypeName: 'Logger',
- Properties: {
- 'title': GObject.ParamSpec.string(
-diff --git a/gnome-44-max/src/math.js b/gnome-44-max/src/math.js
-index f1c9983..9a98c7b 100644
---- a/gnome-44-max/src/math.js
-+++ b/gnome-44-max/src/math.js
-@@ -1,9 +1,9 @@
--export function degreeToRadian(degree) {
-+function degreeToRadian(degree) {
- return degree * Math.PI / 180;
- }
-
- // FOV in radians is spherical, so doesn't follow Pythagoras' theorem
--export function diagonalToCrossFOVs(diagonalFOVRadians, aspectRatio) {
-+function diagonalToCrossFOVs(diagonalFOVRadians, aspectRatio) {
- // first convert from a spherical FOV to a diagonal FOV on a flat plane at a generic distance of 1.0
- const flatDiagonalFOV = 2 * Math.tan(diagonalFOVRadians / 2);
-
-diff --git a/gnome-44-max/src/metadata.json b/gnome-44-max/src/metadata.json
-index 0f8073b..bc26f97 100644
---- a/gnome-44-max/src/metadata.json
-+++ b/gnome-44-max/src/metadata.json
-@@ -5,7 +5,7 @@
- "settings-schema": "com.xronlinux.BreezyDesktop",
- "session-modes": ["user"],
- "shell-version": [
-- "45", "46", "47"
-+ "42", "43", "44"
- ],
- "url": "https://github.com/wheaney/breezy-desktop"
- }
-\ No newline at end of file
-diff --git a/gnome-44-max/src/monitormanager.js b/gnome-44-max/src/monitormanager.js
-index 4c57171..080924d 100644
---- a/gnome-44-max/src/monitormanager.js
-+++ b/gnome-44-max/src/monitormanager.js
-@@ -16,16 +16,19 @@
- // You should have received a copy of the GNU General Public License
- // along with this program. If not, see .
-
--import Gio from 'gi://Gio';
--import GObject from 'gi://GObject';
-+const Gio = imports.gi.Gio;
-+const GObject = imports.gi.GObject;
-
--import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-+const Main = imports.ui.main;
-
--import Globals from './globals.js';
-+const ExtensionUtils = imports.misc.extensionUtils;
-+const Me = ExtensionUtils.getCurrentExtension();
-
--export const NESTED_MONITOR_PRODUCT = 'MetaMonitor';
--export const VIRTUAL_MONITOR_PRODUCT = 'Virtual remote monitor';
--export const SUPPORTED_MONITOR_PRODUCTS = [
-+const Globals = Me.imports.globals;
-+
-+var NESTED_MONITOR_PRODUCT = 'MetaMonitor';
-+var VIRTUAL_MONITOR_PRODUCT = 'Virtual remote monitor';
-+var SUPPORTED_MONITOR_PRODUCTS = [
- 'VITURE',
- 'nreal air',
- 'Air',
-@@ -58,7 +61,7 @@ function getDisplayConfigProxy(extPath) {
- return cachedDisplayConfigProxy;
- }
-
--export function newDisplayConfig(extPath, callback) {
-+function newDisplayConfig(extPath, callback) {
- const DisplayConfigProxy = getDisplayConfigProxy(extPath);
- new DisplayConfigProxy(
- Gio.DBus.session,
-@@ -366,7 +369,7 @@ function performOptimalModeCheck(displayConfigProxy, connectorName, headsetAsPri
- }
-
- // Monitor change handling
--export const MonitorManager = GObject.registerClass({
-+var MonitorManager = GObject.registerClass({
- Properties: {
- 'use-optimal-monitor-config': GObject.ParamSpec.boolean(
- 'use-optimal-monitor-config',
-diff --git a/gnome-44-max/src/shader.js b/gnome-44-max/src/shader.js
-index f70c96d..352be40 100644
---- a/gnome-44-max/src/shader.js
-+++ b/gnome-44-max/src/shader.js
-@@ -1,6 +1,6 @@
--import Gio from 'gi://Gio';
-+const Gio = imports.gi.Gio;
-
--export function getShaderSource(path) {
-+function getShaderSource(path) {
- const file = Gio.file_new_for_path(path);
- const data = file.load_contents(null);
-
-diff --git a/gnome-44-max/src/time.js b/gnome-44-max/src/time.js
-index 8c17207..fdfdac1 100644
---- a/gnome-44-max/src/time.js
-+++ b/gnome-44-max/src/time.js
-@@ -1,11 +1,11 @@
--export function getEpochSec() {
-+function getEpochSec() {
- return toSec(Date.now());
- }
-
--export function toSec(milliseconds) {
-+function toSec(milliseconds) {
- return Math.floor(milliseconds / 1000);
- }
-
--export function isValidKeepAlive(dateSec) {
-+function isValidKeepAlive(dateSec) {
- return Math.abs(getEpochSec() - dateSec) <= 1;
- }
-\ No newline at end of file
-diff --git a/gnome-44-max/src/virtualdisplayeffect.js b/gnome-44-max/src/virtualdisplayeffect.js
-index 26be71e..42da807 100644
---- a/gnome-44-max/src/virtualdisplayeffect.js
-+++ b/gnome-44-max/src/virtualdisplayeffect.js
-@@ -1,16 +1,18 @@
--import Clutter from 'gi://Clutter'
--import Cogl from 'gi://Cogl';
--import GLib from 'gi://GLib';
--import GObject from 'gi://GObject';
--import Shell from 'gi://Shell';
-+const Clutter = imports.gi.Clutter;
-+const Cogl = imports.gi.Cogl;
-+const GLib = imports.gi.GLib;
-+const GObject = imports.gi.GObject;
-+const Shell = imports.gi.Shell;
-
--import Globals from './globals.js';
--import { degreeToRadian, diagonalToCrossFOVs } from './math.js';
-+const ExtensionUtils = imports.misc.extensionUtils;
-+const Me = ExtensionUtils.getCurrentExtension();
-
-+const Globals = Me.imports.globals;
-+const { degreeToRadian, diagonalToCrossFOVs } = Me.imports.math;
-
- // these need to mirror the values in XRLinuxDriver
- // https://github.com/wheaney/XRLinuxDriver/blob/main/src/plugins/smooth_follow.c#L31
--export const SMOOTH_FOLLOW_SLERP_TIMELINE_MS = 1000;
-+var SMOOTH_FOLLOW_SLERP_TIMELINE_MS = 1000;
- const SMOOTH_FOLLOW_SLERP_FACTOR = Math.pow(1-0.999, 1/SMOOTH_FOLLOW_SLERP_TIMELINE_MS);
-
- // this mirror's how the driver's slerp function progresses so our effect will match it
-@@ -26,7 +28,7 @@ function lookAheadMS(imuDateMs, lookAheadCfg, override) {
- return (override === -1 ? lookAheadCfg[0] : override) + dataAge;
- }
-
--export const VirtualDisplayEffect = GObject.registerClass({
-+var VirtualDisplayEffect = GObject.registerClass({
- Properties: {
- 'monitor-index': GObject.ParamSpec.int(
- 'monitor-index',
-diff --git a/gnome-44-max/src/virtualdisplaysactor.js b/gnome-44-max/src/virtualdisplaysactor.js
-index 538fa8c..fa134f1 100644
---- a/gnome-44-max/src/virtualdisplaysactor.js
-+++ b/gnome-44-max/src/virtualdisplaysactor.js
-@@ -1,18 +1,19 @@
--import Clutter from 'gi://Clutter'
--import Cogl from 'gi://Cogl';
--import GdkPixbuf from 'gi://GdkPixbuf';
--import GLib from 'gi://GLib';
--import GObject from 'gi://GObject';
--import Mtk from 'gi://Mtk';
--import Shell from 'gi://Shell';
--import St from 'gi://St';
-+const Clutter = imports.gi.Clutter;
-+const Cogl = imports.gi.Cogl;
-+const GdkPixbuf = imports.gi.GdkPixbuf;
-+const GLib = imports.gi.GLib;
-+const GObject = imports.gi.GObject;
-+const Shell = imports.gi.Shell;
-+const St = imports.gi.St;
-
--import { VirtualDisplayEffect, SMOOTH_FOLLOW_SLERP_TIMELINE_MS } from './virtualdisplayeffect.js';
--import { degreeToRadian, diagonalToCrossFOVs } from './math.js';
-+const Main = imports.ui.main;
-
--import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-+const ExtensionUtils = imports.misc.extensionUtils;
-+const Me = ExtensionUtils.getCurrentExtension();
-
--import Globals from './globals.js';
-+const { VirtualDisplayEffect, SMOOTH_FOLLOW_SLERP_TIMELINE_MS } = Me.imports.virtualdisplayeffect;
-+const Globals = Me.imports.globals;
-+const { degreeToRadian, diagonalToCrossFOVs } = Me.imports.math;
-
- function applyQuaternionToVector(vector, quaternion) {
- const t = [
-@@ -394,7 +395,7 @@ function verticalMonitorSort(monitors) {
- });
- }
-
--export const VirtualDisplaysActor = GObject.registerClass({
-+var VirtualDisplaysActor = GObject.registerClass({
- Properties: {
- 'target-monitor': GObject.ParamSpec.jsobject(
- 'target-monitor',
diff --git a/gnome/backports/gnome-44-max b/gnome/backports/gnome-44-max
new file mode 160000
index 0000000..1445122
--- /dev/null
+++ b/gnome/backports/gnome-44-max
@@ -0,0 +1 @@
+Subproject commit 144512201119b6b0522e59a44c7f83461f77f80d
diff --git a/gnome/backports/gnome-45 b/gnome/backports/gnome-45
new file mode 160000
index 0000000..ce6f7dd
--- /dev/null
+++ b/gnome/backports/gnome-45
@@ -0,0 +1 @@
+Subproject commit ce6f7dd7e473100cf15d97e657cff54d0c17f62d