无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 50277|回复: 122
打印 上一主题 下一主题

[分享] Grub2主题应用

    [复制链接]
跳转到指定楼层
1#
发表于 2020-5-14 15:53:43 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hilsonma 于 2021-2-15 21:36 编辑

我们可以使用grub2主题来自定义grub2菜单的布局和外观。

下图是没有使用主题的菜单:

整个菜单布局分为菜单标题、菜单框、按键说明、倒计时四个部份。
其中倒计时这一项如果grub.cfg中没有设定timeout变量为正数是不会出现的。

下图是使用了我的主题的菜单:

这是简化了的主题,方便讲解。

附件是主题包简化版。
elegant.7z (60.53 KB, 下载次数: 330)

主题包的使用方法:
1.到grub.cfg所在文件夹里建一个名为themes的子文件夹
2.将主题包(elegant文件夹)解压到themes文件夹
3.在配置文件grub.cfg里定义菜单之前添加以下设定
  1. terminal_output gfxterm
  2. loadfont unicode
  3. theme=elegant/theme.txt
复制代码

4.定制efi文件时需包含gfxterm efi_gop efi_uga jpeg png 这五个模块


解说一下grub.cfg里的相关设定:

terminal_output gfxterm 是使用图形模式显示,如果没有这一句就默认使用文本模式显示,设置的主题不起作用。

loadfont unicode 是加载unicode字体。字体文件位置默认$prefix/fonts, 这一句写全路径即
loadfont $prefix/fonts/unicode.pf2
        如果字体文件在其他位置需指定全路径如 (hd0,0)/fontdir/font.pf2
        图形模式下如果没有这一句,非ASCII文字就会显示成ASCII文字,即乱码。

theme=elegant/theme.txt 是使用elegant主题。主题文件位置默认$prefix/themes,这一句写全路径即
theme=$prefix/themes/elegant/theme.txt
        如果主题文件在其他位置需指定全路径如 (hd0,0)/themedir/theme.txt

主题文件其实可以直接放在themes文件夹,就一个txt文件,可以随便命名如beautiful.txt等,当主题文件中使用了图片时,图片文件默认位置就是主题文件所在文件夹。
为了方便制作和交流主题包,我们通常将主题文件和相关图片放在一个子文件夹中。

2楼 主题文件解读
3楼 悬浮菜单、菜单微调、图标的使用
4楼 倒计时 (倒数秒、进度条、进度环)
5楼 按键说明
6楼 滚动条及完整主题包
7楼 仿windows主题 (vbox组件应用)
8楼 带工具栏主题 (hbox组件应用)
9楼 动画主题

49楼 label增强

评分

参与人数 14无忧币 +71 收起 理由
shan + 5 很给力!
猫咪爱吃鱼 + 1 赞一个!
cuicongyuan + 5 很给力!
AndyChen + 5 很给力!
夕阳DIY + 5 很给力!
wuxin9712 + 5
yynq + 5 很给力!
wdtx + 5 赞一个!
2011cwj6958 + 5 很给力!
ksafei + 5 很给力!
秋月云开 + 5
某些人 + 5 赞一个!
wintoflash + 5 赞一个!
liuzhaoyzz + 10 很给力!

查看全部评分

2#
 楼主| 发表于 2020-5-14 15:54:03 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-14 23:01 编辑

解读主题文件:

# Elegant theme for GRUB2
# 以“#”开头的行是注释行

desktop-image: "back.jpg"
# 背景图 back.jpg

title-text:""
# 菜单标题为空,就是不显示菜单标题

+ boot_menu {
# 菜单框组件

        top = 30%
        #菜单框顶端位置=屏幕上端30%处

        left = 30%
        #菜单框左端位置=屏幕左端30%处

        width = 40%
        #菜单框宽度=屏幕宽的40%

        height = 40%
        #菜单框高度=屏幕高的40%

        item_spacing = 0
        #菜单项间距=0

        item_color = "#ccc"
        #菜单项文字颜色="#ccc"

        selected_item_pixmap_style = "box_*.png"
        #选中的菜单项样式框="box_*.png"

        selected_item_color= "#fff"
        #选中的菜单项文字颜色="#fff"
}


详细讲解:

第一行注释,表明这是什么文件,通常提示主题名称
跟着两行是全局属性,格式是 属性名称:属性值

desktop-image 属性用来指定背景图,建议jpg图片,png图片也可以,只是png图片的文件大小会比jpg大,建议图片分辨率为1920*1080,这样比较符合主流显示器的分辨率,显示比较清晰也较少失真,当然其他分辨率也可以,反正会自动缩放至整个屏幕的。不建议使用太复杂的图片,当启动时图片显示有卡顿现象就应该换简单一点的图片。
如果没有指定desktop-image 属性,屏幕背景会默认为纯色的白色,如果要改成其他纯色,可以使用 desktop-color 属性,如:
desktop-color: "gray"

