emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r113227: Some fixes and improvements for desktop fra


From: Juanma Barranquero
Subject: [Emacs-diffs] trunk r113227: Some fixes and improvements for desktop frame restoration.
Date: Sun, 30 Jun 2013 05:08:30 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 113227
revision-id: address@hidden
parent: address@hidden
committer: Juanma Barranquero <address@hidden>
branch nick: trunk
timestamp: Sun 2013-06-30 07:08:23 +0200
message:
  Some fixes and improvements for desktop frame restoration.
  It is still experimental and disabled by default.
  
  * lisp/desktop.el (desktop--save-windows): Put the selected frame at
    the head of the list.
    (desktop--make-full-frame): New function.
    (desktop--restore-windows): Try to re-select the frame that was
    selected upon saving.  Do not abort if some frames fail to restore,
    just show an error message and contnue.  Set up maximized frames so
    they have default non-maximized dimensions.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/desktop.el                desktop.el-20091113204419-o5vbwnq5f7feedwu-591
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2013-06-30 02:23:10 +0000
+++ b/lisp/ChangeLog    2013-06-30 05:08:23 +0000
@@ -1,3 +1,15 @@
+2013-06-30  Juanma Barranquero  <address@hidden>
+
+       Some fixes and improvements for desktop frame restoration.
+       It is still experimental and disabled by default.
+       * desktop.el (desktop--save-windows): Put the selected frame at
+       the head of the list.
+       (desktop--make-full-frame): New function.
+       (desktop--restore-windows): Try to re-select the frame that was
+       selected upon saving.  Do not abort if some frames fail to restore,
+       just show an error message and contnue.  Set up maximized frames so
+       they have default non-maximized dimensions.
+
 2013-06-30  Dmitry Gutov  <address@hidden>
 
        * progmodes/ruby-mode.el (ruby-syntax-propertize-function): Don't

=== modified file 'lisp/desktop.el'
--- a/lisp/desktop.el   2013-06-27 09:08:14 +0000
+++ b/lisp/desktop.el   2013-06-30 05:08:23 +0000
@@ -900,7 +900,8 @@
             (mapcar (lambda (frame)
                       (cons (desktop--filter-frame-parms frame)
                             (window-state-get (frame-root-window frame) t)))
-                    (frame-list))))
+                    (cons (selected-frame)
+                          (delq (selected-frame) (frame-list))))))
   (desktop-outvar 'desktop--saved-states))
 
 ;;;###autoload
@@ -1010,28 +1011,53 @@
        (setq frames (cdr frames))))
     result))
 
+(defun desktop--make-full-frame (full display config)
+  (let ((width (and (eq full 'fullheight) (cdr (assq 'width config))))
+       (height (and (eq full 'fullwidth) (cdr (assq 'height config))))
+       (params '((visibility)))
+       frame)
+    (when width
+      (setq params (append `((user-size . t) (width . ,width)) params)))
+    (when height
+      (setq params (append `((user-size . t) (height . ,height)) params)))
+    (setq frame (make-frame-on-display display params))
+    (modify-frame-parameters frame config)
+    frame))
+
 (defun desktop--restore-windows ()
   "Restore window/frame configuration.
 Internal use only."
   (when (and desktop-save-windows desktop--saved-states)
-    (condition-case nil
-       (let ((frames (frame-list)))
-         (dolist (state desktop--saved-states)
+    (let ((frames (frame-list))
+         (selected nil))
+      (dolist (state desktop--saved-states)
+       (condition-case err
            (let* ((fconfig (car state))
                   (display (cdr (assq 'display fconfig)))
-                  (frame (desktop--find-frame-in-display frames display)))
-             (if (not frame)
-                 ;; no frames in the display -- make a new one
-                 (setq frame (make-frame-on-display display fconfig))
-               ;; found one -- reuse and remove from list
-               (setq frames (delq frame frames))
-               (modify-frame-parameters frame fconfig))
+                  (full (cdr (assq 'fullscreen fconfig)))
+                  (frame (and (not full)
+                              (desktop--find-frame-in-display frames 
display))))
+             (cond (full
+                    ;; treat fullscreen/maximized frames specially
+                    (setq frame (desktop--make-full-frame full display 
fconfig)))
+                   (frame
+                    ;; found a frame in the right display -- reuse
+                    (setq frames (delq frame frames))
+                    (modify-frame-parameters frame fconfig))
+                   (t
+                    ;; no frames in the display -- make a new one
+                    (setq frame (make-frame-on-display display fconfig))))
              ;; restore windows
-             (window-state-put (cdr state) (frame-root-window frame) 'safe)))
-         ;; delete any remaining frames
-         (mapc #'delete-frame frames))
-      (error
-       (message "Error loading window configuration from desktop file")))))
+             (window-state-put (cdr state) (frame-root-window frame) 'safe)
+             (unless selected (setq selected frame)))
+         (error
+          (message "Error restoring frame: %S" (error-message-string err)))))
+      ;; make sure the original selected frame is visible and selected
+      (unless (or (frame-parameter selected 'visibility) (daemonp))
+       (modify-frame-parameters selected '((visibility . t))))
+      (select-frame-set-input-focus selected)
+      ;; delete any remaining frames
+      (mapc #'delete-frame frames))))
 
 ;;;###autoload
 (defun desktop-read (&optional dirname)


reply via email to

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