ohmu
·
2026-10-15
1#include "common/printing.h"
2#include "common/jsonconfig.h"
3#include "common/strutil.h"
4#include "detection/wallpaper/wallpaper.h"
5#include "modules/wallpaper/wallpaper.h"
6
7bool ffPrintWallpaper(FFWallpaperOptions* options) {
8 FF_STRBUF_AUTO_DESTROY fullpath = ffStrbufCreate();
9 const char* error = ffDetectWallpaper(&fullpath);
10
11 const uint32_t index = ffStrbufLastIndexC(&fullpath,
12#ifndef _WIN32
13 '/'
14#else
15 '\\'
16#endif
17 ) +
18 1;
19 const char* filename = index >= fullpath.length
20 ? fullpath.chars
21 : fullpath.chars + index;
22
23 if (error) {
24 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Wallpaper), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error);
25 return false;
26 }
27
28 if (options->moduleArgs.outputFormat.length == 0) {
29 ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(Wallpaper), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
30 puts(filename);
31 } else {
32 FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(Wallpaper), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
33 FF_ARG(filename, "file-name"),
34 FF_ARG(fullpath, "full-path"),
35 }));
36 }
37
38 return true;
39}
40
41void ffParseWallpaperJsonObject(FFWallpaperOptions* options, yyjson_val* module) {
42 yyjson_val *key, *val;
43 size_t idx, max;
44 yyjson_obj_foreach (module, idx, max, key, val) {
45 if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
46 continue;
47 }
48
49 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Wallpaper), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
50 }
51}
52
53[[gnu::cold]]
54void ffGenerateWallpaperJsonConfig(FFWallpaperOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
55 ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
56}
57
58bool ffGenerateWallpaperJsonResult([[maybe_unused]] FFWallpaperOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
59 FF_STRBUF_AUTO_DESTROY fullpath = ffStrbufCreate();
60 const char* error = ffDetectWallpaper(&fullpath);
61 if (error) {
62 yyjson_mut_obj_add_str(doc, module, "error", error);
63 return false;
64 }
65 yyjson_mut_obj_add_strbuf(doc, module, "result", &fullpath);
66
67 return true;
68}
69
70void ffInitWallpaperOptions(FFWallpaperOptions* options) {
71 ffOptionInitModuleArg(&options->moduleArgs, "");
72}
73
74void ffDestroyWallpaperOptions(FFWallpaperOptions* options) {
75 ffOptionDestroyModuleArg(&options->moduleArgs);
76}
77
78FFModuleBaseInfo ffWallpaperModuleInfo = {
79 .name = "Wallpaper",
80 .description = "Print the file path of the current wallpaper",
81 .displayName = {
82 .en = "Wallpaper",
83 .ar = "الخلفية",
84 .cs = "Tapeta",
85 .de = "Hintergrundbild",
86 .es = "Fondo de pantalla",
87 .fi = "Taustakuva",
88 .fr = "Fond d'écran",
89 .gl = "Fondo de escritorio",
90 .he = "טפט",
91 .id = "Wallpaper",
92 .it = "Sfondo",
93 .ja = "壁紙",
94 .ko = "배경화면",
95 .pl = "Tapeta",
96 .pt = "Papel de parede",
97 .ru = "Обои",
98 .tr = "Duvar Kağıdı",
99 .uk = "Шпалери",
100 .vi = "Hình nền",
101 .zh_CN = "壁纸",
102 .zh_TW = "桌布",
103 },
104 .initOptions = (void*) ffInitWallpaperOptions,
105 .destroyOptions = (void*) ffDestroyWallpaperOptions,
106 .parseJsonObject = (void*) ffParseWallpaperJsonObject,
107 .printModule = (void*) ffPrintWallpaper,
108 .generateJsonResult = (void*) ffGenerateWallpaperJsonResult,
109 .generateJsonConfig = (void*) ffGenerateWallpaperJsonConfig,
110 .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
111 { "File name", "file-name" },
112 { "Full path", "full-path" },
113 })),
114 .defaultOrder = 28,
115};