ohmu
·
2026-10-15
1#include "common/printing.h"
2#include "common/jsonconfig.h"
3#include "common/strutil.h"
4#include "detection/terminalsize/terminalsize.h"
5#include "modules/terminalsize/terminalsize.h"
6
7bool ffPrintTerminalSize(FFTerminalSizeOptions* options) {
8 FFTerminalSizeResult result = {};
9
10 if (!ffDetectTerminalSize(&result, false)) {
11 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(TerminalSize), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Failed to detect terminal size");
12 return false;
13 }
14
15 if (options->moduleArgs.outputFormat.length == 0) {
16 ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(TerminalSize), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
17 printf("%u columns x %u rows", result.columns, result.rows);
18
19 if (result.width != 0 && result.height != 0) {
20 printf(" (%upx x %upx)", result.width, result.height);
21 }
22
23 putchar('\n');
24 } else {
25 FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(TerminalSize), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
26 FF_ARG(result.rows, "rows"),
27 FF_ARG(result.columns, "columns"),
28 FF_ARG(result.width, "width"),
29 FF_ARG(result.height, "height"),
30 }));
31 }
32 return true;
33}
34
35void ffParseTerminalSizeJsonObject(FFTerminalSizeOptions* options, yyjson_val* module) {
36 yyjson_val *key, *val;
37 size_t idx, max;
38 yyjson_obj_foreach (module, idx, max, key, val) {
39 if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
40 continue;
41 }
42
43 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(TerminalSize), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
44 }
45}
46
47[[gnu::cold]]
48void ffGenerateTerminalSizeJsonConfig(FFTerminalSizeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
49 ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
50}
51
52bool ffGenerateTerminalSizeJsonResult([[maybe_unused]] FFTerminalSizeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
53 FFTerminalSizeResult result;
54
55 if (!ffDetectTerminalSize(&result, false)) {
56 yyjson_mut_obj_add_str(doc, module, "error", "Failed to detect terminal size");
57 return false;
58 }
59
60 yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
61 yyjson_mut_obj_add_uint(doc, obj, "columns", result.columns);
62 yyjson_mut_obj_add_uint(doc, obj, "rows", result.rows);
63 yyjson_mut_obj_add_uint(doc, obj, "width", result.width);
64 yyjson_mut_obj_add_uint(doc, obj, "height", result.height);
65
66 return true;
67}
68
69void ffInitTerminalSizeOptions(FFTerminalSizeOptions* options) {
70 ffOptionInitModuleArg(&options->moduleArgs, "");
71}
72
73void ffDestroyTerminalSizeOptions(FFTerminalSizeOptions* options) {
74 ffOptionDestroyModuleArg(&options->moduleArgs);
75}
76
77FFModuleBaseInfo ffTerminalSizeModuleInfo = {
78 .name = "TerminalSize",
79 .description = "Print the current terminal size",
80 .displayName = {
81 .en = "Terminal Size",
82 .ar = "حجم الطرفية",
83 .cs = "Velikost terminálu",
84 .de = "Terminalgröße",
85 .es = "Tamaño del terminal",
86 .fi = "Terminaalin Koko",
87 .fr = "Taille du terminal",
88 .gl = "Tamaño do terminal",
89 .he = "גודל טרמינל",
90 .id = "Ukuran Terminal",
91 .it = "Dimensioni terminale",
92 .ja = "ターミナルサイズ",
93 .ko = "터미널 크기",
94 .pl = "Rozmiar terminala",
95 .pt = "Tamanho do terminal",
96 .ru = "Размер терминала",
97 .tr = "Terminal Boyutu",
98 .uk = "Розмір терміналу",
99 .vi = "Kích thước Terminal",
100 .zh_CN = "终端大小",
101 .zh_TW = "終端機大小",
102 },
103 .initOptions = (void*) ffInitTerminalSizeOptions,
104 .destroyOptions = (void*) ffDestroyTerminalSizeOptions,
105 .parseJsonObject = (void*) ffParseTerminalSizeJsonObject,
106 .printModule = (void*) ffPrintTerminalSize,
107 .generateJsonResult = (void*) ffGenerateTerminalSizeJsonResult,
108 .generateJsonConfig = (void*) ffGenerateTerminalSizeJsonConfig,
109 .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
110 { "Terminal rows", "rows" },
111 { "Terminal columns", "columns" },
112 { "Terminal width (in pixels)", "width" },
113 { "Terminal height (in pixels)", "height" },
114 })),
115 .defaultOrder = 31,
116};