Subscribed unsubscribe Subscribe Subscribe

Sylpheedで送信をhookできないか調べる

Sylpheedのプラグインとして、メッセージを送信時にhookできないか調べてみた。

やりたいのは以下のようなこと

  1. メッセージ作成ダイアログ表示
  2. 送信もしくは後で送信をクリックしたときにメールの内容をチェック
  3. チェックで問題なければそのまま送信
  4. チェックで問題があれば処理を送信もしくは後で送信をキャンセル

プラグインAPIとしてメッセージ作成ダイアログに対しては
compose-createdシグナルに対するハンドラを登録できるようになっている。

なので、リファレンスを見ながら試行錯誤してみた。
ざっくりと書くと以下のような感じ。

plugin_load()
{
  ...
  syl_plugin_signal_connect("compose-created", G_CALLBACK(compose_created_cb), NULL);
  syl_plugin_signal_connect("compose-destroy", G_CALLBACK(compose_destroy_cb), NULL);
}

void compose_created_cb(GObject *obj, gpointer compose)
{
  g_signal_add_emission_hookでhookを追加
}

static gboolean
button_press_emission_hook (GSignalInvocationHint	*ihint,
                            guint			n_param_values,
                            const GValue			*param_values,
                            gpointer			data)
{
  ...
  メールの内容をチェックして問題ないなら何もしない

  問題があればstop_emissionでhook以降の処理をスキップ
  その際、composeから取得した0番目のGTKToolItemのイベントを指定する
  g_signal_stop_emission_by_name(G_OBJECT(GTK_BIN(g_sendbtn)), "button_pressed_event");
}

g_signal_handler_blockはボタンを押しても反応しないようにするために使うっぽいので、
emission_hook内でstop_emissionで止めれば送信キャンセルできるのかと思ったのですが、

signal `button_pressed_event` is invalid for instance `03010EA0'

hook内でstop_emissionがエラーになってしまう。

GTKのシグナルがらみはちょっとよくわかっていないので、とりあえず保留することにした。