LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 11097|回复: 32

Unicon重见天日

[复制链接]
发表于 2005-11-27 07:14:14 | 显示全部楼层 |阅读模式
Unicon重见天日
我是上个世纪70年代出生的上海人,最早接触的电脑是街机游戏,在小学里中午上学途中,只玩过一次,2元钱换来3分钟的快乐.在读闵行中学初中部的时候,学校里有 Apple II 和 LASER 300,非电脑兴趣小组的学生只能在电脑房外看看放拖鞋的柜子,偶尔一个星期进去上节电脑课.我到现在还记得机房里那股电子元件,机箱塑料受热发出的气味,真是让我上瘾.为了能混进电脑小组,我曾经一连几个星期在兴趣小组活动的时间到电脑房外晃悠,总算电脑老师发慈悲,收留了我,后来还推荐我去少年宫学电脑.DOS3.3是我最早接触的操作系统,我这个年纪的人都还记得吧?一个黑底白字的屏幕,没有鼠标,软盘启动,5英寸的那种,软软薄薄的,软驱运转起来喜欢发出剃头一样的声音.统统是命令行的界面,编程用BASIC,PASCAL,DBASE,LOGO,游戏有LoadRunner什么的.我这个人就是喜欢往机器的最底层去钻研,看见用张5寸的软盘塞进去,一开机,游戏就自动运行,真是神奇啊,我到处找资料,最后知道在机器里住着个监控系统,为了搞清楚监控系统是怎么回事,偷偷地拿少年宫老师的打印机和纸张来打印,老师发现后大发雷霆.少年宫的电脑老师姓阴,名字我记得,这里先不说,免得他生气.老师是个白面书生,戴副眼镜,很聪明,用PASCAL编了个猜数游戏让我们去参加比赛,得了奖.
后来我考进了上海市第一师范,也没怎么再正经学过电脑,四年光阴有三年都花在练钢琴上了,总算和键盘有缘吧,反正现在都忘记了.
工作后在学校里当小学老师.在1995年时学校里配了许多486的兼容机,8M内存,640M的硬盘,运行windows3.1什么的,前两年学校里买废品,我花20元买了一台,后来给它升级,装了64M内存,40G硬盘,slackware-current,当然少不了Unicon.现在它还在我的阁楼上放着.我最遗憾的事是当时没把 Apple II 和 LASER 300 的机子也买下来,主要是怕老婆说我乱花钱.我对自己的童年感到最最遗憾的事就两件,另一件就是我妈把我小时候积攒的连环画都送人了.
如今我家中有三台电脑,一台是自己配的,华硕P4B533的主板,金士顿256M,GF4MX440,60G硬盘什么的,反正现在也还凑合,还有一台是学校老师自己家里淘汰不要的,CY433,SLOT1接口接触不良,我花120元配了个815ep的主板什么的,现在还行.反正我大多数时间都是在学校里抱着我的486上网,玩BT下载什么的,办公室人多,自己有台电脑用着方便.看来看去,都是黑乎乎的屏幕,大家都以为我有病.哼,谁会把家里好的电脑搬来?
各种中文控制台我是都试过的,zhcon,cce都很好,只是Unicon实在是用起来最方便的一个,zhcon能很好适应内核的升级,基本不需要太多的修正就能运行,只有那个包含头文件缺失的小问题,可是zhcon一开,screen什么的使用伪终端的程序好像都不能运行,控制台间切换会有黑屏(486上),控制台间不能用鼠标复制,等等.cce有点小bug,许多人会报告启动时黑屏;我的问题是字体大小什么的调不好,但是cce可以在hurd上运行,这时毛病也有,屏幕中间最左端有个短横去不掉.
说来说去,我最喜欢的还是Unicon.但是要在今天用上Unicon,还不是件容易的事,原因如下:
1> Unicon的源码最近一次发布是2001年9月24日,这是我根据源码包的编号猜的,源码包全名是 unicon-3.0.4-20010924.tar.gz ,然后有韩国人打过一个补丁 vd_unicon-userland-20031122vd.patch,这两个都是关于Unicon输入法部分的源码.今天,在slackware10.1上已不能正常编译,主要是g++头文件更新,还有是其中的部分函数过时了.
2> 要使Unicon工作,还要对内核打补丁,我试过最好的2.4版内核补丁是 vd_kernel-2.4.21+unicon-3.0.4-20010924.patch 和 vd_kernel+unicon-3.0.4-20010924-2.4.21-2.4.22-incr.patch,内核2.6版的补丁是一个日本人维护的,最新的网站好像是http://vdlinux.sourceforge.jp/dists/. 我使用后发现Unicon输入法不能工作,就发邮件向他询问,得到的答复是输入法不关他的事,这在他的网页上有记录的.
3> 使用framebuffer的控制台可以用图片作背景,有朋友也想在zhcon上用用,但我没见过有人去整的.在2.4版上Unicon可以配合fbsplash(gensplash),但有网友说在2.6版的内核上不行,我没有试过,据这个论坛里的帖子说,gentoo有补丁可以解决这个问题,我还没有研究.

