2014年05月11日

Gtk::TextViewに表示するテキストの属性の操作方法



 頭の中だけで整理しようとするとややこしいのでメモっとく。ざっと勉強しただけのやっつけまとめ。テキスト本体の編集の話ではなく、あくまで表示などに関わる属性の話。とりあえずはGTK+2向け。

 まずTextViewのテキスト全体に対する操作は、TextViewがdefault_attributesとして持っているGtk::TextAttributesをいじればいいのだが、TextAttributesはさらに入れ子構造になっていて真面目に掘っていこうとするとめんどくさい。(そうでもなかった)TextAttributes以下で管理している属性のいくつかはTextViewのメソッドやプロパティとして操作できるので、まずはそちらから触ることを試みるのが得策か。

 対してテキストの一部分に適用するための属性は、テキストの範囲を指定して設定するGtk::TextTagを介して操作する。TextTagを使うには、まずTextBufferに紐付けられているGtk::TextTagTableに登録した上で、テキスト上の位置を指定して貼り付ける。TextTagの作成、貼り付けはTextBufferのメソッドで行う。

【参考リンク】
 GTK+ 2 Reference Manual: Text Widget Overview
 Ruby/GTK API Reference - Ruby-GNOME2 Project Website
posted by chrono at 08:02| Comment(0) | Ruby

2014年05月08日

WindowsのRuby 2.0とgtk2 gemの組み合わせで作ったプログラムの終了時にsegmentation faultが出てしまう場合の対処法

 メインウィンドウのクローズボタンを押すかAlt+F4押し下げでdelete_eventシグナルを受け付け、その時のプログラムの状態によってdelete_eventシグナルのハンドラで真偽値のどちらかを返し、(その戻り値によって発生するかどうかが決まる)destroyシグナルのハンドラでGtk.main_quitを呼び出す形でプログラムの終了/非終了を制御している自作プログラムで、delete_eventシグナルのハンドラでfalseを返したときになぜかプログラムが正常に終了せずに、segmentation faultが出てしまいプロセスが終了しないことがあった。

 そのときのエラーメッセージ。

C:/Users/foo/hoge.rb: [BUG] Segmentation fault
ruby 2.0.0p451 (2014-02-24) [i386-mingw32]

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:000314 TOP [FINISH]


-- C level backtrace information -------------------------------------------


 これだけなので、自分の知識では原因がまったく推測もできず困ってしまったのですが、とりあえず以下のやり方でエラーを出さずに終了させるようにできました。

delete_eventシグナルのハンドラ内でプログラムを終了させる判定になったら、falseを返すのではなく明示的にdestroyシグナルのハンドラ(もしくは直接Gtk.main_quit)を呼び出してしまう


 例えば、エラーが出るコードが以下のようになっているとしたら、

def on_window_main_delete_event(widget, *args)
 !quit?()
end

def on_window_main_destroy(widget, *args)
 Gtk.main_quit
end


 以下のように書き換えます。

def on_window_main_delete_event(widget, *args)
 if quit?()
  on_window_main_destroy(widget)
 end
 true
end

def on_window_main_destroy(widget, *args)
 Gtk.main_quit
end
posted by chrono at 07:53| Comment(0) | Ruby

2014年05月05日

Glade3のgladeファイルからRubyプログラムのひな型を生成するプログラムを再度更新しました

 午前に公開したもの(20140505.zip)にバグがあったため、修正して再度更新しました。お手数をおかけしますが、再度ダウンロードをお願いします。

 Glade3のgladeファイルからRubyプログラムのひな型を生成するプログラム
posted by chrono at 13:38| Comment(0) | 自作ソフト、コンテンツ

Glade3のgladeファイルからRubyプログラムのひな型を生成するプログラムを更新しました

 Glade3のGtkBuilder形式のgladeファイルからRubyプログラムのひな型を生成するプログラム、ruby_glade3_create_template.exeを更新しました。

 こちらのページで公開しています。

 Glade3のgladeファイルからRubyプログラムのひな型を生成するプログラム
posted by chrono at 02:44| Comment(0) | 自作ソフト、コンテンツ

Ruby-GNOME2公式WikiのGtk::SourceViewのリファレンスを翻訳してみた

 Ruby-GNOME2公式WikiのGtk::SourceViewクラスのリファレンスを内容を更新しつつ翻訳してみました。gemのgtksourceview2に含まれるバージョンに対応するものです。他の関連クラスのリファレンスもぼちぼちやっていければなあと思っています。

 Gtk::SourceView - Ruby-GNOME2 Project Website

 上記のgtksourceview2 gemはGTK+2ベースですが、GTK+3ベースのgtksourceview3というのもあります。こちらは名前空間が例えばGtkSource::Viewというように、GtkSource::〜の形に変更されています。
posted by chrono at 02:38| Comment(0) | Ruby

2014年05月03日

WindowsでCでGTK+3プログラミングする準備

ふと思い立って、WindowsでGTK+3プログラミングするための環境を作ってみた。

MinGWは既にインストールしてあったので、GTK+ installation and usage tutorial: Windowsに書いてある手順で簡単にできたことはできた。

しかしVisual C++を利用するやり方の方はうまくいかなかった。PCに入ってたのは2010 Expressだったが、原因を追及する暇がなかったので、こちらはあきらめた。
posted by chrono at 21:53| Comment(0) | 日記、雑文