背景
使用 Dia 进行 UML 图和流程图的绘制,但是在使用过程中总有很多不爽的地方,所以决定对其进行调整优化。
下载 Dia 源代码
在 Ubuntu 14.04 系统中直接执行 apt-get source dia
命令即可将 Dia 的源码下载到当前目录。
$ apt-get source dia
注意不需要带 sudo
前缀。 接着我还需要 Dia 的编译依赖包,估计一大堆。
$ sudo apt-get build-dep -y dia
好吧,等待它们安装完成就可以进行重新编译了。
编译 Dia
下载回来的是 dia-0.97.2 版本,稍稍阅读下源码目录下的 INSTALL 文档,里面的一节是
BUILDING:
==========
To build, run:
./configure
make
遵循标准的 GNU 编译系统。OK,先用最简单的方式进行编译先吧
$ ./configure
$ make
在编译过程中报错:
layer_dialog.c: In function ‘undo_layer_visibility’:
layer_dialog.c:1452:59: error: ‘intptr_t’ undeclared (first use in this function)
visibilities = g_list_append(visibilities, (gpointer)(intptr_t)temp_layer->
^
intptr_t
未定义,那说明是缺少了 stdint.h
头文件了。这种级别的代码错误不应该呀。虽然可以定位到 app/layer_dialog.c
文件,加上
/* dia-0.97.2/app/layer_dialog.c */
#include <stdint.h>
来解决一下问题,但我还是放弃了这种思路,我想通过目录下的 autogen.sh
重新产生一份我当前系统的编译版本出来。
-
清除之前所有的配置信息
$ make distclean
-
执行自动化脚本
$ ./autogen.sh
-
再编译一次
$ make
果然顺利通过。证明我的判断是对的,代码是没问题的,编译环境不一致而已。
接下来先运行一下看看情况如何。在 INSTALL 文档中提及了测试方案。
TRYING IT OUT:
==============
You can try out dia in the compilation directory by running
./app/run_dia.sh
直接运行脚本看看情况如何:
app/run_dia.sh
跟系统上运行的 Dia 一个模样,0.20cm
粗的线条,丑得不行,默认情况下没有 AntiAliased
和关闭 Show Connection Points
。我得找找看如何修正这些小问题了。
Now, let the hack begin!
查找默认配置
我在 Dia 里面画了一个流程图 (Flowchart) 的 Box 图形。
右键查看属性
这时我在源代码目录下面找到了名为 dia-0.97.2/objects/flowchart/box.c
的文件。
static DiaObject *
box_create(Point *startpoint,
void *user_data,
Handle **handle1,
Handle **handle2)
{
// ...
box->border_width = attributes_get_default_linewidth();
// ...
}
沿着 box->border_width = attributes_get_default_linewidth();
的线索寻找它在何处被设置的。往上找到 dia-0.97.2/lib/attributes.c
real
attributes_get_default_linewidth(void)
{
return attributes_default_linewidth;
}
好的,到这里还得往前找找看是谁设置了 attributes_default_linewidth
这个变量。我利用 emacs 的 M-x grep-find
功能在源代码目录寻找
./lib/attributes.c:27:static real attributes_default_linewidth = 0.1;
./lib/attributes.c:109: return attributes_default_linewidth;
./lib/attributes.c:118: attributes_default_linewidth = width;
看来只有 lib/attributes.c
这个文件使用了 attributes_default_linewidth
变量。定位到 118 行
void
attributes_set_default_linewidth(real width)
{
attributes_default_linewidth = width;
persistence_set_real("linewidth", width);
}
啊哈,看到这里我突然想起有 ~/.dia/persistence
这个文件。果然在这个文件中 215 行找到了 linewidth
这个变量,变量值 0.20000000000000001 跟上面的设置是一样的:
<dia:real role="linewidth">
<dia:attribute name="realvalue">
<dia:real val="0.20000000000000001"/>
</dia:attribute>
</dia:real>
我试着修改了这个值成 0.10000000000000001 再重新打开 Dia 软件。
点击右键查看属性
Good! 原来 Dia 通过 ~/.dia/persistence
这个文件配置某些属性呀!
修改 AntiAliased
在 ~/.dia/persistence
文件中搜索 anti 关键词定位到 270 行
<dia:boolean role="view_antialised">
<dia:attribute name="booleanvalue">
<dia:boolean val="true"/>
</dia:attribute>
</dia:boolean>
修改成 true
即可。
修改 Show Connection Points
在 ~/.dia/persistence
文件中搜索 show 关键词定位到 295 行
<dia:boolean role="show_cx_pts">
<dia:attribute name="booleanvalue">
<dia:boolean val="false"/>
</dia:attribute>
</dia:boolean>
修改成 false
,这下子再重新启动 Dia 看看效果。这下子果然满意多了 :D