master ohmu/fastfetch-openbsd / src / modules / wallpaper / wallpaper.c
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};