1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-31 08:52:49 -05:00

Compare commits

..

2 Commits

Author SHA1 Message Date
bbedward
651672afe2 gamma: allow steps of 100 with slider
fixes #1216
2025-12-31 09:31:16 -05:00
bbedward
2dbadfe1b5 clipboard: single disable + read-only history option 2025-12-31 09:14:35 -05:00
12 changed files with 207 additions and 217 deletions

View File

@@ -142,8 +142,6 @@ var (
clipConfigNoClearStartup bool clipConfigNoClearStartup bool
clipConfigDisabled bool clipConfigDisabled bool
clipConfigEnabled bool clipConfigEnabled bool
clipConfigDisableHistory bool
clipConfigEnableHistory bool
) )
func init() { func init() {
@@ -167,10 +165,8 @@ func init() {
clipConfigSetCmd.Flags().IntVar(&clipConfigAutoClearDays, "auto-clear-days", -1, "Auto-clear entries older than N days (0 to disable)") clipConfigSetCmd.Flags().IntVar(&clipConfigAutoClearDays, "auto-clear-days", -1, "Auto-clear entries older than N days (0 to disable)")
clipConfigSetCmd.Flags().BoolVar(&clipConfigClearAtStartup, "clear-at-startup", false, "Clear history on startup") clipConfigSetCmd.Flags().BoolVar(&clipConfigClearAtStartup, "clear-at-startup", false, "Clear history on startup")
clipConfigSetCmd.Flags().BoolVar(&clipConfigNoClearStartup, "no-clear-at-startup", false, "Don't clear history on startup") clipConfigSetCmd.Flags().BoolVar(&clipConfigNoClearStartup, "no-clear-at-startup", false, "Don't clear history on startup")
clipConfigSetCmd.Flags().BoolVar(&clipConfigDisabled, "disable", false, "Disable clipboard manager entirely") clipConfigSetCmd.Flags().BoolVar(&clipConfigDisabled, "disable", false, "Disable clipboard tracking")
clipConfigSetCmd.Flags().BoolVar(&clipConfigEnabled, "enable", false, "Enable clipboard manager") clipConfigSetCmd.Flags().BoolVar(&clipConfigEnabled, "enable", false, "Enable clipboard tracking")
clipConfigSetCmd.Flags().BoolVar(&clipConfigDisableHistory, "disable-history", false, "Disable clipboard history persistence")
clipConfigSetCmd.Flags().BoolVar(&clipConfigEnableHistory, "enable-history", false, "Enable clipboard history persistence")
clipWatchCmd.Flags().BoolVarP(&clipWatchStore, "store", "s", false, "Store clipboard changes to history (no server required)") clipWatchCmd.Flags().BoolVarP(&clipWatchStore, "store", "s", false, "Store clipboard changes to history (no server required)")
@@ -587,12 +583,6 @@ func runClipConfigSet(cmd *cobra.Command, args []string) {
if clipConfigEnabled { if clipConfigEnabled {
params["disabled"] = false params["disabled"] = false
} }
if clipConfigDisableHistory {
params["disableHistory"] = true
}
if clipConfigEnableHistory {
params["disableHistory"] = false
}
if len(params) == 0 { if len(params) == 0 {
fmt.Println("No config options specified") fmt.Println("No config options specified")

View File

@@ -205,9 +205,6 @@ func handleSetConfig(conn net.Conn, req models.Request, m *Manager) {
if v, ok := req.Params["disabled"].(bool); ok { if v, ok := req.Params["disabled"].(bool); ok {
cfg.Disabled = v cfg.Disabled = v
} }
if v, ok := req.Params["disableHistory"].(bool); ok {
cfg.DisableHistory = v
}
if err := m.SetConfig(cfg); err != nil { if err := m.SetConfig(cfg); err != nil {
models.RespondError(conn, req.ID, err.Error()) models.RespondError(conn, req.ID, err.Error())

View File

@@ -36,10 +36,6 @@ var sensitiveMimeTypes = []string{
} }
func NewManager(wlCtx wlcontext.WaylandContext, config Config) (*Manager, error) { func NewManager(wlCtx wlcontext.WaylandContext, config Config) (*Manager, error) {
if config.Disabled {
return nil, fmt.Errorf("clipboard disabled in config")
}
display := wlCtx.Display() display := wlCtx.Display()
dbPath, err := getDBPath() dbPath, err := getDBPath()
if err != nil { if err != nil {
@@ -61,16 +57,17 @@ func NewManager(wlCtx wlcontext.WaylandContext, config Config) (*Manager, error)
dbPath: dbPath, dbPath: dbPath,
} }
if !config.Disabled {
if err := m.setupRegistry(); err != nil { if err := m.setupRegistry(); err != nil {
return nil, err return nil, err
} }
}
m.notifierWg.Add(1) m.notifierWg.Add(1)
go m.notifier() go m.notifier()
go m.watchConfig() go m.watchConfig()
if !config.DisableHistory {
db, err := openDB(dbPath) db, err := openDB(dbPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to open db: %w", err) return nil, fmt.Errorf("failed to open db: %w", err)
@@ -81,6 +78,7 @@ func NewManager(wlCtx wlcontext.WaylandContext, config Config) (*Manager, error)
log.Errorf("Failed to migrate hashes: %v", err) log.Errorf("Failed to migrate hashes: %v", err)
} }
if !config.Disabled {
if config.ClearAtStartup { if config.ClearAtStartup {
if err := m.clearHistoryInternal(); err != nil { if err := m.clearHistoryInternal(); err != nil {
log.Errorf("Failed to clear history at startup: %v", err) log.Errorf("Failed to clear history at startup: %v", err)
@@ -97,7 +95,7 @@ func NewManager(wlCtx wlcontext.WaylandContext, config Config) (*Manager, error)
m.alive = true m.alive = true
m.updateState() m.updateState()
if m.dataControlMgr != nil && m.seat != nil { if !config.Disabled && m.dataControlMgr != nil && m.seat != nil {
m.setupDataDeviceSync() m.setupDataDeviceSync()
} }
@@ -326,7 +324,7 @@ func (m *Manager) readAndStore(r *os.File, mimeType string) {
return return
} }
if !cfg.DisableHistory && m.db != nil { if !cfg.Disabled && m.db != nil {
m.storeClipboardEntry(data, mimeType) m.storeClipboardEntry(data, mimeType)
} }
@@ -1211,23 +1209,13 @@ func (m *Manager) applyConfigChange(newCfg Config) {
m.config = newCfg m.config = newCfg
m.configMutex.Unlock() m.configMutex.Unlock()
if newCfg.DisableHistory && !oldCfg.DisableHistory && m.db != nil { switch {
log.Info("Clipboard history disabled, closing database") case newCfg.Disabled && !oldCfg.Disabled:
m.db.Close() log.Info("Clipboard tracking disabled")
m.db = nil case !newCfg.Disabled && oldCfg.Disabled:
log.Info("Clipboard tracking enabled")
} }
if !newCfg.DisableHistory && oldCfg.DisableHistory && m.db == nil {
log.Info("Clipboard history enabled, opening database")
if db, err := openDB(m.dbPath); err == nil {
m.db = db
} else {
log.Errorf("Failed to reopen database: %v", err)
}
}
log.Infof("Clipboard config reloaded: disableHistory=%v", newCfg.DisableHistory)
m.updateState() m.updateState()
m.notifySubscribers() m.notifySubscribers()
} }
@@ -1235,8 +1223,8 @@ func (m *Manager) applyConfigChange(newCfg Config) {
func (m *Manager) StoreData(data []byte, mimeType string) error { func (m *Manager) StoreData(data []byte, mimeType string) error {
cfg := m.getConfig() cfg := m.getConfig()
if cfg.DisableHistory { if cfg.Disabled {
return fmt.Errorf("clipboard history disabled") return fmt.Errorf("clipboard tracking disabled")
} }
if m.db == nil { if m.db == nil {

View File

@@ -457,7 +457,6 @@ func TestDefaultConfig(t *testing.T) {
assert.Equal(t, 0, cfg.AutoClearDays) assert.Equal(t, 0, cfg.AutoClearDays)
assert.False(t, cfg.ClearAtStartup) assert.False(t, cfg.ClearAtStartup)
assert.False(t, cfg.Disabled) assert.False(t, cfg.Disabled)
assert.False(t, cfg.DisableHistory)
} }
func TestManager_PostDelegatesToWlContext(t *testing.T) { func TestManager_PostDelegatesToWlContext(t *testing.T) {

View File

@@ -18,9 +18,7 @@ type Config struct {
MaxEntrySize int64 `json:"maxEntrySize"` MaxEntrySize int64 `json:"maxEntrySize"`
AutoClearDays int `json:"autoClearDays"` AutoClearDays int `json:"autoClearDays"`
ClearAtStartup bool `json:"clearAtStartup"` ClearAtStartup bool `json:"clearAtStartup"`
Disabled bool `json:"disabled"` Disabled bool `json:"disabled"`
DisableHistory bool `json:"disableHistory"`
} }
func DefaultConfig() Config { func DefaultConfig() Config {

View File

@@ -207,9 +207,6 @@ func handleClipboardSetConfig(conn net.Conn, req models.Request) {
if v, ok := req.Params["disabled"].(bool); ok { if v, ok := req.Params["disabled"].(bool); ok {
cfg.Disabled = v cfg.Disabled = v
} }
if v, ok := req.Params["disableHistory"].(bool); ok {
cfg.DisableHistory = v
}
if err := clipboard.SaveConfig(cfg); err != nil { if err := clipboard.SaveConfig(cfg); err != nil {
models.RespondError(conn, req.ID, err.Error()) models.RespondError(conn, req.ID, err.Error())

View File

@@ -26,7 +26,7 @@ DankModal {
property Component clipboardContent property Component clipboardContent
property int activeImageLoads: 0 property int activeImageLoads: 0
readonly property int maxConcurrentLoads: 3 readonly property int maxConcurrentLoads: 3
readonly property bool clipboardAvailable: DMSService.isConnected && DMSService.capabilities.includes("clipboard") readonly property bool clipboardAvailable: DMSService.isConnected && (DMSService.capabilities.length === 0 || DMSService.capabilities.includes("clipboard"))
property bool wtypeAvailable: false property bool wtypeAvailable: false
Process { Process {

View File

@@ -324,24 +324,14 @@ Item {
expanded: false expanded: false
visible: configLoaded visible: configLoaded
SettingsToggleRow {
tab: "clipboard"
tags: ["clipboard", "disable", "manager"]
settingKey: "disabled"
text: I18n.tr("Disable Clipboard Manager")
description: I18n.tr("Disable clipboard manager entirely (requires restart)")
checked: root.config.disabled ?? false
onToggled: checked => root.saveConfig("disabled", checked)
}
SettingsToggleRow { SettingsToggleRow {
tab: "clipboard" tab: "clipboard"
tags: ["clipboard", "disable", "history"] tags: ["clipboard", "disable", "history"]
settingKey: "disableHistory" settingKey: "disabled"
text: I18n.tr("Disable History Persistence") text: I18n.tr("Disable History Persistence")
description: I18n.tr("Clipboard works but nothing saved to disk") description: I18n.tr("Clipboard works but nothing saved to disk")
checked: root.config.disableHistory ?? false checked: root.config.disabled ?? false
onToggled: checked => root.saveConfig("disableHistory", checked) onToggled: checked => root.saveConfig("disabled", checked)
} }
} }
} }

View File

@@ -2,6 +2,7 @@ import QtQuick
import qs.Common import qs.Common
import qs.Services import qs.Services
import qs.Widgets import qs.Widgets
import qs.Modules.Settings.Widgets
Item { Item {
id: root id: root
@@ -96,47 +97,39 @@ Item {
rightPadding: Theme.spacingM rightPadding: Theme.spacingM
visible: DisplayService.gammaControlAvailable visible: DisplayService.gammaControlAvailable
DankDropdown { SettingsSliderRow {
id: nightTempSlider
settingKey: "nightModeTemperature"
tags: ["gamma", "night", "temperature", "kelvin", "warm", "color", "blue light"]
width: parent.width - parent.leftPadding - parent.rightPadding width: parent.width - parent.leftPadding - parent.rightPadding
text: SessionData.nightModeAutoEnabled ? I18n.tr("Night Temperature") : I18n.tr("Color Temperature") text: SessionData.nightModeAutoEnabled ? I18n.tr("Night Temperature") : I18n.tr("Color Temperature")
description: SessionData.nightModeAutoEnabled ? I18n.tr("Color temperature for night mode") : I18n.tr("Warm color temperature to apply") description: SessionData.nightModeAutoEnabled ? I18n.tr("Color temperature for night mode") : I18n.tr("Warm color temperature to apply")
currentValue: SessionData.nightModeTemperature + "K" minimum: 2500
options: { maximum: 6000
var temps = []; step: 100
for (var i = 2500; i <= 6000; i += 500) { unit: "K"
temps.push(i + "K"); value: SessionData.nightModeTemperature
} onSliderValueChanged: newValue => {
return temps; SessionData.setNightModeTemperature(newValue);
} if (SessionData.nightModeHighTemperature < newValue)
onValueChanged: value => { SessionData.setNightModeHighTemperature(newValue);
var temp = parseInt(value.replace("K", ""));
SessionData.setNightModeTemperature(temp);
if (SessionData.nightModeHighTemperature < temp) {
SessionData.setNightModeHighTemperature(temp);
}
} }
} }
DankDropdown { SettingsSliderRow {
id: dayTempSlider
settingKey: "nightModeHighTemperature"
tags: ["gamma", "day", "temperature", "kelvin", "color"]
width: parent.width - parent.leftPadding - parent.rightPadding width: parent.width - parent.leftPadding - parent.rightPadding
text: I18n.tr("Day Temperature") text: I18n.tr("Day Temperature")
description: I18n.tr("Color temperature for day time") description: I18n.tr("Color temperature for day time")
currentValue: SessionData.nightModeHighTemperature + "K" minimum: SessionData.nightModeTemperature
maximum: 10000
step: 100
unit: "K"
value: Math.max(SessionData.nightModeHighTemperature, SessionData.nightModeTemperature)
visible: SessionData.nightModeAutoEnabled visible: SessionData.nightModeAutoEnabled
options: { onSliderValueChanged: newValue => SessionData.setNightModeHighTemperature(newValue)
var temps = [];
var minTemp = SessionData.nightModeTemperature;
for (var i = Math.max(2500, minTemp); i <= 10000; i += 500) {
temps.push(i + "K");
}
return temps;
}
onValueChanged: value => {
var temp = parseInt(value.replace("K", ""));
if (temp >= SessionData.nightModeTemperature) {
SessionData.setNightModeHighTemperature(temp);
}
}
} }
} }

View File

@@ -59,6 +59,7 @@ Item {
property alias value: slider.value property alias value: slider.value
property alias minimum: slider.minimum property alias minimum: slider.minimum
property alias maximum: slider.maximum property alias maximum: slider.maximum
property alias step: slider.step
property alias unit: slider.unit property alias unit: slider.unit
property alias wheelEnabled: slider.wheelEnabled property alias wheelEnabled: slider.wheelEnabled
property alias thumbOutlineColor: slider.thumbOutlineColor property alias thumbOutlineColor: slider.thumbOutlineColor

View File

@@ -1,5 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Effects
import qs.Common import qs.Common
import qs.Widgets import qs.Widgets
@@ -9,6 +8,7 @@ Item {
property int value: 50 property int value: 50
property int minimum: 0 property int minimum: 0
property int maximum: 100 property int maximum: 100
property int step: 1
property string leftIcon: "" property string leftIcon: ""
property string rightIcon: "" property string rightIcon: ""
property bool enabled: true property bool enabled: true
@@ -29,11 +29,13 @@ Item {
height: 48 height: 48
function updateValueFromPosition(x) { function updateValueFromPosition(x) {
let ratio = Math.max(0, Math.min(1, (x - sliderHandle.width / 2) / (sliderTrack.width - sliderHandle.width))) let ratio = Math.max(0, Math.min(1, (x - sliderHandle.width / 2) / (sliderTrack.width - sliderHandle.width)));
let newValue = Math.round(minimum + ratio * (maximum - minimum)) let rawValue = minimum + ratio * (maximum - minimum);
let newValue = step > 1 ? Math.round(rawValue / step) * step : Math.round(rawValue);
newValue = Math.max(minimum, Math.min(maximum, newValue));
if (newValue !== value) { if (newValue !== value) {
value = newValue value = newValue;
sliderValueChanged(newValue) sliderValueChanged(newValue);
} }
} }
@@ -68,13 +70,12 @@ Item {
height: parent.height height: parent.height
radius: Theme.cornerRadius radius: Theme.cornerRadius
width: { width: {
const ratio = (slider.value - slider.minimum) / (slider.maximum - slider.minimum) const ratio = (slider.value - slider.minimum) / (slider.maximum - slider.minimum);
const travel = sliderTrack.width - sliderHandle.width const travel = sliderTrack.width - sliderHandle.width;
const center = (travel * ratio) + sliderHandle.width / 2 const center = (travel * ratio) + sliderHandle.width / 2;
return Math.max(0, Math.min(sliderTrack.width, center)) return Math.max(0, Math.min(sliderTrack.width, center));
} }
color: slider.enabled ? Theme.primary : Theme.withAlpha(Theme.onSurface, 0.12) color: slider.enabled ? Theme.primary : Theme.withAlpha(Theme.onSurface, 0.12)
} }
StyledRect { StyledRect {
@@ -86,16 +87,15 @@ Item {
height: 24 height: 24
radius: Theme.cornerRadius radius: Theme.cornerRadius
x: { x: {
const ratio = (slider.value - slider.minimum) / (slider.maximum - slider.minimum) const ratio = (slider.value - slider.minimum) / (slider.maximum - slider.minimum);
const travel = sliderTrack.width - width const travel = sliderTrack.width - width;
return Math.max(0, Math.min(travel, travel * ratio)) return Math.max(0, Math.min(travel, travel * ratio));
} }
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: slider.enabled ? Theme.primary : Theme.withAlpha(Theme.onSurface, 0.12) color: slider.enabled ? Theme.primary : Theme.withAlpha(Theme.onSurface, 0.12)
border.width: 3 border.width: 3
border.color: slider.thumbOutlineColor border.color: slider.thumbOutlineColor
StyledRect { StyledRect {
anchors.fill: parent anchors.fill: parent
radius: Theme.cornerRadius radius: Theme.cornerRadius
@@ -126,10 +126,10 @@ Item {
opacity: 0 opacity: 0
function start() { function start() {
opacity = 0.16 opacity = 0.16;
width = 0 width = 0;
height = 0 height = 0;
rippleAnimation.start() rippleAnimation.start();
} }
SequentialAnimation { SequentialAnimation {
@@ -153,12 +153,11 @@ Item {
acceptedButtons: Qt.LeftButton acceptedButtons: Qt.LeftButton
onPressedChanged: { onPressedChanged: {
if (pressed && slider.enabled) { if (pressed && slider.enabled) {
ripple.start() ripple.start();
} }
} }
} }
scale: active ? 1.05 : 1.0 scale: active ? 1.05 : 1.0
Behavior on scale { Behavior on scale {
@@ -189,40 +188,42 @@ Item {
acceptedButtons: Qt.LeftButton acceptedButtons: Qt.LeftButton
onWheel: wheelEvent => { onWheel: wheelEvent => {
if (!slider.wheelEnabled) { if (!slider.wheelEnabled) {
wheelEvent.accepted = false wheelEvent.accepted = false;
return return;
} }
let step = Math.max(0.5, (maximum - minimum) / 100) let wheelStep = slider.step > 1 ? slider.step : Math.max(1, (maximum - minimum) / 100);
let newValue = wheelEvent.angleDelta.y > 0 ? Math.min(maximum, value + step) : Math.max(minimum, value - step) let newValue = wheelEvent.angleDelta.y > 0 ? Math.min(maximum, value + wheelStep) : Math.max(minimum, value - wheelStep);
newValue = Math.round(newValue) if (slider.step > 1)
newValue = Math.round(newValue / slider.step) * slider.step;
newValue = Math.round(newValue);
if (newValue !== value) { if (newValue !== value) {
value = newValue value = newValue;
sliderValueChanged(newValue) sliderValueChanged(newValue);
} }
wheelEvent.accepted = true wheelEvent.accepted = true;
} }
onPressed: mouse => { onPressed: mouse => {
if (slider.enabled) { if (slider.enabled) {
slider.isDragging = true slider.isDragging = true;
sliderMouseArea.isDragging = true sliderMouseArea.isDragging = true;
updateValueFromPosition(mouse.x) updateValueFromPosition(mouse.x);
} }
} }
onReleased: { onReleased: {
if (slider.enabled) { if (slider.enabled) {
slider.isDragging = false slider.isDragging = false;
sliderMouseArea.isDragging = false sliderMouseArea.isDragging = false;
slider.sliderDragFinished(slider.value) slider.sliderDragFinished(slider.value);
} }
} }
onPositionChanged: mouse => { onPositionChanged: mouse => {
if (pressed && slider.isDragging && slider.enabled) { if (pressed && slider.isDragging && slider.enabled) {
updateValueFromPosition(mouse.x) updateValueFromPosition(mouse.x);
} }
} }
onClicked: mouse => { onClicked: mouse => {
if (slider.enabled && !slider.isDragging) { if (slider.enabled && !slider.isDragging) {
updateValueFromPosition(mouse.x) updateValueFromPosition(mouse.x);
} }
} }
} }
@@ -239,7 +240,7 @@ Item {
border.width: 1 border.width: 1
anchors.bottom: parent.top anchors.bottom: parent.top
anchors.bottomMargin: Theme.spacingM anchors.bottomMargin: Theme.spacingM
x: Math.max(0, Math.min(parent.width - width, sliderHandle.x + sliderHandle.width/2 - width/2)) x: Math.max(0, Math.min(parent.width - width, sliderHandle.x + sliderHandle.width / 2 - width / 2))
visible: slider.alwaysShowValue ? slider.showValue : ((sliderMouseArea.containsMouse && slider.showValue) || (slider.isDragging && slider.showValue)) visible: slider.alwaysShowValue ? slider.showValue : ((sliderMouseArea.containsMouse && slider.showValue) || (slider.isDragging && slider.showValue))
opacity: visible ? 1 : 0 opacity: visible ? 1 : 0

View File

@@ -748,6 +748,32 @@
], ],
"description": "Show only workspaces belonging to each specific monitor." "description": "Show only workspaces belonging to each specific monitor."
}, },
{
"section": "reverseScrolling",
"label": "Reverse Scrolling Direction",
"tabIndex": 4,
"category": "Workspaces",
"keywords": [
"desktop",
"direction",
"over",
"panel",
"reverse",
"scroll",
"scrolling",
"spaces",
"statusbar",
"switch",
"taskbar",
"topbar",
"virtual",
"virtual desktops",
"workspace",
"workspaces"
],
"description": "Reverse workspace switch direction when scrolling over the bar",
"conditionKey": "isNiri"
},
{ {
"section": "dwlShowAllTags", "section": "dwlShowAllTags",
"label": "Show All Tags", "label": "Show All Tags",
@@ -793,26 +819,6 @@
"description": "Display only workspaces that contain windows", "description": "Display only workspaces that contain windows",
"conditionKey": "isNiri" "conditionKey": "isNiri"
}, },
{
"section": "reverseScrolling",
"label": "Reverse Scrolling Direction",
"tabIndex": 4,
"category": "Workspaces",
"keywords": [
"active",
"contain",
"desktop",
"desktops",
"scroll",
"scrolling",
"reverse",
"direction",
"windows",
"workspace",
"workspaces"
],
"description": "Display only workspaces that contain windows"
},
{ {
"section": "showWorkspaceApps", "section": "showWorkspaceApps",
"label": "Show Workspace Apps", "label": "Show Workspace Apps",
@@ -1565,24 +1571,6 @@
"theme" "theme"
] ]
}, },
{
"section": "matugenTemplateZenBrowser",
"label": "Zen Browser",
"tabIndex": 10,
"category": "Theme & Colors",
"keywords": [
"appearance",
"colors",
"zen",
"zenbrowser",
"look",
"matugen",
"scheme",
"style",
"template",
"theme"
]
},
{ {
"section": "matugenTemplateGtk", "section": "matugenTemplateGtk",
"label": "GTK", "label": "GTK",
@@ -2360,6 +2348,23 @@
"vesktop" "vesktop"
] ]
}, },
{
"section": "matugenTemplateZenBrowser",
"label": "zenbrowser",
"tabIndex": 10,
"category": "Theme & Colors",
"keywords": [
"appearance",
"colors",
"look",
"matugen",
"scheme",
"style",
"template",
"theme",
"zenbrowser"
]
},
{ {
"section": "lockScreenActiveMonitor", "section": "lockScreenActiveMonitor",
"label": "Active Lock Screen Monitor", "label": "Active Lock Screen Monitor",
@@ -3582,16 +3587,18 @@
"cliphist", "cliphist",
"copy", "copy",
"disable", "disable",
"entirely", "disk",
"history", "history",
"linux", "linux",
"manager", "nothing",
"os", "os",
"paste", "paste",
"system" "saved",
"system",
"works"
], ],
"icon": "tune", "icon": "tune",
"description": "Disable clipboard manager entirely (requires restart)" "description": "Clipboard works but nothing saved to disk"
}, },
{ {
"section": "autoClearDays", "section": "autoClearDays",
@@ -3633,29 +3640,6 @@
"icon": "settings", "icon": "settings",
"description": "Clear all history when server starts" "description": "Clear all history when server starts"
}, },
{
"section": "disableHistory",
"label": "Disable History Persistence",
"tabIndex": 23,
"category": "System",
"keywords": [
"clipboard",
"cliphist",
"copy",
"disable",
"disk",
"history",
"linux",
"nothing",
"os",
"paste",
"persistence",
"saved",
"system",
"works"
],
"description": "Clipboard works but nothing saved to disk"
},
{ {
"section": "maxHistory", "section": "maxHistory",
"label": "History Settings", "label": "History Settings",
@@ -3700,5 +3684,57 @@
"system" "system"
], ],
"description": "Maximum size per clipboard entry" "description": "Maximum size per clipboard entry"
},
{
"section": "nightModeHighTemperature",
"label": "Day Temperature",
"tabIndex": 25,
"category": "Displays",
"keywords": [
"celsius",
"color",
"colour",
"day",
"displays",
"fahrenheit",
"gamma",
"hue",
"kelvin",
"monitor",
"resolution",
"screen",
"temp",
"temperature",
"time",
"tint"
],
"description": "Color temperature for day time"
},
{
"section": "nightModeTemperature",
"label": "Night Temperature",
"tabIndex": 25,
"category": "Displays",
"keywords": [
"blue light",
"celsius",
"color",
"colour",
"displays",
"fahrenheit",
"gamma",
"hue",
"kelvin",
"mode",
"monitor",
"night",
"resolution",
"screen",
"temp",
"temperature",
"tint",
"warm"
],
"description": "Color temperature for night mode"
} }
] ]