Ventoy 主题插件

当你第一眼看到Ventoy的时候,你是什么感觉?不是很漂亮对吧?现在你可以定制你自己的主题了!
Ventoy 的启动菜单是基于 grub2 的,所以所有 grub2 的主题都可以应用在 Ventoy上面。
这个网站上收集了很多非常漂亮的 grub 主题 —— GRUB Themes - Gnome-look.org

  • Json 配置参数

推荐使用 VentoyPlugson 工具进行配置,无需手动创建、编辑json文件。请参考 VentoyPlugson
关于 ventoy.json 的位置以及相关说明,请首先参考 插件入口 (*必读)
在镜像分区 /ventoy/ventoy.json 中定义了一个 theme 结构用于描述关于主题的配置参数。
注意你不需要对这里列出来的每一项都做配置,可以只对其中的一项或几项做特殊配置,其他的会使用默认值.

{
    "theme": {
        "file": "/ventoy/theme/blur/theme.txt",
        "gfxmode": "1920x1080",
        "display_mode": "GUI",
        "serial_param": "--unit=0 --speed=9600",
        "ventoy_left": "5%",
        "ventoy_top": "95%",
        "ventoy_color": "#0000ff",
        "fonts": [
            "/ventoy/theme/blur/Hack-12.pf2",
            "/ventoy/theme/blur/Hack-14.pf2",
            "/ventoy/theme/blur/Hack-16.pf2"
        ]
    }
}

关键字 类型 说明
file STRING/STRING ARRAY theme.txt 文件的全路径。可以是1个字符串,也可以是字符串数组,例如:
"file": [
    "/ventoy/theme1/theme.txt",
    "/ventoy/theme2/theme.txt",
    "/ventoy/theme3/theme.txt",
    "/ventoy/theme4/theme.txt"
]
当设置为数组时,可以通过 default_file 选项来控制启动时使用哪个主题,也可以随机选择。
同时最新版本的 Ventoy 在启动后还可以通过菜单在这些主题之间进行切换,请参考下面的 主题切换
default_file INTEGER 注意该选项只有在 file 是一个数组的时候才有效。其值为一个整数,默认值为0,含义如下:
0: 表示启动时随机选择某个主题生效。(此为默认值)
1: 表示启动时选择第1个主题生效。
2: 表示启动时选择第2个主题生效。
3: 表示启动时选择第3个主题生效。
......
resolution_fit INTEGER 注意该选项只有在 file 中设置了多个(大于1个)文件、同时 default_file 设置为 0 时才有效,其他情况下无效。含义如下:
0: 不过滤。(此为默认值)
1: 过滤。
关于这个选项的详细解释,请参考下面的 resolution_fit 选项说明
gfxmode STRING 可选的,可以不设置。grub2 的 gfxmode 参数,默认为 "1024x768"
也可以使用 "max" 这个值,用来在启动时自动选择最大分辨率。
display_mode STRING 可选的,可以不设置。菜单显示模式,可以设置为 GUI CLI serial serial_console 默认为 GUI
GUI和CLI 分别对应图形模式和文本模式。在有极个别的机器上Ventoy的背景菜单无法显示,或者显示后菜单移动极其缓慢,这种情况可以默认设置为文本模式。
不过,不管GUI还是CLI都是基于VGA显示设备的,如果你的机器上只有串口,你可以设置为 serial
当然,如果既有串口也有VGA设备,则也可以设置为 serial_console
注意:如果菜单名称(文件名)里有中文的话,在文本或serial模式下是无法显示的。
serial_param STRING 可选的,可以不设置。只在 display_mode 设置为 serialserial_console 时才生效
这个参数用来配置串口的端口号以及波特率等参数,--unit=0 对应 com1 --unit=1 对应 com2 详细描述请参考 https://www.gnu.org/software/grub/manual/grub/grub.html#serial
ventoy_left STRING 可选的,可以不设置。ventoy版本信息的 X 位置, 默认为 "5%"
ventoy_top STRING 可选的,可以不设置。ventoy版本信息的 Y 位置, 默认为 "95%"
ventoy_color STRING 可选的,可以不设置。ventoy版本信息的颜色, 默认为 "#0000ff"
fonts STRING ARRAY 可选的,可以不设置。数组中的每一项代表一个字体文件的全路径,Ventoy在启动时会依次加载这些字体文件。
  • 文本模式 <==> 图形模式 切换

默认情况下 Ventoy 是图形模式,但在个别比较特殊的机器上可能会有显示问题,比如花屏、卡顿之类的。这种情况下你可以切换为文本模式。
Ventoy 文本模式和图形模式在功能上是一样的,只是图形模式更漂亮一点,再有就是文本模式中文会显示为 ?? 问号。
有以下几种方式可以切换显示模式:

  1. 通过 F5 Tools-->Screen Display Mode-->Force Text Mode 菜单切换。这个是一次性的,每次启动都需要重新设置
  2. 通过按 F7 快捷键来切换。这个和方法1效果是一样的,更方便一些。反复按可以在文本模式和图形模式之间来回切换。
  3. 通过本文中的主题插件设置,这样可以把默认模式切换成文本模式,不需要每次都切换。

  • 主题切换 (1.0.62+)

