diff --git a/src/move-wm-pager.scm b/src/move-wm-pager.scm index 62a68e7..7b2ddbf 100644 --- a/src/move-wm-pager.scm +++ b/src/move-wm-pager.scm @@ -1,5 +1,6 @@ (define-record-type move-wm-pager :move-wm-pager - (make-move-wm-pager dpy window wm in-channel options buttons-alist width) + (make-move-wm-pager dpy window wm in-channel options buttons-alist width + visible?) move-wm-pager? (dpy pager:dpy) (window pager:window) @@ -8,7 +9,8 @@ (options pager:options) ;; client -> button (buttons-alist pager:buttons-alist set-pager:buttons-alist!) - (width pager:width set-pager:width!)) + (width pager:width set-pager:width!) + (visible? pager:visible? set-pager:visible!)) ;; TODO: hide buttons/keys ;; TODO: client-name <-> WM_ICON_NAME? @@ -35,7 +37,7 @@ (gc (create-gc dpy window '())) (colormap (screen:default-colormap (display:default-screen dpy))) (pager (make-move-wm-pager dpy window wm in-channel options '() - (rectangle:width rect)))) + (rectangle:width rect) #t))) (spawn* (list 'move-wm-pager wm window) (lambda (release) @@ -212,3 +214,9 @@ (button (cdr c.b))) (pager-update-button pager button client))) (pager:buttons-alist pager))) + +(define (pager-change-visibility pager) + (set-pager:visible! pager (not (pager:visible? pager))) + (if (not (pager:visible? pager)) + (unmap-window (pager:dpy pager) (pager:window pager)) + (map-window (pager:dpy pager) (pager:window pager)))) diff --git a/src/move-wm.scm b/src/move-wm.scm index cdb0847..2206fdc 100644 --- a/src/move-wm.scm +++ b/src/move-wm.scm @@ -12,6 +12,9 @@ '("#808080" "#aaaaaa" "#eeeeee" "#777777" "black")) (pager-maximum-button-width int 140) (pager-height int 24) + (select-next keys "M-Tab") + (select-previous keys "M-S-Tab") ;; or ISO_Left_Tab ? + (hide-show-pager keys "M-p") ) (define (create-move-wm out-channel dpy parent options default-options @@ -30,7 +33,13 @@ (window (wm:window wm)) (gc (create-gc dpy window '())) (pager-channel (make-channel)) - (pager (create-move-wm-pager wm pager-channel (wm:options wm)))) + (options (wm:options wm)) + (pager (create-move-wm-pager wm pager-channel options))) + (for-each (lambda (id) + (grab-shortcut dpy window + (get-option-value options id) + id channel #f)) + '(select-next select-previous hide-show-pager)) (spawn* (list 'move-wm wm) (lambda (release) (release) @@ -217,6 +226,22 @@ (raise-window dpy (client:client-window c))) clients))) + ((select-next select-previous) + (let* ((time (second msg)) + (cc (wm-current-client wm)) + (clients (if (eq? (first msg) 'select-next) + (wm-clients wm) + (reverse (wm-clients wm))))) + (let loop ((l (append clients clients))) + (and (not (null? l)) + (if (eq? (car l) cc) + (and (not (null? (cdr l))) + (wm-select-client wm (cadr l) time)) + (loop (cdr l))))))) + + ((hide-show-pager) + (pager-change-visibility pager)) + (else (warn "unhandled move-wm message" wm msg))))) (define (make-client-data titlebar resizer)