[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:5633] Re: マウス位置について
- X-ml-count: 5633
- Subject: [MD:5633] Re: マウス位置について
- From: "M.Fujii" <boochang@xxxxxxxxxxxx>
- Date: Thu, 16 Sep 2004 21:31:54 +0900 (JST)
- X-mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI)
藤井です。
meadow-users-jp で報告されていた以下の現象について調べてみました。
From: Akihisa Matsushita <akihisa@xxxxxxxxxx>
Subject: マウス位置について
Date: Mon, 13 Sep 2004 22:08:21 +0900
Message-ID: <uisaigvui.fsf@xxxxxxxxxx>
> マウスの左クリックをすることでカーソル位置を移動させると,特定の条件下
> で狙った位置に移動できないようです
>
> 以下,再現方法
>
> 何でもいいので横に長いテキストを入力.ただし,ウィンドウの右端でちょう
> ど折り返すようにする(添付ファイル参照.2行目と4行目には文字はない状態).
>
> この状態で3行目の If を狙ってクリックすると,その2行下へカーソルが移動
> してしまいます.
この現象ですが、9/6 の xdisp.c に対する CVS HEAD コードのインポートが原
因だと思われます。
インポートされたコードの中に、IT_OVERFLOW_NEWLINE_INTO_FRINGE マクロに
よる条件判定が含まれていますが、これは Meadow 2.1 系では不要だと考えま
す。
このマクロは、一論理行のテキストが丁度ウィンドウ幅と同じ幅に描画される
時の判定だと思いますが、このときの描画は、Emacs 21.3 以前と CVS HEAD で
は以下のように異なります。(truncate-lines が nil の場合)
Emacs 21.3 以前: 折り返しを行ない、次の物理行は空白行となる。
Emacs CVS HEAD : 折り返しを行なわず、改行コードを意味するアイコンが
fringe に描画される。
上記マクロによる判定で行なわれる処理を Meadow に組み込むと、この CVS
HEAD の挙動が一部組み込まれて、齟齬が生じているようです。
# 松下さんの再現例の場合、クリックした If の描画された場所は、CVS HEAD
# では then の描画されるはずの箇所であるため、カーソルは then の場所に
# 移動するのだと考えられます。
とりあえず、末尾に貼り付けたパッチのように上記マクロに関連した処理を削
除したところ、現象は発生しなくまりました。また、削除した状態でも
vertical-motion は正常に動作している模様です。
なお、Meadow 2.2x 系も同じ修正で現象が発生しなくなるようですが、こちら
は他の CVS HEAD のコードもインポートして整合性を取るという方向性もある
もかもしれません。
以下の修正は如何にもという箇所を削っただけの修正なので、これが妥当かど
うかを判断していただきたいと思います。
以上宜しくおねがいします。
Index: src/xdisp.c
===================================================================
--- src/xdisp.c (revision 3458)
+++ src/xdisp.c (working copy)
@@ -282,16 +282,6 @@
Lisp_Object Vshow_trailing_whitespace;
-#ifdef HAVE_WINDOW_SYSTEM
-/* Test if overflow newline into fringe. Called with iterator IT
- at or past right window margin, and with IT->current_x set. */
-
-#define IT_OVERFLOW_NEWLINE_INTO_FRINGE(it) \
- (FRAME_WINDOW_P (it->f) \
- && it->current_x == it->last_visible_x)
-
-#endif /* HAVE_WINDOW_SYSTEM */
-
/* Name of the face used to highlight trailing whitespace. */
Lisp_Object Qtrailing_whitespace;
@@ -5100,32 +5090,7 @@
++it->hpos;
it->current_x = new_x;
if (i == it->nglyphs - 1)
- {
- set_iterator_to_next (it, 1);
-#ifdef HAVE_WINDOW_SYSTEM
- if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
- {
- if (!get_next_display_element (it))
- {
- result = MOVE_POS_MATCH_OR_ZV;
- break;
- }
- if (BUFFER_POS_REACHED_P ())
- {
- if (ITERATOR_AT_END_OF_LINE_P (it))
- result = MOVE_POS_MATCH_OR_ZV;
- else
- result = MOVE_LINE_CONTINUED;
- break;
- }
- if (ITERATOR_AT_END_OF_LINE_P (it))
- {
- result = MOVE_NEWLINE_OR_CR;
- break;
- }
- }
-#endif /* HAVE_WINDOW_SYSTEM */
- }
+ set_iterator_to_next (it, 1);
}
else
{
@@ -5193,22 +5158,6 @@
if (it->truncate_lines_p
&& it->current_x >= it->last_visible_x)
{
-#ifdef HAVE_WINDOW_SYSTEM
- if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
- {
- if (!get_next_display_element (it)
- || BUFFER_POS_REACHED_P ())
- {
- result = MOVE_POS_MATCH_OR_ZV;
- break;
- }
- if (ITERATOR_AT_END_OF_LINE_P (it))
- {
- result = MOVE_NEWLINE_OR_CR;
- break;
- }
- }
-#endif /* HAVE_WINDOW_SYSTEM */
result = MOVE_LINE_TRUNCATED;
break;
}
--
藤井 正行 / Masayuki FUJII ( boochang@xxxxxxxxxxxx )