Torque2D MIT 代码阅读(1) IME的一个BUG?

看代码发现一个BUG,记录一下,并告知作者 :) 为Torque做点贡献

目前的版本,对于IME的支持显然没有进行过测试,是直接搬代码过来的,这也能理解,人家都不用这玩意,各种开源的好东西多了去了,而国内要想用,大家都知道,第一件事不是考虑如何Hello World,而是是不是支持中文输出/输入,悲剧啊!

Torque2D MIT作为成熟引擎 Torque2D和iTorque2D的结合,IME相关代码在发布的时候就支持,但是看情况是没有进行过测试的.

具体情况如下:

// IME输入处理函数    
static void processCharMessage( WPARAM wParam, LPARAM lParam )  
    {  
      ....  
       InputEvent event;  
      
       event.deviceInst = 0;  
       event.deviceType = KeyboardDeviceType;  
       event.objType    = SI_KEY;  
       event.action     = SI_MAKE;  
       event.ascii      = charCode;  
      
       // Deal with some silly cases like <BS>. This might be indicative of a   
       // missing MapVirtualKey step, not quite sure how to deal with this.  
       if(event.ascii == 0x8)  
          event.objInst = KEY_BACKSPACE; //  Note we abuse objInst.  
      
       Game->postEvent(event);  
      ....  
    }  
      
    ....  
      
    // 文本输入框键处理
    bool GuiTextEditCtrl::onKeyDown(const GuiEvent &event)  
    {  
       .....  
       else if (event.modifier & SI_CTRL)  
       {  
         .....; 所有的IME事件必将到这里 
       }  
       .....  
       if ( mFont->isValidChar( event.ascii ) )  
       {  
         ....; 这里才是IME的判断,但是永远到不了这里
       }  
    }  

 因为初始化的问题,我们看看EventInput结构体的构造函数:

    InputEvent() { type = InputEventType; size = sizeof(InputEvent); dMemset(touchesX, 0, sizeof(touchesX));   
                                                                     dMemset(touchesY, 0, sizeof(touchesY));  
                                                                     dMemset(touchIDs, 0, sizeof(touchIDs));}  

 从代码里看出,它只初始化了部分变量,非常注重触摸,而对于:

   U16   objType;     ///< One of SI_XAXIS, SI_BUTTON, SI_KEY ...
   U16   ascii;       ///< ASCII character code if this is a keyboard event.
   U16   objInst;     ///< Which type instance or a KeyCode
   U8    action;      ///< What was the action? (MAKE/BREAK/MOVE)
   U8    modifier;    ///< Modifier to action: SI_LSHIFT, SI_LCTRL, etc.

 并没有初始化,这就导致这些变量在结构体实例化后,全是未初始化的废料!比如modifer这个重要的判定变量可能是0xCC,但绝不会是我们要的0.

如果在发送消息的时候增加一行代码:event.modifier = 0,那么就会输入汉字了,但是还是有问题,哎,不继续了,改代码不好,特别是Torque2D这种直接生成Exe的这种.. 反馈问题,等待处理吧!

后续问题有: IME顺序反的,"文本"会显示"本文",而且wenben 也会显示... 郁闷的天朝..

 

留个记号,等Bug修复后再来..

 

posted on 2013-03-09 21:55  Kevin Game  阅读(402)  评论(0编辑  收藏  举报