grub2主题文件中颜色的表达有以下几种:
"#808080" ------- 十六进制RRGGBB值
"#888" ---------- 十六进制RGB值
"128,128,128" --- 十进制RGB值
"gray" ---------- SVG颜色名


title-text 属性用来取消菜单标题的显示。如果没有指定title-text属性,会默认在屏幕顶端10%处居中显示黑色字体的菜单标题 "GRUB Boot Menu"
设置title-text:"" 表示标题为空,即不显示标题,设置其他值会出错。


示例主题文件中除了两个全局属性外就一个菜单组件,菜单组件的定义如下:
+ boot_menu {属性1=值1 属性2=值2 ...}

如果主题文件中连菜单组件都没有就会不显示菜单。
也就是说,主题文件可以是空的,这种情形下屏幕只显示一片白色,在顶端10%处居中显示黑色字体的 GRUB Boot Menu
所以想屏幕怎样显示就在主题文件中怎样定义。

菜单组件显示为一个菜单框

菜单框的属性
主题文件中组件的大小属性和位置属性可以用屏幕的百分比来表示,也可以用像素来表示,还可以用百分比+像素或者百分比-像素来表示。建议尽量用百分比表示,这样可以适应各种分辨率。

width=40% 表示宽度为屏幕的40%
height=40% 表示高度为屏幕的40%

一般来说,60%比较接近黄金比例,但由于现在的屏幕都比较大,60%屏幕显示菜单会显得太宽,所以我60%屏幕留空,使用40%屏幕显示菜单。

确定了大小后就确定位置,通常使用居中,所以菜单框大小为40%屏幕的话,上下各留空30%那么上端位置为30%处,同理左端位置为30%处

top=30%
left=30%

如果背景图有人像等需要避开以免遮挡,这时可灵活设置菜单框的大小和位置。


菜单框的大小位置定了后,就设置菜单项属性

item_spacing=0 设定各个菜单项之间的间距,默认是16像素的,我认为没有必要,所以设为0
item_color = "#ccc" 菜单项文字颜色
selected_item_color= "#fff" 选中的菜单项文字颜色
文字默认黑色的,一般暗色主题不适用,所以改为白色,#fff用于选中项,#ccc用于未选中项
如果是亮色主题,可以使用#000作为选中项,#333作为未选中项,或者yellow用于选中项,orange用于未选中项,等等。颜色不宜太多,配合背景图片,注意冷暖明暗的搭配。

selected_item_pixmap_style = "box_*.png" 设定选中项的样式框

grub2主题使用样式框来绘制一个区域

样式框使用九个分图片来绘制一个大图片,九个分图片分别是四角四边和中央,四角图片确定区域的四个角,四边图片分别拉伸填满区域的四边,中央图片则拉伸填满除四角四边外的整个区域。
这九个分图片分别命名如下:
_c.png 中央
_n.png 北边(上边)
_s.png 南边(下边)
_w.png 西边(左边)
_e.png 东边(右边)
_nw.png 西北角(左上角)
_sw.png 西南角(左下角)
_ne.png 东北角(右上角)
_se.png 东南角(右下角)

例如
box_c.png box_n.png等1-9个为一组,就叫box_*.png
slide_c.png slide_n.png等1-9个为一组,就叫slide_*.png

最少要有一个分图片,最多九个分图片,缺少哪一部分,哪一部分就不显示。

我的主题比较简约,采用扁平化,所以没有使用四边四角图片,只使用一个中央图片box_c.png
而且这个中央分图片只有一个像素,就是透明色带一些黑,或者带一些白,视乎背景图来使用透明黑或透明白。
回复

使用道具 举报

3#
 楼主| 发表于 2020-5-14 15:54:19 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-15 08:33 编辑

悬浮菜单、菜单微调、图标的使用

本来想在后面再讲悬浮菜单的,但是我看前面讲的菜单框,我的示例中又没有显示一个菜单框出来,可能大家不是很理解菜单框的概念,所以在这里就先讲一个显示菜单框的例子,我把它称为悬浮菜单。

下图是亮色人物背景,人像占了画面右边的48%,桌子和物品占了画面下边的36%,所以要在画面左上角做一个透明黑的菜单框,大小为40%,左右留空6%,上下留空12%
这样
top=12%
left=6%
width=40%
height=40%

要画一个菜单框或者说悬浮菜单,使用的属性是
menu_pixmap_style = "box_*.png"
box_c.png是一个像素的透明黑,这样,我们就定义了一个透明黑的样式框做为悬浮菜单。

这时的主题文件内容是这样的:
# AJGZS theme for GRUB2

desktop-image: "back.jpg"
title-text:""

+ boot_menu {
        top = 12%
        left = 6%
        width = 40%
        height = 40%
        menu_pixmap_style = "box_*.png"
        item_spacing = 0
        item_color = "yellow"
        selected_item_pixmap_style = "box_*.png"
        selected_item_color= "yellow"
}

