1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-08 12:13:31 -04:00
Files
DankMaterialShell/quickshell/PLUGINS/ExampleCompositePlugin/README.md
T
bbedward bcb5617194 plugins: add support for composite plugins
- single plugin can register multiple types - e.g. daemon, bar widget,
  desktop widget
2026-06-05 10:33:34 -04:00

2.2 KiB

Composite Example

A single plugin that provides all three surfaces at once by combining three of the standalone example plugins:

Surface Source example File
daemon WallpaperWatcherDaemon CompositeDaemon.qml
widget Emoji Cycler (bar widget + popout) CompositeBarWidget.qml
desktop Desktop Clock CompositeDesktopWidget.qml

It demonstrates the components manifest map, where each surface points at its own QML file:

"type": "composite",
"components": {
    "daemon":  "./CompositeDaemon.qml",
    "widget":  "./CompositeBarWidget.qml",
    "desktop": "./CompositeDesktopWidget.qml"
}

All surfaces share one settings UI (CompositeSettings.qml) and one plugin-settings namespace (exampleComposite), so pluginData is the same for every surface.

Surfaces

  • Daemon — watches SessionData.wallpaperPath and runs a user-configured script on change. Also registers an IpcHandler (target: "compositeExample") exposing a runHook call, so you can trigger the hook over IPC.
  • Bar widget — cycles emojis in the bar; click the pill for an emoji picker popout that copies to the clipboard.
  • Desktop widget — an analog/digital clock you can drag and resize on the desktop.

Usage

  1. Copy this directory into $CONFIGPATH/DankMaterialShell/plugins/.
  2. Settings → Plugins → Scan for Plugins, then enable Composite Example. (Composite plugins respect the enable toggle — unlike a pure desktop plugin they do not auto-load, because they also carry a daemon.)
  3. Add the bar widget via Settings → Appearance → DankBar Layout.
  4. Place the desktop clock via Settings → Desktop Widgets.

Notes

  • The daemon surface is instantiated once and lives for as long as the plugin is enabled. The bar and desktop surfaces are instantiated per bar/placement per screen.
  • Cross-surface runtime state (not needed here) is best shared via PluginService.getGlobalVar / setGlobalVar or the daemon instance, since each surface is a separate object.
  • requires_dms is >=1.5.0 because the components multi-surface manifest is only understood by DMS 1.5.0 and later.