diff --git a/CMakeLists.txt b/CMakeLists.txt index 0223394e2f..1b9ca4f99f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,6 +108,7 @@ cmake_dependent_option(ENABLE_IMAGEMAGICK6 "Enable imagemagick 6" ON "ENABLE_IMA cmake_dependent_option(ENABLE_SIXEL "Enable sixel logo output via the embedded libsixel encoder (Windows, macOS and Android; replaces ImageMagick's SIXEL coder)" ON "ENABLE_IMAGE_LOGO;WIN32 OR APPLE OR ANDROID" OFF) cmake_dependent_option(ENABLE_CHAFA "Enable chafa" ON "ENABLE_IMAGE_LOGO;ENABLE_IMAGEMAGICK6 OR ENABLE_IMAGEMAGICK7 OR WIN32 OR APPLE OR ANDROID" OFF) +option(COMPATIBILITY_FORCE_DRM_DISABLE "Force disable GPU DRM detection (for embedded)" OFF) option(ENABLE_ZLIB "Enable zlib" ON) option(ENABLE_SYSTEM_YYJSON "Use system provided (instead of fastfetch embedded) yyjson library" OFF) option(ENABLE_ASAN "Build fastfetch with ASAN (address sanitizer)" OFF) @@ -578,6 +579,7 @@ if(LINUX) src/common/impl/FFPlatform_unix.c src/common/impl/binary_linux.c src/common/impl/kmod_linux.c + src/common/keenetic/version.c src/detection/battery/battery_linux.c src/detection/bios/bios_linux.c src/detection/board/board_linux.c @@ -754,6 +756,7 @@ elseif(FreeBSD) src/common/impl/FFPlatform_unix.c src/common/impl/binary_linux.c src/common/impl/kmod_bsd.c + src/common/keenetic/version.c src/detection/battery/battery_bsd.c src/detection/bios/bios_bsd.c src/detection/bluetoothradio/bluetoothradio_nosupport.c @@ -1356,6 +1359,7 @@ elseif(GNU) src/common/impl/FFPlatform_unix.c src/common/impl/binary_linux.c src/common/impl/kmod_nosupport.c + src/common/keenetic/version.c src/detection/battery/battery_nosupport.c src/detection/bios/bios_nosupport.c src/detection/board/board_nosupport.c @@ -1599,6 +1603,10 @@ elseif(DragonFly AND EXISTS "/usr/local/bin/objdump") endif() endif() +if(COMPATIBILITY_FORCE_DRM_DISABLE) + target_compile_definitions(libfastfetch PUBLIC COMPATIBILITY_FORCE_DRM_OFF=1) +endif() + if(LINUX) target_compile_definitions(libfastfetch PUBLIC _GNU_SOURCE _XOPEN_SOURCE _ATFILE_SOURCE __STDC_WANT_LIB_EXT1__ _FILE_OFFSET_BITS=64 _TIME_BITS=64) # "$<$:_FORTIFY_SOURCE=3>" elseif(ANDROID) diff --git a/src/common/keenetic/version.c b/src/common/keenetic/version.c new file mode 100644 index 0000000000..64cd50e2a6 --- /dev/null +++ b/src/common/keenetic/version.c @@ -0,0 +1,105 @@ +#include "common/keenetic/version.h" +#include "common/processing.h" +#include "common/FFstrbuf.h" +#include +#include + +static const char* getValueAfter(const char* line, const char* key) +{ + const char* p = strstr(line, key); + if (!p) return NULL; + + p += strlen(key); + while (*p == ' ' || *p == '\t') ++p; + return *p ? p : NULL; +} + +const FFKeeneticInfo* ffDetectKeenetic(void) +{ + static FFKeeneticInfo info; + static bool initialized = false; + + if (initialized) + return &info; + + initialized = true; + memset(&info, 0, sizeof(info)); + ffStrbufInit(&info.vendor); + ffStrbufInit(&info.title); + ffStrbufInit(&info.model); + + if (!ffPathExists("/bin/ndmc", FF_PATHTYPE_FILE)) + return &info; + + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreate(); + if (ffProcessAppendStdOut(&output, (char* const[]){ + "/bin/ndmc", "-c", "show version", NULL + }) != NULL || output.length == 0) + { + return &info; + } + + char* line = output.chars; + while (line && *line) + { + char* next = strchr(line, '\n'); + if (next) *next = '\0'; + + const char* v = getValueAfter(line, "vendor:"); + if (v) ffStrbufSetS(&info.vendor, v); + + const char* t = getValueAfter(line, "title:"); + if (t) ffStrbufSetS(&info.title, t); + + const char* m = getValueAfter(line, "model:"); + if (m) ffStrbufSetS(&info.model, m); + + const char* f = getValueAfter(line, "manufacturer:"); + if (f) ffStrbufSetS(&info.vendor_full, f); + + const char* r = getValueAfter(line, "release:"); + if (m) ffStrbufSetS(&info.version, r); + + line = next ? next + 1 : NULL; + } + + info.available = (info.vendor.length > 0); + info.id = "keenetic"; + info.idLike = "keeneticos"; + info.family = "linux"; + + return &info; +} + +void ffKeeneticFormatOS(FFstrbuf* result) +{ + const FFKeeneticInfo* k = ffDetectKeenetic(); + if (!k->available) return; + + if (k->title.length > 0) + ffStrbufSetF(result, "%s OS", k->vendor.chars); + else + ffStrbufSetS(result, k->vendor.chars); +} + +void ffKeeneticFormatOSFull(FFstrbuf* result) +{ + const FFKeeneticInfo* k = ffDetectKeenetic(); + if (!k->available) return; + + if (k->title.length > 0) + ffStrbufSetF(result, "%s OS %s", k->vendor.chars, k->title.chars); + else + ffStrbufSetS(result, k->vendor.chars); +} + +void ffKeeneticFormatHost(FFstrbuf* result) +{ + const FFKeeneticInfo* k = ffDetectKeenetic(); + if (!k->available) return; + + if (k->model.length > 0) + ffStrbufSetF(result, "%s %s", k->vendor.chars, k->model.chars); + else + ffStrbufSetS(result, k->vendor.chars); +} diff --git a/src/common/keenetic/version.h b/src/common/keenetic/version.h new file mode 100644 index 0000000000..65cbd86b6d --- /dev/null +++ b/src/common/keenetic/version.h @@ -0,0 +1,23 @@ +#pragma once + +#include "common/FFstrbuf.h" +#include + +typedef struct FFKeeneticInfo +{ + bool available; + FFstrbuf vendor; // "Keenetic" + FFstrbuf vendor_full; // "Keenetic Ltd." + FFstrbuf title; // "5.1.6" + FFstrbuf model; // "Giant (KN-2610)" + FFstrbuf version; // "5.01.C.6.0-1" + const char* id; // "keenetic" + const char* idLike; // "keeneticos" + const char* family; // "linux" +} FFKeeneticInfo; + +const FFKeeneticInfo* ffDetectKeenetic(void); + +void ffKeeneticFormatOS(FFstrbuf* result); // "Keenetic OS" +void ffKeeneticFormatOSFull(FFstrbuf* result); // "Keenetic OS 5.1.6" +void ffKeeneticFormatHost(FFstrbuf* result); // "Keenetic Giant (KN-2610)" diff --git a/src/detection/displayserver/linux/drm.c b/src/detection/displayserver/linux/drm.c index 21d70ea069..4bac266013 100644 --- a/src/detection/displayserver/linux/drm.c +++ b/src/detection/displayserver/linux/drm.c @@ -164,7 +164,7 @@ static inline const char* drmType2Name(uint32_t connector_type) { return "DSI"; case DRM_MODE_CONNECTOR_DPI: return "DPI"; - case DRM_MODE_CONNECTOR_WRITEBACK: + case 18 /*DRM_MODE_CONNECTOR_WRITEBACK*/: return "Writeback"; case 19 /*DRM_MODE_CONNECTOR_SPI*/: return "SPI"; diff --git a/src/detection/gpu/gpu_drm.c b/src/detection/gpu/gpu_drm.c index 15d31a31a2..6329441978 100644 --- a/src/detection/gpu/gpu_drm.c +++ b/src/detection/gpu/gpu_drm.c @@ -1,6 +1,33 @@ #include "gpu.h" -#if FF_HAVE_DRM || __has_include() +#if COMPATIBILITY_FORCE_DRM_OFF + #if FF_HAVE_DRM || __has_include() +const char* ffDrmDetectNouveau(FFGPUResult* gpu, int fd) { + FF_UNUSED(gpu, fd); + return "Fastfetch is not compiled with GPU DRM support"; +} + +const char* ffDrmDetectXe(FFGPUResult* gpu, int fd) { + FF_UNUSED(gpu, fd); + return "Fastfetch is not compiled with GPU DRM support"; +} + +const char* ffDrmDetectRadeon(const FFGPUOptions* options, FFGPUResult* gpu, const char* renderPath) { + FF_UNUSED(options, gpu, renderPath); + return "Fastfetch is not compiled with GPU DRM support"; +} + +const char* ffDrmDetectI915(FFGPUResult* gpu, int fd) { + FF_UNUSED(gpu, fd); + return "Fastfetch is not compiled with GPU DRM support"; +} + +const char* ffDrmDetectAmdgpu(const FFGPUOptions* options, FFGPUResult* gpu, const char* renderPath) { + FF_UNUSED(options, gpu, renderPath); + return "Fastfetch is not compiled with GPU DRM support"; +} + #endif +#elif FF_HAVE_DRM || __has_include() #include #include diff --git a/src/detection/host/host_linux.c b/src/detection/host/host_linux.c index 9252c76299..a615882463 100644 --- a/src/detection/host/host_linux.c +++ b/src/detection/host/host_linux.c @@ -2,6 +2,7 @@ #include "common/io.h" #include "common/processing.h" #include "common/smbios.h" +#include "common/keenetic/version.h" #include @@ -113,5 +114,18 @@ const char* ffDetectHost(FFHostResult* host) { } } + // Keenetic OS / NDMS detection + const FFKeeneticInfo* keen = ffDetectKeenetic(); + if (keen->available) { + ffKeeneticFormatHost(&host->name); + ffStrbufSetS(&host->family, keen->family); + if (keen->vendor_full.length > 0) { + ffStrbufSetS(&host->vendor, keen->vendor_full.chars); + } + if (keen->version.length > 0) { + ffStrbufSetS(&host->version, keen->version.chars); + } + } + return nullptr; } diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index 02dcb240ac..1a4ceb7701 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -4,6 +4,7 @@ #include "common/io.h" #include "common/processing.h" #include "common/strutil.h" +#include "common/keenetic/version.h" #include #include @@ -398,6 +399,15 @@ static void detectOS(FFOSResult* os) { ffStrbufSetS(&os->prettyName, "HarmonyOS"); } } + + // Keenetic OS / NDMS detection + const FFKeeneticInfo* keen = ffDetectKeenetic(); + if (keen->available) { + ffStrbufSetS(&os->id, keen->id); + ffStrbufSetS(&os->idLike, keen->idLike); + ffKeeneticFormatOSFull(&os->prettyName); + ffKeeneticFormatOS(&os->name); + } } void ffDetectOSImpl(FFOSResult* os) { diff --git a/src/logo/ascii/k.inc b/src/logo/ascii/k.inc index 644106903a..929a7f87d5 100644 --- a/src/logo/ascii/k.inc +++ b/src/logo/ascii/k.inc @@ -101,6 +101,21 @@ static const FFlogo K[] = { }, }, #endif + #ifdef FASTFETCH_DATATEXT_LOGO_KEENETIC_OS + // Keenetic OS + { + .names = { "Keenetic OS", "keenetic", "keeneticos", "keenetic_os", "KeeneticOS", "Keenetic" }, + .lines = FASTFETCH_DATATEXT_LOGO_KEENETIC_OS, + .colors = { + FF_COLOR_FG_BLUE, + FF_COLOR_FG_WHITE, + FF_COLOR_BG_WHITE, + FF_COLOR_MODE_RESET + }, + .colorKeys = FF_COLOR_FG_BLUE, + .colorTitle = FF_COLOR_FG_BLUE, + }, + #endif #ifdef FASTFETCH_DATATEXT_LOGO_KIBAOS // KibaOS { diff --git a/src/logo/ascii/k/keenetic_os.txt b/src/logo/ascii/k/keenetic_os.txt new file mode 100644 index 0000000000..80ebd39158 --- /dev/null +++ b/src/logo/ascii/k/keenetic_os.txt @@ -0,0 +1,14 @@ +$1 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ + ███████████████████████████ + ███████████████████████████ + $3███ ██████████▀ ▄████$4$1 + $3███ ████████▀ ▄██████$4$1 + $3███ ██████▀ ▄████████$4$1 + $3███ ▀▀████████$4$1 + $3███ ▀█████$4$1 + $3███ █████████▄▄▄ ████$4$1 + $3███ █████████████ ███$4$1 + $3███ █████████████ ███$4$1 + ███████████████████████████ + ███████████████████████████ + ███████████████████████████