Climacsでのrun-or-raise — #:g1

Posted 2011-01-13 10:38:00 GMT

前回重要なことを書くのを忘れていたので追記的エントリーなのですが、Climacsのように処理系内部から別スレッドで立ち上げる場合、StumpWMのrun-or-raiseをどういう風に処理するかが問題になります。
raiseの方は既に立ち上がっているものにフォーカスすれば良いだけなのでそのままでOKなのですが、runの方は起動していない場合は通常実行可能ファイルを実行するのでここを少し書き換える必要があります。
ということで、run-or-raiseを改造してfun-run-or-raiseというのをでっち上げて使ってみています。

(in-package :stumpwm)

(defun fun-run-or-raise (fun props &optional (all-groups *run-or-raise-all-groups*) (all-screens *run-or-raise-all-screens*)) (labels ;; Raise the window win and select its frame. For now, it ;; does not select the screen. ((goto-win (win) (let* ((group (window-group win)) (frame (window-frame win)) (old-frame (tile-group-current-frame group))) (frame-raise-window group frame win) (focus-all win) (unless (eq frame old-frame) (show-frame-indicator group))))) (let* ((matches (find-matching-windows props all-groups all-screens)) ;; other-matches is list of matches "after" the current ;; win, if current win matches. getting 2nd element means ;; skipping over the current win, to cycle through matches (other-matches (member (current-window) matches)) (win (if (> (length other-matches) 1) (second other-matches) (first matches)))) (if win (goto-win win) #+sbcl (sb-thread:make-thread fun :name (format nil "~A" fun))))))

(defcommand climacs () () "" (fun-run-or-raise (lambda () (climacs:climacs :new-process "climacs")) '(:class "Climacs")))

これで起動していない場合は、処理系内から別スレッドで起動できるようになりました。

comments powered by Disqus