# 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:

```json
"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.
