kiwanami/emacs-window-manager — Issue #18: Feature request: make e2wm:pst-update-windows extendable
Author: tkf
Created: 2012-03-05 17:25:50+00:00
State: open

e2wm:pst-update-windows 相当の関数を `:update` にしたものをすべてのパースペクティブの base class にしてはどうでしょうか。 Monky パースペクティブの問題点があるのですが、それをスマートに解決するのに役立ちます。

Monky パースペクティブを開くと各プラグインの更新に時間がかかり、かなりまったりな動作になってしまいます。 Monky (Magit にも) `monky-with-refresh` なるマクロがあってこのマクロ内では画面の更新をせず、一番最後に一回だけ更新をおこなう、みたいなことが出来ます。これを e2wm で試すには、 e2wm:pst-update-windows を以下のように変更すればいけます。

```lisp
(defun e2wm:pst-update-windows (&optional rebuild-windows)
;;全ウインドウを更新する。rebuild-windowがnon-nilであればウインドウの再構築を行う。
(e2wm:message "#PST-UPDATE")
(e2wm:with-advice
(let* ((instance (e2wm:pst-get-instance))
(wm (e2wm:$pst-wm instance)))
;;(e2wm:debug-windows (e2wm:pst-get-wm))
(unless rebuild-windows
(wlf:wset-fix-windows wm))
(when (or rebuild-windows
(not (wlf:wset-live-p wm)))
(e2wm:message " #PST-UPDATE > REBUILD")
(wlf:refresh wm)
(e2wm:aif (e2wm:$pst-main instance)
(wlf:select wm it)))
(monky-with-refresh ; ← これを追加
;;パースペクティブ固有の処理
(e2wm:pst-method-call e2wm:$pst-class-update instance wm)
;;プラグイン更新実行
(e2wm:plugin-exec-update (selected-frame) wm))
)) t)
```

これをもうちょっとまともに解決するためには、 e2wm:pst-update-windows 相当の関数を `:update` にしたものをすべてのパースペクティブの base class にして、すべてのパースペクティブをその base class から派生させれば良いと思います。そうすれば、こんな感じで `monky-with-refresh` が使えるはずです:

```lisp
(defun e2wm:dp-monky-update (wm)
(monky-with-refresh
(e2wm:$pst-class-super wm)))
```