#include <grub/crypto.h>
#include <grub/time.h>
#include <grub/font.h>
+#include <grub/video.h>
#include <grub/ventoy.h>
#include "ventoy_def.h"
static VTOY_JSON *g_menu_lang_json = NULL;
static int g_theme_id = 0;
+static int g_theme_res_fit = 0;
static int g_theme_num = 0;
static theme_list *g_theme_head = NULL;
static int g_theme_random = vtoy_theme_random_boot_second;
if (g_theme_num > 0)
{
vtoy_json_get_int(json->pstChild, "default_file", &g_theme_id);
+ if (g_theme_id == 0)
+ {
+ vtoy_json_get_int(json->pstChild, "resolution_fit", &g_theme_res_fit);
+ if (g_theme_res_fit != 1)
+ {
+ g_theme_res_fit = 0;
+ }
+
+ grub_snprintf(val, sizeof(val), "%d", g_theme_res_fit);
+ ventoy_env_export("vtoy_res_fit", val);
+ }
+
if (g_theme_id > g_theme_num || g_theme_id < 0)
{
g_theme_id = 0;
return 0;
}
+extern char g_ventoy_theme_path[256];
+
grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **args)
{
grub_uint32_t i = 0;
grub_uint32_t mod = 0;
+ grub_uint32_t theme_num = 0;
theme_list *node = g_theme_head;
struct grub_datetime datetime;
-
+ struct grub_video_mode_info info;
+ char buf[64];
+ char **pThemePath = NULL;
+
(void)argc;
(void)args;
(void)ctxt;
goto end;
}
- grub_memset(&datetime, 0, sizeof(datetime));
- grub_get_datetime(&datetime);
+ pThemePath = (char **)grub_zalloc(sizeof(char *) * g_theme_num);
+ if (!pThemePath)
+ {
+ goto end;
+ }
- if (g_theme_random == vtoy_theme_random_boot_second)
+ if (g_theme_res_fit)
{
- grub_divmod32((grub_uint32_t)datetime.second, (grub_uint32_t)g_theme_num, &mod);
+ if (grub_video_get_info(&info) == GRUB_ERR_NONE)
+ {
+ debug("get video info success %ux%u\n", info.width, info.height);
+ grub_snprintf(buf, sizeof(buf), "%ux%u", info.width, info.height);
+ for (node = g_theme_head; node; node = node->next)
+ {
+ if (grub_strstr(node->theme.path, buf))
+ {
+ pThemePath[theme_num++] = node->theme.path;
+ }
+ }
+ }
}
- else if (g_theme_random == vtoy_theme_random_boot_day)
+
+ if (theme_num == 0)
{
- grub_divmod32((grub_uint32_t)datetime.day, (grub_uint32_t)g_theme_num, &mod);
+ for (node = g_theme_head; node; node = node->next)
+ {
+ pThemePath[theme_num++] = node->theme.path;
+ }
}
- else if (g_theme_random == vtoy_theme_random_boot_month)
+
+ if (theme_num == 1)
{
- grub_divmod32((grub_uint32_t)datetime.month, (grub_uint32_t)g_theme_num, &mod);
+ mod = 0;
+ debug("Only 1 theme match, no need to random.\n");
}
+ else
+ {
+ grub_memset(&datetime, 0, sizeof(datetime));
+ grub_get_datetime(&datetime);
- debug("%04d/%02d/%02d %02d:%02d:%02d radom:%d mod:%d\n",
- datetime.year, datetime.month, datetime.day,
- datetime.hour, datetime.minute, datetime.second,
- g_theme_random, mod);
+ if (g_theme_random == vtoy_theme_random_boot_second)
+ {
+ grub_divmod32((grub_uint32_t)datetime.second, theme_num, &mod);
+ }
+ else if (g_theme_random == vtoy_theme_random_boot_day)
+ {
+ grub_divmod32((grub_uint32_t)datetime.day, theme_num, &mod);
+ }
+ else if (g_theme_random == vtoy_theme_random_boot_month)
+ {
+ grub_divmod32((grub_uint32_t)datetime.month, theme_num, &mod);
+ }
- for (i = 0; i < mod && node; i++)
- {
- node = node->next;
+ debug("%04d/%02d/%02d %02d:%02d:%02d theme_num:%d mod:%d\n",
+ datetime.year, datetime.month, datetime.day,
+ datetime.hour, datetime.minute, datetime.second,
+ theme_num, mod);
}
- debug("random theme %s\n", node->theme.path);
- grub_env_set("theme", node->theme.path);
+ if (argc > 0 && grub_strcmp(args[0], "switch") == 0)
+ {
+ grub_snprintf(g_ventoy_theme_path, sizeof(g_ventoy_theme_path), "%s", pThemePath[mod]);
+ }
+ else
+ {
+ debug("random theme %s\n", pThemePath[mod]);
+ grub_env_set("theme", pThemePath[mod]);
+ }
+ g_ventoy_menu_refresh = 1;
end:
+ grub_check_free(pThemePath);
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
-extern char g_ventoy_theme_path[256];
grub_err_t ventoy_cmd_set_theme_path(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)argc;
menuentry "$vtCurMode $vtActive" --class=debug_videomode --class=debug_resolution --class=F5tool VTOY_RUN_RET {
terminal_output console
set gfxmode=$1
- terminal_output gfxterm
+ terminal_output gfxterm
+ if [ "$vtoy_res_fit" = "1" ]; then
+ vt_set_theme switch
+ fi
}
vt_incr vdid 1
fi
terminal_input serial console
terminal_output serial console
-else
+else
+ if [ "$vtoy_res_fit" = "1" ]; then
+ terminal_output gfxterm
+ fi
+
if [ -n "$vtoy_theme" ]; then
vt_set_theme
else
{
VTOY_JSON_FMT_ITEM_PATH_LN(L3, node->path);
}
-
+
VTOY_JSON_FMT_ARY_ENDEX_LN(L2);
if (def->default_file != data->default_file)
{
VTOY_JSON_FMT_SINT_LN(L2, "default_file", data->default_file);
}
+
+ if (def->resolution_fit != data->resolution_fit)
+ {
+ VTOY_JSON_FMT_SINT_LN(L2, "resolution_fit", data->resolution_fit);
+ }
}
else
{
VTOY_JSON_FMT_OBJ_BEGIN();
VTOY_JSON_FMT_SINT("default_file", data->default_file);
+ VTOY_JSON_FMT_SINT("resolution_fit", data->resolution_fit);
VTOY_JSON_FMT_SINT("display_mode", data->display_mode);
VTOY_JSON_FMT_STRN("gfxmode", data->gfxmode);
data = g_data_theme + index;
VTOY_JSON_INT("default_file", data->default_file);
+ VTOY_JSON_INT("resolution_fit", data->resolution_fit);
VTOY_JSON_INT("display_mode", data->display_mode);
VTOY_JSON_STR("gfxmode", data->gfxmode);
VTOY_JSON_STR("ventoy_left", data->ventoy_left);
vtoy_json_get_string(child, "ventoy_color", sizeof(data->ventoy_color), data->ventoy_color);
vtoy_json_get_int(child, "default_file", &(data->default_file));
+ vtoy_json_get_int(child, "resolution_fit", &(data->resolution_fit));
vtoy_json_get_string(child, "gfxmode", sizeof(data->gfxmode), data->gfxmode);
vtoy_json_get_string(child, "serial_param", sizeof(data->serial_param), data->serial_param);
if (node)
{
data->default_file = 0;
+ data->resolution_fit = 0;
pnode = zalloc(sizeof(path_node));
if (pnode)
typedef struct data_theme
{
int default_file;
+ int resolution_fit;
path_node *filelist;
int display_mode;
char gfxmode[32];
-20221221 12:11:59
\ No newline at end of file
+20221204 15:15:33
\ No newline at end of file
\r
<footer class="main-footer">\r
<div class="pull-right hidden-xs">\r
- <b id="plugson_build_date">20221221 12:11:59</b>
+ <b id="plugson_build_date">20221204 15:15:33</b>
</div>\r
<strong><a href="https://www.ventoy.net" target="_blank">https://www.ventoy.net</a></strong>\r
</footer>\r
<script src="/static/js/jQuery-2.1.4.min.js"></script>\r
<!-- jquery validate -->\r
<script src="/static/js/jquery.validate.min.js"></script> \r
- <script src="/static/js/jquery.validate.vtoymethods.js?v=103"></script>\r
+ <script src="/static/js/jquery.validate.vtoymethods.js?v=106"></script>\r
\r
- <script src="/static/js/jquery.vtoy.alert.js?v=103"></script>\r
- <script src="/static/js/vtoy.js?v=103"></script>\r
+ <script src="/static/js/jquery.vtoy.alert.js?v=106"></script>\r
+ <script src="/static/js/vtoy.js?v=106"></script>\r
<script src="/static/js/md5.min.js"></script>\r
\r
<!-- Bootstrap 3.3.5 -->\r
</div><!-- /.box-body -->\r
</div><!-- /.box -->\r
\r
+ \r
+ <div class="box box-primary box-solid" id='resolution_fit_div'>\r
+ <div class="box-header with-border">\r
+ <h3 class="box-title" style="font-size: 14px;font-weight: bold;">resolution_fit\r
+ <span id="id_span_desc_cn"> —— 按照分辨率过滤</span></h3>\r
+ <div class="box-tools pull-right">\r
+ <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>\r
+ </div><!-- /.box-tools -->\r
+ </div><!-- /.box-header -->\r
+ <div class="box-body no-padding">\r
+ <table class="table table-bordered no-padding">\r
+ <tr style="font-weight:bold;">\r
+ <td class="td_ctrl_col" id="td_title_setting">选项设置</td>\r
+ <td>\r
+ <label class="radio-inline">\r
+ <input type="radio" id="id_ctrl_radio_res_fit0" name="id_ctrl_radio_res_fit" data-type="0" value="0"> <span style="font-weight:bold;">0</span>\r
+ </label> \r
+ <label class="radio-inline">\r
+ <input type="radio" id="id_ctrl_radio_res_fit1" name="id_ctrl_radio_res_fit" data-type="1" value="1"> <span style="font-weight:bold;">1</span>\r
+ </label>\r
+ </td>\r
+ </tr>\r
+ <tr id="tr_title_desc_cn">\r
+ <td class="td_ctrl_col" id="td_title_desc">选项说明</td>\r
+ <td>当设置多个主题时,在随机选择时是否按照当前分辨率过滤。 \r
+ <code style="font-weight: bold;">0</code> 不过滤 \r
+ <code style="font-weight: bold;">1</code> 过滤 <br/>\r
+ 注意,这个选项必须在上面设置了多个主题配置文件,同时 "默认" 设置为 “随机选择” 时才有效,其他情况下均无效。<br/>\r
+ 关于这个选项的详细解释,请参考 <a href="https://www.ventoy.net/cn/plugin_theme.html#vtoy_theme_res_fit">resolution_fit 选项说明</a>\r
+ </td>\r
+ </tr>\r
+ <tr id="tr_title_desc_en">\r
+ <td class="td_ctrl_col">Option Description</td>\r
+ <td>\r
+ Filter by current resolution when you set more than one themes. \r
+ <code style="font-weight: bold;">0</code> No filter  \r
+ <code style="font-weight: bold;">1</code> Filter <br/>\r
+ You can refer <a href="https://www.ventoy.net/en/plugin_theme.html#vtoy_theme_res_fit">About resolution_fit</a> for details about this option.\r
+ </td>\r
+ </tr>\r
+ </table>\r
+ </div><!-- /.box-body -->\r
+ </div><!-- /.box -->\r
+ \r
\r
<div class="box box-primary box-solid">\r
<div class="box-header with-border">\r
} else {\r
data.display_mode = 0;\r
}\r
+ \r
+ data.resolution_fit = parseInt($('input:radio[name=id_ctrl_radio_res_fit]:checked').val());\r
}\r
\r
function VtoySaveCurrentPage() {\r
method : 'save_theme',\r
index: current_tab_index,\r
display_mode: data.display_mode,\r
+ resolution_fit: data.resolution_fit,\r
gfxmode: data.gfxmode,\r
default_file: data.default_file\r
}, function(e) {\r
var $tbl = $("#id_theme_tbl_file tbody");\r
$tbl.empty();\r
\r
+ if (list.length > 1) {\r
+ $('#resolution_fit_div').show();\r
+ } else {\r
+ $('#resolution_fit_div').hide();\r
+ }\r
+\r
for (var i = 0; i < list.length; i++) {\r
var $tr;\r
td1 = '<td>' + (i + 1) + '</td>';\r
$('select[id=id_theme_sel_dismode').val('GUI');\r
}\r
\r
+ $('input:radio[name=id_ctrl_radio_res_fit]')[data.resolution_fit].checked = true;\r
+ \r
FillThemeFileTable(data.filelist, data.default_file);\r
FillThemeFontTable(data.fontslist);\r
}\r
\r
$('select[id=id_theme_sel_gfxmode]').change(VtoySaveCurrentPage);\r
$('select[id=id_theme_sel_dismode]').change(VtoySaveCurrentPage);\r
+ $('#id_ctrl_radio_res_fit0').change(VtoySaveCurrentPage);\r
+ $('#id_ctrl_radio_res_fit1').change(VtoySaveCurrentPage);\r
\r
$('#id_tab_theme a[href="#tab_0"]').click(OnClickMultiModeTab);\r
$('#id_tab_theme a[href="#tab_1"]').click(OnClickMultiModeTab);\r