[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [STUMP] Save screen layout in registers
From: |
Philippe Brochard |
Subject: |
Re: [STUMP] Save screen layout in registers |
Date: |
Sat, 25 Mar 2006 00:02:14 +0100 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Me again,
Here is a new version of the code.
I've noticed some problems with empty frames when moving windows by
number. In fact, I got this in pull-window-by-number:
Before pulling:
DEBUG: Pull: screen frame tree=
(#S(FRAME :NUMBER 0 :X 0 :Y 0 :WIDTH 1024 :HEIGHT 768 :WINDOW #<WINDOW :0
6291546>)
#S(FRAME :NUMBER 1 :X 1024 :Y 0 :WIDTH 1024 :HEIGHT 768 :WINDOW NIL))
After pulling:
DEBUG: Pull*: screen frame tree=
(#S(FRAME :NUMBER 0 :X 0 :Y 0 :WIDTH 1024 :HEIGHT 768 :WINDOW #<WINDOW :0
6291546>)
^^^^^^^
#S(FRAME :NUMBER 1 :X 1024 :Y 0 :WIDTH 1024 :HEIGHT 768 :WINDOW #<WINDOW :0
6291546>))
The frame 0 have to be empty!
Here is what I've done as a workaround: in pull-window-by-number I've
changed
(when (eq (frame-window f) win)
(frame-raise-window screen f (first (frame-windows screen f)) nil))
with
(when (eq (frame-window f) win)
(let ((to-raise (first (frame-windows screen f))))
(if to-raise
(frame-raise-window screen f to-raise nil)
(setf (frame-window f) nil))))
And in the same way, I've changed the select-or-move-window in mouse.lisp
----------------------------------------------------------------------
;; First clic: select the window under the pointer
;; Second clic: move the selected window in frame under the pointer
(define-stumpwm-command "select-or-move-window" (screen)
(let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
(if *current-selected-window*
(progn
(focus-frame screen frame)
(pull-window-by-number screen (window-number
*current-selected-window*))
(setf *current-selected-window* nil)
(display-frame-numbers screen))
(setf *current-selected-window* (first (frame-windows screen frame)))))
nil)
----------------------------------------------------------------------
And here is the code for save/restore layout
-- save-restore.lisp -------------------------------------------------
(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*)))
(when saved
(setf (screen-frame-tree screen)
(copy-screen-frame-tree (save-screen-frame-tree saved)))
;; Absorb all windows (even new windows)
(let ((default-frame (first (screen-frames screen))))
(dolist (win (screen-mapped-windows screen))
(setf (window-frame screen win) default-frame)))
;; Restore windows by numbers in frames
(maphash (lambda (frame-number save-frame)
(let ((frame (find-frame frame-number)))
(unless (member (frame-window frame)
(screen-mapped-windows screen))
(setf (frame-window frame) nil))
(dolist (w (save-frame-window-list save-frame))
(let ((win (find-window w)))
(when win
(setf (window-frame screen win) frame))))
(when (save-frame-focus save-frame)
(let ((win (find-window (save-frame-focus save-frame))))
(when win
(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")
----------------------------------------------------------------------
Philippe
--
Philippe Brochard <address@hidden>
http://hocwp.free.fr
-=-= http://www.gnu.org/home.fr.html =-=-