master ohmu/fastfetch-openbsd / src / modules / de / de.c
ohmu  ·  2026-10-15
  1#include "common/printing.h"
  2#include "common/jsonconfig.h"
  3#include "common/strutil.h"
  4#include "detection/displayserver/displayserver.h"
  5#include "detection/de/de.h"
  6#include "modules/de/de.h"
  7
  8bool ffPrintDE(FFDEOptions* options) {
  9    const FFDisplayServerResult* result = ffConnectDisplayServer();
 10
 11    if (result->dePrettyName.length == 0) {
 12        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(DE), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "No DE found");
 13        return false;
 14    }
 15
 16    FF_STRBUF_AUTO_DESTROY version = ffStrbufCreate();
 17    ffDetectDEVersion(&result->dePrettyName, &version, options);
 18
 19    if (options->moduleArgs.outputFormat.length == 0) {
 20        ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(DE), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
 21
 22        ffStrbufWriteTo(&result->dePrettyName, stdout);
 23
 24        if (version.length > 0) {
 25            putchar(' ');
 26            ffStrbufWriteTo(&version, stdout);
 27        }
 28
 29        putchar('\n');
 30    } else {
 31        FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(DE), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) { FF_ARG(result->deProcessName, "process-name"), FF_ARG(result->dePrettyName, "pretty-name"), FF_ARG(version, "version") }));
 32    }
 33
 34    return true;
 35}
 36
 37void ffParseDEJsonObject(FFDEOptions* options, yyjson_val* module) {
 38    yyjson_val *key, *val;
 39    size_t idx, max;
 40    yyjson_obj_foreach (module, idx, max, key, val) {
 41        if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
 42            continue;
 43        }
 44
 45        if (unsafe_yyjson_equals_str(key, "slowVersionDetection")) {
 46            ffPrintError(FF_MODULE_GET_DISPLAY_NAME(DE), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Key `slowVersionDetection` is deprecated, it's always true");
 47            continue;
 48        }
 49
 50        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(DE), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
 51    }
 52}
 53
 54[[gnu::cold]]
 55void ffGenerateDEJsonConfig(FFDEOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 56    ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
 57}
 58
 59bool ffGenerateDEJsonResult([[maybe_unused]] FFDEOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 60    const FFDisplayServerResult* result = ffConnectDisplayServer();
 61
 62    if (result->dePrettyName.length == 0) {
 63        yyjson_mut_obj_add_str(doc, module, "error", "No DE found");
 64        return false;
 65    }
 66
 67    FF_STRBUF_AUTO_DESTROY version = ffStrbufCreate();
 68    ffDetectDEVersion(&result->dePrettyName, &version, options);
 69
 70    yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
 71    yyjson_mut_obj_add_strbuf(doc, obj, "processName", &result->deProcessName);
 72    yyjson_mut_obj_add_strbuf(doc, obj, "prettyName", &result->dePrettyName);
 73    yyjson_mut_obj_add_strbuf(doc, obj, "version", &version);
 74    return true;
 75}
 76
 77void ffInitDEOptions(FFDEOptions* options) {
 78    ffOptionInitModuleArg(&options->moduleArgs, "");
 79}
 80
 81void ffDestroyDEOptions(FFDEOptions* options) {
 82    ffOptionDestroyModuleArg(&options->moduleArgs);
 83}
 84
 85FFModuleBaseInfo ffDEModuleInfo = {
 86    .name = "DE",
 87    .description = "Print desktop environment name",
 88    .displayName = {
 89        .en = "Desktop Environment",
 90        .ar = "بيئة سطح المكتب",
 91        .cs = "Pracovní prostředí",
 92        .de = "Desktop-Umgebung",
 93        .es = "Entorno de escritorio",
 94        .fi = "Työpöytäympäristö",
 95        .fr = "Environnement de Bureau",
 96        .gl = "Contorno do Escritorio",
 97        .he = "סביבת שולחן עבודה",
 98        .id = "Lingkungan Desktop",
 99        .it = "Ambiente Desktop",
100        .ja = "デスクトップ環境",
101        .ko = "데스크탑 환경",
102        .pl = "Środowisko graficzne",
103        .pt = "Ambiente de desktop",
104        .ru = "Рабочее окружение",
105        .tr = "Masaüstü Ortamı",
106        .uk = "Стільниче середовище",
107        .vi = "Môi trường desktop",
108        .zh_CN = "桌面环境",
109        .zh_TW = "桌面環境",
110    },
111    .initOptions = (void*) ffInitDEOptions,
112    .destroyOptions = (void*) ffDestroyDEOptions,
113    .parseJsonObject = (void*) ffParseDEJsonObject,
114    .printModule = (void*) ffPrintDE,
115    .generateJsonResult = (void*) ffGenerateDEJsonResult,
116    .generateJsonConfig = (void*) ffGenerateDEJsonConfig,
117    .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
118        { "DE process name", "process-name" },
119        { "DE pretty name", "pretty-name" },
120        { "DE version", "version" },
121    })),
122    .defaultOrder = 21,
123};