在前面的主题中,我们没有使用menu_pixmap_style属性,可以理解为menu_pixmap_style是一个全透明的样式框,所以菜单框是全透明的,看不见。


由本次主题的菜单框可以看到,整个菜单项区域与菜单框的边界是有一定的空白的,这个属性叫item_padding,其默认值是14,如果有需要可以调整这个值。
item_padding=14

菜单项默认的高度是42,有需要可以调整
item_height=42

菜单项的样式框默认全透明,有需要可以换个花样
item_pixmap_style="box_*.png"

象下图,我特意将菜单项样式框item_pixmap_style和菜单项间距item_spacing显示出来,当然这样不好看

这样,我们就知道boot_menu组件就是一个菜单框(menu_box),菜单框里有菜单项框(item_box 和 selected_item_box)
菜单项之间有item_spacing, 菜单项与菜单框边缘有item_padding

注:
menu_box的样式就是menu_pixmap_style
item_box的样式就是item_pixmap_style
selected_item_box的样式就是selected_item_pixmap_style

图标的使用
--------------------

从前面的示例我们可以看到,菜单项的左端有一段空白,这段空白其实是预留来显示图标的,图标是菜单项的一部分。
要怎样才能显示图标出来呢?
1.主题文件所在文件夹里需要有icons子文件夹
2.icons子文件夹里要有用到的图标文件
3.在配置文件grub.cfg中使用menuentry命令时指定图标文件参数,如:
menuentry "2.WinPE" --class recovery --hotkey=2 {run /pe.wim;}

其中的 --class recovery 参数就是指该菜单项使用图标 recovery.png
这时如果recovery.png存在于主题文件夹的icons子文件夹中就会在菜单中显示出来,如果不存在那么相应的位置就显示空白。

图标的大小默认32*32,即
icon_width=32
icon_height=32
有需要可以调整此大小
这个图标大小是指显示在菜单中的大小,与图标图片的实际大小可以是不一样的,比如你可以使用128*128的图标图片,在菜单里默认显示为32*32或者你设定的大小。当然,为了节约资源,建议图标图片也是32*32的。如果觉得图标过大,可以设置显示为24*24等等。

如果不想显示图标也不想留此空白,就把图标宽度设为0,如
icon_width=0

有彩色图标,有黑白图标,有圆形图标,有方形图标,平时收集好,可以根据主题需要选用。
附件是我收集的图标。可以选择用到的图标文件放到主题文件夹的icons子文件夹中。
icons.7z (1.31 MB, 下载次数: 364)

也附上我的透明黑和透明白图素
文件名中的数字越大表示越黑/白
想用哪个就将哪个改名为box_c.png放到主题文件夹中
由于是透明黑/白,两个图框重叠的时候会自动加深颜色,所以只需要用一个就能实现高亮。
透明黑.7z (334 Bytes, 下载次数: 96) 透明白.7z (288 Bytes, 下载次数: 96)
回复

使用道具 举报

4#
 楼主| 发表于 2020-5-14 15:54:35 | 显示全部楼层
本帖最后由 hilsonma 于 2020-6-12 14:05 编辑

倒计时

当我们在配置文件grub.cfg中将timout变量设定为正数时,默认菜单会在屏幕最下方出现一行倒计时文字:
高亮项将在xx秒后自动执行。

grub2主题有3个组件可以定义类似的倒计时提示,各有特色。
这三个组件分别是标签、进度条、进度环。

标签
----------

我们可以使用标签组件在主题里定义倒计时提示。标签组件的定义如下:
+ label {属性1=值1 属性2=值2 ...}

只要将标签组件的id属性设定为"_timeout_",就可以在指定位置以指定颜色显示即将自动执行默认启动项所剩余的秒数
我一般将此秒数显示在默认启动项(第一条菜单项)的右端。
按照我的经验,这个位置的
top是boot_menu的top+25
left是boot_menu的left+width-35
颜色使用selected_item_color
这样,倒计时标签组件的属性设置如下:

+ label {
        id = "__timeout__"
        top = 30%+25
        left = 70%-35
        color = "#fff"
}


这时,包含倒计数秒的主题文件内容如下:
# Elegant theme for GRUB2

desktop-image: "back.jpg"
title-text:""

+ boot_menu {
        top = 30%
        left = 30%
        width = 40%
        height = 40%
        item_spacing = 0
        item_color = "#ccc"
        selected_item_pixmap_style = "box_*.png"
        selected_item_color= "#fff"
}

+ label {
        id = "__timeout__"
        top = 34%
        left = 65%
        color = "#fff"
}

主题效果如下图:



如果要象默认菜单那样在屏幕最下方显示一行文字
如下设置标签组件属性:

+ label {
        id = "__timeout__"
        top = 100%-25
        width = 100%
        #组件宽度=整个屏幕的宽度
        text = "高亮显示的启动项将在 %d 秒后执行..."
        #文本内容,其中 %d 表示自动执行剩余秒数
        align = "center"
        #对齐方式 center即居中 left即居左 right即居右
        color = "red"
}

