From 8a3bb49fdbfac8ff30b06d7f866ab2ee71308b8a Mon Sep 17 00:00:00 2001 From: ProfiDev <92174452+Profiidev@users.noreply.github.com> Date: Wed, 22 Jul 2026 05:57:54 +0200 Subject: [PATCH] feat: add hypr-screen-mirror (#66) * feat(hypr-screen-mirror): setup plugin * feat(hypr-screen-mirror): added socat watch on hyprland socket for monitor change * feat(hypr-screen-mirror): added hyprctl commands for starting and stopping mirroring * fix(hypr-screen-mirror): check if a mirror is active from monitor output during monitor update * doc(hypr-screen-mirror): plugin readme and image * fix(hypr-screen-mirror): issues from review * fix(hypr-screen-mirror): separate observed state from mirror actions --------- Co-authored-by: Lemmy --- hypr-screen-mirror/README.md | 35 +++++ hypr-screen-mirror/panel.luau | 88 +++++++++++ hypr-screen-mirror/plugin.toml | 33 ++++ hypr-screen-mirror/service.luau | 201 ++++++++++++++++++++++++ hypr-screen-mirror/thumbnail.webp | Bin 0 -> 47364 bytes hypr-screen-mirror/translations/en.json | 27 ++++ hypr-screen-mirror/widget.luau | 14 ++ 7 files changed, 398 insertions(+) create mode 100644 hypr-screen-mirror/README.md create mode 100644 hypr-screen-mirror/panel.luau create mode 100644 hypr-screen-mirror/plugin.toml create mode 100644 hypr-screen-mirror/service.luau create mode 100644 hypr-screen-mirror/thumbnail.webp create mode 100644 hypr-screen-mirror/translations/en.json create mode 100644 hypr-screen-mirror/widget.luau diff --git a/hypr-screen-mirror/README.md b/hypr-screen-mirror/README.md new file mode 100644 index 0000000..b482f56 --- /dev/null +++ b/hypr-screen-mirror/README.md @@ -0,0 +1,35 @@ +# Hypr Screen Mirror + +This plugin allows you to easily toggle screen mirroring in Hyprland. + +## Plugin + +| Field | Value | +| ------- | -------------------------------------------------------- | +| ID | `profidev/hypr-screen-mirror` | +| Entries | Bar widget: `widget`; panel: `panel`; service: `service` | + +## Requirements + +- `hyprctl` available on `PATH` (used to control Hyprland and query monitor information) +- `socat` available on `PATH` (used to watch Hyprland socket for monitor events) + +## Usage + +1. Add the widget to your bar +2. Open the panel and select your source and target monitors for mirroring +3. Click on "Mirror" to start mirroring, or "Stop" to stop mirroring + +```sh +noctalia msg panel-toggle profidev/hypr-screen-mirror:panel +``` + +## Settings + +| Setting | Type | Default | Description | +| ------- | ------- | -------------- | ------------------------------- | +| `glyph` | `glyph` | `screen-share` | The glyph to display in the bar | + +## Notes + +- Only supports Hyprland 0.55.0 or newer, as it relies on the `hyprctl eval` command to execute lua code for mirroring. diff --git a/hypr-screen-mirror/panel.luau b/hypr-screen-mirror/panel.luau new file mode 100644 index 0000000..a0914c5 --- /dev/null +++ b/hypr-screen-mirror/panel.luau @@ -0,0 +1,88 @@ +function tr(key) + return noctalia.tr(key) +end + +local function render() + local monitors = noctalia.state.get("monitors") or {} + local focusedMonitor = noctalia.state.get("focusedMonitor") + local sourceMonitor = noctalia.state.get("sourceMonitor") + local targetMonitor = noctalia.state.get("targetMonitor") + local isMirroring = noctalia.state.get("isMirroring") + + local buttonColor = isMirroring and "destructive" or "primary" + local buttonGlyph = isMirroring and "player-stop" or "player-play" + local buttonText = isMirroring and tr("panel.stop_mirroring") or tr("panel.start_mirroring") + + panel.render(ui.column({ flexGrow = 1, gap = 8 }, { + ui.row({ align = "center", justify = "space-between", gap = 8 }, { + ui.label({ text = tr("panel.title"), fontSize = 14, fontWeight = "bold", color = "primary", flexGrow = 1 }), + ui.button({ glyph = "close", onClick = "onCloseClicked" }), + }), + ui.row({ align = "center", justify = "space-between", gap = 8 }, { + ui.label({ text = tr("panel.focused_monitor") .. ":" , fontSize = 14, color = "on_surface_variant", flexGrow = 1 }), + ui.label({ text = focusedMonitor, fontSize = 14, color = "on_surface" }), + }), + ui.column({ gap = 4 }, { + ui.label({ text = tr("panel.source_monitor"), fontSize = 14, color = "on_surface_variant" }), + ui.select({ options = monitors, onChange = "onSourceChange", selectedIndex = sourceMonitor, enabled = not isMirroring }), + }), + ui.column({ gap = 4 }, { + ui.label({ text = tr("panel.target_monitor"), fontSize = 14, color = "on_surface_variant" }), + ui.select({ options = monitors, onChange = "onTargetChange", selectedIndex = targetMonitor, enabled = not isMirroring }), + }), + ui.row({ align = "center", justify = "space-between", gap = 8 }, { + ui.button({ text = tr("panel.refresh"), glyph = "refresh", onClick = "onRefreshClicked", flexGrow = 1 }), + ui.button({ text = buttonText, glyph = buttonGlyph, onClick = "onStartMirroringClicked", flexGrow = 1, variant = buttonColor, enabled = sourceMonitor ~= nil and targetMonitor ~= nil and sourceMonitor ~= targetMonitor }), + }), + })) +end + +function onOpen(_context) + render() +end + +function onCloseClicked() + panel.close() +end + +function onSourceChange(selected) + noctalia.state.set("sourceMonitor", tonumber(selected)) + render() +end + +function onTargetChange(selected) + noctalia.state.set("targetMonitor", tonumber(selected)) + render() +end + +function onRefreshClicked() + noctalia.state.set("monitor_refresh", os.clock()) +end + +function onStartMirroringClicked() + noctalia.state.set("mirrorRequest", { + enabled = not noctalia.state.get("isMirroring"), + sourceMonitor = noctalia.state.get("sourceMonitor"), + targetMonitor = noctalia.state.get("targetMonitor"), + }) +end + +noctalia.state.watch("monitors", function() + render() +end) + +noctalia.state.watch("focusedMonitor", function() + render() +end) + +noctalia.state.watch("sourceMonitor", function() + render() +end) + +noctalia.state.watch("targetMonitor", function() + render() +end) + +noctalia.state.watch("isMirroring", function() + render() +end) diff --git a/hypr-screen-mirror/plugin.toml b/hypr-screen-mirror/plugin.toml new file mode 100644 index 0000000..7cfee70 --- /dev/null +++ b/hypr-screen-mirror/plugin.toml @@ -0,0 +1,33 @@ +id = "profidev/hypr-screen-mirror" +name = "Hypr-Screen-Mirror" +version = "0.1.0" +plugin_api = 5 +author = "profidev" +license = "MIT" +dependencies = ["hyprctl", "socat"] +tags = ["utility", "hyprland"] +icon = "screen-share" +description = "A plugin to quickly enable and disable screen mirroring in Hyprland." + +[[widget]] +id = "widget" +entry = "widget.luau" + + [[widget.setting]] + key = "glyph" + type = "glyph" + label_key = "widget.glyph.label" + description_key = "widget.glyph.description" + default = "screen-share" + +[[panel]] +id = "panel" +entry = "panel.luau" +width = 300 +height = 265 +placement = "floating" +position = "center" + +[[service]] +id = "service" +entry = "service.luau" diff --git a/hypr-screen-mirror/service.luau b/hypr-screen-mirror/service.luau new file mode 100644 index 0000000..ea21e5a --- /dev/null +++ b/hypr-screen-mirror/service.luau @@ -0,0 +1,201 @@ +function tr(key) + return noctalia.tr(key) +end + +local function shellQuote(s) + return "'" .. tostring(s):gsub("'", "'\\''") .. "'" +end + +-- This could be replaced by noctalia.outputs() and noctalia.focusedOutputName() but currently the focusedOutputName() function returns nil when testing so we can't use it +local function updateMonitors() + noctalia.runAsync("hyprctl monitors all -j", function(output) + if output.timedOut or output.exitCode ~= 0 then + noctalia.notify(tr("notification.monitor_list_failed"), output.stderr or tr("notification.timed_out")) + return + end + + local ok, msg = pcall(noctalia.json.decode, output.stdout) + if not ok or type(msg) ~= "table" then + noctalia.notify(tr("notification.monitor_list_failed"), msg) + return + end + + local monitors = {} + local focusedMonitor = nil + for i, monitor in ipairs(msg) do + monitors[i] = monitor.name + focusedMonitor = monitor.focused and monitor.name or focusedMonitor + end + + if #monitors == 0 then + noctalia.notify(tr("notification.monitor_list_failed"), tr("notification.no_monitors_found")) + return + end + + -- update monitor data + noctalia.state.set("monitors", monitors) + noctalia.state.set("focusedMonitor", focusedMonitor) + + -- update source and target monitor indices if they are out of bounds or not set + local sourceMonitor = tonumber(noctalia.state.get("sourceMonitor")) or 0 + local targetMonitor = tonumber(noctalia.state.get("targetMonitor")) or 0 + local isMirroring = false + + if sourceMonitor >= #monitors then + sourceMonitor = 0 + end + if targetMonitor >= #monitors then + targetMonitor = 0 + end + + -- check if there is an active mirror and set the source and target monitors accordingly + for _, monitor in ipairs(msg) do + if monitor.mirrorOf == "none" then + continue + end + + local mirrorId = tonumber(monitor.mirrorOf) + local targetIndex = table.find(monitors, monitor.name) + if mirrorId ~= nil and targetIndex ~= nil then + for _, source in ipairs(msg) do + if tonumber(source.id) == mirrorId then + local sourceIndex = table.find(monitors, source.name) + if sourceIndex ~= nil then + sourceMonitor = sourceIndex - 1 + targetMonitor = targetIndex - 1 + isMirroring = true + end + break + end + end + end + + if isMirroring then + break + end + end + + noctalia.state.set("sourceMonitor", sourceMonitor) + noctalia.state.set("targetMonitor", targetMonitor) + noctalia.state.set("isMirroring", isMirroring) + + end, 5000) +end + +local function hyprlandSocketPath() + local runtimeDir = noctalia.getenv("XDG_RUNTIME_DIR") + local instanceSig = noctalia.getenv("HYPRLAND_INSTANCE_SIGNATURE") + + if not runtimeDir or not instanceSig then + return nil + end + + return string.format("%s/hypr/%s/.socket2.sock", runtimeDir, instanceSig) +end + +local function handleHyprEvent(line) + local event, data = line:match("^([^>]+)>>(.*)$") + -- we can not use the event data itself for the monitor events because hyprland treats a mirror as a monitor remove/add so this would remove a mirrored screen from the list + if event == "monitoradded" then + updateMonitors() + elseif event == "monitorremoved" then + updateMonitors() + elseif event == "focusedmon" then + -- data is MONNAME,WORKSPACENAME + local monitorName = data:match("([^,]+)") + if not monitorName then + return + end + noctalia.state.set("focusedMonitor", monitorName) + end +end + +-- Watches the Hyprland socket for monitor events and updates the state accordingly +local function watchMonitors() + local socketPath = hyprlandSocketPath() + if not socketPath then + noctalia.notify(tr("notification.monitor_watch_failed"), tr("notification.hyprland_socket_not_found")) + return + end + + local cmd = "socat -U - UNIX-CONNECT:" .. shellQuote(socketPath) + noctalia.runStream(cmd, handleHyprEvent) +end + +-- main +updateMonitors() +watchMonitors() + +noctalia.state.watch("monitor_refresh", function() + updateMonitors() +end) + +local function stopMirroring(targetIndex) + targetIndex = tonumber(targetIndex) + local monitors = noctalia.state.get("monitors") or {} + + if not targetIndex then + noctalia.notify(tr("notification.stop_mirroring_failed"), tr("notification.invalid_monitor_selection")) + return + end + + local targetMonitor = monitors[targetIndex + 1] + + if not targetMonitor then + noctalia.notify(tr("notification.stop_mirroring_failed"), tr("notification.invalid_monitor_selection")) + return + end + + local expr = string.format("hl.monitor({ output = %q, mirror = \"\" })", targetMonitor) + local cmd = "hyprctl eval " .. shellQuote(expr) + + noctalia.runAsync(cmd, function(output) + if output.timedOut or output.exitCode ~= 0 then + noctalia.notify(tr("notification.stop_mirroring_failed"), output.stderr or tr("notification.timed_out")) + return + end + updateMonitors() + end, 5000) +end + +local function startMirroring(sourceIndex, targetIndex) + sourceIndex = tonumber(sourceIndex) + targetIndex = tonumber(targetIndex) + local monitors = noctalia.state.get("monitors") or {} + + if not sourceIndex or not targetIndex or sourceIndex == targetIndex then + noctalia.notify(tr("notification.start_mirroring_failed"), tr("notification.invalid_monitor_selection")) + return + end + + local sourceMonitor = monitors[sourceIndex + 1] + local targetMonitor = monitors[targetIndex + 1] + + if not sourceMonitor or not targetMonitor then + noctalia.notify(tr("notification.start_mirroring_failed"), tr("notification.invalid_monitor_selection")) + return + end + + local expr = string.format("hl.monitor({ output = %q, mirror = %q })", targetMonitor, sourceMonitor) + local cmd = "hyprctl eval " .. shellQuote(expr) + + noctalia.runAsync(cmd, function(output) + if output.timedOut or output.exitCode ~= 0 then + noctalia.notify(tr("notification.start_mirroring_failed"), output.stderr or tr("notification.timed_out")) + return + end + updateMonitors() + end, 5000) +end + +noctalia.state.watch("mirrorRequest", function(request) + if type(request) ~= "table" then + return + end + + if request.enabled == true then + startMirroring(request.sourceMonitor, request.targetMonitor) + else + stopMirroring(request.targetMonitor) + end +end) diff --git a/hypr-screen-mirror/thumbnail.webp b/hypr-screen-mirror/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..a803f3bf333201f876fa757dfc0701e3f8d97ae4 GIT binary patch literal 47364 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

l)K%WprZLu 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 literal 0 HcmV?d00001 diff --git a/hypr-screen-mirror/translations/en.json b/hypr-screen-mirror/translations/en.json new file mode 100644 index 0000000..1c81695 --- /dev/null +++ b/hypr-screen-mirror/translations/en.json @@ -0,0 +1,27 @@ +{ + "widget": { + "glyph": { + "label": "Glyph", + "description": "Glyph shown in the bar" + } + }, + "notification": { + "monitor_list_failed": "Failed to list monitors", + "timed_out": "Command timed out", + "no_monitors_found": "No monitors found", + "stop_mirroring_failed": "Failed to stop mirroring", + "start_mirroring_failed": "Failed to start mirroring", + "monitor_watch_failed": "Failed to watch monitors", + "hyprland_socket_not_found": "Hyprland socket not found", + "invalid_monitor_selection": "Invalid monitor selection" + }, + "panel": { + "title": "Hypr Screen Mirror", + "source_monitor": "Source Monitor", + "target_monitor": "Target Monitor", + "focused_monitor": "Current Monitor", + "start_mirroring": "Mirror", + "stop_mirroring": "Stop", + "refresh": "Refresh" + } +} diff --git a/hypr-screen-mirror/widget.luau b/hypr-screen-mirror/widget.luau new file mode 100644 index 0000000..22972a5 --- /dev/null +++ b/hypr-screen-mirror/widget.luau @@ -0,0 +1,14 @@ +local glyph = noctalia.getConfig("glyph") + +local function render() + barWidget.setGlyph(glyph) +end + +function update() + noctalia.setUpdateInterval(1000) + render() +end + +function onClick() + noctalia.togglePanel("profidev/hypr-screen-mirror:panel") +end