diff --git a/CMakeLists.txt b/CMakeLists.txt index 558c9b29b..9f3251ece 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,24 +60,24 @@ include(CMakeDependentOption) cmake_dependent_option(ENABLE_VULKAN "Enable vulkan" ON "LINUX OR APPLE OR FreeBSD OR OpenBSD OR NetBSD OR WIN32 OR ANDROID OR SunOS OR Haiku OR GNU" OFF) cmake_dependent_option(ENABLE_WAYLAND "Enable wayland-client" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR GNU" OFF) -cmake_dependent_option(ENABLE_XCB_RANDR "Enable xcb-randr" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) -cmake_dependent_option(ENABLE_XRANDR "Enable xrandr" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) +cmake_dependent_option(ENABLE_XCB_RANDR "Enable xcb-randr" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR GNU" OFF) +cmake_dependent_option(ENABLE_XRANDR "Enable xrandr" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR GNU" OFF) cmake_dependent_option(ENABLE_DRM "Enable libdrm" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) cmake_dependent_option(ENABLE_DRM_AMDGPU "Enable libdrm_amdgpu" ON "LINUX OR FreeBSD OR GNU" OFF) -cmake_dependent_option(ENABLE_GIO "Enable gio-2.0" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) -cmake_dependent_option(ENABLE_DCONF "Enable dconf" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) -cmake_dependent_option(ENABLE_DBUS "Enable dbus-1" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR Haiku OR GNU" OFF) -cmake_dependent_option(ENABLE_XFCONF "Enable libxfconf-0" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) +cmake_dependent_option(ENABLE_GIO "Enable gio-2.0" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR GNU" OFF) +cmake_dependent_option(ENABLE_DCONF "Enable dconf" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR GNU" OFF) +cmake_dependent_option(ENABLE_DBUS "Enable dbus-1" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR Haiku OR GNU" OFF) +cmake_dependent_option(ENABLE_XFCONF "Enable libxfconf-0" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR GNU" OFF) cmake_dependent_option(ENABLE_SQLITE3 "Enable sqlite3" ON "LINUX OR FreeBSD OR APPLE OR OpenBSD OR NetBSD OR SunOS OR GNU" OFF) cmake_dependent_option(ENABLE_RPM "Enable rpm" ON "LINUX OR GNU" OFF) -cmake_dependent_option(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR APPLE OR WIN32 OR SunOS OR Haiku OR GNU" OFF) +cmake_dependent_option(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR APPLE OR ANDROID OR WIN32 OR SunOS OR Haiku OR GNU" OFF) cmake_dependent_option(ENABLE_IMAGEMAGICK6 "Enable imagemagick 6" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR APPLE OR SunOS OR GNU" OFF) cmake_dependent_option(ENABLE_CHAFA "Enable chafa" ON "ENABLE_IMAGEMAGICK6 OR ENABLE_IMAGEMAGICK7" OFF) cmake_dependent_option(ENABLE_EGL "Enable egl" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR WIN32 OR SunOS OR Haiku OR GNU" OFF) cmake_dependent_option(ENABLE_GLX "Enable glx" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR ANDROID OR SunOS OR GNU" OFF) cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR FreeBSD OR OpenBSD OR NetBSD OR WIN32 OR ANDROID OR SunOS OR Haiku OR GNU" OFF) cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF) -cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR GNU" OFF) +cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR ANDROID OR GNU" OFF) cmake_dependent_option(ENABLE_DDCUTIL "Enable ddcutil" ON "LINUX" OFF) cmake_dependent_option(ENABLE_DIRECTX_HEADERS "Enable DirectX headers for WSL" ON "LINUX" OFF) cmake_dependent_option(ENABLE_ELF "Enable libelf" ON "LINUX OR ANDROID OR DragonFly OR Haiku OR GNU" OFF) @@ -515,6 +515,7 @@ if(LINUX) src/detection/physicalmemory/physicalmemory_linux.c src/detection/diskio/diskio_linux.c src/detection/displayserver/linux/displayserver_linux.c + src/detection/displayserver/linux/common.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c src/detection/displayserver/linux/wayland/global-output.c @@ -575,6 +576,7 @@ if(LINUX) ) elseif(ANDROID) list(APPEND LIBFASTFETCH_SRC + src/common/dbus.c src/common/io/io_unix.c src/common/netif/netif_linux.c src/common/networking/networking_linux.c @@ -590,7 +592,7 @@ elseif(ANDROID) src/detection/chassis/chassis_nosupport.c src/detection/cpu/cpu_linux.c src/detection/cpucache/cpucache_linux.c - src/detection/cursor/cursor_nosupport.c + src/detection/cursor/cursor_linux.c src/detection/cpuusage/cpuusage_linux.c src/detection/disk/disk_linux.c src/detection/dns/dns_linux.c @@ -598,10 +600,16 @@ elseif(ANDROID) src/detection/physicalmemory/physicalmemory_nosupport.c src/detection/diskio/diskio_linux.c src/detection/displayserver/displayserver_android.c - src/detection/font/font_nosupport.c + src/detection/displayserver/linux/common.c + src/detection/displayserver/linux/wmde.c + src/detection/displayserver/linux/xcb.c + src/detection/displayserver/linux/xlib.c + src/detection/gtk_qt/gtk.c + src/detection/gtk_qt/qt.c + src/detection/font/font_linux.c src/detection/gpu/gpu_android.c src/detection/host/host_android.c - src/detection/icons/icons_nosupport.c + src/detection/icons/icons_linux.c src/detection/initsystem/initsystem_linux.c src/detection/keyboard/keyboard_nosupport.c src/detection/libc/libc_android.c @@ -610,7 +618,7 @@ elseif(ANDROID) src/detection/locale/locale_linux.c src/detection/localip/localip_linux.c src/detection/gamepad/gamepad_nosupport.c - src/detection/media/media_nosupport.c + src/detection/media/media_linux.c src/detection/memory/memory_linux.c src/detection/mouse/mouse_nosupport.c src/detection/netio/netio_linux.c @@ -620,20 +628,21 @@ elseif(ANDROID) src/detection/packages/packages_nix.c src/detection/poweradapter/poweradapter_nosupport.c src/detection/processes/processes_linux.c - src/detection/sound/sound_nosupport.c + src/detection/sound/sound_linux.c src/detection/swap/swap_linux.c src/detection/terminalfont/terminalfont_android.c + src/detection/terminalfont/terminalfont_linux.c src/detection/terminalshell/terminalshell_linux.c src/detection/terminalsize/terminalsize_linux.c - src/detection/theme/theme_nosupport.c + src/detection/theme/theme_linux.c src/detection/tpm/tpm_nosupport.c src/detection/uptime/uptime_linux.c src/detection/users/users_linux.c - src/detection/wallpaper/wallpaper_nosupport.c + src/detection/wallpaper/wallpaper_linux.c src/detection/wifi/wifi_android.c - src/detection/wm/wm_nosupport.c - src/detection/de/de_nosupport.c - src/detection/wmtheme/wmtheme_nosupport.c + src/detection/wm/wm_linux.c + src/detection/de/de_linux.c + src/detection/wmtheme/wmtheme_linux.c src/detection/camera/camera_android.c src/detection/zpool/zpool_nosupport.c src/util/platform/FFPlatform_unix.c @@ -665,6 +674,7 @@ elseif(FreeBSD) src/detection/physicalmemory/physicalmemory_linux.c src/detection/diskio/diskio_bsd.c src/detection/displayserver/linux/displayserver_linux.c + src/detection/displayserver/linux/common.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c src/detection/displayserver/linux/wayland/global-output.c @@ -759,6 +769,7 @@ elseif(NetBSD) src/detection/physicalmemory/physicalmemory_linux.c src/detection/diskio/diskio_nbsd.c src/detection/displayserver/linux/displayserver_linux.c + src/detection/displayserver/linux/common.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c src/detection/displayserver/linux/wayland/global-output.c @@ -841,6 +852,7 @@ elseif(OpenBSD) src/detection/physicalmemory/physicalmemory_linux.c src/detection/diskio/diskio_obsd.c src/detection/displayserver/linux/displayserver_linux.c + src/detection/displayserver/linux/common.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c src/detection/displayserver/linux/wayland/global-output.c @@ -1069,6 +1081,7 @@ elseif(SunOS) src/detection/physicalmemory/physicalmemory_linux.c src/detection/diskio/diskio_sunos.c src/detection/displayserver/linux/displayserver_linux.c + src/detection/displayserver/linux/common.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c src/detection/displayserver/linux/wayland/global-output.c @@ -1220,6 +1233,7 @@ elseif(GNU) src/detection/physicalmemory/physicalmemory_nosupport.c src/detection/diskio/diskio_nosupport.c src/detection/displayserver/linux/displayserver_linux.c + src/detection/displayserver/linux/common.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c src/detection/displayserver/linux/wayland/global-output.c diff --git a/src/detection/displayserver/displayserver.h b/src/detection/displayserver/displayserver.h index f502f175a..3e9efea08 100644 --- a/src/detection/displayserver/displayserver.h +++ b/src/detection/displayserver/displayserver.h @@ -44,6 +44,7 @@ #define FF_WM_PROTOCOL_TTY "TTY" #define FF_WM_PROTOCOL_X11 "X11" #define FF_WM_PROTOCOL_WAYLAND "Wayland" +#define FF_WM_PROTOCOL_SURFACEFLINGER "SurfaceFlinger" typedef enum __attribute__((__packed__)) FFDisplayType { FF_DISPLAY_TYPE_UNKNOWN, diff --git a/src/detection/displayserver/displayserver_android.c b/src/detection/displayserver/displayserver_android.c index 48df77798..b9ab30b5f 100644 --- a/src/detection/displayserver/displayserver_android.c +++ b/src/detection/displayserver/displayserver_android.c @@ -1,6 +1,7 @@ #include "displayserver.h" #include "common/settings.h" #include "common/processing.h" +#include "linux/displayserver_linux.h" #include @@ -147,10 +148,19 @@ static bool detectWithGetprop(FFDisplayServerResult* ds) void ffConnectDisplayServerImpl(FFDisplayServerResult* ds) { + const char* error = ffdsConnectXcbRandr(ds); + if (error) + error = ffdsConnectXrandr(ds); + if (!error) + { + ffdsDetectWMDE(ds); + return; + } + // https://source.android.com/docs/core/graphics/surfaceflinger-windowmanager ffStrbufSetStatic(&ds->wmProcessName, "system_server"); ffStrbufSetStatic(&ds->wmPrettyName, "WindowManager"); // A system service managed by system_server - ffStrbufSetStatic(&ds->wmProtocolName, "SurfaceFlinger"); + ffStrbufSetStatic(&ds->wmProtocolName, FF_WM_PROTOCOL_SURFACEFLINGER); if (!detectWithGetprop(ds)) detectWithDumpsys(ds); diff --git a/src/detection/displayserver/linux/common.c b/src/detection/displayserver/linux/common.c new file mode 100644 index 000000000..71abee2b9 --- /dev/null +++ b/src/detection/displayserver/linux/common.c @@ -0,0 +1,16 @@ +#include "displayserver_linux.h" +#include "util/stringUtils.h" + +FFDisplayType ffdsGetDisplayType(const char* name) +{ + if(ffStrStartsWith(name, "eDP-") || ffStrStartsWith(name, "LVDS-")) + return FF_DISPLAY_TYPE_BUILTIN; + else if(ffStrStartsWith(name, "HDMI-") || + ffStrStartsWith(name, "DP-") || + ffStrStartsWith(name, "DisplayPort-") || + ffStrStartsWith(name, "DVI-") || + ffStrStartsWith(name, "VGA-")) + return FF_DISPLAY_TYPE_EXTERNAL; + + return FF_DISPLAY_TYPE_UNKNOWN; +} diff --git a/src/detection/displayserver/linux/displayserver_linux.c b/src/detection/displayserver/linux/displayserver_linux.c index 63b2c8315..f86105c0b 100644 --- a/src/detection/displayserver/linux/displayserver_linux.c +++ b/src/detection/displayserver/linux/displayserver_linux.c @@ -95,17 +95,3 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds) ffdsDetectWMDE(ds); } } - -FFDisplayType ffdsGetDisplayType(const char* name) -{ - if(ffStrStartsWith(name, "eDP-") || ffStrStartsWith(name, "LVDS-")) - return FF_DISPLAY_TYPE_BUILTIN; - else if(ffStrStartsWith(name, "HDMI-") || - ffStrStartsWith(name, "DP-") || - ffStrStartsWith(name, "DisplayPort-") || - ffStrStartsWith(name, "DVI-") || - ffStrStartsWith(name, "VGA-")) - return FF_DISPLAY_TYPE_EXTERNAL; - - return FF_DISPLAY_TYPE_UNKNOWN; -} diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index 8310c4bc9..164cf5aae 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -65,7 +65,7 @@ static const char* parseEnv(void) if(getenv("SWAYSOCK") != NULL) return "Sway"; - #ifdef __linux__ + #if __linux__ && !__ANDROID__ if( getenv("WAYLAND_DISPLAY") != NULL && ffPathExists("/mnt/wslg/", FF_PATHTYPE_DIRECTORY) @@ -433,6 +433,11 @@ static const char* getFromProcesses(FFDisplayServerResult* result) void ffdsDetectWMDE(FFDisplayServerResult* result) { + #if __ANDROID__ + if(ffStrbufIgnCaseEqualS(&result->wmProtocolName, FF_WM_PROTOCOL_SURFACEFLINGER)) + return; // Only supported when connected to X11 + #endif + const char* env = parseEnv(); if(result->wmProcessName.length > 0) diff --git a/src/detection/font/font_linux.c b/src/detection/font/font_linux.c index 4d58392c9..e3253379c 100644 --- a/src/detection/font/font_linux.c +++ b/src/detection/font/font_linux.c @@ -28,7 +28,7 @@ const char* ffDetectFontImpl(FFFontResult* result) { const FFDisplayServerResult* wmde = ffConnectDisplayServer(); - if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0) + if(ffStrbufIgnCaseEqualS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY)) return "Font isn't supported in TTY"; FFfont qt; diff --git a/src/detection/icons/icons_linux.c b/src/detection/icons/icons_linux.c index 623e0813d..e5727b195 100644 --- a/src/detection/icons/icons_linux.c +++ b/src/detection/icons/icons_linux.c @@ -7,7 +7,7 @@ const char* ffDetectIcons(FFIconsResult* result) { const FFDisplayServerResult* wmde = ffConnectDisplayServer(); - if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0) + if(ffStrbufIgnCaseEqualS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY)) return "Icons aren't supported in TTY"; const FFstrbuf* plasma = &ffDetectQt()->icons; diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c index fe1f8e52c..847788fb1 100644 --- a/src/detection/terminalfont/terminalfont.c +++ b/src/detection/terminalfont/terminalfont.c @@ -266,7 +266,7 @@ static bool detectRio(FFTerminalFontResult* terminalFont) return true; } -void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont); +bool ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont); static bool detectTerminalFontCommon(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) { diff --git a/src/detection/terminalfont/terminalfont_android.c b/src/detection/terminalfont/terminalfont_android.c index 318c321f2..9727fb6b6 100644 --- a/src/detection/terminalfont/terminalfont_android.c +++ b/src/detection/terminalfont/terminalfont_android.c @@ -13,6 +13,12 @@ const char* detectTermux(FFTerminalFontResult* terminalFont) { + if(!ffPathExists(FF_TERMUX_FONT_PATH, FF_PATHTYPE_FILE)) + { + ffFontInitCopy(&terminalFont->font, "monospace"); + return NULL; + } + #ifdef FF_HAVE_FREETYPE FF_LIBRARY_LOAD(freetype, "dlopen libfreetype"FF_LIBRARY_EXTENSION " failed", "libfreetype"FF_LIBRARY_EXTENSION, 2) @@ -53,19 +59,15 @@ exit: #endif } -void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) +bool ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) { - if(ffStrbufCompS(&terminal->processName, "com.termux") != 0) + if(ffStrbufEqualS(&terminal->processName, "com.termux")) + ffStrbufSetS(&terminalFont->error, detectTermux(terminalFont)); + else { - ffStrbufSetS(&terminalFont->error, "Unsupported terminal"); - return; + bool ffDetectTerminalFontPlatformLinux(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont); + return ffDetectTerminalFontPlatformLinux(terminal, terminalFont); } - if(!ffPathExists(FF_TERMUX_FONT_PATH, FF_PATHTYPE_FILE)) - { - ffFontInitCopy(&terminalFont->font, "monospace"); - return; - } - - ffStrbufSetS(&terminalFont->error, detectTermux(terminalFont)); + return true; } diff --git a/src/detection/terminalfont/terminalfont_apple.m b/src/detection/terminalfont/terminalfont_apple.m index 90fed7fd1..2ee70007b 100644 --- a/src/detection/terminalfont/terminalfont_apple.m +++ b/src/detection/terminalfont/terminalfont_apple.m @@ -91,7 +91,7 @@ static void detectWarpTerminal(FFTerminalFontResult* terminalFont) ffFontInitValues(&terminalFont->font, fontName.UTF8String, fontSize.UTF8String); } -void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) +bool ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) { if(ffStrbufIgnCaseEqualS(&terminal->processName, "iterm.app") || ffStrbufStartsWithIgnCaseS(&terminal->processName, "iTermServer-")) @@ -100,4 +100,7 @@ void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFo detectAppleTerminal(terminalFont); else if(ffStrbufIgnCaseEqualS(&terminal->processName, "WarpTerminal")) detectWarpTerminal(terminalFont); + else + return false; + return true; } diff --git a/src/detection/terminalfont/terminalfont_linux.c b/src/detection/terminalfont/terminalfont_linux.c index ef762e961..344d11818 100644 --- a/src/detection/terminalfont/terminalfont_linux.c +++ b/src/detection/terminalfont/terminalfont_linux.c @@ -167,7 +167,7 @@ static void detectXFCETerminal(FFTerminalFontResult* terminalFont) }); } - if(configFound && (useSysFont.length == 0 || ffStrbufIgnCaseCompS(&useSysFont, "false") == 0)) + if(configFound && (useSysFont.length == 0 || ffStrbufIgnCaseEqualS(&useSysFont, "false"))) { if(fontName.length == 0) ffStrbufAppendF(&terminalFont->error, "Couldn't find FontName in %s", path); @@ -433,7 +433,13 @@ static void detectHaikuTerminal(FFTerminalFontResult* terminalFont) } #endif -void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) +bool +#ifdef __ANDROID__ +ffDetectTerminalFontPlatformLinux +#else +ffDetectTerminalFontPlatform +#endif +(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) { if(ffStrbufIgnCaseEqualS(&terminal->processName, "konsole")) detectKonsole(terminalFont, "konsolerc"); @@ -477,4 +483,7 @@ void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFo #endif else if(ffStrbufStartsWithIgnCaseS(&terminal->processName, "termite")) detectFromConfigFile("termite/config", "font =", terminalFont); + else + return false; + return true; } diff --git a/src/detection/terminalfont/terminalfont_windows.c b/src/detection/terminalfont/terminalfont_windows.c index 8c541603e..059e1ac51 100644 --- a/src/detection/terminalfont/terminalfont_windows.c +++ b/src/detection/terminalfont/terminalfont_windows.c @@ -274,7 +274,7 @@ static void detectWarp(FFTerminalFontResult* terminalFont) ffFontInitValues(&terminalFont->font, fontName.chars, fontSize.chars); } -void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) +bool ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFontResult* terminalFont) { if(ffStrbufIgnCaseEqualS(&terminal->processName, "Windows Terminal") || ffStrbufIgnCaseEqualS(&terminal->processName, "WindowsTerminal.exe")) @@ -287,4 +287,7 @@ void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFo detectConEmu(terminalFont); else if(ffStrbufStartsWithIgnCaseS(&terminal->processName, "warp")) detectWarp(terminalFont); + else + return false; + return true; } diff --git a/src/detection/theme/theme_linux.c b/src/detection/theme/theme_linux.c index 4b4844286..650130775 100644 --- a/src/detection/theme/theme_linux.c +++ b/src/detection/theme/theme_linux.c @@ -7,7 +7,7 @@ const char* ffDetectTheme(FFThemeResult* result) { const FFDisplayServerResult* wmde = ffConnectDisplayServer(); - if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0) + if(ffStrbufIgnCaseEqualS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY)) return "Theme isn't supported in TTY"; const FFQtResult* plasma = ffDetectQt(); diff --git a/src/detection/wm/wm_linux.c b/src/detection/wm/wm_linux.c index 6e7cc9785..4697976e8 100644 --- a/src/detection/wm/wm_linux.c +++ b/src/detection/wm/wm_linux.c @@ -13,6 +13,17 @@ const char* ffDetectWMPlugin(FF_MAYBE_UNUSED FFstrbuf* pluginName) return "Not supported on this platform"; } +static bool extractCommonWmVersion(const char* line, FF_MAYBE_UNUSED uint32_t len, void *userdata) +{ + int count = 0; + sscanf(line, "%*d.%*d.%*d%n", &count); + if (count == 0) return true; + + ffStrbufSetNS((FFstrbuf*) userdata, len, line); + return false; +} + +#if !__ANDROID__ static bool extractHyprlandVersion(const char* line, uint32_t len, void *userdata) { if (line[0] != 'v') return true; @@ -128,6 +139,48 @@ static const char* getSway(FFstrbuf* result) return "Failed to run command `sway --version`"; } +static const char* getLabwc(FFstrbuf* result) +{ + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); + const char* error = ffFindExecutableInPath("labwc", &path); + if (error) return "Failed to find labwc executable path"; + + ffBinaryExtractStrings(path.chars, extractCommonWmVersion, result, (uint32_t) strlen("0.0.0")); + if (result->length > 0) return NULL; + + if (ffProcessAppendStdOut(result, (char* const[]){ + path.chars, + "--version", + NULL + }) == NULL) + { // labwc 0.9.0 (+xwayland +nls +rsvg +libsfdo) + ffStrbufSubstrAfterFirstC(result, ' '); + ffStrbufSubstrBeforeFirstC(result, ' '); + return NULL; + } + + return "Failed to run command `labwc --version`"; +} + +#ifdef __linux__ +static const char* getWslg(FFstrbuf* result) +{ + if (!ffAppendFileBuffer("/mnt/wslg/versions.txt", result)) + return "Failed to read /mnt/wslg/versions.txt"; + + if (!ffStrbufStartsWithS(result, "WSLg ")) + return "Failed to find WSLg version"; + + ffStrbufSubstrBeforeFirstC(result, '\n'); + ffStrbufSubstrBeforeFirstC(result, '+'); + ffStrbufSubstrAfterFirstC(result, ':'); + ffStrbufTrimLeft(result, ' '); + return NULL; +} +#endif + +#endif // !__ANDROID__ + static bool extractI3Version(const char* line, FF_MAYBE_UNUSED uint32_t len, void *userdata) { int count = 0; @@ -161,31 +214,6 @@ static const char* getI3(FFstrbuf* result) return "Failed to run command `i3 --version`"; } -static const char* getWslg(FFstrbuf* result) -{ - if (!ffAppendFileBuffer("/mnt/wslg/versions.txt", result)) - return "Failed to read /mnt/wslg/versions.txt"; - - if (!ffStrbufStartsWithS(result, "WSLg ")) - return "Failed to find WSLg version"; - - ffStrbufSubstrBeforeFirstC(result, '\n'); - ffStrbufSubstrBeforeFirstC(result, '+'); - ffStrbufSubstrAfterFirstC(result, ':'); - ffStrbufTrimLeft(result, ' '); - return NULL; -} - -static bool extractCommonWmVersion(const char* line, FF_MAYBE_UNUSED uint32_t len, void *userdata) -{ - int count = 0; - sscanf(line, "%*d.%*d.%*d%n", &count); - if (count == 0) return true; - - ffStrbufSetNS((FFstrbuf*) userdata, len, line); - return false; -} - static const char* getCtwm(FFstrbuf* result) { FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); @@ -255,45 +283,31 @@ static const char* getOpenbox(FFstrbuf* result) return "Failed to run command `openbox --version`"; } -static const char* getLabwc(FFstrbuf* result) -{ - FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); - const char* error = ffFindExecutableInPath("labwc", &path); - if (error) return "Failed to find labwc executable path"; - - ffBinaryExtractStrings(path.chars, extractCommonWmVersion, result, (uint32_t) strlen("0.0.0")); - if (result->length > 0) return NULL; - - if (ffProcessAppendStdOut(result, (char* const[]){ - path.chars, - "--version", - NULL - }) == NULL) - { // labwc 0.9.0 (+xwayland +nls +rsvg +libsfdo) - ffStrbufSubstrAfterFirstC(result, ' '); - ffStrbufSubstrBeforeFirstC(result, ' '); - return NULL; - } - - return "Failed to run command `labwc --version`"; -} - const char* ffDetectWMVersion(const FFstrbuf* wmName, FFstrbuf* result, FF_MAYBE_UNUSED FFWMOptions* options) { if (!wmName) return "No WM detected"; + #if !__ANDROID__ + // Wayland compositors if (ffStrbufIgnCaseEqualS(wmName, "Hyprland")) return getHyprland(result); if (ffStrbufEqualS(wmName, "sway")) return getSway(result); - if (ffStrbufEqualS(wmName, "i3")) - return getI3(result); + if (ffStrbufEqualS(wmName, "labwc")) + return getLabwc(result); + #if __linux__ if (ffStrbufEqualS(wmName, "WSLg")) return getWslg(result); + #endif + #endif + + // X11 WMs + if (ffStrbufEqualS(wmName, "i3")) + return getI3(result); if (ffStrbufEqualS(wmName, "ctwm")) return getCtwm(result); @@ -304,8 +318,5 @@ const char* ffDetectWMVersion(const FFstrbuf* wmName, FFstrbuf* result, FF_MAYBE if (ffStrbufEqualS(wmName, "Openbox")) return getOpenbox(result); - if (ffStrbufEqualS(wmName, "labwc")) - return getLabwc(result); - return "Unsupported WM"; }