From d97392d46e73949122e1a29d62b285809d210aef Mon Sep 17 00:00:00 2001 From: bbedward Date: Wed, 17 Dec 2025 15:34:40 -0500 Subject: [PATCH] clipboard: remove ownership option --- core/cmd/dms/commands_clipboard.go | 10 -- core/internal/server/clipboard/handlers.go | 3 - core/internal/server/clipboard/manager.go | 114 +----------------- .../internal/server/clipboard/manager_test.go | 1 - core/internal/server/clipboard/types.go | 2 - core/internal/server/router.go | 3 - quickshell/Modules/Settings/ClipboardTab.qml | 44 +++++-- 7 files changed, 36 insertions(+), 141 deletions(-) diff --git a/core/cmd/dms/commands_clipboard.go b/core/cmd/dms/commands_clipboard.go index 0c5d985e..e785e4ef 100644 --- a/core/cmd/dms/commands_clipboard.go +++ b/core/cmd/dms/commands_clipboard.go @@ -144,8 +144,6 @@ var ( clipConfigEnabled bool clipConfigDisableHistory bool clipConfigEnableHistory bool - clipConfigDisablePersist bool - clipConfigEnablePersist bool ) func init() { @@ -173,8 +171,6 @@ func init() { clipConfigSetCmd.Flags().BoolVar(&clipConfigEnabled, "enable", false, "Enable clipboard manager") clipConfigSetCmd.Flags().BoolVar(&clipConfigDisableHistory, "disable-history", false, "Disable clipboard history persistence") clipConfigSetCmd.Flags().BoolVar(&clipConfigEnableHistory, "enable-history", false, "Enable clipboard history persistence") - clipConfigSetCmd.Flags().BoolVar(&clipConfigDisablePersist, "disable-persist", false, "Disable clipboard ownership persistence") - clipConfigSetCmd.Flags().BoolVar(&clipConfigEnablePersist, "enable-persist", false, "Enable clipboard ownership persistence") clipWatchCmd.Flags().BoolVarP(&clipWatchStore, "store", "s", false, "Store clipboard changes to history (no server required)") @@ -597,12 +593,6 @@ func runClipConfigSet(cmd *cobra.Command, args []string) { if clipConfigEnableHistory { params["disableHistory"] = false } - if clipConfigDisablePersist { - params["disablePersist"] = true - } - if clipConfigEnablePersist { - params["disablePersist"] = false - } if len(params) == 0 { fmt.Println("No config options specified") diff --git a/core/internal/server/clipboard/handlers.go b/core/internal/server/clipboard/handlers.go index 4f37f89e..8901126c 100644 --- a/core/internal/server/clipboard/handlers.go +++ b/core/internal/server/clipboard/handlers.go @@ -208,9 +208,6 @@ func handleSetConfig(conn net.Conn, req models.Request, m *Manager) { if v, ok := req.Params["disableHistory"].(bool); ok { cfg.DisableHistory = v } - if v, ok := req.Params["disablePersist"].(bool); ok { - cfg.DisablePersist = v - } if err := m.SetConfig(cfg); err != nil { models.RespondError(conn, req.ID, err.Error()) diff --git a/core/internal/server/clipboard/manager.go b/core/internal/server/clipboard/manager.go index ccd2c525..5eb613b0 100644 --- a/core/internal/server/clipboard/manager.go +++ b/core/internal/server/clipboard/manager.go @@ -319,10 +319,6 @@ func (m *Manager) readAndStore(r *os.File, mimeType string) { m.storeClipboardEntry(data, mimeType) } - if !cfg.DisablePersist { - m.persistClipboard([]string{mimeType}, map[string][]byte{mimeType: data}) - } - m.updateState() m.notifySubscribers() } @@ -348,105 +344,6 @@ func (m *Manager) storeClipboardEntry(data []byte, mimeType string) { } } -func (m *Manager) persistClipboard(mimeTypes []string, data map[string][]byte) { - m.persistMutex.Lock() - m.persistMimeTypes = mimeTypes - m.persistData = data - m.persistMutex.Unlock() - - m.post(func() { - m.takePersistOwnership() - }) -} - -func (m *Manager) takePersistOwnership() { - if m.dataControlMgr == nil || m.dataDevice == nil { - return - } - - if m.getConfig().DisablePersist { - return - } - - m.persistMutex.RLock() - mimeTypes := m.persistMimeTypes - m.persistMutex.RUnlock() - - if len(mimeTypes) == 0 { - return - } - - dataMgr := m.dataControlMgr.(*ext_data_control.ExtDataControlManagerV1) - - source, err := dataMgr.CreateDataSource() - if err != nil { - log.Errorf("Failed to create persist source: %v", err) - return - } - - for _, mime := range mimeTypes { - if err := source.Offer(mime); err != nil { - log.Errorf("Failed to offer mime type %s: %v", mime, err) - } - } - - source.SetSendHandler(func(e ext_data_control.ExtDataControlSourceV1SendEvent) { - fd := e.Fd - defer syscall.Close(fd) - - m.persistMutex.RLock() - d := m.persistData[e.MimeType] - m.persistMutex.RUnlock() - - if len(d) == 0 { - return - } - - file := os.NewFile(uintptr(fd), "clipboard-pipe") - defer file.Close() - file.Write(d) - }) - - source.SetCancelledHandler(func(e ext_data_control.ExtDataControlSourceV1CancelledEvent) { - m.ownerLock.Lock() - m.isOwner = false - m.ownerLock.Unlock() - }) - - if m.currentSource != nil { - oldSource := m.currentSource.(*ext_data_control.ExtDataControlSourceV1) - oldSource.Destroy() - } - m.currentSource = source - - device := m.dataDevice.(*ext_data_control.ExtDataControlDeviceV1) - if err := device.SetSelection(source); err != nil { - log.Errorf("Failed to set persist selection: %v", err) - return - } - - m.ownerLock.Lock() - m.isOwner = true - m.ownerLock.Unlock() -} - -func (m *Manager) releaseOwnership() { - m.ownerLock.Lock() - m.isOwner = false - m.ownerLock.Unlock() - - m.persistMutex.Lock() - m.persistData = nil - m.persistMimeTypes = nil - m.persistMutex.Unlock() - - if m.currentSource != nil { - source := m.currentSource.(*ext_data_control.ExtDataControlSourceV1) - source.Destroy() - m.currentSource = nil - } -} - func (m *Manager) storeEntry(entry Entry) error { if m.db == nil { return fmt.Errorf("database not available") @@ -495,6 +392,9 @@ func (m *Manager) deduplicateInTx(b *bolt.Bucket, hash uint64) error { } func (m *Manager) trimLengthInTx(b *bolt.Bucket) error { + if m.config.MaxHistory < 0 { + return nil + } c := b.Cursor() var count int for k, _ := c.Last(); k != nil; k, _ = c.Prev() { @@ -1309,13 +1209,7 @@ func (m *Manager) applyConfigChange(newCfg Config) { } } - if newCfg.DisablePersist && !oldCfg.DisablePersist { - log.Info("Clipboard persist disabled, releasing ownership") - m.releaseOwnership() - } - - log.Infof("Clipboard config reloaded: disableHistory=%v disablePersist=%v", - newCfg.DisableHistory, newCfg.DisablePersist) + log.Infof("Clipboard config reloaded: disableHistory=%v", newCfg.DisableHistory) m.updateState() m.notifySubscribers() diff --git a/core/internal/server/clipboard/manager_test.go b/core/internal/server/clipboard/manager_test.go index 56e9e05a..a1600742 100644 --- a/core/internal/server/clipboard/manager_test.go +++ b/core/internal/server/clipboard/manager_test.go @@ -458,7 +458,6 @@ func TestDefaultConfig(t *testing.T) { assert.False(t, cfg.ClearAtStartup) assert.False(t, cfg.Disabled) assert.False(t, cfg.DisableHistory) - assert.True(t, cfg.DisablePersist) } func TestManager_PostDelegatesToWlContext(t *testing.T) { diff --git a/core/internal/server/clipboard/types.go b/core/internal/server/clipboard/types.go index 232677a5..d92b18c9 100644 --- a/core/internal/server/clipboard/types.go +++ b/core/internal/server/clipboard/types.go @@ -21,7 +21,6 @@ type Config struct { Disabled bool `json:"disabled"` DisableHistory bool `json:"disableHistory"` - DisablePersist bool `json:"disablePersist"` } func DefaultConfig() Config { @@ -30,7 +29,6 @@ func DefaultConfig() Config { MaxEntrySize: 5 * 1024 * 1024, AutoClearDays: 0, ClearAtStartup: false, - DisablePersist: true, } } diff --git a/core/internal/server/router.go b/core/internal/server/router.go index de443389..44828b55 100644 --- a/core/internal/server/router.go +++ b/core/internal/server/router.go @@ -204,9 +204,6 @@ func handleClipboardSetConfig(conn net.Conn, req models.Request) { if v, ok := req.Params["disableHistory"].(bool); ok { cfg.DisableHistory = v } - if v, ok := req.Params["disablePersist"].(bool); ok { - cfg.DisablePersist = v - } if err := clipboard.SaveConfig(cfg); err != nil { models.RespondError(conn, req.ID, err.Error()) diff --git a/quickshell/Modules/Settings/ClipboardTab.qml b/quickshell/Modules/Settings/ClipboardTab.qml index b73a36c9..a1d6e302 100644 --- a/quickshell/Modules/Settings/ClipboardTab.qml +++ b/quickshell/Modules/Settings/ClipboardTab.qml @@ -34,8 +34,36 @@ Item { value: 500 }, { - text: "1000", + text: "1,000", value: 1000 + }, + { + text: "10,000", + value: 10000 + }, + { + text: "15,000", + value: 15000 + }, + { + text: "20,000", + value: 20000 + }, + { + text: "30,000", + value: 30000 + }, + { + text: "50,000", + value: 50000 + }, + { + text: "100,000", + value: 100000 + }, + { + text: "∞", + value: -1 } ] @@ -98,11 +126,13 @@ Item { ] function getMaxHistoryText(value) { + if (value <= 0) + return "∞"; for (let opt of maxHistoryOptions) { if (opt.value === value) return opt.text; } - return String(value); + return value.toLocaleString(); } function getMaxEntrySizeText(value) { @@ -312,16 +342,6 @@ Item { checked: root.config.disableHistory ?? false onToggled: checked => root.saveConfig("disableHistory", checked) } - - SettingsToggleRow { - tab: "clipboard" - tags: ["clipboard", "disable", "persist", "ownership"] - settingKey: "disablePersist" - text: I18n.tr("Disable Clipboard Ownership") - description: I18n.tr("Don't preserve clipboard when apps close") - checked: root.config.disablePersist ?? true - onToggled: checked => root.saveConfig("disablePersist", checked) - } } } }