今天,我在经过连续两周的奋斗后,终于整出了可以在内核2.6.14.2上运行的Unicon,包括输入法部分,主要工作向大家汇报如下:
1> 输入法部分:更正过时的头文件,使得g++编译的部分不再出现警告.不足之处是具体的输入法模块是c语言的文件,有警告出现,但不影响使用.
更正过时的string方法,使得程序可以正常读取unicon.ini文件.文件在MyConfig.cpp.
更正Unicon输入法在内核2.6.14.2上运行的一个bug,问题症状是输入条跑到屏幕的顶部去了,不足之处是更正的手法很次.文件在 SysConfig.cpp.而这个问题产生的原因是内核中的fbcon.c发生了很大变化,这里揭示出像Unicon这样的基于内核的中文平台的一个最大的弱点是受内核发展的牵制很大,zhcon基本没有这个问题,只要内核暴露出来的接口不变,zhcon就可以一直用下去.当然,能够通过修改内核的方式提高自己的编程能力也是Unicon存在的很好借口.
2> 内核补丁部分:主要是修改 drivers/input/keyboard/atkbd.c,在 atkbd_interrupt 函数的 input_event 函数前进行拦截,试图过滤 Unicon 需要的键,然后修改 include/linux/tty_flip.h,这是完全仿照2.4版的修改方法。把 xl_keymasks.c 请回到 drivers/video/unicon.
更正 xl_unikey.c 中刷新底部输入条的位置参数,方法同输入法,太次了.

最终效果:
我想要装个framebuffer控制台下面截图的软件,我知道有几个,还没试了.
反正使用时跟2.4版的一样就是了.
要说不同,只有三点:
1> 2.6版的内核采用udev,所以要采取措施使/dev/unikey加入 /etc/udev/scripts/make_extra_nodes.sh ,不然,每次开机都要mknod.
2> 除了第一个控制台外,其他的控制台都要运行loadunimap,不知有没有办法在开机脚本中一次解决这个问题,loadunimap本身已经过时,应该用setfont来取代.
3> 关机时一行行的警告多了点,需要在关机脚本中先kill unicon的进程.

另外,这次修改是在默认安装的Slackware10.1的版本上进行,10.2正在下,虽然我不是很愿意没事找事的去升级到没有gnome的版本。不过我想在10.2上应该是没什么大问题的。

安装过程:
0> 下载点:
   gmail       http://mail.google.com   名字: mysoft008   密码: mysoft007
   永硕E盘    http://hj18.ys168.com   用IE浏览
   mofile     匿名提取文件连接 http://pickup.mofile.com/7857813975846167
                 或登录Mofile,使用提取码 7857813975846167 提取文件
1> 输入法:
    源码包:  unicon-3.0.4-20010924.tar.gz
    补丁:    unicon-3.0.4-update.patch
放在同一个目录下面.
安装步骤:
[PHP]tar xzvf unicon-3.0.4-20010924.tar.gz
cd unicon-3.0.4
cat ../unicon-3.0.4-update.patch |patch -p1
./configure && make
make install     /* 或者 checkinstall */[/PHP]
请想要在这里研究编程的朋友注意,要是想多次编译这个包的话,请把 "install: all" 中的 "make data-install;" 去掉,这样调试起来方便,不用每次去重新制作输入法的数据文件.
2> 内核补丁
原因是我没有掌握好patch的用法.
    源码包:    linux-2.6.14.2.tar.bz2
    补丁:      unicon-kernel-20051125.patch
    字体文件:  unicon-fonts.tar.gz
