• 订阅

    抓虾
    google reader
    bloglines
    鲜果
  • 分类目录

  • 功能

  • 标签

    不折腾 价值 健身 回忆 小说 幼稚的思想 影评 感想 推倒 朝花夕拾 犯罪 理想生活 生活 电影评论 看电影 看病 社会 社会事件 笔记本 网络 言论自由 过年 随想 黑客 黑客小说 AV女优 blog BotCalk cult festival Fvwm gloobus GMChess gmitter GMLive gtkmm iCalk iTalk M8 ppstream program soft talkmm twitter vim
  • gtkmm文章:libglade转换至gtkbuilder

    星期二, 八月 11th, 2009

    glade3界面生成器现在能生成两种格式的xml界面描述文件。分别是libglade和gtkbuilder. libglade就是我们以前所使用的,要依赖于libglade库的。而gtkbuilder是gtk 2.12以后版本直接支持的。gtkbuilder是设计来代替libglade的,将会是以后的主流。因此本文将简单介绍一下在gtkmm环境下libglade转换至gtkbuilder的操作。
    1.转换旧的glade文件。
    如果您的项目中已经用了libglade的文件格式,可通过两种方法将它转换成gtkbuilder格式的。
    一是用glade-3打开,在菜单“属性”中将它选择成gtkbuilder,并另存为即可。
    二是使用 gtk-builder-convert xxx.glade xxx.xml 命令直接转换。
    当然gtkbuilder的后缀名仍可保留为glade,这随你喜欢。
    2. 替换代码中的相应函数。
    在创建xml文件中:

    Glib::RefPtr<Gnome::Glade::Xml> main_xml = Gnome::Glade::create(main_ui,"main_notebook");

    替换成

    Glib::RefPtr<Gtk::Builder> main_xml = Gtk::Builder::create_from_file(main_ui, "main_notebook");

    在获取widget中

    Gtk::Button* button_ok = dynamic_cast<Gtk::Button*>(main_xml->get_widget("button_ok"));

    替换成

    Gtk::Button* button_ok=0;
    main_xml->get_widget("button_ok",button_ok);

    转换后,程序可以去除掉libglademm和libglade依赖,但至少要求gtk和gtkmm版本要2.14以上版本才能正常工作。另外libglade里画的菜单和工具栏似乎不能正常转到gtkbuilder中,这点需要注意。

    Arch下编译talkmm

    星期天, 五月 31st, 2009

    Arch下talkmm编译指南
    1.编译前准备的包
    语音支持方面的包

    yaourt -S speex ilbc linphone

    界面支持方面的包

    yaourt -S gtkmm libsexymm

    2.下载源码包

    wget http://talkmm.googlecode.com/files/libjingle-0.4.1.tar.bz2

    wget http://talkmm.googlecode.com/files/talkmm-0.10.tar.bz2

    3. 解压libjingle

    tar xvfj libjingle-0.4.1.tar.bz2
    cd libjingle-0.4.1
    ./configure
    make
    cd ..

    4. 解压talkmm

    tar xvfj talkmm-0.10.tar.bz2
    cd talkmm-0.10

    5. 连接libjingle目录

    ln -s ../libjingle-0.4.1/talk src/talk

    注意这是在talkmm-0.10目录里做的,并且libjingle-0.4.1目录就在talkmm-0.10同级目录中。
    这是为了talkmm里的源码能连接到libjingle里生成的静态库.
    6.编译talkmm

    ./autogen.sh
    ./configure
    make
    sudo make install

    PS. Arch中gcc 4.4.0-3 版本在编译时似乎有个bug。目前只能跳过这个gcc的版本来编译.
    如要指定ilbc位置,就以下面方式

    ./configure –with-ilbc=/usr/local

    更正:前面说是4.4.0-3编译有bug,是我记错了。其实是4.4.0-2的bug,在线程同步方面。当时编译不过我就降级了,没想到过没多久gcc又升级并fix了这个bug。大家找的那个patch打上也无坏。它也修正了一些问题,我也已经把它加入svn中。

    再次配置gtkmm交叉编译环境

    星期天, 三月 29th, 2009

    Gtkmm有跨平台的特性。我决定发扬此特性,那先从port gtkmm到win
    平台开始吧。那第一步就是配置gtkmm的win编译环境。网上大多文章都
    介绍了在win下配置gtkmm的环境。而我之前也写过一篇介绍在linux下通
    过mingw32来编译gtkmm程序的文章。
    Gtkmm系列:交叉编译Window版本的Gtkmm程序示例
    是的,我觉得这样才有意思,交叉编译嘛。
    但是那一篇是参考别人的译作,方法有些繁琐,重要的是,已经不太适合
    当前的环境了。主要是那个文章只支持到gtk28版本,目前的gtkmm已经
    到2.16了。mingw32也是4.3的版本,众所周知,4.3版本的gcc语法严谨
    多了。
    经过昨天一晚上及今早的奋斗,和yetist双线合作,一人一种方法找环境配
    置方法。目前完成了第一阶段的成功。
    事实上,arch社区里是有gtk2的mingw32包,也就是说gtk+的交叉编译
    环境是有人做好的了。只需要用yaourt就能安装配置完成。但gtkmm却
    没有,yetist就循着这条线索,准备编译gtkmm的win32包。
    而我在看了那些在win下配置gtkmm环境的文章后,想到,其实也只是下
    载需要的库而已啊,而那些库,是组成gtkmm的基础,既然我现在是要编
    译pe格式的程序,最终调用的不也是那些库嘛,那把win下的gtkmm开发
    包转到linux下来给mingw32调用不就成了。于是照做,编译成功了又一个
    gtkmm demo程序。
    废话了这么多,那就正式开始交叉编译gtkmm之路吧。
    很简单:
    1.先下载gtkmm开发包
    当然是for win的。http://ftp.acc.umu.se/pub/GNOME/binaries/win32/gtkmm/2.16/gtkmm-win32-devel-2.16.0-2.exe
    2.16的开发包好啊,gtk+啥的都包含了。
    但需要在win下安装解压出来,虽然是42M的大小,解出来有380M大。
    安装完后从win分区里安装的gtkmm目录完整复制到linux分区中。我这里
    放在/src/mingw32-gtkmm,你可以随便定义这个目录。只记住需要做个
    链接即可,

    sudo ln -s /src/mingw32-gtkmm /target

    2.修正prefix路径
    这是for win的开发包,所以还是需要修改一些东西的,主要是pkgconfig
    的路径问题。
    执行下面两个命令即可修正:

    find /target/lib/pkgconfig -name "*.pc" |xargs sed -i ’s#prefix=c:\/devel\/target.*#prefix=\/target#’

    find /target/lib/pkgconfig -name "*.pc" |xargs sed -i ’s#prefix=\/gtkmm_debug#prefix=\/target#’

    3.安装mingw32
    这步是安装编译器,pacman 也行,yaourt 也行.

    sudo pacman -S mingw32

    装好后执行下面命令可见:

    i486-mingw32-g++ -v
    Using built-in specs.
    Target: i486-mingw32
    Configured with: /home/sergej/community.cvs/devel/mingw32-gcc/src/gcc-4.3.0-20080502-mingw32-alpha-src/gcc-4.3.0/configure –target=i486-mingw32 –host=i686-pc-linux-gnu –build=i686-pc-linux-gnu –prefix=/usr –enable-languages=c,c++ –enable-sjlj-exceptions –enable-hash-synchronization –disable-nls –disable-libssp –disable-shared
    Thread model: win32
    gcc version 4.3.0 (GCC)

    4.搞定
    那么是搞定了吗?基本是完成了。
    还是经典的测试代码:

    #include <gtkmm/main.h>
    #include <gtkmm/window.h>
    int main(int argc, [...]

    GMChess 0.10发布

    星期四, 三月 26th, 2009

    正值svn版本号100,发布GMChess的第一个版本0.10吧。目前只有读谱功能,支持qq象棋,联众象棋,中游象棋,象棋演播室等软件生成的棋谱。
    使用方法:选菜单->文件->打开,选择相应的棋谱文件即可
    或者直接将棋谱拖到棋盘上即可打开。
    本软件基于gtkmm库,以及开源程序象棋巫师的源码。因此非常感谢象棋巫师的作者黄晨先生,他的程序及网站给我提供了无限的资源及灵感。同时也感谢本软件另一作者wind,虽然他现在忙于工作而隐身中。
    当然本人能力及精力有限,程序存在bug是难免的。目前gmchess也是在发展之中。0.1x系列的计划是完善读谱功能,因此大家如果在使用中发展读的谱不正常显示,可将谱一起发来(lerosua+gmchess at gmail.com)。而对电脑对战将会出现在0.2x系列的版本号中,请静静等待。
    Linux下终将会有更多更好的象棋软件的,谢谢。
    另外,征集程序中文名。欢迎各种意见及建议。
    下载地址: gmchess-0.10

    发件人 lerosua’ blog

    gtkmm关闭窗口续

    星期四, 三月 26th, 2009

    上一篇文章中讲到的窗口,点击关闭后只是隐藏了而已。窗口会一直存在。也许会觉得这样占用资源。当然也可以让它点击关闭即销毁它。只需要在run调用后detele掉它。但注意还需要把窗口指针置0
    代码如下修改

    about->run();
    //about->hide();
    delete about;
    about=0;

    Gtkmm中关于窗口的关闭按钮问题

    星期三, 三月 25th, 2009

    之前用Gtkmm写icalk时创造了一个关于窗口,但它有个bug,关闭按钮没响应。昨天为GMChess创建关于窗口的时候再次遇到这个bug,这次我认真地搜索了一下,终于发现问题所在。
    之前我都是创建完about窗口后,再调用show函数显示。
    其实是应该调用run函数。我忘记了about窗口其实是dialog类,平时对话框之类不是要调用run然后观其返回值嘛,原来我无形中把about窗口当成window类了。发现有不少人有这错觉哩。而gnome-osd-properties的关于窗口也有关不掉的bug,哈哈哈。
    下面给一个菜单调用about窗口的实例源码,

    void MainWindow::on_menu_about()
    {
    static Gtk::AboutDialog* about(0);
    if(about == 0){
    std::vector<Glib::ustring> authors;
    authors.push_back("lerosua ");
    authors.push_back("wind");
    about = new Gtk::AboutDialog ;
    Glib::RefPtr<Gdk::Pixbuf> logo = Gdk::Pixbuf::create_from_file(DATA_DIR"/gmchess.png");
    about->set_logo(logo);
    about->set_program_name("GMChess");
    about->set_version(version);
    about->set_website("http://lerosua.org");
    about->set_copyright("Copyright (c) 2009 lerosua");
    about->set_comments(_("GMChess is chinese chess game write by gtkmm"));
    about->set_authors(authors);
    about->set_license (_("This program is licenced under GNU General Public Licence (GPL) version 2."));
    about->set_translator_credits("lerosua");
     
     
    }
    //about->show();
    //about->raise();
    about->run();
    about->hide();
     
    }