LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: hj_18

Unicon重见天日

[复制链接]
发表于 2005-11-27 16:27:33 | 显示全部楼层
Post by hj_18
我看过skim(scim)的一些介绍,觉得他的设计是与unicon一脉相承的,体系结构什么的都很相似,甚至我怀疑开发者是同一个人或者是同一个团队里工作过的。实际上unicon原来就被设计为在控制台和X下都能工作的,X下靠的是Chinput。所以我还有个不自量力的想法是让unicon在X下也能工作。

SCIM的作者苏哲以前在Turbo Linux公司工作,而unicon好像也是由Turbo Linux公司推出的。
回复 支持 反对

使用道具 举报

发表于 2005-11-27 16:50:04 | 显示全部楼层
我怎么打不上这个补丁啊,还是有问题。
搂住能提供你编译出来的ko文件吗?
回复 支持 反对

使用道具 举报

发表于 2005-11-27 17:45:12 | 显示全部楼层
Unicon支不支持utf8阿?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-28 07:13:47 | 显示全部楼层
Post by wjping119
我怎么打不上这个补丁啊,还是有问题。
搂住能提供你编译出来的ko文件吗?


抱歉,我要抱歉一万次,我已经更新了原来的帖子,这是我晚上在另一台电脑上安装时才发现的问题,原因是我进行diff 的两个目录不在同一个父目录下造成的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-28 07:14:50 | 显示全部楼层
Post by zlbruce
Unicon支不支持utf8阿?