为表达方便,把这些文件放在/usr/src/
然后以root身份执行:
[PHP]tar xjvf linux-2.6.14.2.tar.bz2
rm linux    /* 如果这里没有这个叫做"linux"的符号链接,就不用做这一步.  */
ln -s linux-2.6.14.2 linux
cd linux
cat ../unicon-kernel-20051125.patch |patch -p0
cd ../
tar xzvf unicon-fonts.tar.gz  /* 安装字体包 */
cp unicon-fonts/\* linux/drivers/video/unicon
cd linux
make menuconfig[/PHP]
确保选中"Device Drivers" --> "Graphics support" --> "Support for frame buffer devices" --> "UNICON console support" 和 "VESA VGA graphics support" 以及 "Console display driver support" --> "Video mode selection support"
在确定其他 config 的选项后,编译内核
[PHP]make
make modules_install
copy arch/i386/boot/bzImage /boot/vmlinuz-unicon[/PHP]
3> 开机设定
在 lilo 或 grub 或其他鬼知道是什么的引导管理器中设定内核加载,我就不多说了,不明白的看置顶帖.就是要加上这句:
[PHP]vga=771[/PHP]
这是说明:
[PHP]
\# Normal VGA console
\# vga = normal
\# VESA framebuffer console @ 1024x768x64k
\# vga=791
\# VESA framebuffer console @ 1024x768x32k
\# vga=790
\# VESA framebuffer console @ 1024x768x256
\# vga=773
\# VESA framebuffer console @ 800x600x64k
\# vga=788
\# VESA framebuffer console @ 800x600x32k
\# vga=787
\# VESA framebuffer console @ 800x600x256
\# vga=771
\# VESA framebuffer console @ 640x480x64k
\# vga=785
\# VESA framebuffer console @ 640x480x32k
\# vga=784
\# VESA framebuffer console @ 640x480x256
\# vga=769[/PHP]
可是按照我的补丁,只能使用771,如果是769,输入条的位置就不对了.确实是个bug,希望大家帮忙。
在 /etc/rc.d/ 中放个文件叫做 rc.unicon
[PHP]#!/bin/sh
#
# /etc/rc.d/rc.unicon:  unicon script.
#
# Put any local setup commands in here:

modprobe unikey
modprobe encode-gbk

setfont -C /dev/tty1 -u /usr/local/lib/unicon/direct.uni
setfont -C /dev/tty2 -u /usr/local/lib/unicon/direct.uni
setfont -C /dev/tty3 -u /usr/local/lib/unicon/direct.uni
setfont -C /dev/tty4 -u /usr/local/lib/unicon/direct.uni
setfont -C /dev/tty5 -u /usr/local/lib/unicon/direct.uni
setfont -C /dev/tty6 -u /usr/local/lib/unicon/direct.uni

if [ -x /usr/local/bin/unicon ]; then
echo "Starting Unicon 3.0.4 ..."
/usr/local/bin/unicon --gbk >/dev/null 2>&1
fi[/PHP]
然后让这个脚本具有执行权限
[PHP]chmod +x /etc/rc.d/rc.unicon[/PHP]

编辑 /etc/udev/scripts/make_extra_nodes.sh
在最后加上:
[PHP]if grep "2.6" /proc/sys/kernel/osrelease 1> /dev/null 2> /dev/null; then
        mknod /dev/unikey c 10 202
fi
[/PHP]
关机脚本,先放个/etc/rc.d/rc.unicon-stop
[PHP]#!/bin/sh
pid=`ps ax | awk '{if (match($5, ".*/unicon$") || $5 == "unicon") print $1}'`
if test "$pid" != ""; then
  kill $pid
  echo "unicon: stopped scheduler."
fi
[/PHP]
然后
[PHP]chmod +x /etc/rc.d/rc.unicon-stop[/PHP]

编辑/etc/rc.d/rc.6

PATH=/sbin:/etc:/bin:/usr/bin的后面加上
[PHP]if [ -x /etc/rc.d/rc.unicon-stop ]; then
        . /etc/rc.d/rc.unicon-stop
fi
[/PHP]

如果补丁有问题的话多半是我还不会用diff,cvs,tar等工具,希望大家指正,其实我应该算刚开始学编程,都是让Unicon给逼出来的.
发表于 2005-11-27 10:00:03 | 显示全部楼层
太好了..一会试试
回复 支持 反对

使用道具 举报

发表于 2005-11-27 10:06:51 | 显示全部楼层
Post by hj_18

