(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 "未登録")))))))
(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)
(winapi::RECT-top chunk)
(- (winapi::RECT-right chunk)
(winapi::RECT-left chunk))
(- (winapi::RECT-bottom chunk)
(winapi::RECT-top chunk))
0)
*xyzzy-size-list*)
(message "登録")))))