GeManX ver 67

修正了一个sx的bug…… 这段时间用GeManX,有时会崩溃…… 而且都是按p向下看贴的时候,而且崩溃之前多半出了输入法的候选词窗口…… 然后我就怀疑我写的显示预编辑内容的部分出问题了…… 开了个gdb启gemanx 结果一直开着输入法按p还真挂了…… 一看就是光标移到了窗口外面了…… 但是我记得我写了检查的,到了最后一行之外会移回来…… 结果一看代码,写的是: if (row == m_pTermData->m_ColsPerPage) 太弱智了…… 改成 if (row == m_pTermData->m_RowsPerPage) 就好了…… sx的typo……

关于#pragma interface

关于这个pragma,有某文档: http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Interface.html 里面还有它的伴生pragma: #pragma implementation 大体意思是说,比如你有个A.h,有个A.cpp。A.h里面包含了一些除了类接口以外的一些东西,例如一部分类实现之类的,比方说,里面有类A,以及A::foo()的实现。 原来假如我是B.cpp,只要我#include你这个A.h,那我编译出来的B.o里面,就会有你的那一部分实现的副本,也就会有A::foo()的副本…… 然后有人觉得这样B.o会变大,于是发明了那俩pragma…… 定义了#pragma interface A 的头文件,引用它的B.cpp编译出来的B.o就不会包含那一部分实现的副本,而会有undefined symbol: undefined A::foo() 而与其对应的定义了#pragma implementation A的A.cpp,它编译出来的A.o里面,就会包含那一部分实现,也就是那些undefined symbol对应的东西: defined A::foo() 这样俩.o链接起来,就啥都有了,很好 === bug的分隔线 === 但是有时候有别的情况…… 例如其实那个类在一个C.so里面,而引用它的B.cpp是一个用了那个C.so的程序的一部分 于是B.cpp编译出来的B.o里面,那部分实现依旧是undefined symbol。但是,那些对应的symbol,在A.o和其他.o一起变成C.so的时候,都到了C.so里面。但是大概是由于链接的过程,原来的symbol信息没有导出来…… 于是C.so的导出symbol里面,并没有defined A::foo() 于是B.cpp位于的那个程序在链接的时候,就找不到那个A::foo()了,就有linker error了…… === 结论的分割线 === 总的来说,就是尽可能别用这个pragma…… 省那点空间没啥意义的…… 它文档里也说了 Note: As of GCC 2.7.2, these #pragmas are not useful in most cases 以及 Currently (3.4) the only benefit of …

Continue reading ‘关于#pragma interface’ »

GeManX rev 59

修了些小问题: 1. 之前有过编译的时候报CSite成员函数找不到的问题 研究了一下,貌似是#pragma interface干的好事,具体的再写一篇吧…… 2. libnotify更新之后,notify_notification_new参数变化 0.7.0之后,libnotify的API变了…… notify_notification_new()原来有四个参数,现在只有三个了…… 这种API不兼容真蛋疼……

Skype 静态链接版本不能输入中文的问题

装了FreeBSD port里的skype,其实是Skype for Linux的静态链接版本。 尝试聊天的时候,发现不能输入中文…… 我很怀疑这个事情是静态链接而起的,于是去搞了个动态链接的版本…… 但是这个版本跑起来就卡死…… 我怀疑和DBus之类有关系,反正看trace是卡在一个锁上…… 多半是BSD模拟的问题 于是尝试选项–disable-api,然后居然就不卡死了…… 试了一下,也可以用输入法了…… 原来右键菜单里连输入法选项都没有,现在可以选了…… 于是搞定了…… 所以其实重点就是:换动态链接的版本…… 当然各位用Linux的多半直接去包管理器里装了,当然是动态链接版本…… 闭源软件真是出了问题也没法调啊……

关于XIM的那些输入模式

我一直弄不清楚,over-the-spot, on-the-spot, off-the-spot, root-window这帮东西到底有啥区别 今天查了某oracle资料:http://download.oracle.com/docs/cd/E19504-01/802-7789/6ibcsnfb8/index.html 首先这些都是预编辑内容的模式,就是那些你打了但是还没确认的那些字的显示方法…… 貌似over-the-spot是在光标处会出现当先的预编辑内容,但是不会把原有内容自动后移,因此新内容显示起来会覆盖在老的上面。确认之后,新的会把老的挤到后面去。 on-the-spot也是在光标处出现预编辑内容,但是会在预编辑,也就是还没确认的时候就把老内容挤到后面去。 off-the-spot貌似是在窗口左下角之类的位置出一个窗口自己显示预编辑内容,反正应用程序不用关心…… root-window据说会在屏幕底下划出一块来显示预编辑内容,莫非是类似从前dos的输入法…… X上没见过。 反正前两个都要程序管,第三个要输入法自己画。 搞这个是因为,今天实现了GeManX对于输入法预编辑的支持,顺路看了看这方面资料…… 因为新ibus好像不关心你程序自己说自己支不支持预编辑,他总是认为你支持,这就导致本来不支持的GeManX没地方显示预编辑内容了…… 另,有人知道gtk_im_context_get_preedit_string()返回的东西啥编码么?一定是UTF-8?根据locale?