Ticket #225 (closed 不具合: wontfix)

Opened 3 years ago

Last modified 3 years ago

フォントの設定によってはウィンドウ最下行にカーソルが移動できないことがある.

Reported by: horiguti Assigned to: horiguti
Priority: minor Milestone:
Component: UI Version: 3.00 (開発中)
Keywords: Cc:

Description

以下のものを dot.emacs.el としてセーブして,

meadow -q -l dot.emacs.el

で起動して適当に長いファイルを読込んで, カーソルを最下行に移動しようとするとスクロールされてしまいます. フォントを default に戻すと最下行に移動できます.

(w32-add-font
 "MS-gothic-9"
 '((strict-spec
    ((:char-spec ascii :height any)
     (w32-logfont "MS ゴシック" 0 12 400 0 nil nil nil 128 1 3 49)))))
(setq default-frame-alist
      (cons '(font . "MS-gothic-9") default-frame-alist))

Attachments

Change History

2005年11月10日 14時42分30秒 changed by horiguti

#208の原因と思われる事象です.

2005年11月11日 04時44分55秒 changed by horiguti

  • owner set to horiguti.
  • status changed from new to assigned.

上記の設定ではフォントの高さは12dots, でモードラインを含めたウィンドウの全高(マクロ WINDOW_TOTAL_HEIGHT)はその行数倍なのに対してウィンドウがselectedでないとモードラインの高さが13dotsになっています. このため 最後の行の下1ドットがかけているということでそこにカーソルがいる状態で redisplay すると強制スクロールが起きているようです. ウィンドウがselectedだと モードラインの高さが12dotとなっているため強制スクロールが起きません.

これを判断しているのは source:/trunk/src/xdisp.c#3959 :11670 cursor_row_fully_visible_p() で, 問題となる状況ではこの中の xdisp.c:11692: MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row) のマクロが上記の判定で TRUE となっています. (行番号は r3959)

そのマクロによる定義から, フォントの種類によってはredisplay の際に勝手に recenter(と等価な処理が) されること避けられないようなので, #208 の方で最終行にカーソルが移動しないように細工するようにしましょう.

以下の関数でこの判定ができます. 多分.

(defun last-line-maybe-not-fully-displayed (&optional w)
  (save-selected-window
    (if w (select-window w))
    (let ((wbox (window-inside-pixel-edges)))
      (not (zerop (% (- (nth 3 wbox) (nth 1 wbox))
		     (frame-char-height)))))))

2005年11月11日 04時45分38秒 changed by horiguti

  • status changed from assigned to closed.
  • resolution set to wontfix.

ということでこの件そのものは wontfix とします.

2005年11月11日 07時14分18秒 changed by miyoshi

モードラインが12ドット高でなくて13ドット高になってしまうのは不具合ではありませんか?

2005年11月11日 07時56分17秒 changed by fujii

非アクティブなウィンドウのモードラインに使われる face である mode-line-inactive は weight が light です。 この時のフォント選択が原因してそうです。 正常なのか不具合のなのかわかりませんが。

weight が light のときのフォントを明示的に指定すると高さが一致します。

(w32-add-font
 "MS-gothic-9"
 '((strict-spec
    ((:char-spec ascii :height any)
     (w32-logfont "MS ゴシック" 0 12 400 0 nil nil nil 128 1 3 49))
    ;; 追加
    ((:char-spec ascii :height any :weight light)
     (w32-logfont "MS ゴシック" 0 12 400 0 nil nil nil 128 1 3 49)))))
(setq default-frame-alist
      (cons '(font . "MS-gothic-9") default-frame-alist))

2005年11月11日 09時48分41秒 changed by horiguti

高さが変わること自体は問題ではないような気がします. info ではどのみち大きさの違うフォントがウィンドウ内に混在して同じことが起きますから.

ある場所の表示の完全性自体はフォント混在のときも含めて pos-visible-in-window<f> でちゃんとわかるようなので, ポイントの行き先をこれでチェックすればいいとおもいます. (先に示した関数ではフォント混在には対応していません)

2005年11月12日 10時31分37秒 changed by miyoshi

モードラインがウインドウを侵食するのが問題だと思います。

このような場合に、どのようにするのか方針を明確にしたほうが良いと思います。

  • モードラインの高さをデフォルトフォントの高さ(またはその整数倍)に制限する
  • モードライン自体の高さを尊重し、その分だけウインドウが小さくなるのを許す

Emacs は前者を採用していると思っていたのですが違いますかね?

全然調べないで言ってますが。

2005年11月12日 14時10分17秒 changed by fujii

高さだけを制限してもベースラインが異なったら効力を発揮しないように思います。 チケット冒頭の設定に垂直方向のセンタリングを追加すれば、モードラインの高さは 通常の行の高さと揃います。

(w32-add-font
 "MS-gothic-9"
 '((strict-spec
    ((:char-spec ascii :height any)
     (w32-logfont "MS ゴシック" 0 12 400 0 nil nil nil 128 1 3 49)))))
(setq default-frame-alist
      (cons '(font . "MS-gothic-9") default-frame-alist))
;; 追加
(setq vertical-centering-font-regexp ".*")

あと、こんな方針もありかもしれません。

  • モードライン自体の高さを尊重し、その分だけフレームを拡大することを許す。

これが良い方針とは思っていないですが、選択肢のひとつということで。


Add/Change #225 (フォントの設定によってはウィンドウ最下行にカーソルが移動できないことがある.)




Change Properties
Action