master ohmu/fastfetch-openbsd / src / modules / wm / wm.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/wm/wm.h"
  6#include "modules/wm/wm.h"
  7
  8bool ffPrintWM(FFWMOptions* options) {
  9    const FFDisplayServerResult* result = ffConnectDisplayServer();
 10
 11    if (result->wmPrettyName.length == 0) {
 12        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(WM), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "No WM found");
 13        return false;
 14    }
 15
 16    FF_STRBUF_AUTO_DESTROY pluginName = ffStrbufCreate();
 17    if (options->detectPlugin) {
 18        ffDetectWMPlugin(&pluginName);
 19    }
 20
 21    FF_STRBUF_AUTO_DESTROY version = ffStrbufCreate();
 22    if (instance.config.general.detectVersion) {
 23        ffDetectWMVersion(&result->wmProcessName, &version, options);
 24    }
 25
 26    if (options->moduleArgs.outputFormat.length == 0) {
 27        ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(WM), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
 28
 29        ffStrbufWriteTo(&result->wmPrettyName, stdout);
 30
 31        if (version.length > 0) {
 32            putchar(' ');
 33            ffStrbufWriteTo(&version, stdout);
 34        }
 35
 36        if (result->wmProtocolName.length > 0) {
 37            fputs(" (", stdout);
 38            ffStrbufWriteTo(&result->wmProtocolName, stdout);
 39            putchar(')');
 40        }
 41
 42        if (pluginName.length > 0) {
 43            fputs(" (with ", stdout);
 44            ffStrbufWriteTo(&pluginName, stdout);
 45            putchar(')');
 46        }
 47
 48        putchar('\n');
 49    } else {
 50        FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(WM), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
 51                                                                                                       FF_ARG(result->wmProcessName, "process-name"),
 52                                                                                                       FF_ARG(result->wmPrettyName, "pretty-name"),
 53                                                                                                       FF_ARG(result->wmProtocolName, "protocol-name"),
 54                                                                                                       FF_ARG(pluginName, "plugin-name"),
 55                                                                                                       FF_ARG(version, "version"),
 56                                                                                                   }));
 57    }
 58
 59    return true;
 60}
 61
 62void ffParseWMJsonObject(FFWMOptions* options, yyjson_val* module) {
 63    yyjson_val *key, *val;
 64    size_t idx, max;
 65    yyjson_obj_foreach (module, idx, max, key, val) {
 66        if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
 67            continue;
 68        }
 69
 70        if (unsafe_yyjson_equals_str(key, "detectPlugin")) {
 71            options->detectPlugin = yyjson_get_bool(val);
 72            continue;
 73        }
 74
 75        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(WM), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
 76    }
 77}
 78
 79[[gnu::cold]]
 80void ffGenerateWMJsonConfig(FFWMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 81    ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
 82
 83    yyjson_mut_obj_add_bool(doc, module, "detectPlugin", options->detectPlugin);
 84}
 85
 86bool ffGenerateWMJsonResult([[maybe_unused]] FFWMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 87    const FFDisplayServerResult* result = ffConnectDisplayServer();
 88
 89    if (result->wmPrettyName.length == 0) {
 90        yyjson_mut_obj_add_str(doc, module, "error", "No WM found");
 91        return false;
 92    }
 93
 94    FF_STRBUF_AUTO_DESTROY pluginName = ffStrbufCreate();
 95    if (options->detectPlugin) {
 96        ffDetectWMPlugin(&pluginName);
 97    }
 98
 99    FF_STRBUF_AUTO_DESTROY version = ffStrbufCreate();
100    if (instance.config.general.detectVersion) {
101        ffDetectWMVersion(&result->wmProcessName, &version, options);
102    }
103
104    yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
105    yyjson_mut_obj_add_strbuf(doc, obj, "processName", &result->wmProcessName);
106    yyjson_mut_obj_add_strbuf(doc, obj, "prettyName", &result->wmPrettyName);
107    yyjson_mut_obj_add_strbuf(doc, obj, "protocolName", &result->wmProtocolName);
108    yyjson_mut_obj_add_strbuf(doc, obj, "pluginName", &pluginName);
109    yyjson_mut_obj_add_strbuf(doc, obj, "version", &version);
110
111    return true;
112}
113
114void ffInitWMOptions(FFWMOptions* options) {
115    ffOptionInitModuleArg(&options->moduleArgs, "");
116    options->detectPlugin = true;
117}
118
119void ffDestroyWMOptions(FFWMOptions* options) {
120    ffOptionDestroyModuleArg(&options->moduleArgs);
121}
122
123FFModuleBaseInfo ffWMModuleInfo = {
124    .name = "WM",
125    .description = "Print the window manager name and version",
126    .displayName = {
127        .en = "Window Manager",
128        .ar = "مدير النوافذ",
129        .cs = "Správce oken",
130        .de = "Fenstermanager",
131        .es = "Gestor de ventanas",
132        .fi = "Ikkunointijärjestelmä",
133        .fr = "Gestionnaire de fenêtres",
134        .gl = "Xestor de xanelas",
135        .he = "מנהל חלונות",
136        .id = "Manajer Jendela",
137        .it = "Gestore finestre",
138        .ja = "ウィンドウマネージャー",
139        .ko = "윈도우 관리자",
140        .pl = "Menedżer okien",
141        .pt = "Gerenciador de janelas",
142        .ru = "Менеджер окон",
143        .tr = "Pencere Yöneticisi",
144        .uk = "Менеджер вікон",
145        .vi = "Trình quản lý cửa sổ",
146        .zh_CN = "窗口管理器",
147        .zh_TW = "視窗管理員",
148    },
149    .initOptions = (void*) ffInitWMOptions,
150    .destroyOptions = (void*) ffDestroyWMOptions,
151    .parseJsonObject = (void*) ffParseWMJsonObject,
152    .printModule = (void*) ffPrintWM,
153    .generateJsonResult = (void*) ffGenerateWMJsonResult,
154    .generateJsonConfig = (void*) ffGenerateWMJsonConfig,
155    .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
156        { "WM process name", "process-name" },
157        { "WM pretty name", "pretty-name" },
158        { "WM protocol name", "protocol-name" },
159        { "WM plugin name", "plugin-name" },
160        { "WM version", "version" },
161    })),
162    .defaultOrder = 22,
163};