]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Add resolution_fit option in theme plugin.
authorlongpanda <admin@ventoy.net>
Thu, 22 Dec 2022 10:26:01 +0000 (18:26 +0800)
committerlongpanda <admin@ventoy.net>
Thu, 22 Dec 2022 10:26:01 +0000 (18:26 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
INSTALL/grub/debug.cfg
INSTALL/grub/grub.cfg
Plugson/src/Web/ventoy_http.c
Plugson/src/Web/ventoy_http.h
Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe
Plugson/vs/VentoyPlugson/x64/Release/VentoyPlugson_X64.exe
Plugson/www/buildtime
Plugson/www/index.html
Plugson/www/plugson_theme.html

index 6266331a46c705dfec08ad6ac2c5f62fb13b70b0..6eb3031e7ae97a5c148a8b94197b12224e5b273b 100644 (file)
@@ -35,6 +35,7 @@
 #include <grub/crypto.h>
 #include <grub/time.h>
 #include <grub/font.h>
+#include <grub/video.h>
 #include <grub/ventoy.h>
 #include "ventoy_def.h"
 
@@ -59,6 +60,7 @@ static conf_replace *g_conf_replace_head = NULL;
 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;
@@ -377,6 +379,18 @@ static int ventoy_plugin_theme_entry(VTOY_JSON *json, const char *isodisk)
     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;
@@ -3381,13 +3395,19 @@ grub_err_t ventoy_cmd_select_theme_cfg(grub_extcmd_context_t ctxt, int argc, cha
     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;
@@ -3417,41 +3437,82 @@ grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **arg
         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;
index 04fe2ea321379e7cc8bd6d098d1a08788ea60b96..9dd977f4dfd60cce22e132b16bdbbb1e3de7c341 100644 (file)
@@ -24,7 +24,10 @@ submenu "$VTLANG_RESOLUTION_CFG" --class=debug_resolution --class=F5tool {
         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
index 3d0bb3f6af5b95bd29fddbf3610953afaab184d3..5cc8079e5927e7a98dc0b7eaadd22b82cd49f3a8 100644 (file)
@@ -2555,7 +2555,11 @@ elif [ "$vtoy_display_mode" = "serial_console" ]; then
     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
index 2f1f88202e8a50b5b63321b037cf20fb0d7ade95..cbe45357a1a2b8bf18e6d9e4d6e9069dce64f23c 100644 (file)
@@ -819,13 +819,18 @@ int ventoy_data_save_theme(data_theme *data, const char *title, char *buf, int b
             {
                 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
         {
@@ -888,6 +893,7 @@ int ventoy_data_json_theme(data_theme *data, char *buf, int buflen)
     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);
     
@@ -939,6 +945,7 @@ static int ventoy_api_save_theme(struct mg_connection *conn, VTOY_JSON *json)
     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);
@@ -4252,6 +4259,7 @@ static int ventoy_parse_theme(VTOY_JSON *json, void *p)
     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);
 
@@ -4279,6 +4287,7 @@ static int ventoy_parse_theme(VTOY_JSON *json, void *p)
     if (node)
     {
         data->default_file = 0;
+        data->resolution_fit = 0;
 
         pnode = zalloc(sizeof(path_node));
         if (pnode)
index 18e4198aec06f683bc8ce4238aa307c71bceb752..b47edea4d9d48307509d620072ff7188d1c544f6 100644 (file)
@@ -100,6 +100,7 @@ typedef struct path_node
 typedef struct data_theme
 {
     int default_file;
+    int resolution_fit;
     path_node *filelist;
     int display_mode;
     char gfxmode[32];
index dc8b216601084ddaea049003e24265961c99da72..84f2b697568ecb07cf0a2ea3938c956eea77c831 100644 (file)
Binary files a/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe and b/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe differ
index 4912f4088e45df24c0be825518a68fe3d1afbd99..ef6e231e7c89debb0570c99997744db1466af878 100644 (file)
Binary files a/Plugson/vs/VentoyPlugson/x64/Release/VentoyPlugson_X64.exe and b/Plugson/vs/VentoyPlugson/x64/Release/VentoyPlugson_X64.exe differ
index 0dbb63cff9a5e825fbd2b4b4f1c229252d7e3a0e..573f28dddc36671c65c67f37edfd00c9a65c0abb 100644 (file)
@@ -1 +1 @@
-20221221 12:11:59
\ No newline at end of file
+20221204 15:15:33
\ No newline at end of file
index b5391fd7509610aceb3794d86061a38c1ac468fe..523b29fa60154bfc55933761dd796032e6d085dd 100644 (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
index 5c2f6d8e80239559e57808ddfd64243e74e2e31b..89f069fa93e64a8914ebcf6391a8eb26246f69ca 100644 (file)
             </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>&nbsp;&nbsp;&nbsp;&nbsp;\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>当设置多个主题时,在随机选择时是否按照当前分辨率过滤。&nbsp;&nbsp;\r
+                      <code style="font-weight: bold;">0</code> 不过滤 &nbsp;&nbsp;\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. &nbsp;&nbsp;\r
+                      <code style="font-weight: bold;">0</code> No filter &nbsp;&nbsp\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