hyprland: add virtual output controls

parent ba26fb3d
......@@ -56,7 +56,7 @@ Tuner.Page displays_page {
}
Tuner.Group {
title: _("Details");
title: _("Displays");
id: "monitors";
$TunerDisplaysPrimaryDisplayWidget primary_display_widget {}
......@@ -70,6 +70,28 @@ Tuner.Page displays_page {
}
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";
$TunerDisplaysSingleMonitorWidget single_monitor_widget {
......
......@@ -17,3 +17,4 @@ src/ui/widgets/mirror-settings-widget.vala
src/ui/widgets/monitor-row.vala
src/ui/widgets/primary-display-widget.vala
src/ui/widgets/status-widget.vala
src/ui/widgets/virtual-outputs-widget.vala
......@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: tuner-displays\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"
"Last-Translator: Automatically generated\n"
"Language-Team: Russian\n"
......@@ -11,51 +11,173 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\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"
msgstr "Мониторы"
#: data/ui/displays-view.blp:13 src/backends/hyprland-backend.vala:40
#: src/backends/hyprland-backend.vala:55 src/backends/niri-backend.vala:46
#: src/backends/niri-backend.vala:61
msgid "Monitor configuration is not connected"
msgstr "Конфигурация мониторов не подключена"
#: data/ui/pages/displays-page.blp:32
msgid "Mirror Displays"
msgstr "Зеркалировать мониторы"
#: data/ui/displays-view.blp:18
msgid "Connect"
msgstr "Подключить"
#: data/ui/pages/displays-page.blp:73
msgid "Virtual Displays"
msgstr "Виртуальные мониторы"
#: data/ui/displays-view.blp:28
msgid "Details"
msgstr "Параметры"
#: data/ui/pages/displays-page.blp:79
msgid "Add Virtual Display"
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"
msgstr "Дисплей"
#: data/ui/monitor-settings-content.blp:11
#: data/ui/pages/monitor-settings-content.blp:15
msgid "Enabled"
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"
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"
msgstr "Переопределения HDR / EDID"
#: src/plugin.vala:24
msgid "Refresh"
msgstr "Обновить"
#: data/ui/pages/monitor-settings-content.blp:229
msgid "Force wide color"
msgstr "Принудительно широкий цветовой охват"
#: src/plugin.vala:29 src/plugin.vala:30 src/plugin.vala:53 src/plugin.vala:54
msgid "Apply"
msgstr "Применить"
#: data/ui/pages/monitor-settings-content.blp:238
msgid "Force HDR"
msgstr "Принудительно HDR"
#: src/plugin.vala:41 src/plugin.vala:47
msgid "Monitor"
msgstr "Монитор"
#: data/ui/pages/monitor-settings-content.blp:247
msgid "SDR min luminance"
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
msgid "No enabled monitors to mirror"
......@@ -65,27 +187,31 @@ msgstr "Нет включённых мониторов для зеркалиро
msgid "No common mirror mode is available"
msgstr "Нет общего режима для зеркалирования"
#: src/backends/hyprland-backend.vala:41
#: src/backends/hyprland-backend.vala:39
msgid "Hyprland configuration file was not found."
msgstr "Файл конфигурации Hyprland не найден."
#: src/backends/hyprland-backend.vala:56
#: src/backends/hyprland-backend.vala:54
msgid "Add monitors.conf to the Hyprland configuration."
msgstr "Добавьте monitors.conf в конфигурацию Hyprland."
#: src/backends/hyprland-backend.vala:80
#: src/backends/hyprland-backend.vala:75
msgid "hyprctl monitors all returned non-array 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."
msgstr "Файл конфигурации niri не найден."
#: src/backends/niri-backend.vala:62
#: src/backends/niri-backend.vala:59
msgid "Add monitor.kdl to the niri configuration."
msgstr "Добавьте monitor.kdl в конфигурацию niri."
#: src/backends/niri-backend.vala:85
#: src/backends/niri-backend.vala:79
msgid "niri msg outputs returned non-object JSON"
msgstr "niri msg outputs вернул JSON не в виде объекта"
......@@ -93,253 +219,170 @@ msgstr "niri msg outputs вернул JSON не в виде объекта"
msgid "Built-in Display"
msgstr "Встроенный дисплей"
#: src/ui/displays-view.vala:72
#: src/ui/common/displays-controller.vala:39
msgid "Failed to load monitors"
msgstr "Не удалось загрузить мониторы"
#: src/ui/displays-view.vala:81
#: src/ui/common/displays-controller.vala:49
msgid "Monitor settings applied"
msgstr "Настройки мониторов применены"
#: src/ui/displays-view.vala:165
msgid "Read-only backend"
msgstr "Режим только для чтения"
#: 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/common/ui-utils.vala:236
#, c-format
msgid "%.2f Hz"
msgstr "%.2f Гц"
#: 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"
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"
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"
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"
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"
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"
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"
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"
msgstr "Отражённый 270 градусов"
#: src/ui/displays-view.vala:332 src/ui/monitor-settings-content.vala:315
msgid "Rotation"
msgstr "Поворот"
#: 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
#: src/ui/settings/monitor-choice-loader.vala:38
#: 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 "Отключено"
#: 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/settings/monitor-choice-loader.vala:39
#: src/ui/settings/monitor-choice-loader.vala:45
#: src/ui/settings/monitor-choice-loader.vala:59
msgid "On"
msgstr "Включено"
#: src/ui/monitor-settings-content.vala:380
#: src/ui/settings/monitor-choice-loader.vala:40
msgid "Fullscreen"
msgstr "Полный экран"
#: src/ui/monitor-settings-content.vala:380
#: src/ui/settings/monitor-choice-loader.vala:41
msgid "Fullscreen video/game"
msgstr "Полноэкранное видео/игра"
#: src/ui/monitor-settings-content.vala:382
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
#: src/ui/settings/monitor-choice-loader.vala:46
msgid "On demand"
msgstr "По требованию"
#: src/ui/monitor-settings-content.vala:418
msgid "Focus at startup"
msgstr "Фокус при запуске"
#: src/ui/monitor-settings-content.vala:432
msgid "Hot corners"
msgstr "Активные углы"
#: src/ui/settings/monitor-choice-loader.vala:57
msgid "Auto"
msgstr "Авто"
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:62
msgid "Default"
msgstr "По умолчанию"
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:64
msgid "All"
msgstr "Все"
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:65
msgid "Top left"
msgstr "Сверху слева"
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:66
msgid "Top right"
msgstr "Сверху справа"
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:67
msgid "Bottom left"
msgstr "Снизу слева"
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:68
msgid "Bottom right"
msgstr "Снизу справа"
#: src/ui/monitor-settings-content.vala:442
#: src/ui/monitor-settings-content.vala:456
msgid "Backdrop color"
msgstr "Цвет фона"
#: src/ui/settings/monitor-choice-loader.vala:117
msgid "None"
msgstr "Нет"
#: src/ui/monitor-settings-content.vala:486
msgid "Adjust for TV"
msgstr "Отрегулировать для ТВ"
#: src/ui/widgets/config-include-widget.vala:63
msgid "Monitor configuration connected"
msgstr "Конфигурация мониторов подключена"
#: src/ui/monitor-settings-content.vala:498
msgid "HDR"
msgstr "HDR"
#: src/ui/widgets/monitor-row.vala:35
msgid "Remove"
msgstr "Удалить"
#: src/ui/monitor-settings-content.vala:679
#: src/ui/widgets/monitor-row.vala:81
#, c-format
msgid "Variable (up to %.2f Hz)"
msgstr "Переменная (до %.2f Гц)"
msgid "%dx%d@%.2f scale %.2f %dx%d"
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 "Variable"
msgstr "Переменная"
#~ msgid "Details"
#~ 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
msgid "%.2f Hz"
msgstr "%.2f Гц"
#~ msgid "Variable (up to %.2f Hz)"
#~ msgstr "Переменная (до %.2f Гц)"
#~ msgid "Variable"
#~ msgstr "Переменная"
#~ msgid "Underscanning"
#~ msgstr "Уменьшение области вывода"
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: tuner-displays\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -17,332 +17,353 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\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"
msgstr ""
#: data/ui/displays-view.blp:13 src/backends/hyprland-backend.vala:40
#: src/backends/hyprland-backend.vala:55 src/backends/niri-backend.vala:46
#: src/backends/niri-backend.vala:61
msgid "Monitor configuration is not connected"
#: data/ui/pages/displays-page.blp:32
msgid "Mirror Displays"
msgstr ""
#: data/ui/displays-view.blp:18
msgid "Connect"
#: data/ui/pages/displays-page.blp:73
msgid "Virtual Displays"
msgstr ""
#: data/ui/displays-view.blp:28
msgid "Details"
#: data/ui/pages/displays-page.blp:79
msgid "Add Virtual Display"
msgstr ""
#: data/ui/monitor-settings-content.blp:8
msgid "Display"
#: data/ui/pages/displays-page.blp:108
msgid "Refresh"
msgstr ""
#: data/ui/monitor-settings-content.blp:11
msgid "Enabled"
#: 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/monitor-settings-content.blp:16
msgid "Hyprland"
#: 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:20
msgid "HDR / EDID overrides"
#: data/ui/pages/monitor-settings-content.blp:11
msgid "Display"
msgstr ""
#: src/plugin.vala:24
msgid "Refresh"
#: data/ui/pages/monitor-settings-content.blp:15
msgid "Enabled"
msgstr ""
#: src/plugin.vala:29 src/plugin.vala:30 src/plugin.vala:53 src/plugin.vala:54
msgid "Apply"
#: 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 ""
#: src/plugin.vala:41 src/plugin.vala:47
msgid "Monitor"
#: data/ui/pages/monitor-settings-content.blp:41
#: data/ui/pages/monitor-settings-content.blp:48
msgid "Refresh Rate"
msgstr ""
#: src/backends/gnome-backend.vala:72 src/backends/gnome-backend.vala:516
msgid "No enabled monitors to mirror"
#: data/ui/pages/monitor-settings-content.blp:57
#: data/ui/pages/monitor-settings-content.blp:102
msgid "Variable Refresh Rate"
msgstr ""
#: src/backends/gnome-backend.vala:520 src/backends/gnome-backend.vala:532
msgid "No common mirror mode is available"
#: 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 ""
#: src/backends/hyprland-backend.vala:41
msgid "Hyprland configuration file was not found."
#: data/ui/pages/monitor-settings-content.blp:87
#: src/ui/widgets/mirror-settings-widget.vala:98
msgid "Rotation"
msgstr ""
#: src/backends/hyprland-backend.vala:56
msgid "Add monitors.conf to the Hyprland configuration."
#: data/ui/pages/monitor-settings-content.blp:93
msgid "Mirror"
msgstr ""
#: src/backends/hyprland-backend.vala:80
msgid "hyprctl monitors all returned non-array JSON"
#: data/ui/pages/monitor-settings-content.blp:111
msgid "Focus at startup"
msgstr ""
#: src/backends/niri-backend.vala:47
msgid "niri configuration file was not found."
#: data/ui/pages/monitor-settings-content.blp:126
msgid "Hot corners"
msgstr ""
#: src/backends/niri-backend.vala:62
msgid "Add monitor.kdl to the niri configuration."
#: data/ui/pages/monitor-settings-content.blp:135
msgid "Adjust for TV"
msgstr ""
#: src/backends/niri-backend.vala:85
msgid "niri msg outputs returned non-object JSON"
#: data/ui/pages/monitor-settings-content.blp:143
msgid "HDR"
msgstr ""
#: src/core/display-model.vala:75
msgid "Built-in Display"
#: data/ui/pages/monitor-settings-content.blp:152
msgid "Hyprland"
msgstr ""
#: src/ui/displays-view.vala:72
msgid "Failed to load monitors"
#: data/ui/pages/monitor-settings-content.blp:156
msgid "Use description"
msgstr ""
#: src/ui/displays-view.vala:81
msgid "Monitor settings applied"
#: data/ui/pages/monitor-settings-content.blp:164
msgid "Bit depth"
msgstr ""
#: src/ui/displays-view.vala:165
msgid "Read-only backend"
#: data/ui/pages/monitor-settings-content.blp:173
msgid "VRR"
msgstr ""
#: src/ui/displays-view.vala:166
msgid "Applying monitor layouts is not supported by this backend."
#: data/ui/pages/monitor-settings-content.blp:182
msgid "Color management"
msgstr ""
#: src/ui/displays-view.vala:189
msgid "Monitor configuration connected"
#: data/ui/pages/monitor-settings-content.blp:191
msgid "SDR EOTF"
msgstr ""
#: src/ui/displays-view.vala:201
msgid "Mirror Displays"
#: data/ui/pages/monitor-settings-content.blp:200
msgid "SDR brightness"
msgstr ""
#: src/ui/displays-view.vala:261 src/ui/monitor-settings-content.vala:88
#: src/ui/monitor-settings-content.vala:127
msgid "Resolution"
#: data/ui/pages/monitor-settings-content.blp:212
msgid "SDR saturation"
msgstr ""
#: src/ui/displays-view.vala:307 src/ui/monitor-settings-content.vala:265
#: src/ui/monitor-settings-content.vala:291
msgid "Scale"
#: data/ui/pages/monitor-settings-content.blp:225
msgid "HDR / EDID overrides"
msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308
msgid "Normal"
#: data/ui/pages/monitor-settings-content.blp:229
msgid "Force wide color"
msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308
msgid "90 degrees"
#: data/ui/pages/monitor-settings-content.blp:238
msgid "Force HDR"
msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308
msgid "180 degrees"
#: data/ui/pages/monitor-settings-content.blp:247
msgid "SDR min luminance"
msgstr ""
#: src/ui/displays-view.vala:325 src/ui/monitor-settings-content.vala:308
msgid "270 degrees"
#: data/ui/pages/monitor-settings-content.blp:259
msgid "SDR max luminance"
msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309
msgid "Flipped"
#: data/ui/pages/monitor-settings-content.blp:270
msgid "Min luminance"
msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309
msgid "Flipped 90 degrees"
#: data/ui/pages/monitor-settings-content.blp:282
msgid "Max luminance"
msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309
msgid "Flipped 180 degrees"
#: data/ui/pages/monitor-settings-content.blp:293
msgid "Max average luminance"
msgstr ""
#: src/ui/displays-view.vala:326 src/ui/monitor-settings-content.vala:309
msgid "Flipped 270 degrees"
#: data/ui/pages/monitor-settings-content.blp:304
msgid "ICC profile"
msgstr ""
#: src/ui/displays-view.vala:332 src/ui/monitor-settings-content.vala:315
msgid "Rotation"
#: data/ui/widgets/backdrop-color-widget.blp:7
#: data/ui/widgets/backdrop-color-widget.blp:13
msgid "Backdrop color"
msgstr ""
#: src/ui/displays-view.vala:365
msgid "Primary Display"
#: 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 ""
#: src/ui/monitor-row.vala:62
#, c-format
msgid "%dx%d@%.2f scale %.2f %dx%d"
#: data/ui/widgets/config-include-widget.blp:13
msgid "Connect"
msgstr ""
#: src/ui/monitor-settings-content.vala:156
#: src/ui/monitor-settings-content.vala:164
msgid "Refresh Rate"
#: src/backends/gnome-backend.vala:72 src/backends/gnome-backend.vala:516
msgid "No enabled monitors to mirror"
msgstr ""
#: src/ui/monitor-settings-content.vala:186
#: src/ui/monitor-settings-content.vala:411
msgid "Variable Refresh Rate"
#: src/backends/gnome-backend.vala:520 src/backends/gnome-backend.vala:532
msgid "No common mirror mode is available"
msgstr ""
#: src/ui/monitor-settings-content.vala:335
msgid "None"
#: src/backends/hyprland-backend.vala:39
msgid "Hyprland configuration file was not found."
msgstr ""
#: src/ui/monitor-settings-content.vala:350
msgid "Mirror"
#: src/backends/hyprland-backend.vala:54
msgid "Add monitors.conf to the Hyprland configuration."
msgstr ""
#: src/ui/monitor-settings-content.vala:367
msgid "Use description"
#: src/backends/hyprland-backend.vala:75
msgid "hyprctl monitors all returned non-array JSON"
msgstr ""
#: src/ui/monitor-settings-content.vala:378
msgid "Bit depth"
#: src/backends/hyprland-backend.vala:213
msgid "Unsupported virtual output backend"
msgstr ""
#: src/ui/monitor-settings-content.vala:380
msgid "VRR"
#: src/backends/niri-backend.vala:44
msgid "niri configuration file was not found."
msgstr ""
#: 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"
#: src/backends/niri-backend.vala:59
msgid "Add monitor.kdl to the niri configuration."
msgstr ""
#: 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
msgid "On"
#: src/backends/niri-backend.vala:79
msgid "niri msg outputs returned non-object JSON"
msgstr ""
#: src/ui/monitor-settings-content.vala:380
msgid "Fullscreen"
#: src/core/display-model.vala:75
msgid "Built-in Display"
msgstr ""
#: src/ui/monitor-settings-content.vala:380
msgid "Fullscreen video/game"
#: src/ui/common/displays-controller.vala:39
msgid "Failed to load monitors"
msgstr ""
#: src/ui/monitor-settings-content.vala:382
msgid "Color management"
#: src/ui/common/displays-controller.vala:49
msgid "Monitor settings applied"
msgstr ""
#: src/ui/monitor-settings-content.vala:383
msgid "SDR EOTF"
#: src/ui/common/ui-utils.vala:236
#, c-format
msgid "%.2f Hz"
msgstr ""
#: src/ui/monitor-settings-content.vala:384
msgid "SDR brightness"
#: src/ui/settings/monitor-choice-loader.vala:21
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "Normal"
msgstr ""
#: src/ui/monitor-settings-content.vala:385
msgid "SDR saturation"
#: src/ui/settings/monitor-choice-loader.vala:22
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "90 degrees"
msgstr ""
#: src/ui/monitor-settings-content.vala:389
msgid "Force wide color"
#: src/ui/settings/monitor-choice-loader.vala:23
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "180 degrees"
msgstr ""
#: src/ui/monitor-settings-content.vala:389
#: src/ui/monitor-settings-content.vala:390
msgid "Auto"
#: src/ui/settings/monitor-choice-loader.vala:24
#: src/ui/widgets/mirror-settings-widget.vala:91
msgid "270 degrees"
msgstr ""
#: src/ui/monitor-settings-content.vala:390
msgid "Force HDR"
#: src/ui/settings/monitor-choice-loader.vala:25
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped"
msgstr ""
#: src/ui/monitor-settings-content.vala:391
msgid "SDR min luminance"
#: src/ui/settings/monitor-choice-loader.vala:26
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 90 degrees"
msgstr ""
#: src/ui/monitor-settings-content.vala:392
msgid "SDR max luminance"
#: src/ui/settings/monitor-choice-loader.vala:27
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 180 degrees"
msgstr ""
#: src/ui/monitor-settings-content.vala:393
msgid "Min luminance"
#: src/ui/settings/monitor-choice-loader.vala:28
#: src/ui/widgets/mirror-settings-widget.vala:92
msgid "Flipped 270 degrees"
msgstr ""
#: src/ui/monitor-settings-content.vala:394
msgid "Max luminance"
#: src/ui/settings/monitor-choice-loader.vala:38
#: 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 ""
#: src/ui/monitor-settings-content.vala:395
msgid "Max average luminance"
#: src/ui/settings/monitor-choice-loader.vala:39
#: src/ui/settings/monitor-choice-loader.vala:45
#: src/ui/settings/monitor-choice-loader.vala:59
msgid "On"
msgstr ""
#: src/ui/monitor-settings-content.vala:398
msgid "ICC profile"
#: src/ui/settings/monitor-choice-loader.vala:40
msgid "Fullscreen"
msgstr ""
#: src/ui/monitor-settings-content.vala:412
msgid "On demand"
#: src/ui/settings/monitor-choice-loader.vala:41
msgid "Fullscreen video/game"
msgstr ""
#: src/ui/monitor-settings-content.vala:418
msgid "Focus at startup"
#: src/ui/settings/monitor-choice-loader.vala:46
msgid "On demand"
msgstr ""
#: src/ui/monitor-settings-content.vala:432
msgid "Hot corners"
#: src/ui/settings/monitor-choice-loader.vala:57
msgid "Auto"
msgstr ""
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:62
msgid "Default"
msgstr ""
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:64
msgid "All"
msgstr ""
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:65
msgid "Top left"
msgstr ""
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:66
msgid "Top right"
msgstr ""
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:67
msgid "Bottom left"
msgstr ""
#: src/ui/monitor-settings-content.vala:433
#: src/ui/settings/monitor-choice-loader.vala:68
msgid "Bottom right"
msgstr ""
#: src/ui/monitor-settings-content.vala:442
#: src/ui/monitor-settings-content.vala:456
msgid "Backdrop color"
#: src/ui/settings/monitor-choice-loader.vala:117
msgid "None"
msgstr ""
#: src/ui/monitor-settings-content.vala:486
msgid "Adjust for TV"
#: src/ui/widgets/config-include-widget.vala:63
msgid "Monitor configuration connected"
msgstr ""
#: src/ui/monitor-settings-content.vala:498
msgid "HDR"
#: src/ui/widgets/monitor-row.vala:35
msgid "Remove"
msgstr ""
#: src/ui/monitor-settings-content.vala:679
#: src/ui/widgets/monitor-row.vala:81
#, c-format
msgid "Variable (up to %.2f Hz)"
msgid "%dx%d@%.2f scale %.2f %dx%d"
msgstr ""
#: src/ui/monitor-settings-content.vala:680
msgid "Variable"
#: src/ui/widgets/primary-display-widget.vala:37
msgid "Primary Display"
msgstr ""
#: src/ui/monitor-settings-content.vala:683 src/ui/ui-helpers.vala:35
#, c-format
msgid "%.2f Hz"
#: 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 ""
......@@ -45,6 +45,7 @@ namespace TunerDisplays {
public virtual bool supports_hot_corners { get { return false; } }
public virtual bool supports_underscanning { 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 void apply(Gee.ArrayList<MonitorConfig> monitors) throws Error;
......@@ -57,6 +58,18 @@ namespace TunerDisplays {
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 {
var parser = new Json.Parser();
parser.load_from_data(text);
......
......@@ -28,6 +28,7 @@ namespace TunerDisplays {
public override bool supports_vrr_modes { 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_virtual_outputs { get { return true; } }
public override ConfigIncludeInfo config_include_info() {
var main_path = main_config_path();
......@@ -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 {
var names = new Gee.HashSet<string>();
var root = backend_parse_json(ShellCommand.run("hyprctl -j monitors"));
......@@ -410,6 +428,13 @@ namespace TunerDisplays {
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) {
if (!monitor.use_description)
return monitor.name;
......
......@@ -25,6 +25,7 @@ sources = files(
'ui/widgets/primary-display-widget.vala',
'ui/widgets/single-monitor-widget.vala',
'ui/widgets/status-widget.vala',
'ui/widgets/virtual-outputs-widget.vala',
'ui/pages/monitor-settings-content.vala',
'ui/settings/monitor-choice-loader.vala',
'ui/settings/monitor-setting-binding.vala',
......
......@@ -25,6 +25,7 @@ namespace TunerDisplays {
typeof(PrimaryDisplayWidget).ensure();
typeof(MonitorListWidget).ensure();
typeof(SingleMonitorWidget).ensure();
typeof(VirtualOutputsWidget).ensure();
typeof(MonitorSettingBinding).ensure();
typeof(MonitorSettingValidator).ensure();
typeof(MonitorChoiceLoader).ensure();
......@@ -43,6 +44,16 @@ namespace TunerDisplays {
apply.clicked.connect(DisplaysContext.controller.apply_changes);
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_content = builder.get_object("monitor_page_content") as Gtk.Box;
monitor_page_title = builder.get_object("monitor_page_title") as Gtk.Label;
......
......@@ -81,6 +81,8 @@ namespace TunerDisplays {
return !controller.mirror_enabled() && !controller.single_monitor_mode();
case "single-monitor":
return controller.single_monitor_mode();
case "virtual-outputs":
return controller.backend.supports_virtual_outputs;
default:
return true;
}
......
......@@ -19,11 +19,15 @@ namespace TunerDisplays {
}
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);
row.monitor_selected.connect(controller.open_monitor_settings);
row.monitor_changed.connect(controller.refresh_from_monitors);
list.append(row);
}
list.visible = list_has_children(list);
}
}
......
......@@ -30,6 +30,25 @@ namespace TunerDisplays {
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() {
valign = Gtk.Align.CENTER,
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