hyprland: add virtual output controls

parent ba26fb3d
...@@ -56,7 +56,7 @@ Tuner.Page displays_page { ...@@ -56,7 +56,7 @@ Tuner.Page displays_page {
} }
Tuner.Group { Tuner.Group {
title: _("Details"); title: _("Displays");
id: "monitors"; id: "monitors";
$TunerDisplaysPrimaryDisplayWidget primary_display_widget {} $TunerDisplaysPrimaryDisplayWidget primary_display_widget {}
...@@ -70,6 +70,28 @@ Tuner.Page displays_page { ...@@ -70,6 +70,28 @@ Tuner.Page displays_page {
} }
Tuner.Group { Tuner.Group {
title: _("Virtual Displays");
id: "virtual-outputs";
show-empty: true;
header-suffix: Button add_virtual_output_button {
icon-name: "list-add-symbolic";
tooltip-text: _("Add Virtual Display");
has-frame: false;
styles ["flat"]
};
$TunerDisplaysVirtualOutputsWidget virtual_outputs_widget {
binding: $TunerDisplaysDisplaysVisibilityBinding {
mode: "virtual-outputs";
validator: $TunerDisplaysDisplaysVisibilityValidator {
group-mode: "virtual-outputs";
};
};
}
}
Tuner.Group {
id: "single-monitor"; id: "single-monitor";
$TunerDisplaysSingleMonitorWidget single_monitor_widget { $TunerDisplaysSingleMonitorWidget single_monitor_widget {
......
...@@ -17,3 +17,4 @@ src/ui/widgets/mirror-settings-widget.vala ...@@ -17,3 +17,4 @@ src/ui/widgets/mirror-settings-widget.vala
src/ui/widgets/monitor-row.vala src/ui/widgets/monitor-row.vala
src/ui/widgets/primary-display-widget.vala src/ui/widgets/primary-display-widget.vala
src/ui/widgets/status-widget.vala src/ui/widgets/status-widget.vala
src/ui/widgets/virtual-outputs-widget.vala
...@@ -2,7 +2,7 @@ msgid "" ...@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: tuner-displays\n" "Project-Id-Version: tuner-displays\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-15 11:58+0300\n" "POT-Creation-Date: 2026-06-15 19:13+0300\n"
"PO-Revision-Date: 2026-05-28 00:00+0000\n" "PO-Revision-Date: 2026-05-28 00:00+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
...@@ -11,51 +11,173 @@ msgstr "" ...@@ -11,51 +11,173 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: data/ui/displays-view.blp:7 src/plugin.vala:15 #: data/ui/pages/displays-page.blp:7 data/ui/pages/displays-page.blp:59
msgid "Displays" msgid "Displays"
msgstr "Мониторы" msgstr "Мониторы"
#: data/ui/displays-view.blp:13 src/backends/hyprland-backend.vala:40 #: data/ui/pages/displays-page.blp:32
#: src/backends/hyprland-backend.vala:55 src/backends/niri-backend.vala:46 msgid "Mirror Displays"
#: src/backends/niri-backend.vala:61 msgstr "Зеркалировать мониторы"
msgid "Monitor configuration is not connected"
msgstr "Конфигурация мониторов не подключена"
#: data/ui/displays-view.blp:18 #: data/ui/pages/displays-page.blp:73
msgid "Connect" msgid "Virtual Displays"
msgstr "Подключить" msgstr "Виртуальные мониторы"
#: data/ui/displays-view.blp:28 #: data/ui/pages/displays-page.blp:79
msgid "Details" msgid "Add Virtual Display"
msgstr "Параметры" msgstr "Добавить виртуальный монитор"
#: data/ui/pages/displays-page.blp:108
msgid "Refresh"
msgstr "Обновить"
#: data/ui/pages/displays-page.blp:112 data/ui/pages/displays-page.blp:113
#: data/ui/pages/displays-page.blp:133 data/ui/pages/displays-page.blp:134
msgid "Apply"
msgstr "Применить"
#: data/ui/pages/displays-page.blp:118 data/ui/pages/displays-page.blp:128
#: data/ui/pages/monitor-settings-content.blp:7
msgid "Monitor"
msgstr "Монитор"
#: data/ui/monitor-settings-content.blp:8 #: data/ui/pages/monitor-settings-content.blp:11
msgid "Display" msgid "Display"
msgstr "Дисплей" msgstr "Дисплей"
#: data/ui/monitor-settings-content.blp:11 #: data/ui/pages/monitor-settings-content.blp:15
msgid "Enabled" msgid "Enabled"
msgstr "Включён" msgstr "Включён"
#: data/ui/monitor-settings-content.blp:16 #: data/ui/pages/monitor-settings-content.blp:23
#: data/ui/pages/monitor-settings-content.blp:32
#: src/ui/widgets/mirror-settings-widget.vala:45
msgid "Resolution"
msgstr "Разрешение"
#: data/ui/pages/monitor-settings-content.blp:41
#: data/ui/pages/monitor-settings-content.blp:48
msgid "Refresh Rate"
msgstr "Частота обновления"
#: data/ui/pages/monitor-settings-content.blp:57
#: data/ui/pages/monitor-settings-content.blp:102
msgid "Variable Refresh Rate"
msgstr "Переменная частота обновления"
#: data/ui/pages/monitor-settings-content.blp:66
#: data/ui/pages/monitor-settings-content.blp:75
#: src/ui/widgets/mirror-settings-widget.vala:76
msgid "Scale"
msgstr "Масштаб"
#: data/ui/pages/monitor-settings-content.blp:87
#: src/ui/widgets/mirror-settings-widget.vala:98
msgid "Rotation"
msgstr "Поворот"
#: data/ui/pages/monitor-settings-content.blp:93
msgid "Mirror"
msgstr "Зеркалирование"
#: data/ui/pages/monitor-settings-content.blp:111
msgid "Focus at startup"
msgstr "Фокус при запуске"
#: data/ui/pages/monitor-settings-content.blp:126
msgid "Hot corners"
msgstr "Активные углы"
#: data/ui/pages/monitor-settings-content.blp:135
msgid "Adjust for TV"
msgstr "Отрегулировать для ТВ"
#: data/ui/pages/monitor-settings-content.blp:143
msgid "HDR"
msgstr "HDR"
#: data/ui/pages/monitor-settings-content.blp:152
msgid "Hyprland" msgid "Hyprland"
msgstr "Hyprland" msgstr "Hyprland"
#: data/ui/monitor-settings-content.blp:20 #: data/ui/pages/monitor-settings-content.blp:156
msgid "Use description"
msgstr "Использовать описание"
#: data/ui/pages/monitor-settings-content.blp:164
msgid "Bit depth"
msgstr "Глубина цвета"
#: data/ui/pages/monitor-settings-content.blp:173
msgid "VRR"
msgstr "VRR"
#: data/ui/pages/monitor-settings-content.blp:182
msgid "Color management"
msgstr "Управление цветом"
#: data/ui/pages/monitor-settings-content.blp:191
msgid "SDR EOTF"
msgstr "SDR EOTF"
#: data/ui/pages/monitor-settings-content.blp:200
msgid "SDR brightness"
msgstr "Яркость SDR"
#: data/ui/pages/monitor-settings-content.blp:212
msgid "SDR saturation"
msgstr "Насыщенность SDR"
#: data/ui/pages/monitor-settings-content.blp:225
msgid "HDR / EDID overrides" msgid "HDR / EDID overrides"
msgstr "Переопределения HDR / EDID" msgstr "Переопределения HDR / EDID"
#: src/plugin.vala:24 #: data/ui/pages/monitor-settings-content.blp:229
msgid "Refresh" msgid "Force wide color"
msgstr "Обновить" msgstr "Принудительно широкий цветовой охват"
#: src/plugin.vala:29 src/plugin.vala:30 src/plugin.vala:53 src/plugin.vala:54 #: data/ui/pages/monitor-settings-content.blp:238
msgid "Apply" msgid "Force HDR"
msgstr "Применить" msgstr "Принудительно HDR"
#: src/plugin.vala:41 src/plugin.vala:47 #: data/ui/pages/monitor-settings-content.blp:247
msgid "Monitor" msgid "SDR min luminance"
msgstr "Монитор" msgstr "Мин. яркость SDR"
#: data/ui/pages/monitor-settings-content.blp:259
msgid "SDR max luminance"
msgstr "Макс. яркость SDR"
#: data/ui/pages/monitor-settings-content.blp:270
msgid "Min luminance"
msgstr "Мин. яркость"
#: data/ui/pages/monitor-settings-content.blp:282
msgid "Max luminance"
msgstr "Макс. яркость"
#: data/ui/pages/monitor-settings-content.blp:293
msgid "Max average luminance"
msgstr "Макс. средняя яркость"
#: data/ui/pages/monitor-settings-content.blp:304
msgid "ICC profile"
msgstr "Профиль ICC"
#: data/ui/widgets/backdrop-color-widget.blp:7
#: data/ui/widgets/backdrop-color-widget.blp:13
msgid "Backdrop color"
msgstr "Цвет фона"
#: data/ui/widgets/config-include-widget.blp:8
#: src/backends/hyprland-backend.vala:38 src/backends/hyprland-backend.vala:53
#: src/backends/niri-backend.vala:43 src/backends/niri-backend.vala:58
msgid "Monitor configuration is not connected"
msgstr "Конфигурация мониторов не подключена"
#: data/ui/widgets/config-include-widget.blp:13
msgid "Connect"
msgstr "Подключить"
#: src/backends/gnome-backend.vala:72 src/backends/gnome-backend.vala:516 #: src/backends/gnome-backend.vala:72 src/backends/gnome-backend.vala:516
msgid "No enabled monitors to mirror" msgid "No enabled monitors to mirror"
...@@ -65,27 +187,31 @@ msgstr "Нет включённых мониторов для зеркалиро ...@@ -65,27 +187,31 @@ msgstr "Нет включённых мониторов для зеркалиро
msgid "No common mirror mode is available" msgid "No common mirror mode is available"
msgstr "Нет общего режима для зеркалирования" msgstr "Нет общего режима для зеркалирования"
#: src/backends/hyprland-backend.vala:41 #: src/backends/hyprland-backend.vala:39
msgid "Hyprland configuration file was not found." msgid "Hyprland configuration file was not found."
msgstr "Файл конфигурации Hyprland не найден." msgstr "Файл конфигурации Hyprland не найден."
#: src/backends/hyprland-backend.vala:56 #: src/backends/hyprland-backend.vala:54
msgid "Add monitors.conf to the Hyprland configuration." msgid "Add monitors.conf to the Hyprland configuration."
msgstr "Добавьте monitors.conf в конфигурацию Hyprland." msgstr "Добавьте monitors.conf в конфигурацию Hyprland."
#: src/backends/hyprland-backend.vala:80 #: src/backends/hyprland-backend.vala:75
msgid "hyprctl monitors all returned non-array JSON" msgid "hyprctl monitors all returned non-array JSON"
msgstr "hyprctl monitors all вернул JSON не в виде массива" msgstr "hyprctl monitors all вернул JSON не в виде массива"
#: src/backends/niri-backend.vala:47 #: src/backends/hyprland-backend.vala:213
msgid "Unsupported virtual output backend"
msgstr "Неподдерживаемый бэкенд виртуального монитора"
#: src/backends/niri-backend.vala:44
msgid "niri configuration file was not found." msgid "niri configuration file was not found."
msgstr "Файл конфигурации niri не найден." msgstr "Файл конфигурации niri не найден."
#: src/backends/niri-backend.vala:62 #: src/backends/niri-backend.vala:59
msgid "Add monitor.kdl to the niri configuration." msgid "Add monitor.kdl to the niri configuration."
msgstr "Добавьте monitor.kdl в конфигурацию niri." msgstr "Добавьте monitor.kdl в конфигурацию niri."
#: src/backends/niri-backend.vala:85 #: src/backends/niri-backend.vala:79
msgid "niri msg outputs returned non-object JSON" msgid "niri msg outputs returned non-object JSON"
msgstr "niri msg outputs вернул JSON не в виде объекта" msgstr "niri msg outputs вернул JSON не в виде объекта"
...@@ -93,253 +219,170 @@ msgstr "niri msg outputs вернул JSON не в виде объекта" ...@@ -93,253 +219,170 @@ msgstr "niri msg outputs вернул JSON не в виде объекта"
msgid "Built-in Display" msgid "Built-in Display"
msgstr "Встроенный дисплей" msgstr "Встроенный дисплей"
#: src/ui/displays-view.vala:72 #: src/ui/common/displays-controller.vala:39
msgid "Failed to load monitors" msgid "Failed to load monitors"
msgstr "Не удалось загрузить мониторы" msgstr "Не удалось загрузить мониторы"
#: src/ui/displays-view.vala:81 #: src/ui/common/displays-controller.vala:49
msgid "Monitor settings applied" msgid "Monitor settings applied"
msgstr "Настройки мониторов применены" msgstr "Настройки мониторов применены"
#: src/ui/displays-view.vala:165 #: src/ui/common/ui-utils.vala:236
msgid "Read-only backend" #, c-format
msgstr "Режим только для чтения" msgid "%.2f Hz"
msgstr "%.2f Гц"
#: src/ui/displays-view.vala:166
msgid "Applying monitor layouts is not supported by this backend."
msgstr "Применение раскладок мониторов не поддерживается этим бэкендом."
#: src/ui/displays-view.vala:189
msgid "Monitor configuration connected"
msgstr "Конфигурация мониторов подключена"
#: src/ui/displays-view.vala:201
msgid "Mirror Displays"
msgstr "Зеркалировать мониторы"
#: src/ui/displays-view.vala:261 src/ui/monitor-settings-content.vala:88
#: src/ui/monitor-settings-content.vala:127
msgid "Resolution"
msgstr "Разрешение"
#: src/ui/displays-view.vala:307 src/ui/monitor-settings-content.vala:265
#: src/ui/monitor-settings-content.vala:291
msgid "Scale"
msgstr "Масштаб"
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: src/ui/settings/monitor-choice-loader.vala:21
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "Normal" msgid "Normal"
msgstr "Обычный" msgstr "Обычный"
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: src/ui/settings/monitor-choice-loader.vala:22
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "90 degrees" msgid "90 degrees"
msgstr "90 градусов" msgstr "90 градусов"
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: src/ui/settings/monitor-choice-loader.vala:23
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "180 degrees" msgid "180 degrees"
msgstr "180 градусов" msgstr "180 градусов"
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: src/ui/settings/monitor-choice-loader.vala:24
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "270 degrees" msgid "270 degrees"
msgstr "270 градусов" msgstr "270 градусов"
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: src/ui/settings/monitor-choice-loader.vala:25
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped" msgid "Flipped"
msgstr "Отражённый" msgstr "Отражённый"
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: src/ui/settings/monitor-choice-loader.vala:26
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 90 degrees" msgid "Flipped 90 degrees"
msgstr "Отражённый 90 градусов" msgstr "Отражённый 90 градусов"
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: src/ui/settings/monitor-choice-loader.vala:27
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 180 degrees" msgid "Flipped 180 degrees"
msgstr "Отражённый 180 градусов" msgstr "Отражённый 180 градусов"
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: src/ui/settings/monitor-choice-loader.vala:28
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 270 degrees" msgid "Flipped 270 degrees"
msgstr "Отражённый 270 градусов" msgstr "Отражённый 270 градусов"
#: src/ui/displays-view.vala:332 src/ui/monitor-settings-content.vala:315 #: src/ui/settings/monitor-choice-loader.vala:38
msgid "Rotation" #: src/ui/settings/monitor-choice-loader.vala:44
msgstr "Поворот" #: src/ui/settings/monitor-choice-loader.vala:58
#: src/ui/settings/monitor-choice-loader.vala:63
#: src/ui/displays-view.vala:365
msgid "Primary Display"
msgstr "Основной дисплей"
#: src/ui/monitor-row.vala:62
#, c-format
msgid "%dx%d@%.2f scale %.2f %dx%d"
msgstr "%dx%d@%.2f масштаб %.2f %dx%d"
#: src/ui/monitor-settings-content.vala:156
#: src/ui/monitor-settings-content.vala:164
msgid "Refresh Rate"
msgstr "Частота обновления"
#: src/ui/monitor-settings-content.vala:186
#: src/ui/monitor-settings-content.vala:411
msgid "Variable Refresh Rate"
msgstr "Переменная частота обновления"
#: src/ui/monitor-settings-content.vala:335
msgid "None"
msgstr "Нет"
#: src/ui/monitor-settings-content.vala:350
msgid "Mirror"
msgstr "Зеркалирование"
#: src/ui/monitor-settings-content.vala:367
msgid "Use description"
msgstr "Использовать описание"
#: src/ui/monitor-settings-content.vala:378
msgid "Bit depth"
msgstr "Глубина цвета"
#: src/ui/monitor-settings-content.vala:380
msgid "VRR"
msgstr "VRR"
#: src/ui/monitor-settings-content.vala:380
#: src/ui/monitor-settings-content.vala:389
#: src/ui/monitor-settings-content.vala:390
#: src/ui/monitor-settings-content.vala:412
#: src/ui/monitor-settings-content.vala:433
msgid "Off" msgid "Off"
msgstr "Отключено" msgstr "Отключено"
#: src/ui/monitor-settings-content.vala:380 #: src/ui/settings/monitor-choice-loader.vala:39
#: src/ui/monitor-settings-content.vala:389 #: src/ui/settings/monitor-choice-loader.vala:45
#: src/ui/monitor-settings-content.vala:390 #: src/ui/settings/monitor-choice-loader.vala:59
#: src/ui/monitor-settings-content.vala:412
msgid "On" msgid "On"
msgstr "Включено" msgstr "Включено"
#: src/ui/monitor-settings-content.vala:380 #: src/ui/settings/monitor-choice-loader.vala:40
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Полный экран" msgstr "Полный экран"
#: src/ui/monitor-settings-content.vala:380 #: src/ui/settings/monitor-choice-loader.vala:41
msgid "Fullscreen video/game" msgid "Fullscreen video/game"
msgstr "Полноэкранное видео/игра" msgstr "Полноэкранное видео/игра"
#: src/ui/monitor-settings-content.vala:382 #: src/ui/settings/monitor-choice-loader.vala:46
msgid "Color management"
msgstr "Управление цветом"
#: src/ui/monitor-settings-content.vala:383
msgid "SDR EOTF"
msgstr "SDR EOTF"
#: src/ui/monitor-settings-content.vala:384
msgid "SDR brightness"
msgstr "Яркость SDR"
#: src/ui/monitor-settings-content.vala:385
msgid "SDR saturation"
msgstr "Насыщенность SDR"
#: src/ui/monitor-settings-content.vala:389
msgid "Force wide color"
msgstr "Принудительно широкий цветовой охват"
#: src/ui/monitor-settings-content.vala:389
#: src/ui/monitor-settings-content.vala:390
msgid "Auto"
msgstr "Авто"
#: src/ui/monitor-settings-content.vala:390
msgid "Force HDR"
msgstr "Принудительно HDR"
#: src/ui/monitor-settings-content.vala:391
msgid "SDR min luminance"
msgstr "Мин. яркость SDR"
#: src/ui/monitor-settings-content.vala:392
msgid "SDR max luminance"
msgstr "Макс. яркость SDR"
#: src/ui/monitor-settings-content.vala:393
msgid "Min luminance"
msgstr "Мин. яркость"
#: src/ui/monitor-settings-content.vala:394
msgid "Max luminance"
msgstr "Макс. яркость"
#: src/ui/monitor-settings-content.vala:395
msgid "Max average luminance"
msgstr "Макс. средняя яркость"
#: src/ui/monitor-settings-content.vala:398
msgid "ICC profile"
msgstr "Профиль ICC"
#: src/ui/monitor-settings-content.vala:412
msgid "On demand" msgid "On demand"
msgstr "По требованию" msgstr "По требованию"
#: src/ui/monitor-settings-content.vala:418 #: src/ui/settings/monitor-choice-loader.vala:57
msgid "Focus at startup" msgid "Auto"
msgstr "Фокус при запуске" msgstr "Авто"
#: src/ui/monitor-settings-content.vala:432
msgid "Hot corners"
msgstr "Активные углы"
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:62
msgid "Default" msgid "Default"
msgstr "По умолчанию" msgstr "По умолчанию"
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:64
msgid "All" msgid "All"
msgstr "Все" msgstr "Все"
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:65
msgid "Top left" msgid "Top left"
msgstr "Сверху слева" msgstr "Сверху слева"
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:66
msgid "Top right" msgid "Top right"
msgstr "Сверху справа" msgstr "Сверху справа"
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:67
msgid "Bottom left" msgid "Bottom left"
msgstr "Снизу слева" msgstr "Снизу слева"
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:68
msgid "Bottom right" msgid "Bottom right"
msgstr "Снизу справа" msgstr "Снизу справа"
#: src/ui/monitor-settings-content.vala:442 #: src/ui/settings/monitor-choice-loader.vala:117
#: src/ui/monitor-settings-content.vala:456 msgid "None"
msgid "Backdrop color" msgstr "Нет"
msgstr "Цвет фона"
#: src/ui/monitor-settings-content.vala:486 #: src/ui/widgets/config-include-widget.vala:63
msgid "Adjust for TV" msgid "Monitor configuration connected"
msgstr "Отрегулировать для ТВ" msgstr "Конфигурация мониторов подключена"
#: src/ui/monitor-settings-content.vala:498 #: src/ui/widgets/monitor-row.vala:35
msgid "HDR" msgid "Remove"
msgstr "HDR" msgstr "Удалить"
#: src/ui/monitor-settings-content.vala:679 #: src/ui/widgets/monitor-row.vala:81
#, c-format #, c-format
msgid "Variable (up to %.2f Hz)" msgid "%dx%d@%.2f scale %.2f %dx%d"
msgstr "Переменная (до %.2f Гц)" msgstr "%dx%d@%.2f масштаб %.2f %dx%d"
#: src/ui/widgets/primary-display-widget.vala:37
msgid "Primary Display"
msgstr "Основной дисплей"
#: src/ui/widgets/status-widget.vala:27
msgid "Read-only backend"
msgstr "Режим только для чтения"
#: src/ui/widgets/status-widget.vala:28
msgid "Applying monitor layouts is not supported by this backend."
msgstr "Применение раскладок мониторов не поддерживается этим бэкендом."
#: src/ui/widgets/virtual-outputs-widget.vala:35
msgid "No Virtual Displays"
msgstr "Виртуальных мониторов нет"
#: src/ui/widgets/virtual-outputs-widget.vala:36
msgid "Use the add button to create one."
msgstr "Используйте кнопку добавления, чтобы создать виртуальный монитор."
#: src/ui/monitor-settings-content.vala:680 #~ msgid "Details"
msgid "Variable" #~ msgstr "Параметры"
msgstr "Переменная"
#~ msgid "Create a temporary Hyprland output."
#~ msgstr "Создать временный выход Hyprland."
#~ msgid "Add"
#~ msgstr "Добавить"
#~ msgid "Backend"
#~ msgstr "Бэкенд"
#~ msgid "Virtual display"
#~ msgstr "Виртуальный монитор"
#: src/ui/monitor-settings-content.vala:683 src/ui/ui-helpers.vala:35
#, c-format #, c-format
msgid "%.2f Hz" #~ msgid "Variable (up to %.2f Hz)"
msgstr "%.2f Гц" #~ msgstr "Переменная (до %.2f Гц)"
#~ msgid "Variable"
#~ msgstr "Переменная"
#~ msgid "Underscanning" #~ msgid "Underscanning"
#~ msgstr "Уменьшение области вывода" #~ msgstr "Уменьшение области вывода"
......
...@@ -8,7 +8,7 @@ msgid "" ...@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: tuner-displays\n" "Project-Id-Version: tuner-displays\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-15 11:58+0300\n" "POT-Creation-Date: 2026-06-15 19:13+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
...@@ -17,332 +17,353 @@ msgstr "" ...@@ -17,332 +17,353 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: data/ui/displays-view.blp:7 src/plugin.vala:15 #: data/ui/pages/displays-page.blp:7 data/ui/pages/displays-page.blp:59
msgid "Displays" msgid "Displays"
msgstr "" msgstr ""
#: data/ui/displays-view.blp:13 src/backends/hyprland-backend.vala:40 #: data/ui/pages/displays-page.blp:32
#: src/backends/hyprland-backend.vala:55 src/backends/niri-backend.vala:46 msgid "Mirror Displays"
#: src/backends/niri-backend.vala:61
msgid "Monitor configuration is not connected"
msgstr "" msgstr ""
#: data/ui/displays-view.blp:18 #: data/ui/pages/displays-page.blp:73
msgid "Connect" msgid "Virtual Displays"
msgstr "" msgstr ""
#: data/ui/displays-view.blp:28 #: data/ui/pages/displays-page.blp:79
msgid "Details" msgid "Add Virtual Display"
msgstr "" msgstr ""
#: data/ui/monitor-settings-content.blp:8 #: data/ui/pages/displays-page.blp:108
msgid "Display" msgid "Refresh"
msgstr "" msgstr ""
#: data/ui/monitor-settings-content.blp:11 #: data/ui/pages/displays-page.blp:112 data/ui/pages/displays-page.blp:113
msgid "Enabled" #: data/ui/pages/displays-page.blp:133 data/ui/pages/displays-page.blp:134
msgid "Apply"
msgstr "" msgstr ""
#: data/ui/monitor-settings-content.blp:16 #: data/ui/pages/displays-page.blp:118 data/ui/pages/displays-page.blp:128
msgid "Hyprland" #: data/ui/pages/monitor-settings-content.blp:7
msgid "Monitor"
msgstr "" msgstr ""
#: data/ui/monitor-settings-content.blp:20 #: data/ui/pages/monitor-settings-content.blp:11
msgid "HDR / EDID overrides" msgid "Display"
msgstr "" msgstr ""
#: src/plugin.vala:24 #: data/ui/pages/monitor-settings-content.blp:15
msgid "Refresh" msgid "Enabled"
msgstr "" msgstr ""
#: src/plugin.vala:29 src/plugin.vala:30 src/plugin.vala:53 src/plugin.vala:54 #: data/ui/pages/monitor-settings-content.blp:23
msgid "Apply" #: data/ui/pages/monitor-settings-content.blp:32
#: src/ui/widgets/mirror-settings-widget.vala:45
msgid "Resolution"
msgstr "" msgstr ""
#: src/plugin.vala:41 src/plugin.vala:47 #: data/ui/pages/monitor-settings-content.blp:41
msgid "Monitor" #: data/ui/pages/monitor-settings-content.blp:48
msgid "Refresh Rate"
msgstr "" msgstr ""
#: src/backends/gnome-backend.vala:72 src/backends/gnome-backend.vala:516 #: data/ui/pages/monitor-settings-content.blp:57
msgid "No enabled monitors to mirror" #: data/ui/pages/monitor-settings-content.blp:102
msgid "Variable Refresh Rate"
msgstr "" msgstr ""
#: src/backends/gnome-backend.vala:520 src/backends/gnome-backend.vala:532 #: data/ui/pages/monitor-settings-content.blp:66
msgid "No common mirror mode is available" #: data/ui/pages/monitor-settings-content.blp:75
#: src/ui/widgets/mirror-settings-widget.vala:76
msgid "Scale"
msgstr "" msgstr ""
#: src/backends/hyprland-backend.vala:41 #: data/ui/pages/monitor-settings-content.blp:87
msgid "Hyprland configuration file was not found." #: src/ui/widgets/mirror-settings-widget.vala:98
msgid "Rotation"
msgstr "" msgstr ""
#: src/backends/hyprland-backend.vala:56 #: data/ui/pages/monitor-settings-content.blp:93
msgid "Add monitors.conf to the Hyprland configuration." msgid "Mirror"
msgstr "" msgstr ""
#: src/backends/hyprland-backend.vala:80 #: data/ui/pages/monitor-settings-content.blp:111
msgid "hyprctl monitors all returned non-array JSON" msgid "Focus at startup"
msgstr "" msgstr ""
#: src/backends/niri-backend.vala:47 #: data/ui/pages/monitor-settings-content.blp:126
msgid "niri configuration file was not found." msgid "Hot corners"
msgstr "" msgstr ""
#: src/backends/niri-backend.vala:62 #: data/ui/pages/monitor-settings-content.blp:135
msgid "Add monitor.kdl to the niri configuration." msgid "Adjust for TV"
msgstr "" msgstr ""
#: src/backends/niri-backend.vala:85 #: data/ui/pages/monitor-settings-content.blp:143
msgid "niri msg outputs returned non-object JSON" msgid "HDR"
msgstr "" msgstr ""
#: src/core/display-model.vala:75 #: data/ui/pages/monitor-settings-content.blp:152
msgid "Built-in Display" msgid "Hyprland"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:72 #: data/ui/pages/monitor-settings-content.blp:156
msgid "Failed to load monitors" msgid "Use description"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:81 #: data/ui/pages/monitor-settings-content.blp:164
msgid "Monitor settings applied" msgid "Bit depth"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:165 #: data/ui/pages/monitor-settings-content.blp:173
msgid "Read-only backend" msgid "VRR"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:166 #: data/ui/pages/monitor-settings-content.blp:182
msgid "Applying monitor layouts is not supported by this backend." msgid "Color management"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:189 #: data/ui/pages/monitor-settings-content.blp:191
msgid "Monitor configuration connected" msgid "SDR EOTF"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:201 #: data/ui/pages/monitor-settings-content.blp:200
msgid "Mirror Displays" msgid "SDR brightness"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:261 src/ui/monitor-settings-content.vala:88 #: data/ui/pages/monitor-settings-content.blp:212
#: src/ui/monitor-settings-content.vala:127 msgid "SDR saturation"
msgid "Resolution"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:307 src/ui/monitor-settings-content.vala:265 #: data/ui/pages/monitor-settings-content.blp:225
#: src/ui/monitor-settings-content.vala:291 msgid "HDR / EDID overrides"
msgid "Scale"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: data/ui/pages/monitor-settings-content.blp:229
msgid "Normal" msgid "Force wide color"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: data/ui/pages/monitor-settings-content.blp:238
msgid "90 degrees" msgid "Force HDR"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: data/ui/pages/monitor-settings-content.blp:247
msgid "180 degrees" msgid "SDR min luminance"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308 #: data/ui/pages/monitor-settings-content.blp:259
msgid "270 degrees" msgid "SDR max luminance"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: data/ui/pages/monitor-settings-content.blp:270
msgid "Flipped" msgid "Min luminance"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: data/ui/pages/monitor-settings-content.blp:282
msgid "Flipped 90 degrees" msgid "Max luminance"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: data/ui/pages/monitor-settings-content.blp:293
msgid "Flipped 180 degrees" msgid "Max average luminance"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309 #: data/ui/pages/monitor-settings-content.blp:304
msgid "Flipped 270 degrees" msgid "ICC profile"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:332 src/ui/monitor-settings-content.vala:315 #: data/ui/widgets/backdrop-color-widget.blp:7
msgid "Rotation" #: data/ui/widgets/backdrop-color-widget.blp:13
msgid "Backdrop color"
msgstr "" msgstr ""
#: src/ui/displays-view.vala:365 #: data/ui/widgets/config-include-widget.blp:8
msgid "Primary Display" #: src/backends/hyprland-backend.vala:38 src/backends/hyprland-backend.vala:53
#: src/backends/niri-backend.vala:43 src/backends/niri-backend.vala:58
msgid "Monitor configuration is not connected"
msgstr "" msgstr ""
#: src/ui/monitor-row.vala:62 #: data/ui/widgets/config-include-widget.blp:13
#, c-format msgid "Connect"
msgid "%dx%d@%.2f scale %.2f %dx%d"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:156 #: src/backends/gnome-backend.vala:72 src/backends/gnome-backend.vala:516
#: src/ui/monitor-settings-content.vala:164 msgid "No enabled monitors to mirror"
msgid "Refresh Rate"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:186 #: src/backends/gnome-backend.vala:520 src/backends/gnome-backend.vala:532
#: src/ui/monitor-settings-content.vala:411 msgid "No common mirror mode is available"
msgid "Variable Refresh Rate"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:335 #: src/backends/hyprland-backend.vala:39
msgid "None" msgid "Hyprland configuration file was not found."
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:350 #: src/backends/hyprland-backend.vala:54
msgid "Mirror" msgid "Add monitors.conf to the Hyprland configuration."
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:367 #: src/backends/hyprland-backend.vala:75
msgid "Use description" msgid "hyprctl monitors all returned non-array JSON"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:378 #: src/backends/hyprland-backend.vala:213
msgid "Bit depth" msgid "Unsupported virtual output backend"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:380 #: src/backends/niri-backend.vala:44
msgid "VRR" msgid "niri configuration file was not found."
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:380 #: src/backends/niri-backend.vala:59
#: src/ui/monitor-settings-content.vala:389 msgid "Add monitor.kdl to the niri configuration."
#: src/ui/monitor-settings-content.vala:390
#: src/ui/monitor-settings-content.vala:412
#: src/ui/monitor-settings-content.vala:433
msgid "Off"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:380 #: src/backends/niri-backend.vala:79
#: src/ui/monitor-settings-content.vala:389 msgid "niri msg outputs returned non-object JSON"
#: src/ui/monitor-settings-content.vala:390
#: src/ui/monitor-settings-content.vala:412
msgid "On"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:380 #: src/core/display-model.vala:75
msgid "Fullscreen" msgid "Built-in Display"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:380 #: src/ui/common/displays-controller.vala:39
msgid "Fullscreen video/game" msgid "Failed to load monitors"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:382 #: src/ui/common/displays-controller.vala:49
msgid "Color management" msgid "Monitor settings applied"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:383 #: src/ui/common/ui-utils.vala:236
msgid "SDR EOTF" #, c-format
msgid "%.2f Hz"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:384 #: src/ui/settings/monitor-choice-loader.vala:21
msgid "SDR brightness" #: src/ui/widgets/mirror-settings-widget.vala:91
msgid "Normal"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:385 #: src/ui/settings/monitor-choice-loader.vala:22
msgid "SDR saturation" #: src/ui/widgets/mirror-settings-widget.vala:91
msgid "90 degrees"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:389 #: src/ui/settings/monitor-choice-loader.vala:23
msgid "Force wide color" #: src/ui/widgets/mirror-settings-widget.vala:91
msgid "180 degrees"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:389 #: src/ui/settings/monitor-choice-loader.vala:24
#: src/ui/monitor-settings-content.vala:390 #: src/ui/widgets/mirror-settings-widget.vala:91
msgid "Auto" msgid "270 degrees"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:390 #: src/ui/settings/monitor-choice-loader.vala:25
msgid "Force HDR" #: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:391 #: src/ui/settings/monitor-choice-loader.vala:26
msgid "SDR min luminance" #: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 90 degrees"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:392 #: src/ui/settings/monitor-choice-loader.vala:27
msgid "SDR max luminance" #: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 180 degrees"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:393 #: src/ui/settings/monitor-choice-loader.vala:28
msgid "Min luminance" #: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 270 degrees"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:394 #: src/ui/settings/monitor-choice-loader.vala:38
msgid "Max luminance" #: src/ui/settings/monitor-choice-loader.vala:44
#: src/ui/settings/monitor-choice-loader.vala:58
#: src/ui/settings/monitor-choice-loader.vala:63
msgid "Off"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:395 #: src/ui/settings/monitor-choice-loader.vala:39
msgid "Max average luminance" #: src/ui/settings/monitor-choice-loader.vala:45
#: src/ui/settings/monitor-choice-loader.vala:59
msgid "On"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:398 #: src/ui/settings/monitor-choice-loader.vala:40
msgid "ICC profile" msgid "Fullscreen"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:412 #: src/ui/settings/monitor-choice-loader.vala:41
msgid "On demand" msgid "Fullscreen video/game"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:418 #: src/ui/settings/monitor-choice-loader.vala:46
msgid "Focus at startup" msgid "On demand"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:432 #: src/ui/settings/monitor-choice-loader.vala:57
msgid "Hot corners" msgid "Auto"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:62
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:64
msgid "All" msgid "All"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:65
msgid "Top left" msgid "Top left"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:66
msgid "Top right" msgid "Top right"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:67
msgid "Bottom left" msgid "Bottom left"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:433 #: src/ui/settings/monitor-choice-loader.vala:68
msgid "Bottom right" msgid "Bottom right"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:442 #: src/ui/settings/monitor-choice-loader.vala:117
#: src/ui/monitor-settings-content.vala:456 msgid "None"
msgid "Backdrop color"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:486 #: src/ui/widgets/config-include-widget.vala:63
msgid "Adjust for TV" msgid "Monitor configuration connected"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:498 #: src/ui/widgets/monitor-row.vala:35
msgid "HDR" msgid "Remove"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:679 #: src/ui/widgets/monitor-row.vala:81
#, c-format #, c-format
msgid "Variable (up to %.2f Hz)" msgid "%dx%d@%.2f scale %.2f %dx%d"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:680 #: src/ui/widgets/primary-display-widget.vala:37
msgid "Variable" msgid "Primary Display"
msgstr "" msgstr ""
#: src/ui/monitor-settings-content.vala:683 src/ui/ui-helpers.vala:35 #: src/ui/widgets/status-widget.vala:27
#, c-format msgid "Read-only backend"
msgid "%.2f Hz" msgstr ""
#: src/ui/widgets/status-widget.vala:28
msgid "Applying monitor layouts is not supported by this backend."
msgstr ""
#: src/ui/widgets/virtual-outputs-widget.vala:35
msgid "No Virtual Displays"
msgstr ""
#: src/ui/widgets/virtual-outputs-widget.vala:36
msgid "Use the add button to create one."
msgstr "" msgstr ""
...@@ -45,6 +45,7 @@ namespace TunerDisplays { ...@@ -45,6 +45,7 @@ namespace TunerDisplays {
public virtual bool supports_hot_corners { get { return false; } } public virtual bool supports_hot_corners { get { return false; } }
public virtual bool supports_underscanning { get { return false; } } public virtual bool supports_underscanning { get { return false; } }
public virtual bool supports_hdr_toggle { get { return false; } } public virtual bool supports_hdr_toggle { get { return false; } }
public virtual bool supports_virtual_outputs { get { return false; } }
public abstract Gee.ArrayList<MonitorConfig> load() throws Error; public abstract Gee.ArrayList<MonitorConfig> load() throws Error;
public abstract void apply(Gee.ArrayList<MonitorConfig> monitors) throws Error; public abstract void apply(Gee.ArrayList<MonitorConfig> monitors) throws Error;
...@@ -57,6 +58,18 @@ namespace TunerDisplays { ...@@ -57,6 +58,18 @@ namespace TunerDisplays {
throw new BackendError.UNSUPPORTED("Including monitor config is not supported by this backend"); throw new BackendError.UNSUPPORTED("Including monitor config is not supported by this backend");
} }
public virtual void create_virtual_output(string backend) throws Error {
throw new BackendError.UNSUPPORTED("Virtual outputs are not supported by this backend");
}
public virtual void remove_virtual_output(string name) throws Error {
throw new BackendError.UNSUPPORTED("Virtual outputs are not supported by this backend");
}
public virtual bool is_virtual_output(MonitorConfig monitor) {
return false;
}
protected static Json.Node backend_parse_json(string text) throws Error { protected static Json.Node backend_parse_json(string text) throws Error {
var parser = new Json.Parser(); var parser = new Json.Parser();
parser.load_from_data(text); parser.load_from_data(text);
......
...@@ -28,6 +28,7 @@ namespace TunerDisplays { ...@@ -28,6 +28,7 @@ namespace TunerDisplays {
public override bool supports_vrr_modes { get { return true; } } public override bool supports_vrr_modes { get { return true; } }
public override bool supports_color_management { get { return true; } } public override bool supports_color_management { get { return true; } }
public override bool supports_hdr_metadata { get { return true; } } public override bool supports_hdr_metadata { get { return true; } }
public override bool supports_virtual_outputs { get { return true; } }
public override ConfigIncludeInfo config_include_info() { public override ConfigIncludeInfo config_include_info() {
var main_path = main_config_path(); var main_path = main_config_path();
...@@ -207,6 +208,23 @@ namespace TunerDisplays { ...@@ -207,6 +208,23 @@ namespace TunerDisplays {
} }
} }
public override void create_virtual_output(string backend) throws Error {
if (!valid_virtual_backend(backend))
throw new BackendError.APPLY_FAILED(_("Unsupported virtual output backend"));
ShellCommand.run("hyprctl output create %s".printf(backend));
}
public override void remove_virtual_output(string name) throws Error {
ShellCommand.run("hyprctl output remove %s".printf(ShellCommand.quote(name)));
}
public override bool is_virtual_output(MonitorConfig monitor) {
return monitor.name.has_prefix("HEADLESS-")
|| monitor.name.has_prefix("WAYLAND-")
|| monitor.name.has_prefix("X11-");
}
private static Gee.HashSet<string> read_active_names() throws Error { private static Gee.HashSet<string> read_active_names() throws Error {
var names = new Gee.HashSet<string>(); var names = new Gee.HashSet<string>();
var root = backend_parse_json(ShellCommand.run("hyprctl -j monitors")); var root = backend_parse_json(ShellCommand.run("hyprctl -j monitors"));
...@@ -410,6 +428,13 @@ namespace TunerDisplays { ...@@ -410,6 +428,13 @@ namespace TunerDisplays {
return format == "XRGB2101010" || format == "XBGR2101010"; return format == "XRGB2101010" || format == "XBGR2101010";
} }
private static bool valid_virtual_backend(string backend) {
return backend == "auto"
|| backend == "headless"
|| backend == "wayland"
|| backend == "x11";
}
private static string output_identifier(MonitorConfig monitor) { private static string output_identifier(MonitorConfig monitor) {
if (!monitor.use_description) if (!monitor.use_description)
return monitor.name; return monitor.name;
......
...@@ -25,6 +25,7 @@ sources = files( ...@@ -25,6 +25,7 @@ sources = files(
'ui/widgets/primary-display-widget.vala', 'ui/widgets/primary-display-widget.vala',
'ui/widgets/single-monitor-widget.vala', 'ui/widgets/single-monitor-widget.vala',
'ui/widgets/status-widget.vala', 'ui/widgets/status-widget.vala',
'ui/widgets/virtual-outputs-widget.vala',
'ui/pages/monitor-settings-content.vala', 'ui/pages/monitor-settings-content.vala',
'ui/settings/monitor-choice-loader.vala', 'ui/settings/monitor-choice-loader.vala',
'ui/settings/monitor-setting-binding.vala', 'ui/settings/monitor-setting-binding.vala',
......
...@@ -25,6 +25,7 @@ namespace TunerDisplays { ...@@ -25,6 +25,7 @@ namespace TunerDisplays {
typeof(PrimaryDisplayWidget).ensure(); typeof(PrimaryDisplayWidget).ensure();
typeof(MonitorListWidget).ensure(); typeof(MonitorListWidget).ensure();
typeof(SingleMonitorWidget).ensure(); typeof(SingleMonitorWidget).ensure();
typeof(VirtualOutputsWidget).ensure();
typeof(MonitorSettingBinding).ensure(); typeof(MonitorSettingBinding).ensure();
typeof(MonitorSettingValidator).ensure(); typeof(MonitorSettingValidator).ensure();
typeof(MonitorChoiceLoader).ensure(); typeof(MonitorChoiceLoader).ensure();
...@@ -43,6 +44,16 @@ namespace TunerDisplays { ...@@ -43,6 +44,16 @@ namespace TunerDisplays {
apply.clicked.connect(DisplaysContext.controller.apply_changes); apply.clicked.connect(DisplaysContext.controller.apply_changes);
page.pack_end(apply); page.pack_end(apply);
var add_virtual_output = builder.get_object("add_virtual_output_button") as Gtk.Button;
add_virtual_output.clicked.connect(() => {
try {
DisplaysContext.controller.backend.create_virtual_output("auto");
DisplaysContext.controller.reload();
} catch (Error err) {
Tuner.toast(err.message);
}
});
monitor_page = builder.get_object("monitor_settings_page") as Tuner.Page; monitor_page = builder.get_object("monitor_settings_page") as Tuner.Page;
monitor_page_content = builder.get_object("monitor_page_content") as Gtk.Box; monitor_page_content = builder.get_object("monitor_page_content") as Gtk.Box;
monitor_page_title = builder.get_object("monitor_page_title") as Gtk.Label; monitor_page_title = builder.get_object("monitor_page_title") as Gtk.Label;
......
...@@ -81,6 +81,8 @@ namespace TunerDisplays { ...@@ -81,6 +81,8 @@ namespace TunerDisplays {
return !controller.mirror_enabled() && !controller.single_monitor_mode(); return !controller.mirror_enabled() && !controller.single_monitor_mode();
case "single-monitor": case "single-monitor":
return controller.single_monitor_mode(); return controller.single_monitor_mode();
case "virtual-outputs":
return controller.backend.supports_virtual_outputs;
default: default:
return true; return true;
} }
......
...@@ -19,11 +19,15 @@ namespace TunerDisplays { ...@@ -19,11 +19,15 @@ namespace TunerDisplays {
} }
foreach (var monitor in controller.monitors) { foreach (var monitor in controller.monitors) {
if (controller.backend.is_virtual_output(monitor))
continue;
var row = new MonitorRow(monitor, monitor_settings_page_id(), controller.monitors, controller.backend); var row = new MonitorRow(monitor, monitor_settings_page_id(), controller.monitors, controller.backend);
row.monitor_selected.connect(controller.open_monitor_settings); row.monitor_selected.connect(controller.open_monitor_settings);
row.monitor_changed.connect(controller.refresh_from_monitors); row.monitor_changed.connect(controller.refresh_from_monitors);
list.append(row); list.append(row);
} }
list.visible = list_has_children(list); list.visible = list_has_children(list);
} }
} }
......
...@@ -30,6 +30,25 @@ namespace TunerDisplays { ...@@ -30,6 +30,25 @@ namespace TunerDisplays {
activate_action("navigation.push", "s", page_id); activate_action("navigation.push", "s", page_id);
}); });
if (backend.is_virtual_output(monitor)) {
var remove_button = new Gtk.Button.from_icon_name("user-trash-symbolic") {
tooltip_text = _("Remove"),
valign = Gtk.Align.CENTER
};
remove_button.has_frame = false;
remove_button.add_css_class("flat");
remove_button.add_css_class("destructive-action");
remove_button.clicked.connect(() => {
try {
backend.remove_virtual_output(monitor.name);
DisplaysContext.controller.reload();
} catch (Error err) {
Tuner.toast(err.message);
}
});
add_suffix(remove_button);
}
enabled_switch = new Gtk.Switch() { enabled_switch = new Gtk.Switch() {
valign = Gtk.Align.CENTER, valign = Gtk.Align.CENTER,
active = monitor.enabled, active = monitor.enabled,
......
namespace TunerDisplays {
public class VirtualOutputsWidget : Tuner.Widget {
private Gtk.ListBox list;
public override Gtk.Widget? create() {
var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
list = create_boxed_list();
box.append(list);
DisplaysContext.controller.changed.connect(rebuild);
rebuild();
if (binding != null && binding.validator != null)
binding.validator.apply(binding, box);
return box;
}
private void rebuild() {
clear_list(list);
var controller = DisplaysContext.controller;
var has_virtual_outputs = false;
foreach (var monitor in controller.monitors) {
if (controller.backend.is_virtual_output(monitor)) {
var row = new MonitorRow(monitor, monitor_settings_page_id(), controller.monitors, controller.backend);
row.monitor_selected.connect(controller.open_monitor_settings);
row.monitor_changed.connect(controller.refresh_from_monitors);
list.append(row);
has_virtual_outputs = true;
}
}
if (!has_virtual_outputs) {
list.append(new Adw.ActionRow() {
title = _("No Virtual Displays"),
subtitle = _("Use the add button to create one.")
});
}
list.visible = true;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment