;; vtwm-zoom.gwm --- Window zooming functions for the VTWM profile
;;
;; Author: Anders Holst  (aho@sans.kth.se)  
;; Copyright (C) 1995  Anders Holst
;; Version: vtwm-1.0
;; Last change: 17/6 1995
;;
;; This file is copyrighted under the same terms as the rest of GWM
;; (see the X Inc license for details). There is no warranty that it
;; works. 
;;
;; --------------------------------------------------------------------- 
;;
;; The original zoom code came from Jay Berkenbilt. This is just an
;; adaption of it to the VTWM profile, with several different ways of
;; zooming added.
;;

;;
;;    USER CUSTOMIZABLE VARIABLES
;;    ---------------------------  
;;    Adjust these in your own profile
;;
(defaults-to
  zoom-offset 3                        ; Minimum distance to screen edge.
  zoom-window-method-list ()           ; List of (wind-type zoom-func) specs.
       ; This is to make zoom-window use different zoom methods for different
       ; types of windows.
)


;; You can use this to define several further zooming functions, as below.
(defun zoom-window-aux (name method)
  (pop-to-window)
  (with (zoomed (# 'zoom window)
         old-pos (# 'zpos window)         ;; virtual screen is tricky
         old-x (if old-pos (if (virtual-nailed) (# 0 old-pos)
                             (- (virtual-x (- (# 0 old-pos))))))
         old-y (if old-pos (if (virtual-nailed) (# 1 old-pos)
                             (- (virtual-y (- (# 1 old-pos))))))
         db (* (with (wob window) wob-borderwidth) 2))
    (if (= zoomed name)
        (progn                            ;; unzoom window
          (## 'zoom window ())
          (move-window old-x old-y)
          (resize-window (+ (# 2 old-pos) db) (+ (# 3 old-pos) db)))
        (not zoomed)
        (progn                            ;; zoom window
          (## 'zoom window name)
          (## 'zpos window (list (if (virtual-nailed) window-x
                                   (virtual-x window-x))
                                 (if (virtual-nailed) window-y
                                   (virtual-y window-y))
                                 window-width window-height))
          (method window-x window-y (+ window-width db) (+ window-height db)))
        (progn                            ;; rezoom window
          (## 'zoom window name)
          (method old-x old-y (+ (# 2 old-pos) db) (+ (# 3 old-pos) db))))))

(defun zoom-window-full ()
  (zoom-window-aux 'zoom-window-full
                   (lambda (x y w h)
                     (move-window zoom-offset zoom-offset)
                     (resize-window (- screen-width (* zoom-offset 2))
                                    (- screen-height (* zoom-offset 2))))))

(defun zoom-window-vert ()
  (zoom-window-aux 'zoom-window-vert
                   (lambda (x y w h)
                     (move-window x zoom-offset)
                     (resize-window w
                                    (- screen-height (* zoom-offset 2))))))

(defun zoom-window-horiz ()
  (zoom-window-aux 'zoom-window-horiz
                   (lambda (x y w h)
                     (move-window zoom-offset y)
                     (resize-window (- screen-width (* zoom-offset 2))
                                    h))))

(defun zoom-window-left ()
  (zoom-window-aux 'zoom-window-left
                   (lambda (x y w h)
                     (with (zoffh (/ (+ zoom-offset 1) 2))
                       (move-window zoom-offset zoom-offset)
                       (resize-window (- (/ screen-width 2) zoom-offset zoffh)
                                      (- screen-height (* zoom-offset 2)))))))

(defun zoom-window-right ()
  (zoom-window-aux 'zoom-window-right
                   (lambda (x y w h)
                     (with (zoffh (/ (+ zoom-offset 1) 2))
                       (move-window (+ (/ screen-width 2) zoffh) zoom-offset)
                       (resize-window (- (/ screen-width 2) zoom-offset zoffh)
                                      (- screen-height (* zoom-offset 2)))))))

(defun zoom-window-top ()
  (zoom-window-aux 'zoom-window-top
                   (lambda (x y w h)
                     (with (zoffh (/ (+ zoom-offset 1) 2))
                       (move-window zoom-offset zoom-offset)
                       (resize-window (- screen-width (* zoom-offset 2))
                                      (- (/ screen-height 2) zoom-offset zoffh))))))

(defun zoom-window-bottom ()
  (zoom-window-aux 'zoom-window-bottom
                   (lambda (x y w h)
                     (with (zoffh (/ (+ zoom-offset 1) 2))
                       (move-window zoom-offset (+ (/ screen-height 2) zoffh))
                       (resize-window (- screen-width (* zoom-offset 2))
                                      (- (/ screen-height 2) zoom-offset zoffh))))))

(defun zoom-window-prop ()
  (zoom-window-aux 'zoom-window-prop
                   (lambda (x y w h)
                     (with (bw (with (wob window) wob-borderwidth)
                            wbs (+ (- window-width window-client-width) (* 2 bw))
                            hbs (+ (- window-height window-client-height) (* 2 bw))
                            prop (min (/ (* (- screen-width wbs (* zoom-offset 2))
                                            1000) (- w wbs))
                                      (/ (* (- screen-height hbs (* zoom-offset 2))
                                            1000) (- h hbs)))
                            neww (+ (/ (* (- w wbs) prop) 1000) wbs)
                            newh (+ (/ (* (- h hbs) prop) 1000) hbs)
                            newx (/ (- screen-width neww) 2)
                            newy (/ (- screen-height newh) 2))
                        (move-window newx newy)
                        (resize-window neww newh)))))

(defun zoom-window ()
  (with (method (matches-cond zoom-window-method-list))
    (if method
        (eval method)
      (zoom-window-full))))


