- replaced the "last-focused" functionality in switch-wm with a list
of clients in stacking order in manager.
This commit is contained in:
parent
af7138816e
commit
0344af777d
|
@ -1,7 +1,7 @@
|
|||
(define-record-type wm :wm
|
||||
(make-wm type in-channel out-channel internal-out-channel
|
||||
dpy window colormap options special-options
|
||||
clients current-client)
|
||||
clients clients-stacking current-client)
|
||||
wm?
|
||||
(type wm:type)
|
||||
(in-channel wm:in-channel)
|
||||
|
@ -13,6 +13,7 @@
|
|||
(options wm:options)
|
||||
(special-options wm:special-options)
|
||||
(clients wm:clients set-wm:clients!)
|
||||
(clients-stacking wm:clients-stacking set-wm:clients-stacking!)
|
||||
(current-client wm:current-client set-wm:current-client!))
|
||||
|
||||
(define-record-discloser :wm
|
||||
|
@ -20,6 +21,7 @@
|
|||
`(Wm ,(manager-type-name (wm:type wm)) ,(wm:window wm))))
|
||||
|
||||
(define wm-clients wm:clients)
|
||||
(define wm-clients-stacking wm:clients-stacking)
|
||||
(define wm-current-client wm:current-client)
|
||||
|
||||
(define-enumerated-type manager-type :manager-type
|
||||
|
@ -46,7 +48,7 @@
|
|||
(internal-out-channel (make-channel))
|
||||
(wm (make-wm type in-channel out-channel internal-out-channel
|
||||
dpy main-window colormap
|
||||
options special-options '() #f)))
|
||||
options special-options '() '() #f)))
|
||||
|
||||
(set-window-background-pixmap! dpy main-window parent-relative)
|
||||
;; set properties ************************************************
|
||||
|
@ -169,6 +171,7 @@
|
|||
(maybe-rect (third msg)))
|
||||
(let ((client (create-client wm window)))
|
||||
(set-wm:clients! wm (append (wm:clients wm) (list client)))
|
||||
(set-wm:clients-stacking! wm (cons client (wm:clients-stacking wm)))
|
||||
(send-message+wait internal-out-channel
|
||||
(list 'init-client client maybe-rect))
|
||||
(if (not (wm:current-client wm))
|
||||
|
@ -210,6 +213,8 @@
|
|||
(let ((client (second msg)))
|
||||
(set-wm:clients! wm (filter (lambda (c) (not (eq? c client)))
|
||||
(wm:clients wm)))
|
||||
(set-wm:clients-stacking! wm (filter (lambda (c) (not (eq? c client)))
|
||||
(wm:clients-stacking wm)))
|
||||
(send-message+wait (wm:internal-out-channel wm)
|
||||
(list 'deinit-client client))
|
||||
(if (eq? client (wm:current-client wm))
|
||||
|
@ -226,6 +231,10 @@
|
|||
(send-message+wait (wm:internal-out-channel wm)
|
||||
(list 'show-clients all))
|
||||
(set-wm:current-client! wm top)))
|
||||
(set-wm:clients-stacking! wm
|
||||
(append (reverse all)
|
||||
(filter (lambda (c) (not (memq c all)))
|
||||
(wm:clients-stacking wm))))
|
||||
(if (window-exists? dpy (client:window top))
|
||||
(take-focus dpy (client:window top) time))))
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
((wait)
|
||||
(let ((sp (second msg))
|
||||
(message (third msg)))
|
||||
(handle-message wm pager gc
|
||||
(handle-message wm pager gc titlebar-options
|
||||
(lambda args
|
||||
(sync-point-release sp)
|
||||
(apply exit args))
|
||||
|
@ -214,7 +214,7 @@
|
|||
(let ((clients (second msg)))
|
||||
(for-each (lambda (c)
|
||||
(if (eq? (client:wm-state c) (wm-state iconic))
|
||||
(handle-message wm pager gc exit
|
||||
(handle-message wm pager gc titlebar-options exit
|
||||
(list 'normalize-client c)))
|
||||
(raise-window dpy (client:client-window c)))
|
||||
clients)))
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
wm:internal-out-channel wm:special-options
|
||||
(manager-type :syntax) manager-types manager-type-name
|
||||
create-wm destroy-wm
|
||||
wm-clients wm-current-client
|
||||
wm-clients wm-clients-stacking wm-current-client
|
||||
wm-manage-window wm-unmanage-window wm-select-client
|
||||
wm-configure-window
|
||||
wm-iconify-window wm-normalize-window wm-maximize-window
|
||||
|
@ -137,7 +137,7 @@
|
|||
client-name find-window-by-name get-all-window-names
|
||||
client-replace-window
|
||||
client-of-window)
|
||||
(open scheme threads list-lib locks signals
|
||||
(open scheme (subset scsh (format)) threads list-lib locks signals
|
||||
xlib
|
||||
define-record-types
|
||||
finite-types
|
||||
|
@ -175,7 +175,8 @@
|
|||
|
||||
(define-structure switch-wm
|
||||
(export create-switch-wm)
|
||||
(open scheme list-lib define-record-types signals
|
||||
(open scheme (subset scsh (format))
|
||||
list-lib define-record-types signals
|
||||
threads rendezvous-channels rendezvous
|
||||
xlib
|
||||
manager titlebar dragging
|
||||
|
|
|
@ -8,25 +8,12 @@
|
|||
wm)))
|
||||
|
||||
(define-record-type switch-wm-data :switch-wm-data
|
||||
(make-switch-wm-data titlebars empty-titlebar last-focused titlebar-options)
|
||||
(make-switch-wm-data titlebars empty-titlebar titlebar-options)
|
||||
switch-wm-data?
|
||||
(titlebars data:titlebars set-data:titlebars!)
|
||||
(empty-titlebar data:empty-titlebar)
|
||||
(last-focused data:last-focused set-data:last-focused!)
|
||||
(titlebar-options data:titlebar-options))
|
||||
|
||||
;; only for switch-wm's, but maybe we will need that for all...
|
||||
(define (last-focused-client wm data)
|
||||
(let ((c (cdr (data:last-focused data))))
|
||||
(and (memq c (wm-clients wm)) c)))
|
||||
|
||||
(define (add-last-focused-client! wm data client)
|
||||
(let ((p (data:last-focused data)))
|
||||
(if (not (eq? client (car p)))
|
||||
(begin
|
||||
(set-cdr! p (car p))
|
||||
(set-car! p client)))))
|
||||
|
||||
(define (init-switch-wm wm channel)
|
||||
(let* ((dpy (wm:dpy wm))
|
||||
(window (wm:window wm))
|
||||
|
@ -47,8 +34,7 @@
|
|||
(button-up-colors . ,(get 'titlebar-button-up-colors))
|
||||
(height . ,(get 'titlebar-height))))))
|
||||
(empty-titlebar (create-empty-titlebar wm))
|
||||
(data (make-switch-wm-data '() empty-titlebar (cons #f #f)
|
||||
titlebar-options)))
|
||||
(data (make-switch-wm-data '() empty-titlebar titlebar-options)))
|
||||
(update-titlebars wm data)
|
||||
|
||||
(for-each (lambda (id)
|
||||
|
@ -148,8 +134,7 @@
|
|||
(if (window-viewable? dpy window)
|
||||
'active
|
||||
'normal))))
|
||||
(set-titlebar-state! titlebar state)))
|
||||
(if focused? (add-last-focused-client! wm data client))))
|
||||
(set-titlebar-state! titlebar state)))))
|
||||
|
||||
((update-client-name)
|
||||
(let ((client (second msg))
|
||||
|
@ -295,11 +280,10 @@
|
|||
(fit-titlebars wm data)
|
||||
(update-titlebars wm data)
|
||||
(if (eq? client (wm-current-client wm))
|
||||
(if (null? (wm-clients wm))
|
||||
(if (null? (wm-clients-stacking wm))
|
||||
(set-input-focus dpy (wm:window wm) (revert-to parent)
|
||||
current-time)
|
||||
(let ((next-client (or (last-focused-client wm data)
|
||||
(car (wm-clients wm)))))
|
||||
(let ((next-client (car (wm-clients-stacking wm))))
|
||||
(wm-select-client wm next-client current-time))))))
|
||||
|
||||
;; ***
|
||||
|
|
Loading…
Reference in New Issue