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};