Category Archives: Gtk
My Gtk Tutorial 4
其实说到这里,我才发现,你可能压根还不知道如何开始一个项目。 当然最简单的办法之一,就是让半残的anjuta替你建立一个gtk项目的skeleton,然后把他扔一边,继续用你的vim,emacs去。 不过在这么多年之后,其实我已经不会写autotools的代码了,那么下面我就无聊来介绍下怎么用CMake和Gtk。 关于我曾经的CMake介绍,可以参考这里。 https://www.csslayer.info/wordpress/category/cmake/ 有些人喜欢录视频写代码?这次录个视频好了。 代码下载: gtk_test.tar.gz P. S. 也许这篇文章会勾引出一些严重的autotools粉,例如啊glib/gtk的项目都是用autotools啊,glib/gtk项目用autotools集成好啊。我用了这么多年现在早忘了autotools 怎么写了,我写不出来,就这样。 构建脚本用什么写都没本质差别。照样有人用cmake生成GObjectIntrospection(附注:第一个这么干的当然不是我)。
My Gtk Tutorial 3
所谓的具体类的实现,其实这个Widget功能不得不说是Gtk里面缺少的功能,虽然其实Qt里面也没,不过我在写代码的时候可以没什么顾虑的用 KDE 提供的 UI 库,于是我又爽了。 这次的Widget就是一个捕获快捷键用的Widget,具体里面代码的实现我是当初从ccsm(compiz那个配置工具)里面的python代码翻译过来的,啊一想起那个青涩的年代…… 相信这是个人民群众喜闻乐见的Widget。 原理很简单,本身是一个button,button按下时显示一个window,window负责捕捉按键,捕捉到的按键再存起来。 当然我的实现里面使用了一些Fcitx自己的parse和toString的函数,你当然建议使用GtkAccelerator的方式 来进行parse(如果你需要字符串的话)。 https://github.com/fcitx/fcitx-configtool/blob/master/gtk3/keygrab.h https://github.com/fcitx/fcitx-configtool/blob/master/gtk3/keygrab.c 具体的实现就是上面的代码(于是我还看到当初有些蛋疼的注释……) 首先就是我继承了一个GtkButton,定义了一个Signal,触发按键在变化时的事件。 gtk_widget_set_size_request(GTK_WIDGET(keygrabbutton), 150, -1); g_signal_connect(G_OBJECT(keygrabbutton), “clicked”, (GCallback) begin_key_grab, NULL); 按键创建时,绑了一个signal给clicked事件,用来显示一个popup。 在clicked里面的回调函数中。 KeyGrabButton* b = KEYGRAB_BUTTON(self); b->popup = popup_new(GTK_WIDGET(self), _(“Please press the new key combination”), FALSE); … Continue reading
My Gtk Tutorial 2
我写这些其实我真的自己都不看的,有用还是没用只有我唯一的那个目标读者来评价。 那么我们来无聊的介绍下Gtk的一些Widget。 1、GtkBox 和 Qt 不同的是,Gtk一般实现一个自己的Widget,都是从一个具体的Widget而不是general的GtkWidget 开始的,其中很多则又是选择了 GtkBox。 当然这里所说的实现一个具体的Widget不是指连draw事件都override的那种widget,而是一组widget的组合,例如文件对话框这种。那么具体实现的时候只要找好你要的那个顶层的Widget作为基类就行了。 曾经的 GtkHBox 和 GtkVBox 已经成为了历史,取而代之的是以一个横纵作为属性的 GtkBox。 一般而言,任何你想要的复杂的布局都可以用GtkBox来实现,一个技巧就是占位符,看起来Gtk里面并没有Qt的Spacer这种专门的占位符,一般用来占位的就是GtkLabel。 例如你希望实现一个上下顶头有Widget的东西,中间是空的,那么你可以new一个Vertical的GtkBox出来,然后使用 gtk_box_pack_start 往里面扔东西。中间用一个GtkLabel来撑开位置。 2、大小 写UI控件最头疼的事情是什么?是大小。说他们的定位难度堪比HTML也不为过。尤其是在你没注意到的时候你把你的窗口设置成为可拖拽,或者进行i18n后出现了一些惨烈的情况(单从语言来说,同一个词,一般汉语最短,英语次之,某些西语会长的要命)。 不过在Gtk3中,GtkWidget终于增加了expand,align,这些用来标明Widget本身的大小和位置属性。 这下终于要谢天谢地了?哦,其实没有,如果你的界面够复杂你可能还是想要掀桌(不过如此的话你是不是应该先考虑下你的设计?),不过也比Gtk2时代好的多就是了。 在处理大小时要考虑到你在进行i18n之后界面可能产生的变化…… 处理大小时,GtkBox的默认是参考内部的Widget的属性来确定的,而Gtk2的兼容类GtkHBox,GtkVBox还默认并非如此。 总之这两个属性也不难理解,就是给你一个较大的空间。你的Widget是保持较小状态,还是填满整个区域?是如何在这个区域内进行对齐的? 3、来实现个Widget吧 如果你了解GObject的继承,那么这一步对你来说基本是没有难度的。 如果你不了解GObject的继承,还是去看别的文章吧…… http://garfileo.is-programmer.com/categories/6934/posts C语言模拟继承是采用了一个非常简单的方式,就是struct的嵌套,在所有模拟继承关系的代码中都采用了这样的方式,这样做的好处就是你可以强制转换子类的指针为基类的指针。 struct Derived { Parent parent; }; 这样你就可以简单的去访问parent的值了。至于如何实现private,这里也简单说下。 struct Derived … Continue reading
My Gtk Tutorial 1
大概我这样的人还是超少见的,或者你可以称之为傲娇。 于是这个是我自己写Gtk程序的心得。我个人的主力发行版是一个几乎无Gtk的发行版,平时唯一用于测试gtk的程序其实是gtk-demo。不过即使如此我也照样开发着Gtk程序,不过由于发行版没有Glade,虽然用下也不会少块肉,不过界面大部分还是靠手写。反正就是省点事情。 本文基于 Gtk3 和 up to date 的 Glib。 另外我对于所有动态语言抱有一种不信任的态度,另外就是写C比较熟悉,所以还是写C。 那么开始第一个程序吧。 在最新的GLib中,GLib终于也诞生了一个称为Application的概念,对于Gtk2时代的人来说这大概是个没听过的概念。用了有什么好处呢? 1、支持单实例 2、支持Application Menu 说道Application Menu,这究竟又是个什么东西呢?可以理解为“属于这个程序的”菜单,例如Firefox,Opera的大按钮等等。 当然不幸的是,我最近唯一写的Gtk程序是不需要Menu的,而且反正这个功能在非GNOME3环境下惨不忍睹(显示为只有一项的菜单栏,要多难看有多难看),所以这里带过不提。 那么第一个GtkApplication就从这里开始: https://github.com/fcitx/fcitx-configtool/blob/b68086d4b6773845065e44956875d90bca195eba/gtk3/main.c (该死的WP贴代码不方便) 如果你用过 Qt 的话,大概就看出了 QApplication app(argc, argv); app.exec(); 的影子,总之就是差不多的东西。 这里还实现了一个函数,activate,这个函数会在执行程序的时候被调用,而且是交给主进程的程序,于是里面的内容很简单,如果有窗口,那就显示出来,如果没有,那就创建一个。 关于 GObject 的 Signal,在下不才其实并不十分了解,你可以参考: http://nanjingabcdefg.is-programmer.com/posts/24116.html activate 本身其实也是一个 signal,具体你要实现activate被调用的效果其实有很多方式,在这个小地方怎么实现其实都并无所谓,你可以自己g_signal_connect 一个上去,或者采用别的方式。 … Continue reading