gtk_text_view_obscure_mouse_cursor

GNOME Terminal でタイピングしている最中のことです。
Firefox で検索をしようとして、ふと、マウスポインタが表示されていないことに気がつきました。このとき、マウスボタンをクリックするとマウスポインタが現れることもありますが挙動がまちまちで、マウスを動かすとマウスポインタは現れるものの、大きく動かすとどこへいったのか気づかないほど離れた位置に飛んでいるときがあるので、ちょこんと指先でマウスをつつく感じで動かしてやるのが良いようです。
やがて、マウスポインタが消えるのは、GNOME Terminal に限らず、GTK+ 3.4 を使っているアプリケーション共通の挙動で、なおかつ、キープレスイベントを受け取る gtk_text_view にマウスポインタが入っており、マウスポインタのアイコンが I の文字のような形のときに限ることに気がつきました。この場合に限り、文字を挿入するためにキープレスしたときに、決まってマウスポインタが消えます。キープレスであっても DEL キーやカーソルキーではマウスポインタは表示されたままです。ペーストで挿入するときも表示されたままです。おもしろいことに、文字挿入時にマウスポインタgtk_text_view の外にだして矢印カーソルにしておくと、キープレスで文字挿入してもマウスポインタは消えません。
何が起きているのかと不思議に思って、gtk_text_view のソースを読んでみると、キープレス・イベントハンドラで文字挿入をおこなうとき gtk_text_view_obscure_mouse_cursor を読んでいます。

http://git.gnome.org/browse/gtk+/tree/gtk/gtktextview.c?h=gtk-3-4#n4412

static gint
gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
{
  GtkTextView *text_view;
  /* 省略 */
  /* 文字挿入、リターンキー押し、タブキー押しで obscure 変数を真にする。 */

  if (obscure)
    gtk_text_view_obscure_mouse_cursor (text_view);
  /* 省略 */
  return retval;
}

マウスポインタを隠しているのは、この gtk_text_view_obscure_mouse_cursor です。

http://git.gnome.org/browse/gtk+/tree/gtk/gtktextview.c?h=gtk-3-4#n4234

static void
gtk_text_view_obscure_mouse_cursor (GtkTextView *text_view)
{
  if (text_view->priv->mouse_cursor_obscured)
    return;

  set_invisible_cursor (text_view->priv->text_window->bin_window);

  text_view->priv->mouse_cursor_obscured = TRUE;
}

隠していたマウスポインタを表示に戻すのはこの直後に定義してある gtk_text_view_unobscure_mouse_cursor で、これは mouse_press と mouse_move イベントハンドラから呼び出されています。

以上より、gtk_text_view そのものに、マウスポインタがキープレスによる文字挿入で隠れて、マウスを動かすと出現するように定義してあることがわかりました。なぜにまた、こんな迷惑な挙動をするようにしてあるのかメーリングリストをあさってみたところ、文字挿入時にマウスポインタのある場所へフォントを描く可能性があるためのようです。わからないでもない理由ですが、文字を描画する領域とマウスポインタが描画されている領域が重なっているときに限り一時的にマウスポインタを隠してまた表示するというやりかたになってないのは不思議な気がしました。ちらつきが出るにしても、そうする方がマウスポインタが隠れてしまったままになるよりかは素直な気がするのです。