From 597e21d44d6674ac0c6e0d6635bfc29e587d49e9 Mon Sep 17 00:00:00 2001 From: bbedward Date: Thu, 11 Dec 2025 11:10:27 -0500 Subject: [PATCH] clipboard: remove wl-copy references --- core/cmd/dms/commands_colorpicker.go | 12 +++-------- core/cmd/dms/commands_screenshot.go | 6 ++---- core/internal/distros/arch.go | 2 -- core/internal/distros/base.go | 20 ------------------- core/internal/distros/debian.go | 1 - core/internal/distros/fedora.go | 2 -- core/internal/distros/gentoo.go | 1 - core/internal/distros/opensuse.go | 2 -- core/internal/distros/ubuntu.go | 2 -- quickshell/Modals/DankColorPickerModal.qml | 6 +++--- .../ProcessList/ProcessContextMenu.qml | 15 ++------------ quickshell/Modules/Toast.qml | 2 +- .../ExampleEmojiPlugin/EmojiWidget.qml | 2 +- .../PLUGINS/ExampleEmojiPlugin/README.md | 6 +----- .../LauncherExampleLauncher.qml | 2 +- quickshell/PLUGINS/README.md | 18 ++++++++--------- 16 files changed, 22 insertions(+), 77 deletions(-) diff --git a/core/cmd/dms/commands_colorpicker.go b/core/cmd/dms/commands_colorpicker.go index ae38b2dd..87489e36 100644 --- a/core/cmd/dms/commands_colorpicker.go +++ b/core/cmd/dms/commands_colorpicker.go @@ -3,8 +3,8 @@ package main import ( "fmt" "os" - "os/exec" + "github.com/AvengeMedia/DankMaterialShell/core/internal/clipboard" "github.com/AvengeMedia/DankMaterialShell/core/internal/colorpicker" "github.com/spf13/cobra" ) @@ -121,13 +121,7 @@ func runColorPick(cmd *cobra.Command, args []string) { } func copyToClipboard(text string) { - var cmd *exec.Cmd - if _, err := exec.LookPath("wl-copy"); err == nil { - cmd = exec.Command("wl-copy", text) - } else { - fmt.Fprintln(os.Stderr, "wl-copy not found, cannot copy to clipboard") - return + if err := clipboard.CopyText(text); err != nil { + fmt.Fprintln(os.Stderr, "clipboard copy failed:", err) } - - _ = cmd.Run() } diff --git a/core/cmd/dms/commands_screenshot.go b/core/cmd/dms/commands_screenshot.go index 1e16c8f5..61e56811 100644 --- a/core/cmd/dms/commands_screenshot.go +++ b/core/cmd/dms/commands_screenshot.go @@ -4,10 +4,10 @@ import ( "bytes" "fmt" "os" - "os/exec" "path/filepath" "strings" + "github.com/AvengeMedia/DankMaterialShell/core/internal/clipboard" "github.com/AvengeMedia/DankMaterialShell/core/internal/screenshot" "github.com/spf13/cobra" ) @@ -257,9 +257,7 @@ func copyImageToClipboard(buf *screenshot.ShmBuffer, format screenshot.Format, q } } - cmd := exec.Command("wl-copy", "--type", mimeType) - cmd.Stdin = &data - return cmd.Run() + return clipboard.Copy(data.Bytes(), mimeType) } func writeImageToStdout(buf *screenshot.ShmBuffer, format screenshot.Format, quality int, pixelFormat uint32) error { diff --git a/core/internal/distros/arch.go b/core/internal/distros/arch.go index dde0b9cd..eff37665 100644 --- a/core/internal/distros/arch.go +++ b/core/internal/distros/arch.go @@ -103,10 +103,8 @@ func (a *ArchDistribution) DetectDependenciesWithTerminal(ctx context.Context, w dependencies = append(dependencies, a.detectXwaylandSatellite()) } - // Base detections (common across distros) dependencies = append(dependencies, a.detectMatugen()) dependencies = append(dependencies, a.detectDgop()) - dependencies = append(dependencies, a.detectClipboardTools()...) return dependencies, nil } diff --git a/core/internal/distros/base.go b/core/internal/distros/base.go index bcaa1a8a..58b58098 100644 --- a/core/internal/distros/base.go +++ b/core/internal/distros/base.go @@ -185,26 +185,6 @@ func (b *BaseDistribution) detectSpecificTerminal(terminal deps.Terminal) deps.D } } -func (b *BaseDistribution) detectClipboardTools() []deps.Dependency { - var dependencies []deps.Dependency - - wlClipboard := deps.StatusMissing - if b.commandExists("wl-copy") && b.commandExists("wl-paste") { - wlClipboard = deps.StatusInstalled - } - - dependencies = append(dependencies, - deps.Dependency{ - Name: "wl-clipboard", - Status: wlClipboard, - Description: "Wayland clipboard utilities", - Required: true, - }, - ) - - return dependencies -} - func (b *BaseDistribution) detectHyprlandTools() []deps.Dependency { var dependencies []deps.Dependency diff --git a/core/internal/distros/debian.go b/core/internal/distros/debian.go index 7bbde1e5..8b1fed99 100644 --- a/core/internal/distros/debian.go +++ b/core/internal/distros/debian.go @@ -69,7 +69,6 @@ func (d *DebianDistribution) DetectDependenciesWithTerminal(ctx context.Context, dependencies = append(dependencies, d.detectMatugen()) dependencies = append(dependencies, d.detectDgop()) - dependencies = append(dependencies, d.detectClipboardTools()...) return dependencies, nil } diff --git a/core/internal/distros/fedora.go b/core/internal/distros/fedora.go index f73d4dad..3499630f 100644 --- a/core/internal/distros/fedora.go +++ b/core/internal/distros/fedora.go @@ -88,10 +88,8 @@ func (f *FedoraDistribution) DetectDependenciesWithTerminal(ctx context.Context, dependencies = append(dependencies, f.detectXwaylandSatellite()) } - // Base detections (common across distros) dependencies = append(dependencies, f.detectMatugen()) dependencies = append(dependencies, f.detectDgop()) - dependencies = append(dependencies, f.detectClipboardTools()...) return dependencies, nil } diff --git a/core/internal/distros/gentoo.go b/core/internal/distros/gentoo.go index 93f430ea..05eecafb 100644 --- a/core/internal/distros/gentoo.go +++ b/core/internal/distros/gentoo.go @@ -107,7 +107,6 @@ func (g *GentooDistribution) DetectDependenciesWithTerminal(ctx context.Context, dependencies = append(dependencies, g.detectMatugen()) dependencies = append(dependencies, g.detectDgop()) - dependencies = append(dependencies, g.detectClipboardTools()...) return dependencies, nil } diff --git a/core/internal/distros/opensuse.go b/core/internal/distros/opensuse.go index b3d3dda6..0a141be5 100644 --- a/core/internal/distros/opensuse.go +++ b/core/internal/distros/opensuse.go @@ -78,10 +78,8 @@ func (o *OpenSUSEDistribution) DetectDependenciesWithTerminal(ctx context.Contex dependencies = append(dependencies, o.detectXwaylandSatellite()) } - // Base detections (common across distros) dependencies = append(dependencies, o.detectMatugen()) dependencies = append(dependencies, o.detectDgop()) - dependencies = append(dependencies, o.detectClipboardTools()...) return dependencies, nil } diff --git a/core/internal/distros/ubuntu.go b/core/internal/distros/ubuntu.go index 68223bbd..1fc32831 100644 --- a/core/internal/distros/ubuntu.go +++ b/core/internal/distros/ubuntu.go @@ -76,10 +76,8 @@ func (u *UbuntuDistribution) DetectDependenciesWithTerminal(ctx context.Context, dependencies = append(dependencies, u.detectXwaylandSatellite()) } - // Base detections (common across distros) dependencies = append(dependencies, u.detectMatugen()) dependencies = append(dependencies, u.detectDgop()) - dependencies = append(dependencies, u.detectClipboardTools()...) return dependencies, nil } diff --git a/quickshell/Modals/DankColorPickerModal.qml b/quickshell/Modals/DankColorPickerModal.qml index c7f57739..13b3ddcd 100644 --- a/quickshell/Modals/DankColorPickerModal.qml +++ b/quickshell/Modals/DankColorPickerModal.qml @@ -54,7 +54,7 @@ DankModal { } function copyColorToClipboard(colorValue) { - Quickshell.execDetached(["sh", "-c", `echo -n "${colorValue}" | wl-copy`]); + Quickshell.execDetached(["dms", "cl", "copy", colorValue]); ToastService.showInfo(`Color ${colorValue} copied`); SessionData.addRecentColor(currentColor); } @@ -614,7 +614,7 @@ DankModal { } else { rgbString = `rgb(${r}, ${g}, ${b})`; } - Quickshell.execDetached(["sh", "-c", `echo -n "${rgbString}" | wl-copy`]); + Quickshell.execDetached(["dms", "cl", "copy", rgbString]); ToastService.showInfo(`${rgbString} copied`); } } @@ -678,7 +678,7 @@ DankModal { } else { hsvString = `${h}, ${s}, ${v}`; } - Quickshell.execDetached(["sh", "-c", `echo -n "${hsvString}" | wl-copy`]); + Quickshell.execDetached(["dms", "cl", "copy", hsvString]); ToastService.showInfo(`HSV ${hsvString} copied`); } } diff --git a/quickshell/Modules/ProcessList/ProcessContextMenu.qml b/quickshell/Modules/ProcessList/ProcessContextMenu.qml index 6e8125cf..29153366 100644 --- a/quickshell/Modules/ProcessList/ProcessContextMenu.qml +++ b/quickshell/Modules/ProcessList/ProcessContextMenu.qml @@ -1,9 +1,7 @@ import QtQuick import QtQuick.Controls import Quickshell -import Quickshell.Io import qs.Common -import qs.Services import qs.Widgets Popup { @@ -99,13 +97,11 @@ Popup { cursorShape: Qt.PointingHandCursor onClicked: { if (processContextMenu.processData) { - Quickshell.execDetached(["wl-copy", processContextMenu.processData.pid.toString()]); + Quickshell.execDetached(["dms", "cl", "copy", processContextMenu.processData.pid.toString()]); } - processContextMenu.close(); } } - } Rectangle { @@ -133,12 +129,11 @@ Popup { onClicked: { if (processContextMenu.processData) { const processName = processContextMenu.processData.displayName || processContextMenu.processData.command; - Quickshell.execDetached(["wl-copy", processName]); + Quickshell.execDetached(["dms", "cl", "copy", processName]); } processContextMenu.close(); } } - } Rectangle { @@ -153,7 +148,6 @@ Popup { height: 1 color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) } - } Rectangle { @@ -189,7 +183,6 @@ Popup { processContextMenu.close(); } } - } Rectangle { @@ -225,11 +218,7 @@ Popup { processContextMenu.close(); } } - } - } - } - } diff --git a/quickshell/Modules/Toast.qml b/quickshell/Modules/Toast.qml index 42cd4318..bbead194 100644 --- a/quickshell/Modules/Toast.qml +++ b/quickshell/Modules/Toast.qml @@ -293,7 +293,7 @@ PanelWindow { property bool showTooltip: false onClicked: { - Quickshell.execDetached(["wl-copy", ToastService.currentCommand]); + Quickshell.execDetached(["dms", "cl", "copy", ToastService.currentCommand]); showTooltip = true; tooltipTimer.start(); } diff --git a/quickshell/PLUGINS/ExampleEmojiPlugin/EmojiWidget.qml b/quickshell/PLUGINS/ExampleEmojiPlugin/EmojiWidget.qml index 8fbf629f..6142692e 100644 --- a/quickshell/PLUGINS/ExampleEmojiPlugin/EmojiWidget.qml +++ b/quickshell/PLUGINS/ExampleEmojiPlugin/EmojiWidget.qml @@ -135,7 +135,7 @@ PluginComponent { cursorShape: Qt.PointingHandCursor onClicked: { - Quickshell.execDetached(["sh", "-c", "echo -n '" + modelData + "' | wl-copy"]) + Quickshell.execDetached(["dms", "cl", "copy", modelData]) ToastService.showInfo("Copied " + modelData + " to clipboard") popoutColumn.closePopout() } diff --git a/quickshell/PLUGINS/ExampleEmojiPlugin/README.md b/quickshell/PLUGINS/ExampleEmojiPlugin/README.md index 8a8f3554..9102dda5 100644 --- a/quickshell/PLUGINS/ExampleEmojiPlugin/README.md +++ b/quickshell/PLUGINS/ExampleEmojiPlugin/README.md @@ -6,7 +6,7 @@ An example dms plugin that displays cycling emojis in your bar with an emoji pic - **Cycling Emojis**: Automatically rotates through your selected emoji set in the bar - **Emoji Picker**: Click the widget to open a grid of 120+ emojis -- **Copy to Clipboard**: Click any emoji in the picker to copy it to clipboard (uses `wl-copy`) +- **Copy to Clipboard**: Click any emoji in the picker to copy it to clipboard - **Customizable**: Choose emoji sets, cycle speed, and max emojis shown ## Installation @@ -38,10 +38,6 @@ How many emojis to display at once (1-8) **Click the widget**: Opens emoji picker with 120+ emojis **Click any emoji**: Copies it to clipboard and shows toast -## Requirements - -- `wl-copy` (for clipboard support on Wayland) - ## Example Code Highlights This plugin demonstrates: diff --git a/quickshell/PLUGINS/LauncherExample/LauncherExampleLauncher.qml b/quickshell/PLUGINS/LauncherExample/LauncherExampleLauncher.qml index 7d1db840..81040b67 100644 --- a/quickshell/PLUGINS/LauncherExample/LauncherExampleLauncher.qml +++ b/quickshell/PLUGINS/LauncherExample/LauncherExampleLauncher.qml @@ -119,7 +119,7 @@ Item { } function copyToClipboard(text) { - Quickshell.execDetached(["sh", "-c", "echo -n '" + text + "' | wl-copy"]) + Quickshell.execDetached(["dms", "cl", "copy", text]) showToast("Copied to clipboard: " + text) } diff --git a/quickshell/PLUGINS/README.md b/quickshell/PLUGINS/README.md index b65fbaa0..202cf4f7 100644 --- a/quickshell/PLUGINS/README.md +++ b/quickshell/PLUGINS/README.md @@ -91,7 +91,7 @@ The manifest file defines plugin metadata and configuration. - `icon`: Material Design icon name (displayed in UI) - `settings`: Path to settings component (enables settings UI) - `requires_dms`: Minimum DMS version requirement (e.g., ">=0.1.18", ">0.1.0") -- `requires`: Array of required system tools/dependencies (e.g., ["wl-copy", "curl"]) +- `requires`: Array of required system tools/dependencies (e.g., ["curl", "jq"]) - `permissions`: Required DMS permissions (e.g., ["settings_read", "settings_write"]) **Permissions:** @@ -860,11 +860,11 @@ Or edit `$CONFIGPATH/quickshell/dms/config.json`: ## Clipboard Access -Plugins that need to copy text to the clipboard **must** use the Wayland clipboard utility `wl-copy` through Quickshell's `execDetached` function. +Plugins that need to copy text to the clipboard should use the built-in `dms cl copy` command through Quickshell's `execDetached` function. ### Correct Method -Import Quickshell and use `execDetached` with `wl-copy`: +Import Quickshell and use `execDetached` with `dms cl copy`: ```qml import QtQuick @@ -872,19 +872,19 @@ import Quickshell Item { function copyToClipboard(text) { - Quickshell.execDetached(["sh", "-c", "echo -n '" + text + "' | wl-copy"]) + Quickshell.execDetached(["dms", "cl", "copy", text]) } } ``` ### Example Usage -From the ExampleEmojiPlugin (EmojiWidget.qml:136): +From the ExampleEmojiPlugin (EmojiWidget.qml): ```qml MouseArea { onClicked: { - Quickshell.execDetached(["sh", "-c", "echo -n '" + modelData + "' | wl-copy"]) + Quickshell.execDetached(["dms", "cl", "copy", modelData]) ToastService.showInfo("Copied " + modelData + " to clipboard") popoutColumn.closePopout() } @@ -895,13 +895,11 @@ MouseArea { 1. **Do NOT** use `globalThis.clipboard` or similar JavaScript APIs - they don't exist in the QML runtime 2. **Always** import `Quickshell` at the top of your QML file -3. **Use** `echo -n` to prevent adding a trailing newline to the clipboard content -4. The `-c` flag for `sh` is required to execute the pipe command properly -5. Consider showing a toast notification to confirm the copy action to users +3. Consider showing a toast notification to confirm the copy action to users ### Dependencies -This method requires `wl-copy` from the `wl-clipboard` package, which is standard on Wayland systems. +This method uses the built-in DMS clipboard functionality which has native Wayland support. ## Running External Commands