纯粹不吐不快

更新:好吧原文作者说是 “gnome control center”。

后文可以略过了。

http://forum.ubuntu.org.cn/viewtopic.php?t=486270&p=3200398#p3200398

下面是原文

其余内容不论,我们单说第一句:「前一阵子 Ubuntu 的预设输入系统从 IBus 改为 Fcitx,但因后者不支持 gcc,搞得天下大乱,于是 Ubuntu 17.10 又换回 Ibus 了。 LZ 建议把 ibus 删除掉换成 fcitx,并不见得问题就消失了。」

不支持 gcc???黑人问号???

其一、世界上绝大多数发行版,包括 ubuntu 都是默认 gcc 编译器。debian 的迁移到 clang 的进程虽然一直有提但是绝对还没有完成,而且也只是测试是否「可以编译」,作为 debian 下游的 ubuntu 也显然还没有迁移到非 gcc 编译器。打包 fcitx 的人我都基本认识大半,从来没人和我说 fcitx 有什么不能在 gcc 上编译的问题。

突然来这么一发指责,你得给我拿出证据来。

其二、ubuntu 作为一个二进制发行版,原本就不需要用户从代码编译,你是从哪发现不支持 gcc 的?

Posted in fcitx development | Tagged | Leave a comment

The Road to Fcitx 5: 5. Good news for people who use multiple display server

A big refactor in fcitx 5 is to enable it to support for multiple display server. This is not limited to X11 + wayland, but it means you can use fcitx with multiple X11 server. While such functionality may have limitation about your layout settings, but still it will work for most of cases.

qdbus-qt5 org.fcitx.Fcitx5 /controller org.fcitx.Fcitx.Controller1.OpenX11Connection :1

The support for multiple X connection exists in the code for long time but it didn’t expose to the world till the commit today.

With a simple dbus call above, you can open an new X11 connection to display server :1. The classicui window, XIM, or client that uses dbus protocol in it will be able to use the “right” window in the display server. Though, kimpanel will not be able to enjoy this.

To test this funtionality, try it with some simply client:

Xephyr :1
qdbus-qt5 org.fcitx.Fcitx5 /controller org.fcitx.Fcitx.Controller1.OpenX11Connection :1
DISPLAY=:1 openbox
DISPLAy=:1 xterm

And you’ll find out that you can type in the xterm :P.

Posted in fcitx development | Tagged , | Leave a comment

当你 Debug 一门过气语言生成的代码里面产生的 memory leak 时会发生什么 (a.k.a. 不要修改 vala 返回的 strv 的 length)

(会被写成 blog 发出来。)

直接上一段代码。

var array = elements.to_array ();
array.length = -1;
return "(" + string.joinv (" ", array) + ")";

提问,这段代码有什么问题?

它会生成这样的代码。

_tmp32_ = gee_collection_to_array ((GeeCollection*) _tmp30_, &_tmp31_);
array = _tmp32_;
array_length1 = _tmp31_;
_array_size_ = array_length1;
array_length1 = -1;
_tmp33_ = array_length1;
_tmp34_ = array;
_tmp34__length1 = array_length1;
_tmp35_ = _vala_g_strjoinv (" ", _tmp34_, _tmp34__length1);
_tmp36_ = _tmp35_;
_tmp37_ = g_strconcat ("(", _tmp36_, NULL);
_tmp38_ = _tmp37_;
_tmp39_ = g_strconcat (_tmp38_, ")", NULL);
_tmp40_ = _tmp39_;
_g_free0 (_tmp38_);
_g_free0 (_tmp36_);
result = _tmp40_;
array = (_vala_array_free (array, array_length1, (GDestroyNotify) g_free), NULL);
_g_object_unref0 (elements);
_g_free0 (_base);
_g_free0 (_tmp0_);
return result;

那么你再猜猜?给你点提示。

static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
    if ((array != NULL) && (destroy_func != NULL)) {
        int i;
        for (i = 0; i < array_length; i = i + 1) {
            if (((gpointer*) array)[i] != NULL) {
                destroy_func (((gpointer*) array)[i]);
            }
        }
    }
}


static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
    _vala_array_destroy (array, array_length, destroy_func);
    g_free (array);
}

´_>` strv 是一个不能改变大小的 array ……那么你改了它的大小……free 它的函数没法正常工作……然后就会造成 leak ……

Posted in Linux | Tagged , | 1 Comment

最近踩的一个关于 std::unique_ptr 的小坑。

简单来说就是这样一件事,std::unique_ptr 在析构途中调用了 .get() 会发生什么这样一个问题。

当然,你是不应该写出这样的代码的……但是有时候这样的行为可能并不是非常明显。所以就会导致问题…

一个 FreeBSD 上的人汇报了在 Linux 上没有的 crash。估计是 libc++ 和 libstdc++ 的行为差别。一个在析构途中就返回 null 了,一个还是返回原始的指针。

总之,小心避免写出这样的代码吧。

Posted in Linux | Tagged , | Leave a comment

Road to Fcitx 5: 4. Compatibility for different im modules.

I have been always care about the compatibility. Fcitx 5 will be able to type with either fcitx 4’s im module, or fcitx 5’s im module.

Fcitx 5’s im module will announce itself to accept both “fcitx5” and “fcitx”. Even if you did it wrong or forget to upgrade, application will still be able to pick up one of the fcitx im module. Even if it is the wrong one, the latest fcitx 4 im module is compatible with fcitx 5 server. There is no more excuse if you configure it wrong.

Even today, I just commit the code to even support ibus im module. So, when you start fcitx 5, it will automatically replace any existing ibus and initiate a shim dbus layer to provide ibus input context interface. So even your system is wrongly configured or forced by your desktop to use ibus im module, you should still be able to use fcitx anyway, as long as you didn’t forget to start it

.

Posted in fcitx development | Leave a comment