当前位置:首页 > 信息技术 > 操作系统 > Linux > gfxmenu定制高级教程(新增可定制菜单)

gfxmenu定制高级教程(新增可定制菜单)

本教程介绍从源代码的角度来定制gfx的菜单,比较适合喜欢DIY的用户。我修改了一下gfxboot的代码,使得定制工作完全可以在Windows环境下运行,也方便没有Linux的用户了。

1,下载和编译

首先,下载msys工具包:

http://nufans.net/grub4dos/grub_msys_v4.zip

编译工作需要在sh环境下进行。工具包里没有cpio,但在帖子”grub4dos 的 gfxmenu 支持”的#9可以找到,把文件复制到bin目录或者系统路径能找到的地方。

然后,下载SuSE风格的配置文件:

3.2系列:
http://nufans.net/grub4dos/gfxboot-3.2.zip

3.3系列:
http://nufans.net/grub4dos/gfxboot-3.3.zip

3.3系列可定制菜单:
http://nufans.net/grub4dos/gfxboot-3.3-custom.zip

输入

make

就能编译成功,生成文件在 boot/message。

2、基本定制

back.jpg
背景图片。置换后,再运行一下make就能把新的图片加进message,比用cpio命令要快。

help-boot.en.html, help-boot.zh_CN.html, help-install.en.html, help-install.zh_CN.html
中英文帮助信息,可以按自己的需要进行修改。html语句不要用得太复杂,不然gfxmenu可能处理不了。

po/bootloader.pot, po/zh_CN.po
中英文的信息翻译,bin目录里是一些有用的工具,在README里有介绍。比如说,要加一个新翻译Boot Windows,可以在po目录里输入:

bin/add_text bwin “Boot Windows”

然后,打开zh_CN.po,找到

#. txt_bwin
msgid “Boot Windows”
msgstr “”

“” 改为 “启动Windows” 就行了。记得要使用UTF-8编码。

16×16.fnt
在3.2系列里,生成字体的程序getx11font需要X-Window的支持,在Windows下无法使用。因此,不要运行make font来生成字体。里面的16×16.fnt是我预先定制的,包含500个常用汉字。

在3.3系列里,生成字体的程序mkblfont可以在Windows下使用,我把相应的exe文件加上了。目录里的chs.txt是包含的汉字,共有3500个,应该是足够了。如果有缺字的话,可以修改chs.txt,然后运行make font生成新的字体文件。不过,新版字体和旧版是不兼容的,不能把这里生成的字体拿到3.2系列里用。

字体缺省使用宋体,你也可以按需要改动。打开Makefile,找到:
aafont:
mkblfont -v -l 18 \
-a 0x20-0x7e,0xa0-0xbf,0xc1-0xcb,0xcd-0xce,0xd0-0xd1,0xd3-0xd8,0xda-0xff \
-t chs.txt \
-f simsun:prop=2:space_width=4:size=17:nobitmap=1:autohint=1 \
16×16.fnt >16×16.log

可以把simsun改为其他值。控制面板的字体里显示了系统里所有的字体,只要把文件名里的后续去掉就行了。比如说,黑体是simhei。

3、使用可定制菜单(3.3系列)

为了方便大家修改message的参数,我制作了一个可定制的message文件。你可以通过编辑message里的gfxboot.cfg文件,来达到定制的目地,而不需要进行重新编译了。

message里的gfxboot.cfg列出所有的选项,不过在变量前都加上了#,变为注释了。使用时,先把#和其后的空格去掉,然后再根据自己需要修改数值。

目前支持的参数有:

boot_show (缺省值0)
值为0时,隐藏Options编辑框,值为1时显示。因为options框实际上是没有作用的,建议把它隐藏起来。

xmenu_hide_current (缺省值0)
值为1时,隐藏语言下面的“简体中文”的字样。

menu_start_x, menu_start_y
菜单左上角的x,y坐标。

menu_max_entries(缺省值8)
最多显示的菜单行数

menu_bar_min_width(缺省值300)
选择菜单条的最小宽度。如果不想菜单条过长,可以把这里的值设得很小,例如1,那样的话,菜单条的长度就会自动设为菜单项的最大长度了。

menu_text_normal(缺省值0xfffff,即白色)
一般菜单项的字体颜色,使用rgb的数值

menu_text_select(缺省值0)
当前选择项的字体颜色

boot_text_options (缺省值0xfffff)
options框字体颜色

boot_text_normal (缺省值0xfffff)
启动文本字体颜色

infobox_bg (缺省值0xd8deed)
帮助信息框的背景颜色

infobox_text_normal(缺省值0)
帮助信息框的字体颜色

menu_bar_color (缺省值0xffffff)
菜单条的颜色

loading_color (缺省值0x295202)
载入框颜色

