stumpwm-devel
[Top][All Lists]
Advanced

[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 =-=-




reply via email to

[Prev in Thread] Current Thread [Next in Thread]