由于使用了中文,记得主题文件要以utf-8编码保存。



进度条
----------

进度条组件定义如下:
+ progress_bar {属性1=值1 属性2=值2 ...}

这个组件可以用来显示一个进度条,形象展示自动执行默认启动项所剩余的时间。

只需要定义 id="__timeout__" 就会在屏幕左上角显示200*30像素的进度条,黑色边框,灰色底,白色进度。
要改变进度条显示位置,就指定top和left属性,默认值top=0 left=0 即左上角
要改变进度条显示大小,就指定width和height属性,默认值width=200 height=30
要改变边框颜色,就指定border_color属性,默认值border_color="black"
要改变进度条底色,就指定bg_color,默认值bg_color="128,128,128"
要改变进度显示颜色,就指定fg_color,默认值fg_color="200,200,200"

我们也可以使用样式框来定义进度条的外观,进度条样式框包括背景样式框bar_style和进度显示样式框highlight_style
bar_style = "box_*.png"
highlight_style = "box_*.png"
如果只使用highlight_style属性,那么就看不到进度条背景,或者说进度条背景是全透明的
使用样式框属性时,border_color/bg_color/fg_color这三个属性不起作用。
使用样式框属性时,highlight_overlay = "true" 会使得highlight_style的四边四角覆盖bar_style的四边四角,默认是不覆盖的,即默认 highlight_overlay = "false"

我很少使用进度条,如果使用的话就使用样式框,这样可以带透明效果,不至于完全遮挡背景。

我们可以指定text属性来在进度条上添加文字显示,文字的颜色使用text_color属性来指定,默认text_color="black"
进度条组件的text属性可以使用变量,如
text = "@TIMEOUT_NOTIFICATION_SHORT@" 相当于text="%ds" (这是英文提示,相应中文是"%d秒")
text = "@TIMEOUT_NOTIFICATION_MIDDLE@" 相当于text = "%ds remaining." ("剩余 %d 秒")
text = "@TIMEOUT_NOTIFICATION_LONG@" 相当于
        text = "The highlighted entry will be executed automatically in %ds." ("高亮显示的启动项将在 %d 秒后执行")
使用变量的好处是grub2会根据配置文件grub.cfg中的语言设定(如lang="zh_CN")来翻译英文提示,显示成相应的语言。

实例:
+ progress_bar {
        id = "__timeout__"
        top = 80%
        left = 30%
        width = 40%
        bar_style = "box_*.png"
        highlight_style = "box_*.png"
        text = "高亮显示的启动项将在 %d 秒后执行..."
        text_color = "#fff"
}




进度环
----------

进度环组件定义如下:
+ circular_progress {属性1=值1 属性2=值2 ...}

定义一个进度环最少要指定3个属性值
+ circular_progress {
        id = "__timeout__"
        #id需指定为"__timeout__"
        center_bitmap = "cc.png"
        #环中心图片,可以是1个像素的透明图片
        tick_bitmap = "ct.png"
        #环刻度图片,建议用圆点图片,可带或不带透明度
}

这样会在左上角绘制一个32*32像素的环,环的中心是center_bitmap,环由64个刻度点组成,每个点是tick_bitmap,由12点钟方向开始,顺时针按时间进度逐点绘制。

要改变进度环的显示位置,就设定top和left,默认top=0 left=0
要改变进度环的大小,就设定width和height, 默认width=32 height=32
要指定环上的刻度点数,就设定num_ticks,默认num_ticks=64 (我如果使用进度环的话会设置刻度点数为timeout秒数的倍数)
要改变绘制的起始方位,就设定start_angle,这个属性值是以环的1/256来计算的,以3点钟方向为零,默认start_angle=-64 即-64/256 (=-1/4,以3点钟方向为零,-1/4即12点钟方向)
默认绘制方式是逐点绘制,如果要先绘制全部刻度点再让刻度点随时间流逝而逐点消失,可设定ticks_disappear = "true" (默认值ticks_disappear = "false")

实例:
+ circular_progress {
        id = "__timeout__"
        top = 80%
        left = 45%
        width = 10%
        height = 10%

        center_bitmap = "box_c.png"
        tick_bitmap = "ct.png"
        num_ticks = 30
}

回复

使用道具 举报

5#
 楼主| 发表于 2020-5-14 15:54:55 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-22 11:15 编辑

按键说明
--------------------

默认菜单是有按键说明的,如果我们要在主题中定义这个内容,可以使用标签组件或图片组件。

使用标签组件显示按键说明
----------------------------------------
标签组件在前面讲述设定倒计时界面时介绍过,我们可以在主题文件中再添加一个标签组件用来显示按键说明。
+ label {
        top = 100%-24
        width = 100%
        text = "使用 ↑ 和 ↓ 键移动选择条,Enter 键确认"
        align = "center"
        color = "#fff"
}

