1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-05-02 10:32:07 -04:00

Compare commits

...

3 Commits

Author SHA1 Message Date
ArijanJ
46bb3b613b feat: add osd toggles to search index (#1652)
* feat: add osd toggles to search index
this commit also regenerates the search index

* add newline at end of translations file

* ran prek to fix the file :)
2026-02-11 13:28:04 -05:00
bbedward
5839a5de30 displays: add full screen only for hyprland and convert vrr to dropdown
fixes #1649
fixes #1548
2026-02-11 09:31:35 -05:00
bbedward
535d0bb0f0 lock/greeter: fix keyboard layout on Hyprland
fixes #1650
fixes #672
fixes #1600
2026-02-11 08:57:24 -05:00
8 changed files with 563 additions and 97 deletions

View File

@@ -92,22 +92,19 @@ Item {
try {
const data = JSON.parse(text);
const mainKeyboard = data.keyboards.find(kb => kb.main === true);
if (!mainKeyboard) {
hyprlandCurrentLayout = "";
hyprlandLayoutCount = 0;
return;
}
hyprlandKeyboard = mainKeyboard.name;
if (mainKeyboard && mainKeyboard.active_keymap) {
if (mainKeyboard.active_keymap) {
const parts = mainKeyboard.active_keymap.split(" ");
if (parts.length > 0) {
hyprlandCurrentLayout = parts[0].substring(0, 2).toUpperCase();
} else {
hyprlandCurrentLayout = mainKeyboard.active_keymap.substring(0, 2).toUpperCase();
}
hyprlandCurrentLayout = parts[0].substring(0, 2).toUpperCase();
} else {
hyprlandCurrentLayout = "";
}
if (mainKeyboard && mainKeyboard.layout_names) {
hyprlandLayoutCount = mainKeyboard.layout_names.length;
} else {
hyprlandLayoutCount = 0;
}
hyprlandLayoutCount = mainKeyboard.layout ? mainKeyboard.layout.split(",").length : 0;
} catch (e) {
hyprlandCurrentLayout = "";
hyprlandLayoutCount = 0;

View File

@@ -5,6 +5,7 @@ import QtQuick.Effects
import QtQuick.Layouts
import QtQuick.Window
import Quickshell
import Quickshell.Hyprland
import Quickshell.Io
import Quickshell.Services.Mpris
import qs.Common
@@ -44,19 +45,14 @@ Item {
WeatherService.addRef();
UserInfoService.getUserInfo();
if (CompositorService.isHyprland) {
if (CompositorService.isHyprland)
updateHyprlandLayout();
hyprlandLayoutUpdateTimer.start();
}
lockerReadyArmed = true;
}
Component.onDestruction: {
WeatherService.removeRef();
if (CompositorService.isHyprland) {
hyprlandLayoutUpdateTimer.stop();
}
}
function sendLockerReadyOnce() {
@@ -118,22 +114,19 @@ Item {
try {
const data = JSON.parse(text);
const mainKeyboard = data.keyboards.find(kb => kb.main === true);
if (!mainKeyboard) {
hyprlandCurrentLayout = "";
hyprlandLayoutCount = 0;
return;
}
hyprlandKeyboard = mainKeyboard.name;
if (mainKeyboard && mainKeyboard.active_keymap) {
if (mainKeyboard.active_keymap) {
const parts = mainKeyboard.active_keymap.split(" ");
if (parts.length > 0) {
hyprlandCurrentLayout = parts[0].substring(0, 2).toUpperCase();
} else {
hyprlandCurrentLayout = mainKeyboard.active_keymap.substring(0, 2).toUpperCase();
}
hyprlandCurrentLayout = parts[0].substring(0, 2).toUpperCase();
} else {
hyprlandCurrentLayout = "";
}
if (mainKeyboard && mainKeyboard.layout_names) {
hyprlandLayoutCount = mainKeyboard.layout_names.length;
} else {
hyprlandLayoutCount = 0;
}
hyprlandLayoutCount = mainKeyboard.layout ? mainKeyboard.layout.split(",").length : 0;
} catch (e) {
hyprlandCurrentLayout = "";
hyprlandLayoutCount = 0;
@@ -142,12 +135,14 @@ Item {
}
}
Timer {
id: hyprlandLayoutUpdateTimer
interval: 1000
running: false
repeat: true
onTriggered: updateHyprlandLayout()
Connections {
target: CompositorService.isHyprland ? Hyprland : null
enabled: CompositorService.isHyprland
function onRawEvent(event) {
if (event.name === "activelayout")
updateHyprlandLayout();
}
}
Loader {

View File

@@ -391,8 +391,12 @@ Singleton {
const filtered = filterDisconnectedOnly(parsed);
savedOutputs = filtered;
if (CompositorService.isHyprland)
if (CompositorService.isHyprland) {
initHyprlandSettingsFromConfig(parsed);
syncHyprlandVrrFromConfig(parsed);
}
if (CompositorService.isNiri)
syncNiriVrrFromConfig(parsed);
});
}
@@ -431,6 +435,44 @@ Singleton {
}
}
function syncHyprlandVrrFromConfig(parsedOutputs) {
const current = JSON.parse(JSON.stringify(SettingsData.hyprlandOutputSettings));
let changed = false;
for (const outputName in parsedOutputs) {
const settings = parsedOutputs[outputName]?.hyprlandSettings;
const fromConfig = settings?.vrrFullscreenOnly ?? false;
const stored = current[outputName]?.vrrFullscreenOnly ?? false;
if (fromConfig === stored)
continue;
if (!current[outputName])
current[outputName] = {};
if (fromConfig)
current[outputName].vrrFullscreenOnly = true;
else
delete current[outputName].vrrFullscreenOnly;
changed = true;
}
if (changed) {
SettingsData.hyprlandOutputSettings = current;
SettingsData.saveSettings();
}
}
function syncNiriVrrFromConfig(parsedOutputs) {
let changed = false;
for (const outputName in parsedOutputs) {
const output = parsedOutputs[outputName];
const current = SettingsData.getNiriOutputSetting(outputName, "vrrOnDemand", false);
const fromConfig = output.vrr_on_demand ?? false;
if (current === fromConfig)
continue;
SettingsData.setNiriOutputSetting(outputName, "vrrOnDemand", fromConfig || undefined);
changed = true;
}
if (changed)
SettingsData.saveSettings();
}
function filterDisconnectedOnly(parsedOutputs) {
const result = {};
const liveNames = Object.keys(outputs);
@@ -479,7 +521,8 @@ Singleton {
const posMatch = body.match(/position\s+x=(-?\d+)\s+y=(-?\d+)/);
const scaleMatch = body.match(/scale\s+([\d.]+)/);
const transformMatch = body.match(/transform\s+"([^"]+)"/);
const vrrMatch = body.match(/variable-refresh-rate(?:\s+on)?/);
const vrrMatch = body.match(/variable-refresh-rate/);
const vrrOnDemandMatch = body.match(/variable-refresh-rate\s+on-demand=true/);
result[name] = {
"name": name,
@@ -498,6 +541,7 @@ Singleton {
] : [],
"current_mode": 0,
"vrr_enabled": !!vrrMatch,
"vrr_on_demand": !!vrrOnDemandMatch,
"vrr_supported": true
};
}
@@ -535,7 +579,7 @@ Singleton {
const name = match[1].trim();
const rest = line.substring(line.indexOf(match[7]) + match[7].length);
let transform = 0, vrr = false, bitdepth = undefined, cm = undefined;
let transform = 0, vrrMode = 0, bitdepth = undefined, cm = undefined;
let sdrBrightness = undefined, sdrSaturation = undefined;
const transformMatch = rest.match(/,\s*transform,\s*(\d+)/);
@@ -544,7 +588,7 @@ Singleton {
const vrrMatch = rest.match(/,\s*vrr,\s*(\d+)/);
if (vrrMatch)
vrr = vrrMatch[1] === "1";
vrrMode = parseInt(vrrMatch[1]);
const bitdepthMatch = rest.match(/,\s*bitdepth,\s*(\d+)/);
if (bitdepthMatch)
@@ -583,13 +627,14 @@ Singleton {
}
],
"current_mode": 0,
"vrr_enabled": vrr,
"vrr_enabled": vrrMode >= 1,
"vrr_supported": true,
"hyprlandSettings": {
"bitdepth": bitdepth,
"colorManagement": cm,
"sdrBrightness": sdrBrightness,
"sdrSaturation": sdrSaturation
"sdrSaturation": sdrSaturation,
"vrrFullscreenOnly": vrrMode === 2 ? true : undefined
},
"mirror": mirror
};
@@ -1205,6 +1250,8 @@ Singleton {
changeDescriptions.push(outputId + ": " + I18n.tr("Force HDR") + " → " + (changes.supportsHdr ? I18n.tr("Yes") : I18n.tr("No")));
if (changes.supportsWideColor !== undefined)
changeDescriptions.push(outputId + ": " + I18n.tr("Force Wide Color") + " → " + (changes.supportsWideColor ? I18n.tr("Yes") : I18n.tr("No")));
if (changes.vrrFullscreenOnly !== undefined)
changeDescriptions.push(outputId + ": " + I18n.tr("VRR Fullscreen Only") + " → " + (changes.vrrFullscreenOnly ? I18n.tr("Enabled") : I18n.tr("Disabled")));
}
if (CompositorService.isNiri) {
@@ -1309,7 +1356,12 @@ Singleton {
function generateNiriOutputsKdl(outputsData, niriSettings) {
let kdlContent = `// Auto-generated by DMS - do not edit manually\n\n`;
for (const outputName in outputsData) {
const sortedNames = Object.keys(outputsData).sort((a, b) => {
const la = outputsData[a].logical || {};
const lb = outputsData[b].logical || {};
return (la.x ?? 0) - (lb.x ?? 0) || (la.y ?? 0) - (lb.y ?? 0);
});
for (const outputName of sortedNames) {
const output = outputsData[outputName];
const identifier = getNiriOutputIdentifier(output, outputName);
const settings = niriSettings[identifier] || {};

View File

@@ -251,7 +251,7 @@ StyledRect {
DankToggle {
width: parent.width
text: I18n.tr("Variable Refresh Rate")
visible: root.isConnected && !CompositorService.isDwl && (DisplayConfigState.outputs[root.outputName]?.vrr_supported ?? false)
visible: root.isConnected && !CompositorService.isDwl && !CompositorService.isHyprland && !CompositorService.isNiri && (DisplayConfigState.outputs[root.outputName]?.vrr_supported ?? false)
checked: {
const pendingVrr = DisplayConfigState.getPendingValue(root.outputName, "vrr");
if (pendingVrr !== undefined)
@@ -261,13 +261,52 @@ StyledRect {
onToggled: checked => DisplayConfigState.setPendingChange(root.outputName, "vrr", checked)
}
DankToggle {
DankDropdown {
width: parent.width
text: I18n.tr("VRR On-Demand")
description: I18n.tr("VRR activates only when applications request it")
text: I18n.tr("Variable Refresh Rate")
addHorizontalPadding: true
visible: root.isConnected && CompositorService.isHyprland && (DisplayConfigState.outputs[root.outputName]?.vrr_supported ?? false)
options: [I18n.tr("Off"), I18n.tr("On"), I18n.tr("Fullscreen Only")]
currentValue: {
DisplayConfigState.pendingHyprlandChanges;
if (DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "vrrFullscreenOnly", false))
return I18n.tr("Fullscreen Only");
const pendingVrr = DisplayConfigState.getPendingValue(root.outputName, "vrr");
const vrrEnabled = pendingVrr !== undefined ? pendingVrr : (DisplayConfigState.outputs[root.outputName]?.vrr_enabled ?? false);
if (vrrEnabled)
return I18n.tr("On");
return I18n.tr("Off");
}
onValueChanged: value => {
const off = I18n.tr("Off");
const fullscreen = I18n.tr("Fullscreen Only");
DisplayConfigState.setPendingChange(root.outputName, "vrr", value !== off);
DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "vrrFullscreenOnly", value === fullscreen || null);
}
}
DankDropdown {
width: parent.width
text: I18n.tr("Variable Refresh Rate")
addHorizontalPadding: true
visible: root.isConnected && CompositorService.isNiri && (DisplayConfigState.outputs[root.outputName]?.vrr_supported ?? false)
checked: DisplayConfigState.getNiriSetting(root.outputData, root.outputName, "vrrOnDemand", false)
onToggled: checked => DisplayConfigState.setNiriSetting(root.outputData, root.outputName, "vrrOnDemand", checked)
options: [I18n.tr("Off"), I18n.tr("On"), I18n.tr("On-Demand")]
currentValue: {
DisplayConfigState.pendingNiriChanges;
if (DisplayConfigState.getNiriSetting(root.outputData, root.outputName, "vrrOnDemand", false))
return I18n.tr("On-Demand");
const pendingVrr = DisplayConfigState.getPendingValue(root.outputName, "vrr");
const vrrEnabled = pendingVrr !== undefined ? pendingVrr : (DisplayConfigState.outputs[root.outputName]?.vrr_enabled ?? false);
if (!vrrEnabled)
return I18n.tr("Off");
return I18n.tr("On");
}
onValueChanged: value => {
const off = I18n.tr("Off");
const onDemand = I18n.tr("On-Demand");
DisplayConfigState.setPendingChange(root.outputName, "vrr", value !== off);
DisplayConfigState.setNiriSetting(root.outputData, root.outputName, "vrrOnDemand", value === onDemand || null);
}
}
Rectangle {

View File

@@ -26,6 +26,7 @@ Item {
settingKey: "osd"
SettingsDropdownRow {
settingKey: "osdPosition"
text: I18n.tr("OSD Position")
description: I18n.tr("Choose where on-screen displays appear on screen")
currentValue: {
@@ -73,6 +74,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdAlwaysShowValue"
text: I18n.tr("Always Show Percentage")
description: I18n.tr("Display volume and brightness percentage values in OSD popups")
checked: SettingsData.osdAlwaysShowValue
@@ -87,6 +89,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdVolumeEnabled"
text: I18n.tr("Volume")
description: I18n.tr("Show on-screen display when volume changes")
checked: SettingsData.osdVolumeEnabled
@@ -94,6 +97,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdMediaVolumeEnabled"
text: I18n.tr("Media Volume")
description: I18n.tr("Show on-screen display when media player volume changes")
checked: SettingsData.osdMediaVolumeEnabled
@@ -101,13 +105,15 @@ Item {
}
SettingsToggleRow {
settingKey: "osdMediaPlaybackEnabled"
text: I18n.tr("Media Playback")
description: I18n.tr("Show on-screen display when media playback status changes")
description: I18n.tr("Show on-screen display when media player status changes")
checked: SettingsData.osdMediaPlaybackEnabled
onToggled: checked => SettingsData.set("osdMediaPlaybackEnabled", checked)
}
SettingsToggleRow {
settingKey: "osdBrightnessEnabled"
text: I18n.tr("Brightness")
description: I18n.tr("Show on-screen display when brightness changes")
checked: SettingsData.osdBrightnessEnabled
@@ -115,6 +121,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdIdleInhibitorEnabled"
text: I18n.tr("Idle Inhibitor")
description: I18n.tr("Show on-screen display when idle inhibitor state changes")
checked: SettingsData.osdIdleInhibitorEnabled
@@ -122,6 +129,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdMicMuteEnabled"
text: I18n.tr("Microphone Mute")
description: I18n.tr("Show on-screen display when microphone is muted/unmuted")
checked: SettingsData.osdMicMuteEnabled
@@ -129,6 +137,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdCapsLockEnabled"
text: I18n.tr("Caps Lock")
description: I18n.tr("Show on-screen display when caps lock state changes")
checked: SettingsData.osdCapsLockEnabled
@@ -136,6 +145,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdPowerProfileEnabled"
text: I18n.tr("Power Profile")
description: I18n.tr("Show on-screen display when power profile changes")
checked: SettingsData.osdPowerProfileEnabled
@@ -143,6 +153,7 @@ Item {
}
SettingsToggleRow {
settingKey: "osdAudioOutputEnabled"
text: I18n.tr("Audio Output Switch")
description: I18n.tr("Show on-screen display when cycling audio output devices")
checked: SettingsData.osdAudioOutputEnabled

View File

@@ -98,8 +98,10 @@ Singleton {
if (transform !== 0)
monitorLine += ", transform, " + transform;
if (output.vrr_supported)
monitorLine += ", vrr, " + (output.vrr_enabled ? "1" : "0");
if (output.vrr_supported) {
const vrrMode = outputSettings.vrrFullscreenOnly ? 2 : (output.vrr_enabled ? 1 : 0);
monitorLine += ", vrr, " + vrrMode;
}
if (output.mirror && output.mirror.length > 0)
monitorLine += ", mirror, " + output.mirror;

View File

@@ -1359,7 +1359,12 @@ Singleton {
return;
let kdlContent = `// Auto-generated by DMS - do not edit manually\n\n`;
for (const outputName in data) {
const sortedNames = Object.keys(data).sort((a, b) => {
const la = data[a].logical || {};
const lb = data[b].logical || {};
return (la.x ?? 0) - (lb.x ?? 0) || (la.y ?? 0) - (lb.y ?? 0);
});
for (const outputName of sortedNames) {
const output = data[outputName];
const identifier = getOutputIdentifier(output, outputName);
const niriSettings = SettingsData.getNiriOutputSettings(identifier);
@@ -1397,7 +1402,7 @@ Singleton {
}
}
if (output.vrr_enabled) {
if (output.vrr_enabled || niriSettings.vrrOnDemand) {
const vrrOnDemand = niriSettings.vrrOnDemand ?? false;
kdlContent += vrrOnDemand ? ` variable-refresh-rate on-demand=true\n` : ` variable-refresh-rate\n`;
}

View File

@@ -751,6 +751,21 @@
],
"icon": "vertical_align_center"
},
{
"section": "barShadow",
"label": "Shadow",
"tabIndex": 3,
"category": "Dank Bar",
"keywords": [
"bar",
"dank",
"panel",
"shadow",
"statusbar",
"topbar"
],
"icon": "layers"
},
{
"section": "barSpacing",
"label": "Spacing",
@@ -3815,31 +3830,24 @@
"description": "If the field is hidden, it will appear as soon as a key is pressed."
},
{
"section": "lockScreenNotificationMode",
"label": "Notification Display",
"section": "lockAtStartup",
"label": "Lock at startup",
"tabIndex": 11,
"category": "Lock Screen",
"keywords": [
"alert",
"control",
"display",
"information",
"automatic",
"automatically",
"boot",
"lock",
"lockscreen",
"login",
"monitor",
"notif",
"notification",
"notifications",
"output",
"password",
"privacy",
"screen",
"security",
"shown",
"what"
"start",
"starts",
"startup"
],
"description": "Control what notification information is shown on the lock screen"
"description": "Automatically lock the screen when DMS starts"
},
{
"section": "_tab_11",
@@ -4075,6 +4083,7 @@
"motion",
"popout",
"speed",
"sync",
"text",
"transition",
"typography"
@@ -4097,6 +4106,7 @@
"modal",
"motion",
"speed",
"sync",
"text",
"transition",
"typography"
@@ -4104,6 +4114,29 @@
"icon": "web_asset",
"description": "%1 custom animation duration"
},
{
"section": "customAnimationDuration",
"label": "Animation Duration",
"tabIndex": 14,
"category": "Typography & Motion",
"keywords": [
"animate",
"animation",
"animations",
"custom",
"duration",
"durations",
"fonts",
"globally",
"motion",
"scale",
"speed",
"text",
"transition",
"typography"
],
"description": "Globally scale all animation durations"
},
{
"section": "animationSpeed",
"label": "Animation Speed",
@@ -4114,43 +4147,18 @@
"animation",
"animations",
"duration",
"fine",
"durations",
"fonts",
"milliseconds",
"globally",
"motion",
"scale",
"speed",
"text",
"timing",
"transition",
"tune",
"typography"
],
"icon": "animation",
"description": "Fine-tune animation timing in milliseconds"
},
{
"section": "customAnimationDuration",
"label": "Custom Duration",
"tabIndex": 14,
"category": "Typography & Motion",
"keywords": [
"animate",
"animation",
"animations",
"custom",
"duration",
"fine",
"fonts",
"milliseconds",
"motion",
"speed",
"text",
"timing",
"transition",
"tune",
"typography"
],
"description": "Fine-tune animation timing in milliseconds"
"description": "Globally scale all animation durations"
},
{
"section": "popoutCustomAnimationDuration",
@@ -4281,6 +4289,59 @@
],
"description": "Select the font family for UI text"
},
{
"section": "enableRippleEffects",
"label": "Ripple Effects",
"tabIndex": 14,
"category": "Typography & Motion",
"keywords": [
"animate",
"animation",
"animations",
"design",
"effect",
"effects",
"elements",
"feedback",
"fonts",
"interactive",
"material",
"motion",
"ripple",
"show",
"text",
"transition",
"typography"
],
"icon": "radio_button_unchecked",
"description": "Show Material Design ripple animations on interactive elements"
},
{
"section": "syncComponentAnimationSpeeds",
"label": "Sync Popouts & Modals",
"tabIndex": 14,
"category": "Typography & Motion",
"keywords": [
"animate",
"animation",
"animations",
"customize",
"follow",
"fonts",
"global",
"modal",
"modals",
"motion",
"popout",
"popouts",
"speed",
"sync",
"text",
"transition",
"typography"
],
"description": "Popouts and Modals follow global Animation Speed (disable to customize independently)"
},
{
"section": "typography",
"label": "Typography",
@@ -4834,6 +4895,35 @@
],
"description": "Timeout for normal priority notifications"
},
{
"section": "lockScreenNotificationMode",
"label": "Notification Display",
"tabIndex": 17,
"category": "Notifications",
"keywords": [
"alert",
"alerts",
"control",
"display",
"information",
"lock",
"lockscreen",
"login",
"messages",
"monitor",
"notif",
"notification",
"notifications",
"output",
"privacy",
"screen",
"security",
"shown",
"toast",
"what"
],
"description": "Control what notification information is shown on the lock screen"
},
{
"section": "notificationOverlayEnabled",
"label": "Notification Overlay",
@@ -4948,6 +5038,230 @@
],
"description": "Choose where notification popups appear on screen"
},
{
"section": "osdAlwaysShowValue",
"label": "Always Show Percentage",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"always",
"audio",
"backlight",
"bright",
"brightness",
"dim",
"display",
"displays",
"indicator",
"loudness",
"monitor",
"osd",
"output",
"percentage",
"popup",
"popups",
"screen",
"show",
"sound",
"speaker",
"values",
"volume"
],
"description": "Display volume and brightness percentage values in OSD popups"
},
{
"section": "osdAudioOutputEnabled",
"label": "Audio Output Switch",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"audio",
"cycling",
"devices",
"display",
"displays",
"indicator",
"monitor",
"osd",
"output",
"popup",
"screen",
"show",
"switch"
],
"description": "Show on-screen display when cycling audio output devices"
},
{
"section": "osdBrightnessEnabled",
"label": "Brightness",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"backlight",
"bright",
"brightness",
"changes",
"dim",
"display",
"displays",
"indicator",
"monitor",
"osd",
"output",
"popup",
"screen",
"show"
],
"description": "Show on-screen display when brightness changes"
},
{
"section": "osdCapsLockEnabled",
"label": "Caps Lock",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"caps",
"changes",
"display",
"displays",
"indicator",
"lock",
"monitor",
"osd",
"output",
"popup",
"screen",
"show",
"state"
],
"description": "Show on-screen display when caps lock state changes"
},
{
"section": "osdIdleInhibitorEnabled",
"label": "Idle Inhibitor",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"afk",
"changes",
"display",
"displays",
"idle",
"inactive",
"indicator",
"inhibitor",
"monitor",
"osd",
"output",
"popup",
"screen",
"screensaver",
"show",
"state",
"timeout"
],
"description": "Show on-screen display when idle inhibitor state changes"
},
{
"section": "osdMediaPlaybackEnabled",
"label": "Media Playback",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"audio",
"changes",
"display",
"displays",
"indicator",
"media",
"monitor",
"mpris",
"music",
"osd",
"output",
"playback",
"player",
"popup",
"screen",
"show",
"status"
],
"description": "Show on-screen display when media player status changes"
},
{
"section": "osdMediaVolumeEnabled",
"label": "Media Volume",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"audio",
"changes",
"display",
"displays",
"indicator",
"loudness",
"media",
"monitor",
"mpris",
"music",
"osd",
"output",
"playback",
"player",
"popup",
"screen",
"show",
"sound",
"speaker",
"volume"
],
"description": "Show on-screen display when media player volume changes"
},
{
"section": "osdMicMuteEnabled",
"label": "Microphone Mute",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"display",
"displays",
"indicator",
"microphone",
"monitor",
"mute",
"muted",
"osd",
"output",
"popup",
"screen",
"show",
"unmuted"
],
"description": "Show on-screen display when microphone is muted/unmuted"
},
{
"section": "osdPosition",
"label": "OSD Position",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"appear",
"choose",
"displays",
"indicator",
"monitor",
"monitors",
"osd",
"output",
"outputs",
"popup",
"position",
"screen",
"screens",
"where"
],
"description": "Choose where on-screen displays appear on screen"
},
{
"section": "_tab_18",
"label": "On-screen Displays",
@@ -4990,6 +5304,57 @@
"icon": "tune",
"description": "Choose where on-screen displays appear on screen"
},
{
"section": "osdPowerProfileEnabled",
"label": "Power Profile",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"changes",
"display",
"displays",
"hibernate",
"indicator",
"monitor",
"osd",
"output",
"popup",
"power",
"profile",
"reboot",
"restart",
"screen",
"show",
"shutdown",
"sleep",
"suspend"
],
"description": "Show on-screen display when power profile changes"
},
{
"section": "osdVolumeEnabled",
"label": "Volume",
"tabIndex": 18,
"category": "On-screen Displays",
"keywords": [
"audio",
"changes",
"display",
"displays",
"indicator",
"loudness",
"monitor",
"osd",
"output",
"popup",
"screen",
"show",
"sound",
"speaker",
"volume"
],
"description": "Show on-screen display when volume changes"
},
{
"section": "appIdSubstitutions",
"label": "App ID Substitutions",