ウィンドウサイズを複数パターン記憶できたら便利だよね。

; > xyzzy の音 - バッファ/ウィンドウ/フレーム
; > http://hie.s64.xrea.com/xyzzy/note/buffer.html#xyzzy-resize
; > xyzzy Part6 212 あたりからを参考に。
; を改造。パターン記録して呼び出す方式に。

(provide "window-resize")
(in-package "editor")
(require "wip/winapi")
(unless (fboundp 'GetWindowRect)
  (c:*define-dll-entry winapi:BOOL GetWindowRect
    (winapi:HWND (winapi:RECT *))
    "user32"))
(unless (fboundp 'SetWindowPos)
  (c:*define-dll-entry winapi:BOOL SetWindowPos
    (winapi:HWND winapi:HWND winapi:INT winapi:INT winapi:INT winapi:INT winapi:UINT)
    "user32"))

(export '(xyzzy-resize
          xyzzy-write-sizes
          xyzzy-get-size
          *xyzzy-size-list*))

(defvar *xyzzy-size-list* nil)

;サイズを変更
(defun xyzzy-resize (&optional c)
  (interactive)
  (message "サイズを変更(gでサイズ取得,!で登録サイズを出力)")
  (let ((s (or c (read-char *keyboard*))))
    (case s
      (#\C-g (ding) (clear-message))
      (#\g (xyzzy-get-size))
      (#\! (xyzzy-write-sizes))
      (t (let ((arg (assoc s *xyzzy-size-list*)))
           (if arg
               (progn (apply 'SetWindowPos (get-window-handle) 0 (cdr arg))
                 (clear-message))
             (message "未登録")))))))

;.xyzzy登録用
(defun xyzzy-write-sizes ()
  (interactive)
  (insert (format nil "(setq *xyzzy-size-list* '~S)" *xyzzy-size-list*)))

;サイズを変数に記録
(defun xyzzy-get-size (&optional c)
  (interactive)
  (message "登録キーを指定してください。")
  (let ((s (or c (read-char *keyboard*)))
        (chunk (winapi:make-RECT)))
    (if (eq s #\C-g)
        (progn (ding) (clear-message))
      (progn
        (GetWindowRect (get-window-handle) chunk)
        (if (assoc s *xyzzy-size-list*)
            (setq *xyzzy-size-list* (delete s *xyzzy-size-list* :key 'car)))
        (push (list s
                    (winapi::RECT-left chunk)     ;X座標
                    (winapi::RECT-top chunk)      ;Y座標
                    (- (winapi::RECT-right chunk) ;ウィンドウ幅
                       (winapi::RECT-left chunk))
                    (- (winapi::RECT-bottom chunk);ウィンドウ高さ
                       (winapi::RECT-top chunk))
                    0)
              *xyzzy-size-list*)
        (message "登録")))))