标签组件的text属性也有2个变量可以使用:
text="@KEYMAP_SHORT@" 相当于 text="enter: boot, 'e': options, 'c': cmd-line"
text="@KEYMAP_LONG@" 相当于 text="Press enter to boot the selected OS, 'e' to edit the commands before bootiong or 'c' for a command-line"
其实@KEYMAP_MIDDLE@ 也可以使用,但内容跟@KEYMAP_LONG@ 是一样的。


使用图片组件显示按键说明
----------------------------------------

图片组件在屏幕上显示图片。
+ image {属性1=值1 属性2=值2 ...}

最简单的定义
+ image {file="key.png"}
这样会在左上角显示key.png
如果要指定位置,就设定top和left (默认左上角)
如果要指定大小,就设定width和height,指定了width和height,会自动缩放图片成指定的大小来显示。(默认图片本身大小)
使用图片组件来显示按键说明就是将按键说明制作成图片,然后使用图片组件显示在主题上。

同理,我们可以使用多个标签组件和图片组件来在主题上显示我们的广告、标语、版权等,以及各种装饰图案。
当然,这些内容直接制作到背景图中也可以,但使用标签组件和图片组件会更灵活,可以自由组合。
回复

使用道具 举报

6#
 楼主| 发表于 2020-5-14 15:55:09 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-27 06:32 编辑

滚动条
----------

当菜单项很多,无法全部显示在菜单框上时,默认菜单就会在菜单框的右下角旁边显示一个向下箭头,表示下面还有内容,如果光标移动到最下边,再往下移动,光标不动,但菜单项会滚动显示下面的内容,这时菜单框的右上角旁边会显示一个向上箭头,表示上面还有内容。这种就是滚动条效果。

我们前面定义的菜单,照样是可以滚动的,但没有滚动条效果
要设置滚动条效果,需要在菜单框组件中设置滚动条属性。
最基本的滚动条由卷动列和卷动块组成,卷动块在卷动列中的位置提示当前显示项在所有项当中的位置,卷动块占卷动列的比例提示显示项占所有项的比例。

我们只需设置卷动块样式框,当菜单项太多无法全部显示在菜单框上时,就会在菜单框的右边显示卷动块。

scrollbar_thumb = "blue_*.png"
#卷动块样式框

默认滚动条是显示在菜单框的右边片上的。
scrollbar_slice = "east"
#滚动条在菜单框的右边片,这是默认值,不需要设置的

如果菜单框右边片不存在,那么设置了滚动条也会跟着菜单框右边片不显示。
这时我们需要设置滚动条显示在菜单框的中央片上,这样滚动条就会显示在菜单框中央片的右边,即使没有设置菜单框的样式框也能显示滚动条。
scrollbar_slice = "center"
#滚动条在菜单框的中央片,这样设置可以保证需要时显示滚动条

还可以设置这些滚动条属性:

scrollbar_frame = "box_*.png"
#卷动列样式框 (滚动条背景)

scrollbar_width = 8
#滚动条宽度,默认值=16

scrollbar_top_pad = 14
#滚动条与菜单框顶端边界距离,默认值=0
scrollbar_bottom_pad = 14
#滚动条与菜单框底端边界距离,默认值=0

#以上两项属性用于菜单框不显示时,为了使得滚动条与菜单项对齐,将滚动条与菜单框边界的距离设置为item_padding的值。

完整主题文件示例:
# AJGZS theme for GRUB2

desktop-image: "back.jpg"
title-text:""

+ boot_menu {
        top = 12%
        left = 6%
        width = 40%
        height = 40%
        menu_pixmap_style = "blue_*.png"
        item_spacing = 0
        item_color = "yellow"
        selected_item_pixmap_style = "selected_*.png"
        selected_item_color= "#e0ffff"
        scrollbar_slice = "center"
        scrollbar_frame = "blue_*.png"
        scrollbar_thumb = "blue_*.png"
}

+ label {
        id = "__timeout__"
        top = 16%
        left = 41%
        color = "#e0ffff"
}

示例图:


本例主题中,根据图片中桌子的颜色,将菜单框设置为透明蓝,将选中菜单项样式改为只采用左边片,左边片制作成上下透明居中一个圆点,圆点颜色仿吸管颜色,这样,整体色调较为一致,并且显得比较清凉。

附本例主题包:
ajgzs.7z (207.23 KB, 下载次数: 141)


附1楼完整主题包:
elegant.7z (62.3 KB, 下载次数: 157)

及图片:

评分

参与人数 1无忧币 +5 收起 理由
dfw9 + 5 很给力!

查看全部评分

回复

使用道具 举报

7#
 楼主| 发表于 2020-5-14 15:55:26 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-28 14:12 编辑

仿Windows主题

Windows桌面图标从上而下,从左至右,一列一列地排列的。
在grub2主题中,我们可以使用vbox组件做到这样的效果。

