kiwanami / emacs-window-manager

Customizable window manager for emacs
229 stars 28 forks source link

Base class update function is not functional from a grandchild class #24

Closed tkf closed 12 years ago

tkf commented 12 years ago

こんにちは。先日の base class を加えた issue #18 ですが、また別の問題が発生しました。

デフォルトで定義されている perspective class の派生クラスを作ると、プラグインが update されなくなります。これは、 e2wm:method-call が1段階の継承しかサポートしてないことが原因で、 e2wm:dp-base-update が呼ばれなくなるからです。

コメントに明記されているのでバグとは言い難いですが、カスタマイズのためにクラスシステムがあると思うので、できれば何段階でも継承出来るほうが良いと思いますが、どうでしょうか?

現状のコードで拡張しようとすると、↓のようなコードを書く必要があります。

(e2wm:pst-class-register
 (make-e2wm:$pst-class
  :name   'code+
  :extend 'code
  :title  "Code+"
  :update 'e2wm:dp-base-update  ;; ← 強制的にセットする必要がある
  :popup  'ne2wm:dp-code+-popup))

(defun ne2wm:dp-code+-popup (buffer)
  (flet ((e2wm:dp-code-popup (b) (ne2wm:popup-sub-appropriate-select b)))
    (e2wm:$pst-class-super)))

ちなみに、フルのコードは https://github.com/tkf/ne2wm/blob/master/ne2wm-pst-code%2B.el に置いてあります。

tkf commented 12 years ago

上の問題は親クラスに該当メソッドが無い場合の問題ですが、もうひとつ、親クラスの該当メソッドが e2wm:$pst-class-super を呼んでいる場合には別の問題が発生すると思います。確かめた訳では無いですが、無限再帰が起こる気がします。

kiwanami commented 12 years ago

はい。#22を調べていて、 htwoが動かなくなっていた原因がこの問題でしたので修正をしています。 実装が見つかるか、親クラスがいなくなるまで登っていくようなコードに修正しています。 少々お待ちください。

tkf commented 12 years ago

リプライ速い!ありがとうございます!

kiwanami commented 12 years ago

修正してみました。継承の階層の制限をなくしてみました。 手元では動作確認できていますが、内部用の関数である 'e2wm:$pst-get-prop' と 'e2wm:method-call' の関数のインタフェースを変えたので、これらを使っている場合はもしかしたらみなさんのパースペクティブ定義で問題が出るかもしれません。 よろしければご確認をよろしくお願いします。

tkf commented 12 years ago

修正ありがとうございます!ちゃんと全パースペクティブをチェックしてから base class の pull request 送るべきでした。ご迷惑をおかけしました。

kiwanami commented 12 years ago

とんでもない。いろいろ拡張してもらって助かっています。 htwoは使っているわけではなくて、extendのテスト用でしたので問題ないです。

tkf commented 12 years ago

70ac168d5941d3cddf8123e98c2107fede0efd2c で修正されたので閉じます。