如果设置了多个主题,则可以通过 F5 Tools --> Theme Select 菜单切换主题(立即生效),如下图所示。
不过需要说明的是,通过这个菜单选择的主题只针对当前启动的环境有效,不会保存,因此下一次启动还是会根据 default_file 固定选择或者是随机选择某个主题。


  • resolution_fit 选项说明 (1.0.86+)

我们知道主题中的背景图片、图标、文字等的显示效果和分辨率关系很大。同一个主题在一个分辨率下显示的比较漂亮,但换一个分辨率可能效果就不好了。
如上图所示,Ventoy 支持设置多个主题,启动后可以通过菜单切换。我们可以为不同的分辨率设置不同的主题,比如:

"file": [
    "/ventoy/themes/theme_800x600/theme.txt",
    "/ventoy/themes/theme_1024x768/theme.txt",
    "/ventoy/themes/theme_1600x900/theme.txt"
]

我们还可以为不同分辨率中的每一种分辨率分别设置多个主题。比如:

"file": [
    "/ventoy/themes/theme_800x600_1/theme.txt",
    "/ventoy/themes/theme_800x600_2/theme.txt",
    "/ventoy/themes/theme_800x600_3/theme.txt",
    "/ventoy/themes/theme_1024x768_1/theme.txt",
    "/ventoy/themes/theme_1024x768_2/theme.txt",
    "/ventoy/themes/theme_1024x768_3/theme.txt",
    "/ventoy/themes/theme_1600x900_1/theme.txt",
    "/ventoy/themes/theme_1600x900_2/theme.txt",
    "/ventoy/themes/theme_1600x900_3/theme.txt"
]

如果我们把默认分辨率改成了 1600x900,那么就可以把这里的 /ventoy/themes/theme_1600x900_1/theme.txt 设置为默认主题就行了 (即 default_file 设置为 7)。
到这里看起来一切都很完美。但是这里有个问题,就是我们默认认为我设置的分辨率在所有设备上都是支持的。但有些特殊的显示器可能不是这样。
比如,Ventoy 默认的分辨率是 1024x768 但有一些机器上可能不支持这个分辨率,这时它启动后会选择一个其他的分辨率使用。 这种情况下,我们默认设置的主题在这种分辨率下可能显示效果很差。当然此时可以通过菜单调整一下,按照当前分辨率选择一下对应主题就行了。 但是这个毕竟是手动的操作,能不能上来就按照分辨率自动选择一个主题呢?
这个就是 resolution_fit 选项设置的初衷。

首先你必须设置了多个主题,同时默认主题 default_file 必须设置为0,即随机选择,resolution_fit 选项才有效。
此时,Ventoy 会过滤出符合当前分辨率的那些主题文件,在这些符合当前分辨率的主题文件内随机选择,而不是像原来那样在所有主题文件中随机选择。
当然如果你符合分辨率的主题过滤完就剩1个,那就肯定选择它了。因此,如果你像下面这样设置:

{
    "theme": {
        "file": [
            "/ventoy/themes/theme_800x600/theme.txt",
            "/ventoy/themes/theme_1024x768/theme.txt",
            "/ventoy/themes/theme_1600x900/theme.txt"
        ],        
        "resolution_fit": 1
    }
}

那么就可以达到启动时是哪种分辨率就选择哪种主题的效果。Ventoy 如何过滤呢?按照主题文件的全路径中是否包含 AAAxBBB 字符串来判定。(注意 x 必须是小写字母)
比如,当前分辨率是 1600x900,则对应的主题文件路径中必须包含 1600x900 字符,
可以在目录名中包含,比如 /ventoy/themes/theme_1600x900/theme.txt
也可以在文件名中包含,比如 /ventoy/themes/themeA/theme_1600x900.txt

另外,如果设置了 resolution_fit 选项,在通过 F5 Tools --> Resolution Configuration 菜单调整当前分辨率时, Ventoy 会立刻跟随新的分辨率选择一个新的主题。

  • 热键提示

为了能正常显示热键提示,你需要把下面这几个 hbox 的定义添加到新的 theme.txt 文件中。你也可以修改里面的位置和颜色属性。

+ hbox{ 
    left = 30%
    top = 95%
    width = 10%
    height = 25
    + label {text = "@VTOY_HOTKEY_TIP@" color = "blue" align = "left"} 
}

+ hbox{ 
    left = 90%
    top = 5 
    width = 10%
    height = 25
    + label {text = "@VTOY_MEM_DISK@" color = "red" align = "left"} 
}

  • Ventoy 版本信息

默认情况下,在界面的左下角会显示Ventoy的版本信息,比如 1.0.10 UEFI www.ventoy.net
这个信息是在代码中固定实现的,你可以通过 ventoy_left/ventoy_top/ventoy_color 变量来调整它的位置和颜色。
如果你想完全删除它,我鼓励你去阅读Ventoy的源代码,修改之后重新编译。我想这也是开源的意义所在。

  • 分别针对不同的 BIOS 模式设置不同的主题

theme 支持多模式,可以分别针对 x86 Legacy BIOS、IA32 UEFI、x86_64 UEFI 和 ARM64 UEFI 模式分别设置不同的主题,甚至可以有的使用图形模式,另一些使用文本模式。
详细说明请参考 多模式选项


  • 主题示例

https://gbatemp.net/threads/medicat-usb-a-multiboot-linux-usb-for-pc-repair.361577/