Stumpwm に suspend と hibernate の導入

最近 Stumpwm の設定を割と放り出して不便と思いつつも suspend と hibernate を導入してませんでした。まぁ Common Lisp の勉強をしていたので本気で投げ出していたわではないんですが。

本題に入って、今回はタイトルにもある通り Stumpwm で運用している Debian に suspend と hibernate を入れました。とは言え作業的には大したこともしておらず、いつも通り他力本願でおこなっております。

今回は以下のページを参考にしました。感謝です。

とりあえず、hibernate が入ってなかったので apt で入れました。Debian にはパッケージで用意されているので存分に甘えます。後は visudo で suspend.sh では PASSWD 認証を求めないようにして Stumpwm 上での煩わしさを回避。

$ sudo aptitude install hibernate
$ sudo visudo
USERNAME ALL=(ALL) NOPASSWD: /usr/local/sbin/suspend.sh

別に NOPASSWD にすることもないかと思ったんですが、やはり suspend するのに一々 PASS 入力も煩わしいので。因みに最初はノート PC の蓋を閉じるだけで suspend するように設定してみたんですが、何故か蓋を一旦閉じて開かないと suspend しない為断念しました。解決策は未だ不明です。めんどくさいので先延ばしです。続いて .stumpwmrc の記述。

.stunmpwmrc

; --- sudo command definitions  --------------------------------
(define-stumpwm-type :password (input prompt)
  (let ((history *input-history*)
        (arg (argument-pop input))
        (fn (symbol-function 'draw-input-bucket)))
    (unless arg
      (unwind-protect
           (setf (symbol-function 'draw-input-bucket)
                 (lambda (screen prompt input &optional errorp)
                   (let ((i (copy-structure input)))
                     (setf (input-line-string i)
                           (make-string (length (input-line-string i))
                                        :initial-element #\*))
                     (funcall fn screen prompt i)))
                 arg (read-one-line (current-screen) prompt))
        (setf (symbol-function 'draw-input-bucket) fn
              *input-history* history))
      arg)))

(defmacro define-sudo-command (name command &key output)
  (let ((cmd (gensym)))
    `(defcommand ,name (password) ((:password "sudo password: "))
      (let ((,cmd (concat "echo '" password "' | sudo -S " ,command)))
        ,(if output
             `(run-prog-collect-output *shell-program* "-c" ,cmd)
             `(run-prog *shell-program* :args (list "-c" ,cmd) :wait nil))))))

;; define command
(defcommand hibernate () ()
  (run-shell-command "hibernate"))

(defcommand suspend () ()
  (run-shell-command "sudo suspend.sh"))

;; set key-bind
(define-key *root-map*   (kbd "C-s") "suspend")

最初に出てくるごっつい塊二つは sudo を Stumpwm のコマンドに対して使用するためのものです。これで NOPASS を通していない hibernate もコマンド入力で実行できるようになります。因みに reboot や shutdown も登録しておけば勿論動きます。
defcommand で Stumpwm 上でのコマンドを定義しているのでここで hibernate と suspend が Stumpwm に認識されるようになりました。後はキーバインドにコマンドを設定すれば簡単に suspend できるようになります。さすがに 1 ストロークで suspend されては困るので、 *root-map* に登録設定しました。これで Ctl-t, Ctl-s と入力すれば suspend できます。後は設定を loadrc で読み込み直せばいつでも hibernate && suspend できます。

次は mode-line でもやろうかな。