vbox是一个容器组件,也就是说,用来放置其他组件的组件。
vbox是一个竖框,透明的,看不见的。vbox里面的组件自上而下逐一放置,vbox里面最宽的组件的宽度就是vbox的宽度。vbox里面各组件的总高度就是vbox的高度。

示例:
+ vbox {
    top = 5%
    left = 5%
    + image {file = "icons/1.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/2.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/3.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/4.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/5.png"}
}

以上示例在屏幕顶端5%,左端5%处为起点(左上角)设置一个vbox,然后在vbox中放置5个图标,每两个图标之间放置一个空图标(透明图标)隔开。
这样,仿Windows图标就做好了。
接着只要参照图标间距设置菜单项间距就可以添加文字菜单,看起来就好象是图标的文字说明一样。

完整的主题如下:
# win theme for GRUB2

desktop-image: "back.jpg"
title-text: ""

+ vbox {
    top = 5%
    left = 5%
    + image {file = "icons/1.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/2.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/3.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/4.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/5.png"}
}

+ boot_menu {
    top = 5%+32
    left = 2%
    width = 13%
    height = 100%
    item_padding = 5
    icon_width = 0
    item_height = 20
    item_spacing = 60
    item_color = "#ccc"
    selected_item_pixmap_style= "box_*.png"
    selected_item_color = "#fff"
}


如果有子菜单,子菜单就不适合使用这个主题,这时我们可以设置一个子菜单主题,在进入子菜单之前应用,例如子菜单主题为theme2.txt,grub.cfg中这样设置:
menuentry "3.Menu /diy" --hotkey=3 {theme=win/theme2.txt;run /diy;}

主菜单:

子菜单:

主题包:
win.7z (25.43 KB, 下载次数: 104)
回复

使用道具 举报

8#
 楼主| 发表于 2020-5-14 15:55:38 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-29 16:34 编辑

带工具栏主题

一些软件中,在屏幕上方,菜单栏下面,有一行或几行图标,叫工具栏。
有的界面,在屏幕下方,居中一行图标,叫dock。
在grub2主题中,我们可以使用hbox组件做到类似的效果。

hbox是一个容器组件,是一个横框,透明的,看不见的,跟vbox类似,不同的是:vbox是竖向,hbox是横向。
hbox里面的组件自左而右逐一放置,hbox里面最高的组件的高度就是hbox的高度。hbox里面各组件的总宽度就是hbox的宽度。


示例:
+ hbox {
    top = 100%-35
    left = 50%-136
    + image {file = "icons/1.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/2.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/3.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/4.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/5.png"}
    + image {file = "icons/space.png"}
    + image {file = "icons/6.png"}
}

以上示例在屏幕底部设置一个hbox,然后在hbox中放置6个图标,每两个图标之间放置一个空图标(透明图标)隔开。
top=100%-25 left=50%-136 是怎样计算出来的呢?

示例中使用的图标是32*32的,屏幕底部再留一点空白,所以top=100%-35
空白图标是16*1的,所以6个图标+空白间隔 总宽度=32*6+16*5=272,所以除了hbox,屏幕空白为100%-272,为了居中放置hbox,左右空白相等,所以左边空白为50%-136,所以left=50%-136

这排图标的功能我们可以使用热键来实现,在grub.cfg中菜单之后如下设置:
hiddenentry "[F1]" --hotkey f1 { command;... }
hiddenentry "[F2]" --hotkey f2 { command;... }
...

其实相当于隐藏的菜单项,hiddenentry是wintoflash版本grub2提供的功能。

上例中,只有一排图标,没有文字说明,界面不友好。我们可以在图标上方加上按键提示。
为了提示跟图标对齐,我们使用vbox,一个提示加一个图标放到一个vbox,6个图标就使用6个vbox,再将这6个vbox放到一个hbox中,各vbox之间使用空白图标间隔,设置如下:
+ hbox {
    top = 100%-55
    left = 50%-136
    + vbox {
        + label {text = "[F1]" color = "#ffffff"}
        + image {file = "dock/1.png"}
    }
    + image {file = "dock/space.png"}
    + vbox {
        + label {text = "[F2]" color = "#ffffff"}
        + image {file = "dock/2.png"}
    }
    + image {file = "dock/space.png"}
    + vbox {
        + label {text = "[F3]" color = "#ffffff"}
        + image {file = "dock/3.png"}
    }
    + image {file = "dock/space.png"}
    + vbox {
        + label {text = "[F4]" color = "#ffffff"}
        + image {file = "dock/4.png"}
    }
    + image {file = "dock/space.png"}
    + vbox {
        + label {text = "[F5]" color = "#ffffff"}
        + image {file = "dock/5.png"}
    }
    + image {file = "dock/space.png"}
    + vbox {
        + label {text = "[F6]" color = "#ffffff"}
        + image {file = "dock/6.png"}
    }
}

