[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[STUMP] Save screen layout in registers
From: |
Philippe Brochard |
Subject: |
[STUMP] Save screen layout in registers |
Date: |
Tue, 21 Mar 2006 22:47:14 +0100 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Hi all,
here is a first try to save screen layout in a register (hashtable).
Indeed it need's some debug time but it seems to work on my box.
I hope that'll be as useful as that's for me.
Philippe
--
Philippe Brochard <address@hidden>
http://hocwp.free.fr
-=-= http://www.gnu.org/home.fr.html =-=-
(in-package :stumpwm)
(defparameter *saved-screen* (make-hash-table :test #'equal))
(defstruct save-screen frame-tree frame-hash current-frame)
(defstruct save-frame focus window-list)
(defun copy-screen-frame-tree (tree)
(tree-accum-fn tree #'list #'copy-structure))
(defun save-screen-layout (screen name)
"Save screen layout (ie: screen frame tree, frames numbers and windows numbers
in each frames and current frame)"
(let ((saved (make-save-screen :frame-tree
(copy-screen-frame-tree (screen-frame-tree
screen))
:frame-hash (make-hash-table)
:current-frame
(frame-number (screen-current-frame screen)))))
(dolist (f (screen-frames screen))
(setf (gethash (frame-number f) (save-screen-frame-hash saved))
(make-save-frame :focus (and (frame-window f)
(window-number (frame-window f)))
:window-list nil))
(dolist (w (frame-windows screen f))
(push (window-number w)
(save-frame-window-list (gethash (frame-number f)
(save-screen-frame-hash
saved))))))
(setf (gethash name *saved-screen*) saved)))
(defun restore-screen-layout (screen name)
"Restore screen layout and focus the currennt frame in the saved screen"
(labels ((find-frame (frame-number)
(find-if (lambda (x)
(= frame-number (frame-number x)))
(screen-frames screen)))
(find-window (window-number)
(find-if (lambda (x)
(= window-number (window-number x)))
(screen-mapped-windows screen))))
(let ((saved (gethash name *saved-screen*)))
(setf (screen-frame-tree screen)
(copy-screen-frame-tree (save-screen-frame-tree saved)))
(maphash (lambda (frame-number save-frame)
(let ((frame (find-frame frame-number)))
(dolist (w (save-frame-window-list save-frame))
(setf (window-frame screen (find-window w)) frame))
(when (save-frame-focus save-frame)
(let ((win (find-window (save-frame-focus save-frame))))
(setf (frame-window frame) win)
(frame-raise-window screen frame win)))
(sync-frame-windows screen frame)))
(save-screen-frame-hash saved))
(when (save-screen-current-frame saved)
(focus-frame screen (find-frame (save-screen-current-frame saved)))))))
(define-stumpwm-command "save-layout" (screen (name :string "Save layout in: "))
(save-screen-layout screen name))
(define-stumpwm-command "restore-layout" (screen (name :string "Restore layout
from: "))
(restore-screen-layout screen name))
(define-key *root-map* (kbd "i") "restore-layout")
(define-key *root-map* (kbd "C-i") "save-layout")
- [STUMP] Save screen layout in registers,
Philippe Brochard <=