GtkWindow on GDB-7.5.

今月の中頃にリリースされた GDB 7.5 だけれど、早速 Quantal Quetza (12.10) 版をインストールしてみた。で、その NEWS ファイルの一部には:

*** Changes in GDB 7.5
* GDB now supports x32 ABI. Visit <http://sites.google.com/site/x32abi/> for more x32 ABI info. * GDB now supports access to MIPS DSP registers on Linux targets. * GDB now supports debugging microMIPS binaries. * The "info os" command on GNU/Linux can now display information on several new classes of objects managed by the operating system: (省略) * GDB now has support for SDT (Static Defined Tracing) probes. (省略) * GDB now supports reversible debugging on ARM, (省略) * Python scripting (省略)

Python scripting” なんて粋な機能が付いているのを発見 (あとで気づいたのだけれど Python サポートは GDB 7.0 からなのね)。
で、実際に起動して確認してみた。まずは help を見てみる:

$ gdb
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb)
(gdb) help python
Evaluate a Python command.
The command can be given as an argument, for instance:
python print 23
If no argument is given, the following lines are read and used as the Python commands. Type a line containing "end" to indicate the end of the command. (gdb)

これによると、python というコマンドに続けてスクリプトを記述するか、あるいは python のあとでリターンすると複数行のスクリプトを記述でき、end で締めくくると解釈されるようだ。
何回かのアップグレードでかなり機能が改善されているようなので、GTK+ のウィンドウでも create してみるかと:

(gdb) python
>from gi.repository import Gtk
>
>win = Gtk.Window()
>win.connect("delete-event", Gtk.main_quit)
>win.show_all()
>Gtk.main()
>end

全くもって問題なく GtkWindow を一つリアライズできた :D
すごい。何の役に立つか分からんけど。

Use devhelp to refer to documents.

オフラインでこの手のリファレンス・マニュアル、特に gtk-doc を使って生成したものを参照したいのであれば、ウェブ・ブラウザよりもキーワード検索が高速な devhelp の方が便利でお薦め:
devhelp-20120825-01.png
devhelp では、これらの html 形式のドキュメントを「ブック」(book) と呼んでいるが、これは起動時に特定のディレクトリに格納されている *.devhelp とか *.devhelp2 というファイル (gzip 圧縮したものでも可能) を読み込んでブックの一覧を生成している。この一覧が、devhelp の左ペインにある「目次」に相当する。
ちなみに、この特定のディレクトリは、バージョン 3.4 のコードを調べてみると

$ cat -n devhelp-3.4.1/src/dh-book-manager.c
291  static void
292  book_manager_add_books_in_data_dir (DhBookManager *book_manager,
293                                      const gchar   *data_dir)
294  {
295          gchar *dir;
296
297          dir = g_build_filename (data_dir, "gtk-doc", "html", NULL);
298          book_manager_add_from_dir (book_manager, dir);
299          g_free (dir);
300
301          dir = g_build_filename (data_dir, "devhelp", "books", NULL);
302          book_manager_add_from_dir (book_manager, dir);
303          g_free (dir);
304  }
305
306  void
307  dh_book_manager_populate (DhBookManager *book_manager)
308  {
309          const gchar * const * system_dirs;
310
311          book_manager_add_books_in_data_dir (book_manager,
312                                              g_get_user_data_dir ());
313
314          system_dirs = g_get_system_data_dirs ();
315          while (*system_dirs) {
316                  book_manager_add_books_in_data_dir (book_manager,
317                                                      *system_dirs);
318                  system_dirs++;
319          }
320
321  #ifdef GDK_WINDOWING_QUARTZ
322          book_manager_add_from_xcode_docset (
323                  book_manager,
324                  "/Library/Developer/Shared/Documentation/DocSets");
325  #endif
326  }

のように、システム規模だと次のディレクトリ (${datadir} はビルド時に決まる) になり:

  • ${datadir}/gtk-doc/html
  • ${datadir}/devhelp/books

ユーザ規模だと次のディレクトリ (${HOME} は実行時に決まる) になる:

  • ${HOME}/.local/share/gtk-doc/html
  • ${HOME}/.local/share/devhelp/books

ということで、ユーザ規模のディレクトリにはこの手の翻訳ドキュメントを展開しておけばよい:

  • gtk-2.14.x-refs.tar.gz: GTK+ 2.14.7 版の API リファレンスのアーカイブ