现在是不支持的,我倒是也觉得很有在这方面改进的必要。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-28 07:22:29 | 显示全部楼层
我要具体介绍一下自己是怎么改内核补丁的,因为内核更新太快,我又没有时间,也没有兴趣做简单重复的劳动,现在我对阅读fbcon.c发生了兴趣,所以在我搞懂这个之前,可能不会再发布新的补丁,而你们,可以从我的介绍中,自己找到方法来解决问题。
首先,打上日本人的补丁,然后是要修改drivers/input/keyboard/atkbd.c
[PHP]diff -urNp linux/drivers/input/keyboard/atkbd.c /linux/drivers/input/keyboard/atkbd.c
--- linux/drivers/input/keyboard/atkbd.c        2005-11-26 13:39:19.000000000 +0000
+++ linux/drivers/input/keyboard/atkbd.c        2005-11-26 13:55:22.000000000 +0000
@@ -290,6 +290,56 @@ static irqreturn_t atkbd_interrupt(struc
        if (!atkbd->enabled)
                goto out;

+#ifdef CONFIG_UNICON
+#define  LR_CTRL_KEY_DOWN            0x1d
+#define  LR_CTRL_KEY_UP              (LR_CTRL_KEY_DOWN + 0x80)
+#define  L_ALT_KEY_DOWN              0x38
+#define  L_ALT_KEY_UP                (L_ALT_KEY_DOWN + 0x80)
+#define  NUM_LOCK_KEY_DOWN           0x45
+extern int (*Unicon_fnLowerKeyHook) (unsigned char ch);
+extern int (*Unicon_fnKeyHook) (struct tty_struct *tty, \
+                                unsigned char ch, char flag);
+extern void (*Unicon_TtyChangeUpdate) (int nTty);
+#endif
+       
+#ifdef CONFIG_UNICON       
+        if (Unicon_fnLowerKeyHook != NULL)
+        {
+            static int ctrl_pressed = 0,
+                       alt_pressed = 0;
+            switch (data)
+            {
+                case NUM_LOCK_KEY_DOWN:
+                    if (ctrl_pressed == 1 &&
+                        alt_pressed == 1)
+                    {
+                        Unicon_fnKeyHook = NULL;
+                        Unicon_fnLowerKeyHook = NULL;
+                        Unicon_TtyChangeUpdate = NULL;
+                        printk ("release unicon key hook successfully.\n");
+                     }
+                     else
+                         break;
+                 case LR_CTRL_KEY_DOWN:
+                     ctrl_pressed = 1;
+                     break;
+                 case LR_CTRL_KEY_UP:
+                     ctrl_pressed = 0;
+                     break;
+                 case L_ALT_KEY_DOWN:
+                     alt_pressed = 1;
+                     break;
+                 case L_ALT_KEY_UP:
+                     alt_pressed = 0;
+                     break;
+            }  
+           /* return 1 ==> processed by kernel
+              return 0 ==> processed by app */
+           if ((*Unicon_fnLowerKeyHook) (data) == 1)
+                   goto out;
+        }
+#endif
+                       
        input_event(&atkbd->dev, EV_MSC, MSC_RAW, code);

        if (atkbd->translated) {
[/PHP]

接着是:
[PHP]diff -urNp linux/include/linux/tty_flip.h ./linux/include/linux/tty_flip.h
--- linux/include/linux/tty_flip.h        2005-11-26 13:39:38.000000000 +0000
+++ linux/include/linux/tty_flip.h        2005-11-26 13:55:50.000000000 +0000
@@ -7,9 +7,25 @@
#define _INLINE_ static __inline__
#endif

+#ifdef CONFIG_UNICON
+extern int (*Unicon_fnKeyHook) (struct tty_struct *tty,
+                                unsigned char ch, char flag);
+#endif
+
+
_INLINE_ void tty_insert_flip_char(struct tty_struct *tty,
                                   unsigned char ch, char flag)
{
+#ifdef CONFIG_UNICON
+       if (Unicon_fnKeyHook != NULL)
+       {
+            /* return 1 ==> processed by kernel
+               return 0 ==> processed by app */
+            if ((*Unicon_fnKeyHook) (tty, ch, flag) == 1)
+               return;
+       }
+#endif
+               
        if (tty->flip.count < TTY_FLIPBUF_SIZE) {
                tty->flip.count++;
                *tty->flip.flag_buf_ptr++ = flag;
[/PHP]

然后看看drivers/video/unicon下面的xl_keymasks.c在不在,不在的就从我的补丁中拷贝一个。

现在去看我那个丑陋的手法,在xl_unikey.c
[PHP]+void  device_cls_input_bottom (char *cl)
+{
+    unsigned color;
+    unsigned long flags;
+
+    spin_lock_irqsave(&unikey_read_lock, flags);
+    if (bHasClosed [nCurTty - 1] == 0)
+        copy_from_user(&color, cl, sizeof(unsigned char));
+    else
+        color = 0;
+
+    FbClearRect (&our_fbhzinfo, color,
+                 (our_fbhzinfo.height/16)*2-2,
+                 (our_fbhzinfo.height/16)*2-1);
+    spin_unlock_irqrestore(&unikey_read_lock, flags);
+}
[/PHP]

看见那个奇怪的 (our_fbhzinfo.height/16)*2-2吗,它和我在unicon中的Unikey.cpp的修改出于一辙,我看都是被fbcon.c的改动坑的。
现在,检查一下别的地方和原来有没有变化就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-29 07:43:56 | 显示全部楼层
各下载点的文件已修复patch内核的错误。
回复 支持 反对

使用道具 举报

发表于 2006-1-14 02:22:52 | 显示全部楼层
好帖子,顶一下吧

atkbd.c是串口(ps2)的驱动,你这个键盘的patch可能对USB键盘无效吧!我没有USB键盘,没测试过

还有就是 our_fbhzinfo.height/16-X这个地方,我编译了几次模块,发现有个问题。
原来给的数是没错的,如果你在grub或lilo里边加了vga=xxx的话,输入条就跑上去了,如果在加载unikey前手动加载fb的话,输入条正常,不知为什么

现在unicon有三个问题,一个就是键盘截获的问题,我尝试在drivers/char/keyboard.c里修改没有成功。看见bootsplash里边按ESC显示Verbose就是在那里改的,不知道自己那里改错了。
二是输入条的问题,hj_18兄若是有空不妨作个on the spot的来,彻底解决输入条的问题。
三是unicode的问题,cce好像已经支持unicode了,不知道能不能借过来。

就说这么多了,其实还是期待着出现一个好用的中文平台。如今cce,zhcon在gcc 4里边编都编不出来,想将就一下都困难。

哎,难道纯console真的完全过时了吗?
回复 支持 反对

使用道具 举报

发表于 2006-1-14 02:26:42 | 显示全部楼层
按keyboard.c里边的写法,keyhooks.c里边的函数要全部重写

keyboard.c已经基本上不支持scancode直接使用了,转而用keycode和down来标志键的按下与否,郁闷ing……
回复 支持 反对

使用道具 举报

发表于 2006-1-14 02:47:26 | 显示全部楼层
厉害,高手中的高手了
回复 支持 反对

使用道具 举报

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

本版积分规则

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