示例图:


其实就是grubfm中使用的主题,我略加修改。
本例中,选中菜单项的样式框我使用了下边、右边、左上角。
原本grubfm中只使用下边片的,我觉得只有一条横线并不能凸显菜单项,所以加了右边片,后来发现再加上左上角时,移动选择时会有动感显示,所以又加上左上角片。

我估计,只要上方(左上,上,右上其中之一)和下方(左下,下,右下其中之一)都有分图片时,移动选择就有动感,这个没有测试,有兴趣的朋友可以试一试。我的分图片多数是一样的,是一个像素的图素,所以只要复制一份改改文件名就可以了。

附主题包:
slack.7z (37.23 KB, 下载次数: 163)
回复

使用道具 举报

9#
 楼主| 发表于 2020-5-14 16:03:55 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-28 18:20 编辑

动画主题

在wintoflash版本的grub2中提供了一个动画组件,可以用来显示动画。

要显示动画,首先要在grub.cfg中设置grub_frame_speed变量,如下:
grub_frame_speed=100
#动画帧速为100毫秒每帧,可根据需要改成合适的值

主题文件中如下设置动画组件:(最少要设置以下4个属性)
+ animation {
        size_ratio = 1
        image_format = jpg
        dir_name = "logo"
        frame_number = 162
}

属性说明:

size_ratio = 1
#显示的大小是width/height的几分之一
#如果此值是2则显示出来的动画大小是width/height的1/2
#如果此值是3则显示出来的动画大小是width/height的1/3,依次类推。

image_format = jpg
#动画序列图片的扩展名,支持 png, jpg, jpeg, tga

dir_name = "logo"
#动画序列图片所在文件夹,必须是主题文件所在文件夹的子文件夹
#此文件夹中的文件必须是动画序列图片,图片命名必须是数字加扩展名
#图片命名从1开始,连续编号,如:1.jpg,2.jpg,3.jpg ...

frame_number = 162
#动画帧数,即使用到的序列图片总数
#此值一般等于实际图片的总数
#此值可以比实际图片少,但不要大于实际图片数,否则找不到图片,动画消失。

默认top=0 left=0 width=32 height=32
请根据需要设置。

play_once = pause
#动画播放一次后暂停并显示最后一帧
play_once = disappear
#动画播放一次后消失
#play_once为其他值或不设置,则为循环播放

动画组件还有更复杂的属性设置,可以自行查看说明档学习,我还不熟悉,就写到这里。

示例:
+ animation {
        top = 15%-32
        left = 50%-32
        width = 64
        height = 64
        size_ratio = 1
        image_format = png
        dir_name = "logo"
        frame_number = 7
}

示图:


主题包: elegant加动画.7z (188.79 KB, 下载次数: 210)

我知道的一个动画应用例子就是开机时先显示一段动画,动画过后再显示菜单。
这个做法其实是使用两个菜单文件,第一个菜单文件不显示菜单,设定了动画主题和等待秒数,等待秒数配合显示动画,达到等待秒数后默认进入第二个菜单文件。


http://hilsonma.ys168.com/  grub2/start.7z
回复

使用道具 举报

10#
 楼主| 发表于 2020-5-17 16:50:35 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-17 17:02 编辑
wintoflash 发表于 2020-5-16 14:03
楼主还在写吗?
我也更新了一下我这边的文档。
https://a1ive.github.io/grub2_gfx_zh.html

在写的,写到进度条进度环,这刚好是我不怎么用的,所以写得不是很耐心,这两天也没空,就干脆歇一歇再继续写。要不我现在先把草稿发上,晚点再修改修改。
回复

使用道具 举报

11#
 楼主| 发表于 2020-5-21 14:43:36 | 显示全部楼层
终于完成倒计时的各种设定。
回复

使用道具 举报

12#
 楼主| 发表于 2020-5-26 21:21:48 | 显示全部楼层
完成滚动条设置。
回复

使用道具 举报

13#
 楼主| 发表于 2020-5-27 12:19:51 | 显示全部楼层
本帖最后由 hilsonma 于 2020-5-27 12:21 编辑
ksafei 发表于 2020-5-27 10:27
请教下,我测试主题时背景总有一个黑色输出窗口,请问怎样去除

在grub.cfg开头加上这一句:
enable_progress_indicator=0

或者使用最新版本的grub2

这是因为之前一些版本默认enable_progress_indicator=1 (显示进度)
回复

使用道具 举报

14#
 楼主| 发表于 2020-5-28 18:04:17 | 显示全部楼层
算是完成了。
回复

使用道具 举报

15#
 楼主| 发表于 2020-5-29 16:36:52 | 显示全部楼层
下载过slack.7z这个主题包的坛友请重新下载,原先打包漏了一个图片black_c.png
回复

使用道具 举报

16#
 楼主| 发表于 2020-6-2 13:53:53 | 显示全部楼层