[PHP]tar xjvf linux-2.6.14.2.tar.bz2
rm linux    /* 如果这里没有这个叫做"linux"的符号链接,就不用做这一步.  */
ln -s linux-2.6.14.2 linux
cd linux
cat ../unicon-kernel-20051125.patch |patch -p1
cd ../
tar xzvf unicon-fonts.tar.gz  /* 安装字体包 */
cp unicon-fonts/* linux/drivers/video/unicon
cd linux
make menuconfig[/PHP]

我这里上边的"cp unicon-fonts"后就看不到东西了..但引用编辑回帖时却能看见.是论坛的问题?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-27 12:16:14 | 显示全部楼层
Post by wangtzh
我这里上边的"cp unicon-fonts"后就看不到东西了..但引用编辑回帖时却能看见.是论坛的问题?


是我当时不知道还要在里面加转义字符,刚才去听课了,耽误您了。
回复 支持 反对

使用道具 举报

发表于 2005-11-27 12:39:02 | 显示全部楼层
scim说是很快就发布控制台的输入法,可是没有了动静。
unicon这种被动的打补丁做法实在是郁闷的很。
不知道能不能做成那种不用打补丁,而能在内核源码支持下单独编译成内核模块的形式
这样维护起来也方便,使用起来也方便。

谢楼上的兄弟,马上试试去!能使用输入法就不错,现在2.6内核下的unicon虽然能显示汉字,但是输入法不能使用也实在是够郁闷的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-27 13:06:05 | 显示全部楼层
Post by wjping119
scim说是很快就发布控制台的输入法,可是没有了动静。
unicon这种被动的打补丁做法实在是郁闷的很。
不知道能不能做成那种不用打补丁,而能在内核源码支持下单独编译成内核模块的形式
这样维护起来也方便,使用起来也方便。


这个难度就大了,unicon修改了内核底层的部分才得以显示中文,我看截获键盘中断的补丁是一定要的,而把显示中文的部分移出内核应该是可行的,就像xterm之类的一样。以后我想让unicon用上xft的字体就爽了。
回复 支持 反对

使用道具 举报

发表于 2005-11-27 13:18:41 | 显示全部楼层
是难度大点,但是完成了以后就几乎无忧了,不是吗?
要是做不成这样的话实在是没有发展前途,只能跟在kernel后面跑,不是根本办法。
既然scim有意放出控制台的输入法(估计已经差不多了),你不如参与苏哲的这个东西,然后为scim写一个kernel模块,这样也能达到unicon的效果。毕竟unicon真的是老了。
回复 支持 反对

使用道具 举报

发表于 2005-11-27 13:56:24 | 显示全部楼层
我打的是这两个补丁,中文能正常显示,但不能 输入中文
  vd_unicon-kernel-20051029-2.6.14.patch
vd_unicon-kernel-fonts-20040205.patch
楼主,我想问下,要让中文得以输入,应该还打哪个patch。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-27 14:28:12 | 显示全部楼层
Post by sting0z
我打的是这两个补丁,中文能正常显示,但不能 输入中文
  vd_unicon-kernel-20051029-2.6.14.patch
vd_unicon-kernel-fonts-20040205.patch
楼主,我想问下,要让中文得以输入,应该还打哪个patch。

我的补丁就是在这两个补丁的基础上做的,你打的补丁里没有截断键盘中断的代码,所以不能输入中文,我的文章里提供我做的补丁下载,请在干净的内核源码下试用,当然你要是愿意看看我的补丁,就知道以后该怎样手工的给日本人做的补丁做修改了,也就不用靠我做新的补丁了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-27 14:32:17 | 显示全部楼层
Post by wjping119
是难度大点,但是完成了以后就几乎无忧了,不是吗?
要是做不成这样的话实在是没有发展前途,只能跟在kernel后面跑,不是根本办法。
既然scim有意放出控制台的输入法(估计已经差不多了),你不如参与苏哲的这个东西,然后为scim写一个kernel模块,这样也能达到unicon的效果。毕竟unicon真的是老了。

我看过skim(scim)的一些介绍,觉得他的设计是与unicon一脉相承的,体系结构什么的都很相似,甚至我怀疑开发者是同一个人或者是同一个团队里工作过的。实际上unicon原来就被设计为在控制台和X下都能工作的,X下靠的是Chinput。所以我还有个不自量力的想法是让unicon在X下也能工作。
回复 支持 反对

使用道具 举报

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

本版积分规则

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