[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:5633] Re: マウス位置について



藤井です。

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 )