diff --git a/.gitmodules b/.gitmodules
index a9ce0e4..574786d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -8,12 +8,12 @@
[submodule "modules/sombrero"]
path = modules/sombrero
url = https://github.com/wheaney/sombrero.git
-[submodule "ui/modules/PyXRLinuxDriverIPC"]
- path = ui/modules/PyXRLinuxDriverIPC
- url = https://github.com/wheaney/PyXRLinuxDriverIPC.git
[submodule "gnome/src/shared"]
path = gnome/src/shared
url = git@github.com:wheaney/breezy-desktop-shared-js.git
[submodule "kwin/src/qml/shared"]
path = kwin/src/qml/shared
url = git@github.com:wheaney/breezy-desktop-shared-js.git
+[submodule "ui-gtk"]
+ path = ui-gtk
+ url = git@github.com:wheaney/breezy-desktop-ui-gtk.git
diff --git a/bin/package_gnome b/bin/package_gnome
index 54dc930..cfa7b72 100755
--- a/bin/package_gnome
+++ b/bin/package_gnome
@@ -9,30 +9,12 @@ 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
+UI_DIR=$ROOT_DIR/ui-gtk
XR_DRIVER_DIR=$ROOT_DIR/modules/XRLinuxDriver
-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 build process for backports
- echo "Building Breezy GNOME backport \"$GNOME_BACKPORT\" for $ARCH"
-
- # strip the prefix "gnome-" from the backport name, if it's there
- GNOME_BACKPORT_NAME=${GNOME_BACKPORT#gnome-}
-
- 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
-
- pushd $GNOME_DIR
- git submodule update --init
- popd
-fi
+echo "Building Breezy GNOME for $ARCH, GNOME versions 45 and up"
+GNOME_DIR=$ROOT_DIR/gnome
+BUILD_FILE_NAME=breezyGNOME-$ARCH.tar.gz
GNOME_BUILD_DIR=$GNOME_DIR/build
mkdir -p $GNOME_BUILD_DIR
@@ -97,7 +79,7 @@ popd
UI_BUILD_ARTIFACT=$UI_DIR/out/breezyUI-$ARCH.tar.gz
if [ ! -e "$UI_BUILD_ARTIFACT" ] || [ "$1" == "--rebuild-ui" ] || [ "$1" == "--rebuild-all" ]; then
pushd $UI_DIR
- RUNTIME_DIR=$GNOME_DIR/ui bin/package $ARCH
+ bin/package "$ROOT_DIR/VERSION" "$GNOME_DIR/ui" "$ARCH"
popd
fi
tar -xf $UI_BUILD_ARTIFACT -C $PACKAGE_DIR
diff --git a/box/ui/breezyboxruntimeenvironment.py b/box/ui/breezyboxruntimeenvironment.py
deleted file mode 100644
index 4df6f45..0000000
--- a/box/ui/breezyboxruntimeenvironment.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""Breezy Box runtime environment (headless).
-
-Stub implementation for the headless "Breezy Box" environment. Unlike the GNOME
-environment there is no shell extension to install/enable, no verification step,
-and no in-app update prompt. The connected-device view is always shown (with a
-fallback label when no glasses are connected).
-
-Virtual-display support is not yet implemented here; flesh out
-``_create_virtual_display_manager`` / ``is_virtual_display_supported`` against
-the box backend when it exists.
-
-This module is packaged into the UI's ``runtimes`` subpackage by the box package
-flow, so its imports are relative to the installed ``breezydesktop`` package.
-"""
-
-import logging
-
-from ..runtimeenvironment import RuntimeEnvironment
-
-logger = logging.getLogger('breezy_ui')
-
-
-class BreezyBoxRuntimeEnvironment(RuntimeEnvironment):
- APP_NAMESPACE = 'breezy_box'
-
- def __init__(self):
- super().__init__()
- # On the box the effect is always engaged; there's no extension to gate
- # it behind.
- self._breezy_enabled = True
-
- # is_installed(), verify(), check_for_update(), enable()/disable() and the
- # NullVirtualDisplayManager defaults from RuntimeEnvironment are all
- # appropriate for the box stub.
-
- @property
- def shows_no_device_view(self):
- # Always show the connected-device view; no_device_label() supplies the
- # text shown when no glasses are connected.
- return False
diff --git a/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml b/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml
index 399c9da..cb4ea3a 120000
--- a/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml
+++ b/gnome/src/schemas/com.xronlinux.BreezyDesktop.gschema.xml
@@ -1 +1 @@
-../../../ui/data/com.xronlinux.BreezyDesktop.gschema.xml
\ No newline at end of file
+../../../ui-gtk/data/com.xronlinux.BreezyDesktop.gschema.xml
\ No newline at end of file
diff --git a/ui-gtk b/ui-gtk
new file mode 160000
index 0000000..74d9c34
--- /dev/null
+++ b/ui-gtk
@@ -0,0 +1 @@
+Subproject commit 74d9c34066f2f9b63a381a3baafa3f01d5c1ff5b
diff --git a/ui/bin/dev/use_local_ui.sh b/ui/bin/dev/use_local_ui.sh
deleted file mode 100755
index c641c6f..0000000
--- a/ui/bin/dev/use_local_ui.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-USER_HOME=$(realpath ~)
-ARCH=$(uname -m)
-
-# https://stackoverflow.com/a/246128
-SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
-
-if [ -z "$XDG_DATA_HOME" ]; then
- XDG_DATA_HOME="$USER_HOME/.local/share"
-fi
-
-if [ -z "$XDG_BIN_HOME" ]; then
- XDG_BIN_HOME="$USER_HOME/.local/bin"
-fi
-
-
-# create temp directory
-tmp_dir=$(mktemp -d -t breezy-gnome-XXXXXXXXXX)
-pushd $tmp_dir > /dev/null
-echo "Created temp directory: ${tmp_dir}"
-
-echo "Extracting to: ${tmp_dir}/breezy_ui"
-tar -xf $SCRIPT_DIR/../../out/breezyUI-${ARCH}.tar.gz
-
-echo "Installing the Breezy Desktop UI application"
-cp -r breezy_ui/data/* $XDG_DATA_HOME
-cp -r breezy_ui/bin/* $XDG_BIN_HOME
-
-# update copied files to use the local XDG paths
-ESCAPED_XDG_DATA_HOME=$(printf '%s\n' "$XDG_DATA_HOME" | sed -e 's/[\/&]/\\&/g')
-sed -i -e "s/\/usr\/local\/share/$ESCAPED_XDG_DATA_HOME/g" $XDG_BIN_HOME/breezydesktop
-sed -i "/Exec/c\Exec=$XDG_BIN_HOME/breezydesktop" $XDG_DATA_HOME/applications/com.xronlinux.BreezyDesktop.desktop
-
-glib-compile-schemas $XDG_DATA_HOME/glib-2.0/schemas
-update-desktop-database $XDG_DATA_HOME/applications
-gtk-update-icon-cache
-
-popd > /dev/null
-rm -rf $tmp_dir
\ No newline at end of file
diff --git a/ui/bin/package b/ui/bin/package
deleted file mode 100755
index d5b2fa6..0000000
--- a/ui/bin/package
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env bash
-
-# exit when any command fails
-set -e
-
-ARCH=${ARCH:-$(uname -m)}
-echo "Building Breezy UI for $ARCH"
-
-# Directory containing the RuntimeEnvironment implementation(s) to bundle. Every
-# *.py in here is copied into the UI's runtimes/ package; the first
-# RuntimeEnvironment subclass found at startup becomes the active environment.
-# Defaults to the reference GNOME implementation so a standalone UI build (e.g.
-# local dev) still has a runtime.
-RUNTIME_DIR=${RUNTIME_DIR:-$(realpath "$(dirname "$0")/../../gnome/ui")}
-echo "Bundling runtime environment from $RUNTIME_DIR"
-if [ ! -d "$RUNTIME_DIR" ]; then
- echo "Runtime directory $RUNTIME_DIR does not exist"
- exit 1
-fi
-
-BUILD_PATH=build
-UI_BUILD_PATH=$BUILD_PATH/ui
-PACKAGE_DIR=$BUILD_PATH/breezy_ui
-mkdir -p $UI_BUILD_PATH
-mkdir -p $PACKAGE_DIR
-
-meson setup $UI_BUILD_PATH
-pushd $UI_BUILD_PATH
-meson compile
-popd
-
-# mimick the XDG directory structure in our archive file so setup can just copy the directories and not individual files
-PACKAGE_DATA_DIR=$PACKAGE_DIR/data
-PACKAGE_BIN_DIR=$PACKAGE_DIR/bin
-
-# these are all subdirectories of XDG_DATA_HOME
-PACKAGE_BREEZY_DIR=$PACKAGE_DATA_DIR/breezydesktop
-PACKAGE_BREEZY_SRC_DIR=$PACKAGE_BREEZY_DIR/breezydesktop
-PACKAGE_ICONS_DIR=$PACKAGE_DATA_DIR/icons/hicolor
-PACKAGE_LOCALE_DIR=$PACKAGE_DATA_DIR/locale
-PACKAGE_APPS_DIR=$PACKAGE_DATA_DIR/applications
-PACKAGE_SCHEMAS_DIR=$PACKAGE_DATA_DIR/glib-2.0/schemas
-
-mkdir -p $PACKAGE_BIN_DIR
-mkdir -p $PACKAGE_BREEZY_SRC_DIR
-mkdir -p $PACKAGE_ICONS_DIR
-mkdir -p $PACKAGE_LOCALE_DIR
-mkdir -p $PACKAGE_APPS_DIR
-mkdir -p $PACKAGE_SCHEMAS_DIR
-
-cp src/*.py $PACKAGE_BREEZY_SRC_DIR
-cp -r lib $PACKAGE_BREEZY_SRC_DIR
-
-# bundle the runtimes subpackage and the selected runtime implementation(s)
-PACKAGE_RUNTIMES_DIR=$PACKAGE_BREEZY_SRC_DIR/runtimes
-mkdir -p $PACKAGE_RUNTIMES_DIR
-cp src/runtimes/__init__.py $PACKAGE_RUNTIMES_DIR
-cp $RUNTIME_DIR/*.py $PACKAGE_RUNTIMES_DIR
-cp -L modules/PyXRLinuxDriverIPC/xrdriveripc.py $PACKAGE_BREEZY_SRC_DIR
-cp $UI_BUILD_PATH/src/breezydesktop.gresource $PACKAGE_BREEZY_DIR
-cp -r po/mo/* $PACKAGE_LOCALE_DIR
-cp data/com.xronlinux.BreezyDesktop.gschema.xml $PACKAGE_SCHEMAS_DIR
-cp $UI_BUILD_PATH/src/breezydesktop $PACKAGE_BIN_DIR
-cp $UI_BUILD_PATH/src/virtualdisplay $PACKAGE_BIN_DIR
-cp $UI_BUILD_PATH/data/com.xronlinux.BreezyDesktop.desktop $PACKAGE_APPS_DIR
-
-mkdir -p $PACKAGE_ICONS_DIR/64x64/apps
-mkdir -p $PACKAGE_ICONS_DIR/128x128/apps
-mkdir -p $PACKAGE_ICONS_DIR/256x256/apps
-mkdir -p $PACKAGE_ICONS_DIR/1024x1024/apps
-rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 64 -h 64 -o $PACKAGE_ICONS_DIR/64x64/apps/com.xronlinux.BreezyDesktop.png
-rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 128 -h 128 -o $PACKAGE_ICONS_DIR/128x128/apps/com.xronlinux.BreezyDesktop.png
-rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 256 -h 256 -o $PACKAGE_ICONS_DIR/256x256/apps/com.xronlinux.BreezyDesktop.png
-rsvg-convert data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg -w 1024 -h 1024 -o $PACKAGE_ICONS_DIR/1024x1024/apps/com.xronlinux.BreezyDesktop.png
-
-pushd $BUILD_PATH
-
-tar -zcvf breezyUI-$ARCH.tar.gz breezy_ui
-
-popd
-
-mkdir -p out
-cp $BUILD_PATH/breezyUI-$ARCH.tar.gz out/
-
-rm -rf $BUILD_PATH
\ No newline at end of file
diff --git a/ui/bin/update_pot_files b/ui/bin/update_pot_files
deleted file mode 100755
index 962980c..0000000
--- a/ui/bin/update_pot_files
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-
-SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
-
-pushd $SCRIPT_DIR/..
-
-xgettext --from-code=UTF-8 -k_ -kN_ -L Python -o po/breezydesktop.pot src/*.py
-xgettext --from-code=UTF-8 -k_ -kN_ -j -L Glade -o po/breezydesktop.pot src/gtk/*.ui
-
-for file in po/*.po; do
- lang=${file##*/}
- lang=${lang%.po}
-
- msgmerge --no-fuzzy-matching --update "po/$lang.po" po/breezydesktop.pot
-
- outdir="po/mo/$lang/LC_MESSAGES"
- mkdir -p "$outdir"
- msgfmt -o "$outdir/breezydesktop.mo" "$file"
-done
-
-popd
\ No newline at end of file
diff --git a/ui/data/com.xronlinux.BreezyDesktop.desktop.in b/ui/data/com.xronlinux.BreezyDesktop.desktop.in
deleted file mode 100644
index 0cee462..0000000
--- a/ui/data/com.xronlinux.BreezyDesktop.desktop.in
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Name=Breezy Desktop
-Exec=breezydesktop
-Icon=com.xronlinux.BreezyDesktop
-Terminal=false
-Type=Application
-Categories=GTK;
-StartupNotify=true
diff --git a/ui/data/com.xronlinux.BreezyDesktop.gschema.xml b/ui/data/com.xronlinux.BreezyDesktop.gschema.xml
deleted file mode 100644
index 7a9fc9a..0000000
--- a/ui/data/com.xronlinux.BreezyDesktop.gschema.xml
+++ /dev/null
@@ -1,293 +0,0 @@
-
-
-
-
-
- backslash']]]>
-
- Toggle the XR Effect on or off
-
- Shortcut to toggle the XR Effect.
-
-
-
-
- space']]]>
-
- Re-center display
-
- Shortcut to re-center the virtual display.
-
-
-
-
- Return']]]>
-
- Trigger change to display distance
-
- Shortcut to change the display distance.
-
-
-
-
- 0']]]>
-
- Toggle follow mode
-
- Shortcut to toggle follow mode.
-
-
-
-
- period']]]>
-
- Move cursor to focused display
-
- Shortcut to move the cursor to the focused display.
-
-
-
-
- 1.05
-
- Display distance
-
- How far away the display appears. Farther will look smaller, closer will look larger.
-
-
-
-
- 15
-
- Follow threshold
-
- When follow mode is enabled: the threshold, in degrees, at which the display will begin to follow
-
-
-
-
- 0.85
-
- Display distance start
-
- Start distance when using the "change distance" shortcut.
-
-
-
-
- 1.05
-
- Display distance end
-
- End distance when using the "toggle display distance" shortcut.
-
-
-
-
- false
-
- Widescreen mode
-
- Enable widescreen/SBS mode
-
-
-
-
- 1.0
-
- Display size
-
- The size of the display
-
-
-
-
- "cm"
-
- Measurement units
-
- Units to display for physical measurements: "cm" or "in"
-
-
-
-
- 0.0
-
- Viewport offset x
-
- How far to offset the viewport from the target monitor in the x direction
-
-
-
-
- 0.0
-
- Viewport offset y
-
- How far to offset the viewport from the target monitor in the y direction
-
-
-
-
- "automatic"
-
- Monitor wrapping scheme
-
- How the monitors are wrapped around the viewport
-
-
-
-
- 0
-
- Monitor spacing
-
- How far apart the monitors are visually (not logically)
-
-
-
-
- false
-
- Curved display
-
- Enable curved display mode
-
-
-
-
- -1
-
- Look-ahead override
-
- Manually override the look-ahead calculation
-
-
-
-
- true
-
- Use optimal monitor configuration
-
- Automatically set the optimal monitor configuration upon connection
-
-
-
-
- false
-
- Headset as primary
-
- Automatically set the headset as the primary display upon connection
-
-
-
-
- false
-
- Headset display as viewport center
-
- Use the headset display as the reference point for the center of the viewport
-
-
-
-
- true
-
- Use highest refresh rate
-
- Automatically set the highest refresh rate upon connection
-
-
-
-
- true
-
- Fast SBS mode switching
-
- Enable fast SBS mode switching
-
-
-
-
- false
-
- Disable anti-aliasing
-
- Disable anti-aliasing
-
-
-
-
- true
-
- Disable physical displays
-
- Disable physical displays when XR effect is enabled
-
-
-
-
- true
-
- Remove virtual displays on disable
-
- Remove virtual displays when XR effect is disabled
-
-
-
-
- false
-
- Legacy follow mode
-
- Enable legacy follow mode
-
-
-
-
- false
-
- Developer mode
-
- Enable developer mode
-
-
-
-
- false
-
- Log debug messages
-
- Log debug messages
-
-
-
-
- false
-
- Debug no device
-
- Debug no device
-
-
-
-
- ""
-
- Custom monitor product
-
- Custom monitor product
-
-
-
-
- 0.0
-
- Framerate cap
-
- Framerate cap
-
-
-
-
diff --git a/ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in b/ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in
deleted file mode 100644
index b16137d..0000000
--- a/ui/data/com.xronlinux.BreezyDesktop.metainfo.xml.in
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
- com.xronlinux.BreezyDesktop.desktop
- CC0-1.0
- GPL-3.0-or-later
- Breezy Desktop
- XR Desktop Control Panel
-
- XR Desktop Control Panel
-
-
- Office
- Development
-
-
diff --git a/ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg b/ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg
deleted file mode 100644
index 45aed09..0000000
--- a/ui/data/icons/hicolor/scalable/apps/com.xronlinux.BreezyDesktop.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/ui/data/icons/meson.build b/ui/data/icons/meson.build
deleted file mode 100644
index 919bfad..0000000
--- a/ui/data/icons/meson.build
+++ /dev/null
@@ -1,7 +0,0 @@
-application_id = 'com.xronlinux.BreezyDesktop'
-
-scalable_dir = 'hicolor' / 'scalable' / 'apps'
-install_data(
- scalable_dir / ('@0@.svg').format(application_id),
- install_dir: get_option('datadir') / 'icons' / scalable_dir
-)
diff --git a/ui/data/meson.build b/ui/data/meson.build
deleted file mode 100644
index 71c25bd..0000000
--- a/ui/data/meson.build
+++ /dev/null
@@ -1,36 +0,0 @@
-desktop_file = i18n.merge_file(
- input: 'com.xronlinux.BreezyDesktop.desktop.in',
- output: 'com.xronlinux.BreezyDesktop.desktop',
- type: 'desktop',
- po_dir: '../po',
- install: true,
- install_dir: get_option('datadir') / 'applications'
-)
-
-desktop_utils = find_program('desktop-file-validate', required: false)
-if desktop_utils.found()
- test('Validate desktop file', desktop_utils, args: [desktop_file])
-endif
-
-appstream_file = i18n.merge_file(
- input: 'com.xronlinux.BreezyDesktop.metainfo.xml.in',
- output: 'com.xronlinux.BreezyDesktop.metainfo.xml',
- po_dir: '../po',
- install: true,
- install_dir: get_option('datadir') / 'metainfo'
-)
-
-appstreamcli = find_program('appstreamcli', required: false, disabler: true)
-test('Validate appstream file', appstreamcli,
- args: ['validate', '--no-net', '--explain', appstream_file])
-
-install_data('com.xronlinux.BreezyDesktop.gschema.xml',
- install_dir: get_option('datadir') / 'glib-2.0' / 'schemas'
-)
-
-compile_schemas = find_program('glib-compile-schemas', required: false, disabler: true)
-test('Validate schema file',
- compile_schemas,
- args: ['--strict', '--dry-run', meson.current_source_dir()])
-
-subdir('icons')
diff --git a/ui/docker-build/Dockerfile b/ui/docker-build/Dockerfile
deleted file mode 100644
index 8074855..0000000
--- a/ui/docker-build/Dockerfile
+++ /dev/null
@@ -1,26 +0,0 @@
-# To run the build from the package root:
-# docker buildx build --platform linux/amd64,linux/arm64 -f ./docker-build/Dockerfile -t "breezy-ui" .
-# docker run --rm -t -v ./:/source -v --platform linux/amd64 "breezy-ui:amd64"
-# docker run --rm -t -v ./:/source -v --platform linux/arm64 "breezy-ui:arm64"
-
-FROM --platform=$TARGETPLATFORM debian:latest
-
-ARG TARGETPLATFORM
-RUN echo "Target platform: $TARGETPLATFORM"
-
-RUN apt-get update && apt-get install -y \
- build-essential \
- meson \
- ninja-build \
- librsvg2-bin \
- libglib2.0-dev \
- libgtk-4-common \
- libgtk-4-bin \
- gtk-update-icon-cache \
- desktop-file-utils \
- gettext \
- appstream
-
-WORKDIR /source
-
-CMD bin/package
\ No newline at end of file
diff --git a/ui/docker-build/init.sh b/ui/docker-build/init.sh
deleted file mode 100755
index 461feee..0000000
--- a/ui/docker-build/init.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-# might be needed on a fresh docker setup:
-# install qemu and qemu-user-static packages
-# sudo docker context rm default
-
-docker run --privileged --rm tonistiigi/binfmt --install all
-sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
-
-if [[ "$1" == "--init" || ! $(docker buildx inspect breezyuibuilder &>/dev/null; echo $?) -eq 0 ]]; then
- # start fresh
- echo "Creating new docker builder instance"
- docker buildx rm breezyuibuilder 2>/dev/null || true
- docker buildx create --use --name breezyuibuilder --driver docker-container --driver-opt image=moby/buildkit:latest
-else
- echo "Using existing docker builder instance"
- docker buildx use breezyuibuilder
-fi
-
-echo "Building docker image"
-docker buildx build --platform linux/amd64 -f ./docker-build/Dockerfile -t "breezy-ui:amd64" --load .
-docker buildx build --platform linux/arm64 -f ./docker-build/Dockerfile -t "breezy-ui:arm64" --load .
\ No newline at end of file
diff --git a/ui/docker-build/run-build.sh b/ui/docker-build/run-build.sh
deleted file mode 100755
index da29d78..0000000
--- a/ui/docker-build/run-build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-set -e
-
-USER=${SUDO_USER:-$USER}
-GROUP=$(id -gn $USER)
-
-# Run containers for each architecture
-if [[ "$1" == "x86_64" || -z "$1" ]]; then
- sudo rm -rf build/
- docker run --rm -t -v ./:/source --platform linux/amd64 "breezy-ui:amd64"
- sudo chown -R $USER:$GROUP out/
-fi
-
-if [[ "$1" == "aarch64" || -z "$1" ]]; then
- sudo rm -rf build/
- docker run --rm -t -v ./:/source --platform linux/arm64 "breezy-ui:arm64"
- sudo chown -R $USER:$GROUP out/
-fi
-
-# build directory structure is all owned by root because of docker, delete it all now
-sudo rm -rf build/
\ No newline at end of file
diff --git a/ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst b/ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst
deleted file mode 100644
index 935d652..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/DESCRIPTION.rst
+++ /dev/null
@@ -1,115 +0,0 @@
-pydbus
-======
-.. image:: https://travis-ci.org/LEW21/pydbus.svg?branch=master
- :target: https://travis-ci.org/LEW21/pydbus
-.. image:: https://badge.fury.io/py/pydbus.svg
- :target: https://badge.fury.io/py/pydbus
-
-Pythonic DBus library.
-
-Changelog: https://github.com/LEW21/pydbus/releases
-
-Requirements
-------------
-* Python 2.7+ - but works best on 3.4+ (help system is nicer there)
-* PyGI_ (not packaged on pypi, you need to install it from your distribution's repository - it's usually called python-gi, python-gobject or pygobject)
-* GLib_ 2.46+ and girepository_ 1.46+ (Ubuntu 16.04+) - for object publication support
-
-.. _PyGI: https://wiki.gnome.org/Projects/PyGObject
-.. _GLib: https://developer.gnome.org/glib/
-.. _girepository: https://wiki.gnome.org/Projects/GObjectIntrospection
-
-Examples
---------
-
-Send a desktop notification
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SessionBus
-
- bus = SessionBus()
- notifications = bus.get('.Notifications')
-
- notifications.Notify('test', 0, 'dialog-information', "Hello World!", "pydbus works :)", [], {}, 5000)
-
-List systemd units
-~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SystemBus
-
- bus = SystemBus()
- systemd = bus.get(".systemd1")
-
- for unit in systemd.ListUnits():
- print(unit)
-
-Start or stop systemd unit
-~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SystemBus
-
- bus = SystemBus()
- systemd = bus.get(".systemd1")
-
- job1 = systemd.StopUnit("ssh.service", "fail")
- job2 = systemd.StartUnit("ssh.service", "fail")
-
-Watch for new systemd jobs
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SystemBus
- from gi.repository import GLib
-
- bus = SystemBus()
- systemd = bus.get(".systemd1")
-
- systemd.JobNew.connect(print)
- GLib.MainLoop().run()
-
- # or
-
- systemd.onJobNew = print
- GLib.MainLoop().run()
-
-View object's API
-~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SessionBus
-
- bus = SessionBus()
- notifications = bus.get('.Notifications')
-
- help(notifications)
-
-More examples & documentation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The Tutorial_ contains more examples and docs.
-
-.. _Tutorial: https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst
-
-Copyright Information
----------------------
-
-Copyright (C) 2014, 2015, 2016 Linus Lewandowski
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-
diff --git a/ui/lib/pydbus-0.6.0.dist-info/INSTALLER b/ui/lib/pydbus-0.6.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/ui/lib/pydbus-0.6.0.dist-info/METADATA b/ui/lib/pydbus-0.6.0.dist-info/METADATA
deleted file mode 100644
index 83f96fb..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/METADATA
+++ /dev/null
@@ -1,137 +0,0 @@
-Metadata-Version: 2.0
-Name: pydbus
-Version: 0.6.0
-Summary: Pythonic DBus library
-Home-page: https://github.com/LEW21/pydbus
-Author: Linus Lewandowski
-Author-email: linus@lew21.net
-License: LGPLv2+
-Keywords: dbus
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: Natural Language :: English
-Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-
-pydbus
-======
-.. image:: https://travis-ci.org/LEW21/pydbus.svg?branch=master
- :target: https://travis-ci.org/LEW21/pydbus
-.. image:: https://badge.fury.io/py/pydbus.svg
- :target: https://badge.fury.io/py/pydbus
-
-Pythonic DBus library.
-
-Changelog: https://github.com/LEW21/pydbus/releases
-
-Requirements
-------------
-* Python 2.7+ - but works best on 3.4+ (help system is nicer there)
-* PyGI_ (not packaged on pypi, you need to install it from your distribution's repository - it's usually called python-gi, python-gobject or pygobject)
-* GLib_ 2.46+ and girepository_ 1.46+ (Ubuntu 16.04+) - for object publication support
-
-.. _PyGI: https://wiki.gnome.org/Projects/PyGObject
-.. _GLib: https://developer.gnome.org/glib/
-.. _girepository: https://wiki.gnome.org/Projects/GObjectIntrospection
-
-Examples
---------
-
-Send a desktop notification
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SessionBus
-
- bus = SessionBus()
- notifications = bus.get('.Notifications')
-
- notifications.Notify('test', 0, 'dialog-information', "Hello World!", "pydbus works :)", [], {}, 5000)
-
-List systemd units
-~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SystemBus
-
- bus = SystemBus()
- systemd = bus.get(".systemd1")
-
- for unit in systemd.ListUnits():
- print(unit)
-
-Start or stop systemd unit
-~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SystemBus
-
- bus = SystemBus()
- systemd = bus.get(".systemd1")
-
- job1 = systemd.StopUnit("ssh.service", "fail")
- job2 = systemd.StartUnit("ssh.service", "fail")
-
-Watch for new systemd jobs
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SystemBus
- from gi.repository import GLib
-
- bus = SystemBus()
- systemd = bus.get(".systemd1")
-
- systemd.JobNew.connect(print)
- GLib.MainLoop().run()
-
- # or
-
- systemd.onJobNew = print
- GLib.MainLoop().run()
-
-View object's API
-~~~~~~~~~~~~~~~~~
-.. code-block:: python
-
- from pydbus import SessionBus
-
- bus = SessionBus()
- notifications = bus.get('.Notifications')
-
- help(notifications)
-
-More examples & documentation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The Tutorial_ contains more examples and docs.
-
-.. _Tutorial: https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst
-
-Copyright Information
----------------------
-
-Copyright (C) 2014, 2015, 2016 Linus Lewandowski
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-
diff --git a/ui/lib/pydbus-0.6.0.dist-info/RECORD b/ui/lib/pydbus-0.6.0.dist-info/RECORD
deleted file mode 100644
index a194108..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/RECORD
+++ /dev/null
@@ -1,45 +0,0 @@
-pydbus-0.6.0.dist-info/DESCRIPTION.rst,sha256=pKEYrpPtLiD4ksnqzDs6ZepA9c3uoy5Mjvuxoi1_pEU,3033
-pydbus-0.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pydbus-0.6.0.dist-info/METADATA,sha256=JKSoIIJKdCLkuWiXdKtv4bSyMt9rA7BM3_RJbxqk5y4,3838
-pydbus-0.6.0.dist-info/RECORD,,
-pydbus-0.6.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pydbus-0.6.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
-pydbus-0.6.0.dist-info/metadata.json,sha256=fouQjd0oTDJrVRvQO8dwqvMZbNib8Ui4TgArvHoxzmQ,916
-pydbus-0.6.0.dist-info/top_level.txt,sha256=X1ybDik1ZA7yilKlt-MUQCPJBNlAW9Jp6bHoAYgAgN0,7
-pydbus-0.6.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
-pydbus/__init__.py,sha256=5ouUtYT15bJ-LaEFea3ZccXkhlZHyf1ykwKLNnFMlIs,148
-pydbus/__pycache__/__init__.cpython-312.pyc,,
-pydbus/__pycache__/_inspect3.cpython-312.pyc,,
-pydbus/__pycache__/auto_names.cpython-312.pyc,,
-pydbus/__pycache__/bus.cpython-312.pyc,,
-pydbus/__pycache__/bus_names.cpython-312.pyc,,
-pydbus/__pycache__/exitable.cpython-312.pyc,,
-pydbus/__pycache__/generic.cpython-312.pyc,,
-pydbus/__pycache__/identifier.cpython-312.pyc,,
-pydbus/__pycache__/method_call_context.cpython-312.pyc,,
-pydbus/__pycache__/proxy.cpython-312.pyc,,
-pydbus/__pycache__/proxy_method.cpython-312.pyc,,
-pydbus/__pycache__/proxy_property.cpython-312.pyc,,
-pydbus/__pycache__/proxy_signal.cpython-312.pyc,,
-pydbus/__pycache__/publication.cpython-312.pyc,,
-pydbus/__pycache__/registration.cpython-312.pyc,,
-pydbus/__pycache__/request_name.cpython-312.pyc,,
-pydbus/__pycache__/subscription.cpython-312.pyc,,
-pydbus/__pycache__/timeout.cpython-312.pyc,,
-pydbus/_inspect3.py,sha256=lDzzSThwvbMQ3PwY-SVpWByu___QPhbSvPY0xwQScc8,708
-pydbus/auto_names.py,sha256=elJqIT2dIhioBYUMvIqtH6Pt_tFCf29QSzp0QXbndy8,519
-pydbus/bus.py,sha256=dMJAqRq85TJAz8iDZSg8COhjy8sabrofZ2jjSe6Pxds,1565
-pydbus/bus_names.py,sha256=vdkfHdQy_9FzMWkJaXJZpDpvktV9N2TFyRzLE8X1cDI,3533
-pydbus/exitable.py,sha256=FblBVEUjz6DyqgJpOVlE8-TMeVaC1ZPf9wyi7ejQ-gI,982
-pydbus/generic.py,sha256=2K9VNwu-TkMWws818H2BiyLsoX99fZuJgbmoNtVLzjE,2589
-pydbus/identifier.py,sha256=iVrw6rDMyNiQouNUAMpvEhGCz1Bog-R0HwzmvsHs0LY,383
-pydbus/method_call_context.py,sha256=ilIh0jJmmdoJX26UF1uV9eYvdQXXgYoyxzNHKvIJcJA,1039
-pydbus/proxy.py,sha256=Og9VbKJ4sZvr4dI7cBwVKsklWAqfnEmAlSpoaPJIs-g,4203
-pydbus/proxy_method.py,sha256=I741zD_vBixhpeKArTVLaUDTQsZGJ98xaX2SGORJkb0,3089
-pydbus/proxy_property.py,sha256=WUkOV4V8DuvmN1-yAD54IJklZqgJex2eTV2KZ20PJ1k,1066
-pydbus/proxy_signal.py,sha256=D60OxO635erbIknziTzX3QDChhImmjzgUpwjVe8gy6A,2112
-pydbus/publication.py,sha256=oJKPraVVv0YPLWN2-y0KjjjW1Lu4NNTg9lNoVneYLlY,1391
-pydbus/registration.py,sha256=GWBv2lDDLrkYCr9WsaEFS1hZstuXB7OgHdEnvC0Shc4,5565
-pydbus/request_name.py,sha256=jpWNd8H8rlRdJQiNAud-di1jU6gE31JvLOtoXQm_lHE,883
-pydbus/subscription.py,sha256=MBXKRIvLvSgYLIT7A0a3Qn6aAvT6Rcx1b6xudTsr7mQ,2166
-pydbus/timeout.py,sha256=G4o9dVwN7hb4MaPUHlcGpQKtlUSaTGjBTBC7nuza9mI,303
diff --git a/ui/lib/pydbus-0.6.0.dist-info/REQUESTED b/ui/lib/pydbus-0.6.0.dist-info/REQUESTED
deleted file mode 100644
index e69de29..0000000
diff --git a/ui/lib/pydbus-0.6.0.dist-info/WHEEL b/ui/lib/pydbus-0.6.0.dist-info/WHEEL
deleted file mode 100644
index 8b6dd1b..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.29.0)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/ui/lib/pydbus-0.6.0.dist-info/metadata.json b/ui/lib/pydbus-0.6.0.dist-info/metadata.json
deleted file mode 100644
index 898cdff..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/metadata.json
+++ /dev/null
@@ -1 +0,0 @@
-{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7"], "extensions": {"python.details": {"contacts": [{"email": "linus@lew21.net", "name": "Linus Lewandowski", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/LEW21/pydbus"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["dbus"], "license": "LGPLv2+", "metadata_version": "2.0", "name": "pydbus", "summary": "Pythonic DBus library", "version": "0.6.0"}
\ No newline at end of file
diff --git a/ui/lib/pydbus-0.6.0.dist-info/top_level.txt b/ui/lib/pydbus-0.6.0.dist-info/top_level.txt
deleted file mode 100644
index d2fe79b..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-pydbus
diff --git a/ui/lib/pydbus-0.6.0.dist-info/zip-safe b/ui/lib/pydbus-0.6.0.dist-info/zip-safe
deleted file mode 100644
index 8b13789..0000000
--- a/ui/lib/pydbus-0.6.0.dist-info/zip-safe
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/ui/lib/pydbus/__init__.py b/ui/lib/pydbus/__init__.py
deleted file mode 100644
index 5576517..0000000
--- a/ui/lib/pydbus/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .bus import SystemBus, SessionBus, connect
-from gi.repository.GLib import Variant
-
-__all__ = ["SystemBus", "SessionBus", "connect", "Variant"]
diff --git a/ui/lib/pydbus/_inspect3.py b/ui/lib/pydbus/_inspect3.py
deleted file mode 100644
index b0a2f22..0000000
--- a/ui/lib/pydbus/_inspect3.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from collections import OrderedDict
-from inspect import getargspec
-
-class _empty:
- pass
-
-class Signature:
- empty = _empty
-
- def __init__(self, parameters=None, return_annotation=_empty):
- self.parameters = OrderedDict(((param.name, param) for param in parameters))
- self.return_annotation = return_annotation
-
-class Parameter:
- empty = _empty
-
- POSITIONAL_ONLY = 0
- POSITIONAL_OR_KEYWORD = 1
- KEYWORD_ONLY = 999
-
- def __init__(self, name, kind, default=_empty, annotation=_empty):
- self.name = name
- self.kind = kind
- self.annotation = annotation
-
-def signature(f):
- parameters = [Parameter(arg, Parameter.POSITIONAL_OR_KEYWORD) for arg in getargspec(f).args]
- return Signature(parameters = parameters)
diff --git a/ui/lib/pydbus/auto_names.py b/ui/lib/pydbus/auto_names.py
deleted file mode 100644
index 06c6c18..0000000
--- a/ui/lib/pydbus/auto_names.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from gi.repository import Gio
-
-def auto_bus_name(bus_name):
- if bus_name[0] == ".":
- #Default namespace
- bus_name = "org.freedesktop" + bus_name
-
- if not Gio.dbus_is_name(bus_name):
- raise ValueError("invalid bus name")
-
- return bus_name
-
-def auto_object_path(bus_name, object_path=None):
- if object_path is None:
- # They always name it like that.
- object_path = "/" + bus_name.replace(".", "/")
-
- if object_path[0] != "/":
- object_path = "/" + bus_name.replace(".", "/") + "/" + object_path
-
- return object_path
diff --git a/ui/lib/pydbus/bus.py b/ui/lib/pydbus/bus.py
deleted file mode 100644
index 6726390..0000000
--- a/ui/lib/pydbus/bus.py
+++ /dev/null
@@ -1,60 +0,0 @@
-from gi.repository import Gio
-from .proxy import ProxyMixin
-from .request_name import RequestNameMixin
-from .bus_names import OwnMixin, WatchMixin
-from .subscription import SubscriptionMixin
-from .registration import RegistrationMixin
-from .publication import PublicationMixin
-
-def pydbus_property(self):
- try:
- return self._pydbus
- except AttributeError:
- self._pydbus = Bus(self)
- return self._pydbus
-
-Gio.DBusConnection.pydbus = property(pydbus_property)
-
-def bus_get(type):
- return Gio.bus_get_sync(type, None).pydbus
-
-def connect(address):
- c = Gio.DBusConnection.new_for_address_sync(address, Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT | Gio.DBusConnectionFlags.MESSAGE_BUS_CONNECTION, None, None)
- c.pydbus.autoclose = True
- return c.pydbus
-
-class Bus(ProxyMixin, RequestNameMixin, OwnMixin, WatchMixin, SubscriptionMixin, RegistrationMixin, PublicationMixin):
- Type = Gio.BusType
-
- def __init__(self, gio_con):
- self.con = gio_con
- self.autoclose = False
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, traceback):
- if self.autoclose:
- self.con.close_sync(None)
-
- @property
- def dbus(self):
- try:
- return self._dbus
- except AttributeError:
- self._dbus = self.get(".DBus")[""]
- return self._dbus
-
- @property
- def polkit_authority(self):
- try:
- return self._polkit_authority
- except AttributeError:
- self._polkit_authority = self.get(".PolicyKit1", "Authority")[""]
- return self._polkit_authority
-
-def SystemBus():
- return bus_get(Bus.Type.SYSTEM)
-
-def SessionBus():
- return bus_get(Bus.Type.SESSION)
diff --git a/ui/lib/pydbus/bus_names.py b/ui/lib/pydbus/bus_names.py
deleted file mode 100644
index 3b27431..0000000
--- a/ui/lib/pydbus/bus_names.py
+++ /dev/null
@@ -1,97 +0,0 @@
-from gi.repository import Gio
-from .exitable import ExitableWithAliases
-import warnings
-
-class NameOwner(ExitableWithAliases("unown")):
- Flags = Gio.BusNameOwnerFlags
- __slots__ = ()
-
- def __init__(self, con, name, flags, name_aquired_handler, name_lost_handler):
- id = Gio.bus_own_name_on_connection(con, name, flags, name_aquired_handler, name_lost_handler)
- self._at_exit(lambda: Gio.bus_unown_name(id))
-
-class NameWatcher(ExitableWithAliases("unwatch")):
- Flags = Gio.BusNameWatcherFlags
- __slots__ = ()
-
- def __init__(self, con, name, flags, name_appeared_handler, name_vanished_handler):
- id = Gio.bus_watch_name_on_connection(con, name, flags, name_appeared_handler, name_vanished_handler)
- self._at_exit(lambda: Gio.bus_unwatch_name(id))
-
-class OwnMixin(object):
- __slots__ = ()
- NameOwnerFlags = NameOwner.Flags
-
- def own_name(self, name, flags=0, name_aquired=None, name_lost=None):
- """[DEPRECATED] Asynchronously aquires a bus name.
-
- Starts acquiring name on the bus specified by bus_type and calls
- name_acquired and name_lost when the name is acquired respectively lost.
-
- To receive name_aquired and name_lost callbacks, you need an event loop.
- https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#setting-up-an-event-loop
-
- Parameters
- ----------
- name : string
- Bus name to aquire
- flags : NameOwnerFlags, optional
- name_aquired : callable, optional
- Invoked when name is acquired
- name_lost : callable, optional
- Invoked when name is lost
-
- Returns
- -------
- NameOwner
- An object you can use as a context manager to unown the name later.
-
- See Also
- --------
- See https://developer.gnome.org/gio/2.44/gio-Owning-Bus-Names.html#g-bus-own-name
- for more information.
- """
- warnings.warn("own_name() is deprecated, use request_name() instead.", DeprecationWarning)
-
- name_aquired_handler = (lambda con, name: name_aquired()) if name_aquired is not None else None
- name_lost_handler = (lambda con, name: name_lost()) if name_lost is not None else None
- return NameOwner(self.con, name, flags, name_aquired_handler, name_lost_handler)
-
-class WatchMixin(object):
- __slots__ = ()
- NameWatcherFlags = NameWatcher.Flags
-
- def watch_name(self, name, flags=0, name_appeared=None, name_vanished=None):
- """Asynchronously watches a bus name.
-
- Starts watching name on the bus specified by bus_type and calls
- name_appeared and name_vanished when the name is known to have a owner
- respectively known to lose its owner.
-
- To receive name_appeared and name_vanished callbacks, you need an event loop.
- https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#setting-up-an-event-loop
-
- Parameters
- ----------
- name : string
- Bus name to watch
- flags : NameWatcherFlags, optional
- name_appeared : callable, optional
- Invoked when name is known to exist
- Called as name_appeared(name_owner).
- name_vanished : callable, optional
- Invoked when name is known to not exist
-
- Returns
- -------
- NameWatcher
- An object you can use as a context manager to unwatch the name later.
-
- See Also
- --------
- See https://developer.gnome.org/gio/2.44/gio-Watching-Bus-Names.html#g-bus-watch-name
- for more information.
- """
- name_appeared_handler = (lambda con, name, name_owner: name_appeared(name_owner)) if name_appeared is not None else None
- name_vanished_handler = (lambda con, name: name_vanished()) if name_vanished is not None else None
- return NameWatcher(self.con, name, flags, name_appeared_handler, name_vanished_handler)
diff --git a/ui/lib/pydbus/exitable.py b/ui/lib/pydbus/exitable.py
deleted file mode 100644
index 0349043..0000000
--- a/ui/lib/pydbus/exitable.py
+++ /dev/null
@@ -1,52 +0,0 @@
-import inspect
-
-class Exitable(object):
- __slots__ = ("_at_exit_cbs")
-
- def _at_exit(self, cb):
- try:
- self._at_exit_cbs
- except AttributeError:
- self._at_exit_cbs = []
-
- self._at_exit_cbs.append(cb)
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type = None, exc_value = None, traceback = None):
- if self._exited:
- return
-
- for cb in reversed(self._at_exit_cbs):
- call_with_exc = True
- try:
- inspect.getcallargs(cb, exc_type, exc_value, traceback)
- except TypeError:
- call_with_exc = False
-
- if call_with_exc:
- cb(exc_type, exc_value, traceback)
- else:
- cb()
-
- self._at_exit_cbs = None
-
- @property
- def _exited(self):
- try:
- return self._at_exit_cbs is None
- except AttributeError:
- return True
-
-def ExitableWithAliases(*exit_methods):
- class CustomExitable(Exitable):
- pass
-
- def exit(self):
- self.__exit__()
-
- for exit_method_name in exit_methods:
- setattr(CustomExitable, exit_method_name, exit)
-
- return CustomExitable
diff --git a/ui/lib/pydbus/generic.py b/ui/lib/pydbus/generic.py
deleted file mode 100644
index abeb7ce..0000000
--- a/ui/lib/pydbus/generic.py
+++ /dev/null
@@ -1,105 +0,0 @@
-"""Generic programming utilities.
-
-Utilities implemented in this file are not dependent
-on dbus, they can be used everywhere.
-"""
-
-class subscription(object):
- __slots__ = ("callback_list", "callback")
-
- def __init__(self, callback_list, callback):
- self.callback_list = callback_list
- self.callback = callback
- self.callback_list.append(callback)
-
- def unsubscribe(self):
- self.callback_list.remove(self.callback)
- self.callback_list = None
- self.callback = None
-
- def disconnect(self):
- """An alias for unsubscribe()"""
- self.unsubscribe()
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, traceback):
- if not self.callback is None:
- self.unsubscribe()
-
-class bound_signal(object):
- __slots__ = ("__signal__", "__self__") # bound method uses ("__func__", "__self__")
-
- def __init__(self, signal, instance):
- self.__signal__ = signal
- self.__self__ = instance
-
- @property
- def callbacks(self):
- return self.__signal__.map[self.__self__]
-
- def connect(self, callback):
- """Subscribe to the signal."""
- return self.__signal__.connect(self.__self__, callback)
-
- def emit(self, *args):
- """Emit the signal."""
- self.__signal__.emit(self.__self__, *args)
-
- def __call__(self, *args):
- """Emit the signal."""
- self.emit(*args)
-
- def __repr__(self):
- return ""
-
-class signal(object):
- """Static signal object
-
- You're expected to set it as a class property::
-
- class A:
- SomethingHappened = signal()
-
- Declared this way, it can be used on class instances
- to connect signal observers::
-
- a = A()
- a.SomethingHappened.connect(func)
-
- and emit the signal::
-
- a.SomethingHappened()
-
- You may pass any parameters to the emiting function
- - they will be forwarded to all subscribed callbacks.
- """
-
- def __init__(self):
- self.map = {}
- self.__qualname__ = "" # function uses ;)
- self.__doc__ = "Signal."
-
- def connect(self, object, callback):
- """Subscribe to the signal."""
- return subscription(self.map.setdefault(object, []), callback)
-
- def emit(self, object, *args):
- """Emit the signal."""
- for cb in self.map.get(object, []):
- cb(*args)
-
- def __get__(self, instance, owner):
- if instance is None:
- return self
-
- return bound_signal(self, instance)
-
- def __set__(self, instance, value):
- raise AttributeError("can't set attribute")
-
- def __repr__(self):
- return ""
-
-bound_method = type(signal().emit) # TODO find a prettier way to get this type
diff --git a/ui/lib/pydbus/identifier.py b/ui/lib/pydbus/identifier.py
deleted file mode 100644
index f7d4f31..0000000
--- a/ui/lib/pydbus/identifier.py
+++ /dev/null
@@ -1,22 +0,0 @@
-
-try:
- isident = str.isidentifier
-except:
- import re
-
- isidentre = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$")
- def isident(s):
- return isidentre.match(s) is not None
-
-def filter_identifier(name):
- name = name.replace("-", "_")
-
- safe_name = ""
- for c in name:
- if not safe_name:
- if isident(c):
- safe_name += c
- else:
- if isident("a" + c):
- safe_name += c
- return safe_name
diff --git a/ui/lib/pydbus/method_call_context.py b/ui/lib/pydbus/method_call_context.py
deleted file mode 100644
index a565631..0000000
--- a/ui/lib/pydbus/method_call_context.py
+++ /dev/null
@@ -1,34 +0,0 @@
-from gi.repository import GLib
-from collections import namedtuple
-
-AuthorizationResult = namedtuple("AuthorizationResult", "is_authorized is_challenge details")
-
-class MethodCallContext(object):
- def __init__(self, gdbus_method_invocation):
- self._mi = gdbus_method_invocation
-
- @property
- def bus(self):
- return self._mi.get_connection().pydbus
-
- @property
- def sender(self):
- return self._mi.get_sender()
-
- @property
- def object_path(self):
- return self._mi.get_object_path()
-
- @property
- def interface_name(self):
- return self._mi.get_interface_name()
-
- @property
- def method_name(self):
- return self._mi.get_method_name()
-
- def check_authorization(self, action_id, details, interactive=False):
- return AuthorizationResult(*self.bus.polkit_authority.CheckAuthorization(('system-bus-name', {'name': GLib.Variant("s", self.sender)}), action_id, details, 1 if interactive else 0, ''))
-
- def is_authorized(self, action_id, details, interactive=False):
- return self.check_authorization(action_id, details, interactive).is_authorized
diff --git a/ui/lib/pydbus/proxy.py b/ui/lib/pydbus/proxy.py
deleted file mode 100644
index c081113..0000000
--- a/ui/lib/pydbus/proxy.py
+++ /dev/null
@@ -1,123 +0,0 @@
-from gi.repository import GLib
-from xml.etree import ElementTree as ET
-from .auto_names import *
-
-from .proxy_method import ProxyMethod
-from .proxy_property import ProxyProperty
-from .proxy_signal import ProxySignal, OnSignal
-from .timeout import timeout_to_glib
-
-class ProxyMixin(object):
- __slots__ = ()
-
- def get(self, bus_name, object_path=None, **kwargs):
- """Get a remote object.
-
- Parameters
- ----------
- bus_name : string
- Name of the service that exposes this object.
- You may start with "." - then org.freedesktop will be automatically prepended.
- object_path : string, optional
- Path of the object. If not provided, bus_name translated to path format is used.
-
- Returns
- -------
- ProxyObject implementing all the Interfaces exposed by the remote object.
- Note that it inherits from multiple Interfaces, so the method you want to use
- may be shadowed by another one, eg. from a newer version of the interface.
- Therefore, to interact with only a single interface, use:
- >>> bus.get("org.freedesktop.systemd1")["org.freedesktop.systemd1.Manager"]
- or simply
- >>> bus.get(".systemd1")[".Manager"]
- which will give you access to the one specific interface.
- """
- # Python 2 sux
- for kwarg in kwargs:
- if kwarg not in ("timeout",):
- raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg))
- timeout = kwargs.get("timeout", None)
-
- bus_name = auto_bus_name(bus_name)
- object_path = auto_object_path(bus_name, object_path)
-
- ret = self.con.call_sync(
- bus_name, object_path,
- 'org.freedesktop.DBus.Introspectable', "Introspect", None, GLib.VariantType.new("(s)"),
- 0, timeout_to_glib(timeout), None)
-
- if not ret:
- raise KeyError("no such object; you might need to pass object path as the 2nd argument for get()")
-
- xml, = ret.unpack()
-
- try:
- introspection = ET.fromstring(xml)
- except:
- raise KeyError("object provides invalid introspection XML")
-
- return CompositeInterface(introspection)(self, bus_name, object_path)
-
-class ProxyObject(object):
- def __init__(self, bus, bus_name, path, object=None):
- self._bus = bus
- self._bus_name = bus_name
- self._path = path
- self._object = object if object else self
-
-def Interface(iface):
-
- class interface(ProxyObject):
- @staticmethod
- def _Introspect():
- print(iface.attrib["name"] + ":")
- for member in iface:
- print("\t" + member.tag + " " + member.attrib["name"])
- print()
-
- interface.__qualname__ = interface.__name__ = iface.attrib["name"]
- interface.__module__ = "DBUS"
-
- for member in iface:
- member_name = member.attrib["name"]
- if member.tag == "method":
- setattr(interface, member_name, ProxyMethod(interface.__name__, member))
- elif member.tag == "property":
- setattr(interface, member_name, ProxyProperty(interface.__name__, member))
- elif member.tag == "signal":
- signal = ProxySignal(interface.__name__, member)
- setattr(interface, member_name, signal)
- setattr(interface, "on" + member_name, OnSignal(signal))
-
- return interface
-
-def CompositeInterface(introspection):
- class CompositeObject(ProxyObject):
- def __getitem__(self, iface):
- if iface == "" or iface[0] == ".":
- iface = self._path.replace("/", ".")[1:] + iface
- matching_bases = [base for base in type(self).__bases__ if base.__name__ == iface]
-
- if len(matching_bases) == 0:
- raise KeyError(iface)
- assert(len(matching_bases) == 1)
-
- iface_class = matching_bases[0]
- return iface_class(self._bus, self._bus_name, self._path, self)
-
- @classmethod
- def _Introspect(cls):
- for iface in cls.__bases__:
- try:
- iface._Introspect()
- except:
- pass
-
- ifaces = sorted([x for x in introspection if x.tag == "interface"], key=lambda x: int(x.attrib["name"].startswith("org.freedesktop.DBus.")))
- if not ifaces:
- raise KeyError("object does not export any interfaces; you might need to pass object path as the 2nd argument for get()")
- CompositeObject.__bases__ = tuple(Interface(iface) for iface in ifaces)
- CompositeObject.__name__ = ""
- CompositeObject.__qualname__ = "(" + "+".join(x.__name__ for x in CompositeObject.__bases__) + ")"
- CompositeObject.__module__ = "DBUS"
- return CompositeObject
diff --git a/ui/lib/pydbus/proxy_method.py b/ui/lib/pydbus/proxy_method.py
deleted file mode 100644
index 8798edd..0000000
--- a/ui/lib/pydbus/proxy_method.py
+++ /dev/null
@@ -1,91 +0,0 @@
-from gi.repository import GLib
-from .generic import bound_method
-from .identifier import filter_identifier
-from .timeout import timeout_to_glib
-
-try:
- from inspect import Signature, Parameter
- put_signature_in_doc = False
-except:
- from ._inspect3 import Signature, Parameter
- put_signature_in_doc = True
-
-class DBUSSignature(Signature):
-
- def __str__(self):
- result = []
- for param in self.parameters.values():
- p = param.name if not param.name.startswith("arg") else ""
- if type(param.annotation) == str:
- p += ":" + param.annotation
- result.append(p)
-
- rendered = '({})'.format(', '.join(result))
-
- if self.return_annotation is not Signature.empty:
- rendered += ' -> {}'.format(self.return_annotation)
-
- return rendered
-
-class ProxyMethod(object):
- def __init__(self, iface_name, method):
- self._iface_name = iface_name
- self.__name__ = method.attrib["name"]
- self.__qualname__ = self._iface_name + "." + self.__name__
-
- self._inargs = [(arg.attrib.get("name", ""), arg.attrib["type"]) for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "in"]
- self._outargs = [arg.attrib["type"] for arg in method if arg.tag == "arg" and arg.attrib["direction"] == "out"]
- self._sinargs = "(" + "".join(x[1] for x in self._inargs) + ")"
- self._soutargs = "(" + "".join(self._outargs) + ")"
-
- self_param = Parameter("self", Parameter.POSITIONAL_ONLY)
- pos_params = []
- for i, a in enumerate(self._inargs):
- name = filter_identifier(a[0])
-
- if not name:
- name = "arg" + str(i)
-
- param = Parameter(name, Parameter.POSITIONAL_ONLY, annotation=a[1])
-
- pos_params.append(param)
- ret_type = Signature.empty if len(self._outargs) == 0 else self._outargs[0] if len(self._outargs) == 1 else "(" + ", ".join(self._outargs) + ")"
-
- self.__signature__ = DBUSSignature([self_param] + pos_params, return_annotation=ret_type)
-
- if put_signature_in_doc:
- self.__doc__ = self.__name__ + str(self.__signature__)
-
- def __call__(self, instance, *args, **kwargs):
- argdiff = len(args) - len(self._inargs)
- if argdiff < 0:
- raise TypeError(self.__qualname__ + " missing {} required positional argument(s)".format(-argdiff))
- elif argdiff > 0:
- raise TypeError(self.__qualname__ + " takes {} positional argument(s) but {} was/were given".format(len(self._inargs), len(args)))
-
- # Python 2 sux
- for kwarg in kwargs:
- if kwarg not in ("timeout",):
- raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg))
- timeout = kwargs.get("timeout", None)
-
- ret = instance._bus.con.call_sync(
- instance._bus_name, instance._path,
- self._iface_name, self.__name__, GLib.Variant(self._sinargs, args), GLib.VariantType.new(self._soutargs),
- 0, timeout_to_glib(timeout), None).unpack()
-
- if len(self._outargs) == 0:
- return None
- elif len(self._outargs) == 1:
- return ret[0]
- else:
- return ret
-
- def __get__(self, instance, owner):
- if instance is None:
- return self
-
- return bound_method(self, instance)
-
- def __repr__(self):
- return ""
diff --git a/ui/lib/pydbus/proxy_property.py b/ui/lib/pydbus/proxy_property.py
deleted file mode 100644
index e06a17d..0000000
--- a/ui/lib/pydbus/proxy_property.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from gi.repository import GLib
-
-class ProxyProperty(object):
- def __init__(self, iface_name, property):
- self._iface_name = iface_name
- self.__name__ = property.attrib["name"]
- self.__qualname__ = self._iface_name + "." + self.__name__
-
- self._type = property.attrib["type"]
- access = property.attrib["access"]
- self._readable = access.startswith("read")
- self._writeable = access.endswith("write")
- self.__doc__ = "(" + self._type + ") " + access
-
- def __get__(self, instance, owner):
- if instance is None:
- return self
-
- if not self._readable:
- raise AttributeError("unreadable attribute")
-
- return instance._object["org.freedesktop.DBus.Properties"].Get(self._iface_name, self.__name__)
-
- def __set__(self, instance, value):
- if instance is None or not self._writeable:
- raise AttributeError("can't set attribute")
-
- instance._object["org.freedesktop.DBus.Properties"].Set(self._iface_name, self.__name__, GLib.Variant(self._type, value))
-
- def __repr__(self):
- return ""
diff --git a/ui/lib/pydbus/proxy_signal.py b/ui/lib/pydbus/proxy_signal.py
deleted file mode 100644
index c9a0169..0000000
--- a/ui/lib/pydbus/proxy_signal.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from .generic import bound_signal
-
-class ProxySignal(object):
- def __init__(self, iface_name, signal):
- self._iface_name = iface_name
- self.__name__ = signal.attrib["name"]
- self.__qualname__ = self._iface_name + "." + self.__name__
-
- self._args = [arg.attrib["type"] for arg in signal if arg.tag == "arg"]
- self.__doc__ = "Signal. Callback: (" + ", ".join(self._args) + ")"
-
- def connect(self, object, callback):
- """Subscribe to the signal."""
- def signal_fired(sender, object, iface, signal, params):
- callback(*params)
- return object._bus.subscribe(sender=object._bus_name, object=object._path, iface=self._iface_name, signal=self.__name__, signal_fired=signal_fired)
-
- def __get__(self, instance, owner):
- if instance is None:
- return self
-
- return bound_signal(self, instance)
-
- def __set__(self, instance, value):
- raise AttributeError("can't set attribute")
-
- def __repr__(self):
- return ""
-
-class OnSignal(object):
- def __init__(self, signal):
- self.signal = signal
- self.__name__ = "on" + signal.__name__
- self.__qualname__ = signal._iface_name + "." + self.__name__
- self.__doc__ = "Assign a callback to subscribe to the signal. Assing None to unsubscribe. Callback: (" + ", ".join(signal._args) + ")"
-
- def __get__(self, instance, owner):
- if instance is None:
- return self
-
- try:
- return getattr(instance, "_on" + self.signal.__name__)
- except AttributeError:
- return None
-
- def __set__(self, instance, value):
- if instance is None:
- raise AttributeError("can't set attribute")
-
- try:
- old = getattr(instance, "_sub" + self.signal.__name__)
- old.unsubscribe()
- except AttributeError:
- pass
-
- if value is None:
- delattr(instance, "_on" + self.signal.__name__)
- delattr(instance, "_sub" + self.signal.__name__)
- return
-
- sub = self.signal.connect(instance, value)
- setattr(instance, "_on" + self.signal.__name__, value)
- setattr(instance, "_sub" + self.signal.__name__, sub)
-
- def __repr__(self):
- return ""
diff --git a/ui/lib/pydbus/publication.py b/ui/lib/pydbus/publication.py
deleted file mode 100644
index ef03825..0000000
--- a/ui/lib/pydbus/publication.py
+++ /dev/null
@@ -1,42 +0,0 @@
-from gi.repository import Gio
-from .exitable import ExitableWithAliases
-from .auto_names import *
-
-class Publication(ExitableWithAliases("unpublish")):
- __slots__ = ()
-
- def __init__(self, bus, bus_name, *objects, **kwargs): # allow_replacement=True, replace=False
- # Python 2 sux
- for kwarg in kwargs:
- if kwarg not in ("allow_replacement", "replace",):
- raise TypeError(self.__qualname__ + " got an unexpected keyword argument '{}'".format(kwarg))
- allow_replacement = kwargs.get("allow_replacement", True)
- replace = kwargs.get("replace", False)
-
- bus_name = auto_bus_name(bus_name)
-
- for object_info in objects:
- path, object, node_info = (None, None, None)
-
- if type(object_info) == tuple:
- if len(object_info) == 3:
- path, object, node_info = object_info
- if len(object_info) == 2:
- path, object = object_info
- if len(object_info) == 1:
- object = object_info[0]
- else:
- object = object_info
-
- path = auto_object_path(bus_name, path)
- self._at_exit(bus.register_object(path, object, node_info).__exit__)
-
- # Request name only after registering all the objects.
- self._at_exit(bus.request_name(bus_name, allow_replacement=allow_replacement, replace=replace).__exit__)
-
-class PublicationMixin(object):
- __slots__ = ()
-
- def publish(self, bus_name, *objects):
- """Expose objects on the bus."""
- return Publication(self, bus_name, *objects)
diff --git a/ui/lib/pydbus/registration.py b/ui/lib/pydbus/registration.py
deleted file mode 100644
index f531539..0000000
--- a/ui/lib/pydbus/registration.py
+++ /dev/null
@@ -1,156 +0,0 @@
-from __future__ import print_function
-import sys, traceback
-from gi.repository import GLib, Gio
-from . import generic
-from .exitable import ExitableWithAliases
-from functools import partial
-from .method_call_context import MethodCallContext
-import logging
-
-try:
- from inspect import signature, Parameter
-except:
- from ._inspect3 import signature, Parameter
-
-class ObjectWrapper(ExitableWithAliases("unwrap")):
- __slots__ = ["object", "outargs", "readable_properties", "writable_properties"]
-
- def __init__(self, object, interfaces):
- self.object = object
-
- self.outargs = {}
- for iface in interfaces:
- for method in iface.methods:
- self.outargs[iface.name + "." + method.name] = [arg.signature for arg in method.out_args]
-
- self.readable_properties = {}
- self.writable_properties = {}
- for iface in interfaces:
- for prop in iface.properties:
- if prop.flags & Gio.DBusPropertyInfoFlags.READABLE:
- self.readable_properties[iface.name + "." + prop.name] = prop.signature
- if prop.flags & Gio.DBusPropertyInfoFlags.WRITABLE:
- self.writable_properties[iface.name + "." + prop.name] = prop.signature
-
- for iface in interfaces:
- for signal in iface.signals:
- s_name = signal.name
- def EmitSignal(iface, signal):
- return lambda *args: self.SignalEmitted(iface.name, signal.name, GLib.Variant("(" + "".join(s.signature for s in signal.args) + ")", args))
- self._at_exit(getattr(object, signal.name).connect(EmitSignal(iface, signal)).__exit__)
-
- if "org.freedesktop.DBus.Properties" not in (iface.name for iface in interfaces):
- try:
- def onPropertiesChanged(iface, changed, invalidated):
- changed = {key: GLib.Variant(self.readable_properties[iface + "." + key], val) for key, val in changed.items()}
- args = GLib.Variant("(sa{sv}as)", (iface, changed, invalidated))
- self.SignalEmitted("org.freedesktop.DBus.Properties", "PropertiesChanged", args)
- self._at_exit(object.PropertiesChanged.connect(onPropertiesChanged).__exit__)
- except AttributeError:
- pass
-
- SignalEmitted = generic.signal()
-
- def call_method(self, connection, sender, object_path, interface_name, method_name, parameters, invocation):
- try:
- try:
- outargs = self.outargs[interface_name + "." + method_name]
- method = getattr(self.object, method_name)
- except KeyError:
- if interface_name == "org.freedesktop.DBus.Properties":
- if method_name == "Get":
- method = self.Get
- outargs = ["v"]
- elif method_name == "GetAll":
- method = self.GetAll
- outargs = ["a{sv}"]
- elif method_name == "Set":
- method = self.Set
- outargs = []
- else:
- raise
- else:
- raise
-
- sig = signature(method)
-
- kwargs = {}
- if "dbus_context" in sig.parameters and sig.parameters["dbus_context"].kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY):
- kwargs["dbus_context"] = MethodCallContext(invocation)
-
- result = method(*parameters, **kwargs)
-
- if len(outargs) == 0:
- invocation.return_value(None)
- elif len(outargs) == 1:
- invocation.return_value(GLib.Variant("(" + "".join(outargs) + ")", (result,)))
- else:
- invocation.return_value(GLib.Variant("(" + "".join(outargs) + ")", result))
-
- except Exception as e:
- logger = logging.getLogger(__name__)
- logger.exception("Exception while handling %s.%s()", interface_name, method_name)
-
- #TODO Think of a better way to translate Python exception types to DBus error types.
- e_type = type(e).__name__
- if not "." in e_type:
- e_type = "unknown." + e_type
- invocation.return_dbus_error(e_type, str(e))
-
- def Get(self, interface_name, property_name):
- type = self.readable_properties[interface_name + "." + property_name]
- result = getattr(self.object, property_name)
- return GLib.Variant(type, result)
-
- def GetAll(self, interface_name):
- ret = {}
- for name, type in self.readable_properties.items():
- ns, local = name.rsplit(".", 1)
- if ns == interface_name:
- ret[local] = GLib.Variant(type, getattr(self.object, local))
- return ret
-
- def Set(self, interface_name, property_name, value):
- self.writable_properties[interface_name + "." + property_name]
- setattr(self.object, property_name, value)
-
-class ObjectRegistration(ExitableWithAliases("unregister")):
- __slots__ = ()
-
- def __init__(self, bus, path, interfaces, wrapper, own_wrapper=False):
- if own_wrapper:
- self._at_exit(wrapper.__exit__)
-
- def func(interface_name, signal_name, parameters):
- bus.con.emit_signal(None, path, interface_name, signal_name, parameters)
-
- self._at_exit(wrapper.SignalEmitted.connect(func).__exit__)
-
- try:
- ids = [bus.con.register_object(path, interface, wrapper.call_method, None, None) for interface in interfaces]
- except TypeError as e:
- if str(e).startswith("argument vtable: Expected Gio.DBusInterfaceVTable"):
- raise Exception("GLib 2.46 is required to publish objects; it is impossible in older versions.")
- else:
- raise
-
- self._at_exit(lambda: [bus.con.unregister_object(id) for id in ids])
-
-class RegistrationMixin:
- __slots__ = ()
-
- def register_object(self, path, object, node_info):
- if node_info is None:
- try:
- node_info = type(object).dbus
- except AttributeError:
- node_info = type(object).__doc__
-
- if type(node_info) != list and type(node_info) != tuple:
- node_info = [node_info]
-
- node_info = [Gio.DBusNodeInfo.new_for_xml(ni) for ni in node_info]
- interfaces = sum((ni.interfaces for ni in node_info), [])
-
- wrapper = ObjectWrapper(object, interfaces)
- return ObjectRegistration(self, path, interfaces, wrapper, own_wrapper=True)
diff --git a/ui/lib/pydbus/request_name.py b/ui/lib/pydbus/request_name.py
deleted file mode 100644
index 96d856c..0000000
--- a/ui/lib/pydbus/request_name.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from .exitable import ExitableWithAliases
-
-class NameOwner(ExitableWithAliases("unown")):
- __slots__ = ()
-
- def __init__(self, bus, name, allow_replacement, replace):
- flags = 4 | (1 if allow_replacement else 0) | (2 if replace else 0)
- res = bus.dbus.RequestName(name, flags)
- if res == 1:
- self._at_exit(lambda: bus.dbus.ReleaseName(name))
- return # OK
- if res == 3:
- raise RuntimeError("name already exists on the bus")
- if res == 4:
- raise RuntimeError("you're already the owner of this name")
- raise RuntimeError("cannot take ownership of the name")
-
-class RequestNameMixin(object):
- __slots__ = ()
-
- def request_name(self, name, allow_replacement=True, replace=False):
- """Aquires a bus name.
-
- Returns
- -------
- NameOwner
- An object you can use as a context manager to unown the name later.
- """
- return NameOwner(self, name, allow_replacement, replace)
diff --git a/ui/lib/pydbus/subscription.py b/ui/lib/pydbus/subscription.py
deleted file mode 100644
index 93b0cbb..0000000
--- a/ui/lib/pydbus/subscription.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from gi.repository import Gio
-from .exitable import ExitableWithAliases
-
-class Subscription(ExitableWithAliases("unsubscribe", "disconnect")):
- Flags = Gio.DBusSignalFlags
- __slots__ = ()
-
- def __init__(self, con, sender, iface, member, object, arg0, flags, callback):
- id = con.signal_subscribe(sender, iface, member, object, arg0, flags, callback)
- self._at_exit(lambda: con.signal_unsubscribe(id))
-
-class SubscriptionMixin(object):
- __slots__ = ()
- SubscriptionFlags = Subscription.Flags
-
- def subscribe(self, sender=None, iface=None, signal=None, object=None, arg0=None, flags=0, signal_fired=None):
- """Subscribes to matching signals.
-
- Subscribes to signals on connection and invokes signal_fired callback
- whenever the signal is received.
-
- To receive signal_fired callback, you need an event loop.
- https://github.com/LEW21/pydbus/blob/master/doc/tutorial.rst#setting-up-an-event-loop
-
- Parameters
- ----------
- sender : string, optional
- Sender name to match on (unique or well-known name) or None to listen from all senders.
- iface : string, optional
- Interface name to match on or None to match on all interfaces.
- signal : string, optional
- Signal name to match on or None to match on all signals.
- object : string, optional
- Object path to match on or None to match on all object paths.
- arg0 : string, optional
- Contents of first string argument to match on or None to match on all kinds of arguments.
- flags : SubscriptionFlags, optional
- signal_fired : callable, optional
- Invoked when there is a signal matching the requested data.
- Parameters: sender, object, iface, signal, params
-
- Returns
- -------
- Subscription
- An object you can use as a context manager to unsubscribe from the signal later.
-
- See Also
- --------
- See https://developer.gnome.org/gio/2.44/GDBusConnection.html#g-dbus-connection-signal-subscribe
- for more information.
- """
- callback = (lambda con, sender, object, iface, signal, params: signal_fired(sender, object, iface, signal, params.unpack())) if signal_fired is not None else lambda *args: None
- return Subscription(self.con, sender, iface, signal, object, arg0, flags, callback)
diff --git a/ui/lib/pydbus/timeout.py b/ui/lib/pydbus/timeout.py
deleted file mode 100644
index 0af65c1..0000000
--- a/ui/lib/pydbus/timeout.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from gi.repository import GLib, GObject
-
-def timeout_to_glib(timeout):
- if timeout is None:
- try:
- return GLib.MAXINT
- except AttributeError:
- # GLib < 2.46
- return GObject.G_MAXINT
- else:
- try:
- timeout = timeout.total_seconds()
- except AttributeError:
- pass
- return int(timeout * 1000)
diff --git a/ui/meson.build b/ui/meson.build
deleted file mode 100644
index 05d6f6d..0000000
--- a/ui/meson.build
+++ /dev/null
@@ -1,18 +0,0 @@
-project('breezydesktop',
- version: run_command('cat', join_paths('..', 'VERSION'), check: true).stdout().strip(),
- meson_version: '>= 0.62.0',
- default_options: [ 'warning_level=2', 'werror=false', ],
-)
-
-i18n = import('i18n')
-gnome = import('gnome')
-
-subdir('data')
-subdir('src')
-subdir('po')
-
-gnome.post_install(
- glib_compile_schemas: true,
- gtk_update_icon_cache: true,
- update_desktop_database: true,
-)
diff --git a/ui/modules/PyXRLinuxDriverIPC b/ui/modules/PyXRLinuxDriverIPC
deleted file mode 160000
index 40c9979..0000000
--- a/ui/modules/PyXRLinuxDriverIPC
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 40c9979d7e79d31047cb474c154018ce43afb63a
diff --git a/ui/po/LINGUAS b/ui/po/LINGUAS
deleted file mode 100644
index 25b3c08..0000000
--- a/ui/po/LINGUAS
+++ /dev/null
@@ -1 +0,0 @@
-de es fr it ja pl pt_BR ru sv uk_UA zh_CN
diff --git a/ui/po/breezydesktop.pot b/ui/po/breezydesktop.pot
deleted file mode 100644
index d9cbea8..0000000
--- a/ui/po/breezydesktop.pot
+++ /dev/null
@@ -1,717 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr ""
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr ""
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr ""
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr ""
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr ""
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr ""
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr ""
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr ""
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr ""
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr ""
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr ""
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr ""
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr ""
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr ""
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr ""
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr ""
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr ""
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr ""
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr ""
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr ""
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr ""
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr ""
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr ""
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr ""
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr ""
-
-#: src/time.py:20
-msgid "1 day"
-msgstr ""
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr ""
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr ""
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr ""
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr ""
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr ""
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr ""
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr ""
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr ""
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr ""
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr ""
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr ""
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr ""
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr ""
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr ""
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr ""
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr ""
-
-#: src/gtk/connected-device.ui:288
-msgid "Display angling"
-msgstr ""
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr ""
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr ""
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr ""
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr ""
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr ""
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr ""
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr ""
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr ""
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr ""
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr ""
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:424
-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:452
-msgid "Re-center display shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr ""
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr ""
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr ""
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr ""
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr ""
-
-#: src/gtk/connected-device.ui:662
-msgid "Remove virtual displays on disable"
-msgstr ""
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr ""
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr ""
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr ""
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr ""
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr ""
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr ""
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr ""
-
-#: src/gtk/connected-device.ui:874
-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:892
-msgid "Default"
-msgstr ""
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr ""
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr ""
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr ""
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr ""
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr ""
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr ""
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr ""
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr ""
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr ""
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr ""
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr ""
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr ""
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr ""
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr ""
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr ""
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr ""
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr ""
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr ""
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr ""
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr ""
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr ""
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr ""
diff --git a/ui/po/de.po b/ui/po/de.po
deleted file mode 100644
index e17716f..0000000
--- a/ui/po/de.po
+++ /dev/null
@@ -1,864 +0,0 @@
-# German translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-02 20:54-0700\n"
-"Last-Translator: \n"
-"Language-Team: German \n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Schaltet Ihre Brille in den Side-by-Side-Modus und verdoppelt die Breite des "
-"Bildschirms."
-
-#: src/connecteddevice.py:30
-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:160
-msgid "Set Focused Display Distance"
-msgstr "Setze fokussierte Bildschirmentfernung"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-"Nutze einen Näher Wert um den Bildschirm zu vergößern, wenn der Bildschirm "
-"angesehen wird."
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "Setze alle Bildschirmentfernungen"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-"Nutze einen Entfernter Wert um den Bildschirm zu verkleinern, wenn diese "
-"nicht angesehen werden."
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-"Virtuelle Bildschirme können nicht hinzugefügt werden.Wayland und xdg-"
-"desktop-portal werden benötigt"
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "Fokussierter Bildschirm"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "Gebogene Bildschirm"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Bezahlter Tarifstatus"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Funktionsverfügbarkeit"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Deaktiviert"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "Im Test"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Aktiviert"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} verbleibend)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Aktiv"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Inaktiv"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " zum erneuern"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " zum aktualisieren"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Bezahlt bis zum nächsten Erneuerungszeitraum"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - monatlich erneuern"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - jährlich erneuern"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "mit lebenslangem Zugriff"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Monatlich"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Jährlich"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "Lebenslang"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "weniger als eine Stunde"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 Stunde"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} Stunden"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 Tag"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} Tage"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "verbunden"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Allgemeine Einstellungen"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Funktionen"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "XR-Effekt"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Aktiviert den Breezy Desktop XR-Effekt."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr ""
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-"Bewege automatisch einen Bildschirm näher, wenn Sie ihn ansehen.\n"
-"Setzen Sie Ihren bevorzugten fokussierten und nicht fokussierten Abstand im "
-"Anpassungen Bereich.\n"
-" "
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Folgemodus"
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr "Halten Sie den virtuellen Bildschirm Nahe der Mitte Ihres Blickfelds."
-
-#: src/gtk/connected-device.ui:81
-msgid "Curved display"
-msgstr "Gebogener Bildschirm"
-
-#: src/gtk/connected-device.ui:82
-msgid "Switch between flat and curved displays."
-msgstr "Zwischen flachen und gebogenen Bildschirm wechseln."
-
-#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36
-msgid "Disable physical displays"
-msgstr "Physische Bildschirme deaktivieren"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-"Deaktiviere automatisch alle physikalischen Bildschirme, wenn der XR Effekt "
-"aktiviert ist."
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "Virtuelle Bildschirme"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "Eigene Auflösung hinzufügen"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "Eigene Auflösung entfernen"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "Bildschirme neu anordnen"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Einstellungen"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "Bildschirmentfernung"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr "Stelle ein, wie nah Ihre Bildschirme erscheinen sollen."
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Ändern"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Folgemodus-Schwelle"
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr "Wie weit Sie wegschauen können, bevor der Bildschirm folgt."
-
-#: src/gtk/connected-device.ui:288
-msgid "Display angling"
-msgstr "Bildschirmgröße"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr "Stelle ein, wie mehrere Bildschirme angewinkelt werden sollen."
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr "Automatisch"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "Seitlich gewinkelt"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "Oben gewinkelt"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "Flach"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "Bildschirmgröße"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr ""
-"Setze einen leeren Bereich zwischen Bildschirme, wenn mehrere vorhanden sind."
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr "Horizontaler Anzeigebereich Ausgleich"
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr "Bewege den Anzeigebreich nach links oder rechts der Anfangsposition."
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr "Links"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "Mitte"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "Rechts"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "Vertikaler Anzeigebereich Ausgleich"
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-"Bewege den Anzeigebreich nach oberhalb oder unterhalb der Anfangsposition."
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr "Unten"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "Oben"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Tastenkombinationen"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "XR-Effekt an/aus Tastenkombination"
-
-#: src/gtk/connected-device.ui:424
-msgid ""
-"Quickly enable or disable the XR Effect. You may need to enable the effect "
-"manually once in order to enable the shortcut."
-msgstr ""
-"Schnell den XR-Effekt aktivieren oder deaktivieren. Möglicherweise muss der "
-"Effekt einmalig manuell aktiviert werden, um die Tastenkombination zu "
-"aktivieren."
-
-#: src/gtk/connected-device.ui:452
-msgid "Re-center display shortcut"
-msgstr "Bildschirm-Zentrierung-Tastenkombination"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Heften Sie den virtuellen Bildschirm an die aktuelle Position an."
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "Folgemodus-Tastenkombination umschalten"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Schnell den Folgemodus wechseln."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Folgemodus-Tastenkombination umschalten"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Schnell den Folgemodus wechseln."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr "Mauszeigerazeigenkürzel"
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr "Bewege den Mauszeiger in die Mitte des fokussierten Bildschirms."
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Erweiterte Einstellungen"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Optimale Bildschirm-Konfiguration finden"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"Ändern Sie die Bildschirmkonfiguration der Brille automatisch zur maximalen "
-"Auflösung und besten Skalierung, wenn sie angeschlossen ist."
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "Höchste Bildwiederholrate verwenden"
-
-#: src/gtk/connected-device.ui:630
-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:640
-msgid "Center on glasses' display"
-msgstr "Zentriere auf den Brillenbildschirm"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-"Zentriere den Anzeigebereich auf den Brillenbildschirm, selbst wenn der "
-"Bildschirm nicht mittig ist."
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Immer primärer Bildschirm"
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr ""
-"Setzen Sie die Brille automatisch als primären Bildschirm, wenn sie "
-"angeschlossen ist."
-
-#: src/gtk/connected-device.ui:662
-msgid "Remove virtual displays on disable"
-msgstr "Gebogener Bildschirm"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-"Entferne virtuelle Bildschirme automatisch, wenn der XR Effekt deaktiviert "
-"ist."
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "Aktiviere Multi Tap Erkennung"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-"Aktviert die Doppelberührung zum rezentrieren und Dreifach-berührung zum "
-"Kalibrieren."
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "Gebogener Bildschirm"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr "Folgemodus bewegt alle Bildschirme, nicht nur den fokussierten"
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "Folgemodus Bewegungstracking"
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr "Setzen Sie, welchen Bewegungen der Folgemodus folgen soll."
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr "Horizontal"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "Vertikal"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "Neigen/Rollen"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Bewegungsvorausschau"
-
-#: src/gtk/connected-device.ui:874
-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 ""
-"Wirkt Eingabeverzögerungen entgegen, indem die Kopfverfolgungsposition vor "
-"der Renderzeit vorhergesagt wird. Bleiben Sie bei den Standardeinstellungen, "
-"es sei denn, der virtuelle Bildschirm hängt hinter Ihren Kopfbewegungen "
-"hinterher, springt vor oder ist sehr wackelig."
-
-#: src/gtk/connected-device.ui:892
-msgid "Default"
-msgstr "Standard"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "Textskalierung"
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr "Text unter 1.0 skalieren simuliert einen höher aufgelösten Bildschirm"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "Breite"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "Höhe"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "Eigene Auflösung hinzufügen"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "Hinzufügen"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "Näher"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "Entfernter"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "Fertig"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Ungültige Breezy Desktop GNOME-Installation"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Ihre Breezy GNOME-Installation ist ungültig oder unvollständig. Führen Sie "
-"das Setup-Skript bitte erneut aus. Melden Sie dieses Problem, falls es "
-"weiterhin besteht."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Spenden"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Ein Token anfordern"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Token verifizieren"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Lizenzdetails"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Kein Gerät verbunden"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop konnte kein unterstütztes XR-Gerät erkennen."
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "XR-Effekt automatisch aktivieren"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"Automatisch den Breezy Desktop XR-Effekt aktivieren, wenn unterstützte "
-"Gläser verbunden werden"
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Kein Treiber wird ausgeführt"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Wenn Sie über das AUR installiert haben, stellen Sie sicher, dass Sie den "
-"empfohlenen Post-Installationsbefehl ausgeführt haben:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Andernfalls melden Sie bitte ein Problem auf GitHub oder erstellen Sie "
-"einen neuen Thread im Kanal #troubleshooting auf Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Breezy Desktop GNOME-Erweiterung nicht bereit"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Wenn Sie die Einrichtung gerade ausgeführt haben, müssen Sie sich "
-"möglicherweise abmelden und wieder anmelden, um sie zu verwenden. "
-"Andernfalls folgen Sie bitte den Breezy GNOME-Einrichtungsanweisungen."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Keine Lizenzdatei wurde gefunden"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" Beim ersten Start von Breezy Desktop ist eine Internetverbindung "
-"erforderlich, um die Lizenz für Ihr Gerät abzurufen.\n"
-" \n"
-" Keine Sorge, es besteht keine Verpflichtung, jetzt eine Spende zu tätigen. "
-"Wenn Sie nicht spenden, erhalten Sie eine Testlizenz, damit Sie entscheiden "
-"können, ob Breezy Desktop Ihren Anforderungen entspricht.\n"
-" \n"
-" Sobald Sie eine Lizenz, egal ob eine Test- oder Kauflizenz, erhalten haben, "
-"können Sie Breezy Desktop offline nutzen, auch wenn die Funktionen ablaufen "
-"(oder unbegrenzt, wenn Sie sich für den lebenslangen Zugriff entschieden "
-"haben).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Erneut versuchen"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Tastenkombination zuweisen"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr ""
-"Drücken Sie Ihre Tastenkombination oder die 'Rücktaste', um ... zu "
-"deaktivieren"
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Menü"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Einige Funktionen laufen bald ab"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Details anzeigen"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Produktivitätsfunktionen sind deaktiviert"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Zurrücksetzung erwzingen"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Über BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Side-by-Side-Modus (Gaming)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Glattes Verfolgen (Gaming)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (Produktivität)"
-
-#~ msgid "Gaming"
-#~ msgstr "Gaming"
-
-#~ msgid "Productivity"
-#~ msgstr "Produktivität"
-
-#~ msgid "fullscreen"
-#~ msgstr "Vollbild"
-
-#~ msgid "Show full range"
-#~ msgstr "Gesamtes Spektrum anzeigen"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
-#~ "portal are required."
-#~ msgstr ""
-#~ "Virtuelle Bildschirme können nicht hinzugefügt werden.Wayland und xdg-"
-#~ "desktop-portal werden benötigt"
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Schnelles SBS-Modus-Wechseln"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Schaltet die Brille sofort in den SBS-Modus, wenn sie angeschlossen ist, "
-#~ "wenn der Breitbildmodus aktiviert ist. Kann zu Instabilität führen."
-
-#, fuzzy
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Display-Entfernung"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Breitbildmodus"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Näher erscheint größer, weiter erscheint kleiner. Steuert die Tiefe, wenn "
-#~ "im Breitbildmodus."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Kombinieren Sie mit der Display-Entfernung, um eine bequeme Ebene der "
-#~ "Tiefe und Größe zu erreichen."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Umschalten der Display-Entfernungen"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Verwenden Sie die Schaltflächen, um die aktuelle Display-Entfernung für "
-#~ "die Verwendung mit der Tastenkombination aufzufangen."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Display-Entfernung-Tastenkombination"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Schnell zwischen zwei vordefinierten Entfernungen wechseln."
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Im Breitbildmodus starten"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr "Breitbildmodus wird nicht für alle Gläsern unterstützt"
diff --git a/ui/po/es.po b/ui/po/es.po
deleted file mode 100644
index ee17494..0000000
--- a/ui/po/es.po
+++ /dev/null
@@ -1,857 +0,0 @@
-# Spanish translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-02 20:55-0700\n"
-"Last-Translator: \n"
-"Language-Team: Spanish \n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Cambia tus gafas al modo lado a lado y duplica el ancho de la pantalla."
-
-#: src/connecteddevice.py:30
-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:160
-msgid "Set Focused Display Distance"
-msgstr "Ajusta Distancia de Enfoque de la Pantalla"
-
-#: src/connecteddevice.py:161
-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."
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "Ajusta Todas las Distancias de Pantalla"
-
-#: src/connecteddevice.py:169
-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."
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-"No se pueden agregar pantallas virtuales en esta máquina. Se requiere "
-"Wayland y xdg-desktop-portal."
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "Pantalla enfocada"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "Todas las pantallas"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Estado del Nivel de Membresía Pagada"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Disponibilidad de Características"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Deshabilitado"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "En prueba"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Habilitado"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} restantes)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Activo"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Inactivo"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " para renovar"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " para actualizar"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Pagado hasta el próximo período de renovación"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - renovando mensualmente"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - renovando anualmente"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "con acceso de por vida"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Mensual"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Anual"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "De por vida"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "menos de una hora"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 hora"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} horas"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 día"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} días"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "conectado"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Configuración General"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Características"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "Efecto XR"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Habilita el efecto XR de Breezy Desktop."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr "Acercar al enfocar"
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-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"
-" "
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Modo de seguimiento"
-
-#: src/gtk/connected-device.ui:71
-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
-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:36
-msgid "Disable physical displays"
-msgstr "Desactivar pantallas físicas"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-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."
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "Pantallas virtuales"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "Añadir personalizada"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "Eliminar resolución personalizada"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "Reorganizar pantallas"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Ajustes"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "Distancias de la pantalla"
-
-#: 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:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Cambiar"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Umbral de seguimiento"
-
-#: src/gtk/connected-device.ui:265
-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:288
-msgid "Display angling"
-msgstr "Inclinación de la pantalla"
-
-#: src/gtk/connected-device.ui:289
-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:303
-msgid "Automatic"
-msgstr "Automático"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "Inclinación lateral"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "Inclinación superior"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "Plano"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "Separación de pantallas"
-
-#: src/gtk/connected-device.ui:317
-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:347
-msgid "Viewport horizontal offset"
-msgstr "Desplazamiento horizontal del visor"
-
-#: src/gtk/connected-device.ui:348
-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:365
-msgid "left"
-msgstr "izquierda"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "centro"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "derecha"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "Desplazamiento vertical del visor"
-
-#: src/gtk/connected-device.ui:378
-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:395
-msgid "down"
-msgstr "abajo"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "arriba"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Atajos de teclado"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "Atajo encendido/apagado Efecto XR"
-
-#: src/gtk/connected-device.ui:424
-msgid ""
-"Quickly enable or disable the XR Effect. You may need to enable the effect "
-"manually once in order to enable the shortcut."
-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:452
-msgid "Re-center display shortcut"
-msgstr "Atajo para recentrar la pantalla"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Fije la pantalla virtual en la posición actual."
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "Atajo para alternar el acercamiento al enfocar"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Modo para alternar rápidamente el acercamiento al enfocar."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Atajo para alternar el modo de seguimiento"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Activar el modo de seguimiento."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Configuración Avanzada"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Encuentre la configuración de pantalla óptima"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"Modifique automáticamente la configuración de pantalla de las gafas para "
-"obtener la máxima resolución y la mejor escalabilidad cuando estén "
-"enchufadas."
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "Utilizar la frecuencia de actualización más alta"
-
-#: src/gtk/connected-device.ui:630
-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:640
-msgid "Center on glasses' display"
-msgstr "Centrar en la pantalla de las gafas"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-"Centrar el visor en la pantalla de las gafas, incluso si la pantalla no está "
-"en el centro."
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Siempre como pantalla principal"
-
-#: src/gtk/connected-device.ui:652
-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:662
-msgid "Remove virtual displays on disable"
-msgstr "Eliminar pantallas virtuales al desactivar"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-"Eliminar automáticamente las pantallas virtuales cuando se desactiva el "
-"efecto XR."
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "Activar la detección de toques múltiples"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-"Activa el doble toque para recentrar y el triple toque para recalibrar."
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "Modo de seguimiento de todas las pantallas"
-
-#: src/gtk/connected-device.ui:685
-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:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "Rastreo de movimiento de modo de seguimiento"
-
-#: src/gtk/connected-device.ui:800
-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:815
-msgid "Horizontal"
-msgstr "Horizontal"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "Vertical"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "Inclinación/giro"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Anticipación de movimiento"
-
-#: src/gtk/connected-device.ui:874
-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 ""
-"Compensa el retraso de entrada al predecir la posición de seguimiento de la "
-"cabeza antes del tiempo de representación. Manténgase en el valor "
-"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:892
-msgid "Default"
-msgstr "Predeterminado"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "Escalado de Texto"
-
-#: src/gtk/connected-device.ui:905
-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 "
-"resolución"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "Anchura"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "Altura"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "Añadir una Resolución Personalizada"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "Añadir"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "más próximo"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "más lejano"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "Hecho"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Configuración inválida de Breezy Desktop GNOME"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Su configuración de Breezy GNOME es inválida o incompleta. Vuelva a ejecutar "
-"el script de configuración. Informe sobre este problema si persiste."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Donar"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Solicitar un token"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Verificar token"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Detalles de la Licencia"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "No hay dispositivo conectado"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop no pudo detectar ningún dispositivo XR compatible."
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "Auto-activar efecto XR"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"Habilita automáticamente el efecto Breezy Desktop XR cuando se conectan "
-"gafas compatibles."
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "No se está ejecutando ningún controlador"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Si instaló a través de AUR, asegúrese de haber ejecutado el comando de "
-"instalación recomendado:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" De lo contrario, por favor informe sobre el problema en GitHub, o cree un "
-"nuevo hilo en el canal #troubleshooting de Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "La extensión de Breezy Desktop GNOME no está lista"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Si acaba de ejecutar la configuración, es posible que deba cerrar sesión y "
-"volver a iniciar para usarla. De lo contrario, siga las instrucciones de "
-"configuración de Breezy GNOME."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "No se encontró ningún archivo de licencia"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" La primera vez que use Breezy Desktop, se requiere una conexión a Internet "
-"para recuperar la licencia de su dispositivo.\n"
-" \n"
-" No se preocupe, no hay ninguna obligación de donar en este momento. Si no "
-"lo ha hecho, se le proporcionará una licencia de prueba para que pueda "
-"decidir si Breezy Desktop se ajusta a sus necesidades.\n"
-" \n"
-" Una vez que obtenga una licencia, de prueba o de otro tipo, podrá utilizar "
-"Breezy Desktop sin conexión hasta que expiren las características (o "
-"indefinidamente, si ha elegido el acceso de por vida). "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Reintentar"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Asignar método abreviado de teclado"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr ""
-"Presione su método abreviado de teclado o pulsa 'retroceso' para "
-"deshabilitar..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Menú"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Algunas funciones expirarán pronto"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Ver detalles"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Las funciones de productividad están deshabilitadas"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Reinicio forzoso"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Acerca de BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Modo lado a lado (juegos)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Seguimiento suave (juegos)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (productividad)"
-
-#~ msgid "Gaming"
-#~ msgstr "Juegos"
-
-#~ msgid "Productivity"
-#~ msgstr "Productividad"
-
-#~ msgid "fullscreen"
-#~ msgstr "a toda pantalla"
-
-#~ msgid "Show full range"
-#~ msgstr "Mostrar rango completo"
-
-#~ 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."
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Cambio rápido de modo SBS"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Cambia las gafas al modo SBS (lado a lado) inmediatamente cuando se "
-#~ "enchufan, si el modo de pantalla ancha está activado. Puede causar "
-#~ "inestabilidad."
-
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Establecer Distancia de las Pantallas Desenfocadas"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Modo pantalla ancha"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Más cerca parece más grande, más lejos parece más pequeño. Controla la "
-#~ "profundidad cuando está en modo de pantalla ancha."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Combínalo con la distancia de la pantalla para lograr un nivel cómodo de "
-#~ "profundidad y tamaño."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Distancias de alternancia de pantalla"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Utilice los botones para capturar la distancia actual de la pantalla para "
-#~ "su uso con el método abreviado de teclado."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Atajo de distancia de pantalla"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Cambiar rápidamente entre dos distancias predefinidas."
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Empezar en modo pantalla ancha"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr "El modo pantalla ancha no está soportado en todas las gafas."
diff --git a/ui/po/fr.po b/ui/po/fr.po
deleted file mode 100644
index 09d33ce..0000000
--- a/ui/po/fr.po
+++ /dev/null
@@ -1,867 +0,0 @@
-# French translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-02 20:54-0700\n"
-"Last-Translator: \n"
-"Language-Team: French \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Basculez vos lunettes en mode Side-By-Side (Côte-à-Côte) et doublez la "
-"largeur de l'écran."
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr ""
-"Cette fonctionnalité n'est actuellement pas prise en charge par votre "
-"appareil."
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr "Définir la distance de l'écran cible"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-"Utiliser une valeur plus proche pour que l'écran zoom lorsqu'on le regarde."
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "Définir la distance d'affichage de tous les écrans"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-"Utiliser une valeur plus éloignée afin que les écrans dézooment lorsqu'on ne "
-"les regarde plus."
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-"Impossible d'ajouter des écrans virtuels sur cet appareil. Wayland et xdg-"
-"desktop-portal sont nécessaires."
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "Ecran cible"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "Tous les écrans"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Statut de l'abonnement payant"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Disponibilité des fonctionnalités"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Désactivé"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "En essai"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Activé"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} restant)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Actif"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Inactif"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " à renouveler"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " à mettre à niveau"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Payé jusqu'à la prochaine période de renouvellement"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - renouvellement mensuel"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - renouvellement annuel"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "avec accès à vie"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Mensuel"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Annuel"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "À vie"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "moins d'une heure"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 heure"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} heures"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 jour"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} jours"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "connecté"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Paramètres généraux"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Fonctionnalités"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "Effet XR"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Active l'effet Breezy Desktop XR."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr "Zoomer sur l'écran cible"
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-"Fait automatiquement avancer l'écran lorsqu'on le regarde. Réglez votre "
-"niveau de zoom et de dézoom dans la section Ajustements.\n"
-" "
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Mode de suivi"
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr "Garde l'écran cible près du centre de votre champ de vision."
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr "Désactiver les écrans physiques"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-"Désactive automatiquement tous les écrans physiques lorsque le mode XR est "
-"activé."
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "Ecrans virtuels"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "Ajouter un réglage"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "Retirer la résolution personnalisée"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "Réarranger les écrans"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Réglages"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "Distance des écrans"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr "Réglez la distance à laquelle vous voulez que les écrans apparaissent."
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Changer"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Seuil de suivi"
-
-#: src/gtk/connected-device.ui:265
-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:288
-msgid "Display angling"
-msgstr "Orientation des écrans"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-"Lorsqu'il y a plusieur sécrans, définissez comment ils devraient être "
-"orientés."
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr "Automatique"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "Pivot sur le côté"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "Pivot sur le dessus"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "Plat"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "Espacement des écrans"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr "Ajoute un espace vide entre les écrans lorsqu'il y en a plusieurs."
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr "Décalage horizontal de l'affichage"
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-"Décale l'affichage des écrans vers la gauche ou la droite de la position par "
-"défaut."
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr "gauche"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "centre"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "droite"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "Décalage vertical de l'affichage"
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-"Décale l'affichage des écrans au dessus ou au dessous de la position par "
-"défaut."
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr "bas"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "haut"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Raccourcis clavier"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "Raccourci on/off de l'effet XR"
-
-#: src/gtk/connected-device.ui:424
-msgid ""
-"Quickly enable or disable the XR Effect. You may need to enable the effect "
-"manually once in order to enable the shortcut."
-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:452
-msgid "Re-center display shortcut"
-msgstr "Raccourci de recentrage de l'affichage"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Fixez l'affichage virtuel à la position actuelle"
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "Raccourci d'activation du zoom sur l'écran ciblé"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Zoom rapidement sur l'écran que l'on regarde"
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Raccourci de basculement du mode de suivi"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Basculer rapidement le mode de suivi."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr "Raccourci de téléportation de la souris"
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-"Ramène automatiquement la souris au centre de l'écran que vous regardez."
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Paramètres avancés"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Trouver la configuration d'affichage optimale"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"Modifiez automatiquement la configuration d'affichage des lunettes pour une "
-"résolution maximale et une meilleure mise à l'échelle lorsque elles sont "
-"branchées."
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "Utiliser le taux de rafraîchissement le plus élevé"
-
-#: src/gtk/connected-device.ui:630
-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:640
-msgid "Center on glasses' display"
-msgstr "Garder l'écran principal au centre"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-"Garde l'écran principal au centre de la vue, même si l'écran n'est pas au "
-"milieu."
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Affichage principal en permanence"
-
-#: src/gtk/connected-device.ui:652
-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:662
-msgid "Remove virtual displays on disable"
-msgstr "Supprimer les écrans virtuels sur déconnection"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-"Supprime automatiquement les écrans virtuels lorsque l'effet XR est "
-"désactivé."
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "Activer la détection du tapotement"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr "Active le double-tap pour recentrer et le triple-tap pour recalibrer."
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "Tous les écrans en mode suivi"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-"Le mode suivi déplace tous les écrans, pas seulement celui que l'on regarde."
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "Suivi des mouvements en mode suivi"
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr "Définissez quels mouvements doivent être suivis en mode suivi."
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr "Horizontaux"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "Verticaux"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "Inclinaison"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Anticipation des mouvements"
-
-#: src/gtk/connected-device.ui:874
-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 ""
-"Compense le lag d'entrée en prédisant la position de suivi de la tête avant "
-"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:892
-msgid "Default"
-msgstr "Par défaut"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "Mise à l'échelle du texte"
-
-#: src/gtk/connected-device.ui:905
-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 "
-"plus haute résolution"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "Largeur"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "Hauteur"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "Ajouter une résolution personnalisée"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "Ajouter"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "Plus proche"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "Plus éloigné"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "Terminé"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Configuration Breezy Desktop GNOME non valide"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Votre configuration Breezy GNOME est invalide ou incomplète. Veuillez "
-"exécuter à nouveau le script de configuration. Signalez ce problème s'il "
-"persiste."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Faire un don"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Demander un jeton d'authentification"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Vérifier le jeton d'authentification"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Détails de la licence"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Aucun appareil connecté"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop n'a pas pu détecter d'appareils XR pris en charge."
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "Activation automatique de l'effet XR"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"Activer automatiquement l'effet Breezy Desktop XR lorsque des lunettes "
-"compatibles sont connectées."
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Aucun pilote en cours d'exécution"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Si vous avez installé via AUR, assurez-vous d'avoir exécuté la commande de "
-"post-installation recommandée:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Sinon, veuillez signaler le problème sur GitHub, ou créer un nouveau fil de "
-"discussion dans le canal #troubleshooting sur Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Extension Breezy Desktop GNOME non prête"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Si vous venez d'exécuter la configuration, vous devrez peut-être vous "
-"déconnecter et vous reconnecter pour l'utiliser. Sinon, veuillez suivre les "
-"instructions d'installation de Breezy GNOME."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Aucun fichier de licence trouvé"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" La première fois que vous utilisez Breezy Desktop, une connexion Internet "
-"est requise pour récupérer la licence de votre appareil.\n"
-" \n"
-" Ne vous inquiétez pas, vous n'êtes pas obligé de faire un don à ce stade. "
-"Si vous ne le faites pas, vous obtiendrez une licence d'essai pour vous "
-"permettre de décider si Breezy Desktop répond à vos besoins.\n"
-" \n"
-" Une fois que vous avez obtenu une licence, d'essai ou autre, vous pouvez "
-"utiliser Breezy Desktop hors ligne jusqu'à l'expiration des fonctionnalités "
-"(ou indéfiniment, si vous avez choisi l'accès à vie).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Réessayer"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Attribuer un raccourci clavier"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr ""
-"Appuyez sur votre raccourci clavier ou sur 'Backspace' pour désactiver..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Menu"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Certaines fonctionnalités expirent bientôt"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Afficher les détails"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Les fonctionnalités de productivité sont désactivées"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Réinitialiser"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "À propos de BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Mode SBS (jeu)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Suivi fluide (jeu)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (productivité)"
-
-#~ msgid "Gaming"
-#~ msgstr "Jeu"
-
-#~ msgid "Productivity"
-#~ msgstr "Productivité"
-
-#~ msgid "fullscreen"
-#~ msgstr "Plein écran"
-
-#~ msgid "Show full range"
-#~ msgstr "Afficher toute la gamme"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
-#~ "portal are required."
-#~ msgstr ""
-#~ "Impossible d'ajouter des écrans virtuels sur cet appareil. Wayland et xdg-"
-#~ "desktop-portal sont nécessaires."
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Bascule rapide vers le mode SBS"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Bascule les lunettes vers le mode SBS immédiatement lorsqu'elles sont "
-#~ "branchées si le mode grand écran est activé. Peut provoquer des "
-#~ "instabilités."
-
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Régler la distance des écrans que l'on ne regarde pas"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Mode grand écran"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Plus proche apparaît plus grand, plus éloigné apparaît plus petit. "
-#~ "Contrôle la profondeur lorsque vous êtes en mode grand écran."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Combinez avec la distance d'affichage pour obtenir un niveau de "
-#~ "profondeur et de taille confortable."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Distances de basculement de l'affichage"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Utilisez les boutons pour capturer la distance d'affichage actuelle pour "
-#~ "une utilisation avec le raccourci clavier."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Raccourci de distance d'affichage"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Basculez rapidement entre deux distances prédéfinies."
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Démarer en mode grand écran"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr "Le mode écran large n'est pas compatible avec toutes les lunettes."
diff --git a/ui/po/it.po b/ui/po/it.po
deleted file mode 100644
index 5fb2dd1..0000000
--- a/ui/po/it.po
+++ /dev/null
@@ -1,864 +0,0 @@
-# Italian translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-02 21:14-0700\n"
-"Last-Translator: \n"
-"Language-Team: Italian \n"
-"Language: it\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Passa i tuoi occhiali in modalità side-by-side e raddoppia la larghezza del "
-"display."
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr "Questa funzione non è attualmente supportata sul tuo dispositivo."
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr "Distanza del display con focus"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-"Usa un valore più vicino, così che il display si avvicini quando lo guardi."
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "Imposta la distanza di tutti i display"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-"Usa un valore più distante così che i display si allontanino quando distogli "
-"lo sguardo."
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-"Non è possibile aggiungere display virtuali su questo dispositivo. Sono "
-"richiesti Wayland e xdg-desktop-portal."
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "Distanza del display col focus"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "Tutti i display"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Stato del livello a pagamento"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Disponibilità delle funzionalità"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Disabilitato"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "In prova"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Abilitato"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} rimanenti)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Attivo"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Inattivo"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " da rinnovare"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " per aggiornare"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Pagato fino al prossimo periodo di rinnovo"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - rinnovo mensile"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - rinnovo annuale"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "con accesso perpetuo"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Mensile"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Annuale"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "Perpetuo"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "meno di un'ora"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 ora"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} ore"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 giorno"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} giorni"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "connesso"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Impostazioni generali"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Funzionalità"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "Effetto XR"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Abilita l'effetto XR di Breezy Desktop."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr "Zoom sul focus"
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-"Imposta la tua distanza preferita per i display con focus e non nella "
-"sezione Regolazioni."
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Modalità di inseguimento"
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr "Mantieni il display col focus vicino al centro del tuo campo visivo."
-
-#: src/gtk/connected-device.ui:81
-msgid "Curved display"
-msgstr "Schermo curvo"
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr "Disabilita display fisici"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-"Disabilita automaticamente tutti i display fisici quando l'effetto XR è "
-"abilitato."
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "Display virtuali"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "Aggiungere personalizzato"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "Rimuovi risoluzione personalizzata"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "Riarrangia i Display"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Regolazioni"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "Distanze del display"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr "Imposta quanto vicino vuoi che appaiano i display"
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Cambia"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Soglia di inseguimento"
-
-#: src/gtk/connected-device.ui:265
-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:288
-msgid "Display angling"
-msgstr "Angolazione del display"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-"Quando ci sonn display multipli, scegli come dovrebbero angolarsi davanti a "
-"te."
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr "Automatico"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "Angolazione su un lato"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "Angolazione in alto"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "Piatto"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "Spaziatura del display"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr "Inserisci spazio vuoto tra i display, quando ce ne sono molteplici."
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr "Spostamento orizzontale della visuale"
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-"Muovi la visuale a sinistra o a destra rispetto alla sua posizione di "
-"default."
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr "sinistra"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "centro"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "destra"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "Spostamento verticale della visuale"
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr "Muovi la visuale su o giù rispetto alla sua posizione di default."
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr "giù"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "su"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Scorciatoie da tastiera"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "Scorciatoia per on/off dell'effetto XR"
-
-#: src/gtk/connected-device.ui:424
-msgid ""
-"Quickly enable or disable the XR Effect. You may need to enable the effect "
-"manually once in order to enable the shortcut."
-msgstr ""
-"Abilitazione/disabilitazione rapida dell'effetto XR. Può essere necessario "
-"abilitare l'effetto manualmente almeno una volta per abilitare la "
-"scorciatoia da tastiera."
-
-#: src/gtk/connected-device.ui:452
-msgid "Re-center display shortcut"
-msgstr "Scorciatoia per ricentrare il display"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Fissa il display virtuale alla posizione attuale."
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "Scorciatoia per attivare/disattivare lo zoom sul focus"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Attivazione/disattivazione rapida della modalità di zoom sul focus."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Scorciatoia per attivare/disattivare la modalità di inseguimento"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Attivazione/disattivazione rapida della modalità di inseguimento."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr "Scorciatoia per richiamare il cursore del mouse "
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr "Porta il cursore del mouse al centro del display col focus."
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Impostazioni avanzate"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Trova la configurazione ottimale del display"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-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:629
-msgid "Use highest refresh rate"
-msgstr "Usa la frequenza di aggiornamento più elevata"
-
-#: src/gtk/connected-device.ui:630
-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:640
-msgid "Center on glasses' display"
-msgstr "Centra sui display degli occhiali"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-"Centra la visuale sul display degli occhiali, anche se il display non è nel "
-"mezzo."
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Imposta sempre come display primario"
-
-#: src/gtk/connected-device.ui:652
-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:662
-msgid "Remove virtual displays on disable"
-msgstr "Rimuovi il display virtuale quando disabilitato"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-"Rimuovi automaticamente i display virtuali quando l'effetto XR è "
-"disabilitato."
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "Abilita il riconoscimento del tocco multiplo"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-"Abilita il doppio tocco per ricentrare e il triplo tocco per ricalibrare."
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "Modalità inseguimento su tutti i display"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-"La modalità inseguimento muove tutti i display, non solo quello col focus."
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "Tracciamento del movimento nella modalità inseguimento"
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-"Scegli quale movimento deve essere tracciato nella modalità inseguimento."
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr "Orizzontale"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "Verticale"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "Inclina/ruota"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Anticipo del movimento"
-
-#: src/gtk/connected-device.ui:874
-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 ""
-"Compensa il ritardo di input prevedendo la posizione del tracciamento della "
-"testa prima del tempo di rendering. Rimani con il valore predefinito a meno "
-"che il display virtuale non rimanga indietro rispetto ai tuoi movimenti, non "
-"salti in avanti o sia molto tremolante."
-
-#: src/gtk/connected-device.ui:892
-msgid "Default"
-msgstr "Predefinito"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "Ridimensionamento del testo"
-
-#: src/gtk/connected-device.ui:905
-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 "
-"display"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "Larghezza"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "Altezza"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "Aggiungi una Risoluzione Personalizzata"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "Aggiungi"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "più vicino"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "più lontano"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "Fatto"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Configurazione non valida di Breezy Desktop GNOME"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"La tua configurazione di Breezy GNOME non è valida o è incompleta. Ripeti "
-"l'esecuzione dello script di configurazione. Segnala questo problema se "
-"persiste."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Fai una Donazione"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Richiesta di un token"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Verifica del token"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Dettagli della licenza"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Nessun dispositivo connesso"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop non ha rilevato nessun dispositivo XR supportato."
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "Abilitazione automatica effetto XR"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"Abilita automaticamente l'effetto XR di Breezy Desktop quando vengono "
-"connessi degli occhiali supportati."
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Nessun driver in esecuzione"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Se hai installato tramite AUR, assicurati di aver eseguito il "
-"comando di post-installazione consigliato:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" In caso contrario, segnala il problema su GitHub o crea un nuovo "
-"thread nel canale #troubleshooting su Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Estensione di Breezy Desktop GNOME non pronta"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Se hai appena eseguito la configurazione, potrebbe essere necessario "
-"disconnettersi e riconnettersi per utilizzarla. In caso contrario, segui le "
-"istruzioni di configurazione di Breezy GNOME."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Nessun file di licenza trovato"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" La prima volta che utilizzi Breezy Desktop, è necessaria una "
-"connessione Internet per recuperare la licenza del tuo dispositivo.\n"
-" \n"
-" Non preoccuparti, non è obbligatorio donare adesso. Se non lo hai "
-"già fatto, ti verrà fornita una licenza di prova in modo da poter decidere "
-"se Breezy Desktop soddisfa le tue esigenze.\n"
-" \n"
-" Una volta ottenuta una licenza, di prova o altra, puoi utilizzare "
-"Breezy Desktop offline fino alla scadenza delle funzionalità (o a tempo "
-"indeterminato, se hai scelto l'accesso perpetuo).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Riprova"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Assegna una scorciatoia da tastiera"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr "Premi la tua scorciatoia da tastiera o 'Backspace' per disabilitare..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Menu"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Alcune funzionalità scadranno presto"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Visualizza dettagli"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Le funzionalità di produttività sono disabilitate"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Reset forzato"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Informazioni su BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Modalità side-by-side (gaming)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Smooth Follow (gaming)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (produttività)"
-
-#~ msgid "Gaming"
-#~ msgstr "Gaming"
-
-#~ msgid "Productivity"
-#~ msgstr "Produttività"
-
-#~ msgid "fullscreen"
-#~ msgstr "schermo intero"
-
-#~ msgid "Show full range"
-#~ msgstr "Visualizza gamma completa"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
-#~ "portal are required."
-#~ msgstr ""
-#~ "Non è possibile aggiungere display virtuali su questo dispositivo. Sono "
-#~ "richiesti Wayland e xdg-desktop-portal."
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Passaggio rapido alla modalità SBS"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Passa immediatamente gli occhiali alla modalità SBS quando vengono "
-#~ "collegati, se la modalità widescreen è attiva. Potrebbe causare "
-#~ "instabilità."
-
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Imposta la distanza dei display senza focus"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Modalità widescreen"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Più vicino appare più grande, più lontano appare più piccolo. Controlla "
-#~ "la profondità quando sei in modalità widescreen."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Da combinare con la distanza del display per ottenere un livello "
-#~ "confortevole di profondità e dimensione."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Distanze di attivazione del cambio display"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Usa i pulsanti per acquisire la distanza attuale del display da "
-#~ "utilizzare con la scorciatoia da tastiera."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Scorciatoia per la distanza del display"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Scambio rapido tra due distanze predefinite."
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Si attiva in modalità widescreen"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr ""
-#~ "Breezy Desktop non è riuscito a rilevare alcun dispositivo XR supportato."
diff --git a/ui/po/ja.po b/ui/po/ja.po
deleted file mode 100644
index ccc66b0..0000000
--- a/ui/po/ja.po
+++ /dev/null
@@ -1,849 +0,0 @@
-# Japanese translations for PACKAGE package.
-# Copyright (C) 2024-2026 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-# , 2026.
-#
-# Breezy DesktopやXR、GNOMEのような固有名詞はそのままの表記にしています。
-# 「gaming」が「ゲーミング」なので「productivity」も「プロダクティビティ」とカナ表記にしました。
-# 「glasses」は「XRエフェクト」から「XRメガネ」にしても良かったんですが、繰り返すのもくどいので「メガネ」にしてます。
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2026-02-11 07:53+0900\n"
-"Last-Translator: iwaim.sub@gmail.com\n"
-"Language-Team: Japanese \n"
-"Language: ja\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr "メガネを3Dモードに切り替え、表示の幅を2倍にします。"
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr "現在接続されているデバイスはこの機能に対応していません。"
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr "フォーカスされたディスプレイ距離"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr "近くに設定すると見たディスプレイにズームインします。"
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "すべてのディスプレイ距離"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr "遠くに設定すると視線の外れたディスプレイがズームアウトします。"
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr "仮想ディスプレイが追加できません。"
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "フォーカスされたディスプレイ"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "すべてのディスプレイ"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "有料ティアの状態"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "利用できる機能"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "無効"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "試用期間中"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "有効"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr "(残り {time_remaining})"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "アクティブ"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "非アクティブ"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "あと${amount} (USD)"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr "で更新可能"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr "でアップグレード可能"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "次の更新期間まで支払済み"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - 月払い"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - 年払い"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "一括払い済み"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "月払い"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "年払い"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "一括払い"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "1時間未満"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1時間"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining}時間"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1日"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining}日"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "接続済み"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "一般設定"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "機能"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "XRエフェクト"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Breezy DesktopのXRエフェクトを有効にします。"
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr "フォーカス時にズーム"
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-"見たディスプレイが自動的に近づきます。\n"
-"フォーカス時とそれ以外の距離は調整セクションで設定できます。"
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "フォローモード"
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr "仮想ディスプレイを視界の中心近くに保ちます。"
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr "物理ディスプレイの無効化"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr "XRエフェクト有効時、自動的に物理ディスプレイを無効化する。"
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "仮想ディスプレイ"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "カスタム解像度"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "カスタム解像度の削除"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "ディスプレイの配置"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "調整"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "ディスプレイ距離"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr "ディスプレイの表示距離を設定。"
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "変更"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr "ディスプレイサイズ"
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr "ディスプレイの大きさを設定します。"
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr "標準"
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "フォローしきい値"
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr "ディスプレイがフォロー(追従)を開始するまでの距離"
-
-#: src/gtk/connected-device.ui:288
-msgid "Display angling"
-msgstr "ディスプレイの向き"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr "複数のディスプレイがある場合、ディスプレイの向きを選択します。"
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr "自動"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "横向き"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "縦向き"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "平面"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "ディスプレイの隙間"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr "複数のディスプレイがある場合、ディスプレイ間の隙間を設定します。"
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr "表示域の水平オフセット"
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr "表示域を左右に移動させます。"
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr "左"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "中央"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "→"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "表示域の垂直オフセット"
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr "表示域を上下に移動させます。"
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr "下"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "上"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "キーボードショートカット"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "XRエフェクトの切り替え"
-
-#: src/gtk/connected-device.ui:424
-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エフェクトの有効・無効を切り替えます。このショートカットを有効にするために"
-"手動で1回XRエフェクトを有効にする必要があります。"
-
-#: src/gtk/connected-device.ui:452
-msgid "Re-center display shortcut"
-msgstr "ディスプレイを中央へ移動"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "仮想ディスプレイを現在の視点に固定します。"
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "フォーカス時のズーム切り替え"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "フォーカス時のズームをすばやく切り替えます。"
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "フォローモードの切り替え"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "フォローモードのオン/オフをすばやく切り替えます。"
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr "マウスカーソルを呼び戻す"
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr "フォーカス中のディスプレイの中央にマウスカーソルを移動します。"
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "詳細設定"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr "単位"
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr "ディスプレイ距離とサイズの単位を選択します。"
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr "センチメートル(cm)"
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr "インチ(in)"
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "ディスプレイ設定を最適化する"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"メガネ接続時、最大解像度と最適なスケーリングのためにディスプレイ設定を自動的"
-"に変更します。"
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "最大のリフレッシュレートを使用する"
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr ""
-"リフレッシュレートはパフォーマンスに影響を与える可能性があります。手動で設定"
-"する場合は無効にしてください。"
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr "メガネのディスプレイを中央に"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-"ディスプレイが中央にない場合でも、表示域をメガネのディスプレイの中央に配置し"
-"ます。"
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "常にプライマリディスプレイにする"
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr "メガネ接続時、自動的にプライマリディスプレイにします。"
-
-#: src/gtk/connected-device.ui:662
-msgid "Remove virtual displays on disable"
-msgstr "無効時に仮想ディスプレイ削除"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr "XRエフェクト無効時に仮想ディスプレイを自動的に削除します。"
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "マルチタップ認識を有効化"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-"ダブルタップで中央へ移動、トリプルタップで再キャリブレーションを有効にしま"
-"す。"
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "全画面フォローモード"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-"フォローモードはフォーカスされてるディスプレイだけでなく全ての画面が移動しま"
-"す。"
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr "水平方向の首振り"
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-"値を大きくすると、水平方向の小さな動きで視点を移動できるようになります。"
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr "垂直方向の首振り"
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-"値を大きくすると、垂直方向の小さな動きで視点を移動できるようになります。"
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr "不感帯の閾値(角度)"
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr "この角度以下では動きを検知せず、動作を安定させます。"
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "フォローモード移動設定"
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr "フォローモードで追跡する方法を選択します。"
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr "水平"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "垂直"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "傾き・回転"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "動きの先読み"
-
-#: src/gtk/connected-device.ui:874
-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:892
-msgid "Default"
-msgstr "デフォルト"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "テキストスケーリング"
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr ""
-"テキストを1.0未満にスケーリングすると、高解像度ディスプレイをシミュレートしま"
-"す。"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "幅"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "高さ"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "カスタム解像度を追加"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "追加"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "近い"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr "デフォルト"
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "遠い"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "完了"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Breezy Desktop GNOMEの無効なセットアップ"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Breezy GNOMEのセットアップが無効または不完全です。セットアップスクリプトを再"
-"実行してください。問題が解決しない場合は、この問題を報告してください。"
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "寄付"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "トークンをリクエストする"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "トークンを検証する"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "ライセンスの詳細"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "デバイスが接続されていません"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktopは対応しているXRデバイスを検出できませんでした。"
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "XRエフェクトの自動有効化"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"対応メガネを接続するとBreezy DesktopのXRエフェクトを自動的に開始します。"
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "ドライバーが実行されていません"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" AUR経由でインストールした場合は、推奨されるポストインストールコマン"
-"ドを実行したことを確認してください:\n"
-" systemctl --user enable --now xr-driver.service\n"
-" \n"
-" それ以外の場合は、GitHubで問題を報告するか、Discordの"
-"#troubleshootingチャンネルで新しいスレッドを作成してください。\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Breezy Desktop GNOME Shell拡張機能が準備できていません"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"セットアップを実行した直後の場合は、使用する前にログアウトして再度ログインす"
-"る必要があるかもしれません。それ以外の場合は、Breezy GNOMEのセットアップ手順"
-"に従ってください。"
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "ライセンスファイルが見つかりませんでした"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" Breezy Desktopを初めて使用する際は、デバイスライセンスを取得するた"
-"めにインターネット接続が必要です。\n"
-" \n"
-" ご安心ください。今すぐに寄付する必要はありません。寄付していない場"
-"合は、Breezy Desktopがニーズに合っているかどうかを判断できる試用ライセンスが"
-"提供されます。\n"
-" \n"
-" ライセンスを取得したら、試用期間中であろうと期限切れるまではBreezy "
-"Desktopをオフラインで使用できます。(生涯アクセスを選択した場合は期限はありま"
-"せん。)\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "もう一度お試しください"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "キーボードショートカットを割り当てる"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr ""
-"キーボードショートカットを押す、または「Backspace」を押して無効にします..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "メニュー"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "一部の機能はもうすぐ期限が切れます"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "詳細を表示"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "プロダクティビティ機能が無効になっています"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "強制リセット"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Breezy Desktopについて"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "サイドバイサイドモード(ゲーミング)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "スムーズフォロー(ゲーミング)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop(プロダクティビティ)"
-
-#~ msgid "Gaming"
-#~ msgstr "ゲーミング"
-
-#~ msgid "Productivity"
-#~ msgstr "プロダクティビティ"
-
-#~ msgid "fullscreen"
-#~ msgstr "全画面"
-
-#~ msgid "Show full range"
-#~ msgstr "全範囲を表示"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
-#~ "portal are required."
-#~ msgstr "仮想ディスプレイが追加できません。"
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "高速SBSモード切り替え"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "ワイドスクリーンモードがオンになっている場合、メガネ接続時にたたちにSBS"
-#~ "モードに切り替えます。不安定になる可能性があります。"
-
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "フォーカス外のディスプレイ距離"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "ワイドスクリーンモード"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "近づけると大きく見え、遠ざけると小さく見えます。\n"
-#~ "ワイドスクリーンモードの奥行きを制御します。"
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "ディスプレイ距離と組み合わせて、\n"
-#~ "快適な奥行きとサイズを実現します。"
-
-#~ msgid "Display toggle distances"
-#~ msgstr "ディスプレイ距離の切り替え"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "2個のボタンを使用して、キーボードショートカットで使用する現在のディスプレ"
-#~ "イ距離をそれぞれ設定します。"
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "ディスプレイ距離の切り替え"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "設定してある2個の距離をすばやく切り替えます。"
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "ワイドスクリーンモードで起動"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr ""
-#~ "ワイドスクリーンモードはすべてのメガネで対応しているわけではありません。"
diff --git a/ui/po/meson.build b/ui/po/meson.build
deleted file mode 100644
index 25704f5..0000000
--- a/ui/po/meson.build
+++ /dev/null
@@ -1 +0,0 @@
-i18n.gettext('breezydesktop', preset: 'glib')
diff --git a/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index d72ea5d..0000000
Binary files a/ui/po/mo/de/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index eedac03..0000000
Binary files a/ui/po/mo/es/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index c27df49..0000000
Binary files a/ui/po/mo/fr/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index 07e7613..0000000
Binary files a/ui/po/mo/it/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index 5ed17f6..0000000
Binary files a/ui/po/mo/ja/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index b471334..0000000
Binary files a/ui/po/mo/pl/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index e43acfc..0000000
Binary files a/ui/po/mo/pt_BR/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index e6ef777..0000000
Binary files a/ui/po/mo/ru/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index eb20106..0000000
Binary files a/ui/po/mo/sv/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index 1b27b78..0000000
Binary files a/ui/po/mo/uk_UA/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo b/ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo
deleted file mode 100644
index 6382075..0000000
Binary files a/ui/po/mo/zh_CN/LC_MESSAGES/breezydesktop.mo and /dev/null differ
diff --git a/ui/po/pl.po b/ui/po/pl.po
deleted file mode 100644
index c9de508..0000000
--- a/ui/po/pl.po
+++ /dev/null
@@ -1,718 +0,0 @@
-# Polish translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-16 10:26-0700\n"
-"Last-Translator: \n"
-"Language-Team: Polish \n"
-"Language: pl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr ""
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr ""
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr ""
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr ""
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr ""
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr ""
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr ""
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr ""
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr ""
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr ""
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr ""
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr ""
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr ""
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr ""
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr ""
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr ""
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr ""
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr ""
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr ""
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr ""
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr ""
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr ""
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr ""
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr ""
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr ""
-
-#: src/time.py:20
-msgid "1 day"
-msgstr ""
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr ""
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr ""
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr ""
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr ""
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr ""
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr ""
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr ""
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr ""
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr ""
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr ""
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr ""
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr ""
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr ""
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr ""
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr ""
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr ""
-
-#: src/gtk/connected-device.ui:288
-msgid "Display angling"
-msgstr ""
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr ""
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr ""
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr ""
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr ""
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr ""
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr ""
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr ""
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr ""
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr ""
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr ""
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:424
-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:452
-msgid "Re-center display shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr ""
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr ""
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr ""
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr ""
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr ""
-
-#: src/gtk/connected-device.ui:662
-msgid "Remove virtual displays on disable"
-msgstr ""
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr ""
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr ""
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr ""
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr ""
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr ""
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr ""
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr ""
-
-#: src/gtk/connected-device.ui:874
-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:892
-msgid "Default"
-msgstr ""
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr ""
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr ""
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr ""
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr ""
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr ""
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr ""
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr ""
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr ""
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr ""
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr ""
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr ""
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr ""
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr ""
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr ""
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr ""
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr ""
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr ""
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr ""
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr ""
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr ""
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr ""
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr ""
diff --git a/ui/po/pt_BR.po b/ui/po/pt_BR.po
deleted file mode 100644
index f9f8393..0000000
--- a/ui/po/pt_BR.po
+++ /dev/null
@@ -1,866 +0,0 @@
-# Portuguese translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-19 09:39-0700\n"
-"Last-Translator: \n"
-"Language-Team: Brazilian Portuguese \n"
-"Language: pt_BR\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Altera o modo dos óculos para lado a lado (SBS) e dobra a largura da tela "
-"(ultrawide)."
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr "Este recurso não é atualmente suportado para o seu dispositivo."
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr "Distância da tela"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-"Use um valor mais aproximado para que as telas se aproximem quando olha para "
-"ela."
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "Distância da tela"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-"Use um valor mais distante para que as telas se afastem quando olha para "
-"elas."
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-"Não é possível adicionar telas neste dispositivo. xdg-desktop-portal é "
-"requerido."
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "Distância da tela"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "Tela curva"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Status do Nível Pago"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Disponibilidade de Recursos"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Desabilitado"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "Em teste"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Habilitado"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} restantes)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Ativo"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Inativo"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " para renovar"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " para atualizar"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Pago até o próximo período de renovação"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - renovando mensalmente"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - renovando anualmente"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "com acesso vitalício"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Mensal"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Anual"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "Vitalício"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "menos de uma hora"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 hora"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} horas"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 dia"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} dias"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "conectado"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Configurações Gerais"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Recursos"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "Efeito XR"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Habilita o efeito XR do Breezy Desktop."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr "Aproximar na focagem"
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-"Mover automaticamente a tela mais perto quando olha nela.\n"
-"Defina as suas distâncias preferidas focadas e não focadas nos Ajustes de "
-"secção.\n"
-" "
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Modo de acompanhamento"
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr "Mantenha a tela virtual próxima ao centro da sua visão."
-
-#: src/gtk/connected-device.ui:81
-msgid "Curved display"
-msgstr "Tela curva"
-
-#: src/gtk/connected-device.ui:82
-msgid "Switch between flat and curved displays."
-msgstr "Alterne entre tela plana e tela curva."
-
-#: src/gtk/connected-device.ui:93 src/gtk/no-device.ui:36
-msgid "Disable physical displays"
-msgstr "Desativar as telas físicas"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-"Desactive automaticamente todos as telas físicas quando o efeito XR estiver "
-"activado."
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "Tela curva"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "Adicionar"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "Remover resolução personalizada"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "Rearranjar tela"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Ajustes"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "Distância da tela"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr "Defina o quão perto quer que as telas apareçam."
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Alterar"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Sensibilidade do modo de acompanhamento"
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr "Quanto você pode mover a cabeça antes que a tela te acompanhe."
-
-#: src/gtk/connected-device.ui:288
-msgid "Display angling"
-msgstr "Tamanho da tela"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-"Quando existirem várias telas, escolha o ângulo em que devem estar virados "
-"para si."
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr "Automático"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "Ângulo lateral"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "Ângulo superior"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "Plano"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "Tamanho da tela"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr "Coloque um espaço vazio entre as telas, quando existem várias."
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr "Deslocamento horizontal da janela de visualização"
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-"Mova a janela de visualização para a esquerda ou direita da sua posição "
-"predefinida."
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr "esquerda"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "centro"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "direita"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "Deslocamento vertical da janela de visualização"
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-"Mova a janela de visualização para cima ou para baixo da sua posição "
-"predefinida."
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr "baixo"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "cima"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Atalhos de teclado"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "Atalho para ligar/desligar o efeito XR"
-
-#: src/gtk/connected-device.ui:424
-msgid ""
-"Quickly enable or disable the XR Effect. You may need to enable the effect "
-"manually once in order to enable the shortcut."
-msgstr ""
-"Ative ou desative rapidamente o Efeito XR. Pode ser necessário ativar o "
-"efeito manualmente para ativar o atalho."
-
-#: src/gtk/connected-device.ui:452
-msgid "Re-center display shortcut"
-msgstr "Atalho para recentralizar a tela"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Traga a tela virtual para onde você está olhando."
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "Atalho para alternar o modo de acompanhamento"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Alterne rapidamente o modo de acompanhamento."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Atalho para alternar o modo de acompanhamento"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Alterne rapidamente o modo de acompanhamento."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Configurações Avançadas"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Encontre a configuração de tela ideal"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"Modifique automaticamente a configuração de exibição dos óculos para máxima "
-"resolução e melhor dimensionamento quando conectado."
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "Use a taxa de atualização mais alta"
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr ""
-"A taxa de atualização pode afetar o desempenho, desative-a para defini-la "
-"manualmente."
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr "Centralize na exposição dos óculos"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-"Centralize a janela de visualização no ecrã dos óculos, mesmo que a tela não "
-"esteja no meio."
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Sempre tela principal"
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr ""
-"Defina automaticamente os óculos como a tela primária quando conectados."
-
-#: src/gtk/connected-device.ui:662
-msgid "Remove virtual displays on disable"
-msgstr "Tela curva"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-"Remove automaticamente as telas virtuais quando o efeito XR está desativado."
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "Ativar detecção de multitoque"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr "Permite o duplo toque para recentrar e o triplo toque para recalibrar."
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "Tela curva"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr "O modo Seguir move todas as telas, e não apenas o que está focado."
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "Modo de acompanhamento do movimento"
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr "Horizontal"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "Vertical"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "Inclinação/rolagem"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Antecipação de movimento"
-
-#: src/gtk/connected-device.ui:874
-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 ""
-"Compensa o atraso de entrada prevendo a posição de rastreamento de cabeça "
-"antes do tempo de renderização. Mantenha o padrão, a menos que a exibição "
-"virtual tenha atrasos, avance ou seja muito instável em relação aos "
-"movimentos da cabeça "
-
-#: src/gtk/connected-device.ui:892
-msgid "Default"
-msgstr "Padrão"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "Redimensionamento de Texto"
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr ""
-"Redimensionar o texto abaixo de 1.0 simulará uma tela de resolução mais alta"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "Largura"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "Altura"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "Adicionar uma Resolução Personalizada"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "Adicionar"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "mais perto"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "mais longe"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "Feito"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Configuração inválida do Breezy Desktop GNOME"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Sua configuração do Breezy GNOME é inválida ou incompleta. Por favor, "
-"execute novamente o script de configuração. Relate este problema se "
-"persistir."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Doar"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Solicitar um token"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Verificar token"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Detalhes da Licença"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Nenhum dispositivo conectado"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr ""
-"O Breezy Desktop não conseguiu detectar nenhum dispositivo XR suportado."
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "Efeito XR"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"Ativar automaticamente o efeito Breezy Desktop XR quando os óculos "
-"suportados estiverem conectados."
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Nenhum driver em execução"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Se você instalou via AUR, certifique-se de ter executado o comando de pós-"
-"instalação recomendado:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Caso contrário, por favor, crie uma issue no GitHub ou um novo tópico no "
-"canal #troubleshooting no Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Extensão do Breezy Desktop GNOME não está pronta"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Se você acabou de executar a configuração, pode ser necessário fazer logout "
-"e login novamente para usá-la. Caso contrário, siga as instruções de "
-"configuração do Breezy GNOME."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Nenhum arquivo de licença foi encontrado"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" A primeira vez que você usar o Breezy Desktop, uma conexão com a "
-"internet será necessária para obter a licença do seu dispositivo.\n"
-" \n"
-" Não se preocupe, não há nenhuma obrigação de doar neste momento. "
-"Se você ainda não o fez, será fornecida uma licença de teste para que você "
-"possa decidir se o Breezy Desktop atende às suas necessidades.\n"
-" \n"
-" Uma vez que você obtenha uma licença, de teste ou não, você poderá "
-"usar o Breezy Desktop offline até que os recursos expirem (ou "
-"indefinidamente, se você escolheu o acesso vitalício).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Tentar Novamente"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Atribuir Atalho de Teclado"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr "Pressione seu atalho de teclado ou 'Backspace' para desativar..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Menu"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Algumas funcionalidades expirarão em breve"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Ver detalhes"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "As funcionalidades de produtividade estão desabilitadas"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Forçar redefinição"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Sobre o BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Modo lado a lado (Jogos)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Acompanhar Suavemente (Jogos)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (produtividade)"
-
-#~ msgid "Gaming"
-#~ msgstr "Jogos"
-
-#~ msgid "Productivity"
-#~ msgstr "Produtividade"
-
-#~ msgid "fullscreen"
-#~ msgstr "Tela cheia"
-
-#~ msgid "Show full range"
-#~ msgstr "Mostrar gama completa"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
-#~ "portal are required."
-#~ msgstr ""
-#~ "Não é possível adicionar telas neste dispositivo. xdg-desktop-portal é "
-#~ "requerido."
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. xdg-desktop-portal is "
-#~ "required."
-#~ msgstr ""
-#~ "Não é possível adicionar telas neste dispositivo. xdg-desktop-portal é "
-#~ "requerido."
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Alternância rápida do modo SBS"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Altera os óculos para o modo SBS imediatamente quando conectados, se o "
-#~ "modo ultrawide estiver ativado. Pode causar instabilidade."
-
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Distância da tela"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Modo Ultrawide"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Mais perto parece maior, mais longe parece menor. Controla a profundidade "
-#~ "no modo ultrawide."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Combine com a distância da tela para alcançar um nível confortável de "
-#~ "profundidade e tamanho."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Alternância das distâncias de tela"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Use os botões para obter a distância atual da tela para depois usar com o "
-#~ "atalho de teclado."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Atalho de distância da tela"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Alterne rapidamente entre as duas distâncias predefinidas."
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Modo Ultrawide"
diff --git a/ui/po/ru.po b/ui/po/ru.po
deleted file mode 100644
index 4f510b7..0000000
--- a/ui/po/ru.po
+++ /dev/null
@@ -1,837 +0,0 @@
-# Russian translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-17 09:39-0700\n"
-"Last-Translator: \n"
-"Language-Team: Russian \n"
-"Language: ru\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Переключает очки в режим «сторона к стороне» и удваивает ширину дисплея."
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr "Эта функция в настоящее время не поддерживается для вашего устройства."
-
-#: src/connecteddevice.py:160
-#, fuzzy
-msgid "Set Focused Display Distance"
-msgstr "Расстояние дисплея"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-
-#: src/connecteddevice.py:168
-#, fuzzy
-msgid "Set All Displays Distance"
-msgstr "Расстояние дисплея"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-
-#: src/connecteddevice.py:343
-#, fuzzy
-msgid "Focused display"
-msgstr "Расстояние дисплея"
-
-#: src/connecteddevice.py:349
-#, fuzzy
-msgid "All displays"
-msgstr "Изогнутый дисплей"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Статус платного уровня"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Статус функций"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Отключено"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "На пробном периоде"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Включено"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} осталось)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Активный"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Неактивный"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " для обновления"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " для апгрейда"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Оплачено до следующего периода"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - ежемесячное обновление"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - ежегодное обновление"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "с пожизненным доступом"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Ежемесячно"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Ежегодно"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "Пожизненно"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "менее часа"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 час"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} часов"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 день"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} дней"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "подключено"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Общие настройки"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Функции"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "Эффект XR"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Включает эффект Breezy Desktop XR."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr ""
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Режим следования"
-
-#: src/gtk/connected-device.ui:71
-#, fuzzy
-msgid "Keep the focused display near the center of your view."
-msgstr "Поддерживает виртуальный дисплей вблизи центра вашего зрения."
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:104
-#, fuzzy
-msgid "Virtual displays"
-msgstr "Изогнутый дисплей"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr ""
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr ""
-
-#: src/gtk/connected-device.ui:156
-#, fuzzy
-msgid "Rearrange displays"
-msgstr "Изогнутый дисплей"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Настройки"
-
-#: src/gtk/connected-device.ui:178
-#, fuzzy
-msgid "Display distances"
-msgstr "Расстояние дисплея"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Изменить"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Порог следования"
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr ""
-"Как далеко вы можете отвернуть взгляд, прежде чем дисплей последует за вами."
-
-#: src/gtk/connected-device.ui:288
-#, fuzzy
-msgid "Display angling"
-msgstr "Размер дисплея"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr ""
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr ""
-
-#: src/gtk/connected-device.ui:316
-#, fuzzy
-msgid "Display spacing"
-msgstr "Размер дисплея"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr ""
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr ""
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr ""
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr ""
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr ""
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr ""
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Сочетания клавиш"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:424
-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:452
-msgid "Re-center display shortcut"
-msgstr "Сочетание клавиш для перецентровки дисплея"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Фиксировать виртуальный дисплей в текущем положении."
-
-#: src/gtk/connected-device.ui:481
-#, fuzzy
-msgid "Toggle zoom on focus shortcut"
-msgstr "Сочетание клавиш для переключения режима следования"
-
-#: src/gtk/connected-device.ui:482
-#, fuzzy
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Быстро переключать режим следования."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Сочетание клавиш для переключения режима следования"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Быстро переключать режим следования."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Дополнительные настройки"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Найти оптимальную конфигурацию дисплея"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"Автоматически изменять конфигурацию дисплея очков для максимального "
-"разрешения и лучшей масштабирования при подключении."
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "Использовать высшую частоту обновления"
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr ""
-"Частота обновления может повлиять на производительность, отключите это, "
-"чтобы установить ее вручную."
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Всегда основной дисплей"
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr ""
-"Автоматически устанавливать очки в качестве основного дисплея при "
-"подключении."
-
-#: src/gtk/connected-device.ui:662
-#, fuzzy
-msgid "Remove virtual displays on disable"
-msgstr "Изогнутый дисплей"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr ""
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-
-#: src/gtk/connected-device.ui:684
-#, fuzzy
-msgid "All displays follow mode"
-msgstr "Изогнутый дисплей"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr ""
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr ""
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr ""
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr ""
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Прогнозирование движения"
-
-#: src/gtk/connected-device.ui:874
-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:892
-msgid "Default"
-msgstr "По умолчанию"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr ""
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr ""
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Недействительная настройка Breezy Desktop GNOME"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Ваша настройка Breezy GNOME недействительна или неполна. Пожалуйста, "
-"перезапустите скрипт настройки. Сообщите об этой проблеме, если она "
-"сохраняется."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Донатить"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Запросить токен"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Проверить токен"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Подробности лицензии"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Устройство не подключено"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop не смог обнаружить никаких поддерживаемых устройств XR."
-
-#: src/gtk/no-device.ui:25
-#, fuzzy
-msgid "Auto-enable XR effect"
-msgstr "Эффект XR"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Драйвер не запущен"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Если вы установили через AUR, убедитесь, что вы запустили "
-"рекомендуемую команду пост-установки:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" В противном случае, пожалуйста, создайте запрос на GitHub или "
-"новый тред в канале #troubleshooting на Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Расширение Breezy Desktop GNOME не готово"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Если вы только что запустили настройку, вам может потребоваться выйти и "
-"снова войти, чтобы использовать её. В противном случае, пожалуйста, следуйте "
-"инструкциям по настройке Breezy GNOME."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Файл лицензии не найден"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" При первом использовании Breezy Desktop требуется интернет-"
-"соединение для получения лицензии вашего устройства.\n"
-" \n"
-" Не волнуйтесь, на данный момент нет обязательства донатить. Если "
-"вы не сделали этого, вам будет предоставлена пробная лицензия, чтобы вы "
-"могли решить, подходит ли вам Breezy Desktop.\n"
-" \n"
-" После получения лицензии, пробной или иной, вы можете использовать "
-"Breezy Desktop офлайн до истечения срока действия функций (или бессрочно, "
-"если вы выбрали пожизненный доступ).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Попробовать еще раз"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Назначить сочетание клавиш"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr "Нажмите на свое сочетание клавиш или 'Backspace', чтобы отключить..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Меню"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Некоторые функции скоро истекут"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Просмотреть детали"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Функции повышения производительности отключены"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Сброс"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "О BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Режим «бок о бок» (игровой режим)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Плавное следование (игровой режим)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (продуктивный режим)"
-
-#~ msgid "Gaming"
-#~ msgstr "Игровой режим"
-
-#~ msgid "Productivity"
-#~ msgstr "Продуктивный режим"
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Быстрое переключение режима SBS"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Переключает очки в режим SBS сразу при подключении, если режим широкого "
-#~ "экрана включен. Может вызвать нестабильность."
-
-#, fuzzy
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Расстояние дисплея"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Режим широкого экрана"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Чем ближе, тем больше. Чем дальше, тем меньше. Управляет глубиной при "
-#~ "использовании режима широкого экрана."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Комбинируйте с расстоянием дисплея, чтобы достичь комфортного уровня "
-#~ "глубины и размера."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Переключения расстояние дисплея"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Используйте кнопки, чтобы зафиксировать текущее расстояние дисплея для "
-#~ "использования с сочетанием клавиш."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Сочетание клавиш для расстояния дисплея"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Быстро переключаться между двумя предопределенными расстояниями."
-
-#, fuzzy
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Режим широкого экрана"
diff --git a/ui/po/sv.po b/ui/po/sv.po
deleted file mode 100644
index 3399e13..0000000
--- a/ui/po/sv.po
+++ /dev/null
@@ -1,836 +0,0 @@
-# Swedish translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-16 10:31-0700\n"
-"Last-Translator: \n"
-"Language-Team: Swedish \n"
-"Language: sv\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr ""
-"Växlar dina glasögon till side-by-side-läget och dubblerar bredden på "
-"visningen."
-
-#: src/connecteddevice.py:30
-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:160
-#, fuzzy
-msgid "Set Focused Display Distance"
-msgstr "Avstånd till skärmen"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-
-#: src/connecteddevice.py:168
-#, fuzzy
-msgid "Set All Displays Distance"
-msgstr "Avstånd till skärmen"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-
-#: src/connecteddevice.py:343
-#, fuzzy
-msgid "Focused display"
-msgstr "Avstånd till skärmen"
-
-#: src/connecteddevice.py:349
-#, fuzzy
-msgid "All displays"
-msgstr "Böjd skärm"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Betalningsstatus"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Funktions tillgänglighet"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Inaktiverad"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "Provperiod pågår"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Aktiverad"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " ({time_remaining} kvar)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Aktiv"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Inaktiv"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " att förnya"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " att uppgradera"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Betald genom nästa förnyelseperiod"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - förnyar månadsvis"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - förnyar årligen"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "med livstidsåtkomst"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Månatlig"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Årlig"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "Livstid"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "mindre än en timme"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 timme"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} timmar"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 dag"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} dagar"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "ansluten"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Allmänna inställningar"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Funktioner"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "XR-effekt"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Aktiverar Breezy Desktop XR-effekten."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr ""
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Följningsläge"
-
-#: src/gtk/connected-device.ui:71
-#, fuzzy
-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
-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:36
-msgid "Disable physical displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:104
-#, fuzzy
-msgid "Virtual displays"
-msgstr "Böjd skärm"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr ""
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr ""
-
-#: src/gtk/connected-device.ui:156
-#, fuzzy
-msgid "Rearrange displays"
-msgstr "Böjd skärm"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Justeringar"
-
-#: src/gtk/connected-device.ui:178
-#, fuzzy
-msgid "Display distances"
-msgstr "Avstånd till skärmen"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Ändra"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Automatisk följtröskel"
-
-#: src/gtk/connected-device.ui:265
-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:288
-#, fuzzy
-msgid "Display angling"
-msgstr "Skärmens storlek"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr ""
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr ""
-
-#: src/gtk/connected-device.ui:316
-#, fuzzy
-msgid "Display spacing"
-msgstr "Skärmens storlek"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr ""
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr ""
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr ""
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr ""
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr ""
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr ""
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Tangentbordsgenvägar"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "XR-Effekt genväg på/av"
-
-#: src/gtk/connected-device.ui:424
-msgid ""
-"Quickly enable or disable the XR Effect. You may need to enable the effect "
-"manually once in order to enable the shortcut."
-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:452
-msgid "Re-center display shortcut"
-msgstr "Om-centrering tangentbordsgenväg"
-
-#: src/gtk/connected-device.ui:453
-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:481
-#, fuzzy
-msgid "Toggle zoom on focus shortcut"
-msgstr "Växla följ läge kort"
-
-#: src/gtk/connected-device.ui:482
-#, fuzzy
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Växla snabbt följ läge."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Växla följ läge kort"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Växla snabbt följ läge."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Avancerade inställningar"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Hitta optimal konfiguration till skärmen"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-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:629
-msgid "Use highest refresh rate"
-msgstr "Använd högsta uppdateringsfrekvens"
-
-#: src/gtk/connected-device.ui:630
-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:640
-msgid "Center on glasses' display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Alltid primär skärm"
-
-#: src/gtk/connected-device.ui:652
-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:662
-#, fuzzy
-msgid "Remove virtual displays on disable"
-msgstr "Böjd skärm"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr ""
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-
-#: src/gtk/connected-device.ui:684
-#, fuzzy
-msgid "All displays follow mode"
-msgstr "Böjd skärm"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr ""
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr ""
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr ""
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr ""
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Rörs förväntning"
-
-#: src/gtk/connected-device.ui:874
-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 ""
-"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:892
-msgid "Default"
-msgstr "Standard"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "Textskalning"
-
-#: src/gtk/connected-device.ui:905
-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"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr ""
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Breezy Desktop GNOME ogiltig inställning"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Din Breezy GNOME inställning är ogiltig eller ofullständig. Var god kör "
-"inställning skriptet igen. Rapportera detta problem om det fortsätter."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Donera"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Begär en token"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Verifiera token"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Licensdetaljer"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Inget enhet ansluten"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop kunde inte upptäcka enheter som stöder XR."
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "Autoaktivering av XR-effekt"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-"Aktivera Breezy Desktop XR-effekten automatiskt när glasögon som stöds är "
-"anslutna."
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Inget drivrutin köres"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Om du har installerat via AUR, kontrollerar du att du körde den "
-"rekommenderade post-install kommandot:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Annars, var god att filer ett problem på GitHub, eller skapa en ny "
-"tråd i #troubleshooting kanal på Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Breezy Desktop GNOME tillägg inte redo"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Om du har kört inställning, kanske du behöver logga ut och in igen för att "
-"använda den. Annars, var god att följa Breezy GNOME inställning "
-"instruktioner."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Inget licens fil hittades"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" Den första gången du använder Breezy Desktop, krävs en internet "
-"anslutning för att hämta din enhets licens.\n"
-" \n"
-" Var inte bekymrad, det finns ingen förpliktelse att donera just "
-"nu. Om du inte har, kommer du att få en försöks licens så du kan bestämma om "
-"Breezy Desktop passar dina behov. \n"
-" \n"
-" En gång du har fått en licens, försöks eller annat, kan du använda "
-"Breezy Desktop offline tills funktioner upphör (eller oändligt, om du har "
-"valt livstidsåtkomst).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Försök igen"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Tilldela tangentbordsgenvägar"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr "Tryck din tangentbordsgenväg eller 'Backspace' för att inaktivera..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Meny"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Vissa funktioner upphör snart"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Se detaljer"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Produktivitets funktioner är inaktiverade"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Tvinga Reset"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Om BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Side-by-side läge (spel)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Smidig följning (spel)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (produktivitet)"
-
-#~ msgid "Gaming"
-#~ msgstr "Spel"
-
-#~ msgid "Productivity"
-#~ msgstr "Produktivitet"
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Snabb SBS läge växling"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Växlar glasögon till SBS läge omedelbart när den är ansluten, om "
-#~ "bredbildsläge är på. Kan orsaka instabilitet."
-
-#, fuzzy
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Avstånd till skärmen"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Bredbildsläge"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Närmare verkar större, längre verkar mindre. Kontrollerar djupet när du "
-#~ "är i bredbildsläge."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Kombinera med skärmens avstånd för att uppnå en bekväm nivå av djup och "
-#~ "storlek."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Växla skärm-avstånd"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Använd knapparna för att fanga nuvarande skärmavståndet för användning "
-#~ "med tangentbordsgenvägar."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Skärm avstånd genväg"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Växla snabbt mellan två fördefinierade avstånd."
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Starta i bredbildsläge"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr "Bredbildsläge stöds inte av alla glasögon."
diff --git a/ui/po/uk_UA.po b/ui/po/uk_UA.po
deleted file mode 100644
index f4e15b8..0000000
--- a/ui/po/uk_UA.po
+++ /dev/null
@@ -1,834 +0,0 @@
-# Ukrainian translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-17 10:08-0700\n"
-"Last-Translator: \n"
-"Language-Team: Ukrainian \n"
-"Language: uk\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr "Переключає окуляри в режим «бок о бок» і подвоює ширину дисплея."
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr "Ця функція наразі не підтримується на вашому пристрої."
-
-#: src/connecteddevice.py:160
-#, fuzzy
-msgid "Set Focused Display Distance"
-msgstr "Відстань дисплея"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr ""
-
-#: src/connecteddevice.py:168
-#, fuzzy
-msgid "Set All Displays Distance"
-msgstr "Відстань дисплея"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr ""
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr ""
-
-#: src/connecteddevice.py:343
-#, fuzzy
-msgid "Focused display"
-msgstr "Відстань дисплея"
-
-#: src/connecteddevice.py:349
-#, fuzzy
-msgid "All displays"
-msgstr "Викривлений дисплей"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "Статус платного рівня"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "Статус функцій"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "Вимкнено"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "У пробному режимі"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "Увімкнено"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr "({time_remaining} залишилося)"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "Активний"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "Неактивний"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} USD"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr " для оновлення"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr " для удосконалювання"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "Оплата до наступного періоду"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - щомісячне продовження"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - щорічне продовження"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "з довічним доступом"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "Щомісячно"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "Щорічно"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "Довічно"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "менше години"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1 година"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} годин"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1 день"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} днів"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "підключено"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "Загальні налаштування"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "Функції"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "Ефект XR"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "Включає ефект Breezy Desktop XR."
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr ""
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "Режим слідування"
-
-#: src/gtk/connected-device.ui:71
-#, fuzzy
-msgid "Keep the focused display near the center of your view."
-msgstr "Зберігае віртуальний дисплей поблизу центру вашого зору."
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr ""
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:104
-#, fuzzy
-msgid "Virtual displays"
-msgstr "Викривлений дисплей"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr ""
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr ""
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr ""
-
-#: src/gtk/connected-device.ui:156
-#, fuzzy
-msgid "Rearrange displays"
-msgstr "Викривлений дисплей"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "Налаштування"
-
-#: src/gtk/connected-device.ui:178
-#, fuzzy
-msgid "Display distances"
-msgstr "Відстань дисплея"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "Змінити"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "Поріг слідування"
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr ""
-"Як далеко ви можете відвернути ваш взор, перш ніж дисплей почне слідувати за "
-"вами."
-
-#: src/gtk/connected-device.ui:288
-#, fuzzy
-msgid "Display angling"
-msgstr "Розмір дисплея"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr ""
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr ""
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr ""
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr ""
-
-#: src/gtk/connected-device.ui:316
-#, fuzzy
-msgid "Display spacing"
-msgstr "Розмір дисплея"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr ""
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr ""
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr ""
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr ""
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr ""
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr ""
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr ""
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr ""
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "Сполучення клавіш"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:424
-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:452
-msgid "Re-center display shortcut"
-msgstr "Сполучення клавіш для центрування дисплея"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "Фіксувати віртуальний дисплей у поточній позиції."
-
-#: src/gtk/connected-device.ui:481
-#, fuzzy
-msgid "Toggle zoom on focus shortcut"
-msgstr "Сполучення клавіш для перемикання режиму слідування"
-
-#: src/gtk/connected-device.ui:482
-#, fuzzy
-msgid "Quickly toggle zoom on focus mode."
-msgstr "Швидко перемикати режим слідування."
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "Сполучення клавіш для перемикання режиму слідування"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "Швидко перемикати режим слідування."
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "Додаткові налаштування"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "Знайти оптимальну конфігурацію дисплея"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr ""
-"Автоматично змінює конфігурацію дисплея окулярів для максимальної роздільної "
-"здатності і найкращого масштабування при підключенні."
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "Використовувати найвищу частоту оновлення"
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr ""
-"Частота оновлення може вплинути на продуктивність, вимкніть це, щоб "
-"встановити її вручну."
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr ""
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "Завжди основний дисплей"
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr "Автоматично встановлює окуляри як основний дисплей при підключенні."
-
-#: src/gtk/connected-device.ui:662
-#, fuzzy
-msgid "Remove virtual displays on disable"
-msgstr "Викривлений дисплей"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr ""
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr ""
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr ""
-
-#: src/gtk/connected-device.ui:684
-#, fuzzy
-msgid "All displays follow mode"
-msgstr "Викривлений дисплей"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr ""
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr ""
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr ""
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr ""
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr ""
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr ""
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "Прогнозування руху"
-
-#: src/gtk/connected-device.ui:874
-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:892
-msgid "Default"
-msgstr "За замовчуванням"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr ""
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr ""
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr ""
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr ""
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Невірна настройка Breezy Desktop GNOME"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"Ваша настройка Breezy GNOME є невірною або неповною. Будь ласка, запустіть "
-"скрипт настройки повторно. Повідомте про цю проблему, якщо вона не зникає."
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "Донатити"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "Запитати токен"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "Перевірити токен"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "Деталі ліцензії"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "Жоден пристрій не підключено"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop не зміг виявити жодного підтримуваного XR пристрою."
-
-#: src/gtk/no-device.ui:25
-#, fuzzy
-msgid "Auto-enable XR effect"
-msgstr "Ефект XR"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr ""
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "Жоден драйвер не запущений"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" Якщо ви встановили через AUR, переконайтеся, що ви запустили "
-"рекомендовану команду після встановлення:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-"В іншому випадку, будь ласка, створіть запит на GitHub або новий тред у "
-"каналі #troubleshooting на Discord.\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Розширення Breezy Desktop GNOME не готове"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"Якщо ви тільки що запустили налаштування, можливо, вам потрібно вийти і "
-"знову увійти, щоб використовувати його. В іншому випадку, будь ласка, "
-"дотримуйтесь інструкцій з налаштування Breezy GNOME."
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "Жоден файл ліцензії не знайдено"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-"Під час першого запуску програми Breezy Desktop потрібне підключення до "
-"Інтернету для отримання ліцензії на пристрій.\n"
-" \n"
-"Не хвилюйтеся, наразі немає обов'язку донатити. Якщо ви не зробили цього, "
-"вам буде надана пробна ліцензія, щоб ви могли вирішити, чи відповідає Breezy "
-"Desktop вашим потребам.\n"
-" \n"
-"Після отримання ліцензії, пробної або іншої, ви можете використовувати "
-"Breezy Desktop офлайн до закінчення терміну дії функції (або безстроково, "
-"якщо ви обрали довічний доступ).\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "Спробуйте ще раз"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "Призначити сполучення клавіш"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr "Натисніть сполучення клавіш або 'Backspace', щоб відключити..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "Меню"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "Деякі функції закінчуються незабаром"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "Переглянути деталі"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "Функції продуктивного режиму відключені"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "Скинути"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "Про BreezyDesktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "Режим «бок о бок» (ігровий режим)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "Плавне слідування (ігровий режим)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (продуктивний прежим)"
-
-#~ msgid "Gaming"
-#~ msgstr "Ігровий режим"
-
-#~ msgid "Productivity"
-#~ msgstr "Продуктивний режим"
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "Швидке перемикання режиму SBS"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "Переключає окуляри в режим SBS відразу після підключення, якщо режим "
-#~ "широкого екрана увімкнено. Може викликати нестабільність."
-
-#, fuzzy
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "Відстань дисплея"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "Режим широкого екрану"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr ""
-#~ "Чим ближче, тим більший. Чим далі, тим менший. Керує глибиною при "
-#~ "використанні режиму широкого екрана."
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr ""
-#~ "Поєднуйте з відстанню дисплея, щоб досягти комфортного рівня глибини і "
-#~ "розміру."
-
-#~ msgid "Display toggle distances"
-#~ msgstr "Перемикання відстані дисплея"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr ""
-#~ "Використовуйте кнопки, щоб зафіксувати поточну відстань дисплея для "
-#~ "використання з сполученням клавіш."
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "Сполучення клавіш для відстані дисплея"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "Швидко перемикатися між двома попередньо визначеними відстанями."
-
-#, fuzzy
-#~ msgid "Start in widescreen mode"
-#~ msgstr "Режим широкого екрану"
diff --git a/ui/po/zh_CN.po b/ui/po/zh_CN.po
deleted file mode 100644
index 49aa558..0000000
--- a/ui/po/zh_CN.po
+++ /dev/null
@@ -1,816 +0,0 @@
-# Chinese translations for PACKAGE package.
-# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# , 2024.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-03 12:40-0800\n"
-"PO-Revision-Date: 2024-08-02 20:55-0700\n"
-"Last-Translator: \n"
-"Language-Team: Chinese (simplified) \n"
-"Language: zh_CN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/connecteddevice.py:29
-msgid ""
-"Switches your glasses into side-by-side mode and doubles the width of the "
-"display."
-msgstr "切换到并排模式,并将显示宽度翻倍。"
-
-#: src/connecteddevice.py:30
-msgid "This feature is not currently supported for your device."
-msgstr "您的设备目前不支援此功能。"
-
-#: src/connecteddevice.py:160
-msgid "Set Focused Display Distance"
-msgstr "设定注视中的屏幕的距离"
-
-#: src/connecteddevice.py:161
-msgid "Use a closer value so the display zooms in when you look at it."
-msgstr "近的数值会将您所看向的屏幕放大"
-
-#: src/connecteddevice.py:168
-msgid "Set All Displays Distance"
-msgstr "设定所有屏幕的距离"
-
-#: src/connecteddevice.py:169
-msgid "Use a farther value so the displays are zoomed out when you look away."
-msgstr "远的数值会将您所看向的屏幕缩小"
-
-#: src/connecteddevice.py:309
-msgid ""
-"Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, "
-"and the pipewire GStreamer plugin are required."
-msgstr "无法增加模拟显示。需要安装xdg-desktop-portal和Wayland"
-
-#: src/connecteddevice.py:343
-msgid "Focused display"
-msgstr "注视中的屏幕"
-
-#: src/connecteddevice.py:349
-msgid "All displays"
-msgstr "所有的屏幕"
-
-#: src/licensedialogcontent.py:63
-msgid "Paid Tier Status"
-msgstr "订阅状态"
-
-#: src/licensedialogcontent.py:71
-msgid "Feature Availability"
-msgstr "功能状态"
-
-#: src/licensefeaturerow.py:15 src/shortcutdialog.py:104
-#: src/gtk/connected-device.ui:786
-msgid "Disabled"
-msgstr "已禁用"
-
-#: src/licensefeaturerow.py:18
-msgid "In trial"
-msgstr "试用中"
-
-#: src/licensefeaturerow.py:18
-msgid "Enabled"
-msgstr "已启用"
-
-#: src/licensefeaturerow.py:24 src/licensetierrow.py:30
-#, python-brace-format
-msgid " ({time_remaining} remaining)"
-msgstr " (剩下 {time_remaining})"
-
-#: src/licensefeaturerow.py:30 src/licensetierrow.py:56
-msgid "Productivity Basic"
-msgstr ""
-
-#: src/licensefeaturerow.py:31 src/licensetierrow.py:57
-msgid "Productivity Pro"
-msgstr ""
-
-#: src/licensetierrow.py:24
-msgid "Active"
-msgstr "已订阅"
-
-#: src/licensetierrow.py:24
-msgid "Inactive"
-msgstr "未订阅"
-
-#: src/licensetierrow.py:41
-#, python-brace-format
-msgid "${amount} USD"
-msgstr "${amount} 美元"
-
-#: src/licensetierrow.py:43
-msgid " to renew"
-msgstr "续订"
-
-#: src/licensetierrow.py:45
-msgid " to upgrade"
-msgstr "升级"
-
-#: src/licensetierrow.py:47
-msgid "Paid through next renewal period"
-msgstr "已支付至下个续订期"
-
-#: src/licensetierrow.py:63
-msgid " - renewing monthly"
-msgstr " - 每月续订"
-
-#: src/licensetierrow.py:64
-msgid " - renewing yearly"
-msgstr " - 每年续订"
-
-#: src/licensetierrow.py:65
-msgid "with lifetime access"
-msgstr "终身会员"
-
-#: src/licensetierrow.py:72
-msgid "Monthly"
-msgstr "每月"
-
-#: src/licensetierrow.py:73
-msgid "Yearly"
-msgstr "每年"
-
-#: src/licensetierrow.py:74
-msgid "Lifetime"
-msgstr "终身"
-
-#: src/time.py:14
-msgid "less than an hour"
-msgstr "不到一个小时"
-
-#: src/time.py:17
-msgid "1 hour"
-msgstr "1小时"
-
-#: src/time.py:17
-#, python-brace-format
-msgid "{time_remaining} hours"
-msgstr "{time_remaining} 小时"
-
-#: src/time.py:20
-msgid "1 day"
-msgstr "1天"
-
-#: src/time.py:20
-#, python-brace-format
-msgid "{time_remaining} days"
-msgstr "{time_remaining} 天"
-
-#: src/gtk/connected-device.ui:21
-msgid "connected"
-msgstr "已连接"
-
-#: src/gtk/connected-device.ui:31
-msgid "General Settings"
-msgstr "通用设定"
-
-#: src/gtk/connected-device.ui:41
-msgid "Features"
-msgstr "功能"
-
-#: src/gtk/connected-device.ui:45
-msgid "XR effect"
-msgstr "XR 效果"
-
-#: src/gtk/connected-device.ui:46
-msgid "Enables the Breezy Desktop XR effect."
-msgstr "启用 Breezy Desktop XR 效果。"
-
-#: src/gtk/connected-device.ui:56
-msgid "Zoom on focus"
-msgstr "注视自动放大"
-
-#: src/gtk/connected-device.ui:57
-msgid ""
-"Automatically move a display closer when you look at it.\n"
-"Set your preferred focused and unfocused distances in the Adjustments "
-"section.\n"
-" "
-msgstr ""
-"当您看向着一个屏幕,将此屏幕自动放大。 注视中的屏幕,非注视中的屏幕都可以在"
-"「调整页」里设定距离"
-
-#: src/gtk/connected-device.ui:70
-msgid "Follow mode"
-msgstr "跟随模式"
-
-#: src/gtk/connected-device.ui:71
-msgid "Keep the focused display near the center of your view."
-msgstr "将注视中的屏幕保持在视野中心附近。"
-
-#: 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:36
-msgid "Disable physical displays"
-msgstr "将所有具体屏幕关闭"
-
-#: src/gtk/connected-device.ui:94 src/gtk/no-device.ui:37
-msgid ""
-"Automatically disable all physical displays when the XR effect is enabled."
-msgstr "XR效果开启时将所有具体屏幕自动关闭"
-
-#: src/gtk/connected-device.ui:104
-msgid "Virtual displays"
-msgstr "模拟屏幕"
-
-#: src/gtk/connected-device.ui:120
-msgid "1080p"
-msgstr "1080p"
-
-#: src/gtk/connected-device.ui:121
-msgid "1440p"
-msgstr "1440p"
-
-#: src/gtk/connected-device.ui:122
-msgid "Add custom"
-msgstr "增加客制化解析度"
-
-#: src/gtk/connected-device.ui:136
-msgid "Remove custom resolution"
-msgstr "删除客制化解析度"
-
-#: src/gtk/connected-device.ui:156
-msgid "Rearrange displays"
-msgstr "改变屏幕顺序"
-
-#: src/gtk/connected-device.ui:174
-msgid "Adjustments"
-msgstr "调整"
-
-#: src/gtk/connected-device.ui:178
-msgid "Display distances"
-msgstr "屏幕距离"
-
-#: src/gtk/connected-device.ui:179
-msgid "Set how close you want displays to appear."
-msgstr "设定您所希望屏幕离你的距离有多近"
-
-#: src/gtk/connected-device.ui:200 src/gtk/connected-device.ui:221
-#: src/gtk/connected-device.ui:443 src/gtk/connected-device.ui:472
-#: src/gtk/connected-device.ui:501 src/gtk/connected-device.ui:530
-#: src/gtk/connected-device.ui:559
-msgid "Change"
-msgstr "更改"
-
-#: src/gtk/connected-device.ui:234
-msgid "Display size"
-msgstr ""
-
-#: src/gtk/connected-device.ui:235
-msgid "Set how large you want the display to appear."
-msgstr ""
-
-#: src/gtk/connected-device.ui:254
-msgid "full"
-msgstr ""
-
-#: src/gtk/connected-device.ui:264
-msgid "Follow threshold"
-msgstr "跟随触发值"
-
-#: src/gtk/connected-device.ui:265
-msgid "How far away you can look before the display follows."
-msgstr "显示内容开始进行跟随模式前您可以看得多远。"
-
-#: src/gtk/connected-device.ui:288
-msgid "Display angling"
-msgstr "屏幕角度"
-
-#: src/gtk/connected-device.ui:289
-msgid ""
-"When there are multiple displays, choose how they should angle towards you."
-msgstr "有多屏幕时,选择屏幕向您倾斜的角度"
-
-#: src/gtk/connected-device.ui:303
-msgid "Automatic"
-msgstr "自动"
-
-#: src/gtk/connected-device.ui:304
-msgid "Side-angled"
-msgstr "侧边弯曲"
-
-#: src/gtk/connected-device.ui:305
-msgid "Top-angled"
-msgstr "上下弯曲"
-
-#: src/gtk/connected-device.ui:306
-msgid "Flat"
-msgstr "平面"
-
-#: src/gtk/connected-device.ui:316
-msgid "Display spacing"
-msgstr "屏幕之间缝隙的距差"
-
-#: src/gtk/connected-device.ui:317
-msgid "Put empty space between displays, when there are multiple."
-msgstr "把多屏幕之间插入一个空间"
-
-#: src/gtk/connected-device.ui:347
-msgid "Viewport horizontal offset"
-msgstr "眼镜视口特定水平偏移"
-
-#: src/gtk/connected-device.ui:348
-msgid "Move the viewport to the left or right of its default position."
-msgstr "将眼镜视口从默认位置左右移动"
-
-#: src/gtk/connected-device.ui:365
-msgid "left"
-msgstr "左"
-
-#: src/gtk/connected-device.ui:367 src/gtk/connected-device.ui:397
-msgid "center"
-msgstr "中"
-
-#: src/gtk/connected-device.ui:369
-msgid "right"
-msgstr "右"
-
-#: src/gtk/connected-device.ui:377
-msgid "Viewport vertical offset"
-msgstr "眼镜视口特定垂直偏移"
-
-#: src/gtk/connected-device.ui:378
-msgid "Move the viewport up or down from its default position."
-msgstr "将眼镜视口从默认位置上下移动"
-
-#: src/gtk/connected-device.ui:395
-msgid "down"
-msgstr "下"
-
-#: src/gtk/connected-device.ui:399
-msgid "up"
-msgstr "上"
-
-#: src/gtk/connected-device.ui:414 src/gtk/connected-device.ui:420
-msgid "Keyboard Shortcuts"
-msgstr "键盘快捷键"
-
-#: src/gtk/connected-device.ui:423
-msgid "XR Effect on/off shortcut"
-msgstr "XR效果 开/关 快捷键"
-
-#: src/gtk/connected-device.ui:424
-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:452
-msgid "Re-center display shortcut"
-msgstr "重新居中显示快捷键"
-
-#: src/gtk/connected-device.ui:453
-msgid "Pin the virtual display to the current position."
-msgstr "将虚拟显示固定在当前位置。"
-
-#: src/gtk/connected-device.ui:481
-msgid "Toggle zoom on focus shortcut"
-msgstr "切换注视自动放大模式快捷键"
-
-#: src/gtk/connected-device.ui:482
-msgid "Quickly toggle zoom on focus mode."
-msgstr "快速地切换注视自动放大模式。"
-
-#: src/gtk/connected-device.ui:510
-msgid "Toggle follow mode shortcut"
-msgstr "切换跟随模式快捷键"
-
-#: src/gtk/connected-device.ui:511
-msgid "Quickly toggle follow mode."
-msgstr "快速切换跟随模式。"
-
-#: src/gtk/connected-device.ui:539
-msgid "Summon mouse cursor shortcut"
-msgstr ""
-
-#: src/gtk/connected-device.ui:540
-msgid "Bring the mouse cursor to the center of the focused display."
-msgstr ""
-
-#: src/gtk/connected-device.ui:575 src/gtk/connected-device.ui:585
-msgid "Advanced Settings"
-msgstr "高级设定"
-
-#: src/gtk/connected-device.ui:589
-msgid "Units"
-msgstr ""
-
-#: src/gtk/connected-device.ui:590
-msgid "Choose measurement units for size and distance displays."
-msgstr ""
-
-#: src/gtk/connected-device.ui:605
-msgid "Centimeters"
-msgstr ""
-
-#: src/gtk/connected-device.ui:606
-msgid "Inches"
-msgstr ""
-
-#: src/gtk/connected-device.ui:618
-msgid "Find optimal display config"
-msgstr "寻找最佳显示设定"
-
-#: src/gtk/connected-device.ui:619
-msgid ""
-"Automatically modify the glasses display configuration for maximum "
-"resolution and best scaling when plugged in."
-msgstr "连接时,可以自动修改眼镜显示设定以表现出最大解析度和最佳的对比。"
-
-#: src/gtk/connected-device.ui:629
-msgid "Use highest refresh rate"
-msgstr "使用最高刷新率"
-
-#: src/gtk/connected-device.ui:630
-msgid "Refresh rate may affect performance, disable this to set it manually."
-msgstr "刷新率可能会影响性能,禁用此功能即可手动设置。"
-
-#: src/gtk/connected-device.ui:640
-msgid "Center on glasses' display"
-msgstr "视口眼镜屏幕固定"
-
-#: src/gtk/connected-device.ui:641
-msgid ""
-"Center the viewport on the glasses' display, even if the display is not in "
-"the middle."
-msgstr "将眼镜视口对齐眼镜的主要屏幕, 即便此屏幕不在正中间"
-
-#: src/gtk/connected-device.ui:651
-msgid "Always primary display"
-msgstr "每次设置为主要显示"
-
-#: src/gtk/connected-device.ui:652
-msgid "Automatically set the glasses as the primary display when plugged in."
-msgstr "连接时,自动将眼镜设置为主要显示。"
-
-#: src/gtk/connected-device.ui:662
-msgid "Remove virtual displays on disable"
-msgstr "自动模拟屏幕删除"
-
-#: src/gtk/connected-device.ui:663
-msgid "Automatically remove virtual displays when the XR effect is disabled."
-msgstr "XR效果关闭时自动删除所有模拟屏幕"
-
-#: src/gtk/connected-device.ui:673
-msgid "Enable multi-tap detection"
-msgstr "开启多点触控检测"
-
-#: src/gtk/connected-device.ui:674
-msgid "Enables double-tap to recenter and triple-tap to recalibrate."
-msgstr "打开双击重新定位和三击重新校准手势"
-
-#: src/gtk/connected-device.ui:684
-msgid "All displays follow mode"
-msgstr "全屏幕跟随模式"
-
-#: src/gtk/connected-device.ui:685
-msgid "Follow mode moves all displays, not just the focused one."
-msgstr "让跟随模式移动所有的屏幕而不只是注视中的屏幕"
-
-#: src/gtk/connected-device.ui:701
-msgid "Neck-saver horizontal multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:702
-msgid "Higher values require smaller horizontal head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:734
-msgid "Neck-saver vertical multiplier"
-msgstr ""
-
-#: src/gtk/connected-device.ui:735
-msgid "Higher values require smaller vertical head movements."
-msgstr ""
-
-#: src/gtk/connected-device.ui:767
-msgid "Dead-zone threshold (degrees)"
-msgstr ""
-
-#: src/gtk/connected-device.ui:768
-msgid "Stabilize movements below this angle."
-msgstr ""
-
-#: src/gtk/connected-device.ui:799
-msgid "Follow mode movement tracking"
-msgstr "跟随模式感应"
-
-#: src/gtk/connected-device.ui:800
-msgid "Choose which movements should be tracked in follow mode."
-msgstr "选择那一些动作会被感应到"
-
-#: src/gtk/connected-device.ui:815
-msgid "Horizontal"
-msgstr "水平动作"
-
-#: src/gtk/connected-device.ui:835
-msgid "Vertical"
-msgstr "垂直动作"
-
-#: src/gtk/connected-device.ui:855
-msgid "Tilt/roll"
-msgstr "倾斜及滚转动作"
-
-#: src/gtk/connected-device.ui:873
-msgid "Movement look-ahead"
-msgstr "移动预测"
-
-#: src/gtk/connected-device.ui:874
-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:892
-msgid "Default"
-msgstr "默认"
-
-#: src/gtk/connected-device.ui:904
-msgid "Text Scaling"
-msgstr "字体大小比例"
-
-#: src/gtk/connected-device.ui:905
-msgid "Scaling text below 1.0 will simulate a higher resolution display"
-msgstr "字体缩放小于1.0,将模拟解析度更高的显示效果"
-
-#: src/gtk/custom-resolution-dialog-content.ui:9
-msgid "Width"
-msgstr "宽度"
-
-#: src/gtk/custom-resolution-dialog-content.ui:42
-msgid "Height"
-msgstr "高度"
-
-#: src/gtk/custom-resolution-dialog.ui:5
-msgid "Add a Custom Resolution"
-msgstr "增加客制化解析度"
-
-#: src/gtk/custom-resolution-dialog.ui:10
-msgid "Add"
-msgstr "增加"
-
-#: src/gtk/display-distance-dialog-content.ui:35
-msgid "closer"
-msgstr "近"
-
-#: src/gtk/display-distance-dialog-content.ui:36
-msgid "default"
-msgstr ""
-
-#: src/gtk/display-distance-dialog-content.ui:37
-msgid "farther"
-msgstr "远"
-
-#: src/gtk/display-distance-dialog.ui:9
-msgid "Done"
-msgstr "完成"
-
-#: src/gtk/failed-verification.ui:15
-msgid "Breezy Desktop GNOME invalid setup"
-msgstr "Breezy Desktop GNOME 无效设置"
-
-#: src/gtk/failed-verification.ui:16
-msgid ""
-"Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup "
-"script. Report this issue if it persists."
-msgstr ""
-"您的 Breezy GNOME 设置无效或不完整。请重新运行设置脚本。如果问题仍然存在,请"
-"报告此问题。"
-
-#: src/gtk/license-dialog-content.ui:15
-msgid "Donate"
-msgstr "捐赠"
-
-#: src/gtk/license-dialog-content.ui:31
-msgid "Request a token"
-msgstr "申请令牌"
-
-#: src/gtk/license-dialog-content.ui:39
-msgid "Verify token"
-msgstr "令牌验证"
-
-#: src/gtk/license-dialog.ui:5 src/gtk/window.ui:139
-msgid "License Details"
-msgstr "许可证详细信息"
-
-#: src/gtk/no-device.ui:15
-msgid "No device connected"
-msgstr "未连接设备"
-
-#: src/gtk/no-device.ui:16
-msgid "Breezy Desktop was unable to detect any supported XR devices."
-msgstr "Breezy Desktop 无法检测到任何支援的 XR 设备。"
-
-#: src/gtk/no-device.ui:25
-msgid "Auto-enable XR effect"
-msgstr "自动启动XR效果"
-
-#: src/gtk/no-device.ui:26
-msgid ""
-"Automatically enable the Breezy Desktop XR effect when supported glasses are "
-"connected."
-msgstr "当支援的设备已连接,将BREEZY DESKTOP XR效果自动启动"
-
-#: src/gtk/no-driver.ui:15
-msgid "No driver running"
-msgstr "未运行驱动程序"
-
-#: src/gtk/no-driver.ui:16
-msgid ""
-"\n"
-" If you installed via AUR, make sure you ran the recommended post-"
-"install command:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" Otherwise, please file an issue on GitHub, or create a new thread "
-"in the #troubleshooting channel on Discord.\n"
-" "
-msgstr ""
-"\n"
-" 如果您透过 AUR 安装,请确保运行推荐的后安装命令:\n"
-" systemctl --user enable --now xr-driver.service\n"
-"\n"
-" 否则,请在 GitHub 上提交问题,或在 Discord 的 #troubleshooting 频道中创建新"
-"主题。\n"
-" "
-
-#: src/gtk/no-extension.ui:15
-msgid "Breezy Desktop GNOME extension not ready"
-msgstr "Breezy Desktop GNOME 扩展尚未启用"
-
-#: src/gtk/no-extension.ui:16
-msgid ""
-"If you have just run the setup, then you may need to log out and back in to "
-"use it. Otherwise, please follow the Breezy GNOME setup instructions."
-msgstr ""
-"如果您刚运行设置,则可能需要注销并重新登录才能使用它。否则,请按照 Breezy "
-"GNOME 设置说明进行操作。"
-
-#: src/gtk/no-license.ui:15
-msgid "No license file was found"
-msgstr "未找到许可证文件"
-
-#: src/gtk/no-license.ui:16
-msgid ""
-"\n"
-" The first time you use Breezy Desktop, an internet connection is "
-"required to retrieve your device's license.\n"
-" \n"
-" Don't worry, there's no obligation to donate at this time. If you "
-"haven't, you'll be given a trial license so you can decide if Breezy Desktop "
-"fits your needs. \n"
-" \n"
-" Once you obtain a license, trial or otherwise, you can use Breezy "
-"Desktop offline until features expire (or indefinitely, if you've chosen "
-"lifetime access).\n"
-" "
-msgstr ""
-"\n"
-" 首次使用 Breezy Desktop 时,需要互联网连接以获取设备许可证。\n"
-" \n"
-" 不要担心,您无需立即捐赠。如果您尚未捐赠,您将获得试用许可证,以便您可以决"
-"定 Breezy Desktop 是否适合您的需求。 \n"
-" \n"
-" 获得许可证后,无论是试用还是付费,您都可以离线使用 Breezy Desktop(直到功能"
-"过期,如果您选择了终身访问,则可以无限期使用)。\n"
-" "
-
-#: src/gtk/no-license.ui:29
-msgid "Try Again"
-msgstr "重新尝试"
-
-#: src/gtk/shortcut-dialog.ui:5
-msgid "Assign Keyboard Shortcut"
-msgstr "设置键盘快捷键"
-
-#: src/gtk/shortcut-dialog.ui:20
-msgid "Press your keyboard shortcut or 'Backspace' to disable..."
-msgstr "按下键盘快捷键或 '退格键' 以禁用..."
-
-#: src/gtk/window.ui:10
-msgid "Breezy Desktop"
-msgstr "Breezy Desktop"
-
-#: src/gtk/window.ui:23
-msgid "Menu"
-msgstr "菜单"
-
-#: src/gtk/window.ui:43
-msgid "Some features expire soon"
-msgstr "某些功能即将过期"
-
-#: src/gtk/window.ui:51 src/gtk/window.ui:76 src/gtk/window.ui:102
-msgid "View details"
-msgstr "查看详细信息"
-
-#: src/gtk/window.ui:68
-msgid "Productivity features are disabled"
-msgstr "生产模式功能被禁用"
-
-#: src/gtk/window.ui:93
-msgid ""
-"Productivity Pro license is inactive — 6DoF features will be unavailable"
-msgstr ""
-
-#: src/gtk/window.ui:119
-msgid ""
-"A newer version is available. To update, rerun the breezy_gnome_setup script."
-msgstr ""
-
-#: src/gtk/window.ui:143
-msgid "Force Reset"
-msgstr "强制重置"
-
-#: src/gtk/window.ui:147
-msgid "About BreezyDesktop"
-msgstr "关于 Breezy Desktop"
-
-#~ msgid "Side-by-side mode (gaming)"
-#~ msgstr "并排模式(游戏)"
-
-#~ msgid "Smooth Follow (gaming)"
-#~ msgstr "平滑跟随(游戏)"
-
-#~ msgid "Breezy Desktop (productivity)"
-#~ msgstr "Breezy Desktop (生产力)"
-
-#~ msgid "Gaming"
-#~ msgstr "游戏"
-
-#~ msgid "Productivity"
-#~ msgstr "生产力"
-
-#~ msgid "fullscreen"
-#~ msgstr "全屏"
-
-#~ msgid "Show full range"
-#~ msgstr "显示全范围"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. Wayland and xdg-desktop-"
-#~ "portal are required."
-#~ msgstr "无法增加模拟显示。需要安装xdg-desktop-portal和Wayland"
-
-#~ msgid ""
-#~ "Unable to add virtual displays on this machine. xdg-desktop-portal is "
-#~ "required."
-#~ msgstr "无法增加模拟显示。需要安装xdg-desktop-portal"
-
-#~ msgid "Fast SBS mode switching"
-#~ msgstr "快速并排模式切换"
-
-#~ msgid ""
-#~ "Switches glasses to SBS mode immediately when plugged in, if widescreen "
-#~ "mode is on. May cause instability."
-#~ msgstr ""
-#~ "连接时,如果宽屏模式开启,眼镜会立即切换到 并排模式。这可能会导致不稳定。"
-
-#~ msgid "Set Unfocused Displays Distance"
-#~ msgstr "设定非注视中屏幕距离"
-
-#~ msgid "Widescreen mode"
-#~ msgstr "宽屏模式"
-
-#~ msgid ""
-#~ "Closer appears larger, further appears smaller. Controls depth when in "
-#~ "widescreen mode."
-#~ msgstr "距离近看起来大,距离远看起来小。调整使用宽屏模式时的深度。"
-
-#~ msgid ""
-#~ "Combine with display distance to achieve a comfortable level of depth and "
-#~ "size."
-#~ msgstr "可以跟显示距离一起配合来实现舒适的深度和大小。"
-
-#~ msgid "Display toggle distances"
-#~ msgstr "显示切换距离"
-
-#~ msgid ""
-#~ "Use the buttons to capture the current display distance for use with the "
-#~ "keyboard shortcut."
-#~ msgstr "使用按钮记住当时的显示距离,以设成键盘快捷键。"
-
-#~ msgid "Display distance shortcut"
-#~ msgstr "显示距离快捷键"
-
-#~ msgid "Quickly toggle between two predefined distances."
-#~ msgstr "快速地在两个预定的距离之间切换。"
-
-#~ msgid "Start in widescreen mode"
-#~ msgstr "使用宽屏模式以启动软件"
-
-#~ msgid "Widescreen mode is not supported for all glasses."
-#~ msgstr "宽屏模式不支援每一个型号的XR眼睛"
diff --git a/ui/src/__init__.py b/ui/src/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/ui/src/breezydesktop.gresource.xml b/ui/src/breezydesktop.gresource.xml
deleted file mode 100644
index 4b17392..0000000
--- a/ui/src/breezydesktop.gresource.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- gtk/connected-device.ui
- gtk/custom-resolution-dialog.ui
- gtk/custom-resolution-dialog-content.ui
- gtk/display-distance-dialog.ui
- gtk/display-distance-dialog-content.ui
- gtk/failed-verification.ui
- gtk/license-dialog.ui
- gtk/license-dialog-content.ui
- gtk/no-device.ui
- gtk/no-driver.ui
- gtk/no-extension.ui
- gtk/no-license.ui
- gtk/shortcut-dialog.ui
- gtk/virtual-display-row.ui
- gtk/window.ui
-
-
diff --git a/ui/src/breezydesktop.in b/ui/src/breezydesktop.in
deleted file mode 100755
index f7446da..0000000
--- a/ui/src/breezydesktop.in
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python3
-
-# breezydesktop.in
-#
-# Copyright 2024 Unknown
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-import os
-import sys
-
-xdg_data_home = os.getenv('XDG_DATA_HOME', os.path.join(os.path.expanduser('~'), '.local', 'share'))
-appdir = os.getenv('APPDIR', xdg_data_home)
-locale_dir = os.path.join(appdir, 'locale')
-pkgdatadir = os.path.join(appdir, 'breezydesktop')
-sys.path.insert(1, pkgdatadir)
-
-lib_dir = os.path.join(pkgdatadir, 'breezydesktop', 'lib')
-sys.path.insert(0, lib_dir)
-
-import signal
-import locale
-import gettext
-
-VERSION = '@VERSION@'
-
-signal.signal(signal.SIGINT, signal.SIG_DFL)
-locale.textdomain('breezydesktop')
-locale.setlocale(locale.LC_ALL, locale.getlocale())
-locale.bindtextdomain('breezydesktop', locale_dir)
-gettext.install('breezydesktop', locale_dir)
-gettext.bindtextdomain('breezydesktop', locale_dir)
-gettext.textdomain('breezydesktop')
-
-if __name__ == '__main__':
- import gi
-
- from gi.repository import Gio
- resource = Gio.Resource.load(os.path.join(pkgdatadir, 'breezydesktop.gresource'))
- resource._register()
-
- from breezydesktop import main
- sys.exit(main.main(VERSION))
diff --git a/ui/src/configmanager.py b/ui/src/configmanager.py
deleted file mode 100644
index 5f2531a..0000000
--- a/ui/src/configmanager.py
+++ /dev/null
@@ -1,193 +0,0 @@
-import sys
-from gi.repository import GObject, GLib
-from .xrdriveripc import XRDriverIPC
-
-class ConfigManager(GObject.GObject):
- __gproperties__ = {
- 'breezy-desktop-enabled': (bool, 'Breezy Desktop Enabled', 'Whether Breezy Desktop is enabled', False, GObject.ParamFlags.READWRITE),
- 'multi-tap-enabled': (bool, 'Multi-Tap Enabled', 'Whether Multi-Tap is enabled', False, GObject.ParamFlags.READWRITE),
- 'follow-track-roll': (bool, 'Follow Track Roll', 'Whether to follow on the roll axis', False, GObject.ParamFlags.READWRITE),
- 'follow-track-pitch': (bool, 'Follow Track Pitch', 'Whether to follow on the pitch axis', True, GObject.ParamFlags.READWRITE),
- 'follow-track-yaw': (bool, 'Follow Track Yaw', 'Whether to follow on the yaw axis', True, GObject.ParamFlags.READWRITE),
- 'dead-zone-threshold-deg': (
- float,
- 'Dead Zone Threshold (deg)',
- 'IMU dead-zone threshold in degrees (0.0 disables)',
- 0.0, 5.0, 0.0,
- GObject.ParamFlags.READWRITE,
- ),
- 'neck-saver-horizontal-multiplier': (
- float,
- 'Neck Saver Horizontal Multiplier',
- 'Multiplier to reduce horizontal head movement',
- 1.0, 2.5, 1.0,
- GObject.ParamFlags.READWRITE,
- ),
- 'neck-saver-vertical-multiplier': (
- float,
- 'Neck Saver Vertical Multiplier',
- 'Multiplier to reduce vertical head movement',
- 1.0, 2.5, 1.0,
- GObject.ParamFlags.READWRITE,
- )
- }
-
- _instance = None
-
- @staticmethod
- def get_instance():
- if not ConfigManager._instance:
- ConfigManager._instance = ConfigManager()
-
- return ConfigManager._instance
-
- @staticmethod
- def destroy_instance():
- if ConfigManager._instance:
- ConfigManager._instance.stop()
- ConfigManager._instance = None
-
- def __init__(self):
- GObject.GObject.__init__(self)
- self.ipc = XRDriverIPC.get_instance()
- self.breezy_desktop_enabled = None
- self.multi_tap_enabled = None
- self.follow_track_roll = None
- self.follow_track_pitch = None
- self.follow_track_yaw = None
- self.dead_zone_threshold_deg = None
- self.neck_saver_horizontal_multiplier = None
- self.neck_saver_vertical_multiplier = None
- self._running = True
- self._refresh_source_id = None
- self._refresh_config()
- self._refresh_source_id = GLib.timeout_add_seconds(1, self._refresh_config)
-
- def stop(self):
- self._running = False
- if self._refresh_source_id is not None:
- GLib.source_remove(self._refresh_source_id)
- self._refresh_source_id = None
-
- def _refresh_config(self):
- self.config = self.ipc.retrieve_config(False)
- if self._is_breezy_desktop_enabled() != self.breezy_desktop_enabled:
- self.set_property('breezy-desktop-enabled', self._is_breezy_desktop_enabled())
-
- if self.config['multi_tap_enabled'] != self.multi_tap_enabled:
- self.set_property('multi-tap-enabled', self.config['multi_tap_enabled'])
-
- if self.config['smooth_follow_track_roll'] != self.follow_track_roll:
- self.set_property('follow-track-roll', self.config['smooth_follow_track_roll'])
-
- if self.config['smooth_follow_track_pitch'] != self.follow_track_pitch:
- self.set_property('follow-track-pitch', self.config['smooth_follow_track_pitch'])
-
- if self.config['smooth_follow_track_yaw'] != self.follow_track_yaw:
- self.set_property('follow-track-yaw', self.config['smooth_follow_track_yaw'])
-
- if self.config['dead_zone_threshold_deg'] != self.dead_zone_threshold_deg:
- self.set_property('dead-zone-threshold-deg', self.config['dead_zone_threshold_deg'])
-
- if self.config['neck_saver_horizontal_multiplier'] != self.neck_saver_horizontal_multiplier:
- self.set_property('neck-saver-horizontal-multiplier', self.config['neck_saver_horizontal_multiplier'])
-
- if self.config['neck_saver_vertical_multiplier'] != self.neck_saver_vertical_multiplier:
- self.set_property('neck-saver-vertical-multiplier', self.config['neck_saver_vertical_multiplier'])
-
- return self._running
-
- def _is_breezy_desktop_enabled(self):
- return self.config.get('disabled') == False and 'breezy_desktop' in self.config.get('external_mode', [])
-
- def _set_breezy_desktop_enabled(self, value):
- if value:
- self.config['disabled'] = False
- self.config['output_mode'] = 'external_only'
- self.config['external_mode'] = ['breezy_desktop']
- else:
- self.config['external_mode'] = []
-
- self.ipc.write_config(self.config)
- self.breezy_desktop_enabled = value
-
- def _set_multi_tap_enabled(self, value):
- if self.multi_tap_enabled != value:
- self.config['multi_tap_enabled'] = value
- self.ipc.write_config(self.config)
- self.multi_tap_enabled = value
-
- def _set_follow_track_roll(self, value):
- if self.follow_track_roll != value:
- self.config['smooth_follow_track_roll'] = value
- self.ipc.write_config(self.config)
- self.follow_track_roll = value
-
- def _set_follow_track_pitch(self, value):
- if self.follow_track_pitch != value:
- self.config['smooth_follow_track_pitch'] = value
- self.ipc.write_config(self.config)
- self.follow_track_pitch = value
-
- def _set_follow_track_yaw(self, value):
- if self.follow_track_yaw != value:
- self.config['smooth_follow_track_yaw'] = value
- self.ipc.write_config(self.config)
- self.follow_track_yaw = value
-
- def _set_dead_zone_threshold_deg(self, value):
- value = round(min(5.0, max(0.0, float(value))), 2)
- if self.dead_zone_threshold_deg != value:
- self.config['dead_zone_threshold_deg'] = value
- self.ipc.write_config(self.config)
- self.dead_zone_threshold_deg = value
-
- def _set_neck_saver_horizontal_multiplier(self, value):
- value = round(min(2.5, max(1.0, float(value))), 2)
- if self.neck_saver_horizontal_multiplier != value:
- self.config['neck_saver_horizontal_multiplier'] = value
- self.ipc.write_config(self.config)
- self.neck_saver_horizontal_multiplier = value
-
- def _set_neck_saver_vertical_multiplier(self, value):
- value = round(min(2.5, max(1.0, float(value))), 2)
- if self.neck_saver_vertical_multiplier != value:
- self.config['neck_saver_vertical_multiplier'] = value
- self.ipc.write_config(self.config)
- self.neck_saver_vertical_multiplier = value
-
- def do_set_property(self, prop, value):
- if prop.name == 'breezy-desktop-enabled':
- self._set_breezy_desktop_enabled(value)
- elif prop.name == 'multi-tap-enabled':
- self._set_multi_tap_enabled(value)
- elif prop.name == 'follow-track-roll':
- self._set_follow_track_roll(value)
- elif prop.name == 'follow-track-pitch':
- self._set_follow_track_pitch(value)
- elif prop.name == 'follow-track-yaw':
- self._set_follow_track_yaw(value)
- elif prop.name == 'dead-zone-threshold-deg':
- self._set_dead_zone_threshold_deg(value)
- elif prop.name == 'neck-saver-horizontal-multiplier':
- self._set_neck_saver_horizontal_multiplier(value)
- elif prop.name == 'neck-saver-vertical-multiplier':
- self._set_neck_saver_vertical_multiplier(value)
-
- def do_get_property(self, prop):
- if prop.name == 'breezy-desktop-enabled':
- return self.breezy_desktop_enabled
- elif prop.name == 'multi-tap-enabled':
- return self.multi_tap_enabled
- elif prop.name == 'follow-track-roll':
- return self.follow_track_roll
- elif prop.name == 'follow-track-pitch':
- return self.follow_track_pitch
- elif prop.name == 'follow-track-yaw':
- return self.follow_track_yaw
- elif prop.name == 'dead-zone-threshold-deg':
- return self.dead_zone_threshold_deg
- elif prop.name == 'neck-saver-horizontal-multiplier':
- return self.neck_saver_horizontal_multiplier
- elif prop.name == 'neck-saver-vertical-multiplier':
- return self.neck_saver_vertical_multiplier
\ No newline at end of file
diff --git a/ui/src/connecteddevice.py b/ui/src/connecteddevice.py
deleted file mode 100644
index a76570a..0000000
--- a/ui/src/connecteddevice.py
+++ /dev/null
@@ -1,491 +0,0 @@
-from gi.repository import Gio, GLib, Gtk, GObject
-from .configmanager import ConfigManager
-from .customresolutiondialog import CustomResolutionDialog
-from .displaydistancedialog import DisplayDistanceDialog
-from .files import get_state_dir
-from .license import BREEZY_GNOME_FEATURES
-from .runtimeenvironment import RuntimeEnvironment
-from .settingsmanager import SettingsManager
-from .shortcutdialog import bind_shortcut_settings
-from .statemanager import StateManager
-from .virtualdisplayrow import VirtualDisplayRow
-from .xrdriveripc import XRDriverIPC
-
-import gettext
-import json
-import logging
-import os
-from pathlib import Path
-
-_ = gettext.gettext
-logger = logging.getLogger('breezy_ui')
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/connected-device.ui')
-class ConnectedDevice(Gtk.Box):
- __gtype_name__ = "ConnectedDevice"
-
- widescreen_mode_subtitle = _("Switches your glasses into side-by-side mode and doubles the width of the display.")
- widescreen_mode_not_supported_subtitle = _("This feature is not currently supported for your device.")
-
- device_label = Gtk.Template.Child()
- effect_enable_switch = Gtk.Template.Child()
- disable_physical_displays_switch = Gtk.Template.Child()
- display_zoom_on_focus_switch = Gtk.Template.Child()
- display_size_scale = Gtk.Template.Child()
- display_size_adjustment = Gtk.Template.Child()
- 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()
- add_virtual_display_button = Gtk.Template.Child()
- remove_custom_resolution_button = Gtk.Template.Child()
- launch_display_settings_row = Gtk.Template.Child()
- launch_display_settings_button = Gtk.Template.Child()
- all_displays_distance_label = Gtk.Template.Child()
- change_all_displays_distance_button = Gtk.Template.Child()
- focused_display_distance_label = Gtk.Template.Child()
- change_focused_display_distance_button = Gtk.Template.Child()
- reassign_toggle_xr_effect_shortcut_button = Gtk.Template.Child()
- toggle_xr_effect_shortcut_label = Gtk.Template.Child()
- reassign_recenter_display_shortcut_button = Gtk.Template.Child()
- recenter_display_shortcut_label = Gtk.Template.Child()
- reassign_toggle_display_distance_shortcut_button = Gtk.Template.Child()
- toggle_display_distance_shortcut_label = Gtk.Template.Child()
- reassign_toggle_follow_shortcut_button = Gtk.Template.Child()
- toggle_follow_shortcut_label = Gtk.Template.Child()
- reassign_cursor_to_focused_display_shortcut_button = Gtk.Template.Child()
- cursor_to_focused_display_shortcut_label = Gtk.Template.Child()
- headset_display_as_viewport_center_switch = Gtk.Template.Child()
- headset_as_primary_switch = Gtk.Template.Child()
- remove_virtual_displays_on_disable_switch = Gtk.Template.Child()
- use_optimal_monitor_config_switch = Gtk.Template.Child()
- use_highest_refresh_rate_switch = Gtk.Template.Child()
- movement_look_ahead_scale = Gtk.Template.Child()
- movement_look_ahead_adjustment = Gtk.Template.Child()
- text_scaling_scale = Gtk.Template.Child()
- text_scaling_adjustment = Gtk.Template.Child()
- neck_saver_horizontal_scale = Gtk.Template.Child()
- neck_saver_horizontal_adjustment = Gtk.Template.Child()
- neck_saver_vertical_scale = Gtk.Template.Child()
- neck_saver_vertical_adjustment = Gtk.Template.Child()
- dead_zone_threshold_scale = Gtk.Template.Child()
- dead_zone_threshold_adjustment = Gtk.Template.Child()
- enable_multi_tap_switch = Gtk.Template.Child()
- legacy_follow_mode_switch = Gtk.Template.Child()
- follow_track_yaw_switch = Gtk.Template.Child()
- follow_track_pitch_switch = Gtk.Template.Child()
- follow_track_roll_switch = Gtk.Template.Child()
- monitor_wrapping_scheme_menu = Gtk.Template.Child()
- monitor_spacing_scale = Gtk.Template.Child()
- monitor_spacing_adjustment = Gtk.Template.Child()
- viewport_offset_x_scale = Gtk.Template.Child()
- viewport_offset_x_adjustment = Gtk.Template.Child()
- viewport_offset_y_scale = Gtk.Template.Child()
- viewport_offset_y_adjustment = Gtk.Template.Child()
- units_menu = Gtk.Template.Child()
-
- def __init__(self):
- super(Gtk.Box, self).__init__()
- self.init_template()
- self.active = True
- self.all_enabled_state_inputs = [
- self.display_zoom_on_focus_switch,
- self.display_size_scale,
- self.follow_mode_switch,
- self.follow_threshold_scale,
- self.curved_display_switch,
- self.add_virtual_display_menu,
- self.add_virtual_display_button,
- self.change_all_displays_distance_button,
- self.change_focused_display_distance_button,
- self.movement_look_ahead_scale,
- self.monitor_wrapping_scheme_menu,
- self.monitor_spacing_scale,
- self.viewport_offset_x_scale,
- self.viewport_offset_y_scale,
- self.neck_saver_horizontal_scale,
- self.neck_saver_vertical_scale
- ]
-
- self.settings = SettingsManager.get_instance().settings
- self.desktop_settings = SettingsManager.get_instance().desktop_settings
- self.ipc = XRDriverIPC.get_instance()
- self.runtime = RuntimeEnvironment.get_instance()
- self.virtual_display_manager = self.runtime.virtual_display_manager
-
- self.settings.bind('disable-physical-displays', self.disable_physical_displays_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- self.settings.connect('changed::display-distance', self._handle_display_distance)
- 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('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)
- self.settings.bind('use-optimal-monitor-config', self.use_optimal_monitor_config_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('use-highest-refresh-rate', self.use_highest_refresh_rate_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- # self.settings.bind('fast-sbs-mode-switching', self.fast_sbs_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('look-ahead-override', self.movement_look_ahead_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('legacy-follow-mode', self.legacy_follow_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('monitor-spacing', self.monitor_spacing_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('viewport-offset-x', self.viewport_offset_x_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('viewport-offset-y', self.viewport_offset_y_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
- self.settings.connect('changed::monitor-wrapping-scheme', self._handle_monitor_wrapping_scheme_setting_changed)
- self.desktop_settings.bind('text-scaling-factor', self.text_scaling_adjustment, 'value', Gio.SettingsBindFlags.DEFAULT)
- self.display_zoom_on_focus_switch.connect('notify::active', self._handle_zoom_on_focus_switch_changed)
- self.monitor_wrapping_scheme_menu.connect('changed', self._handle_monitor_wrapping_scheme_menu_changed)
- self._handle_monitor_wrapping_scheme_setting_changed(self.settings, self.settings.get_string('monitor-wrapping-scheme'))
-
- current_units = self.settings.get_string('units')
- self.units_menu.set_active_id(current_units)
- self.units_menu.connect('changed', self._handle_units_menu_changed)
-
- bind_shortcut_settings(self.get_parent(), [
- [self.reassign_toggle_xr_effect_shortcut_button, self.toggle_xr_effect_shortcut_label],
- [self.reassign_recenter_display_shortcut_button, self.recenter_display_shortcut_label],
- [self.reassign_toggle_display_distance_shortcut_button, self.toggle_display_distance_shortcut_label],
- [self.reassign_toggle_follow_shortcut_button, self.toggle_follow_shortcut_label],
- [self.reassign_cursor_to_focused_display_shortcut_button, self.cursor_to_focused_display_shortcut_label]
- ])
-
- self.change_focused_display_distance_button.connect('clicked',
- self._on_display_distance_preset_change_button_clicked,
- 'toggle-display-distance-start',
- self._on_set_focused_display_distance,
- _('Set Focused Display Distance'),
- _('Use a closer value so the display zooms in when you look at it.'),
- 0.2, 1.0
- )
- self.change_all_displays_distance_button.connect('clicked',
- self._on_display_distance_preset_change_button_clicked,
- 'toggle-display-distance-end',
- self._on_set_all_displays_distance,
- _('Set All Displays Distance'),
- _('Use a farther value so the displays are zoomed out when you look away.'),
- 1.0, 2.5
- )
- self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end'))
- self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start'))
-
- self.add_virtual_display_menu.set_active_id('create_1080p_display')
- self.add_virtual_display_button.connect('clicked', self._on_add_virtual_display)
- self.launch_display_settings_button.connect('clicked', self._launch_display_settings)
-
- self.state_manager = StateManager.get_instance()
- self.state_manager.bind_property('follow-mode', self.follow_mode_switch, 'active', GObject.BindingFlags.DEFAULT)
- self.state_manager.connect('notify::enabled-features-list', self._handle_enabled_features)
- self.state_manager.connect('notify::device-supports-sbs', self._handle_device_supports_sbs)
-
- self.follow_mode_switch.set_active(self.state_manager.get_property('follow-mode'))
- self.follow_mode_switch.connect('notify::active', self._refresh_follow_mode)
- self.effect_enable_switch.connect('notify::active', self._handle_switch_enabled_state)
-
- self.state_manager.connect('notify::connected-device-full-size-cm', self._handle_metric_change)
- self.state_manager.connect('notify::connected-device-full-distance-cm', self._handle_metric_change)
- self.settings.connect('changed::units', self._handle_units_changed)
-
- self.config_manager = ConfigManager.get_instance()
- self.config_manager.connect('notify::breezy-desktop-enabled', self._handle_enabled_config)
- self._bind_switch_to_config(self.enable_multi_tap_switch, 'multi-tap-enabled')
- self._bind_switch_to_config(self.follow_track_roll_switch, 'follow-track-roll')
- self._bind_switch_to_config(self.follow_track_pitch_switch, 'follow-track-pitch')
- self._bind_switch_to_config(self.follow_track_yaw_switch, 'follow-track-yaw')
- self._bind_scale_to_config(self.dead_zone_threshold_adjustment, 'dead-zone-threshold-deg')
- self._bind_scale_to_config(self.neck_saver_horizontal_adjustment, 'neck-saver-horizontal-multiplier')
- self._bind_scale_to_config(self.neck_saver_vertical_adjustment, 'neck-saver-vertical-multiplier')
-
- self.use_optimal_monitor_config_switch.connect('notify::active', self._refresh_use_optimal_monitor_config)
-
- self._handle_switch_enabled_state(self.effect_enable_switch, None)
- self._handle_display_distance(self.settings, self.settings.get_double('display-distance'))
- self._handle_enabled_features(self.state_manager, None)
- self._handle_device_supports_sbs(self.state_manager, None)
- self._handle_enabled_config(None, None)
- self._refresh_use_optimal_monitor_config(self.use_optimal_monitor_config_switch, None)
- self.runtime.connect('notify::breezy-enabled', self._handle_enabled_config)
-
- self._settings_displays_app_info = None
-
- for appinfo in Gio.AppInfo.get_all():
- if appinfo.get_id() == 'gnome-display-panel.desktop':
- self._settings_displays_app_info = appinfo
- break
-
- self.virtual_display_manager.connect('notify::displays', self._on_virtual_displays_update)
- self.add_virtual_display_menu.connect('changed', self._on_add_virtual_display_menu_changed)
- self.remove_custom_resolution_button.connect('clicked', self._on_custom_resolution_option_remove)
- self._on_virtual_displays_update(self.virtual_display_manager, None)
- self.virtual_displays_by_pid = {}
-
- self._default_resolution_options_count = 2
- self._custom_resolution_options = []
- self._custom_resolutions_file_path = Path(os.path.join(get_state_dir(), 'custom_resolutions.json'))
- self._load_custom_resolutions()
- for id in self._custom_resolution_options:
- self.add_virtual_display_menu.insert(self._default_resolution_options_count, id, id)
-
- def _bind_scale_to_config(self, scale, config_key):
- self.config_manager.bind_property(config_key, scale, 'value', Gio.SettingsBindFlags.DEFAULT)
- scale.set_value(self.config_manager.get_property(config_key))
- scale.connect('value-changed', lambda widget: self.config_manager.set_property(config_key, widget.get_value()))
-
- def _bind_switch_to_config(self, switch, config_key):
- self.config_manager.bind_property(config_key, switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- switch.set_active(self.config_manager.get_property(config_key))
- switch.connect('notify::active', lambda widget, param: self.config_manager.set_property(config_key, widget.get_active()))
-
- def _handle_zoom_on_focus_switch_changed(self, widget, param):
- display_distance = self.settings.get_double('display-distance')
- toggle_display_distance_end = self.settings.get_double('toggle-display-distance-end')
- toggle_display_distance_start = self.settings.get_double('toggle-display-distance-start')
- is_zoom_on_focus_already_enabled = display_distance < toggle_display_distance_end
- if widget.get_active() and not is_zoom_on_focus_already_enabled:
- self.settings.set_double('display-distance', toggle_display_distance_start)
- elif not widget.get_active() and is_zoom_on_focus_already_enabled:
- self.settings.set_double('display-distance', toggle_display_distance_end)
-
- def _handle_units_menu_changed(self, widget):
- active_id = widget.get_active_id() or 'cm'
- self.settings.set_string('units', active_id)
-
- def _handle_units_changed(self, *args):
- self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end'))
- self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start'))
-
- def _handle_metric_change(self, *args):
- self._set_all_displays_distance(self.settings.get_double('toggle-display-distance-end'))
- self._set_focused_display_distance(self.settings.get_double('toggle-display-distance-start'))
-
- def _handle_monitor_wrapping_scheme_setting_changed(self, settings, val):
- self.monitor_wrapping_scheme_menu.set_active_id(val)
-
- def _handle_monitor_wrapping_scheme_menu_changed(self, widget):
- self.settings.set_string('monitor-wrapping-scheme', widget.get_active_id())
-
- def _handle_enabled_features(self, state_manager, val):
- enabled_breezy_features = [feature for feature in state_manager.get_property('enabled-features-list') if feature in BREEZY_GNOME_FEATURES]
- breezy_features_granted = len(enabled_breezy_features) > 0
- if not breezy_features_granted:
- self.effect_enable_switch.set_active(False)
- self.effect_enable_switch.set_sensitive(breezy_features_granted)
-
- def _handle_device_supports_sbs(self, state_manager, val):
- if not state_manager.get_property('device-supports-sbs'):
- self.settings.set_boolean('widescreen-mode', False)
- # self.widescreen_mode_switch.set_sensitive(state_manager.get_property('device-supports-sbs'))
- # subtitle = self.widescreen_mode_subtitle if state_manager.get_property('device-supports-sbs') else self.widescreen_mode_not_supported_subtitle
- # self.widescreen_mode_row.set_subtitle(subtitle)
-
- def _handle_enabled_config(self, object, val):
- enabled = self.config_manager.get_property('breezy-desktop-enabled') and self.runtime.get_property('breezy-enabled')
- if enabled != self.effect_enable_switch.get_active():
- self.effect_enable_switch.set_active(enabled)
-
- def _handle_switch_enabled_state(self, switch, param):
- GLib.idle_add(self._handle_switch_enabled_state_gui, switch, param)
-
- def _handle_switch_enabled_state_gui(self, switch, param):
- requesting_enabled = switch.get_active()
-
- # never turn off the extension, disabling the effect is done via configs only
- if requesting_enabled:
- self.runtime.set_property('breezy-enabled', True)
-
- self.config_manager.set_property('breezy-desktop-enabled', requesting_enabled)
-
- for widget in self.all_enabled_state_inputs:
- widget.set_sensitive(requesting_enabled)
-
- if not self.runtime.is_virtual_display_supported():
- self.virtual_displays_row.set_subtitle(
- _("Unable to add virtual displays on this machine. Wayland, xdg-desktop-portal, and the pipewire GStreamer plugin are required."))
- self.add_virtual_display_button.set_sensitive(False)
- self.add_virtual_display_menu.set_sensitive(False)
-
- if requesting_enabled:
- self._refresh_follow_mode(self.follow_mode_switch, None)
-
- def _refresh_follow_mode(self, switch, param):
- if (self.state_manager.get_property('follow-mode') == switch.get_active()):
- return
-
- self.ipc.write_control_flags({
- 'enable_breezy_desktop_smooth_follow': switch.get_active()
- })
-
- def _refresh_use_optimal_monitor_config(self, switch, param):
- self.headset_as_primary_switch.set_sensitive(switch.get_active())
- self.use_highest_refresh_rate_switch.set_sensitive(switch.get_active())
- if not switch.get_active():
- self.headset_as_primary_switch.set_active(False)
- self.use_highest_refresh_rate_switch.set_active(False)
-
- def set_device_name(self, name):
- self.device_label.set_markup(f"{name}")
-
- def _handle_display_distance(self, *args):
- display_distance = self.settings.get_double('display-distance')
- toggle_display_distance_end = self.settings.get_double('toggle-display-distance-end')
-
- should_zoom_on_focus_be_enabled = display_distance < toggle_display_distance_end
- if self.display_zoom_on_focus_switch.get_active() != should_zoom_on_focus_be_enabled:
- self.display_zoom_on_focus_switch.set_active(should_zoom_on_focus_be_enabled)
-
- def _set_focused_display_distance(self, distance):
- self.focused_display_distance_label.set_markup(f"{_('Focused display')}: {self._format_distance(distance)}")
- self.settings.set_double('toggle-display-distance-start', distance)
-
- self.display_zoom_on_focus_switch.set_sensitive(distance != self.settings.get_double('toggle-display-distance-end'))
-
- def _set_all_displays_distance(self, distance):
- self.all_displays_distance_label.set_markup(f"{_('All displays')}: {self._format_distance(distance)}")
- self.settings.set_double('toggle-display-distance-end', distance)
- self.display_zoom_on_focus_switch.set_active(False)
- self.display_zoom_on_focus_switch.set_sensitive(distance != self.settings.get_double('toggle-display-distance-start'))
-
- def _get_units(self):
- units = self.settings.get_string('units')
- return units if units in ['cm', 'in'] else 'cm'
-
- def _format_distance(self, normalized):
- sm = getattr(self, 'state_manager', None) or StateManager.get_instance()
- full_cm = float(sm.get_property('connected-device-full-distance-cm') or 0.0)
- if full_cm <= 0:
- # Fallback to normalized display if metric unknown
- return f"{round(normalized, 2)}"
- cm = normalized * full_cm
- if self._get_units() == 'in':
- inches = cm / 2.54
- return f"{inches:.2f} in"
- return f"{cm:.1f} cm"
-
- def _on_display_distance_preset_change_button_clicked(self, widget, settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit):
- dialog = DisplayDistanceDialog(settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit)
- dialog.set_transient_for(widget.get_ancestor(Gtk.Window))
- dialog.present()
-
- def _on_set_all_displays_distance(self, prev_distance, distance):
- focused_display_distance = self.settings.get_double('toggle-display-distance-start')
- if (distance < focused_display_distance):
- self._set_focused_display_distance(distance)
-
- all_displays_distance = self.settings.get_double('toggle-display-distance-end')
- self._set_all_displays_distance(distance)
-
- # if we were at the unfocused distance, put us at the new unfocused distance
- if prev_distance == all_displays_distance:
- self.settings.set_double('display-distance', distance)
-
- def _on_set_focused_display_distance(self, prev_distance, distance):
- all_displays_distance = self.settings.get_double('toggle-display-distance-end')
- if (distance > all_displays_distance):
- self._set_all_displays_distance(distance)
-
- focused_display_distance = self.settings.get_double('toggle-display-distance-start')
- self._set_focused_display_distance(distance)
-
- # if we were at the focused distance, put us at the new focused distance
- if prev_distance == focused_display_distance:
- self.settings.set_double('display-distance', distance)
-
- def _save_custom_resolutions(self):
- with open(self._custom_resolutions_file_path, 'w') as f:
- json.dump(self._custom_resolution_options, f)
-
- def _load_custom_resolutions(self):
- if self._custom_resolutions_file_path.exists():
- try:
- with open(self._custom_resolutions_file_path, 'r') as f:
- self._custom_resolution_options = json.load(f)
- except Exception:
- self._custom_resolution_options = []
-
- def _on_add_virtual_display(self, *args):
- resolution = self.add_virtual_display_menu.get_active_id()
-
- if resolution == 'create_1080p_display':
- width = 1920
- height = 1080
- elif resolution == 'create_1440p_display':
- width = 2560
- height = 1440
- else:
- width, height = resolution.split('x')
- width = int(width)
- height = int(height)
-
- logger.info(f"Adding virtual display {resolution}")
- self.virtual_display_manager.create_virtual_display(width, height, 60)
-
- def _on_custom_resolution_dialog_add(self, width, height):
- width = int(round(width))
- height = int(round(height))
-
- id = f"{width}x{height}"
- self._custom_resolution_options.append(id)
- self._save_custom_resolutions()
-
- self.add_virtual_display_menu.insert(self._default_resolution_options_count, id, id)
- self.add_virtual_display_menu.set_active_id(id)
- self._on_add_virtual_display_menu_changed(self.add_virtual_display_menu)
-
- def _on_add_virtual_display_menu_changed(self, widget):
- resolution = widget.get_active_id()
- self.remove_custom_resolution_button.set_visible(resolution in self._custom_resolution_options)
-
- add_custom_resolution_option = resolution == 'add_custom_resolution'
- self.add_virtual_display_button.set_sensitive(not add_custom_resolution_option)
-
- if add_custom_resolution_option:
- dialog = CustomResolutionDialog(self._on_custom_resolution_dialog_add)
- dialog.set_transient_for(self.get_ancestor(Gtk.Window))
- dialog.present()
-
- def _on_custom_resolution_option_remove(self, *args):
- resolution = self.add_virtual_display_menu.get_active_id()
-
- for custom_resolution_option in self._custom_resolution_options:
- self.add_virtual_display_menu.remove(self._default_resolution_options_count)
-
- self._custom_resolution_options.remove(resolution)
- self._save_custom_resolutions()
-
- for id in self._custom_resolution_options:
- self.add_virtual_display_menu.insert(self._default_resolution_options_count, id, id)
-
- self.add_virtual_display_menu.set_active_id('create_1080p_display')
- self._on_add_virtual_display_menu_changed(self.add_virtual_display_menu)
-
- def _on_virtual_displays_update(self, virtual_display_manager, val):
- GLib.idle_add(self._on_virtual_displays_update_gui, virtual_display_manager)
-
- def _on_virtual_displays_update_gui(self, virtual_display_manager):
- effect_enabled = self.effect_enable_switch.get_active()
- virtual_displays_present = len(virtual_display_manager.displays) > 0
- self.monitor_wrapping_scheme_menu.set_sensitive(effect_enabled and virtual_displays_present)
- self.monitor_spacing_scale.set_sensitive(effect_enabled and virtual_displays_present)
-
- self.top_features_group.remove(self.launch_display_settings_row)
- for pid, child in self.virtual_displays_by_pid.items():
- self.top_features_group.remove(child)
-
- self.top_features_group.add(self.launch_display_settings_row)
- self.launch_display_settings_row.set_visible(
- self._settings_displays_app_info is not None and virtual_displays_present
- )
-
- new_displays_by_pid = {}
- for display in virtual_display_manager.displays:
- child = self.virtual_displays_by_pid.get(
- display['pid'],
- VirtualDisplayRow(display['pid'], display['width'], display['height'], 60))
- self.top_features_group.add(child)
- new_displays_by_pid[display['pid']] = child
-
- self.virtual_displays_by_pid = new_displays_by_pid
-
- def _launch_display_settings(self, *args):
- self._settings_displays_app_info.launch()
diff --git a/ui/src/customresolutiondialog.py b/ui/src/customresolutiondialog.py
deleted file mode 100644
index 98ae0ef..0000000
--- a/ui/src/customresolutiondialog.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from gi.repository import Gtk, Gio
-from .customresolutiondialogcontent import CustomResolutionDialogContent
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/custom-resolution-dialog.ui')
-class CustomResolutionDialog(Gtk.Dialog):
- __gtype_name__ = 'CustomResolutionDialog'
-
- add_button = Gtk.Template.Child()
-
- def __init__(self, on_add_callback):
- super(Gtk.Dialog, self).__init__()
- self.init_template()
-
- self.on_add_callback = on_add_callback
-
- self.content = CustomResolutionDialogContent(self.add_button, self._on_add_callback)
- self.get_content_area().append(self.content)
-
- def _on_add_callback(self, width, height):
- self.on_add_callback(width, height)
- self.close()
\ No newline at end of file
diff --git a/ui/src/customresolutiondialogcontent.py b/ui/src/customresolutiondialogcontent.py
deleted file mode 100644
index 5529957..0000000
--- a/ui/src/customresolutiondialogcontent.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from gi.repository import Gtk, Gio
-from .settingsmanager import SettingsManager
-
-import gettext
-
-_ = gettext.gettext
-
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/custom-resolution-dialog-content.ui')
-class CustomResolutionDialogContent(Gtk.Box):
- __gtype_name__ = 'CustomResolutionDialogContent'
-
- custom_resolution_width_scale = Gtk.Template.Child()
- custom_resolution_width_adjustment = Gtk.Template.Child()
- custom_resolution_height_scale = Gtk.Template.Child()
- custom_resolution_height_adjustment = Gtk.Template.Child()
-
- def __init__(self, add_button, on_add_callback):
- super(Gtk.Box, self).__init__()
- self.init_template()
-
- self.on_add_callback = on_add_callback
-
- add_button.connect('clicked', self._on_add_button_clicked)
-
- def _on_add_button_clicked(self, button):
- self.on_add_callback(self.custom_resolution_width_adjustment.get_value(), self.custom_resolution_height_adjustment.get_value())
\ No newline at end of file
diff --git a/ui/src/displaydistancedialog.py b/ui/src/displaydistancedialog.py
deleted file mode 100644
index e2a62a6..0000000
--- a/ui/src/displaydistancedialog.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from gi.repository import Gtk, Gio
-from .displaydistancedialogcontent import DisplayDistanceDialogContent
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/display-distance-dialog.ui')
-class DisplayDistanceDialog(Gtk.Dialog):
- __gtype_name__ = 'DisplayDistanceDialog'
-
- save_button = Gtk.Template.Child()
-
- def __init__(self, settings_key, on_save_callback, title, subtitle, lower_limit, upper_limit):
- super(Gtk.Dialog, self).__init__()
- self.init_template()
-
- self.on_save_callback = on_save_callback
- self.set_title(title)
-
- self.content = DisplayDistanceDialogContent(settings_key, self.save_button, self._on_save_callback, subtitle, lower_limit, upper_limit)
- self.get_content_area().append(self.content)
-
- def _on_save_callback(self, prev_distance, distance):
- self.on_save_callback(prev_distance, distance)
- self.close()
\ No newline at end of file
diff --git a/ui/src/displaydistancedialogcontent.py b/ui/src/displaydistancedialogcontent.py
deleted file mode 100644
index 9823a59..0000000
--- a/ui/src/displaydistancedialogcontent.py
+++ /dev/null
@@ -1,50 +0,0 @@
-from gi.repository import Gtk, Gio
-from .settingsmanager import SettingsManager
-from .statemanager import StateManager
-
-import gettext
-
-_ = gettext.gettext
-
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/display-distance-dialog-content.ui')
-class DisplayDistanceDialogContent(Gtk.Box):
- __gtype_name__ = 'DisplayDistanceDialogContent'
-
- display_distance_subtitle = Gtk.Template.Child()
- display_distance_scale = Gtk.Template.Child()
- display_distance_adjustment = Gtk.Template.Child()
-
- def __init__(self, settings_key, save_button, on_save_callback, subtitle, lower_limit, upper_limit):
- super(Gtk.Box, self).__init__()
- self.init_template()
-
- self.display_distance_subtitle.set_markup(f"""{subtitle}""")
-
- self.on_save_callback = on_save_callback
- self.settings = SettingsManager.get_instance().settings
- self.state_manager = StateManager.get_instance()
- self.prev_distance = self.settings.get_double('display-distance')
- self.display_distance_adjustment.set_value(self.settings.get_double(settings_key))
-
- self.display_distance_scale.set_format_value_func(lambda scale, val: self._format_distance(val))
- self.state_manager.connect('notify::connected-device-full-distance-cm', lambda *args: self.display_distance_scale.queue_draw())
- self.settings.connect('changed::units', lambda *args: self.display_distance_scale.queue_draw())
- save_button.connect('clicked', self._on_save_button_clicked)
-
- def _on_save_button_clicked(self, button):
- self.on_save_callback(self.prev_distance, self.display_distance_adjustment.get_value())
-
- def _get_units(self):
- units = self.settings.get_string('units')
- return units if units in ['cm', 'in'] else 'cm'
-
- def _format_distance(self, normalized):
- full_cm = float(self.state_manager.get_property('connected-device-full-distance-cm') or 0.0)
- if full_cm <= 0:
- return f"{round(normalized, 2)}"
- cm = normalized * full_cm
- if self._get_units() == 'in':
- inches = cm / 2.54
- return f"{inches:.2f} in"
- return f"{cm:.1f} cm"
\ No newline at end of file
diff --git a/ui/src/failedverification.py b/ui/src/failedverification.py
deleted file mode 100644
index 7ee4875..0000000
--- a/ui/src/failedverification.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from gi.repository import Gtk
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/failed-verification.ui')
-class FailedVerification(Gtk.Box):
- __gtype_name__ = "FailedVerification"
diff --git a/ui/src/files.py b/ui/src/files.py
deleted file mode 100644
index 6cf3c05..0000000
--- a/ui/src/files.py
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-import os
-
-def get_user_home():
- return os.path.expanduser('~')
-
-def get_config_dir():
- config_home = os.environ.get('XDG_CONFIG_HOME', '~/.config')
- return os.path.expanduser(config_home)
-
-def get_state_dir():
- # imported lazily to avoid an import cycle (runtime discovery imports
- # modules that import this one)
- from .runtime import runtime_namespace
- state_home = os.environ.get('XDG_STATE_HOME', '~/.local/state')
- return os.path.join(os.path.expanduser(state_home), runtime_namespace())
-
-def get_data_home():
- data_home = os.environ.get('XDG_DATA_HOME', '~/.local/share')
- return os.getenv('APPDIR', os.path.expanduser(data_home))
-
-def get_bin_home():
- bin_home = os.environ.get('XDG_BIN_HOME', '~/.local/bin')
- return os.getenv('BINDIR', os.path.expanduser(bin_home))
\ No newline at end of file
diff --git a/ui/src/gtk/connected-device.ui b/ui/src/gtk/connected-device.ui
deleted file mode 100644
index 89fd925..0000000
--- a/ui/src/gtk/connected-device.ui
+++ /dev/null
@@ -1,948 +0,0 @@
-
-
-
-
- 1
- 20
- 20
- 20
- 20
- 20
-
-
-
-
-
-
-
- general
- General Settings
- applications-system-symbolic
-
-
- 2
- 20
- 20
- 20
-
-
- Features
- 450
-
-
- XR effect
- Enables the Breezy Desktop XR effect.
-
-
- 3
-
-
-
-
-
-
- Zoom on focus
- Automatically move a display closer when you look at it.
-Set your preferred focused and unfocused distances in the Adjustments section.
-
-
-
- 3
-
-
-
-
-
-
- Follow mode
- Keep the focused display near the center of your view.
-
-
- 3
-
-
-
-
-
-
- Curved display
- Switch between flat and curved displays.
- 2
-
-
- 3
-
-
-
-
-
-
- Disable physical displays
- Automatically disable all physical displays when the XR effect is enabled.
-
-
- 3
-
-
-
-
-
-
- Virtual displays
- 2
-
-
- 30
- 150
- 30
-
-
- 3
-
-
-
-
-
-
-
-
-
-
- remove-custom-resolution
- list-remove-symbolic
- 3
- 0
- Remove custom resolution
-
-
-
-
-
- add-virtual-display
- list-add-symbolic
- 3
-
-
-
-
-
-
-
- Rearrange displays
- 0
-
-
- rearrange-virtual-displays
- send-to-symbolic
- 3
-
-
-
-
-
-
-
-
-
- Adjustments
- 700
-
-
- Display distances
- Set how close you want displays to appear.
-
-
- 25
- 1
- 15
- 15
-
-
- vertical
- 10
-
-
-
- 3
-
-
-
-
- set-all-displays-distance
- 3
- Change
- 20
- 20
-
-
-
-
-
-
- vertical
- 10
-
-
-
- 3
-
-
-
-
- set-all-displays-distance
- 3
- Change
- 20
- 20
-
-
-
-
-
-
-
-
-
-
- Display size
- Set how large you want the display to appear.
-
-
- 3
- true
- 0
- 2
- 350
- false
-
-
- 0.1
- 2.5
- 0.01
- 1.0
-
-
-
- 0.5×
- full
- 1.5×
- 2.0×
-
-
-
-
-
-
-
- Follow threshold
- How far away you can look before the display follows.
-
-
- 3
- true
- 0
- 0
- 350
- false
-
-
- 1
- 45
- 1
- 15
-
-
-
-
-
-
-
-
- Display angling
- When there are multiple displays, choose how they should angle towards you.
- 2
-
-
- 30
- 150
- 30
- 3
-
-
-
-
-
-
-
-
-
-
- Display spacing
- Put empty space between displays, when there are multiple.
-
-
- 3
- true
- 0
- 0
- 350
- false
-
-
- 0
- 100
- 1
- 0
-
-
-
- 0
-
- 50
-
- 100
-
-
-
-
-
-
-
- Viewport horizontal offset
- Move the viewport to the left or right of its default position.
-
-
- 3
- 0
- 1
- 350
- false
-
-
- -2.5
- 2.5
- 0.1
- 0.0
-
-
-
- left
-
- center
-
- right
-
-
-
-
-
-
-
- Viewport vertical offset
- Move the viewport up or down from its default position.
-
-
- 3
- 0
- 1
- 350
- false
-
-
- -2.5
- 2.5
- 0.1
- 0.0
-
-
-
- down
-
- center
-
- up
-
-
-
-
-
-
-
-
-
-
-
-
-
- shortcuts
- Keyboard Shortcuts
- preferences-desktop-keyboard-shortcuts-symbolic
-
-
-
-
- Keyboard Shortcuts
-
-
- XR Effect on/off shortcut
- Quickly enable or disable the XR Effect. You may need to enable the effect manually once in order to enable the shortcut.
- 2
-
-
- 30
- 30
-
-
- 3
-
-
-
-
-
-
- toggle-xr-effect-shortcut
- 3
- Change
-
-
-
-
-
-
-
-
- Re-center display shortcut
- Pin the virtual display to the current position.
- 2
-
-
- 30
- 30
-
-
- 3
-
-
-
-
-
-
- recenter-display-shortcut
- 3
- Change
-
-
-
-
-
-
-
-
- Toggle zoom on focus shortcut
- Quickly toggle zoom on focus mode.
- 2
-
-
- 30
- 30
-
-
- 3
-
-
-
-
-
-
- toggle-display-distance-shortcut
- 3
- Change
-
-
-
-
-
-
-
-
- Toggle follow mode shortcut
- Quickly toggle follow mode.
- 2
-
-
- 30
- 30
-
-
- 3
-
-
-
-
-
-
- toggle-follow-shortcut
- 3
- Change
-
-
-
-
-
-
-
-
- Summon mouse cursor shortcut
- Bring the mouse cursor to the center of the focused display.
- 2
-
-
- 30
- 30
-
-
- 3
-
-
-
-
-
-
- cursor-to-focused-display-shortcut
- 3
- Change
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- advanced
- Advanced Settings
- applications-system-symbolic
-
-
- 2
- 20
- 20
- 20
-
-
- Advanced Settings
- 450
-
-
- Units
- Choose measurement units for size and distance displays.
-
-
- 30
- 150
- 30
-
-
- 3
-
-
-
-
-
-
-
-
-
-
-
-
- Find optimal display config
- Automatically modify the glasses display configuration for maximum resolution and best scaling when plugged in.
-
-
- 3
-
-
-
-
-
-
- Use highest refresh rate
- Refresh rate may affect performance, disable this to set it manually.
-
-
- 3
-
-
-
-
-
-
- Center on glasses' display
- Center the viewport on the glasses' display, even if the display is not in the middle.
-
-
- 3
-
-
-
-
-
-
- Always primary display
- Automatically set the glasses as the primary display when plugged in.
-
-
- 3
-
-
-
-
-
-
- Remove virtual displays on disable
- Automatically remove virtual displays when the XR effect is disabled.
-
-
- 3
-
-
-
-
-
-
- Enable multi-tap detection
- Enables double-tap to recenter and triple-tap to recalibrate.
-
-
- 3
-
-
-
-
-
-
- All displays follow mode
- Follow mode moves all displays, not just the focused one.
-
-
- 3
-
-
-
-
-
-
-
-
-
- 700
-
-
- Neck-saver horizontal multiplier
- Higher values require smaller horizontal head movements.
-
-
- 3
- true
- 0
- 2
- 350
- false
-
-
- 1.0
- 2.5
- 0.01
- 1.0
-
-
-
- 1.0
- 1.25
- 1.5
- 1.75
- 2.0
- 2.25
- 2.5
-
-
-
-
-
-
-
- Neck-saver vertical multiplier
- Higher values require smaller vertical head movements.
-
-
- 3
- true
- 0
- 2
- 350
- false
-
-
- 1.0
- 2.5
- 0.01
- 1.0
-
-
-
- 1.0
- 1.25
- 1.5
- 1.75
- 2.0
- 2.25
- 2.5
-
-
-
-
-
-
-
- Dead-zone threshold (degrees)
- Stabilize movements below this angle.
-
-
- 3
- true
- 0
- 1
- 350
- false
-
-
- 0.0
- 5.0
- 0.1
- 0.0
-
-
-
- Disabled
- 1.0
- 2.0
- 3.0
- 4.0
- 5.0
-
-
-
-
-
-
-
- Follow mode movement tracking
- Choose which movements should be tracked in follow mode.
-
-
- 30
- 20
- 20
- start
-
-
- vertical
- 10
- center
- 80
-
-
- Horizontal
- 3
-
-
-
-
- 3
- center
-
-
-
-
-
-
- vertical
- 10
- center
- 80
-
-
- Vertical
- 3
-
-
-
-
- 3
- center
-
-
-
-
-
-
- vertical
- 10
- center
- 80
-
-
- Tilt/roll
- 3
-
-
-
-
- 3
- center
-
-
-
-
-
-
-
-
-
-
- Movement look-ahead
- 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.
-
-
- 3
- false
- 0
- 0
- 350
- false
-
-
- -1
- 40
- 1
- -1
-
-
-
- Default
- 10ms
- 20ms
- 30ms
- 40ms
-
-
-
-
-
-
-
- Text Scaling
- Scaling text below 1.0 will simulate a higher resolution display
-
-
- 3
- false
- 0
- 0
- 350
- false
-
-
- 0.5
- 1.5
- 0.05
- 1.0
-
-
-
- 0.5
- 0.75
- 1.0
- 1.25
- 1.5
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- stack
- wide
-
-
-
-
diff --git a/ui/src/gtk/custom-resolution-dialog-content.ui b/ui/src/gtk/custom-resolution-dialog-content.ui
deleted file mode 100644
index e0625eb..0000000
--- a/ui/src/gtk/custom-resolution-dialog-content.ui
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
- vertical
- 3
-
-
- Width
-
-
- 3
- 20
- 20
- 20
- true
- 0
- 0
- 350
- false
-
-
- 640
- 3840
- 2
- 1920
-
-
-
- 640
- 1280
- 1920
- 2560
- 3840
-
-
-
-
-
-
-
- Height
-
-
- 3
- 20
- 20
- 20
- true
- 0
- 0
- 350
- false
-
-
- 480
- 2160
- 2
- 1080
-
-
-
- 480
- 720
- 1080
- 1440
- 2160
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/gtk/custom-resolution-dialog.ui b/ui/src/gtk/custom-resolution-dialog.ui
deleted file mode 100644
index 44408c3..0000000
--- a/ui/src/gtk/custom-resolution-dialog.ui
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Add a Custom Resolution
- 1
- 1
-
-
- Add
- 10
- 10
- 10
- 10
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/gtk/display-distance-dialog-content.ui b/ui/src/gtk/display-distance-dialog-content.ui
deleted file mode 100644
index 715e88d..0000000
--- a/ui/src/gtk/display-distance-dialog-content.ui
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- vertical
- 3
-
-
- true
- 20
- 20
- 20
-
-
-
-
- 3
- 20
- 20
- 20
- true
- 0
- 2
- 350
- false
-
-
- 0.1
- 1.5
- 0.01
- 1.05
-
-
-
- closer
- default
- farther
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/gtk/display-distance-dialog.ui b/ui/src/gtk/display-distance-dialog.ui
deleted file mode 100644
index 8bd3ee8..0000000
--- a/ui/src/gtk/display-distance-dialog.ui
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- 1
- 1
-
-
- Done
- 10
- 10
- 10
- 10
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/gtk/failed-verification.ui b/ui/src/gtk/failed-verification.ui
deleted file mode 100644
index 6f86597..0000000
--- a/ui/src/gtk/failed-verification.ui
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- 1
- True
- 20
- 20
- 20
- 20
- 20
-
-
- True
- Breezy Desktop GNOME invalid setup
- Your Breezy GNOME setup is invalid or incomplete. Please re-run the setup script. Report this issue if it persists.
- 650
- 250
-
-
-
-
diff --git a/ui/src/gtk/license-dialog-content.ui b/ui/src/gtk/license-dialog-content.ui
deleted file mode 100644
index 96545c5..0000000
--- a/ui/src/gtk/license-dialog-content.ui
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
- vertical
- 5
- 5
- 20
- 20
-
-
- 10
-
-
- Donate
- ko-fi.com/wheaney
-
-
- go-next-symbolic
- https://ko-fi.com/wheaney
-
-
-
-
-
-
-
- 0
- Request a token
- 6
- 1
-
-
-
-
- 0
- Verify token
- 16
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/gtk/license-dialog.ui b/ui/src/gtk/license-dialog.ui
deleted file mode 100644
index bf7c6d1..0000000
--- a/ui/src/gtk/license-dialog.ui
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- License Details
- 1
- 440
- 200
- 1
-
-
- view-refresh-symbolic
-
-
-
-
diff --git a/ui/src/gtk/no-device.ui b/ui/src/gtk/no-device.ui
deleted file mode 100644
index e41a52a..0000000
--- a/ui/src/gtk/no-device.ui
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
- 1
- True
- 20
- 20
- 20
- 20
- 20
-
-
- True
- No device connected
- Breezy Desktop was unable to detect any supported XR devices.
- 800
- 150
-
-
-
-
-
-
- Auto-enable XR effect
- Automatically enable the Breezy Desktop XR effect when supported glasses are connected.
-
-
- 3
-
-
-
-
-
-
- Disable physical displays
- Automatically disable all physical displays when the XR effect is enabled.
-
-
- 3
-
-
-
-
-
-
-
-
diff --git a/ui/src/gtk/no-driver.ui b/ui/src/gtk/no-driver.ui
deleted file mode 100644
index c7a228c..0000000
--- a/ui/src/gtk/no-driver.ui
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- 1
- True
- 20
- 20
- 20
- 20
- 20
-
-
- True
- No driver running
-
- If you installed via AUR, make sure you ran the recommended post-install command:
- systemctl --user enable --now xr-driver.service
-
- Otherwise, please file an issue on GitHub, or create a new thread in the #troubleshooting channel on Discord.
-
- 800
- 300
-
-
-
-
diff --git a/ui/src/gtk/no-extension.ui b/ui/src/gtk/no-extension.ui
deleted file mode 100644
index 80ed9f8..0000000
--- a/ui/src/gtk/no-extension.ui
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- 1
- True
- 20
- 20
- 20
- 20
- 20
-
-
- True
- Breezy Desktop GNOME extension not ready
- If you have just run the setup, then you may need to log out and back in to use it. Otherwise, please follow the Breezy GNOME setup instructions.
- 800
- 250
-
-
-
-
diff --git a/ui/src/gtk/no-license.ui b/ui/src/gtk/no-license.ui
deleted file mode 100644
index 2cd3f12..0000000
--- a/ui/src/gtk/no-license.ui
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
- 1
- True
- 20
- 20
- 20
- 20
- 20
-
-
- True
- No license file was found
-
- The first time you use Breezy Desktop, an internet connection is required to retrieve your device's license.
-
- Don't worry, there's no obligation to donate at this time. If you haven't, you'll be given a trial license so you can decide if Breezy Desktop fits your needs.
-
- Once you obtain a license, trial or otherwise, you can use Breezy Desktop offline until features expire (or indefinitely, if you've chosen lifetime access).
-
- 800
- 400
-
-
-
-
- Try Again
-
-
-
-
diff --git a/ui/src/gtk/shortcut-dialog.ui b/ui/src/gtk/shortcut-dialog.ui
deleted file mode 100644
index 85da0d4..0000000
--- a/ui/src/gtk/shortcut-dialog.ui
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- Assign Keyboard Shortcut
- 1
- 440
- 200
-
-
- vertical
- 2
- 16
- 16
- 16
- 16
-
-
- 1
- Press your keyboard shortcut or 'Backspace' to disable...
-
-
-
-
-
-
-
-
-
diff --git a/ui/src/gtk/virtual-display-row.ui b/ui/src/gtk/virtual-display-row.ui
deleted file mode 100644
index acb2c2f..0000000
--- a/ui/src/gtk/virtual-display-row.ui
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
- remove-virtual-display
- user-trash-symbolic
- center
-
-
-
-
-
\ No newline at end of file
diff --git a/ui/src/gtk/window.ui b/ui/src/gtk/window.ui
deleted file mode 100644
index fec33ba..0000000
--- a/ui/src/gtk/window.ui
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
- 800
-
-
-
-
-
- vertical
-
-
- 0
- False
- warning
-
-
- True
-
-
- True
- Some features expire soon
- True
-
-
-
-
-
-
- View details
- True
-
-
-
-
-
-
- 0
- False
- error
-
-
- True
-
-
- True
- Productivity features are disabled
- True
-
-
-
-
-
-
- View details
- True
-
-
-
-
-
-
- 0
- False
- warning
-
-
- True
-
-
- True
- Productivity Pro license is inactive — 6DoF features will be unavailable
- True
- True
-
-
-
-
-
-
- View details
- True
-
-
-
-
-
-
- 0
- False
- info
-
-
- True
-
-
- True
- A newer version is available. To update, rerun the breezy_gnome_setup script.
- True
- True
-
-
-
-
-
-
-
-
- True
-
-
-
-
-
-
-
diff --git a/ui/src/license.py b/ui/src/license.py
deleted file mode 100644
index 3f341b8..0000000
--- a/ui/src/license.py
+++ /dev/null
@@ -1,2 +0,0 @@
-BREEZY_GNOME_FEATURES = ['productivity', 'productivity_pro']
-BREEZY_GNOME_TIERS = ['productivity', 'productivity_pro']
\ No newline at end of file
diff --git a/ui/src/licensedialog.py b/ui/src/licensedialog.py
deleted file mode 100644
index 7c9cbc6..0000000
--- a/ui/src/licensedialog.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from gi.repository import Gtk
-from .licensedialogcontent import LicenseDialogContent
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/license-dialog.ui')
-class LicenseDialog(Gtk.Dialog):
- __gtype_name__ = 'LicenseDialog'
-
- refresh_license_button = Gtk.Template.Child()
-
- def __init__(self):
- super(Gtk.Dialog, self).__init__()
- self.init_template()
- self.content = LicenseDialogContent(self.refresh_license_button)
- self.get_content_area().append(self.content)
\ No newline at end of file
diff --git a/ui/src/licensedialogcontent.py b/ui/src/licensedialogcontent.py
deleted file mode 100644
index 3b5844c..0000000
--- a/ui/src/licensedialogcontent.py
+++ /dev/null
@@ -1,105 +0,0 @@
-from gi.repository import Adw, Gtk, GLib
-from .nolicense import NoLicense
-from .statemanager import StateManager
-from .licensetierrow import LicenseTierRow
-from .licensefeaturerow import LicenseFeatureRow
-from .license import BREEZY_GNOME_FEATURES, BREEZY_GNOME_TIERS
-from .xrdriveripc import XRDriverIPC
-import gettext
-
-_ = gettext.gettext
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/license-dialog-content.ui')
-class LicenseDialogContent(Gtk.Box):
- __gtype_name__ = 'LicenseDialogContent'
-
- tiers = Gtk.Template.Child()
- features = Gtk.Template.Child()
- request_token = Gtk.Template.Child()
- verify_token = Gtk.Template.Child()
- donation_info = Gtk.Template.Child()
-
- def __init__(self, refresh_license_button):
- super(Gtk.Box, self).__init__()
- self.init_template()
-
- # check if it has a set_subtitle_selectable method
- if hasattr(self.donation_info, 'set_subtitle_selectable'):
- self.donation_info.set_subtitle_selectable(True)
-
- self.refresh_license_button = refresh_license_button
- self.refresh_license_button.connect('clicked', self._refresh_license)
-
- self.ipc = XRDriverIPC.get_instance()
- StateManager.get_instance().connect('notify::license-action-needed', self._handle_license)
- self._handle_license(StateManager.get_instance())
-
- self.request_token.connect('apply', self._on_request_token)
- self.verify_token.connect('apply', self._on_verify_token)
-
- self.no_license = NoLicense(hide_refresh_button = True)
-
- def _refresh_license(self, widget):
- self.refresh_license_button.set_sensitive(False)
- self.ipc.write_control_flags({'refresh_device_license': True})
- GLib.timeout_add_seconds(3, self._handle_license)
-
- def _handle_license(self, state_manager = None, val = None):
- GLib.idle_add(self._handle_license_idle, state_manager or StateManager.get_instance())
-
- def _handle_license_idle(self, state_manager):
- self.refresh_license_button.set_sensitive(False)
-
- license_view = state_manager.state['ui_view'].get('license', {})
- self.request_token.set_visible(not state_manager.confirmed_token)
- self.verify_token.set_visible(not state_manager.confirmed_token)
-
- for child in self.tiers:
- self.tiers.remove(child)
-
- for child in self.features:
- self.features.remove(child)
-
- if license_view:
- allowed_tiers = set(BREEZY_GNOME_TIERS)
- allowed_features = set(BREEZY_GNOME_FEATURES)
-
- tiers_group = Adw.PreferencesGroup(title=_("Paid Tier Status"), margin_top=20)
- has_any_tier = False
- for tier_name, tier_details in license_view.get('tiers', {}).items():
- if tier_name not in allowed_tiers:
- continue
- tiers_group.add(LicenseTierRow(tier_name, tier_details))
- has_any_tier = True
- if has_any_tier:
- self.tiers.append(tiers_group)
-
- features_group = Adw.PreferencesGroup(title=_("Feature Availability"), margin_top=20)
- has_any_feature = False
- for feature_name, feature_details in license_view.get('features', {}).items():
- if feature_name not in allowed_features:
- continue
- features_group.add(LicenseFeatureRow(feature_name, feature_details))
- has_any_feature = True
- if has_any_feature:
- self.features.append(features_group)
- else:
- self.tiers.append(self.no_license)
-
- self.refresh_license_button.set_sensitive(True)
-
- def _on_request_token(self, widget):
- email_address = self.request_token.get_text()
- self.request_token.set_editable(False)
- if not self.ipc.request_token(email_address):
- self.request_token.set_editable(True)
-
- def _on_verify_token(self, widget):
- token = self.verify_token.get_text()
- self.request_token.set_editable(False)
- self.verify_token.set_editable(False)
- if self.ipc.verify_token(token):
- self.ipc.write_control_flags({'refresh_device_license': True})
- else:
- self.request_token.set_editable(True)
- self.verify_token.set_editable(True)
\ No newline at end of file
diff --git a/ui/src/licensefeaturerow.py b/ui/src/licensefeaturerow.py
deleted file mode 100644
index 1b01c0f..0000000
--- a/ui/src/licensefeaturerow.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from gi.repository import Adw
-
-from .time import time_remaining_text
-import gettext
-
-_ = gettext.gettext
-
-class LicenseFeatureRow(Adw.ActionRow):
-
- def __init__(self, feature, feature_details):
- super().__init__()
-
- self.set_title(self._feature_name(feature))
-
- status = _('Disabled')
- is_trial = feature_details.get('is_trial') == True
- if feature_details.get('is_enabled') == True:
- status = _('In trial') if is_trial else _('Enabled')
-
- details = ''
- funds_needed_in_seconds = feature_details.get('funds_needed_in_seconds')
- if funds_needed_in_seconds is not None and funds_needed_in_seconds > 0:
- time_remaining = time_remaining_text(funds_needed_in_seconds, is_trial)
- if time_remaining: details = _(" ({time_remaining} remaining)").format(time_remaining=time_remaining)
-
- self.set_subtitle(f"{status}{details}")
-
- def _feature_name(self, feature):
- feature_names = {
- 'productivity': lambda: _('Productivity Basic'),
- 'productivity_pro': lambda: _('Productivity Pro'),
- }
- return feature_names[feature]()
\ No newline at end of file
diff --git a/ui/src/licensetierrow.py b/ui/src/licensetierrow.py
deleted file mode 100644
index 153112c..0000000
--- a/ui/src/licensetierrow.py
+++ /dev/null
@@ -1,78 +0,0 @@
-from gi.repository import Adw, Gtk
-
-from .time import time_remaining_text
-import gettext
-
-_ = gettext.gettext
-
-PERIOD_RANKS = {
- 'monthly': 1,
- 'yearly': 2,
- 'lifetime': 3,
-}
-
-class LicenseTierRow(Adw.ExpanderRow):
-
- def __init__(self, tier, tier_details):
- super().__init__()
-
- self.set_title(self._tier_name(tier))
-
- active_period = tier_details.get('active_period')
- funds_needed_in_seconds = tier_details.get('funds_needed_in_seconds')
-
- status = _('Active') if active_period else _('Inactive')
- details = ''
- if active_period:
- details += f" {self._period_description(active_period)}"
- if funds_needed_in_seconds is not None and funds_needed_in_seconds > 0:
- time_remaining = time_remaining_text(funds_needed_in_seconds)
- if time_remaining: details += _(" ({time_remaining} remaining)").format(time_remaining=time_remaining)
- if active_period == 'lifetime':
- self.set_enable_expansion(False)
- self.set_icon_name(None)
-
- self.set_expanded(False)
- self.set_subtitle(f"{status}{details}")
-
- for period, amount in tier_details['funds_needed_by_period'].items():
- amount_text = None
- if amount > 0:
- amount_text = _("${amount} USD").format(amount=amount)
- if active_period == period:
- amount_text += _(" to renew")
- elif active_period is not None:
- amount_text += _(" to upgrade")
- elif active_period is not None and PERIOD_RANKS[period] >= PERIOD_RANKS[active_period]:
- amount_text = _("Paid through next renewal period")
-
- if amount_text is not None:
- row_widget = Adw.ActionRow(title=self._period_name(period))
- row_widget.add_suffix(Gtk.Label(label=amount_text, use_markup=True))
- self.add_row(row_widget)
-
- def _tier_name(self, tier):
- tier_names = {
- 'productivity': _('Productivity Basic'),
- 'productivity_pro': _('Productivity Pro')
- }
- return tier_names.get(tier) or ""
-
- def _period_description(self, period):
- period_descriptions = {
- 'monthly': _(' - renewing monthly'),
- 'yearly': _(' - renewing yearly'),
- 'lifetime': _('with lifetime access'),
- }
-
- return period_descriptions[period]
-
- def _period_name(self, period):
- period_names = {
- 'monthly': _('Monthly'),
- 'yearly': _('Yearly'),
- 'lifetime': _('Lifetime'),
- }
-
- return period_names[period]
-
diff --git a/ui/src/main.py b/ui/src/main.py
deleted file mode 100644
index 3d58566..0000000
--- a/ui/src/main.py
+++ /dev/null
@@ -1,131 +0,0 @@
-import os
-import sys
-import gi
-import logging
-import argparse
-
-from logging.handlers import TimedRotatingFileHandler
-
-gi.require_version('Gtk', '4.0')
-gi.require_version('Adw', '1')
-gi.require_version('Gio', '2.0')
-gi.require_version('GLib', '2.0')
-
-from gi.repository import Adw, Gtk, Gio, GLib
-from .configmanager import ConfigManager
-from .files import get_config_dir, get_state_dir
-from .licensedialog import LicenseDialog
-from .statemanager import StateManager
-from .window import BreezydesktopWindow
-from .xrdriveripc import XRDriverIPC
-
-log_dir = os.path.join(get_state_dir(), 'logs/ui')
-os.makedirs(log_dir, exist_ok=True)
-
-logger = logging.getLogger('breezy_ui')
-logger.setLevel(logging.INFO)
-logname = os.path.join(log_dir, "breezy_desktop.log")
-handler = TimedRotatingFileHandler(logname, when="midnight", backupCount=30)
-handler.suffix = "%Y%m%d"
-formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-handler.setFormatter(formatter)
-logger.addHandler(handler)
-
-def excepthook(exc_type, exc_value, exc_traceback):
- logger.error('Unhandled exception', exc_info=(exc_type, exc_value, exc_traceback))
-
-sys.excepthook = excepthook
-
-XRDriverIPC.set_instance(XRDriverIPC(logger, get_config_dir()))
-
-if GLib.MAJOR_VERSION * 100 + GLib.MINOR_VERSION >= 274:
- APPLICATION_FLAGS = Gio.ApplicationFlags.DEFAULT_FLAGS
-else:
- # deprecated after Gio version 2.74
- APPLICATION_FLAGS = Gio.ApplicationFlags.FLAGS_NONE
-
-
-class BreezydesktopApplication(Adw.Application):
- """The main application singleton class."""
-
- def __init__(self, version, skip_verification):
- super().__init__(application_id='com.xronlinux.BreezyDesktop',
- flags=APPLICATION_FLAGS)
- self.version = version
-
- self.create_action('quit', self.on_quit_action, ['q'])
- self.create_action('about', self.on_about_action)
- self.create_action('license', self.on_license_action)
- self.create_action('reset_driver', self.on_reset_driver_action)
- self._skip_verification = skip_verification or False
-
- # always do this on start-up since the driver sometimes fails to update the license on boot,
- # prevent showing a license warning unnecessarily
- XRDriverIPC.get_instance().write_control_flags({'request_features': ['productivity', 'productivity_pro']})
-
- def do_activate(self):
- """Called when the application is activated.
-
- We raise the application's main window, creating it if
- necessary.
- """
- win = self.props.active_window
- if not win:
- win = BreezydesktopWindow(self.version, self._skip_verification, application=self)
- win.connect('close-request', lambda *_: self.on_quit_action())
- win.connect('destroy', lambda *_: self.on_quit_action())
- win.present()
-
- def on_about_action(self, widget, _):
- """Callback for the app.about action."""
- about = Gtk.AboutDialog(transient_for=self.props.active_window,
- modal=True,
- program_name='Breezy Desktop',
- logo_icon_name='com.xronlinux.BreezyDesktop',
- version=self.version,
- authors=['Wayne Heaney'],
- copyright='© 2026 Wayne Heaney',
- license_type=Gtk.License.GPL_3_0,
- wrap_license=True)
- about.present()
-
- def on_license_action(self, widget, _):
- dialog = LicenseDialog()
- dialog.set_transient_for(self.props.active_window)
- dialog.present()
-
- def on_reset_driver_action(self, widget, _):
- XRDriverIPC.get_instance().reset_driver(as_user=None)
-
- def create_action(self, name, callback, shortcuts=None):
- """Add an application action.
-
- Args:
- name: the name of the action
- callback: the function to be called when the action is
- activated
- shortcuts: an optional list of accelerators
- """
- action = Gio.SimpleAction.new(name, None)
- action.connect("activate", callback)
- self.add_action(action)
- if shortcuts:
- self.set_accels_for_action(f"app.{name}", shortcuts)
-
- def on_quit_action(self, _action = None, _pspec = None):
- win = self.props.active_window
- if win:
- win.close()
-
- StateManager.destroy_instance()
- ConfigManager.destroy_instance()
- self.quit()
-
-
-def main(version):
- parser = argparse.ArgumentParser()
- parser.add_argument("-sv", "--skip-verification", action="store_true")
- args = parser.parse_args()
-
- app = BreezydesktopApplication(version, args.skip_verification)
- return app.run(None)
diff --git a/ui/src/meson.build b/ui/src/meson.build
deleted file mode 100644
index 5d5b4e6..0000000
--- a/ui/src/meson.build
+++ /dev/null
@@ -1,73 +0,0 @@
-pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name()
-moduledir = pkgdatadir / 'breezydesktop'
-gnome = import('gnome')
-
-gnome.compile_resources('breezydesktop',
- 'breezydesktop.gresource.xml',
- gresource_bundle: true,
- install: true,
- install_dir: pkgdatadir,
-)
-
-python = import('python')
-
-conf = configuration_data()
-conf.set('PYTHON', python.find_installation('python3').full_path())
-conf.set('VERSION', meson.project_version())
-conf.set('localedir', get_option('prefix') / get_option('localedir'))
-conf.set('pkgdatadir', pkgdatadir)
-
-configure_file(
- input: 'breezydesktop.in',
- output: 'breezydesktop',
- configuration: conf,
- install: true,
- install_dir: get_option('bindir'),
- install_mode: 'r-xr-xr-x'
-)
-
-configure_file(
- input: 'virtualdisplay.in',
- output: 'virtualdisplay',
- configuration: conf,
- install: true,
- install_dir: get_option('bindir'),
- install_mode: 'r-xr-xr-x'
-)
-
-breezydesktop_sources = [
- '../modules/PyXRLinuxDriverIPC/xrdriveripc.py',
- '__init__.py',
- 'configmanager.py',
- 'connecteddevice.py',
- 'customresolutiondialog.py',
- 'customresolutiondialogcontent.py',
- 'displaydistancedialog.py',
- 'displaydistancedialogcontent.py',
- 'failedverification.py',
- 'files.py',
- 'license.py',
- 'licensedialog.py',
- 'licensedialogcontent.py',
- 'licensefeaturerow.py',
- 'licensetierrow.py',
- 'main.py',
- 'nodevice.py',
- 'nodriver.py',
- 'noextension.py',
- 'nolicense.py',
- 'runtime.py',
- 'runtimeenvironment.py',
- 'settingsmanager.py',
- 'shortcutdialog.py',
- 'statemanager.py',
- 'time.py',
- 'window.py'
-]
-
-install_data(breezydesktop_sources, install_dir: moduledir)
-install_subdir('../lib', install_dir: moduledir)
-
-# the runtimes subpackage marker; a concrete RuntimeEnvironment implementation
-# is copied in per-build by the package script (see ui/bin/package).
-install_data('runtimes/__init__.py', install_dir: moduledir / 'runtimes')
\ No newline at end of file
diff --git a/ui/src/nodevice.py b/ui/src/nodevice.py
deleted file mode 100644
index 70ea98b..0000000
--- a/ui/src/nodevice.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from gi.repository import Gio, Gtk
-from .configmanager import ConfigManager
-from .runtimeenvironment import RuntimeEnvironment
-from .settingsmanager import SettingsManager
-from .statemanager import StateManager
-from .xrdriveripc import XRDriverIPC
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-device.ui')
-class NoDevice(Gtk.Box):
- __gtype_name__ = "NoDevice"
-
- effect_enable_switch = Gtk.Template.Child()
- disable_physical_displays_switch = Gtk.Template.Child()
- # widescreen_mode_switch = Gtk.Template.Child()
-
- def __init__(self):
- super(Gtk.Box, self).__init__()
- self.init_template()
-
- self.ipc = XRDriverIPC.get_instance()
- self.runtime = RuntimeEnvironment.get_instance()
- self.settings = SettingsManager.get_instance().settings
- self.config_manager = ConfigManager.get_instance()
- self.config_manager.connect('notify::breezy-desktop-enabled', self._handle_enabled_config)
-
- self.effect_enable_switch.connect('notify::active', self._handle_switch_enabled_state)
- # self.settings.bind('widescreen-mode', self.widescreen_mode_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
- self.settings.bind('disable-physical-displays', self.disable_physical_displays_switch, 'active', Gio.SettingsBindFlags.DEFAULT)
-
- self._handle_enabled_config(self.config_manager, None)
-
- def _handle_enabled_config(self, config_manager, val):
- enabled = config_manager.get_property('breezy-desktop-enabled') and self.runtime.get_property('breezy-enabled')
- if enabled != self.effect_enable_switch.get_active():
- self.effect_enable_switch.set_active(enabled)
-
- def _handle_switch_enabled_state(self, switch, param):
- requesting_enabled = switch.get_active()
-
- # never turn off the extension, disabling the effect is done via configs only
- if requesting_enabled:
- self.runtime.set_property('breezy-enabled', True)
-
- self.config_manager.set_property('breezy-desktop-enabled', requesting_enabled)
-
- # def _on_widget_destroy(self, widget):
- # self.settings.unbind('widescreen-mode', self.widescreen_mode_switch, 'active')
diff --git a/ui/src/nodriver.py b/ui/src/nodriver.py
deleted file mode 100644
index efde128..0000000
--- a/ui/src/nodriver.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from gi.repository import Gtk
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-driver.ui')
-class NoDriver(Gtk.Box):
- __gtype_name__ = "NoDriver"
diff --git a/ui/src/noextension.py b/ui/src/noextension.py
deleted file mode 100644
index ab73c71..0000000
--- a/ui/src/noextension.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from gi.repository import Gtk
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-extension.ui')
-class NoExtension(Gtk.Box):
- __gtype_name__ = "NoExtension"
diff --git a/ui/src/nolicense.py b/ui/src/nolicense.py
deleted file mode 100644
index c09112d..0000000
--- a/ui/src/nolicense.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from gi.repository import Gtk, GLib, GObject
-
-from .xrdriveripc import XRDriverIPC
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-license.ui')
-class NoLicense(Gtk.Box):
- __gtype_name__ = "NoLicense"
-
- refresh_license_button = Gtk.Template.Child()
-
- def __init__(self, hide_refresh_button = False, **kwargs):
- super(Gtk.Box, self).__init__()
- self.init_template()
-
- self.ipc = XRDriverIPC.get_instance()
-
- if hide_refresh_button:
- self.refresh_license_button.hide()
- else:
- self.refresh_license_button.connect("clicked", self.on_refresh_license_button_clicked)
-
- def on_refresh_license_button_clicked(self, button):
- self.ipc.write_control_flags({'refresh_device_license': True})
\ No newline at end of file
diff --git a/ui/src/runtime.py b/ui/src/runtime.py
deleted file mode 100644
index 5ea3228..0000000
--- a/ui/src/runtime.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""Runtime environment discovery.
-
-Exactly one concrete :class:`~breezydesktop.runtimeenvironment.RuntimeEnvironment`
-implementation is bundled into the ``runtimes`` subpackage at package time. This
-module finds it (the first one it sees) and exposes both the class and a cheap
-way to read its namespace without constructing the (potentially side-effectful)
-instance.
-"""
-
-import importlib
-import inspect
-import logging
-import pkgutil
-
-from .runtimeenvironment import RuntimeEnvironment, DEFAULT_APP_NAMESPACE
-
-logger = logging.getLogger('breezy_ui')
-
-_runtime_class = None
-
-
-def get_runtime_class():
- """Return the active RuntimeEnvironment subclass.
-
- Scans the bundled ``runtimes`` subpackage and returns the first concrete
- RuntimeEnvironment subclass found. The result is cached. Raises
- RuntimeError if no implementation is bundled.
- """
- global _runtime_class
- if _runtime_class is not None:
- return _runtime_class
-
- from . import runtimes
-
- for module_info in pkgutil.iter_modules(runtimes.__path__, runtimes.__name__ + '.'):
- try:
- module = importlib.import_module(module_info.name)
- except Exception as e:
- logger.error("Failed to import runtime module %s: %s", module_info.name, e)
- continue
-
- for _, obj in inspect.getmembers(module, inspect.isclass):
- if issubclass(obj, RuntimeEnvironment) and obj is not RuntimeEnvironment \
- and obj.__module__ == module_info.name:
- logger.info("Using runtime environment %s", obj.__name__)
- _runtime_class = obj
- return _runtime_class
-
- raise RuntimeError(
- "No RuntimeEnvironment implementation was found in the 'runtimes' package. "
- "A runtime implementation must be bundled at package time.")
-
-
-def runtime_namespace():
- """Return the active runtime's application namespace.
-
- Falls back to the default namespace if no runtime is bundled, so early
- bootstrap paths (e.g. log directory setup) never fail.
- """
- try:
- return get_runtime_class().app_namespace()
- except RuntimeError:
- return DEFAULT_APP_NAMESPACE
diff --git a/ui/src/runtimeenvironment.py b/ui/src/runtimeenvironment.py
deleted file mode 100644
index d365136..0000000
--- a/ui/src/runtimeenvironment.py
+++ /dev/null
@@ -1,169 +0,0 @@
-import gettext
-
-from gi.repository import GObject
-
-_ = gettext.gettext
-
-# Default namespace used for XDG directories, application identity, etc. A
-# concrete RuntimeEnvironment should override APP_NAMESPACE.
-DEFAULT_APP_NAMESPACE = 'breezy_gnome'
-
-
-class NullVirtualDisplayManager(GObject.GObject):
- """A no-op virtual display manager.
-
- Provides the same interface (the 'displays' property + change
- notifications, plus create/destroy methods) that the UI binds to, but
- never creates anything. Runtime environments that don't support virtual
- displays can use this so the UI degrades gracefully.
- """
- __gproperties__ = {
- 'displays': (object, 'Displays', 'A list of the displays', GObject.ParamFlags.READWRITE)
- }
-
- def __init__(self):
- GObject.GObject.__init__(self)
- self._displays = []
-
- def create_virtual_display(self, width, height, framerate):
- return None
-
- def destroy_virtual_display(self, pid):
- return False
-
- def do_set_property(self, prop, value):
- if prop.name == 'displays':
- self._displays = value
-
- def do_get_property(self, prop):
- if prop.name == 'displays':
- return self._displays
-
-
-class RuntimeEnvironment(GObject.GObject):
- """Abstraction over the host environment the UI is running in.
-
- A RuntimeEnvironment encapsulates everything that differs between the
- environments Breezy can run in (e.g. GNOME Shell vs. a headless Breezy Box):
- how the effect is enabled, how the installation is verified, whether/how
- updates are checked, how virtual displays are managed, and which optional
- views and fields the UI should present.
-
- The first concrete subclass discovered in the bundled ``runtimes`` package
- (see :mod:`breezydesktop.runtime`) is instantiated as the active
- environment, so a build can swap behavior simply by packaging a different
- implementation.
-
- Subclasses inherit the ``breezy-enabled`` GObject property; override
- :meth:`enable`/:meth:`disable`/:meth:`is_enabled` (and, if needed,
- ``do_set_property``/``do_get_property``) to back it with real state.
- """
-
- # The application/namespace identifier, e.g. 'breezy_gnome' or 'breezy_box'.
- # Used for namespacing XDG directories and similar. Subclasses must set
- # this.
- APP_NAMESPACE = None
-
- __gproperties__ = {
- 'breezy-enabled': (bool, 'Breezy Enabled', 'Whether the Breezy Desktop effect is enabled', False, GObject.ParamFlags.READWRITE)
- }
-
- _instance = None
-
- @classmethod
- def get_instance(cls):
- if RuntimeEnvironment._instance is None:
- from .runtime import get_runtime_class
- RuntimeEnvironment._instance = get_runtime_class()()
- return RuntimeEnvironment._instance
-
- def __init__(self):
- GObject.GObject.__init__(self)
- self._breezy_enabled = False
- self._virtual_display_manager = None
-
- # --- identity ---------------------------------------------------------
-
- @classmethod
- def app_namespace(cls):
- return cls.APP_NAMESPACE or DEFAULT_APP_NAMESPACE
-
- # --- effect enablement (backs the 'breezy-enabled' property) ----------
-
- def is_installed(self):
- """Whether the supporting components for this environment are installed.
-
- Environments with no separate component to install (e.g. a headless
- box where the runtime is always present) should return True.
- """
- return True
-
- def is_enabled(self):
- return self._breezy_enabled
-
- def enable(self):
- self._breezy_enabled = True
-
- def disable(self):
- self._breezy_enabled = False
-
- # --- verification -----------------------------------------------------
-
- def verify(self):
- """Verify the installation. Return True when verification passes (or
- when the environment has no verification step)."""
- return True
-
- # --- update checking --------------------------------------------------
-
- def check_for_update(self, current_version, callback):
- """Asynchronously check for a newer version.
-
- Implementations that support updates should invoke
- ``callback(latest_version_str)`` when a newer version is available.
- The default is a no-op (no update prompt).
- """
- return None
-
- # --- optional views / fields ------------------------------------------
-
- @property
- def shows_no_device_view(self):
- """Whether a dedicated "no device connected" view should be shown.
-
- When False, the connected-device view is always shown and
- :meth:`no_device_label` supplies the label used when no device is
- actually connected.
- """
- return False
-
- def no_device_label(self):
- """Label shown in place of a device name when no device is connected
- (only relevant when :attr:`shows_no_device_view` is False)."""
- return _("No supported glasses connected")
-
- # --- virtual displays -------------------------------------------------
-
- def is_virtual_display_supported(self):
- return False
-
- def _create_virtual_display_manager(self):
- """Build the virtual display manager for this environment. Override to
- provide a real implementation."""
- return NullVirtualDisplayManager()
-
- @property
- def virtual_display_manager(self):
- if self._virtual_display_manager is None:
- self._virtual_display_manager = self._create_virtual_display_manager()
- return self._virtual_display_manager
-
- # --- GObject property plumbing ----------------------------------------
-
- def do_set_property(self, prop, value):
- if prop.name == 'breezy-enabled' and value != self.is_enabled():
- self.enable() if value else self.disable()
-
- def do_get_property(self, prop):
- if prop.name == 'breezy-enabled':
- return self.is_enabled()
diff --git a/ui/src/runtimes/__init__.py b/ui/src/runtimes/__init__.py
deleted file mode 100644
index 69f7dba..0000000
--- a/ui/src/runtimes/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""Bundled runtime environment implementations.
-
-Exactly one concrete RuntimeEnvironment implementation module is copied into
-this package at package time (see ui/bin/package). The implementation is
-selected per-build from a runtime source directory (e.g. gnome/ui), so behavior
-can be swapped without touching the core UI.
-"""
diff --git a/ui/src/settingsmanager.py b/ui/src/settingsmanager.py
deleted file mode 100644
index ea6cd08..0000000
--- a/ui/src/settingsmanager.py
+++ /dev/null
@@ -1,16 +0,0 @@
-
-from gi.repository import Gio
-
-class SettingsManager:
- _instance = None
-
- @staticmethod
- def get_instance():
- if not SettingsManager._instance:
- SettingsManager._instance = SettingsManager()
-
- return SettingsManager._instance
-
- def __init__(self):
- self.settings = Gio.Settings.new_with_path("com.xronlinux.BreezyDesktop", "/com/xronlinux/BreezyDesktop/")
- self.desktop_settings = Gio.Settings.new("org.gnome.desktop.interface")
diff --git a/ui/src/shortcutdialog.py b/ui/src/shortcutdialog.py
deleted file mode 100644
index 4bb1e3b..0000000
--- a/ui/src/shortcutdialog.py
+++ /dev/null
@@ -1,109 +0,0 @@
-from gi.repository import Gtk, Gdk
-import gettext
-
-_ = gettext.gettext
-
-from .settingsmanager import SettingsManager
-
-# ported from https://github.com/velitasali/gnome-shell-extension-awesome-tiles
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/shortcut-dialog.ui')
-class ShortcutDialog(Gtk.Dialog):
- __gtype_name__ = 'ShortcutDialog'
-
- event_controller = Gtk.Template.Child()
-
- def __init__(self, settings_key):
- super(Gtk.Dialog, self).__init__()
- self.init_template()
-
- self.settings_key = settings_key
- self.key_pressed_connect_id = self.event_controller.connect('key-pressed', self._on_key_pressed)
-
- def _on_key_pressed(self, widget, keyval, keycode, state):
- mask = state & Gtk.accelerator_get_default_mod_mask()
- mask &= ~Gdk.ModifierType.LOCK_MASK
-
- done = True
- if mask == 0 and keyval == Gdk.KEY_Escape:
- self.visible = False
- elif keyval == Gdk.KEY_BackSpace:
- SettingsManager.get_instance().settings.set_strv(self.settings_key, [])
- self.close()
- elif is_binding_valid(mask, keycode, keyval) and is_accel_valid(state, keyval):
- binding = Gtk.accelerator_name_with_keycode(
- None,
- keyval,
- keycode,
- state
- )
- SettingsManager.get_instance().settings.set_strv(self.settings_key, [binding])
-
- self.close()
- else:
- done = False
-
- if done and self.key_pressed_connect_id:
- self.event_controller.disconnect(self.key_pressed_connect_id)
- self.key_pressed_connect_id = None
-
- return Gdk.EVENT_STOP
-
-def is_binding_valid(mask, keycode, keyval):
- if mask == 0 or mask == Gdk.ModifierType.SHIFT_MASK and keycode != 0:
- if keyval >= Gdk.KEY_a and keyval <= Gdk.KEY_z or \
- keyval >= Gdk.KEY_A and keyval <= Gdk.KEY_Z or \
- keyval >= Gdk.KEY_0 and keyval <= Gdk.KEY_9 or \
- keyval >= Gdk.KEY_kana_fullstop and keyval <= Gdk.KEY_semivoicedsound or \
- keyval >= Gdk.KEY_Arabic_comma and keyval <= Gdk.KEY_Arabic_sukun or \
- keyval >= Gdk.KEY_Serbian_dje and keyval <= Gdk.KEY_Cyrillic_HARDSIGN or \
- keyval >= Gdk.KEY_Greek_ALPHAaccent and keyval <= Gdk.KEY_Greek_omega or \
- keyval >= Gdk.KEY_hebrew_doublelowline and keyval <= Gdk.KEY_hebrew_taf or \
- keyval >= Gdk.KEY_Thai_kokai and keyval <= Gdk.KEY_Thai_lekkao or \
- keyval >= Gdk.KEY_Hangul_Kiyeog and keyval <= Gdk.KEY_Hangul_J_YeorinHieuh or \
- keyval == Gdk.KEY_space and mask == 0 or \
- is_keyval_forbidden(keyval):
- return False
- return True
-
-def is_keyval_forbidden(keyval):
- forbidden_keyvals = [
- Gdk.KEY_Home,
- Gdk.KEY_Left,
- Gdk.KEY_Up,
- Gdk.KEY_Right,
- Gdk.KEY_Down,
- Gdk.KEY_Page_Up,
- Gdk.KEY_Page_Down,
- Gdk.KEY_End,
- Gdk.KEY_Tab,
- Gdk.KEY_KP_Enter,
- Gdk.KEY_Return,
- Gdk.KEY_Mode_switch
- ]
- return keyval in forbidden_keyvals
-
-def is_accel_valid(mask, keyval):
- return Gtk.accelerator_valid(keyval, mask) or (keyval == Gdk.KEY_Tab and mask != 0)
-
-def bind_shortcut_settings(window, widget_tuples):
- for widget_tuple in widget_tuples:
- widget, label = widget_tuple
- SettingsManager.get_instance().settings.connect('changed::' + widget.get_name(),
- lambda *args, widget=widget, label=label: reload_shortcut_widget(widget, label))
- widget.connect('clicked', lambda *args, widget=widget: on_assign_shortcut(window, widget))
-
- reload_shortcut_widgets(widget_tuples)
-
-def on_assign_shortcut(window, widget):
- dialog = ShortcutDialog(widget.get_name())
- dialog.set_transient_for(widget.get_ancestor(Gtk.Window))
- dialog.present()
-
-def reload_shortcut_widget(widget, label):
- shortcut = SettingsManager.get_instance().settings.get_strv(widget.get_name())
- label.set_accelerator(shortcut[0] if len(shortcut) > 0 else _('Disabled'))
-
-def reload_shortcut_widgets(widget_tuples):
- for widget_tuple in widget_tuples:
- widget, label = widget_tuple
- reload_shortcut_widget(widget, label)
\ No newline at end of file
diff --git a/ui/src/statemanager.py b/ui/src/statemanager.py
deleted file mode 100644
index 5acbc42..0000000
--- a/ui/src/statemanager.py
+++ /dev/null
@@ -1,177 +0,0 @@
-import sys
-from gi.repository import GObject, GLib
-from .time import LICENSE_WARN_SECONDS
-from .xrdriveripc import XRDriverIPC
-
-# shouldn't need a number larger than a year
-LICENSE_ACTION_NEEDED_MAX = 60 * 60 * 24 * 366
-
-class StateManager(GObject.GObject):
- __gsignals__ = {
- 'device-update': (GObject.SIGNAL_RUN_FIRST, None, (str,))
- }
-
- __gproperties__ = {
- 'driver-running': (bool, 'Driver Running', 'Whether the driver is running', False, GObject.ParamFlags.READWRITE),
- 'follow-mode': (bool, 'Follow Mode', 'Whether the follow mode is enabled', False, GObject.ParamFlags.READWRITE),
- 'follow-threshold': (float, 'Follow Threshold', 'The follow threshold', 1.0, 45.0, 15.0, GObject.ParamFlags.READWRITE),
- 'widescreen-mode': (bool, 'Widescreen Mode', 'Whether widescreen mode is enabled', False, GObject.ParamFlags.READWRITE),
- 'license-action-needed': (bool, 'License Action Needed', 'Whether the license needs attention', False, GObject.ParamFlags.READWRITE),
- 'license-present': (bool, 'License Present', 'Whether a license is present', False, GObject.ParamFlags.READWRITE),
- 'enabled-features-list': (object, 'Enabled Features List', 'A list of the enabled features', GObject.ParamFlags.READWRITE),
- 'device-supports-sbs': (bool, 'Device Supports SBS', 'Whether the connected device supports SBS', False, GObject.ParamFlags.READWRITE),
- 'connected-device-pose-has-position': (bool, 'Pose Has Position', 'Whether the connected device provides position tracking (6DoF)', False, GObject.ParamFlags.READWRITE),
- 'connected-device-full-distance-cm': (float, 'Full Distance (cm)', 'Device full distance in cm', 0.0, 10000.0, 0.0, GObject.ParamFlags.READWRITE),
- 'connected-device-full-size-cm': (float, 'Full Size (cm)', 'Device full display size in cm', 0.0, 10000.0, 0.0, GObject.ParamFlags.READWRITE),
- }
-
- _instance = None
-
- @staticmethod
- def get_instance():
- if not StateManager._instance:
- StateManager._instance = StateManager()
-
- return StateManager._instance
-
- @staticmethod
- def destroy_instance():
- if StateManager._instance:
- StateManager._instance.stop()
- StateManager._instance = None
-
- @staticmethod
- def device_name(state):
- if state.get('connected_device_brand') and state.get('connected_device_model'):
- return f"{state['connected_device_brand']} {state['connected_device_model']}"
-
- return None
-
- def __init__(self):
- GObject.GObject.__init__(self)
- self.ipc = XRDriverIPC.get_instance()
- self.driver_running = False
- self.follow_mode = False
- self.follow_threshold = 15.0
- self.widescreen_mode = False
- self.connected_device_name = None
- self.license_action_needed = False
- self.license_action_needed_seconds = 0
- self.confirmed_token = False
- self.license_present = False
- self.enabled_features = []
- self.device_supports_sbs = False
- self.connected_device_pose_has_position = False
- self.connected_device_full_distance_cm = 0.0
- self.connected_device_full_size_cm = 0.0
- self._running = True
- self._refresh_source_id = None
- self._refresh_state()
- self._refresh_source_id = GLib.timeout_add_seconds(1, self._refresh_state)
-
- def stop(self):
- self._running = False
- if self._refresh_source_id is not None:
- GLib.source_remove(self._refresh_source_id)
- self._refresh_source_id = None
-
- def _refresh_state(self):
- self.state = self.ipc.retrieve_driver_state()
- driver_running = self.state['ui_view'].get('driver_running')
- if driver_running != self.driver_running:
- self.set_property('driver-running', driver_running)
-
- new_device_name = StateManager.device_name(self.state)
- if self.connected_device_name != new_device_name:
- self.connected_device_name = new_device_name
- self.emit('device-update', self.connected_device_name)
-
- license_view = self.state['ui_view'].get('license')
- if license_view:
- if not self.license_present:
- self.set_property('license-present', True)
- self.confirmed_token = license_view.get('confirmed_token') == True
- action_needed_details = license_view.get('action_needed')
- action_needed_seconds = action_needed_details.get('seconds') if action_needed_details else None
-
- action_needed = action_needed_seconds is not None and action_needed_seconds < LICENSE_WARN_SECONDS
- if (action_needed != self.license_action_needed):
- self.license_action_needed_seconds = action_needed_seconds
- self.set_property('license-action-needed', action_needed)
- enabled_features = license_view.get('enabled_features', [])
- if self.enabled_features != enabled_features:
- self.set_property('enabled-features-list', enabled_features)
- elif self.license_present:
- self.set_property('license-present', False)
-
- # only update these properties if a device is still connected
- if (self.connected_device_name):
- follow_mode = self.state.get('breezy_desktop_smooth_follow_enabled', False)
- if follow_mode != self.follow_mode:
- self.set_property('follow-mode', follow_mode)
-
- device_supports_sbs = self.state.get('sbs_mode_supported', False)
- if device_supports_sbs != self.device_supports_sbs:
- self.set_property('device-supports-sbs', device_supports_sbs)
-
- widescreen_mode = self.state.get('sbs_mode_enabled', False)
- if widescreen_mode != self.widescreen_mode:
- self.set_property('widescreen-mode', widescreen_mode)
-
- pose_has_position = (self.state.get('connected_device_pose_has_position', False) == True)
- if pose_has_position != self.connected_device_pose_has_position:
- self.set_property('connected-device-pose-has-position', pose_has_position)
-
- full_distance = self.state.get('connected_device_full_distance_cm') or 0.0
- if full_distance != self.connected_device_full_distance_cm:
- self.set_property('connected-device-full-distance-cm', full_distance)
-
- full_size = self.state.get('connected_device_full_size_cm') or 0.0
- if full_size != self.connected_device_full_size_cm:
- self.set_property('connected-device-full-size-cm', full_size)
-
- return self._running
-
- def do_set_property(self, prop, value):
- if prop.name == 'driver-running':
- self.driver_running = value
- if prop.name == 'follow-mode':
- self.follow_mode = value
- if prop.name == 'widescreen-mode':
- self.widescreen_mode = value
- if prop.name == 'license-action-needed':
- self.license_action_needed = value
- if prop.name == 'license-present':
- self.license_present = value
- if prop.name == 'enabled-features-list':
- self.enabled_features = value
- if prop.name == 'device-supports-sbs':
- self.device_supports_sbs = value
- if prop.name == 'connected-device-pose-has-position':
- self.connected_device_pose_has_position = value
- if prop.name == 'connected-device-full-distance-cm':
- self.connected_device_full_distance_cm = value
- if prop.name == 'connected-device-full-size-cm':
- self.connected_device_full_size_cm = value
-
- def do_get_property(self, prop):
- if prop.name == 'driver-running':
- return self.driver_running
- if prop.name == 'follow-mode':
- return self.follow_mode
- if prop.name == 'widescreen-mode':
- return self.widescreen_mode
- if prop.name == 'license-action-needed':
- return self.license_action_needed
- if prop.name == 'license-present':
- return self.license_present
- if prop.name == 'enabled-features-list':
- return self.enabled_features
- if prop.name == 'device-supports-sbs':
- return self.device_supports_sbs
- if prop.name == 'connected-device-pose-has-position':
- return self.connected_device_pose_has_position
- if prop.name == 'connected-device-full-distance-cm':
- return self.connected_device_full_distance_cm
- if prop.name == 'connected-device-full-size-cm':
- return self.connected_device_full_size_cm
\ No newline at end of file
diff --git a/ui/src/time.py b/ui/src/time.py
deleted file mode 100644
index 7754385..0000000
--- a/ui/src/time.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from math import floor
-import gettext
-
-_ = gettext.gettext
-
-# we'll begin to alert the user when there's less than a week left
-LICENSE_WARN_SECONDS = 60 * 60 * 24 * 7
-
-def time_remaining_text(seconds, no_cap=False):
- if not seconds:
- return
-
- if seconds / 60 < 60:
- return _('less than an hour')
- elif seconds / (60 * 60) < 24:
- time_remaining = floor(seconds / (60 * 60))
- return _('1 hour') if time_remaining == 1 else _("{time_remaining} hours").format(time_remaining=time_remaining)
- elif seconds / (24 * 60 * 60) < 30 or no_cap:
- time_remaining = floor(seconds / (24 * 60 * 60))
- return _('1 day') if time_remaining == 1 else _("{time_remaining} days").format(time_remaining=time_remaining)
- else:
- return
\ No newline at end of file
diff --git a/ui/src/virtualdisplay.in b/ui/src/virtualdisplay.in
deleted file mode 100755
index 132a966..0000000
--- a/ui/src/virtualdisplay.in
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/env python3
-
-# virtualdisplay.in
-#
-# Copyright 2024 Unknown
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-import logging
-import os
-import sys
-
-xdg_data_home = os.getenv('XDG_DATA_HOME', os.path.join(os.path.expanduser('~'), '.local', 'share'))
-appdir = os.getenv('APPDIR', xdg_data_home)
-pkgdatadir = os.path.join(appdir, 'breezydesktop')
-sys.path.insert(1, pkgdatadir)
-
-lib_dir = os.path.join(pkgdatadir, 'breezydesktop', 'lib')
-sys.path.insert(0, lib_dir)
-
-from logging.handlers import TimedRotatingFileHandler
-
-config_home = os.environ.get('XDG_CONFIG_HOME', '~/.config')
-config_dir = os.path.expanduser(config_home)
-state_home = os.environ.get('XDG_STATE_HOME', '~/.local/state')
-state_dir = os.path.expanduser(state_home)
-breezy_state_dir = os.path.join(state_dir, 'breezy_gnome')
-log_dir = os.path.join(breezy_state_dir, 'logs/ui')
-os.makedirs(log_dir, exist_ok=True)
-
-logger = logging.getLogger('breezy_ui')
-logger.setLevel(logging.INFO)
-logname = os.path.join(log_dir, "breezy_desktop.log")
-handler = TimedRotatingFileHandler(logname, when="midnight", backupCount=30)
-handler.suffix = "%Y%m%d"
-formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-handler.setFormatter(formatter)
-logger.addHandler(handler)
-
-import sys
-import argparse
-import signal
-import time
-
-VERSION = '@VERSION@'
-
-import gi
-
-gi.require_version('GLib', '2.0')
-
-from gi.repository import GLib
-
-def graceful_shutdown(signum, frame):
- global virtual_display_instance
- global loop
-
- if virtual_display_instance is not None:
- virtual_display_instance.terminate()
-
-def _on_display_closed():
- global loop
- loop.quit()
-
-def create_display(width, height, framerate):
- global virtual_display_instance
-
- try:
- virtual_display_instance = VirtualDisplay(width, height, framerate, _on_display_closed)
- virtual_display_instance.create()
- except Exception as e:
- logger.error(f"Error creating virtual display: {e}")
- sys.exit(1)
-
-if __name__ == "__main__":
- from breezydesktop.runtimes import virtualdisplay
- from breezydesktop.runtimes.virtualdisplay import VirtualDisplay
-
- global virtual_display_instance
- global loop
-
- parser = argparse.ArgumentParser(description="Virtual display arguments")
- parser.add_argument("--height", type=int, required=True, help="Height of the display")
- parser.add_argument("--width", type=int, required=True, help="Width of the display")
- parser.add_argument("--framerate", type=int, default=60, help="Framerate of the display")
- args = parser.parse_args()
-
- signal.signal(signal.SIGTERM, graceful_shutdown)
- signal.signal(signal.SIGINT, graceful_shutdown)
-
- loop = GLib.MainLoop()
-
- try:
- GLib.idle_add(create_display, args.width, args.height, args.framerate)
- loop.run()
- except Exception as e:
- logger.error(f"Error in main loop: {e}")
- sys.exit(1)
\ No newline at end of file
diff --git a/ui/src/virtualdisplayrow.py b/ui/src/virtualdisplayrow.py
deleted file mode 100644
index de0dc42..0000000
--- a/ui/src/virtualdisplayrow.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from gi.repository import Adw, Gtk
-from .runtimeenvironment import RuntimeEnvironment
-
-import gettext
-
-_ = gettext.gettext
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/virtual-display-row.ui')
-class VirtualDisplayRow(Adw.ActionRow):
- __gtype_name__ = "VirtualDisplayRow"
-
- remove_virtual_display_button = Gtk.Template.Child()
-
- def __init__(self, pid, width, height, framerate):
- super(Adw.ActionRow, self).__init__()
- self.init_template()
- self.pid = pid
-
- icon = Gtk.Image.new_from_icon_name("video-display-symbolic")
-
- # padding around the icon
- self.add_prefix(Gtk.Label(label=" "))
- self.add_prefix(icon)
- self.add_prefix(Gtk.Label(label=" "))
-
- self.set_subtitle(f"{width} x {height}")
-
- self.remove_virtual_display_button.connect('clicked', self._remove_virtual_display)
-
- def _remove_virtual_display(self, widget):
- RuntimeEnvironment.get_instance().virtual_display_manager.destroy_virtual_display(self.pid)
\ No newline at end of file
diff --git a/ui/src/window.py b/ui/src/window.py
deleted file mode 100644
index fca8d42..0000000
--- a/ui/src/window.py
+++ /dev/null
@@ -1,112 +0,0 @@
-from gi.repository import Gtk, GLib
-from .license import BREEZY_GNOME_FEATURES
-from .licensedialog import LicenseDialog
-from .runtimeenvironment import RuntimeEnvironment
-from .statemanager import StateManager
-from .settingsmanager import SettingsManager
-from .connecteddevice import ConnectedDevice
-from .failedverification import FailedVerification
-from .nodevice import NoDevice
-from .nodriver import NoDriver
-from .noextension import NoExtension
-from .nolicense import NoLicense
-
-@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/window.ui')
-class BreezydesktopWindow(Gtk.ApplicationWindow):
- __gtype_name__ = 'BreezydesktopWindow'
-
- main_content = Gtk.Template.Child()
- license_action_needed_banner = Gtk.Template.Child()
- license_action_needed_button = Gtk.Template.Child()
- missing_breezy_features_banner = Gtk.Template.Child()
- missing_breezy_features_button = Gtk.Template.Child()
- pose_position_needs_pro_banner = Gtk.Template.Child()
- pose_position_needs_pro_button = Gtk.Template.Child()
- update_available_banner = Gtk.Template.Child()
-
- def __init__(self, version, skip_verification, **kwargs):
- super().__init__(**kwargs)
-
- self.runtime = RuntimeEnvironment.get_instance()
- self.connected_device = ConnectedDevice()
- self.failed_verification = FailedVerification()
- self.no_device = NoDevice()
- self.no_driver = NoDriver()
- self.no_extension = NoExtension()
- self.no_license = NoLicense()
-
- self._skip_verification = skip_verification
-
- self.settings = SettingsManager.get_instance().settings
- self.state_manager = StateManager.get_instance()
- self.state_manager.connect('device-update', self._handle_state_update)
- self.state_manager.connect('notify::license-action-needed', self._handle_state_update)
- self.state_manager.connect('notify::license-present', self._handle_state_update)
- self.state_manager.connect('notify::enabled-features-list', self._handle_state_update)
- self.state_manager.connect('notify::connected-device-pose-has-position', self._handle_state_update)
- self.settings.connect('changed::debug-no-device', self._handle_settings_update)
-
- self.license_action_needed_button.connect('clicked', self._on_license_button_clicked)
- self.missing_breezy_features_button.connect('clicked', self._on_license_button_clicked)
- self.pose_position_needs_pro_button.connect('clicked', self._on_license_button_clicked)
-
- self._handle_state_update(self.state_manager, None)
-
- self._skip_verification = skip_verification
-
- self.connect("destroy", self._on_window_destroy)
-
- self.runtime.check_for_update(version, self._on_update_check_result)
-
- def _handle_settings_update(self, settings_manager, key):
- self._handle_state_update(self.state_manager, None)
-
- def _handle_state_update(self, state_manager, val):
- GLib.idle_add(self._handle_state_update_gui, state_manager)
-
- def _handle_state_update_gui(self, state_manager):
- enabled_features_list = state_manager.get_property('enabled-features-list') or []
- enabled_breezy_features = [feature for feature in enabled_features_list if feature in BREEZY_GNOME_FEATURES]
- breezy_features_granted = len(enabled_breezy_features) > 0
- self.missing_breezy_features_banner.set_revealed(not breezy_features_granted)
- self.license_action_needed_banner.set_revealed(state_manager.get_property('license-action-needed') == True)
-
- pose_has_position = state_manager.get_property('connected-device-pose-has-position') == True
- pro_enabled = 'productivity_pro' in enabled_features_list
- self.pose_position_needs_pro_banner.set_revealed(state_manager.connected_device_name and pose_has_position and breezy_features_granted and not pro_enabled)
-
- for child in self.main_content:
- self.main_content.remove(child)
-
- if self.settings.get_boolean('debug-no-device'):
- self.main_content.append(self.connected_device)
- self.connected_device.set_device_name('Fake device')
- elif not self._skip_verification and not self.runtime.verify():
- self.main_content.append(self.failed_verification)
- elif not self.runtime.is_installed():
- self.main_content.append(self.no_extension)
- elif not self.state_manager.driver_running:
- self.main_content.append(self.no_driver)
- elif not self.state_manager.license_present:
- self.main_content.append(self.no_license)
- elif not state_manager.connected_device_name and self.runtime.shows_no_device_view:
- self.main_content.append(self.no_device)
- else:
- self.main_content.append(self.connected_device)
- self.connected_device.set_device_name(state_manager.connected_device_name or self.runtime.no_device_label())
-
- self.set_resizable(True)
- self.set_default_size(1, 1)
-
- return False
-
- def _on_license_button_clicked(self, widget):
- dialog = LicenseDialog()
- dialog.set_transient_for(widget.get_ancestor(Gtk.Window))
- dialog.present()
-
- def _on_update_check_result(self, latest_version):
- GLib.idle_add(self.update_available_banner.set_revealed, latest_version is not None)
-
- def _on_window_destroy(self, widget):
- self.state_manager.disconnect_by_func(self._handle_state_update)
\ No newline at end of file