From a2eb0023dcaa30eab3f93088a7948abec534f3df Mon Sep 17 00:00:00 2001
From: Wayne Heaney <42350981+wheaney@users.noreply.github.com>
Date: Sun, 16 Mar 2025 14:15:04 -0700
Subject: [PATCH] Add curved display support, v2.0.15 (#103)
* Add curved display support
* Add GNOME 48 support
* Update backport build and setup process, add a GNOME-45 backport build
---
.gitignore | 1 -
.gitmodules | 8 +
VERSION | 2 +-
bin/breezy_gnome_setup | 9 +-
bin/package_gnome | 31 +-
gnome-44-max.patch | 477 --------------------
gnome/backports/gnome-44-max | 1 +
gnome/backports/gnome-45 | 1 +
gnome/src/extension.js | 2 +
gnome/src/math.js | 45 ++
gnome/src/metadata.json | 2 +-
gnome/src/virtualdisplayeffect.js | 236 ++++++----
gnome/src/virtualdisplaysactor.js | 308 ++++++-------
ui/po/breezydesktop.pot | 158 ++++---
ui/po/de.po | 161 +++----
ui/po/es.po | 186 ++++----
ui/po/fr.po | 161 +++----
ui/po/it.po | 161 +++----
ui/po/ja.po | 173 +++----
ui/po/mo/de/LC_MESSAGES/breezydesktop.mo | Bin 9667 -> 9823 bytes
ui/po/mo/es/LC_MESSAGES/breezydesktop.mo | Bin 15046 -> 15202 bytes
ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo | Bin 9736 -> 9893 bytes
ui/po/mo/it/LC_MESSAGES/breezydesktop.mo | Bin 9778 -> 9868 bytes
ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo | Bin 16029 -> 16208 bytes
ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo | Bin 14739 -> 14877 bytes
ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo | Bin 11183 -> 11412 bytes
ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo | Bin 9192 -> 9333 bytes
ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo | Bin 11077 -> 11310 bytes
ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo | Bin 13321 -> 13473 bytes
ui/po/pl.po | 158 ++++---
ui/po/pt_BR.po | 165 +++----
ui/po/ru.po | 161 +++----
ui/po/sv.po | 161 +++----
ui/po/uk_UA.po | 161 +++----
ui/po/zh_CN.po | 164 +++----
ui/src/connecteddevice.py | 15 +-
ui/src/gtk/connected-device.ui | 12 +
37 files changed, 1418 insertions(+), 1702 deletions(-)
delete mode 100644 gnome-44-max.patch
create mode 160000 gnome/backports/gnome-44-max
create mode 160000 gnome/backports/gnome-45
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/VERSION b/VERSION
index 3d45b5c..e6f474a 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.0.14
+2.0.15
\ No newline at end of file
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..0750131 100755
--- a/bin/package_gnome
+++ b/bin/package_gnome
@@ -9,27 +9,29 @@ ARCH=${ARCH:-$(uname -m)}
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
ROOT_DIR=$(realpath $SCRIPT_DIR/..)
VULKAN_DIR=$ROOT_DIR/vulkan
+UI_DIR=$ROOT_DIR/ui
+XR_DRIVER_DIR=$ROOT_DIR/modules/XRLinuxDriver
-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"
- # 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
+ UI_DIR=$ROOT_DIR/gnome/backports/$GNOME_BACKPORT/ui
+ BUILD_FILE_NAME=breezyGNOME-$GNOME_BACKPORT_NAME-$ARCH.tar.gz
rm -rf $GNOME_DIR/build
- git apply gnome-44-max.patch
+
+ pushd $GNOME_DIR
+ git submodule update --init
+ popd
fi
GNOME_BUILD_DIR=$GNOME_DIR/build
@@ -42,7 +44,6 @@ PACKAGE_DIR=$GNOME_BUILD_DIR/breezy_gnome
rm -rf $PACKAGE_DIR
mkdir -p $PACKAGE_DIR
-XR_DRIVER_DIR=$ROOT_DIR/modules/XRLinuxDriver
source $XR_DRIVER_DIR/bin/inject_ua
# if a custom_banner image exists, copy it over the sombrero one
@@ -92,9 +93,9 @@ pushd $GNOME_DIR/src
GNOME_MANIFEST_LINE=$(find -L . -type f ! -name "*.compiled" -exec sha256sum {} \; | sort | sha256sum | sed 's/ .*//')
popd
-UI_BUILD_ARTIFACT=ui/out/breezyUI-$ARCH.tar.gz
+UI_BUILD_ARTIFACT=$UI_DIR/out/breezyUI-$ARCH.tar.gz
if [ ! -e "$UI_BUILD_ARTIFACT" ] || [ "$1" == "--rebuild-ui" ] || [ "$1" == "--rebuild-all" ]; then
- pushd ui
+ pushd $UI_DIR
bin/package $ARCH
popd
fi
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
diff --git a/gnome/src/extension.js b/gnome/src/extension.js
index b3363d5..891bd16 100644
--- a/gnome/src/extension.js
+++ b/gnome/src/extension.js
@@ -233,6 +233,7 @@ export default class BreezyDesktopExtension extends Extension {
virtual_monitors: virtualMonitors,
monitor_wrapping_scheme: this.settings.get_string('monitor-wrapping-scheme'),
monitor_spacing: this.settings.get_int('monitor-spacing'),
+ curved_display: this.settings.get_boolean('curved-display'),
headset_display_as_viewport_center: this.settings.get_boolean('headset-display-as-viewport-center'),
viewport_offset_x: this.settings.get_double('viewport-offset-x'),
viewport_offset_y: this.settings.get_double('viewport-offset-y'),
@@ -277,6 +278,7 @@ export default class BreezyDesktopExtension extends Extension {
this._effect_settings_bindings = [
'monitor-wrapping-scheme',
+ 'curved-display',
'headset-display-as-viewport-center',
'viewport-offset-x',
'viewport-offset-y',
diff --git a/gnome/src/math.js b/gnome/src/math.js
index f1c9983..0eebd6c 100644
--- a/gnome/src/math.js
+++ b/gnome/src/math.js
@@ -17,4 +17,49 @@ export function diagonalToCrossFOVs(diagonalFOVRadians, aspectRatio) {
horizontal: 2 * Math.atan(Math.tan(flatHorizontalFOV / 2)),
vertical: 2 * Math.atan(Math.tan(flatVerticalFOV / 2))
}
+}
+
+const segmentsPerRadian = 20.0 / degreeToRadian(90.0);
+
+// displays are placed around a circle, these functions help determine radians and distances from the original
+// FOV measurements scaled to the display dimensions
+export const fovConversionFns = {
+ // convert curved FOV for flat displays
+ flat: {
+ // distance to an edge is the hypothenuse of the triangle where the opposite side is half the width of the reference fov screen
+ centerToFovEdgeDistance: (centerDistance, fovLength) => Math.sqrt(Math.pow(fovLength / 2, 2) + Math.pow(centerDistance, 2)),
+ fovEdgeToScreenCenterDistance: (edgeDistance, screenLength) => Math.sqrt(Math.pow(edgeDistance, 2) - Math.pow(screenLength / 2, 2)),
+ lengthToRadians: (fovRadians, fovLength, screenEdgeDistance, toLength) => Math.asin(toLength / 2 / screenEdgeDistance) * 2,
+ angleToLength: (fovRadians, fovLength, screenDistance, toAngleOpposite, toAngleAdjacent) => {
+ return toAngleOpposite / toAngleAdjacent * screenDistance
+ },
+ radiansToSegments: (screenRadians) => 1
+ },
+
+ // convert curved FOV for curved displays, scaling either involves no change or is linear
+ curved: {
+ centerToFovEdgeDistance: (centerDistance, fovLength) => centerDistance,
+ fovEdgeToScreenCenterDistance: (edgeDistance, screenLength) => edgeDistance,
+ lengthToRadians: (fovRadians, fovLength, screenEdgeDistance, toLength) => fovRadians / fovLength * toLength,
+ angleToLength: (fovRadians, fovLength, screenDistance, toAngleOpposite, toAngleAdjacent) => fovLength / fovRadians * Math.atan2(toAngleOpposite, toAngleAdjacent),
+ radiansToSegments: (screenRadians) => Math.ceil(screenRadians * segmentsPerRadian)
+ }
+}
+
+export const applyQuaternionToVector = (vector, quaternion) => {
+ const t = [
+ 2.0 * (quaternion[1] * vector[2] - quaternion[2] * vector[1]),
+ 2.0 * (quaternion[2] * vector[0] - quaternion[0] * vector[2]),
+ 2.0 * (quaternion[0] * vector[1] - quaternion[1] * vector[0])
+ ];
+ return [
+ vector[0] + quaternion[3] * t[0] + quaternion[1] * t[2] - quaternion[2] * t[1],
+ vector[1] + quaternion[3] * t[1] + quaternion[2] * t[0] - quaternion[0] * t[2],
+ vector[2] + quaternion[3] * t[2] + quaternion[0] * t[1] - quaternion[1] * t[0]
+ ];
+}
+
+export const normalizeVector = (vector) => {
+ const length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
+ return [vector[0] / length, vector[1] / length, vector[2] / length];
}
\ No newline at end of file
diff --git a/gnome/src/metadata.json b/gnome/src/metadata.json
index 0f8073b..f3064c8 100644
--- a/gnome/src/metadata.json
+++ b/gnome/src/metadata.json
@@ -5,7 +5,7 @@
"settings-schema": "com.xronlinux.BreezyDesktop",
"session-modes": ["user"],
"shell-version": [
- "45", "46", "47"
+ "46", "47", "48"
],
"url": "https://github.com/wheaney/breezy-desktop"
}
\ No newline at end of file
diff --git a/gnome/src/virtualdisplayeffect.js b/gnome/src/virtualdisplayeffect.js
index 26be71e..eac98f2 100644
--- a/gnome/src/virtualdisplayeffect.js
+++ b/gnome/src/virtualdisplayeffect.js
@@ -5,7 +5,7 @@ import GObject from 'gi://GObject';
import Shell from 'gi://Shell';
import Globals from './globals.js';
-import { degreeToRadian, diagonalToCrossFOVs } from './math.js';
+import { degreeToRadian, diagonalToCrossFOVs, fovConversionFns } from './math.js';
// these need to mirror the values in XRLinuxDriver
@@ -26,6 +26,89 @@ function lookAheadMS(imuDateMs, lookAheadCfg, override) {
return (override === -1 ? lookAheadCfg[0] : override) + dataAge;
}
+// Create a mesh of vertices in a pattern suitable for TRIANGLE_STRIP
+function createVertexMesh(fovDetails, monitorDetails, positionVectorNWU) {
+ let fovConversions = fovDetails.curvedDisplay ? fovConversionFns.curved : fovConversionFns.flat;
+ const sideEdgeDistancePixels = fovConversions.centerToFovEdgeDistance(
+ fovDetails.completeScreenDistancePixels,
+ fovDetails.widthPixels
+ );
+ const horizontalRadians = fovConversions.lengthToRadians(
+ fovDetails.defaultDistanceHorizontalRadians,
+ fovDetails.widthPixels,
+ sideEdgeDistancePixels,
+ monitorDetails.width
+ );
+
+ const topEdgeDistancePixels = fovConversions.centerToFovEdgeDistance(
+ fovDetails.completeScreenDistancePixels,
+ fovDetails.heightPixels
+ );
+ const verticalRadians = fovConversions.lengthToRadians(
+ fovDetails.defaultDistanceVerticalRadians,
+ fovDetails.heightPixels,
+ topEdgeDistancePixels,
+ monitorDetails.height
+ );
+
+ let horizontalWrap = fovDetails.monitorWrappingScheme === 'horizontal';
+ let verticalWrap = fovDetails.monitorWrappingScheme === 'vertical';
+ const xSegments = horizontalWrap ? fovConversions.radiansToSegments(horizontalRadians) : 1;
+ const ySegments = verticalWrap ? fovConversions.radiansToSegments(verticalRadians) : 1;
+
+ const texXLeft = 0;
+ const texYTop = 0;
+ const texXRight = 1;
+ const texYBottom = 1;
+
+ // curve the monitor placments based on the fov, wrapping, and texture coordinates
+ const radius = fovDetails.completeScreenDistancePixels;
+ function v(s, t) {
+ let zOffsetPixels = 0
+
+ const xOffset = s - 0.5;
+ let xOffsetPixels = monitorDetails.width * xOffset;
+ if (fovDetails.curvedDisplay && horizontalWrap) {
+ const xOffsetRadians = xOffset * horizontalRadians;
+ xOffsetPixels = Math.sin(xOffsetRadians) * radius;
+ zOffsetPixels = radius - Math.cos(xOffsetRadians) * radius;
+ }
+ const x = -positionVectorNWU[1] + xOffsetPixels;
+
+ const yOffset = 0.5 - t;
+ let yOffsetPixels = monitorDetails.height * yOffset;
+ if (fovDetails.curvedDisplay && verticalWrap) {
+ const yOffsetRadians = yOffset * verticalRadians;
+ yOffsetPixels = Math.sin(yOffsetRadians) * radius;
+ zOffsetPixels = radius - Math.cos(yOffsetRadians) * radius;
+ }
+ const y = positionVectorNWU[2] + yOffsetPixels;
+ const z = -positionVectorNWU[0] + zOffsetPixels;
+
+ return new Cogl.VertexP3T2({x, y, z, s, t});
+ }
+
+ const vertices = [];
+ for (let j = 0; j < ySegments; j++) {
+ const texY0 = texYTop - (texYTop - texYBottom) * j / ySegments;
+ const texY1 = texYTop - (texYTop - texYBottom) * (j + 1) / ySegments;
+
+ const evenRow = j % 2 === 0;
+ for (let i = 0; i <= xSegments; i++) {
+ // even rows stitch left-to-right, odd rows stitch right-to-left
+ const colIndex = evenRow ? i : xSegments - i;
+
+ const texX = texXLeft + (texXRight - texXLeft) * colIndex / xSegments;
+
+ // bottom then top
+ vertices.push(v(texX, texY1));
+ vertices.push(v(texX, texY0));
+ }
+ }
+
+ return vertices;
+}
+
export const VirtualDisplayEffect = GObject.registerClass({
Properties: {
'monitor-index': GObject.ParamSpec.int(
@@ -35,12 +118,24 @@ export const VirtualDisplayEffect = GObject.registerClass({
GObject.ParamFlags.READWRITE,
0, 100, 0
),
+ 'monitor-details': GObject.ParamSpec.jsobject(
+ 'monitor-details',
+ 'Monitor Details',
+ 'Details about the monitor that this effect is applied to',
+ GObject.ParamFlags.READWRITE
+ ),
'monitor-placements': GObject.ParamSpec.jsobject(
'monitor-placements',
'Monitor Placements',
'Target and virtual monitor placement details, as relevant to rendering',
GObject.ParamFlags.READWRITE
),
+ 'fov-details': GObject.ParamSpec.jsobject(
+ 'fov-details',
+ 'FOV Details',
+ 'Details about the field of view of the headset',
+ GObject.ParamFlags.READWRITE
+ ),
'target-monitor': GObject.ParamSpec.jsobject(
'target-monitor',
'Target Monitor',
@@ -67,20 +162,6 @@ export const VirtualDisplayEffect = GObject.registerClass({
GObject.ParamFlags.READWRITE,
0, Number.MAX_SAFE_INTEGER, 0
),
- 'width': GObject.ParamSpec.int(
- 'width',
- 'Width',
- 'Width of the viewport',
- GObject.ParamFlags.READWRITE,
- 1, 10000, 1920
- ),
- 'height': GObject.ParamSpec.int(
- 'height',
- 'Height',
- 'Height of the viewport',
- GObject.ParamFlags.READWRITE,
- 1, 10000, 1080
- ),
'focused-monitor-index': GObject.ParamSpec.int(
'focused-monitor-index',
'Focused Monitor Index',
@@ -173,10 +254,11 @@ export const VirtualDisplayEffect = GObject.registerClass({
this.connect('notify::display-distance', this._update_display_distance.bind(this));
this.connect('notify::focused-monitor-index', this._update_display_distance.bind(this));
- this.connect('notify::monitor-placements', this._update_display_position_uniforms.bind(this));
- this.connect('notify::monitor-wrapping-scheme', this._update_display_position_uniforms.bind(this));
+ this.connect('notify::monitor-placements', this._update_display_position.bind(this));
this.connect('notify::show-banner', this._handle_banner_update.bind(this));
this.connect('notify::smooth-follow-enabled', this._handle_smooth_follow_enabled_update.bind(this));
+
+ this._update_display_position();
}
_is_focused() {
@@ -194,7 +276,7 @@ export const VirtualDisplayEffect = GObject.registerClass({
if (this.no_distance_ease) {
this._current_display_distance = desired_distance;
- this._update_display_position_uniforms();
+ this._update_display_position();
this.no_distance_ease = false;
return;
}
@@ -231,7 +313,7 @@ export const VirtualDisplayEffect = GObject.registerClass({
this._current_display_distance = this._distance_ease_start +
(1 - Math.cos(progress * Math.PI)) / 2 * (this._distance_ease_target - this._distance_ease_start);
- this._update_display_position_uniforms();
+ this._update_display_position();
}).bind(this));
this._distance_ease_timeline.start();
@@ -266,14 +348,14 @@ export const VirtualDisplayEffect = GObject.registerClass({
// this relies on the slerp function tuned to reach 100% in about 1 second
const progress = smoothFollowSlerpProgress(toggleTimeOffsetMs);
this._current_follow_ease_progress = from + (to - from) * progress;
- this._update_display_position_uniforms();
+ this._update_display_position();
}).bind(this));
this._follow_ease_timeline.connect('completed', (() => {
this._current_follow_ease_progress = to;
this._use_smooth_follow_origin = false;
this.smooth_follow_toggle_epoch_ms = 0;
- this._update_display_position_uniforms();
+ this._update_display_position();
}).bind(this));
this._follow_ease_timeline.start();
@@ -294,35 +376,25 @@ export const VirtualDisplayEffect = GObject.registerClass({
}
}
- // follow_ease transitions this from a rotated display (0.0) to a centered/focused display (1.0)
- _update_display_position_uniforms() {
+ // follow_ease transitions this from a rotated display (progress 0.0) to a centered/focused display (progress 1.0)
+ _update_display_position() {
// this is in NWU coordinates
- const monitorPlacement = this.monitor_placements[this.monitor_index];
-
- // use the center vector with the distance applied to determine how much to move each coordinate, so they all move uniformly
- const inverseAppliedDistance = 1.0 - this._current_display_distance / this.display_distance_default;
- const distanceDelta = monitorPlacement.centerNoRotate.map(coord => coord * inverseAppliedDistance);
- const noRotationVector = monitorPlacement.topLeftNoRotate.map((coord, index) => coord - distanceDelta[index]);
-
- // convert to CoGL's east-down-south coordinates and apply display distance
+ const monitorPlacement = this.monitor_placements[this.monitor_index];
+ const noRotationVector = monitorPlacement.centerNoRotate.map(coord => coord * this._current_display_distance / this.display_distance_default);
const inverse_follow_ease = 1.0 - this._current_follow_ease_progress;
- if (this._current_follow_ease_progress === 0.0) {
- this.set_uniform_float(this.get_uniform_location("u_display_position"), 3,
- [-noRotationVector[1], -noRotationVector[2], -noRotationVector[0]]);
- } else {
- const focusDistanceNorth = monitorPlacement.centerOrigin[0] * inverseAppliedDistance;
- const centerOriginVector = {...monitorPlacement.centerOrigin};
- centerOriginVector[0] -= focusDistanceNorth;
-
+ let finalPositionVector = noRotationVector;
+ if (this._current_follow_ease_progress > 0.0) {
// slerp from the rotated display to the centered display
- const followVector = noRotationVector.map((coord, index) => coord * inverse_follow_ease + centerOriginVector[index] * this._current_follow_ease_progress);
- this.set_uniform_float(this.get_uniform_location("u_display_position"), 3,
- [-followVector[1], -followVector[2], -followVector[0]]);
+ finalPositionVector = noRotationVector.map(coord => coord * inverse_follow_ease);
+ finalPositionVector[0] = noRotationVector[0];
}
+ this._vertices = createVertexMesh(this.fov_details, this.monitor_details, finalPositionVector);
const rotation_radians = this.monitor_placements[this.monitor_index].rotationAngleRadians;
- this.set_uniform_float(this.get_uniform_location("u_rotation_x_radians"), 1, [rotation_radians.x * inverse_follow_ease]);
- this.set_uniform_float(this.get_uniform_location("u_rotation_y_radians"), 1, [rotation_radians.y * inverse_follow_ease]);
+ if (this._initialized) {
+ this.set_uniform_float(this.get_uniform_location("u_rotation_x_radians"), 1, [rotation_radians.x * inverse_follow_ease]);
+ this.set_uniform_float(this.get_uniform_location("u_rotation_y_radians"), 1, [rotation_radians.y * inverse_follow_ease]);
+ }
}
_handle_banner_update() {
@@ -349,7 +421,6 @@ export const VirtualDisplayEffect = GObject.registerClass({
uniform vec4 u_look_ahead_cfg;
uniform mat4 u_projection_matrix;
uniform float u_fov_vertical_radians;
- uniform vec3 u_display_position;
uniform float u_rotation_x_radians;
uniform float u_rotation_y_radians;
uniform vec2 u_display_resolution;
@@ -415,23 +486,6 @@ export const VirtualDisplayEffect = GObject.registerClass({
if (!u_show_banner) {
float aspect_ratio = u_display_resolution.x / u_display_resolution.y;
- float cogl_position_width = cogl_position_mystery_factor * aspect_ratio / u_actor_to_display_ratios.y;
- float cogl_position_height = cogl_position_width / aspect_ratio;
-
- float pos_z_factor = aspect_ratio / u_actor_to_display_ratios.y;
- vec3 pos_factors = vec3(
- cogl_position_width / u_display_resolution.x,
- cogl_position_height / u_display_resolution.y,
- cogl_position_mystery_factor * pos_z_factor / u_display_resolution.x
- );
- world_pos.x -= u_display_position.x * pos_factors.x;
- world_pos.y -= u_display_position.y * pos_factors.y;
- world_pos.z = u_display_position.z * pos_factors.z;
-
- // if the perspective includes more than just our viewport actor, move vertices towards the center of the perspective so they'll be properly rotated
- world_pos.x += u_actor_to_display_offsets.x * cogl_position_width / 2;
- world_pos.y -= u_actor_to_display_offsets.y * cogl_position_height / 2;
-
vec3 complete_vector = applyXRotationToVector(world_pos.xyz, u_rotation_x_radians);
complete_vector = applyYRotationToVector(complete_vector, u_rotation_y_radians);
@@ -447,10 +501,9 @@ export const VirtualDisplayEffect = GObject.registerClass({
vec3 look_ahead_vector = applyLookAhead(rotated_vector_t0, velocity_t0, effective_look_ahead_ms);
- vec3 adjusted_lens_vector = u_lens_vector * pos_factors;
- world_pos = vec4(look_ahead_vector - adjusted_lens_vector, world_pos.w);
+ world_pos = vec4(look_ahead_vector - u_lens_vector, world_pos.w);
- world_pos.z /= pos_z_factor;
+ world_pos.z /= aspect_ratio / u_actor_to_display_ratios.y;
world_pos.x *= u_actor_to_display_ratios.y / u_actor_to_display_ratios.x;
@@ -473,28 +526,29 @@ export const VirtualDisplayEffect = GObject.registerClass({
}
vfunc_paint_target(node, paintContext) {
- if (this.imu_snapshots) {
- if (!this._initialized) {
- const aspect = this.target_monitor.width / this.target_monitor.height;
- const fovRadians = diagonalToCrossFOVs(degreeToRadian(Globals.data_stream.device_data.displayFov), aspect);
- const projection_matrix = this.perspective(
- fovRadians.horizontal,
- aspect,
- 0.0001,
- 1000.0
- );
- this.set_uniform_matrix(this.get_uniform_location("u_projection_matrix"), false, 4, projection_matrix);
- this.set_uniform_float(this.get_uniform_location("u_fov_vertical_radians"), 1, [fovRadians.vertical]);
- this.set_uniform_float(this.get_uniform_location("u_display_resolution"), 2, [this.target_monitor.width, this.target_monitor.height]);
- this.set_uniform_float(this.get_uniform_location("u_look_ahead_cfg"), 4, Globals.data_stream.device_data.lookAheadCfg);
- this.set_uniform_float(this.get_uniform_location("u_actor_to_display_ratios"), 2, this.actor_to_display_ratios);
- this.set_uniform_float(this.get_uniform_location("u_actor_to_display_offsets"), 2, this.actor_to_display_offsets);
- this.set_uniform_float(this.get_uniform_location("u_lens_vector"), 3, this.lens_vector);
- this._update_display_position_uniforms();
- this._handle_banner_update();
- this._initialized = true;
- }
+ if (!this._initialized) {
+ this._initialized = true;
+ const aspect = this.target_monitor.width / this.target_monitor.height;
+ const fovRadians = diagonalToCrossFOVs(degreeToRadian(Globals.data_stream.device_data.displayFov), aspect);
+ const projection_matrix = this.perspective(
+ fovRadians.horizontal,
+ aspect,
+ 1.0,
+ 10000.0
+ );
+ this.set_uniform_matrix(this.get_uniform_location("u_projection_matrix"), false, 4, projection_matrix);
+ this.set_uniform_float(this.get_uniform_location("u_fov_vertical_radians"), 1, [fovRadians.vertical]);
+ this.set_uniform_float(this.get_uniform_location("u_display_resolution"), 2, [this.target_monitor.width, this.target_monitor.height]);
+ this.set_uniform_float(this.get_uniform_location("u_look_ahead_cfg"), 4, Globals.data_stream.device_data.lookAheadCfg);
+ this.set_uniform_float(this.get_uniform_location("u_actor_to_display_ratios"), 2, this.actor_to_display_ratios);
+ this.set_uniform_float(this.get_uniform_location("u_actor_to_display_offsets"), 2, this.actor_to_display_offsets);
+ this.set_uniform_float(this.get_uniform_location("u_lens_vector"), 3, this.lens_vector);
+ this._update_display_position();
+ this._handle_banner_update();
+ }
+
+ if (this.imu_snapshots && !this.show_banner) {
let lookAheadSet = false;
if (!this._use_smooth_follow_origin && (!this.smooth_follow_enabled || this._is_focused() || this._current_follow_ease_progress > 0.0)) {
if (this._current_follow_ease_progress > 0.0 && this._current_follow_ease_progress < 1.0) {
@@ -518,8 +572,14 @@ export const VirtualDisplayEffect = GObject.registerClass({
Cogl.PipelineFilter.LINEAR
);
}
- }
- super.vfunc_paint_target(node, paintContext);
+ // skip the actor's default rendering, draw our custom vertices instead
+ const framebuffer = paintContext.get_framebuffer();
+ const coglContext = framebuffer.get_context();
+ const primitive = Cogl.Primitive.new_p3t2(coglContext, Cogl.VerticesMode.TRIANGLE_STRIP, this._vertices);
+ primitive.draw(framebuffer, this.get_pipeline());
+ } else {
+ super.vfunc_paint_target(node, paintContext);
+ }
}
});
\ No newline at end of file
diff --git a/gnome/src/virtualdisplaysactor.js b/gnome/src/virtualdisplaysactor.js
index 538fa8c..9099189 100644
--- a/gnome/src/virtualdisplaysactor.js
+++ b/gnome/src/virtualdisplaysactor.js
@@ -3,35 +3,21 @@ 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';
import { VirtualDisplayEffect, SMOOTH_FOLLOW_SLERP_TIMELINE_MS } from './virtualdisplayeffect.js';
-import { degreeToRadian, diagonalToCrossFOVs } from './math.js';
+import { applyQuaternionToVector, degreeToRadian, diagonalToCrossFOVs, fovConversionFns, normalizeVector } from './math.js';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import Globals from './globals.js';
-function applyQuaternionToVector(vector, quaternion) {
- const t = [
- 2.0 * (quaternion[1] * vector[2] - quaternion[2] * vector[1]),
- 2.0 * (quaternion[2] * vector[0] - quaternion[0] * vector[2]),
- 2.0 * (quaternion[0] * vector[1] - quaternion[1] * vector[0])
- ];
- return [
- vector[0] + quaternion[3] * t[0] + quaternion[1] * t[2] - quaternion[2] * t[1],
- vector[1] + quaternion[3] * t[1] + quaternion[2] * t[0] - quaternion[0] * t[2],
- vector[2] + quaternion[3] * t[2] + quaternion[0] * t[1] - quaternion[1] * t[0]
- ];
-}
-
// if nothing is in focus, take it as soon as it crosses into the monitor's bounds
const FOCUS_THRESHOLD = 0.95 / 2.0;
// if we leave the monitor with some margin, unfocus even if no other monitor is in focus
-const UNFOCUS_THRESHOLD = 1.2 / 2.0;
+const UNFOCUS_THRESHOLD = 1.1 / 2.0;
/**
* Find the vector in the array that's closest to the quaternion rotation
@@ -49,46 +35,56 @@ function findFocusedMonitor(quaternion, monitorVectors, currentFocusedIndex, foc
const lookVector = [1.0, 0.0, 0.0]; // NWU vector pointing to the center of the screen
const rotatedLookVector = applyQuaternionToVector(lookVector, quaternion);
- const xzMagnitude = Math.sqrt(rotatedLookVector[0]*rotatedLookVector[0] + rotatedLookVector[2]*rotatedLookVector[2]);
- const lookUpTheta = Math.atan2(rotatedLookVector[2], rotatedLookVector[0]);
+ // TODO - right now we're using the curved functions to figure out distances even for flat monitors
+ // because it will account for the monitors facing towards us, but this will lose some accuracy
+ const upConversionFns = fovDetails.monitorWrappingScheme === 'vertical' ? fovConversionFns.curved : fovConversionFns.flat;
+ const lookUpPixels = upConversionFns.angleToLength(
+ fovDetails.defaultDistanceVerticalRadians,
+ fovDetails.heightPixels,
+ fovDetails.completeScreenDistancePixels,
+ rotatedLookVector[2],
+ rotatedLookVector[0]
+ );
+ const westConversionFns = fovDetails.monitorWrappingScheme === 'horizontal' ? fovConversionFns.curved : fovConversionFns.flat;
+ const lookWestPixels = westConversionFns.angleToLength(
+ fovDetails.defaultDistanceHorizontalRadians,
+ fovDetails.widthPixels,
+ fovDetails.completeScreenDistancePixels,
+ rotatedLookVector[1],
+ rotatedLookVector[0]
+ );
let closestIndex = -1;
let closestDistance = Infinity;
let currentFocusedDistance = Infinity;
// find the vector closest to the rotated look vector
- monitorVectors.forEach((vector, index) => {
+ monitorVectors.forEach((monitorVector, index) => {
const monitor = monitorsDetails[index];
const monitorAspectRatio = monitor.width / monitor.height;
- // weight the rotation about the y-axis between the two vectors, by the aspect ratio
- const vectorUpTheta = Math.atan2(vector[2], vector[0]);
- const upDelta = lookUpTheta - vectorUpTheta;
- const newLookUpTheta = Math.tan(Math.max(
- -Math.PI,
- Math.min(
- Math.PI,
- upDelta * monitorAspectRatio + vectorUpTheta
- )
- ));
- const weightedLookVector = [
- xzMagnitude * Math.cos(newLookUpTheta),
- rotatedLookVector[1],
- xzMagnitude * Math.sin(newLookUpTheta)
- ];
-
- // find the distance between the monitor vector and weighted look vector
- const distance = Math.acos(
- Math.min(1.0, Math.max(-1.0,
- vector[0] * weightedLookVector[0] +
- vector[1] * weightedLookVector[1] +
- vector[2] * weightedLookVector[2]
- ))
+ // weight the up distance by the aspect ratio
+ const vectorUpPixels = upConversionFns.angleToLength(
+ fovDetails.defaultDistanceVerticalRadians,
+ fovDetails.heightPixels,
+ fovDetails.completeScreenDistancePixels,
+ monitorVector[2],
+ monitorVector[0]
);
+ const upDeltaPixels = (lookUpPixels - vectorUpPixels) * monitorAspectRatio;
- // TODO - this assumes the display is facing towards us, need to account for looking in the "flat" direction
- const distanceFromCenterPixels = fovDetails.completeScreenDistancePixels * Math.tan(distance);
- const distanceFromCenterSizeRatio = distanceFromCenterPixels / monitor.width;
+ const vectorWestPixels = westConversionFns.angleToLength(
+ fovDetails.defaultDistanceHorizontalRadians,
+ fovDetails.widthPixels,
+ fovDetails.completeScreenDistancePixels,
+ monitorVector[1],
+ monitorVector[0]
+ );
+ const westDeltaPixels = lookWestPixels - vectorWestPixels;
+ const totalDeltaPixels = Math.sqrt(upDeltaPixels * upDeltaPixels + westDeltaPixels * westDeltaPixels);
+
+ // threshold is a percentage of width, and height was already properly weighted
+ const distanceFromCenterSizeRatio = totalDeltaPixels / monitor.width;
if (currentFocusedIndex === index) {
currentFocusedDistance = distanceFromCenterSizeRatio * focusedMonitorDistance;
@@ -114,7 +110,7 @@ function findFocusedMonitor(quaternion, monitorVectors, currentFocusedIndex, foc
/***
* @returns {Object} - containing `begin`, `center`, and `end` radians for rotating the given monitor
*/
-function monitorWrap(cachedMonitorRadians, radiusPixels, monitorSpacingPixels, monitorBeginPixel, monitorLengthPixels) {
+function monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorBeginPixel, monitorLengthPixels, lengthToRadianFn) {
let closestWrapPixel = monitorBeginPixel;
let closestWrap = cachedMonitorRadians[monitorBeginPixel];
if (closestWrap === undefined) {
@@ -140,12 +136,11 @@ function monitorWrap(cachedMonitorRadians, radiusPixels, monitorSpacingPixels, m
closestWrap = cachedMonitorRadians[closestWrapPixel];
}
- const spacingRadians = Math.asin(monitorSpacingPixels / 2 / radiusPixels) * 2;
+ const spacingRadians = lengthToRadianFn(monitorSpacingPixels);
if (closestWrapPixel !== monitorBeginPixel) {
// there's a gap between the cached wrap value and this one
const gapPixels = monitorBeginPixel - closestWrapPixel;
- const gapHalfRadians = Math.asin(gapPixels / 2 / radiusPixels);
- const gapRadians = gapHalfRadians * 2;
+ const gapRadians = lengthToRadianFn(gapPixels);
// use Math.floor so if it's negative (this monitor is to the left of or above the closest) it will always
// compenstate for the spacing that's needed at the right/bottom
@@ -157,9 +152,9 @@ function monitorWrap(cachedMonitorRadians, radiusPixels, monitorSpacingPixels, m
cachedMonitorRadians[closestWrapPixel] = closestWrap;
}
- const monitorHalfRadians = Math.asin(monitorLengthPixels / 2 / radiusPixels);
- const centerRadians = closestWrap + monitorHalfRadians;
- const endRadians = centerRadians + monitorHalfRadians;
+ const monitorRadians = lengthToRadianFn(monitorLengthPixels);
+ const centerRadians = closestWrap + monitorRadians / 2;
+ const endRadians = closestWrap + monitorRadians;
// since we're computing the end values for this monitor, cache them too in case they line up with a future monitor
const nextMonitorPixel = monitorBeginPixel + monitorLengthPixels;
@@ -180,62 +175,53 @@ function monitorWrap(cachedMonitorRadians, radiusPixels, monitorSpacingPixels, m
* @param {Object} fovDetails - contains reference widthPixels, heightPixels, horizontal and vertical radians,
* and distance to the center of the screen
* @param {Object[]} monitorDetailsList - contains x, y, width, height (coordinates from top-left)
- * @param {string} monitorWrappingScheme - horizontal, vertical, none
* @param {number} monitorSpacing - visual spacing between monitors, as a percentage of the viewport width
- * @returns {Object[]} - contains NWU vectors pointing to `topLeftNoRotate` and `center` of each monitor
- * and a `rotation` angle for the given wrapping scheme
+ * @returns {Object[]} - contains NWU vectors used for rendering and focused monitor detection
*/
-function monitorsToPlacements(fovDetails, monitorDetailsList, monitorWrappingScheme, monitorSpacing) {
+function monitorsToPlacements(fovDetails, monitorDetailsList, monitorSpacing) {
const monitorPlacements = [];
const cachedMonitorRadians = {};
- Globals.logger.log_debug(`\t\t\tFOV Details: ${JSON.stringify(fovDetails)}, Monitor Wrapping Scheme: ${monitorWrappingScheme}`);
+ Globals.logger.log_debug(`\t\t\tFOV Details: ${JSON.stringify(fovDetails)}`);
- if (monitorWrappingScheme === 'horizontal') {
+ const conversionFns = fovDetails.curvedDisplay ? fovConversionFns.curved : fovConversionFns.flat;
+
+ if (fovDetails.monitorWrappingScheme === 'horizontal') {
// monitors wrap around us horizontally
- // distance to a horizontal edge is the hypothenuse of the triangle where the opposite side is half the width of the reference fov screen
- const sideEdgeRadius = Math.sqrt(Math.pow(fovDetails.widthPixels / 2, 2) + Math.pow(fovDetails.completeScreenDistancePixels, 2));
+ const sideEdgeRadius = conversionFns.centerToFovEdgeDistance(fovDetails.completeScreenDistancePixels, fovDetails.widthPixels);
const monitorSpacingPixels = monitorSpacing * fovDetails.widthPixels;
+ const lengthToRadianFn = (targetWidth) => conversionFns.lengthToRadians(
+ fovDetails.defaultDistanceHorizontalRadians,
+ fovDetails.widthPixels,
+ sideEdgeRadius,
+ targetWidth
+ );
cachedMonitorRadians[0] = -fovDetails.defaultDistanceHorizontalRadians / 2;
horizontalMonitorSort(monitorDetailsList).forEach(({monitorDetails, originalIndex}) => {
- const monitorWrapDetails = monitorWrap(cachedMonitorRadians, sideEdgeRadius, monitorSpacingPixels, monitorDetails.x, monitorDetails.width);
- const monitorCenterRadius = Math.sqrt(Math.pow(sideEdgeRadius, 2) - Math.pow(monitorDetails.width / 2, 2));
- const upTopPixels = monitorDetails.y + (monitorDetails.y / fovDetails.heightPixels) * monitorSpacingPixels;
+ const monitorWrapDetails = monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorDetails.x, monitorDetails.width, lengthToRadianFn);
+ const monitorCenterRadius = conversionFns.fovEdgeToScreenCenterDistance(sideEdgeRadius, monitorDetails.width);
+ const upTopPixels = -monitorDetails.y - (monitorDetails.y / fovDetails.heightPixels) * monitorSpacingPixels;
- // how to place the monitors at the origin (0, 0)
- const westCenterOriginPixels = (monitorDetails.width - fovDetails.widthPixels) / 2;
- const upCenterOriginPixels = (monitorDetails.height - fovDetails.heightPixels) / 2;
+ // offset for aligning this monitor's center with the fov-sized viewport's center
+ const upCenterOffsetPixels = (monitorDetails.height - fovDetails.heightPixels) / 2;
- const upCenterPixels = upTopPixels + upCenterOriginPixels;
+ // this is where our monitor's center is in relation to an fov-sized viewport centered about (0, 0)
+ const upCenterPixels = upTopPixels - upCenterOffsetPixels;
monitorPlacements.push({
originalIndex,
- topLeftNoRotate: [
- monitorCenterRadius,
-
- // west stays aligned with the origin, will apply rotationAngleRadians value during rendering
- -westCenterOriginPixels,
-
- // up is flat when wrapping horizontally, apply it here as a constant, not touched by rendering
- -upTopPixels
- ],
centerNoRotate: [
monitorCenterRadius,
- // west centered about the FOV center
+ // west is centered about the FOV center
0,
// up is flat when wrapping horizontally
- -upCenterPixels
+ upCenterPixels
],
- centerOrigin: [
- monitorCenterRadius,
- -westCenterOriginPixels,
- upCenterOriginPixels
- ],
- centerLook: [
+ centerLook: normalizeVector([
// north is adjacent where radius is the hypotenuse, using monitorWrapDetails.center as the radians
monitorCenterRadius * Math.cos(monitorWrapDetails.center),
@@ -243,68 +229,59 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorWrappingSch
-monitorCenterRadius * Math.sin(monitorWrapDetails.center),
// up is flat when wrapping horizontally
- -upCenterPixels
- ],
+ upCenterPixels
+ ]),
rotationAngleRadians: {
x: 0,
y: -monitorWrapDetails.center
}
});
});
- } else if (monitorWrappingScheme === 'vertical') {
+ } else if (fovDetails.monitorWrappingScheme === 'vertical') {
// monitors wrap around us vertically
- // distance to the top edge is the hypothenuse of the triangle where the opposite side is half the height of the reference fov screen
- const topEdgeRadius = Math.sqrt(Math.pow(fovDetails.heightPixels / 2, 2) + Math.pow(fovDetails.completeScreenDistancePixels, 2));
+ const topEdgeRadius = conversionFns.centerToFovEdgeDistance(fovDetails.completeScreenDistancePixels, fovDetails.heightPixels);
const monitorSpacingPixels = monitorSpacing * fovDetails.heightPixels;
+ const lengthToRadianFn = (targetHeight) => conversionFns.lengthToRadians(
+ fovDetails.defaultDistanceVerticalRadians,
+ fovDetails.heightPixels,
+ topEdgeRadius,
+ targetHeight
+ );
cachedMonitorRadians[0] = -fovDetails.defaultDistanceVerticalRadians / 2;
verticalMonitorSort(monitorDetailsList).forEach(({monitorDetails, originalIndex}) => {
- const monitorWrapDetails = monitorWrap(cachedMonitorRadians, topEdgeRadius, monitorSpacingPixels, monitorDetails.y, monitorDetails.height);
- const monitorCenterRadius = Math.sqrt(Math.pow(topEdgeRadius, 2) - Math.pow(monitorDetails.height / 2, 2));
- const westPixels = monitorDetails.x + (monitorDetails.x / fovDetails.widthPixels) * monitorSpacingPixels;
+ const monitorWrapDetails = monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorDetails.y, monitorDetails.height, lengthToRadianFn);
+ const monitorCenterRadius = conversionFns.fovEdgeToScreenCenterDistance(topEdgeRadius, monitorDetails.height);
+ const westLeftPixels = -monitorDetails.x - (monitorDetails.x / fovDetails.widthPixels) * monitorSpacingPixels;
- // how to place the monitors at the origin (0, 0)
- const westCenterOriginPixels = (monitorDetails.width - fovDetails.widthPixels) / 2;
- const upCenterOriginPixels = (monitorDetails.height - fovDetails.heightPixels) / 2;
+ // offset for aligning this monitor's center with the fov-sized viewport's center
+ const westCenterOffsetPixels = (monitorDetails.width - fovDetails.widthPixels) / 2;
- const westCenterPixels = westPixels + westCenterOriginPixels;
+ // this is where our monitor's center is in relation to an fov-sized viewport centered about (0, 0)
+ const westCenterPixels = westLeftPixels - westCenterOffsetPixels;
monitorPlacements.push({
originalIndex,
- topLeftNoRotate: [
- monitorCenterRadius,
-
- // west is flat when wrapping vertically, apply it here as a constant, not touched by rendering
- westPixels,
-
- // up stays aligned with the origin, will apply rotationAngleRadians value during rendering
- upCenterOriginPixels
- ],
centerNoRotate: [
monitorCenterRadius,
// west is flat when wrapping horizontally
westCenterPixels,
- // west centered about the FOV center
+ // up is centered about the FOV center
0
],
- centerOrigin: [
- monitorCenterRadius,
- -westCenterOriginPixels,
- upCenterOriginPixels
- ],
- centerLook: [
+ centerLook: normalizeVector([
// north is adjacent where radius is the hypotenuse, using monitorWrapDetails.center as the radians
monitorCenterRadius * Math.cos(monitorWrapDetails.center),
// west is flat when wrapping vertically
- -westCenterPixels,
+ westCenterPixels,
// up is opposite where radius is the hypotenuse, using monitorWrapDetails.center as the radians
-monitorCenterRadius * Math.sin(monitorWrapDetails.center)
- ],
+ ]),
rotationAngleRadians: {
x: -monitorWrapDetails.center,
y: 0
@@ -316,38 +293,28 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorWrappingSch
// monitors make a flat wall in front of us, no wrapping
monitorDetailsList.forEach((monitorDetails, index) => {
- const upPixels = monitorDetails.y + (monitorDetails.y / fovDetails.heightPixels) * monitorSpacingPixels;
- const westPixels = monitorDetails.x + (monitorDetails.x / fovDetails.widthPixels) * monitorSpacingPixels;
+ const upTopPixels = -monitorDetails.y - (monitorDetails.y / fovDetails.heightPixels) * monitorSpacingPixels;
+ const westLeftPixels = -monitorDetails.x - (monitorDetails.x / fovDetails.widthPixels) * monitorSpacingPixels;
- // how to place the monitors at the origin (0, 0)
- const westCenterOriginPixels = (monitorDetails.width - fovDetails.widthPixels) / 2;
- const upCenterOriginPixels = (monitorDetails.height - fovDetails.heightPixels) / 2;
+ // offsets for aligning this monitor's center with the fov-sized viewport's center
+ const westCenterOffsetPixels = (monitorDetails.width - fovDetails.widthPixels) / 2;
+ const upCenterOffsetPixels = (monitorDetails.height - fovDetails.heightPixels) / 2;
- const westCenterPixels = westPixels + westCenterOriginPixels;
- const upCenterPixels = upPixels + upCenterOriginPixels;
+ const westCenterPixels = westLeftPixels - westCenterOffsetPixels;
+ const upCenterPixels = upTopPixels - upCenterOffsetPixels;
monitorPlacements.push({
originalIndex: index,
- topLeftNoRotate: [
- fovDetails.completeScreenDistancePixels,
- westPixels,
- -upPixels
- ],
centerNoRotate: [
fovDetails.completeScreenDistancePixels,
westCenterPixels,
- -upCenterPixels
+ upCenterPixels
],
- centerOrigin: [
+ centerLook: normalizeVector([
fovDetails.completeScreenDistancePixels,
- -westCenterOriginPixels,
- upCenterOriginPixels
- ],
- centerLook: [
- fovDetails.completeScreenDistancePixels,
- -westCenterPixels,
- -upCenterPixels
- ],
+ westCenterPixels,
+ upCenterPixels
+ ]),
rotationAngleRadians: {
x: 0,
y: 0
@@ -408,6 +375,12 @@ export const VirtualDisplaysActor = GObject.registerClass({
'Details about the virtual monitors',
GObject.ParamFlags.READWRITE
),
+ 'fov-details': GObject.ParamSpec.jsobject(
+ 'fov-details',
+ 'FOV Details',
+ 'Details about the field of view of the headset',
+ GObject.ParamFlags.READWRITE
+ ),
'monitor-wrapping-scheme': GObject.ParamSpec.string(
'monitor-wrapping-scheme',
'Monitor Wrapping Scheme',
@@ -454,6 +427,13 @@ export const VirtualDisplaysActor = GObject.registerClass({
'Latest IMU quaternion snapshots and epoch timestamp for when it was collected',
GObject.ParamFlags.READWRITE
),
+ 'curved-display': GObject.ParamSpec.boolean(
+ 'curved-display',
+ 'Curved Display',
+ 'Whether the displays are curved',
+ GObject.ParamFlags.READWRITE,
+ false
+ ),
'smooth-follow-enabled': GObject.ParamSpec.boolean(
'smooth-follow-enabled',
'Smooth follow enabled',
@@ -583,6 +563,7 @@ export const VirtualDisplaysActor = GObject.registerClass({
this.target_monitor,
...this.virtual_monitors
];
+ this.focused_monitor_index = -1;
try {
const calibratingBanner = GdkPixbuf.Pixbuf.new_from_file(`${Globals.extension_dir}/textures/calibrating.png`);
@@ -656,6 +637,7 @@ export const VirtualDisplaysActor = GObject.registerClass({
notifyToFunction('monitor-wrapping-scheme', this._update_monitor_placements);
notifyToFunction('monitor-spacing', this._update_monitor_placements);
notifyToFunction('headset-display-as-viewport-center', this._update_monitor_placements);
+ notifyToFunction('curved-display', this._update_monitor_placements);
notifyToFunction('viewport-offset-x', this._update_monitor_placements);
notifyToFunction('viewport-offset-y', this._update_monitor_placements);
notifyToFunction('show-banner', this._handle_banner_update);
@@ -706,7 +688,9 @@ export const VirtualDisplaysActor = GObject.registerClass({
focused_monitor_index: this.focused_monitor_index,
imu_snapshots: this.imu_snapshots,
monitor_index: index,
+ monitor_details: monitor,
monitor_placements: this.monitor_placements,
+ fov_details: this.fov_details,
target_monitor: this.target_monitor,
display_distance: this.display_distance,
display_distance_default: this._display_distance_default(),
@@ -732,6 +716,7 @@ export const VirtualDisplaysActor = GObject.registerClass({
[
'monitor-placements',
+ 'fov-details',
'imu-snapshots',
'smooth-follow-enabled',
'smooth-follow-toggle-epoch-ms',
@@ -785,11 +770,11 @@ export const VirtualDisplaysActor = GObject.registerClass({
const focusedMonitorIndex = findFocusedMonitor(
currentPoseQuat,
- this._monitorsAsNormalizedVectors,
+ this.monitor_placements.map(monitorVectors => monitorVectors.centerLook),
this.focused_monitor_index,
this.display_distance / this._display_distance_default(),
this.smooth_follow_enabled,
- this._fov_details(),
+ this.fov_details,
this._all_monitors
);
@@ -824,6 +809,8 @@ export const VirtualDisplaysActor = GObject.registerClass({
_fov_details() {
const aspect = this.target_monitor.width / this.target_monitor.height;
const fovRadians = diagonalToCrossFOVs(degreeToRadian(Globals.data_stream.device_data.displayFov), aspect);
+
+ // adjusted angles based on how far away the screens are e.g. a closer screen takes up a larger slice of our FOV
const defaultDistanceVerticalRadians = 2 * Math.atan(Math.tan(fovRadians.vertical / 2) / this._display_distance_default());
const defaultDistanceHorizontalRadians = 2 * Math.atan(Math.tan(fovRadians.horizontal / 2) / this._display_distance_default());
@@ -841,10 +828,29 @@ export const VirtualDisplaysActor = GObject.registerClass({
defaultDistanceVerticalRadians,
defaultDistanceHorizontalRadians,
lensDistancePixels,
- completeScreenDistancePixels
+ completeScreenDistancePixels,
+ monitorWrappingScheme: this._actual_wrap_scheme(),
+ curvedDisplay: this.curved_display
};
}
+ _actual_wrap_scheme() {
+ // use automatic wrapping if the none/flat wrapping option is selected and the display is supposed to be curved
+ const noneUseAutomatic = this.monitor_wrapping_scheme === 'none' && this.curved_display;
+ if (this.monitor_wrapping_scheme !== 'automatic' && !noneUseAutomatic) return this.monitor_wrapping_scheme;
+
+ const minX = Math.min(...this._all_monitors.map(monitor => monitor.x));
+ const maxX = Math.max(...this._all_monitors.map(monitor => monitor.x + monitor.width));
+ const minY = Math.min(...this._all_monitors.map(monitor => monitor.y));
+ const maxY = Math.max(...this._all_monitors.map(monitor => monitor.y + monitor.height));
+
+ if ((maxX - minX) / this.target_monitor.width >= (maxY - minY) / this.target_monitor.height) {
+ return 'horizontal';
+ } else {
+ return 'vertical';
+ }
+ }
+
_update_monitor_placements() {
try {
const minX = Math.min(...this._all_monitors.map(monitor => monitor.x));
@@ -859,20 +865,10 @@ export const VirtualDisplaysActor = GObject.registerClass({
const viewportXBegin = this.headset_display_as_viewport_center ? this.target_monitor.x : allDisplaysCenterXBegin;
const viewportYBegin = this.headset_display_as_viewport_center ? this.target_monitor.y : allDisplaysCenterYBegin;
- // collect minimum and maximum x and y values of monitors
- let actualWrapScheme = this.monitor_wrapping_scheme;
- if (actualWrapScheme === 'automatic') {
- // check if there are more monitors in the horizontal or vertical direction, prefer horizontal if equal
- if ((maxX - minX) / this.target_monitor.width >= (maxY - minY) / this.target_monitor.height) {
- actualWrapScheme = 'horizontal';
- } else {
- actualWrapScheme = 'vertical';
- }
- }
- const fovDetails = this._fov_details();
- this.lens_vector = [0.0, 0.0, -fovDetails.lensDistancePixels];
+ this.fov_details = this._fov_details();
+ this.lens_vector = [0.0, 0.0, -this.fov_details.lensDistancePixels];
this.monitor_placements = monitorsToPlacements(
- fovDetails,
+ this.fov_details,
// shift all monitors so they center around the viewport center, then adjusted by the offsets
this._all_monitors.map(monitor => ({
@@ -881,16 +877,8 @@ export const VirtualDisplaysActor = GObject.registerClass({
width: monitor.width,
height: monitor.height
})),
- actualWrapScheme,
this.monitor_spacing / 1000.0
);
-
- // normalize the center vectors
- this._monitorsAsNormalizedVectors = this.monitor_placements.map(monitorVectors => {
- const vector = monitorVectors.centerLook;
- const length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
- return [vector[0] / length, vector[1] / length, vector[2] / length];
- });
} catch (e) {
Globals.logger.log(`ERROR: virtualdisplaysactor.js _update_monitor_placements ${e.message}\n${e.stack}`);
}
diff --git a/ui/po/breezydesktop.pot b/ui/po/breezydesktop.pot
index 378d892..0da859e 100644
--- a/ui/po/breezydesktop.pot
+++ b/ui/po/breezydesktop.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 09:01-0700\n"
+"POT-Creation-Date: 2025-03-16 13:02-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -27,33 +27,33 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr ""
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
msgid "Set Focused Display Distance"
msgstr ""
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
msgid "Set All Displays Distance"
msgstr ""
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
msgid "Focused display"
msgstr ""
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
msgid "All displays"
msgstr ""
@@ -225,276 +225,284 @@ msgstr ""
msgid "Keep the focused display near the center of your view."
msgstr ""
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr ""
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr ""
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
msgid "Virtual displays"
msgstr ""
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
msgid "Rearrange displays"
msgstr ""
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr ""
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
msgid "Display distances"
msgstr ""
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr ""
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr ""
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr ""
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
msgid "Display angling"
msgstr ""
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
msgid "Display spacing"
msgstr ""
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr ""
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
msgstr ""
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr ""
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
msgid "Toggle zoom on focus shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
msgid "Quickly toggle zoom on focus mode."
msgstr ""
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr ""
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr ""
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
msgstr ""
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr ""
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr ""
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
msgid "Remove virtual displays on disable"
msgstr ""
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
msgid "All displays follow mode"
msgstr ""
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr ""
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
"movements, jumps ahead, or is very shaky."
msgstr ""
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr ""
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr ""
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
diff --git a/ui/po/de.po b/ui/po/de.po
index 501a1ce..f21c44a 100644
--- a/ui/po/de.po
+++ b/ui/po/de.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-02 20:54-0700\n"
"Last-Translator: \n"
"Language-Team: German \n"
@@ -29,36 +29,36 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr "Diese Funktion wird von Ihrem Gerät derzeit nicht unterstützt."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
#, fuzzy
msgid "Set Focused Display Distance"
msgstr "Display-Entfernung"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
#, fuzzy
msgid "Set All Displays Distance"
msgstr "Display-Entfernung"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
#, fuzzy
msgid "Focused display"
msgstr "Display-Entfernung"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
#, fuzzy
msgid "All displays"
msgstr "Gebogenes Display"
@@ -232,148 +232,156 @@ msgstr "Folgemodus"
msgid "Keep the focused display near the center of your view."
msgstr "Halten Sie das virtuelle Display Nahe der Mitte Ihres Blickfelds."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "Gebogenes Display"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Zwischen flachen und gebogenen Displays wechseln."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
#, fuzzy
msgid "Virtual displays"
msgstr "Gebogenes Display"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
#, fuzzy
msgid "Rearrange displays"
msgstr "Gebogenes Display"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Einstellungen"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
#, fuzzy
msgid "Display distances"
msgstr "Display-Entfernung"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Ändern"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Folgemodus-Schwelle"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "Wie weit Sie wegschauen können, bevor das Display folgt."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
#, fuzzy
msgid "Display angling"
msgstr "Display-Größe"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
#, fuzzy
msgid "Display spacing"
msgstr "Display-Größe"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Tastenkombinationen"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "XR-Effekt an/aus Tastenkombination"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
@@ -382,41 +390,41 @@ msgstr ""
"Effekt einmalig manuell aktiviert werden, um die Tastenkombination zu "
"aktivieren."
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Display-Zentrierung-Tastenkombination"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Heften Sie das virtuelle Display an die aktuelle Position an."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
#, fuzzy
msgid "Toggle zoom on focus shortcut"
msgstr "Folgemodus-Tastenkombination umschalten"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
#, fuzzy
msgid "Quickly toggle zoom on focus mode."
msgstr "Schnell den Folgemodus wechseln."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Folgemodus-Tastenkombination umschalten"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Schnell den Folgemodus wechseln."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Erweiterte Einstellungen"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Optimale Display-Konfiguration finden"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -424,87 +432,87 @@ msgstr ""
"Ändern Sie die Display-Konfiguration der Brille automatisch zur maximalen "
"Auflösung und besten Skalierung, wenn sie angeschlossen ist."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Höchste Bildwiederholrate verwenden"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"Die Bildwiederholrate kann die Leistung beeinflussen, deaktivieren Sie dies, "
"um sie manuell festzulegen."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Immer primäres Display"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
"Setzen Sie die Brille automatisch als primäres Display, wenn sie "
"angeschlossen ist."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
#, fuzzy
msgid "Remove virtual displays on disable"
msgstr "Gebogenes Display"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
#, fuzzy
msgid "All displays follow mode"
msgstr "Gebogenes Display"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Bewegungsvorausschau"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -515,15 +523,15 @@ msgstr ""
"es sei denn, das virtuelle Display hängt hinter Ihren Kopfbewegungen "
"hinterher, springt vor oder ist sehr wackelig."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "Standard"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "Textskalierung"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr "Text unter 1.0 skalieren simuliert ein höher aufgelöstes Display"
@@ -729,9 +737,6 @@ msgstr "Über BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Breitbildmodus"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Zwischen flachen und gebogenen Displays wechseln."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/es.po b/ui/po/es.po
index b037f9d..34377e9 100644
--- a/ui/po/es.po
+++ b/ui/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-02 20:55-0700\n"
"Last-Translator: \n"
"Language-Team: Spanish \n"
@@ -28,34 +28,38 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr "Esta función no es compatible con tu dispositivo en este momento."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
msgid "Set Focused Display Distance"
msgstr "Ajusta Distancia de Enfoque de la Pantalla"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
-msgstr "Usa un valor más cercano para que la pantalla se acerque cuando la mires."
+msgstr ""
+"Usa un valor más cercano para que la pantalla se acerque cuando la mires."
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
msgid "Set All Displays Distance"
msgstr "Ajusta Todas las Distancias de Pantalla"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr "Usa un valor más alejado para que las pantallas se alejen cuando apartes la vista."
+msgstr ""
+"Usa un valor más alejado para que las pantallas se alejen cuando apartes la "
+"vista."
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-"No se pueden agregar pantallas virtuales en esta máquina. Se requiere Wayland y xdg-desktop-portal."
+"No se pueden agregar pantallas virtuales en esta máquina. Se requiere "
+"Wayland y xdg-desktop-portal."
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
msgid "Focused display"
msgstr "Pantalla enfocada"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
msgid "All displays"
msgstr "Todas las pantallas"
@@ -219,8 +223,8 @@ msgid ""
" "
msgstr ""
"Acercar automáticamente una pantalla cuando la mires.\n"
-"Establece tus distancias preferidas de enfoque y desenfoque en la sección "
-"de Ajustes.\n"
+"Establece tus distancias preferidas de enfoque y desenfoque en la sección de "
+"Ajustes.\n"
" "
#: src/gtk/connected-device.ui:70
@@ -231,143 +235,153 @@ msgstr "Modo de seguimiento"
msgid "Keep the focused display near the center of your view."
msgstr "Mantener la pantalla enfocada cerca del centro de campo visual."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "Pantalla curvada"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Cambiar entre pantallas planas y curvadas."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr "Desactivar pantallas físicas"
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
-msgstr "Desactivar automáticamente todas las pantallas físicas cuando el efecto XR esté habilitado."
+msgstr ""
+"Desactivar automáticamente todas las pantallas físicas cuando el efecto XR "
+"esté habilitado."
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
msgid "Virtual displays"
msgstr "Pantallas virtuales"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr "1080p"
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr "1440p"
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr "Añadir personalizada"
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr "Eliminar resolución personalizada"
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
msgid "Rearrange displays"
msgstr "Reorganizar pantallas"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Ajustes"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
msgid "Display distances"
msgstr "Distancias de la pantalla"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr "Ajusta cómo de cerca quieres que aparezcan las pantallas."
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Cambiar"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Umbral de seguimiento"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "Hasta qué punto puedes mirar antes de que la pantalla siga."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
msgid "Display angling"
msgstr "Inclinación de la pantalla"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr "Cuando hay múltiples pantallas, elige cómo deben inclinarse hacia ti."
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr "Automático"
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr "Inclinación lateral"
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr "Inclinación superior"
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr "Plano"
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
msgid "Display spacing"
msgstr "Separación de pantallas"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr "Poner espacio vacío entre las pantallas, cuando haya varias."
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr "Desplazamiento horizontal del visor"
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr "Mueve el visor a izquierda o derecha de su posición predeterminada."
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr "izquierda"
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr "centro"
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr "derecha"
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr "Desplazamiento vertical del visor"
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr "Mueve el visor arriba o abajo de su posición predeterminada."
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr "abajo"
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr "arriba"
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Atajos de teclado"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "Atajo encendido/apagado Efecto XR"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
@@ -375,39 +389,39 @@ msgstr ""
"Activa o desactiva rápidamente el Efecto XR. Es posible que necesites "
"activar el efecto manualmente una vez para habilitar el atajo."
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Atajo para recentrar la pantalla"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Fije la pantalla virtual en la posición actual."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
msgid "Toggle zoom on focus shortcut"
msgstr "Atajo para alternar el acercamiento al enfocar"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
msgid "Quickly toggle zoom on focus mode."
msgstr "Modo para alternar rápidamente el acercamiento al enfocar."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Atajo para alternar el modo de seguimiento"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Activar el modo de seguimiento."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Configuración Avanzada"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Encuentre la configuración de pantalla óptima"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -416,21 +430,21 @@ msgstr ""
"obtener la máxima resolución y la mejor escalabilidad cuando estén "
"enchufadas."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Utilizar la frecuencia de actualización más alta"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"La frecuencia de actualización puede afectar el rendimiento, deshabilite "
"esto para configurarlo manualmente."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr "Centrar en la pantalla de las gafas"
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
@@ -438,64 +452,67 @@ msgstr ""
"Centrar el visor en la pantalla de las gafas, incluso si la pantalla no está "
"en el centro."
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Siempre como pantalla principal"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
"Automáticamente configurar las gafas como pantalla principal al enchufarse."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
msgid "Remove virtual displays on disable"
msgstr "Eliminar pantallas virtuales al desactivar"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr "Eliminar automáticamente las pantallas virtuales cuando se desactiva el efecto XR."
+msgstr ""
+"Eliminar automáticamente las pantallas virtuales cuando se desactiva el "
+"efecto XR."
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr "Activar la detección de toques múltiples"
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr "Activa el doble toque para recentrar y el triple toque para recalibrar."
+msgstr ""
+"Activa el doble toque para recentrar y el triple toque para recalibrar."
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
msgid "All displays follow mode"
msgstr "Modo de seguimiento de todas las pantallas"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr "El modo de seguimiento mueve todas las pantallas, no solo la enfocada."
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr "Rastreo de movimiento de modo de seguimiento"
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr "Elige qué movimientos deben rastrearse en el modo de seguimiento."
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr "Horizontal"
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr "Vertical"
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr "Inclinación/giro"
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Anticipación de movimiento"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -506,15 +523,15 @@ msgstr ""
"predeterminado a menos que la pantalla virtual se retrase detrás de los "
"movimientos de la cabeza, se adelante o sea muy inestable."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "Predeterminado"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "Escalado de Texto"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
"Escalando el texto por debajo de 1.0 simulará una pantalla de mayor "
@@ -719,9 +736,6 @@ msgstr "Acerca de BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Modo pantalla ancha"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Cambiar entre pantallas planas y curvadas."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/fr.po b/ui/po/fr.po
index 623cecf..b0ebcd5 100644
--- a/ui/po/fr.po
+++ b/ui/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-02 20:54-0700\n"
"Last-Translator: \n"
"Language-Team: French \n"
@@ -31,36 +31,36 @@ msgstr ""
"Cette fonctionnalité n'est actuellement pas prise en charge par votre "
"appareil."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
#, fuzzy
msgid "Set Focused Display Distance"
msgstr "Distance d'affichage"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
#, fuzzy
msgid "Set All Displays Distance"
msgstr "Distance d'affichage"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
#, fuzzy
msgid "Focused display"
msgstr "Distance d'affichage"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
#, fuzzy
msgid "All displays"
msgstr "Affichage incurvé"
@@ -234,148 +234,156 @@ msgstr "Mode de suivi"
msgid "Keep the focused display near the center of your view."
msgstr "Gardez l'affichage virtuel près du centre de votre champ de vision."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "Affichage incurvé"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Basculez entre les affichages plats et incurvés."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
#, fuzzy
msgid "Virtual displays"
msgstr "Affichage incurvé"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
#, fuzzy
msgid "Rearrange displays"
msgstr "Affichage incurvé"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Réglages"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
#, fuzzy
msgid "Display distances"
msgstr "Distance d'affichage"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Changer"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Seuil de suivi"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "Distance jusqu'où vous pouvez regarder avant que l'affichage ne suive."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
#, fuzzy
msgid "Display angling"
msgstr "Taille de l'affichage"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
#, fuzzy
msgid "Display spacing"
msgstr "Taille de l'affichage"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Raccourcis clavier"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "Raccourci on/off de l'effet XR"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
@@ -383,41 +391,41 @@ msgstr ""
"Activez ou désactivez rapidement l'effet XR. Il se peut que vous deviez "
"activer l'effet manuellement une fois pour activer le raccourci."
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Raccourci de recentrage de l'affichage"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Fixez l'affichage virtuel à la position actuelle."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
#, fuzzy
msgid "Toggle zoom on focus shortcut"
msgstr "Raccourci de basculement du mode de suivi"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
#, fuzzy
msgid "Quickly toggle zoom on focus mode."
msgstr "Basculer rapidement le mode de suivi."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Raccourci de basculement du mode de suivi"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Basculer rapidement le mode de suivi."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Paramètres avancés"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Trouver la configuration d'affichage optimale"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -426,87 +434,87 @@ msgstr ""
"résolution maximale et une meilleure mise à l'échelle lorsque elles sont "
"branchées."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Utiliser le taux de rafraîchissement le plus élevé"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"Un taux de rafraîchissement élevé peut affecter les performances, désactivez-"
"le pour le définir manuellement."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Affichage principal en permanence"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
"Définissez automatiquement les lunettes comme affichage principal "
"lorsqu'elles sont branchées."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
#, fuzzy
msgid "Remove virtual displays on disable"
msgstr "Affichage incurvé"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
#, fuzzy
msgid "All displays follow mode"
msgstr "Affichage incurvé"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Prédiction de mouvement"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -516,15 +524,15 @@ msgstr ""
"le temps de rendu. Restez sur la valeur par défaut à moins que l'affichage "
"virtuel ne soit lent, ne saute pas ou ne soit très instable."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "Par défaut"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "Mise à l'échelle du texte"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
"Une mise à l'échelle du texte en dessous de 1.0 simulera un affichage de "
@@ -731,9 +739,6 @@ msgstr "À propos de BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Mode grand écran"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Basculez entre les affichages plats et incurvés."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/it.po b/ui/po/it.po
index b53a1f6..d37bccc 100644
--- a/ui/po/it.po
+++ b/ui/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-02 21:14-0700\n"
"Last-Translator: \n"
"Language-Team: Italian \n"
@@ -29,36 +29,36 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr "Questa funzione non è attualmente supportata sul tuo dispositivo."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
#, fuzzy
msgid "Set Focused Display Distance"
msgstr "Distanza del display"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
#, fuzzy
msgid "Set All Displays Distance"
msgstr "Distanza del display"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
#, fuzzy
msgid "Focused display"
msgstr "Distanza del display"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
#, fuzzy
msgid "All displays"
msgstr "Display curvo"
@@ -232,148 +232,156 @@ msgstr "Modalità di inseguimento"
msgid "Keep the focused display near the center of your view."
msgstr "Mantieni il display virtuale vicino al centro del tuo campo visivo."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr ""
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Passa da display piatti a curvi."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
#, fuzzy
msgid "Virtual displays"
msgstr "Display curvo"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
#, fuzzy
msgid "Rearrange displays"
msgstr "Display curvo"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Regolazioni"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
#, fuzzy
msgid "Display distances"
msgstr "Distanza del display"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Cambia"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Soglia di inseguimento"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "Quanto lontano puoi guardare prima che il display ti segua."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
#, fuzzy
msgid "Display angling"
msgstr "Dimensione del display"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
#, fuzzy
msgid "Display spacing"
msgstr "Dimensione del display"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Scorciatoie da tastiera"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "Scorciatoia per on/off dell'effetto XR"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
@@ -382,41 +390,41 @@ msgstr ""
"abilitare l'effetto manualmente almeno una volta per abilitare la "
"scorciatoia da tastiera."
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Scorciatoia per ricentrare il display"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Fissa il display virtuale alla posizione attuale."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
#, fuzzy
msgid "Toggle zoom on focus shortcut"
msgstr "Scorciatoia per attivare/disattivare la modalità di inseguimento"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
#, fuzzy
msgid "Quickly toggle zoom on focus mode."
msgstr "Attivazione/disattivazione rapida della modalità di inseguimento."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Scorciatoia per attivare/disattivare la modalità di inseguimento"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Attivazione/disattivazione rapida della modalità di inseguimento."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Impostazioni avanzate"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Trova la configurazione ottimale del display"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -424,87 +432,87 @@ msgstr ""
"Modifica automaticamente la configurazione del display degli occhiali per "
"ottenere la massima risoluzione e la migliore scalabilità quando collegati."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Usa la frequenza di aggiornamento più elevata"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"La frequenza di aggiornamento potrebbe influire sulle prestazioni, "
"disabilitala per impostarla manualmente."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Imposta sempre come display primario"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
"Imposta automaticamente gli occhiali come display primario quando sono "
"collegati."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
#, fuzzy
msgid "Remove virtual displays on disable"
msgstr "Display curvo"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
#, fuzzy
msgid "All displays follow mode"
msgstr "Display curvo"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Anticipo del movimento"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -515,15 +523,15 @@ msgstr ""
"che il display virtuale non rimanga indietro rispetto ai tuoi movimenti, non "
"salti in avanti o sia molto tremolante."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "Predefinito"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "Ridimensionamento del testo"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
"Ridimensionando il testo sotto a 1.0 si simula una maggiore risoluzione del "
@@ -729,9 +737,6 @@ msgstr "Informazioni su BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Modalità widescreen"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Passa da display piatti a curvi."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/ja.po b/ui/po/ja.po
index b2ce894..c4f6772 100644
--- a/ui/po/ja.po
+++ b/ui/po/ja.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-02 20:55-0700\n"
"Last-Translator: \n"
"Language-Team: Japanese \n"
@@ -31,33 +31,33 @@ msgstr "メガネを3Dモードに切り替え、表示の幅を2倍にします
msgid "This feature is not currently supported for your device."
msgstr "現在接続されているデバイスはこの機能に対応していません。"
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
msgid "Set Focused Display Distance"
msgstr "フォーカスされたディスプレイ距離"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr "近くに設定すると見たディスプレイにズームインします。"
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
msgid "Set All Displays Distance"
msgstr "すべてのディスプレイ距離"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr "遠くに設定すると視線の外れたディスプレイがズームアウトします。"
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr "仮想ディスプレイが追加できません。"
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
msgid "Focused display"
msgstr "フォーカスされたディスプレイ"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
msgid "All displays"
msgstr "すべてのディスプレイ"
@@ -231,143 +231,151 @@ msgstr "フォローモード"
msgid "Keep the focused display near the center of your view."
msgstr "仮想ディスプレイを視界の中心近くに保ちます。"
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "曲面ディスプレイ"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "平面と曲面ディスプレイを切り替えます。"
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr "物理ディスプレイの無効化"
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr "XRエフェクト有効時、自動的に物理ディスプレイを無効化する。"
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
msgid "Virtual displays"
msgstr "仮想ディスプレイ"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr "1080p"
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr "1440p"
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr "カスタム解像度"
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr "カスタム解像度の削除"
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
msgid "Rearrange displays"
msgstr "ディスプレイの配置"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "調整"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
msgid "Display distances"
msgstr "ディスプレイ距離"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr "ディスプレイの表示距離を設定。"
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "変更"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "フォローしきい値"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "ディスプレイがフォロー(追従)を開始するまでの距離"
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
msgid "Display angling"
msgstr "ディスプレイの向き"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr "複数のディスプレイがある場合、ディスプレイの向きを選択します。"
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr "自動"
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr "横向き"
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr "縦向き"
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr "平面"
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
msgid "Display spacing"
msgstr "ディスプレイの隙間"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr "複数のディスプレイがある場合、ディスプレイ間の隙間を設定します。"
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr "表示域の水平オフセット"
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr "表示域を左右に移動させます。"
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr "左"
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr "中央"
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr "→"
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr "表示域の垂直オフセット"
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr "表示域を上下に移動させます。"
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr "下"
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr "上"
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "キーボードショートカット"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "XRエフェクトの切り替え"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
@@ -375,39 +383,39 @@ msgstr ""
"XRエフェクトの有効・無効を切り替えます。このショートカットを有効にするために"
"手動で1回XRエフェクトを有効にする必要があります。"
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "ディスプレイを中央へ移動"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "仮想ディスプレイを現在の視点に固定します。"
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
msgid "Toggle zoom on focus shortcut"
msgstr "フォーカス時のズーム切り替え"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
msgid "Quickly toggle zoom on focus mode."
msgstr "フォーカス時のズームをすばやく切り替えます。"
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "フォローモードの切り替え"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "フォローモードのオン/オフをすばやく切り替えます。"
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "詳細設定"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "ディスプレイ設定を最適化する"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -415,83 +423,89 @@ msgstr ""
"メガネ接続時、最大解像度と最適なスケーリングのためにディスプレイ設定を自動的"
"に変更します。"
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "最大のリフレッシュレートを使用する"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"リフレッシュレートはパフォーマンスに影響を与える可能性があります。手動で設定"
"する場合は無効にしてください。"
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr "メガネのディスプレイを中央に"
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
-msgstr "ディスプレイが中央にない場合でも、表示域をメガネのディスプレイの中央に配置します。"
+msgstr ""
+"ディスプレイが中央にない場合でも、表示域をメガネのディスプレイの中央に配置し"
+"ます。"
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "常にプライマリディスプレイにする"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr "メガネ接続時、自動的にプライマリディスプレイにします。"
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
msgid "Remove virtual displays on disable"
msgstr "無効時に仮想ディスプレイ削除"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr "XRエフェクト無効時に仮想ディスプレイを自動的に削除します。"
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr "マルチタップ認識を有効化"
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr "ダブルタップで中央へ移動、トリプルタップで再キャリブレーションを有効にします。"
+msgstr ""
+"ダブルタップで中央へ移動、トリプルタップで再キャリブレーションを有効にしま"
+"す。"
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
msgid "All displays follow mode"
msgstr "全画面フォローモード"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
-msgstr "フォローモードはフォーカスされてるディスプレイだけでなく全ての画面が移動します。"
+msgstr ""
+"フォローモードはフォーカスされてるディスプレイだけでなく全ての画面が移動しま"
+"す。"
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr "フォローモード移動設定"
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr "フォローモードで追跡する方法を選択します。"
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr "水平"
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr "垂直"
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr "傾き・回転"
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "動きの先読み"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -501,15 +515,15 @@ msgstr ""
"ます。仮想ディスプレイが頭の動きに遅れたり、先に進んだり、非常に揺れたりする"
"場合を除き、デフォルトのままで問題ありません。"
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "デフォルト"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "テキストスケーリング"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
"テキストを1.0未満にスケーリングすると、高解像度ディスプレイをシミュレートしま"
@@ -712,9 +726,6 @@ msgstr "Breezy Desktopについて"
#~ msgid "Widescreen mode"
#~ msgstr "ワイドスクリーンモード"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "平面と曲面ディスプレイを切り替えます。"
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo
index 812e9502e3a15fc28187b3514492752b19fdd3a7..d3a9d90e81440c62796534cbaef0cacaa4916709 100644
GIT binary patch
delta 2041
zcmY+^S!`5Q9LMoLWx61=*n(|=w%k&vIAUq7MM^2Hc0pOnzJ!oqnO<774&W4f8(M+?#31-LeclN9HKkEm2$L4J1K_20q>#}7~g{R@@C
zG~OojQJIV43|xx*Y%`UIomhznuoj1rq}Y87lp@{T2W6-koxqtmj7ssZ$UAK&qie({
z>iiq1rTP%{;uEOUpTYGwhI&yoqg;%QsOR^g_R8UDz2B^|o(tn)JJf!ExHw@|4Z
z#{~ZC`uDLOjLqIbEzLnH?Uj?Lft|%2Y}#LN2`;3wferq80n5($Z)cEy-S87{lVixf
zuyJJY7GavRaG(Dn_1V<;WPU&YfR_x^EL|LNVkW_Ac_XK`IYV;cIvm4`5Y5J~q-g
zhwKZR$~UNymEd!@3>RQGY8M|v?SWCuW=1zr8Mw{X*8m@)He*&vc-?eVs*CVxEJqEj
z4f!H1*hNFTd!Oq#f|}V$)DoOVrT!{vW}{e(cX0%xj8+5s)2V6d{w!2Ricl|#qB2>7
z8c-dQ$-r7@DD~Tr!P{QsXP;21{}d_{m$4r2<2tM=4KwxuMmg@sFYqFAiEU?RYhv$V
z7k-5r*pxD}m(jyn`u<}ySPl!&!{bbMmrpq4>PqHJs>RJ6;rKNb@j
zlnR&IvScgFjGC*6mk2E#EA^=OsaB(FC^e;oMy}bYyhyYX)r6Kv;HrKzAQq$~C
zJcFx=N@At!TZ-C1`Wz?&zhz9S*Lte3q_%;`CD_QxGLiauViU2Ds3B721sdxIN;3;;
z+GsVUx={Im=ru}cd?RR(`yAyl6+xv$8%l+tuCPb9LMo5u6vO}f8_etO;P?AqUfq5e=7e%EglG)@c+RSEVWcm00+)j`D*7v-A=XcIM=llEqey8`P_e-32v7QE_
zl@nu$r~SJqHh08DjH)93v!`=7-i!g7fSqvURC038=*n|_X9fSA>
zl}K*1*&QrIpQiek4wEt;Ptgs-k;z&jPQ)Zs=0&LcHsBcCisWDp4#(r}`32N-uDIhj
zFpKjRJdNK``TD)nhPD&cwLvnN-bD|#q7r(7D&0%hkEn|EpdX{jLW!ht2w*m5
zU?t|@F{B9g09BbbbPmw@Mn^N+#nVRPF;r&i7HSp-i2jYi+Vvj
zW@8uXxyfX$y%9t$=~C2vRdLi`ot+HmLDlY!^{5hta4$Bx<9^nG94rO3Bv~A^H;PdS
zRpBN!={}r~ueq4VhK@~S8M$7@OLYGp*IGaIXZbC}0Lj`l)ULgUT7rkjv+OyNgLSyq
zf1rN%8#SXS%Emh^6;;7p4gsvdD%_8?_y*VE7Rtglu-gtDW!8$*u@k3ZJl~>rZ2@ZS
z9gJp1M^K41u+_EsLa6IkQ6+A|G;BsC^a1(O>=$Y?`^NX4Pe)D2$)>|3tQ1x9ZKxUT
z#2h?~(pcqLXAR&!Qd>LRF#(^`aJ31)rc2YC~199aZ`-NG|3LL@MN1Dji)YLRDZR
z2JtAa!AGc4`IF72U^<3yEpo}eqGlGymfnszsKhSeBD{qZ)qWz?w}h15-(_IAzW+6J
z^nxpxkGD}J>_$Ee3#78Hn8`tVq#QNA19_%Zqh@;1^)g=O{HA+eNp@O_t*FY@pe9_e
zbKY-P>GVUDUrV9&*S}*m?dqw-JYo`|#_f>`sXtinF{ssx3Itf@ZL#Y6_-BQ$HZvbsudinF5k#8#np&O%~|JEn#0Yb)un
z2_iMm#jL&y$nK78Z~fO%tqKXXbfScqNh~MS77(hVJ_A}^k9TlT-8!3R@FixI(p%IwjFGPzmlE^caSyI{`(j!6gzt
diff --git a/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo
index 048a704d2acb5f8773d9a4f2a996c73d10b0f9f8..a216226e9fa1d8d547e0457a51159f823b21ec16 100644
GIT binary patch
delta 3363
zcmZA33rtpJ9LMoT<&}$a6}fnUR}@77@d79$L4suBB{jt>`67^)S0rA%kkX5m_wYux
z*@~Jq&E+g(vYfhRE8ScrbEeBRBQq=Ky4dD2ZT9`0bJ(nB{Lklk&N=USp6CBO=jhp0
z*H`{j1X`e?8tOF9Z(tY>V|1Ev4yIr!CSfDy;XBv|
zzsK4505#*8Om8gC!;{#Idfqff6^LaRPyeQhN)R?8$uQecGu-dA-$y<0B(gf@Q&flN
zP!GC}8pth7#uU;(UuG)mxr?zcdQrdMit48c{YvSZR5ZiGn1kn#ESWCkU)Q5h14uxf
zPj=ebsHMrnES!jY@I_R|5v+@h$81bO?UlKx0eIucziwF135{$MYDU{JANS%IyohAg
zgv8q>pfWTH`7=cvG_W#s<4PQXyDOkG_0QobC
zoYaVOQF~$vG8WT}y6*^TCKs>(zeD;kZeAt5O}QL~VJYgqji`+7MLoa8Plaro6R01y
zV+!8F8Q6<;(a5WCEc#Hp`3TaNX+!?ZMGjhu-%;1^;{tRg*qJQHV%i5#6Zi%7Tz}U@
zdyT?TC*n{eOGe#TfJ*ILEWu^y!Zy@^PoX-zjM^g|=)<3oPlcK9w$CqhtU=ws23c~y
z*+4~Wz8N)xov6LAAGO9Us185GuGog!-6xO@Z@xlh@CFw0fx3_SVCAzuG5lc8Ks!S#
zlkEXFA^X!D!ce{cpHR^ZzeLU8n&Xe?qJ7)(4yxn7P!9+lY~P=Znm`(I$z-AiHqSX<
zgSvk$Y7_59?TL3Wk^apEDueJh)J&p>*qbC3%V>|m`S=>Xfp_pA?qZ|N#O$HQOvde~
z56l&0dCg7CL>Im3ZOFy(xEx7}If{Ng_#%}+9G+_5kd4u#upX6}ooV)i-$HG+qo}q0
z0<{URqV~dF)Sih*w=*}?F$3wsWMK#{!Y6TgI{DXbZ{-BbWxhpq_z*KNVz~XF0@Pk8
zMx}5L(wFgKG44mDyaV<7yVxBAd5AI^hH59H29Sp1a7+gIKTf5N6Tvu)JOyDU=3^eJ
z;|A0k?!q2;2wm8U%G?Po!ZVnM-ACG)DMH?4vj~-e1|+HGJ=9*gxQPdiqLOu8o+=LmU**th0AH%QFjgj1}OpL-6I1!cEHq-#V!6*#KGUjRY$5LTG
znI)(jc4ID{M5XR7Mq_BUy~atX@54CMCMre!ZXIe(4`L+#irQ@Yeyd%Gx^EV;I;IhO
z>;3vvEyeSqpPjCIj-
zVlW2#J7zkTU>Ewg)=gi$I${b@O3WuzW)pjfC2COi*qCkTBb3t4vXzQD9^#yshV)?-
zR>SNd77{NI>xp>6AHiW2@dQyws3?7lRH1YwUa@L+mNrn=$3?rkvphvbOQ+IIXk+R1
z>@3P+0ik6jIoA5Wh~2dQDoWEVVmeVy)DxX0oyy~c_Q3Yelc@JsWgbyOtR<2NwvYA3
ztiXN5PD0D2@)EJss@aD~r+;gs#Bq+#fK~E2dI_zY)?7ue-#X$sB9>?*1`;aE2z|)r
z5YH3K36)*MW~-+EZ1Q#ybDg#}Z(q%S4Z&u#{tH!!9%3l*XbE!~RXC9dCdLyph;TyR
zgj!-GQBCk_S(_QmVB%$BwHlPsHrCM}1Oo^Sq=aZ9HWDhy#A2d>NF^2!j~3oY>)(Sd
zIFl$No+18UiZ~HM6cZzyixZIVN`mz<8ARh*VzP5lBob3w7xp|K6jr#Zc6DWiyJD%Y
z#_OqX9o)M)Fv(qBS+}OLvf5qc_0+jN)fMi=|GCRIy!E4g4dLOQ>N=0t>#?qSDm<;}
kX+H!Hs&!XZ*VR_KYn-b-HxI7%_}ulK_wn=K?9&1N0+V4>)Bpeg
delta 3229
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
U>G1ee(s5Hy#`2VRB41|z2L=#sB~S
delta 1891
zcmZA1eN4?!9LMo*y6z<+g(Or$5b_qC{azc+Xx$LOWfaEXSWLrlxCF;wHLk-t+<{$KggL{_M&MyoV9hukZ{lR^!EF44
z3M4Dk>>d`NM@#)ngGHH#Su`LFS*%6kRE$AIUW6LA9;0zH5`%d$3{N=UTT$~|bNX*!
zI^Q2+1O7zKQ$G@w>INE0;RWPl9r^+9qYFDx0X;{h?zQ7*RL1%-3PXuPfh2H=#SBcv
zO3cLLND}NZDl@OpyO+if8d}kIW*d*kQK@Z1=C&`Gi~Y{;SwyQXT8Db@b}Yww)B}1j
z1A9^P#u2s7MmB0oi&5jMBFMiQwRC8rea^sUR0=QRE^Kr9qu2*xuz1v#q;t{PScVFy
z3Kw%o>o5@?@MAg$x|bgn$Rr-3=Pcl&Kq{ihKigroba0OyKs~qtmGX1Q@vuv%%v?vE
z>Zhm`b)oL-#yI?jlQ4|IQ!oX$UmJ6MGqh(^zS;H9A(UScAC#aTF(cQGFeQGp!A
zZaj@TbXz&o
zWq1b_v5RG8U^pJb64dMY7N=o9?!?K=uGF_+HQq(7bOPy6z)3h07vV;||J!Jgb$fG6LqDTPAfmqjgeF~*8eUnaQa=i#%YTszLTCtw=a3bX_xO)cu$D$
O&BS4D->50ggZ=@_cBrWU
diff --git a/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo
index 56522b118b0cfc78f32556b15e016bea22e77034..4686867254bd41cc32a14b715c3ee65e3054a5af 100644
GIT binary patch
delta 1698
zcmXxke@Inl9LMpma_`ZmX{n{Ravi-jM=kH13w6=@0o_^YT$(!CAg*28Za-X3OA7L?
zMrh=SxHylfko_@65xqa%!DV=tKH;#Zi1LpTFR
zF$4cXO)-HE{)2h=FY0&cJj8h17SPcTf}Cb!2OtUQP
zM+J5PU&f!X82`qVm^CvQNDW@+x&hOaYBs+nDa%Ji>LSTn2`
zah!!`z3Z=0^IY@BzsKcVkKze*vXk?ik}CB%Ix68Ml=YOb*
zW$^X@7NP>F;N)U8zKSud!ZS!Q>=vpr;~3vh$Hy$ns2k_u8B}S%Mc!eLaW!TTrS8|D
zmgoc2i@Q-JKZW)9BkDzYL|chPsQI^`_Q*ce(teUl{q^8!2INK5goECLBdAjTfgL#J
zjn}gt#ANTImZpu9_Q1TlbU|*s#
zzKU9cUs1dGCNh`(j@o3CsKC-GhxR}=DuDU82+J^tO{h{Izz=Z%KSzghY|?d{4*S9$
z;fwebmti5_Vi|74Rd^8f!XeBgqn}YP{*7o23C3qcGfe8#_K~XY;tys?WZoG)+a4lAorasqWxDzj<5-4OH8n7IR
z(RxsUe1VJg{SVV|8F+w==w|^H;d`iwyKoJDhsxv$mZFchY44OH`_jVr5^h2M$=M;)
z^L;pgCsBLqH6GHEufRNgHXG=ugj+R$U6_InO>3m}YEFFS52b8O4EekKVXhkzRZeiu
z+w^q2L#v{_NqZ~N?&PM_C5|{1GitaF(KaN0aTd;0aylrC)hDK${J>^hZrl6u
tzSgK4jdkqV71`fWI@pu5WcIvhWO~Hi6N_|q#@xvBCu609mx8^i&j67OxQYM(
delta 1620
zcmXxkSx8h-9LMqhgfo-rWR2BmWolZs*OZd2mZgrSmR3g5gDnq1WDh-6RLG}IN_2RjobI(0<&j0++xgIIGS{#1mkE%7U
z3d%^z<9=pg+~wxRwcTr$;4-Vhk9eZLSrY9#2bjgj&}N24gY~!yqPL2#4Z2T!q!R6+18wb7IW~;(k^YAY!
zkhwmy8@LF)TIxS4EXur$q7H+Q#aaNzU@|K5JXF6mI082yF<2M};bG^w9yLyr(|!fB
zcy7bv_zN}8!8lZ^k5f?!&me!+tQU9_qwpRophu|GJ$3wm%Ge)FL?2NokPL1qn2pnL
zHO|6AND}N0Dl<(T3w8RB9WMvF!^kz(3CWxkRfiT7{ap3d`{zYJx7z
z#*e6RQ;Aw6OpjLDY=imjr
zh25ykoJ;Pt2?IR0pay#2w0ENp?I+Zs{pP&?g{;kdDZP$Ih74OC6@s*lI05&fGSH0q
z_!<@9*i^F_n28s06Xs$Z%hYFDj+=2iY60(YIsQiGwo>**fmWgV@5hz;{x4HeWG*%^
z7n5)yR-#sL9;e_X)Zux7oJaeLV^O2=&&)DV{ikCC&PHYIIcl%ppw7~FROa0Lc!)lS
zBq}cSP_#GNr;12}d#bA_((bNy^JwLfLQmSz5>>gDQf5)+Q}QEwJn^p5NUdjP^b($@
zQVJu_JjuQl)O3*mD~q_ifkfp)OUb14UCQaQNYER|DyF6c^j!*)HCh2>w$m7eE1kLs
UweI$+X8-^I
diff --git a/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo
index 60fc913ccf6b3aaa90a3869b31c4f3dce8043fe1..e3fd491205490b22a72fc8824c2fe31499d2ccf2 100644
GIT binary patch
delta 3359
zcmZA3drX#90LSs8f&v;Kh@c3*q8MIK6fvMo@}Ae!gg`~P7KTUyf=RvtdCx0p(VC5rRTs?0Ui5DYsrca
zqftvU29t0K?!eWkj)Pej*$YQw3~H}rq6SbL!TjrjYEEcmYf(?M3CH42dAl2I{(6)Qs*#-M_(2h1oXEs4t$w
zIJ|{(FqC!C$O|zU%TT-dFw&Pfj{KSP9JCa7P@g}*1?U^?%w#T3qP-vW05?(hb$9IR
ztWgl^LfgY
za0uST2^dXdBLx>Zlik@mGGfXhxIs?_Ff#s6kbN{0iR*clSbhH+VQ9X&OvR$
zOw@H1w!PJU{*m=4>U$?_`wCXjZXL$_r&7rp?o8P()Qu0JMtID&uh@1gYHEXcx%*)(
zR^epS08XJ^*Pk&6Z(}!XL*3VZgkvyHrX47x81%%yxR(={OWMkYwb(Zj(nvYq=D4
z!)-VdzrlqV!hGp`DMsP})LNcG-M9ty{Y%#S7(qL7jPw0bsQ*vwL>KPH?)Vw{>;3EVH*{aV#ZOB!;lj4KI&bN_LU0q$^RW
zBSqetbLejS_x>1Y(+syCvNWccXr1(LfC}5gtRgRyaI%KvK0a;`+PCZtmOfsax-SOd+Oft)E)NJ9%yQe
f|Fdh*@6Ap6wB|$Svih9Cq4lLn;Z5680)77lmg8w%
delta 3229
zcmZA3eN0zX9LMpmf`A|jC=VJaii)Ozpcvo-rh%!Xi1||l6%`*TEmZO${fVIFLx~ur
zb7^z6Y_`?<*-}gAn*LK;)0sBQ71>OiuH{y4X3O56dylPk=J&qNx%d9gJ?DGQy?B1(
zn;U}PCxo{eWiOFR91Ax)hov1kP^vqbrL;4fhc|IutXUf87j!Y}iVc{6t*DFE8K{o4Fdhq$F&oojE$
zMB0Z@13Qir@pGJkv2?P6=i5RmZ*k%h7Gpirk)L5_Y|rR4<9Hl^+1LkX;wW5?J@5nu
z@N3jW1~I*S%*9W!79%l}QFX^`jNb~L>@~@Fi=7eT64U4c6AIAeoHtnMG1}a1M
zQ7Me&paExMI_BdLtiS@?f!ZTyQA>6K3-Nbci`hNMzf$xbdDRW)P$|C2K_d?1qV_@(
z@=U8j-M1PwlYKY_k05>8FQ~UDjKiatj=FCWD&>`^{ud)jw9P>(`r&>o#}I175v)r-
zc17*pQlxJSApfk6gO;Efb^QQV;X9}dw(n_Hf@4tw-;V0{Fe>#QxOVV36^-Z|>c%!y
zO7Gz$jPB*X#{twpt56TDN9~PGxDvM^p9Z_{&UZ}rug9V8Pev_uZ`4xvMYD>yS;fs_(5}qKhV_v{)~q^$Dx*@44Io%
zW4PY`AQg?M3H9Jz&K6`fY#%B^AEP=rj}h30>gWb)U=f-A`BYS@Gf>xuIH#aC=W^6r
zaR@VbzFnrG4*$dewi{qpgEMg(p2F9#c%Xm%TbxQehaIL5R3i?;7JL#UTx1
zU4yG>*J2_5h{{xIw*R}_Z1S&>6}S^MsCF&t#@CT$wfAuieuWyqc=D*%vl_eLN>s`l
zQ3GyvzJcRuAH;k3GwS}f9RK&f<&gieoCqUd8hHuo0kx2$bvA}v@HEIA`Q2l*~TEdg4ey-wVj2mG#Tkro|D!OnAHKRMIHH;;H
z>bM)KgTBrZOrgC5>A)IL|6lk4)A1+NcO-n2KY%2>L^~Zd@Vlt~6GuzdKb4BsIs?_w
z5buK7Fw_i2xbwvrOM8NA&u~_vGB_8zVjU*oR&0mL$|^#?PkA-}v&;teM&AvW5?VvHh*zd_WHoFzG0i*UXQYYxF4tCu`w^OGIT4(~
zVF95sk6<5pWd_GOg5~m-rxcS36|L`bujU^%!a{-xdmo?|u`{9l^53F$pYKjoVWif7
zEtLjB?(CUdaLTS~P?_r6iGKN@0lo8723&bpn7
z<`6T91malf^
ccRCXlnv>WP8S0*PD=w6lbvq_Bt}wR4Kf%BzLjV8(
diff --git a/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo
index f9fdcaa0d57874f67416cb6e43b7bf904b8130aa..e49a76321c328f0663f2e62e63bb000cf0e4f7e4 100644
GIT binary patch
delta 3312
zcmZA3eN5F=9LMovfC7pjf*^=qFijyq6ckhhd_Y7gB_BvAy~3#;bZ(Y8x2#;6x&E*=ZM{GDci5^kzxQ>{@BZ$2_@49oVQbyq
zdhZY6{%;z}E}{={!rz#4SQf+wrM8{3bW7ri>
zV*p;l&Un?fzq8)P2xGkFXDaIGG3v&!Fk}2M3ZpOgR9lf+5VRH%4M0Zk=Z
zfi@g~*O4*I6AZ*~(h-ZXsNau3jWZgR$tmd7%1WqYVFQvKbI9Is3N?X?_WD)ZzJuD5
zdzgWbumzLZFAaRsdI5*i{uXsc0@)``AQp9BQZ)J3%+k4_6=h)#=HUozLb7Q-vtC4H
z=r$^af1oBDLc@i9aR}yM7S^K9$N|)r9mSD&0~;|ihWslUuMqUvn*yUW0w)R8aKM=L$Ly#@^nhYvh
zK{o1(0@NNCp$43TPoW2Ox+{gmX~?Ww4(n~Tb%
z2RR0&3e{gT=HqT;4dy1Q-+*NDA4nxW+4&+7)j=_8fD+UmS0USJ*5P>EkLu`GR4RL>
zIKLZ=x<3^=V?JsEMVN~vcnsT6;})lqe`TOF)p=peM-99ewdaRW9h^h0@EcUe*RTY?
z#~GMGo_%|bJh^5+YK3Qz?3-Jti3X(^!{SXp)D}(gQpu&V7DMn9X5wXgJ#Z-RecF?d
z#hT;RyXc}FMK7V4iJDLW#^ZaaiJ!r6yoAr=ZQD*ucdmQKQ(-JK3pK;ds1EmGG=74-
zOUwo2IGCT1^J&5}oIj&ksFk;19)64w_#0}%e#0HpFpTybYc0;u^WQ{e8ed$;=WsAD
zex5|L5;c)`PE{&}5*tv>7$gRt&<=QD^HczJ*_5gr0v-
zmb0g;P#ra)ey|nwgWdM}+tv?I6FP!D@HlF~i>Nbl4I}Y}^>^$=yYon6I^omAazfjk
zqUXP(yhNptm_TTyD!j_-al%Iaj^|sgzd|N_hsMqHHj>*-5-WsJMs?
z#5O|3t5Z6F(0{p#2_2I8L=E94*cD%y#b+JCBAkq??K
zF`4*xVY|I%p1q>KT1w+8VjVG&7)7wXzDK4fs<3Tl1))Q!wCe116m4HFv4EILtRWP<$5+a=FDAiQ95{dT0LVTSlC)N-;zAF9>zUQ&X*4JD0woz$zFirTH
z^18!b5J^M;p<}6%N^Bi@LQ0b|1HVS%atCRbE+FTkURazZucmCBZe%Q@_IFsc|i+cGtVyHRZ1P|GBF!
yrMzq&`9MH6E9zrhb{nRj)7Tug2}N4Rzp7X+M~L$NwK`hfA~o
delta 3185
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
R(<4JKGcH7i-sax({R6Z-n^ph-
diff --git a/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo
index aafc036e4ed0cd73296679bbc5d6ed18ba0e88cd..8aaa3b61a967800a563b81b422cd6a10a6f159dd 100644
GIT binary patch
delta 2020
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
Q+Nv9VFDY#*OW5rFFDbEM761SM
delta 3229
zcmZA3drZ}39LMo*f^t{E8(0criYS7TC`a>>rKXSb3Cfr?
zt)=DCHD`5LGj*;^XT@6C%{5(X{exY!*>cUfY46WDUt8-L-{0$bewXL|`yCD}s$CfR
zF)g;yNDah&L{qHUIV?@!K$@LwmVS@f9K3>SQ_Q+?eqKAX4!9B1uo3mhVNAmJu{EB?
zHh9*{&F%&4Xcn@IWK_}bs2i=lSq#Ks7fixL?1`#4A5(EC(kCm$bS%ftSncIn>_qt>
zs$<7-0-nL?m_j90v~Tmtyupd@a15?yIPw&>#a8rABTmIWSb*6$1Bc@}?1~>^5WhtY
zq#wg8#zH)ai!ly!=v4+5U_9;Hcrpy$%1|Sl>*bZGifWKmu^p&}>QNQFgX%ySd*OAY
z4eP=*#A6=bi$$pCr=Z#iqGoadhBUHjG6AedX2(AF8!n+b(BkK>dHD`%N!qYJMVN}a
zaU81QAKagDFy-G+dnB86QU{7q_l-$s{?)UIoY07-;z*o{LvSB5oA!;{f|{XQs3}b0
zpbqC?78c_GEXM$DN9~cbs3p6AL-8+Mg9Tlge@)R5=2bVGLrw7&4(f3X7qu5UBW+p*
z>b_N|k-UPV@Gw%R{epUnVmS20EYy7^s41U`s=pGMMB5Z1qX%EbG7O`7+=g{2#tx|6
zTZ+_eLFCV>IcN#$QP=lj1s+1pV5{zCV{tU9L{asK?-2=7My^#TgET4=n1W;=`
z0$bx`Y=uG8t}aJ5xGh6XT@4Q6gR~D@D1X(%>?q~qtd9n?;Qr{;Z*+H~I()!AjInzE
zkC9Q2notd&a?hY<;!{+^KcGhP2dbi*s2S6{Co@pz3sF-YK&|~))bl~q5-#!bHtb0I
z_Bt6o7{)?8fsf!-oQ;LO&30h}7GQRc*#lUH`ao?#R?8ZZKWpN^WY}dKinmc64D^Y9
z0n1SBy@nwMVQ-N+fuH$>n%rnlcc4c6Hflugxu;PhX+~Al;$A~FbORHxEw6w&nvQyF
zN>TMxp`Kgcm-*KNoBhOo)NA*q-}r%-Kf%$Q{~k4^8U3Oa<)SJY?B(HJp5Wyv*q`gO
za3}6Wbu1$oKSxs6C4Y`=RRlPUj+dj1aT`F6Cbf%QUN
zAAy>&64Vk^;y|nmkx`F6_8Xc}OVWasn4BMda3!kYdM}?u&D2F4gTJC09KZ&V<53OI
z#gSNr>cBD7-e^XBDMMGuv?J4YL+69`HxJcN0JXbI-NmT;wxc?<7qwK)sQ3PB)Qn#B
z^MB(Dly74iuIC~Be^D2a^=}}f2lo1f1MVSI#YepSE~*v=1xotj?Ixa5fs{l%8p%aJM$B@gQ)*}tp{Xn)lpZGn
zL>)1eP|6}|h@FIzmWaOAJLTL`6-)p7mL^Yug2m`TFLZedBMqC!jMGr5+
zd}0Kl57%=@Nyl2SR=5>>=A#8zSt@sOVALFQSakeE%}P1;QHL^%;8785TK
zdRz2MsH7b|oY4MJ%8U|u1N6a~NlYVF5VMFGL>h57Em4nm5KH|`C2k>}CbVmN6H2jB
zBCqCSp5Ns1FGD14cQ@c>VwaaiKcY3EH%%#**hYkUszfRvMn-acJn&`DFLc+VUPGk^
ziM7Nk;(1~a@&8oMiEKaF;P!FX$;2$Ba9#38@!?sW_QZuVx-}<\n"
"Language-Team: Polish \n"
@@ -28,33 +28,33 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr ""
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
msgid "Set Focused Display Distance"
msgstr ""
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
msgid "Set All Displays Distance"
msgstr ""
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
msgid "Focused display"
msgstr ""
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
msgid "All displays"
msgstr ""
@@ -226,276 +226,284 @@ msgstr ""
msgid "Keep the focused display near the center of your view."
msgstr ""
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr ""
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr ""
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
msgid "Virtual displays"
msgstr ""
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
msgid "Rearrange displays"
msgstr ""
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr ""
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
msgid "Display distances"
msgstr ""
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr ""
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr ""
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr ""
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
msgid "Display angling"
msgstr ""
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
msgid "Display spacing"
msgstr ""
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr ""
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
msgstr ""
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr ""
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
msgid "Toggle zoom on focus shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
msgid "Quickly toggle zoom on focus mode."
msgstr ""
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr ""
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr ""
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
msgstr ""
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr ""
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr ""
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
msgid "Remove virtual displays on disable"
msgstr ""
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
msgid "All displays follow mode"
msgstr ""
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr ""
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
"movements, jumps ahead, or is very shaky."
msgstr ""
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr ""
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr ""
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
diff --git a/ui/po/pt_BR.po b/ui/po/pt_BR.po
index 843ebf3..f5d70f0 100644
--- a/ui/po/pt_BR.po
+++ b/ui/po/pt_BR.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-19 09:39-0700\n"
"Last-Translator: \n"
"Language-Team: Brazilian Portuguese \n"
"Language-Team: Russian \n"
@@ -29,36 +29,36 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr "Эта функция в настоящее время не поддерживается для вашего устройства."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
#, fuzzy
msgid "Set Focused Display Distance"
msgstr "Расстояние дисплея"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
#, fuzzy
msgid "Set All Displays Distance"
msgstr "Расстояние дисплея"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
#, fuzzy
msgid "Focused display"
msgstr "Расстояние дисплея"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
#, fuzzy
msgid "All displays"
msgstr "Изогнутый дисплей"
@@ -232,189 +232,197 @@ msgstr "Режим следования"
msgid "Keep the focused display near the center of your view."
msgstr "Поддерживает виртуальный дисплей вблизи центра вашего зрения."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "Изогнутый дисплей"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Переключается между плоскими и изогнутыми дисплеями."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
#, fuzzy
msgid "Virtual displays"
msgstr "Изогнутый дисплей"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
#, fuzzy
msgid "Rearrange displays"
msgstr "Изогнутый дисплей"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Настройки"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
#, fuzzy
msgid "Display distances"
msgstr "Расстояние дисплея"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Изменить"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Порог следования"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr ""
"Как далеко вы можете отвернуть взгляд, прежде чем дисплей последует за вами."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
#, fuzzy
msgid "Display angling"
msgstr "Размер дисплея"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
#, fuzzy
msgid "Display spacing"
msgstr "Размер дисплея"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Сочетания клавиш"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
msgstr ""
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Сочетание клавиш для перецентровки дисплея"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Фиксировать виртуальный дисплей в текущем положении."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
#, fuzzy
msgid "Toggle zoom on focus shortcut"
msgstr "Сочетание клавиш для переключения режима следования"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
#, fuzzy
msgid "Quickly toggle zoom on focus mode."
msgstr "Быстро переключать режим следования."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Сочетание клавиш для переключения режима следования"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Быстро переключать режим следования."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Дополнительные настройки"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Найти оптимальную конфигурацию дисплея"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -422,87 +430,87 @@ msgstr ""
"Автоматически изменять конфигурацию дисплея очков для максимального "
"разрешения и лучшей масштабирования при подключении."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Использовать высшую частоту обновления"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"Частота обновления может повлиять на производительность, отключите это, "
"чтобы установить ее вручную."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Всегда основной дисплей"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr ""
"Автоматически устанавливать очки в качестве основного дисплея при "
"подключении."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
#, fuzzy
msgid "Remove virtual displays on disable"
msgstr "Изогнутый дисплей"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
#, fuzzy
msgid "All displays follow mode"
msgstr "Изогнутый дисплей"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Прогнозирование движения"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -513,15 +521,15 @@ msgstr ""
"виртуальный дисплей не отстает от движений вашей головы, не опережает или не "
"очень трясётся."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "По умолчанию"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr ""
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
@@ -723,9 +731,6 @@ msgstr "О BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Режим широкого экрана"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Переключается между плоскими и изогнутыми дисплеями."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/sv.po b/ui/po/sv.po
index e8b7ee4..de63a95 100644
--- a/ui/po/sv.po
+++ b/ui/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-16 10:31-0700\n"
"Last-Translator: \n"
"Language-Team: Swedish \n"
@@ -29,36 +29,36 @@ msgstr ""
msgid "This feature is not currently supported for your device."
msgstr "Din enhet stöder inte den här funktionen för tillfället."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
#, fuzzy
msgid "Set Focused Display Distance"
msgstr "Avstånd till skärmen"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
#, fuzzy
msgid "Set All Displays Distance"
msgstr "Avstånd till skärmen"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
#, fuzzy
msgid "Focused display"
msgstr "Avstånd till skärmen"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
#, fuzzy
msgid "All displays"
msgstr "Böjd skärm"
@@ -232,148 +232,156 @@ msgstr "Följningsläge"
msgid "Keep the focused display near the center of your view."
msgstr "Håll den virtuella skärmen nära mitten av din syn."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "Böjd skärm"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Växla mellan platt eller böjd skärm."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
#, fuzzy
msgid "Virtual displays"
msgstr "Böjd skärm"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
#, fuzzy
msgid "Rearrange displays"
msgstr "Böjd skärm"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Justeringar"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
#, fuzzy
msgid "Display distances"
msgstr "Avstånd till skärmen"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Ändra"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Automatisk följtröskel"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "Huvudrörelsetröskel för automatisk efterföljning."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
#, fuzzy
msgid "Display angling"
msgstr "Skärmens storlek"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
#, fuzzy
msgid "Display spacing"
msgstr "Skärmens storlek"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Tangentbordsgenvägar"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "XR-Effekt genväg på/av"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
@@ -381,41 +389,41 @@ msgstr ""
"Skifta snabbt mellan att slå av eller på XR-Effekt. Du kan behöva slå på den "
"manuellt en gång för att genvägen ska fungera."
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Om-centrering tangentbordsgenväg"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Fäst den virtuella skärmen i den nuvarande positionen."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
#, fuzzy
msgid "Toggle zoom on focus shortcut"
msgstr "Växla följ läge kort"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
#, fuzzy
msgid "Quickly toggle zoom on focus mode."
msgstr "Växla snabbt följ läge."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Växla följ läge kort"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Växla snabbt följ läge."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Avancerade inställningar"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Hitta optimal konfiguration till skärmen"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -423,85 +431,85 @@ msgstr ""
"Ändrar automatisk glasögonens skärmkonfiguration för maximal upplösning och "
"bästa skälning när den är ansluten."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Använd högsta uppdateringsfrekvens"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"Uppdateringsfrekvens kan påverka prestanda, inaktivera detta för att ställa "
"in det manuellt."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Alltid primär skärm"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr "Ställer automatisk glasögon som primär skärm när den är ansluten."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
#, fuzzy
msgid "Remove virtual displays on disable"
msgstr "Böjd skärm"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
#, fuzzy
msgid "All displays follow mode"
msgstr "Böjd skärm"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Rörs förväntning"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -510,15 +518,15 @@ msgstr ""
"Motverkar ingångsfördröjning genom förutsägelse av huvudrörelser.Behåll "
"standardinställningen om inte skärmen skakar mycket eller rörsig konstigt."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "Standard"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "Textskalning"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr "Textskalning under 1.0 kommer att simulera en högre skärmupplösning"
@@ -720,9 +728,6 @@ msgstr "Om BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Bredbildsläge"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Växla mellan platt eller böjd skärm."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/uk_UA.po b/ui/po/uk_UA.po
index 109c2f5..c49f522 100644
--- a/ui/po/uk_UA.po
+++ b/ui/po/uk_UA.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-17 10:08-0700\n"
"Last-Translator: \n"
"Language-Team: Ukrainian \n"
@@ -28,36 +28,36 @@ msgstr "Переключає окуляри в режим «бок о бок»
msgid "This feature is not currently supported for your device."
msgstr "Ця функція наразі не підтримується на вашому пристрої."
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
#, fuzzy
msgid "Set Focused Display Distance"
msgstr "Відстань дисплея"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr ""
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
#, fuzzy
msgid "Set All Displays Distance"
msgstr "Відстань дисплея"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr ""
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
msgstr ""
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
#, fuzzy
msgid "Focused display"
msgstr "Відстань дисплея"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
#, fuzzy
msgid "All displays"
msgstr "Викривлений дисплей"
@@ -231,190 +231,198 @@ msgstr "Режим слідування"
msgid "Keep the focused display near the center of your view."
msgstr "Зберігае віртуальний дисплей поблизу центру вашого зору."
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "Викривлений дисплей"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "Переключается між плоскими і викривленими дисплеями."
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr ""
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr ""
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
#, fuzzy
msgid "Virtual displays"
msgstr "Викривлений дисплей"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr ""
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr ""
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr ""
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr ""
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
#, fuzzy
msgid "Rearrange displays"
msgstr "Викривлений дисплей"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "Налаштування"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
#, fuzzy
msgid "Display distances"
msgstr "Відстань дисплея"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr ""
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "Змінити"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "Поріг слідування"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr ""
"Як далеко ви можете відвернути ваш взор, перш ніж дисплей почне слідувати за "
"вами."
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
#, fuzzy
msgid "Display angling"
msgstr "Розмір дисплея"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr ""
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr ""
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr ""
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr ""
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr ""
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
#, fuzzy
msgid "Display spacing"
msgstr "Розмір дисплея"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr ""
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr ""
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr ""
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr ""
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr ""
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr ""
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr ""
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr ""
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr ""
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr ""
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "Сполучення клавіш"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr ""
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
msgstr ""
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "Сполучення клавіш для центрування дисплея"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "Фіксувати віртуальний дисплей у поточній позиції."
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
#, fuzzy
msgid "Toggle zoom on focus shortcut"
msgstr "Сполучення клавіш для перемикання режиму слідування"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
#, fuzzy
msgid "Quickly toggle zoom on focus mode."
msgstr "Швидко перемикати режим слідування."
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "Сполучення клавіш для перемикання режиму слідування"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "Швидко перемикати режим слідування."
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "Додаткові налаштування"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "Знайти оптимальну конфігурацію дисплея"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
@@ -422,85 +430,85 @@ msgstr ""
"Автоматично змінює конфігурацію дисплея окулярів для максимальної роздільної "
"здатності і найкращого масштабування при підключенні."
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "Використовувати найвищу частоту оновлення"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr ""
"Частота оновлення може вплинути на продуктивність, вимкніть це, щоб "
"встановити її вручну."
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr ""
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr ""
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "Завжди основний дисплей"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr "Автоматично встановлює окуляри як основний дисплей при підключенні."
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
#, fuzzy
msgid "Remove virtual displays on disable"
msgstr "Викривлений дисплей"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr ""
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr ""
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr ""
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
#, fuzzy
msgid "All displays follow mode"
msgstr "Викривлений дисплей"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr ""
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr ""
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr ""
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr ""
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr ""
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr ""
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "Прогнозування руху"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -511,15 +519,15 @@ msgstr ""
"віртуальний дисплей відстає від рухів вашої голови, випереджає або дуже "
"тремтить."
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "За замовчуванням"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr ""
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr ""
@@ -720,9 +728,6 @@ msgstr "Про BreezyDesktop"
#~ msgid "Widescreen mode"
#~ msgstr "Режим широкого екрану"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "Переключается між плоскими і викривленими дисплеями."
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/po/zh_CN.po b/ui/po/zh_CN.po
index c70074f..73bf651 100644
--- a/ui/po/zh_CN.po
+++ b/ui/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-03-12 08:49-0700\n"
+"POT-Creation-Date: 2025-03-15 16:43-0700\n"
"PO-Revision-Date: 2024-08-02 20:55-0700\n"
"Last-Translator: \n"
"Language-Team: Chinese (simplified) \n"
@@ -26,34 +26,33 @@ msgstr "切换到并排模式,并将显示宽度翻倍。"
msgid "This feature is not currently supported for your device."
msgstr "您的设备目前不支援此功能。"
-#: src/connecteddevice.py:141
+#: src/connecteddevice.py:142
msgid "Set Focused Display Distance"
msgstr "设定注视中的屏幕的距离"
-#: src/connecteddevice.py:142
+#: src/connecteddevice.py:143
msgid "Use a closer value so the display zooms in when you look at it."
msgstr "近的数值会将您所看向的屏幕放大"
-#: src/connecteddevice.py:149
+#: src/connecteddevice.py:150
msgid "Set All Displays Distance"
msgstr "设定所有屏幕的距离"
-#: src/connecteddevice.py:150
+#: src/connecteddevice.py:151
msgid "Use a farther value so the displays are zoomed out when you look away."
msgstr "远的数值会将您所看向的屏幕缩小"
-#: src/connecteddevice.py:266
+#: src/connecteddevice.py:267
msgid ""
"Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
"portal are required."
-msgstr ""
-"无法增加模拟显示。需要安装xdg-desktop-portal和Wayland"
+msgstr "无法增加模拟显示。需要安装xdg-desktop-portal和Wayland"
-#: src/connecteddevice.py:300
+#: src/connecteddevice.py:301
msgid "Focused display"
msgstr "注视中的屏幕"
-#: src/connecteddevice.py:306
+#: src/connecteddevice.py:307
msgid "All displays"
msgstr "所有的屏幕"
@@ -227,261 +226,269 @@ msgstr "跟随模式"
msgid "Keep the focused display near the center of your view."
msgstr "将注视中的屏幕保持在视野中心附近。"
-#: src/gtk/connected-device.ui:81 src/gtk/no-device.ui:34
+#: src/gtk/connected-device.ui:81
+msgid "Curved display"
+msgstr "曲面显示"
+
+#: src/gtk/connected-device.ui:82
+msgid "Switch between flat and curved displays."
+msgstr "平板和曲面显示模式之间切换。"
+
+#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:34
msgid "Disable physical displays"
msgstr "将所有具体屏幕关闭"
-#: src/gtk/connected-device.ui:82 src/gtk/no-device.ui:35
+#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:35
msgid ""
"Automatically disable all physical displays when the XR effect is enabled."
msgstr "XR效果开启时将所有具体屏幕自动关闭"
-#: src/gtk/connected-device.ui:92
+#: src/gtk/connected-device.ui:104
msgid "Virtual displays"
msgstr "模拟屏幕"
-#: src/gtk/connected-device.ui:108
+#: src/gtk/connected-device.ui:120
msgid "1080p"
msgstr "1080p"
-#: src/gtk/connected-device.ui:109
+#: src/gtk/connected-device.ui:121
msgid "1440p"
msgstr "1440p"
-#: src/gtk/connected-device.ui:110
+#: src/gtk/connected-device.ui:122
msgid "Add custom"
msgstr "增加客制化解析度"
-#: src/gtk/connected-device.ui:124
+#: src/gtk/connected-device.ui:136
msgid "Remove custom resolution"
msgstr "删除客制化解析度"
-#: src/gtk/connected-device.ui:144
+#: src/gtk/connected-device.ui:156
msgid "Rearrange displays"
msgstr "改变屏幕顺序"
-#: src/gtk/connected-device.ui:162
+#: src/gtk/connected-device.ui:174
msgid "Adjustments"
msgstr "调整"
-#: src/gtk/connected-device.ui:166
+#: src/gtk/connected-device.ui:178
msgid "Display distances"
msgstr "屏幕距离"
-#: src/gtk/connected-device.ui:167
+#: src/gtk/connected-device.ui:179
msgid "Set how close you want displays to appear."
msgstr "设定您所希望屏幕离你的距离有多近"
-#: src/gtk/connected-device.ui:188 src/gtk/connected-device.ui:209
-#: src/gtk/connected-device.ui:401 src/gtk/connected-device.ui:430
-#: src/gtk/connected-device.ui:459 src/gtk/connected-device.ui:488
+#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
+#: src/gtk/connected-device.ui:413 src/gtk/connected-device.ui:442
+#: src/gtk/connected-device.ui:471 src/gtk/connected-device.ui:500
msgid "Change"
msgstr "更改"
-#: src/gtk/connected-device.ui:222
+#: src/gtk/connected-device.ui:234
msgid "Follow threshold"
msgstr "跟随触发值"
-#: src/gtk/connected-device.ui:223
+#: src/gtk/connected-device.ui:235
msgid "How far away you can look before the display follows."
msgstr "显示内容开始进行跟随模式前您可以看得多远。"
-#: src/gtk/connected-device.ui:246
+#: src/gtk/connected-device.ui:258
msgid "Display angling"
msgstr "屏幕角度"
-#: src/gtk/connected-device.ui:247
+#: src/gtk/connected-device.ui:259
msgid ""
"When there are multiple displays, choose how they should angle towards you."
msgstr "有多屏幕时,选择屏幕向您倾斜的角度"
-#: src/gtk/connected-device.ui:261
+#: src/gtk/connected-device.ui:273
msgid "Automatic"
msgstr "自动"
-#: src/gtk/connected-device.ui:262
+#: src/gtk/connected-device.ui:274
msgid "Side-angled"
msgstr "侧边弯曲"
-#: src/gtk/connected-device.ui:263
+#: src/gtk/connected-device.ui:275
msgid "Top-angled"
msgstr "上下弯曲"
-#: src/gtk/connected-device.ui:264
+#: src/gtk/connected-device.ui:276
msgid "Flat"
msgstr "平面"
-#: src/gtk/connected-device.ui:274
+#: src/gtk/connected-device.ui:286
msgid "Display spacing"
msgstr "屏幕之间缝隙的距差"
-#: src/gtk/connected-device.ui:275
+#: src/gtk/connected-device.ui:287
msgid "Put empty space between displays, when there are multiple."
msgstr "把多屏幕之间插入一个空间"
-#: src/gtk/connected-device.ui:305
+#: src/gtk/connected-device.ui:317
msgid "Viewport horizontal offset"
msgstr "眼镜视口特定水平偏移"
-#: src/gtk/connected-device.ui:306
+#: src/gtk/connected-device.ui:318
msgid "Move the viewport to the left or right of its default position."
msgstr "将眼镜视口从默认位置左右移动"
-#: src/gtk/connected-device.ui:323
+#: src/gtk/connected-device.ui:335
msgid "left"
msgstr "左"
-#: src/gtk/connected-device.ui:325 src/gtk/connected-device.ui:355
+#: src/gtk/connected-device.ui:337 src/gtk/connected-device.ui:367
msgid "center"
msgstr "中"
-#: src/gtk/connected-device.ui:327
+#: src/gtk/connected-device.ui:339
msgid "right"
msgstr "右"
-#: src/gtk/connected-device.ui:335
+#: src/gtk/connected-device.ui:347
msgid "Viewport vertical offset"
msgstr "眼镜视口特定垂直偏移"
-#: src/gtk/connected-device.ui:336
+#: src/gtk/connected-device.ui:348
msgid "Move the viewport up or down from its default position."
msgstr "将眼镜视口从默认位置上下移动"
-#: src/gtk/connected-device.ui:353
+#: src/gtk/connected-device.ui:365
msgid "down"
msgstr "下"
-#: src/gtk/connected-device.ui:357
+#: src/gtk/connected-device.ui:369
msgid "up"
msgstr "上"
-#: src/gtk/connected-device.ui:372 src/gtk/connected-device.ui:378
+#: src/gtk/connected-device.ui:384 src/gtk/connected-device.ui:390
msgid "Keyboard Shortcuts"
msgstr "键盘快捷键"
-#: src/gtk/connected-device.ui:381
+#: src/gtk/connected-device.ui:393
msgid "XR Effect on/off shortcut"
msgstr "XR效果 开/关 快捷键"
-#: src/gtk/connected-device.ui:382
+#: src/gtk/connected-device.ui:394
msgid ""
"Quickly enable or disable the XR Effect. You may need to enable the effect "
"manually once in order to enable the shortcut."
msgstr "快速启用或禁用 XR 效果。您可能需要先手动启用一次该效果,才能设此快捷键"
-#: src/gtk/connected-device.ui:410
+#: src/gtk/connected-device.ui:422
msgid "Re-center display shortcut"
msgstr "重新居中显示快捷键"
-#: src/gtk/connected-device.ui:411
+#: src/gtk/connected-device.ui:423
msgid "Pin the virtual display to the current position."
msgstr "将虚拟显示固定在当前位置。"
-#: src/gtk/connected-device.ui:439
+#: src/gtk/connected-device.ui:451
msgid "Toggle zoom on focus shortcut"
msgstr "切换注视自动放大模式快捷键"
-#: src/gtk/connected-device.ui:440
+#: src/gtk/connected-device.ui:452
msgid "Quickly toggle zoom on focus mode."
msgstr "快速地切换注视自动放大模式。"
-#: src/gtk/connected-device.ui:468
+#: src/gtk/connected-device.ui:480
msgid "Toggle follow mode shortcut"
msgstr "切换跟随模式快捷键"
-#: src/gtk/connected-device.ui:469
+#: src/gtk/connected-device.ui:481
msgid "Quickly toggle follow mode."
msgstr "快速切换跟随模式。"
-#: src/gtk/connected-device.ui:504 src/gtk/connected-device.ui:514
+#: src/gtk/connected-device.ui:516 src/gtk/connected-device.ui:526
msgid "Advanced Settings"
msgstr "高级设定"
-#: src/gtk/connected-device.ui:518
+#: src/gtk/connected-device.ui:530
msgid "Find optimal display config"
msgstr "寻找最佳显示设定"
-#: src/gtk/connected-device.ui:519
+#: src/gtk/connected-device.ui:531
msgid ""
"Automatically modify the glasses display configuration for maximum "
"resolution and best scaling when plugged in."
msgstr "连接时,可以自动修改眼镜显示设定以表现出最大解析度和最佳的对比。"
-#: src/gtk/connected-device.ui:529
+#: src/gtk/connected-device.ui:541
msgid "Use highest refresh rate"
msgstr "使用最高刷新率"
-#: src/gtk/connected-device.ui:530
+#: src/gtk/connected-device.ui:542
msgid "Refresh rate may affect performance, disable this to set it manually."
msgstr "刷新率可能会影响性能,禁用此功能即可手动设置。"
-#: src/gtk/connected-device.ui:540
+#: src/gtk/connected-device.ui:552
msgid "Center on glasses' display"
msgstr "视口眼镜屏幕固定"
-#: src/gtk/connected-device.ui:541
+#: src/gtk/connected-device.ui:553
msgid ""
"Center the viewport on the glasses' display, even if the display is not in "
"the middle."
msgstr "将眼镜视口对齐眼镜的主要屏幕, 即便此屏幕不在正中间"
-#: src/gtk/connected-device.ui:551
+#: src/gtk/connected-device.ui:563
msgid "Always primary display"
msgstr "每次设置为主要显示"
-#: src/gtk/connected-device.ui:552
+#: src/gtk/connected-device.ui:564
msgid "Automatically set the glasses as the primary display when plugged in."
msgstr "连接时,自动将眼镜设置为主要显示。"
-#: src/gtk/connected-device.ui:562
+#: src/gtk/connected-device.ui:574
msgid "Remove virtual displays on disable"
msgstr "自动模拟屏幕删除"
-#: src/gtk/connected-device.ui:563
+#: src/gtk/connected-device.ui:575
msgid "Automatically remove virtual displays when the XR effect is disabled."
msgstr "XR效果关闭时自动删除所有模拟屏幕"
-#: src/gtk/connected-device.ui:573
+#: src/gtk/connected-device.ui:585
msgid "Enable multi-tap detection"
msgstr "开启多点触控检测"
-#: src/gtk/connected-device.ui:574
+#: src/gtk/connected-device.ui:586
msgid "Enables double-tap to recenter and triple-tap to recalibrate."
msgstr "打开双击重新定位和三击重新校准手势"
-#: src/gtk/connected-device.ui:584
+#: src/gtk/connected-device.ui:596
msgid "All displays follow mode"
msgstr "全屏幕跟随模式"
-#: src/gtk/connected-device.ui:585
+#: src/gtk/connected-device.ui:597
msgid "Follow mode moves all displays, not just the focused one."
msgstr "让跟随模式移动所有的屏幕而不只是注视中的屏幕"
-#: src/gtk/connected-device.ui:601
+#: src/gtk/connected-device.ui:613
msgid "Follow mode movement tracking"
msgstr "跟随模式感应"
-#: src/gtk/connected-device.ui:602
+#: src/gtk/connected-device.ui:614
msgid "Choose which movements should be tracked in follow mode."
msgstr "选择那一些动作会被感应到"
-#: src/gtk/connected-device.ui:617
+#: src/gtk/connected-device.ui:629
msgid "Horizontal"
msgstr "水平动作"
-#: src/gtk/connected-device.ui:637
+#: src/gtk/connected-device.ui:649
msgid "Vertical"
msgstr "垂直动作"
-#: src/gtk/connected-device.ui:657
+#: src/gtk/connected-device.ui:669
msgid "Tilt/roll"
msgstr "倾斜及滚转动作"
-#: src/gtk/connected-device.ui:675
+#: src/gtk/connected-device.ui:687
msgid "Movement look-ahead"
msgstr "移动预测"
-#: src/gtk/connected-device.ui:676
+#: src/gtk/connected-device.ui:688
msgid ""
"Counteracts input lag by predicting head-tracking position ahead of render "
"time. Stick with default unless virtual display drags behind your head "
@@ -490,15 +497,15 @@ msgstr ""
"透过预测头部追踪位置,提前于渲染时间进行预测来抵消输入延迟。除非虚拟显示滞后"
"于头部,提前跳动或非常抖动,请尽量使用默认设置。"
-#: src/gtk/connected-device.ui:694
+#: src/gtk/connected-device.ui:706
msgid "Default"
msgstr "默认"
-#: src/gtk/connected-device.ui:706
+#: src/gtk/connected-device.ui:718
msgid "Text Scaling"
msgstr "字体大小比例"
-#: src/gtk/connected-device.ui:707
+#: src/gtk/connected-device.ui:719
msgid "Scaling text below 1.0 will simulate a higher resolution display"
msgstr "字体缩放小于1.0,将模拟解析度更高的显示效果"
@@ -696,9 +703,6 @@ msgstr "关于 Breezy Desktop"
#~ msgid "Widescreen mode"
#~ msgstr "宽屏模式"
-#~ msgid "Switch between flat and curved displays."
-#~ msgstr "平板和曲面显示模式之间切换。"
-
#~ msgid ""
#~ "Closer appears larger, further appears smaller. Controls depth when in "
#~ "widescreen mode."
diff --git a/ui/src/connecteddevice.py b/ui/src/connecteddevice.py
index 3a4f78e..28e8bce 100644
--- a/ui/src/connecteddevice.py
+++ b/ui/src/connecteddevice.py
@@ -36,6 +36,7 @@ class ConnectedDevice(Gtk.Box):
follow_threshold_scale = Gtk.Template.Child()
follow_threshold_adjustment = Gtk.Template.Child()
follow_mode_switch = Gtk.Template.Child()
+ curved_display_switch = Gtk.Template.Child()
top_features_group = Gtk.Template.Child()
virtual_displays_row = Gtk.Template.Child()
add_virtual_display_menu = Gtk.Template.Child()
@@ -86,7 +87,7 @@ class ConnectedDevice(Gtk.Box):
# self.display_size_scale,
self.follow_mode_switch,
self.follow_threshold_scale,
- # self.curved_display_switch,
+ self.curved_display_switch,
self.add_virtual_display_menu,
self.add_virtual_display_button,
self.change_all_displays_distance_button,
@@ -109,7 +110,7 @@ class ConnectedDevice(Gtk.Box):
# self.settings.bind('display-size', self.display_size_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
self.settings.bind('follow-threshold', self.follow_threshold_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
# self.settings.bind('widescreen-mode', self.widescreen_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- # self.settings.bind('curved-display', self.curved_display_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
+ self.settings.bind('curved-display', self.curved_display_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
self.settings.bind('headset-display-as-viewport-center', self.headset_display_as_viewport_center_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
self.settings.bind('headset-as-primary', self.headset_as_primary_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
self.settings.bind('remove-virtual-displays-on-disable', self.remove_virtual_displays_on_disable_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
@@ -430,13 +431,3 @@ class ConnectedDevice(Gtk.Box):
def _launch_display_settings(self, *args):
self._settings_displays_app_info.launch()
-
-def reload_display_distance_toggle_button(widget):
- distance = SettingsManager.get_instance().settings.get_double(widget.get_name())
- if distance: widget.set_label(str(distance))
-
-def on_set_display_distance_toggle(widget):
- settings = SettingsManager.get_instance().settings
- distance = settings.get_double('display-distance')
- settings.set_double(widget.get_name(), distance)
- reload_display_distance_toggle_button(widget)
diff --git a/ui/src/gtk/connected-device.ui b/ui/src/gtk/connected-device.ui
index 4025201..9a465a6 100644
--- a/ui/src/gtk/connected-device.ui
+++ b/ui/src/gtk/connected-device.ui
@@ -76,6 +76,18 @@
+
+
+
Disable physical displays