WM (Linux): add sway version detection

This commit is contained in:
Carter Li
2025-01-02 16:36:31 +08:00
parent 611de77980
commit 67597e4566
+68 -8
View File
@@ -2,22 +2,81 @@
#include "common/processing.h"
#include "detection/displayserver/displayserver.h"
#include "util/binary.h"
#include "util/path.h"
#include "util/stringUtils.h"
const char* ffDetectWMPlugin(FF_MAYBE_UNUSED FFstrbuf* pluginName)
{
return "Not supported on this platform";
}
static void getHyprland(FFstrbuf* result, FF_MAYBE_UNUSED FFWMOptions* options)
static bool extractHyprlandVersion(const char* line, FF_MAYBE_UNUSED uint32_t len, void *userdata)
{
if (line[0] != 'v') return true;
int count = 0;
sscanf(line + 1, "%*d.%*d.%*d%n", &count);
if (count == 0) return true;
ffStrbufSetNS((FFstrbuf*) userdata, len - 1, line + 1);
return false;
}
static const char* getHyprland(FFstrbuf* result, FF_MAYBE_UNUSED FFWMOptions* options)
{
FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate();
const char* error = ffFindExecutableInPath("Hyprland", &path);
if (error) return "Failed to find Hyprland executable path";
if (ffBinaryExtractStrings(path.chars, extractHyprlandVersion, result, (uint32_t) strlen("v0.0.0")) == NULL)
return NULL;
if (ffProcessAppendStdOut(result, (char* const[]){
"Hyprland",
path.chars,
"--version",
NULL
}) == NULL){ // Hyprland 0.46.2 built from branch v0.46.2-b at... long and multi line
}) == NULL)
{ // Hyprland 0.46.2 built from branch v0.46.2-b at... long and multi line
ffStrbufSubstrAfterFirstC(result, ' ');
ffStrbufSubstrBeforeFirstC(result, ' ');
return NULL;
}
return "Failed to run command `Hyprland --version`";
}
static bool extractSwayVersion(const char* line, FF_MAYBE_UNUSED uint32_t len, void *userdata)
{
if (!ffStrStartsWith(line, "sway version ")) return true;
ffStrbufSetNS((FFstrbuf*) userdata, len - (uint32_t) strlen("sway version "), line + strlen("sway version "));
return false;
}
static const char* getSway(FFstrbuf* result, FF_MAYBE_UNUSED FFWMOptions* options)
{
FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate();
const char* error = ffFindExecutableInPath("sway", &path);
if (error) return "Failed to find sway executable path";
if (ffBinaryExtractStrings(path.chars, extractSwayVersion, result, (uint32_t) strlen("v0.0.0")) == NULL)
{
ffStrbufTrimRightSpace(result);
return NULL;
}
if (ffProcessAppendStdOut(result, (char* const[]){
path.chars,
"--version",
NULL
}) == NULL)
{ // sway version 1.10
ffStrbufSubstrAfterLastC(result, ' ');
ffStrbufTrimRightSpace(result);
return NULL;
}
return "Failed to run command `sway --version`";
}
const char* ffDetectWMVersion(const FFstrbuf* wmName, FFstrbuf* result, FFWMOptions* options)
@@ -25,10 +84,11 @@ const char* ffDetectWMVersion(const FFstrbuf* wmName, FFstrbuf* result, FFWMOpti
if (!wmName)
return "No WM detected";
if (ffStrbufEqualS(wmName, FF_WM_PRETTY_HYPRLAND))
getHyprland(result, options);
else
return "Unsupported WM";
if (ffStrbufEqualS(wmName, "Hyprland"))
return getHyprland(result, options);
return NULL;
if (ffStrbufEqualS(wmName, "sway"))
return getSway(result, options);
return "Unsupported WM";
}