title_bg (缺省值0x4f9805)
弹出框标题背景颜色

hide_reboot (缺省值0)
值为1时,不显示重启的按钮。

hide_poweroff (缺省值0)
值为1时,不显示关机的按钮。

disable_num_key(缺省值0)
缺省时,按1-9键就会启动相应的菜单项,把disable_num_key设为1可以屏蔽这一功能。

hide_help(缺省值0)
设为1时,隐藏F1帮助的菜单项

hide_lang(缺省值0)
设为1时,隐藏F2语言选择的菜单项

custom_width,custom_height,custom_depth
自定义屏幕大小,比如说,
custom_width=1024
custom_height=768
custom_depth=16
缺省的屏幕大小为800x600x16。

panel_normal
面板的颜色

panel_title
面板标题的颜色

panel_high
面板快捷键的颜色

panel_bg
面板弹出框背景颜色

panel_border
面板弹出框边框颜色

4、风格定制

这就需要修改inc文件。该文件是类似于forth语法的,要看懂不容易。不过,不少文件的开始就是重要常量的定义,只需要修改它们的值就能定制gfxmenu的行为。比如说,在xmenu.inc里面有很多可以定制的参数:

复制内容到剪贴板

代码:

DE>/xmenu.normal.bg        lightgray def
/xmenu.normal.fg        black def
/xmenu.selected.fg        white def
/xmenu.selected.bg        0x6c6c6c newcolorDE>

这里就是定义普通文本和选择文本的颜色。颜色可以用常量black,white,blue,red,green, yellow, lightgray, dotcolor, lightdotcolor, somegreen和lightblue(它们在common.inc里定义), 也可以直接使用RGB值。

复制内容到剪贴板

代码:

DE>small_layout {
/xmenu.maxlines        22 def
} {
/xmenu.maxlines        28 def
} ifelseDE>

这里其实就是设置菜单里显示的最大行数的。这句的意思是在small_layout时,最多显示22个菜单项,否则,最多显示28个菜单项。你可以根据需要修改它的值。

要注意的是,在3.3系列里,修改最大行数的方法改变了。你可以定制菜单框出现的位置和大小,而最大行数则根据框的大小自动算出。

5、修改代码

gfxmenu的配置文件是使用类似于forth语言的结构。它和一般高级语言有很大的区别,它是面对机器的,其核心的概念是堆栈。比如说,对于表达式:

1 + 2 * 3

在forth里表示为:

1 2 3 * +

其操作步骤为:

第一步:数字 1 进栈
第二步:数字 2 进栈
第三步:数字 3 进栈
第四步:操作符 ×,2, 3 出栈,相乘,结果6进栈
第五步:操作符 +,1, 6 出栈,相乘,结果7进栈

最后,堆栈里剩下7,就是1 + 2 * 3的结果。

由于forth和机器的运算非常接近,其解析器很小,运算速度很快,这对于gfxboot来说还是比较合适的。

在gfxboot目录下有gfxboot.html,就是gfxboot的用户指南。里面包含所有基本函数的定义。举例说:

复制内容到剪贴板

代码:

DE>* add – addition

( int1 int2 — int3 )

( string1 int4 — string2 )

( ptr1 int5 — ptr2 )

int3: int1 + int2

string2: substring of string1 at offset int4

Note: Strings are treated as byte sequences, not Unicode chars. Sizes of string1 and ptr1 are not checked.

See also: abs, and, div, max, min, mod, mul, neg, not, or, shl, shr, sub, xor

Example 9.

1 2 add         % 3

“abc” 1 add     % “bc”DE>

复制内容到剪贴板

代码:

DE>× add – additionDE>

函数的名字和简单描述

复制内容到剪贴板

代码:

DE>( int1 int2 — int3 )

( string1 int4 — string2 )

( ptr1 int5 — ptr2 )DE>

这是参数描述。 – 左边是操作前的堆栈状态,右边是操作后的堆栈状态。这里有三个,就是说add有三种不同的用法。

复制内容到剪贴板

代码:

DE>int3: int1 + int2

string2: substring of string1 at offset int4DE>

对于上面参数值的具体描述。

复制内容到剪贴板

代码:

DE>Note: Strings are treated as byte sequences, not Unicode chars. Sizes of string1 and ptr1 are not checked.DE>

说明。

复制内容到剪贴板

代码:

DE>See also: abs, and, div, max, min, mod, mul, neg, not, or, shl, shr, sub, xorDE>

其他相关的函数。

复制内容到剪贴板

代码:

DE>Example 9.

1 2 add         % 3

“abc” 1 add     % “bc”DE>

例子,% 后是运算的结果。

 

gfxmenu定制高级教程(新增可定制菜单):等您坐沙发呢!

发表评论

表情
还能输入210个字