$ mkdir -p ${HOME}/.local/share/gtk-doc/html/
$ tar xvfz gtk-2.14.x-refs.tar.gz -C ${HOME}/.local/share/gtk-doc/html/
$ ls ${HOME}/.local/share/gtk-doc/html/
gtk
$ ls ${HOME}/.local/share/gtk-doc/html/gtk/*/*.devhelp*
${HOME}/.local/share/gtk-doc/html/gtk/html/gtk.devhelp2
ディレクトリ名を変更する
$ mv ${HOME}/.local/share/gtk-doc/html/gtk/html ${HOME}/.local/share/gtk-doc/html/gtk-tmp
$ rm -rf ${HOME}/.local/share/gtk-doc/html/gtk
$ mv ${HOME}/.local/share/gtk-doc/html/gtk-tmp ${HOME}/.local/share/gtk-doc/html/gtk

注意する点として、同名の *.devhelp とか *.devhelp2 といった目次ファイルを持つディレクトリがシステム規模とユーザ規模にある場合はユーザ規模の方が優先されることと、basename(目次ファイル名) をディレクトリ名にする必要があるということ。

GTK+ Ref. translation (TAKE 3).

表示系のウィジェット」が完了。と比較すると:

  • GtkStatusIcon クラスが追加されている。システム・トレイとか通知スペースにアイコンを表示して、ツールチップやコンテキスト・メニューを利用するといったもの。
  • その他のクラスには大きな変更はないものの、アイコンや画像データとして GIO から GIcon のサポートが追加された。
  • はシグナルの説明がすっぽり抜けていたけれど、この版ではウェブ等のリソースから可能な限り埋めるようにした。
  • あとは他と同様に、gtk-doc の最新版でビルドした。

See Also GTK+ リファレンスマニュアル: v2.14.7 版の API リファレンス
See Also GIT リポジトリ: 作業用の GIT リポジトリ (英文併記)
See Also 誤植/誤訳の報告はメールの他にこちらにて。

Embeddeding an icon path into .desktop file.

調べるのに時間がかかった割にはすぐにも忘れちゃいそうな些細なテクニック。
make 時にデスクトップ・ファイル (.desktop) の中に独自のアイコンパスを埋め込む (というか、置き換える) 方法。
最近の GTK+ 系アプリならばアイコンテーマに準拠したアイコンを自前で用意してインストールしておけば、ファイル名ではなく名前でアイコンを探す方法を .desktop ファイルでも利用できる。例えば、こんな感じで:

$ grep Icon /usr/share/applications/anjuta.desktop
Icon=anjuta
$ ls -1 /usr/share/icons/hicolor/*/*/anjuta.png
/usr/share/icons/hicolor/16x16/apps/anjuta.png
/usr/share/icons/hicolor/22x22/apps/anjuta.png
/usr/share/icons/hicolor/24x24/apps/anjuta.png
/usr/share/icons/hicolor/32x32/apps/anjuta.png
/usr/share/icons/hicolor/48x48/apps/anjuta.png

しかしながら、アイコン・セットを用意できない (したくない) 場合や独自のアイコン・ファイルを $(datadir) 配下の独自フォルダにインストールして、それを .desktop ファイルから参照する際は、そのアイコン・ファイルのパス名を指定しておく必要がある。例えば、こんな風に:

$ grep Icon /usr/share/applications/gip-ng.desktop
Icon=/usr/share/gip-ng/ui/gip.png

Makefile の中で sed コマンドを使った置き換えがてっとり早いけど、.desktop.in から intltool を使ってローカライズした結果も反映させたいので巧い方法がないか調べてみた:

  • make 中に自動で置き換えたい
  • @INTLTOOL_DESKTOP_RULE@ と衝突することなく連携させたい

後者は .desktop.in の段階で ja.po ファイルに従って日本語に展開されて .desktop ファイルが生成されるようになっているので、同様に .desktop.in を生成する際に Icon のエントリを sed などで文字列を置換するのが適当じゃないかと。
ということで、まずテンプレート (例: gip-ng.desktop.in.in) を作成しておく:

[Desktop Entry]
_Name=IP Address Calculator
_GenericName=IP Adress Calculator
_X-GNOME-FullName=gip IP Adress Calculator
_Comment=Calculate IP addresses and networks
Categories=GNOME;GTK;Utility;
Exec=gip-ng %U
Icon=@UIDIR@/gip.png                  <>
MimeType=application/x-gip;
StartupNotify=true
Terminal=false
Type=Application
X-GNOME-Bugzilla-Bugzilla=Mikeforce
X-GNOME-Bugzilla-Product=gip-ng
X-GNOME-Bugzilla-Component=utility
X-GNOME-Bugzilla-Version=@VERSION@    <>

このファイルの中にある置換文字を sed を使って妥当なデータで置き換えるために Makefile.am の記述を次のようにする:

NULL=
(中略)
## Icons for UI, Misc
uidir = $(pkgdatadir)/ui
(中略)
## Desktop File
gip-ng.desktop.in: gip-ng.desktop.in.in
@sed -e "s|@UIDIR@|${uidir}|g"                  \
-e "s|@VERSION[@]|${VERSION}|" $ $@
desktop_in_in_files = \ gip-ng.desktop.in.in \ $(NULL) desktop_in_files = \ gip-ng.desktop.in \ $(NULL) desktopdir = $(datadir)/applications desktop_DATA = \ gip-ng.desktop \ $(NULL)
@INTLTOOL_DESKTOP_RULE@ (中略)

みたとおりで、intltool に渡す一つ手前の段階でアイコンのパス名を埋め込むといった流れ。
ちなみに、置換せずにアイコン名だけで参照するならば上から5行目は不要。

GTK+ Ref. translation (TAKE 2)

クラス別にリファレンスがまとめられている第三章の「GTK+ のウィジェットとオブジェクト」のうち「いろいろなウィンドウ」が完了。と比較すると:

  • GtkAssistant クラスが追加されている。libgnomeui で提供されていたドルイドとかウィザードとか呼ばれていたウィジェットがマージされた成果。
  • GtkAboutDialog クラスで一部のプロパティ名が他と衝突するので改名された。

See Also GTK+ リファレンスマニュアル: v2.14.7 版の API リファレンス
See Also GIT リポジトリ: 作業の用の GIT リポジトリ (英文併記)
See Also 誤植/誤訳の報告はメールの他にこちらにて。