折腾了几天,把手动强制我的 E66 转屏的功能实现了,主要参考了 Nokia 一个叫做 ScreenGrabber 的工具的源代码。那个代码里有个比较险恶的 BUG,开始的时候我一直以为是其他地方出了问题,后来才找到并解决掉。
编译那段代码也比较痛苦。它原来是和整个系统的源代码放在一起的,里面使用了没有公开的 API,我就是直接把头文件拿出来也没用,因为没有对应的库。最终的解决办法是,我找到了一个非常好的平衡点:动态调用一个 API 返回我想用的对象,然后把那个对象所属的类浅浅地重新实现了一遍(主要需要保证内存布局的一致)。这个思路落实下来,效果还是不错的。
在实践中发现,我实现的转屏和系统自带的重力感应程序的转屏还不太一样。我的转屏是切换硬件状态,而系统的那个实现是在不切换硬件状态的前提下切换屏幕模式。我尝试着做只切换屏幕模式的工作以失败告终,会导致屏幕上的应用程序布局发生混乱。现在也不知道原因,从相关代码上来看,Symbian 对屏幕的硬件状态、分辨率、旋转角度等等的控制实现太复杂了,而且对外的各种索引都会经过几重实现上的抽象隔离,很不舒服。