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 zuyJJY7Gav&#RaG(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&cwL&#vnN-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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 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 @@ + + + Curved display + Switch between flat and curved displays. + 2 + + + 3 + + + + Disable physical displays