fix(hyprland/workspaces): adapt dispatch commands for Lua IPC protocol

Hyprland 0.54 replaced the text-based dispatch socket protocol with a
Lua-based one. Commands like "dispatch workspace 1" are now interpreted
as invalid Lua (return hl.dispatch(workspace 1)), breaking workspace
clicks and scroll navigation.

Add IPC::dispatch() that probes the running Hyprland on first call and
routes commands through the new hl.dsp Lua API when the Lua protocol is
detected, falling back to the old text format otherwise.
This commit is contained in:
Higor Prado
2026-04-29 15:53:09 -03:00
parent cca8dc38b6
commit e17c0d9f0a
4 changed files with 91 additions and 10 deletions
+14
View File
@@ -4,6 +4,7 @@
#include <filesystem>
#include <list>
#include <mutex>
#include <optional>
#include <string>
#include <thread>
#include <utility>
@@ -35,6 +36,10 @@ class IPC {
Json::Value getSocket1JsonReply(const std::string& rq);
static std::filesystem::path getSocketFolder(const char* instanceSig);
/// Dispatch a Hyprland command. Automatically uses the correct protocol
/// (legacy text or Lua-based) depending on the running Hyprland version.
static std::string dispatch(const std::string& dispatcher, const std::string& arg);
protected:
static std::filesystem::path socketFolder_;
@@ -42,6 +47,15 @@ class IPC {
void socketListener();
void parseIPC(const std::string&);
/// Detect whether the running Hyprland uses the Lua-based IPC protocol.
/// Returns true for Hyprland >= 0.54 (Lua config), false for older versions.
static bool isLuaProtocol();
/// Build a Lua-format dispatch command string.
static std::string buildLuaDispatch(const std::string& dispatcher, const std::string& arg);
static std::optional<bool> s_luaProtocolDetected_; // cached detection result
std::thread ipcThread_;
std::mutex callbackMutex_;
std::mutex socketMutex_;