社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 5224阅读
  • 4回复

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

楼层直达
级别: 管理员
发帖
3549
飞翔币
5005
威望
64392
飞扬币
51613
信誉值
815
本教程介绍从源代码的角度来定制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
输入
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编码。
16x16.fnt
在3.2系列里,生成字体的程序getx11font需要X-Window的支持,在Windows下无法使用。因此,不要运行make font来生成字体。里面的16x16.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 \
        16x16.fnt >16x16.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可以屏蔽这一功能。
4、风格定制
这就需要修改inc文件。该文件是类似于forth语法的,要看懂不容易。不过,不少文件的开始就是重要常量的定义,只需要修改它们的值就能定制gfxmenu的行为。比如说,在xmenu.inc里面有很多可以定制的参数:
复制内容到剪贴板
代码:/xmenu.normal.bg        lightgray def
/xmenu.normal.fg        black def
/xmenu.selected.fg        white def
/xmenu.selected.bg        0x6c6c6c newcolor
这里就是定义普通文本和选择文本的颜色。颜色可以用常量black,white,blue,red,green, yellow, lightgray, dotcolor, lightdotcolor, somegreen和lightblue(它们在common.inc里定义), 也可以直接使用RGB值。
复制内容到剪贴板
代码:small_layout {
  /xmenu.maxlines        22 def
} {
  /xmenu.maxlines        28 def
} ifelse
这里其实就是设置菜单里显示的最大行数的。这句的意思是在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的用户指南。里面包含所有基本函数的定义。举例说:
复制内容到剪贴板
代码:* 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"

复制内容到剪贴板
代码:× add - addition函数的名字和简单描述
复制内容到剪贴板
代码:( int1 int2 — int3 )
( string1 int4 — string2 )
( ptr1 int5 — ptr2 )
这是参数描述。 - 左边是操作前的堆栈状态,右边是操作后的堆栈状态。这里有三个,就是说add有三种不同的用法。
复制内容到剪贴板
代码: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"
例子,% 后是运算的结果。
附件: message.zip (552 K) 下载次数:1
 
我们一直在努力!
级别: 管理员
发帖
3549
飞翔币
5005
威望
64392
飞扬币
51613
信誉值
815
只看该作者 1 发表于: 2009-02-12
grub4dos 的 gfxmenu 支持 (更新v3)
以下的补丁为grub4dos增加gfxmenu支持(对应于svn r63)。使用时,在menu.lst里加上这句(message文件在附件里):
gfxmenu (hd0,0)/message
注意这命令只能用在配置文件里,在命令行是无效的。
不过,使用gfxmenu需要的内存很多,需要定制grub4dos以去掉不需要的模块,附件里的grldr是使用以下的命令来设置的:
../configure --disable-ffs --disable-ufs2 --disable-minix --disable-reiserfs --disable-vstafs --disable-jfs --disable-xfs --disable-graphics --disable-hercules --disable--serial --disable-iso9660 --disable-ext2fs --disable-md5-password --disable-pxe --disable-gunzip --enable-preset-menu=../preset_menu.lst
文件系统只保留fat和ntfs,其他能禁止的选项都禁止了。
附件里的文件在linux下编译,在msys里编译的也能用,只是略为大一些,message文件也能装载。
其实,可以按照minigrub的做法,把一些很少使用的功能禁止掉,需要的话在configure里打开。这样能节省不少的空间,便可以支持更大的message文件。
v2更新:
新版的grldr基本解决了大小的限制,启动的问题也解决了。而且,grub4dos原有的功能全在,不再需要简化。不过,我在configure.ac脚本里还是把一些很少用的文件系统的缺省值改为禁止(ffs, ufs2, minix, vstafs, jfs 和 xfs)。编译参数:
./configure --enable-preset-menu=preset_menu.lst
make
v3更新:
支持新版3.3.x系列的message文件。旧版的也照旧能使用,程序会自动检测message的版本。
grub4dos的内容没有改动,原有的功能全部包含。
漂亮的gfxboot文件可以在以下网址找到:
http://gnome-look.org/content/se ... cense=99&page=0
http://www.kde-look.org/content/ ... cense=99&page=0
我们一直在努力!
级别: 光盘见习
发帖
102
飞翔币
138
威望
13
飞扬币
633
信誉值
0
只看该作者 2 发表于: 2009-03-03
没看懂,不过支持一个
级别: 光盘初级
发帖
193
飞翔币
361
威望
22
飞扬币
1982
信誉值
0
只看该作者 3 发表于: 2009-03-10
这是转自时空论坛的两篇文章,老大最好注明是转帖,以倡导一种良好的发帖习惯。
唐突之处请老大见谅。
级别: 光盘中级
发帖
1537
飞翔币
409
威望
396
飞扬币
5601
信誉值
0
只看该作者 4 发表于: 2009-03-10
不是太明白
愿天使笨笨早日康复