本帖最后由 hilsonma 于 2020-6-2 14:11 编辑
ksafei 发表于 2020-6-2 10:34
菜单:
set default=0
set fallback=2

把cat --set=modlist ${prefix}/insmod.lst; 和 efi_connect_all 这两行注释掉试试

不过在我的电脑上这两行有没有都不会出问题,不明白你是什么情况

点评

注释掉还是不行 确实有点奇怪,同样的命令grub2_0526版本可以,换了新版就不行 你用新版正常,看来可能是我生成grub2及U盘或电脑的问题  详情 回复 发表于 2020-6-2 15:15
回复

使用道具 举报

17#
 楼主| 发表于 2020-6-3 19:41:38 | 显示全部楼层
本帖最后由 hilsonma 于 2020-6-3 19:45 编辑
Blan77 发表于 2020-6-2 17:28
感谢您提供全面的教程。 我将尝试将其翻译成英文。
我已经有关于主题的俄语文章

谢谢。
我是懒得再写一遍英文了。

相关表达可以参看官方文档这篇wiki
动画组件我用的是wintoflash版本的,详细说明看他的文档
回复

使用道具 举报

18#
 楼主| 发表于 2021-2-15 21:00:11 | 显示全部楼层
AndyChen 发表于 2021-2-15 17:01
我的中文菜单的中文不能正常显示,请问怎么设置

检查grub.cfg是不是以utf-8编码保存

菜单可直接使用中文,实机是可以正常显示的。
但虚拟机可能需要使用图形模式才能正常显示。

要使用图形模式,要以下三条:
1. grubx64.efi需包含gfxterm efi_gop efi_uga 这三个模块
2. grub.cfg中加上这两句:
    terminal_output gfxterm
    loadfont unicode
3. unicode.pf2 字体文件放在$prefix/fonts 中

    如果字体文件不是$prefix/fonts/unicode.pf2 ,就按实际字体路径修改grub.cfg中加载字体这句
    loadfont /mydir/myfont.pf2
    如果字体文件不是跟grub.cfg同一个分区,还需要先确定字体所在分区再加载
    search -s -f /mydir/myfont.pf2
    loadfont /mydir/myfont.pf2

评分

参与人数 1无忧币 +5 收起 理由
AndyChen + 5 很给力!

查看全部评分

回复

使用道具 举报

19#
 楼主| 发表于 2021-2-15 21:22:24 | 显示全部楼层
AndyChen 发表于 2021-2-15 21:13
发现了一个问题,设置好后,启动正常,关机后,重启,选择了菜单,就卡住了。。。,解决办法就是进入BIOS, ...

看不懂你的描述,最好上图。

另外,本贴是讨论grub2主题的,如果不是与主题相关的问题应该到相应的贴子提问或者开新贴。
回复

使用道具 举报

20#
 楼主| 发表于 2023-2-6 18:02:27 | 显示全部楼层
ha2474984 发表于 2023-1-13 23:14
菜单标题怎么修改

title-text:""
# 菜单标题为空,就是不显示菜单标题

只有显示与不显示,没有上面这句就是显示,有上面这句就是不显示。

没有提供修改菜单标题的项,其实也不需要,你只需要让菜单标题不显示,然后就可以使用标签组件或图片组件做出你中意的菜单标题,当然,也可以将菜单标题做在背景图上,这些都是可以灵活运用的哈。
回复

使用道具 举报

21#
 楼主| 发表于 2023-3-28 09:04:36 | 显示全部楼层
azu2019 发表于 2023-3-27 17:17
感谢楼主分享这么详细的教程,非常强大!!请问grub主题可以使用鼠标点击吗

应该是不可以。
wintoflash 曾做过grub2鼠标驱动,但效果不太理想,体验不好,不建议用。
回复

使用道具 举报

22#
 楼主| 发表于 2023-9-10 23:32:25 | 显示全部楼层
hcm33041 发表于 2023-9-10 17:10
大佬,你好,可以细说一下如何使用两个主题文件来显示开机动画,之后显示启动菜单吗,我试了好久没有成功 ...

我有提供实例呀,你先用我的实例去试有没有成功,有问题再提问
回复

使用道具 举报

23#
 楼主| 发表于 2023-9-12 20:38:33 | 显示全部楼层
hcm33041 发表于 2023-9-12 20:21
大佬,开机右上角会有这个提示,[grub.cfg 3.83KIB 100x 44.56KIB/s],动画进度提示已经关了,这个要怎么关 ...

看看28楼的提示有没有帮助
http://bbs.wuyou.net/forum.php?m ... 9525&fromuid=586362
回复

使用道具 举报

24#
 楼主| 发表于 2023-9-12 23:33:35 | 显示全部楼层
hcm33041 发表于 2023-9-12 21:28
这个是加了的,没有用

换个grub2版本试试,也仔细检查你的grub.cfg和主题文件,看有没有作相关的设置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-22 15:11

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表