Christopher Roy Bratusek <[email protected]> writes:

> Hi Jeremy,
>
> this is the viewport-windows function from sawfish-mmc, perhaps you can
> merge both to get the best result :)
>
> Chris
>
> ========================================================================
>
>   (define (viewport-windows)
>     (let ((windows (managed-windows))
>           (workspace current-workspace))
>       (setq windows (delete-if (lambda (w)
>                                  (or (not (window-mapped-p w))
>                                      (window-get w 'ignored)
>                                         ;(and (not allow-iconified)
>                                      (window-get w 'iconified)
>                                      (not (window-appears-in-workspace-p
>                                            w workspace))))
>                       windows))
>       (setq windows (delete-if window-outside-viewport-p windows)))))

Hmm.  Besides that this handles ignored and unmapped windows, the
differences are that this one includes sticky-windows and excludes
iconified windows, whereas the one I wrote excludes sticky-windows
(contrary to what I thought when I was replying to Teika; evidently
window-in-workspace-p excludes them) and includes iconified windows.

Here's a version that lets you specify what you want:

(define (viewport-windows #!optional vp-col vp-row workspace
                          exclude-sticky exclude-iconified)
  "Provide a list of windows that are mapped to the specified
viewport."
  (let* ((cur-vp (screen-viewport))
         (col (or vp-col (car cur-vp)))
         (row (or vp-row (cdr cur-vp)))
         (ws (or workspace current-workspace))
         (width (screen-width))
         (height (screen-height))
         (left (+ (- viewport-x-offset) (* col width)))
         (right (+ left (1- width)))
         (top (+ (- viewport-y-offset) (* row height)))
         (bottom (+ top (1- height))))
    (filter-windows (lambda (w)
                      (let ((pos (window-position w))
                            (dims (window-frame-dimensions w)))
                        (and (window-mapped-p w)
                             (not (window-get w 'ignored))
                             (if exclude-sticky
                                 (window-in-workspace-p w ws)
                               (window-appears-in-workspace-p w ws))
                             (not (and exclude-iconified
                                       (window-get w 'iconified)))
                             (not (or (<= (+ (car pos) (car dims)) left)
                                      (<= (+ (cdr pos) (cdr dims)) top)
                                      (>= (car pos) right)
                                      (>= (cdr pos) bottom)))))))))

The new-viewport setter will need to be modified; I can just resubmit
that patch once I've fixed it to handle the no-empty-viewport case...

-- 
Jeremy Hankins <[email protected]>
PGP fingerprint: 748F 4D16 538E 75D6 8333  9E10 D212 B5ED 37D0 0A03

Reply via email to