xwem-devel
[Top] [All Lists]

Summary for xwem--main--2.1--patch-18

From: Zajcev Evgeny <lg@xxxxxxxx>
Subject: Summary for xwem--main--2.1--patch-18
Date: Tue, 8 Feb 2005 03:38:46 +0300 (MSK)
Location: lg@xxxxxxxxxxxxxx http://arch.xwem.org/2005/

Revision: xwem--main--2.1--patch-18
Archive: lg@xxxxxxxxxxxxxx
Creator: Zajcev Evgeny <lg@xxxxxxxx>
Date: Tue Feb  8 03:38:40 MSK 2005
Standard-date: 2005-02-08 00:38:40 GMT
Modified-files: dockapp/xwem-battery.el
    dockapp/xwem-pager.el dockapp/xwem-weather.el
    lisp/xwem-clients.el lisp/xwem-desktop.el
    lisp/xwem-frame.el lisp/xwem-interactive.el
    lisp/xwem-keyboard.el lisp/xwem-misc.el
    lisp/xwem-mouse.el lisp/xwem-netwm.el
    lisp/xwem-struct.el
New-patches: lg@xxxxxxxxxxxxxx/xwem--main--2.1--patch-18
Summary: bug fixes, addons
Keywords: desktop, onetime, pager, open-file

* dockapp/xwem-battery.el (xwem-batt-win-remove): [new] Function to
  remove battery dockapp.

* dockapp/xwem-pager.el (many): Mostly totally rewritten.

* dockapp/xwem-weather.el (top): [fix] Double variables removed.

* lisp/xwem-clients.el (xwem-cl-destroy): [addon] run
  `xwem-cl-destroy-hook' under protection.

* lisp/xwem-desktop.el (xwem-desktop-goals): [addon] 'frame-config goal
  removed.  xwem-open-file-commands-alist added.

* lisp/xwem-desktop.el (xwem-desktop-onetime-goals): [new] onetime goals.

* lisp/xwem-desktop.el (xwem-desktop-save-onetime): [new]

* lisp/xwem-desktop.el (xwem-desktop-load-onetime): [new]

* lisp/xwem-frame.el (xwem-frame-keep-number): [new] Custom variable.
  Non-nil mean frames keeps their numbers even when intermediate frame is
  destroyed.  NOTE: need more testing.

* lisp/xwem-frame.el (many): [addon-fixes] Support for non-nil
  `xwem-frame-keep-number'.

* lisp/xwem-interactive.el (xwem-read-frame): [addon-fix] Support for
  non-nil `xwem-frame-keep-number'.

* lisp/xwem-keyboard.el (xwem-kbd-echo-keys-timer): [bug] fixed. display
  only if there is something to display.

* lisp/xwem-keyboard.el (xwem-kbd-schedule-command-keys-echoing): Ditto.

* lisp/xwem-keyboard.el (xwem-kbd-stop-command-keys-echoing): [addon]
  clear 'keys from echo area.

* lisp/xwem-misc.el (xwem-shell-command): [typo] fix

* lisp/xwem-netwm.el (xwem-nwm-set-number-of-desktops): [addon-fix]
  Support for non-nil `xwem-frame-keep-number'.

* lisp/xwem-struct.el (xwem-frame-alive-p): [addon-fix] Ditto.

* added files

    {arch}/xwem/xwem--main/xwem--main--2.1/lg@xxxxxxxxxxxxxx/patch-log/patch-18

* modified files

--- orig/dockapp/xwem-battery.el
+++ mod/dockapp/xwem-battery.el
@@ -160,12 +160,11 @@
 
 (defun xwem-batt-win-update (xwin &optional force)
   "Update contents of XWIN to reflect current APM battery state."
-  ;; TODO: write me
   (let* ((xdpy (X-Win-dpy xwin))
-        (as (apm-battery))
-        (ac-line-p (car as))
-        (cperc (caddr as))
-        (perc-cols xwem-batt-percentage-colors)
+         (as (apm-battery))
+         (ac-line-p (car as))
+         (cperc (caddr as))
+         (perc-cols xwem-batt-percentage-colors)
          dheight)
 
     (when (> cperc 100)
@@ -220,6 +219,22 @@
       (X-Win-put-prop xwin 'old-ac-line-p ac-line-p))
     ))
 
+(defun xwem-batt-win-remove (xwin &optional need-destroy)
+  "Remove battery dockapp."
+  (delete-itimer (X-Win-get-prop xwin 'xwem-batt-timer))
+  (XFreePixmap (xwem-dpy) (X-Win-get-prop xwin 'xwem-batt-xmask))
+  (X-Win-rem-prop xwin 'xwem-batt-timer)
+  (X-Win-rem-prop xwin 'xwem-batt-xmask)
+
+  (X-Win-rem-prop xwin 'old-ac-line-p)
+  (X-Win-rem-prop xwin 'old-dheight)
+
+  ;; Remove events handler
+  (X-Win-EventHandler-rem xwin 'xwem-batt-event-handler)
+
+  (when need-destroy
+    (XDestroyWindow (xwem-dpy) xwin)))
+
 (defvar xwem-battery-keymap
   (let ((map (make-sparse-keymap)))
     (define-key map [button1] 'xwem-battery-status)
@@ -240,17 +255,10 @@
     (:X-Expose
      (xwem-batt-win-update win t))
     (:X-DestroyNotify
-     (delete-itimer (X-Win-get-prop win 'xwem-batt-timer))
-     (XFreePixmap xdpy (X-Win-get-prop win 'xwem-batt-xmask))
-     (X-Win-rem-prop win 'xwem-batt-timer)
-     (X-Win-rem-prop win 'xwem-batt-xmask)
-
-     (X-Win-rem-prop win 'old-ac-line-p)
-     (X-Win-rem-prop win 'old-dheight))
+     (xwem-batt-win-remove win))
     (:X-ButtonPress
      (let ((xwem-override-local-map xwem-battery-keymap))
-       (xwem-dispatch-command-xevent xev)))
-    ))
+       (xwem-dispatch-command-xevent xev)))))
 
 ;;;###autoload
 (defun xwem-battery (&optional dockip dockgroup dockalign)
@@ -298,8 +306,8 @@
          ["Status" xwem-battery-status]
          "---"
          (vector "Destroy"
-                 `(XDestroyWindow
-                   (xwem-dpy) ,(X-Event-win xwem-last-xevent))))))
+                 `(xwem-batt-win-remove
+                   ,(X-Event-win xwem-last-xevent) t)))))
 
 ;;;; In case there is no battery.ell
 (unless (fboundp 'apm-battery)


--- orig/dockapp/xwem-pager.el
+++ mod/dockapp/xwem-pager.el
@@ -66,96 +66,66 @@
 
 ;;; //////////////////////////////////////////////////////////////////////
 
-(defvar xwem-pager-background-active "grey30")
-(defvar xwem-pager-background-inactive "grey55")
-(defvar xwem-pager-border-shadow-active "grey55")
-(defvar xwem-pager-border-shadow-inactive "grey55")
-
 
-;;;; 2D Frames
-(defcustom xwem-2dframes-dim '(2 . 2)
-  "Dimensions for 2d frames moving.
-X*Y format."
-  :type '(cons (number :tag "X")
-              (number :tag "Y"))
-  :group 'xwem-misc)
-
-(defun xwem-2dframes-make-frames ()
-  "Make the frames, call from XWEM-AFTER-INIT-HOOK!"
-  (dotimes (it (- (* (car xwem-2dframes-dim)
-                     (cdr xwem-2dframes-dim))
-                  (length (xwem-frames-list 'desktop))))
-    (xwem-make-frame-1 'desktop :noselect t)))
-
-(define-xwem-command xwem-2dframes-move-up ()
-  "Move one viewport up."
-  (xwem-interactive)
-  (xwem-2dframes-move 'up))
-
-(define-xwem-command xwem-2dframes-move-down ()
-  "Move one viewport down."
-  (xwem-interactive)
-  (xwem-2dframes-move 'down))
-
-(define-xwem-command xwem-2dframes-move-left ()
-  "Move one viewport left."
-  (xwem-interactive)
-  (xwem-2dframes-move 'left))
-
-(define-xwem-command xwem-2dframes-move-right ()
-  "Move one viewport right."
-  (xwem-interactive)
-  (xwem-2dframes-move 'right))
-
-(defun xwem-2dframes-move (dir)
-  "Generic function to move to frame in DIR direction.
-DIR is one of `up', `down', `right' or `left'."
-  (case dir
-    (up (xwem-frame-switch-nth (- (xwem-frame-num (xwem-frame-selected))
-                                  (car xwem-2dframes-dim))))
-    (down (xwem-frame-switch-nth (+ (xwem-frame-num (xwem-frame-selected))
-                                    (car xwem-2dframes-dim))))
-    (left (xwem-frame-switch-nth (1- (xwem-frame-num (xwem-frame-selected)))))
-    (right (xwem-frame-switch-nth
-            (1+ (xwem-frame-num (xwem-frame-selected)))))))
-
-(defun xwem-2dframes-install-bindings ()
-  "Install default bindings for 2D frames commands."
-  (xwem-global-set-key [(super h)] 'xwem-2dframes-move-left)
-  (xwem-global-set-key [(super t)] 'xwem-2dframes-move-down)
-  (xwem-global-set-key [(super n)] 'xwem-2dframes-move-up)
-  (xwem-global-set-key [(super s)] 'xwem-2dframes-move-right))
-
 ;;;; Pager
 (defgroup xwem-pager nil
   "Group to customize xwem pager."
   :prefix "xwem-pager-"
   :group 'xwem-tray)
 
-(defcustom xwem-pager-dim xwem-2dframes-dim
-  "X*Y viewports."
-  :type '(cons (number :tag "X")
-               (number :tag "Y"))
+(defcustom xwem-pager-dim (cons '(2 . 2) '(4 . 4))
+  "Minimum and maximum viewports to show at X and Y."
+  :type '(cons (cons :tag "Minimum"
+                     (number :tag "X")
+                     (number :tag "Y"))
+               (cons :tag "Maximum"
+                     (number :tag "X")
+                     (number :tag "Y")))
+  :set (lambda (sym val)
+         (set sym val)
+         (when (xwem-pager-xwin)
+           (xwem-pager-redimentionize)))
+  :initialize 'custom-initialize-default
+  :group 'xwem-pager)
+
+(defcustom xwem-pager-prefer-horizontal t
+  "*Non-nil mean pager will prefer horizontal increment when redimentinizing."
+  :type 'boolean
+  :set (lambda (sym val)
+         (set sym val)
+         (when (xwem-pager-xwin)
+           (xwem-pager-redimentionize)))
+  :initialize 'custom-initialize-default
   :group 'xwem-pager)
 
-(defcustom xwem-pager-viewport-size '(16 . 8)
+(defcustom xwem-pager-viewport-size '(12 . 6)
   "\(X . Y\) where X*Y pixel will represent one viewport."
   :type '(cons (number :tag "X")
-              (number :tag "Y"))
+               (number :tag "Y"))
+  :set (lambda (sym val)
+         (set sym val)
+         (when (xwem-pager-xwin)
+           (xwem-pager-redimentionize)))
+  :initialize 'custom-initialize-default
   :group 'xwem-pager)
 
 (defcustom xwem-pager-grid-p t
   "*Set to non-nil if you want visible grid."
   :type 'boolean
+  :set (lambda (sym val)
+         (set sym val)
+         (when (xwem-pager-xwin)
+           (xwem-pager-redraw (xwem-pager-xwin) t)))
+  :initialize 'custom-initialize-default
   :group 'xwem-pager)
 
 (define-xwem-face xwem-pager-face
   `(((selected) (:foreground "grey30"))
-    ((border selected) (:foreground "grey55"))
+    ((border selected) (:foreground "grey10"))
     ((deselected) (:foreground "grey55"))
-    ((border deselected) (:foreground "grey55"))
+    ((border deselected) (:foreground "grey35"))
     ((unavailable) (:foreground "grey80"))
-    ((border unavailable) (:foreground "grey90")))
+    ((border unavailable) (:foreground "grey100")))
   "Face for pager."
   :group 'xwem-pager)
 
@@ -166,109 +136,150 @@
     map)
   "Keymap for pager operations.")
 
-;; 
+
+;; Macroses
 (defvar xwem-pager-xwin nil
   "XWIN of xwem pager.")
 
 ;; Pager xwin
-(defmacro xwem-pager-xwin ()
+(defmacro xwem-pager-xwin (&optional xwin)
   "Return pager's dockapp X window."
-  'xwem-pager-xwin)
+  `(or ,xwin xwem-pager-xwin))
 (defsetf xwem-pager-xwin () (xwin)
   `(setq xwem-pager-xwin ,xwin))
-
 ;; Pager pixmap
 (defmacro xwem-pager-xpix (&optional xwin)
   "Return pager's dockapp X window."
-  `(X-Win-get-prop (or ,xwin (xwem-pager-xwin)) 'xwem-pager-xpixmap))
+  `(X-Win-get-prop (xwem-pager-xwin ,xwin) 'xwem-pager-xpixmap))
 (defsetf xwem-pager-xpix (&optional xwin) (pix)
-  `(X-Win-put-prop (or ,xwin (xwem-pager-xwin)) 'xwem-pager-xpixmap ,pix))
-
-;; Pager layout is a list of three element
-;; (DIM-X DIM-Y (VIEWPORT-X-SIZE . VIEWPORT-Y-SIZE))
-(defmacro xwem-pager-layout (&optional xwin)
-  `(X-Win-get-prop (or ,xwin (xwem-pager-xwin)) 'xwem-pager-layout))
-(defsetf xwem-pager-layout (&optional xwin) (nl)
-  `(X-Win-put-prop (or ,xwin (xwem-pager-xwin)) 'xwem-pager-layout ,nl))
-
-(defmacro xwem-pager-dim-x ()
-  `(car xwem-pager-dim))
-(defmacro xwem-pager-dim-y ()
-  `(cdr xwem-pager-dim))
+  `(X-Win-put-prop (xwem-pager-xwin ,xwin) 'xwem-pager-xpixmap ,pix))
+;; Pager dimentions (X . Y
+(defmacro xwem-pager-dim (&optional xwin)
+  `(X-Win-get-prop (xwem-pager-xwin ,xwin) 'xwem-pager-dim))
+(defsetf xwem-pager-dim (&optional xwin) (dim)
+  `(X-Win-put-prop (xwem-pager-xwin ,xwin) 'xwem-pager-dim ,dim))
 
 
-(defun xwem-pager-frame-position (frame-num)
-  "Return FRAME position in frame."
-  (multiple-value-bind (dx dy vx vy)
-      (values-list (xwem-pager-layout))
-    (setq dy dy)
-    (let* ((col (% frame-num dx))
-          (row (/ frame-num dx)))
-      (list (* col vx) (* row vy) vx vy))))
-
-(defun xwem-pager-frame-at (xwin x y)
-  "Return frame that is under X Y position in XWIN pager."
-  (multiple-value-bind (dx dy vx vy)
-      (values-list (xwem-pager-layout xwin))
-    (let* ((col (/ x vx))
-          (row (/ y vy))
-          (num (+ (* row dx) col))
-          (frames (xwem-frames-list 'desktop)))
-      (xwem-message 'debug "here: dx/dy/vx/vy=%d/%d/%d/%d x/y=%d/%d col:%d, 
row:%d, num:%d"
-                   dx dy vx vy x y col row num)
-      (when (< num (length frames))
-       (nth num frames)))))
+;; Functions
+(define-xwem-deffered xwem-pager-redraw-for-frame (frame-num &optional xwin)
+  "Redraw FRAME."
+  (when (< frame-num (apply '* (xwem-pager-dim xwin)))
+    ;; FRAME shows in pager
+    (let* ((frame (nth frame-num xwem-frames-list))
+           (dim (xwem-pager-dim xwin))
+           (tags (cond ((not (xwem-frame-alive-p frame))
+                        '(unavailable))
+                       ((xwem-frame-selected-p frame)
+                        '(selected))
+                       (t '(deselected))))
+           (gc (xwem-face-get-gc 'xwem-pager-face tags))
+           (col (% frame-num (car dim)))
+           (row (/ frame-num (car dim))))
+      (XFillRectangle (xwem-dpy) (xwem-pager-xpix xwin) gc
+                      (* col (car xwem-pager-viewport-size))
+                      (* row (cdr xwem-pager-viewport-size))
+                      (car xwem-pager-viewport-size)
+                      (cdr xwem-pager-viewport-size))
+      (when xwem-pager-grid-p
+        (XDrawRectangle (xwem-dpy) (xwem-pager-xpix xwin)
+                        (xwem-face-get-gc 'xwem-pager-face `(border ,@tags))
+                        (* col (car xwem-pager-viewport-size))
+                        (* row (cdr xwem-pager-viewport-size))
+                        (1- (car xwem-pager-viewport-size))
+                        (1- (cdr xwem-pager-viewport-size))))
+      (xwem-pager-redraw (xwem-pager-xwin xwin)))))
 
 (define-xwem-deffered xwem-pager-redraw (xwin &optional full)
   "Redraw pager XWIN."
   (let* ((geom (XGetGeometry (xwem-dpy) (xwem-pager-xpix xwin)))
-        (w (X-Geom-width geom))
-        (h (X-Geom-height geom)))
+         (w (X-Geom-width geom))
+         (h (X-Geom-height geom)))
     (if (not full)
-       (XCopyArea (xwem-dpy) (xwem-pager-xpix xwin) xwin
-                  (XDefaultGC (xwem-dpy)) 0 0 w h 0 0)
+        (XCopyArea (xwem-dpy) (xwem-pager-xpix xwin) xwin
+                   (XDefaultGC (xwem-dpy)) 0 0 w h 0 0)
 
       (XFillRectangle (xwem-dpy) (xwem-pager-xpix xwin)
-                     (XDefaultGC (xwem-dpy))
-                     0 0 w h)
-      ;; TODO: Draw the grid
-      (multiple-value-bind (dx dy vx vy)
-         (values-list (xwem-pager-layout xwin))
-       (setq vx vx vy vy)              ; shutup compiler
-       (dotimes (i (* dx dy))
-         (xwem-pager-redraw-for-frame i))))))
+                      (XDefaultGC (xwem-dpy))
+                      0 0 w h)
+      (loop for fnum from 0 to (apply '* (xwem-pager-dim xwin))
+        do (xwem-pager-redraw-for-frame-1 fnum xwin)))))
+
+(defun xwem-pager-redimentionize (&optional non-used-argument xwin)
+  "Check is pager need redimentionisation."
+  (let ((frames (length xwem-frames-list))
+        (min-ddim (list (car (cdr xwem-pager-dim))
+                        (cdr (cdr xwem-pager-dim)))))
+    ;; Calculate new dimention
+    (mapc (lambda (ddim)
+            (let ((dval (- (apply '* ddim) frames))
+                  (mval (- (apply '* min-ddim) frames)))
+              ;; Change min-ddim only if:
+              ;;  - DVAL is positive or zero and MVAL is negative
+              ;;  - DVAL and MVAL of same sign and DVAL abs is lesser
+              ;;  - DVAL and MVAL of same sign and DVAL is equal to MVAL, but
+              ;;    DVAL's X and Y components differs lesser.
+              (when (or (and (>= dval 0) (< mval 0))
+                        (and (or (zerop dval)
+                                 (= (signum dval) (signum mval)))
+                             (or (< (abs dval) (abs mval))
+                                 (and (= (abs dval) (abs mval))
+                                      (< (abs (- (car ddim) (cadr ddim)))
+                                         (abs (- (car min-ddim)
+                                                 (cadr min-ddim)))))
+                                 (and xwem-pager-prefer-horizontal
+                                      (= (abs dval) (abs mval))
+                                      (= (abs (- (car ddim) (cadr ddim)))
+                                         (abs (- (car min-ddim)
+                                                 (cadr min-ddim))))
+                                      (> (car ddim) (car min-ddim))))))
+                (setq min-ddim ddim))))
+          ;; Create a list of all possible dimentions
+          (loop for i from (car (car xwem-pager-dim))
+            to (car (cdr xwem-pager-dim))
+            nconc (loop for j from (cdr (car xwem-pager-dim))
+                    to (cdr (cdr xwem-pager-dim))
+                    collect (list i j))))
+
+    (setf (xwem-pager-dim xwin) min-ddim)
+    (let ((w (* (car min-ddim) (car xwem-pager-viewport-size)))
+          (h (* (cadr min-ddim) (cdr xwem-pager-viewport-size))))
+      (XResizeWindow (xwem-dpy) (xwem-pager-xwin xwin) w h)
+      ;; Recreate pixmap (if necessary)
+      (when (xwem-pager-xpix xwin)
+        (XFreePixmap (xwem-dpy) (xwem-pager-xpix xwin)))
+      (setf (xwem-pager-xpix xwin)
+            (XCreatePixmap (xwem-dpy)
+                           (make-X-Pixmap :id (X-Dpy-get-id (xwem-dpy)))
+                           (xwem-pager-xwin xwin)
+                           (XDefaultDepth (xwem-dpy))
+                           w h)))
+    (xwem-pager-redraw (xwem-pager-xwin xwin) t)))
+
+(defun xwem-pager-frame-redraw (&optional frame)
+  "Update xwem pager dockapp, because FRAME just selected/deselected."
+  (unless frame (setq frame (xwem-frame-selected)))
+  (xwem-pager-redraw-for-frame (xwem-frame-num frame)))
 
-(define-xwem-deffered xwem-pager-redraw-for-frame (frame-num)
-  "Redraw FRAME."
-  (multiple-value-bind (dx dy vx vy)
-      (values-list (xwem-pager-layout))
-    (when (< frame-num (* dx dy))
-      (let* ((frames (xwem-frames-list 'desktop))
-            (frame (and (< frame-num (length frames))
-                        (nth frame-num frames)))
-            (tags (cond ((not (xwem-frame-alive-p frame))
-                         '(unavailable))
-                        ((xwem-frame-selected-p frame)
-                         '(selected))
-                        (t '(deselected))))
-            (gc (xwem-face-get-gc 'xwem-pager-face tags))
-            (col (% frame-num dx))
-            (row (/ frame-num dx)))
-       (XFillRectangle (xwem-dpy) (xwem-pager-xpix)
-                       gc (* col vx) (* row vy) vx vy)
-       (xwem-pager-redraw (xwem-pager-xwin))))))
-
-(defun xwem-pager-remove (xwin)
+(defun xwem-pager-remove (xwin &optional need-destroy)
   "Destroy pager's XWIN."
   (XFreePixmap (xwem-dpy) (xwem-pager-xpix xwin))
   (setf (xwem-pager-xpix xwin) nil)
 
+  ;; Remove pager events handler
+  (X-Win-EventHandler-rem xwin 'xwem-pager-event-handler)
+
+  ;; Destroy pager xwin if needed
+  (when need-destroy
+    (XDestroyWindow (xwem-dpy) xwin))
+
+  ;; Unset default pager xwin
   (when (eq (xwem-pager-xwin) xwin)
     (setf (xwem-pager-xwin) nil))
 
-  (remove-hook 'xwem-frame-select-hook 'xwem-pager-frame-select-hook)
-  (remove-hook 'xwem-frame-deselect-hook 'xwem-pager-frame-deselect-hook)
-  (remove-hook 'xwem-frame-destroy-hook 'xwem-pager-frame-destroy-hook))
+  (remove-hook 'xwem-frame-select-hook 'xwem-pager-frame-redraw)
+  (remove-hook 'xwem-frame-deselect-hook 'xwem-pager-frame-redraw)
+  (remove-hook 'xwem-frame-creation-hook 'xwem-pager-redimentionize)
+  (remove-hook 'xwem-frame-destroy-hook 'xwem-pager-redimentionize))
 
 (defun xwem-pager-event-handler (xdpy xwin xev)
   "X Events handler for xwem pager dockapp."
@@ -281,86 +292,64 @@
      (let ((xwem-override-local-map xwem-pager-keymap))
        (xwem-dispatch-command-xevent xev)))))
 
-(defun xwem-pager-frame-select-hook (&optional frame)
-  "Update xwem pager dockapp, because FRAME just selected."
-  (unless frame
-    (setq frame (xwem-frame-selected)))
-  (when (xwem-frame-desktop-p frame)
-    (xwem-pager-redraw-for-frame (xwem-frame-num frame))))
-
-(defun xwem-pager-frame-deselect-hook (&optional frame)
-  "Update xwem pager dockapp, because FRAME just deselected."
-  (unless frame
-    (setq frame (xwem-frame-selected)))
-;  (when (xwem-frame-desktop-p frame)
-;    (xwem-pager-redraw-for-frame (xwem-frame-num frame))))
-  )
-(defun xwem-pager-frame-destroy-hook (frame)
-  "Update xwem pager dockapp, because FRAME just destroyed."
-  (when (xwem-frame-desktop-p frame)
-    (xwem-pager-redraw-for-frame (xwem-frame-num frame))))
-  
+;;;###autoload
 (defun xwem-pager (&optional dockid dockgroup dockalign)
   "Start xwem pager dockapp.
 DOCKID, DOCKGROUP and DOCKALIGN specifies pager placement in xwem
 tray."
-  (let* ((w (* (car xwem-pager-dim)
-              (car xwem-pager-viewport-size)))
-        (h (* (cdr xwem-pager-dim)
-              (cdr xwem-pager-viewport-size)))
-        (pwin
-         (XCreateWindow
-          (xwem-dpy) nil 0 0 w h 0
-          nil nil nil
-          (make-X-Attr :background-pixel (XBlackPixel (xwem-dpy))
-                       :backing-store X-WhenMapped
-                       :override-redirect t)))
-        (ppix
-         (XCreatePixmap
-          (xwem-dpy)
-          (make-X-Pixmap :id (X-Dpy-get-id (xwem-dpy)))
-          pwin (XDefaultDepth (xwem-dpy))
-          w h)))
-
-    ;; Set pager layout and pixmap
-    (setf (xwem-pager-layout pwin)
-         (list (car xwem-pager-dim) (cdr xwem-pager-dim)
-               (car xwem-pager-viewport-size) (cdr xwem-pager-viewport-size)))
-    (setf (xwem-pager-xpix pwin) ppix)
+  (interactive)
+  (let* ((pwin
+          (XCreateWindow
+           (xwem-dpy) nil 0 0 1 1 0
+           nil nil nil
+           (make-X-Attr :background-pixel
+                        (X-Gc-foreground
+                         (xwem-face-get-gc 'xwem-pager-face '(deselected)))
+                        :backing-store X-WhenMapped
+                        :override-redirect t))))
+    ;; Set default pager window
+    (unless (X-Win-p (xwem-pager-xwin))
+      (setf (xwem-pager-xwin) pwin))
+
+    ;; Initialize sizes and stuff
+    (xwem-pager-redimentionize nil pwin)
 
     (XSelectInput (xwem-dpy) pwin
                   (Xmask-or XM-Exposure XM-StructureNotify
                             XM-ButtonPress XM-ButtonRelease))
     (X-Win-EventHandler-add pwin 'xwem-pager-event-handler nil
                             (list X-Expose X-DestroyNotify
-                                 X-ButtonPress X-ButtonRelease))
-
-    ;; Draw the pixmap
-    (xwem-pager-redraw pwin t)
+                                  X-ButtonPress X-ButtonRelease))
 
     ;; Initialize wd in sys tray
-    (xwem-XTrayInit (xwem-dpy) pwin
-                    dockid dockgroup dockalign)
+    (xwem-XTrayInit (xwem-dpy) pwin dockid dockgroup dockalign)
 
-    (add-hook 'xwem-frame-select-hook 'xwem-pager-frame-select-hook)
-    (add-hook 'xwem-frame-deselect-hook 'xwem-pager-frame-deselect-hook)
-    (add-hook 'xwem-frame-destroy-hook 'xwem-pager-frame-destroy-hook)
+    (add-hook 'xwem-frame-select-hook 'xwem-pager-frame-redraw)
+    (add-hook 'xwem-frame-deselect-hook 'xwem-pager-frame-redraw)
+    (add-hook 'xwem-frame-creation-hook 'xwem-pager-redimentionize)
+    (add-hook 'xwem-frame-destroy-hook 'xwem-pager-redimentionize)
 
-    ;; Set default pager window
-    (unless (X-Win-p (xwem-pager-xwin))
-      (setf (xwem-pager-xwin) pwin))
     pwin))
 
+(defun xwem-pager-frame-at (xwin x y)
+  "Return frame that is under X Y position in XWIN pager."
+  (let* ((dim (xwem-pager-dim xwin))
+         (col (/ x (car xwem-pager-viewport-size)))
+         (row (/ y (cdr xwem-pager-viewport-size)))
+         (num (+ (* row (car dim)) col)))
+    (nth num xwem-frames-list)))
+
+;; Commands
 (define-xwem-command xwem-pager-iswitch (ev)
   "Switch to frame."
   (xwem-interactive (list xwem-last-event))
   (unless (button-event-p ev)
     (error 'xwem-error
-          "`xwem-pager-iswitch-frame' must be bound to mouse event"))
+           "`xwem-pager-iswitch-frame' must be bound to mouse event"))
   (let ((frame (xwem-pager-frame-at
-               (X-Event-win xwem-last-xevent)
-               (X-Event-xbutton-event-x xwem-last-xevent)
-               (X-Event-xbutton-event-y xwem-last-xevent))))
+                (X-Event-win xwem-last-xevent)
+                (X-Event-xbutton-event-x xwem-last-xevent)
+                (X-Event-xbutton-event-y xwem-last-xevent))))
     (when (xwem-frame-p frame)
       (xwem-select-frame frame))))
 
@@ -369,11 +358,67 @@
   (xwem-interactive (list xwem-last-event))
   (unless (button-event-p ev)
     (error 'xwem-error
-          "`xwem-pager-popup-menu' must be bound to mouse event"))
+           "`xwem-pager-popup-menu' must be bound to mouse event"))
   (xwem-popup-menu
    (list "Pager"
-        "---"
-        (vector "Destroy" `(XDestroyWindow (xwem-dpy) (X-Event-win 
,xwem-last-xevent))))))
+         "---"
+         (vector "Destroy"
+                 `(xwem-pager-remove ,(X-Event-win xwem-last-xevent) t)))))
+
+
+;;;; 2D Frames
+;;;###autoload
+(defun xwem-pager-make-frames ()
+  "Make the frames, call from XWEM-AFTER-INIT-HOOK!"
+  (dotimes (it (- (* (car (cdr xwem-pager-dim))
+                     (cdr (cdr xwem-pager-dim)))
+                  (length (xwem-frames-list 'desktop))))
+    (xwem-make-frame-1 'desktop :noselect t)))
+
+;;;###autoload(autoload 'xwem-pager-move-up "xwem-pager" nil t)
+(define-xwem-command xwem-pager-move-up (&optional arg)
+  "Move one viewport up."
+  (xwem-interactive "p")
+  (xwem-pager-move 'up arg))
+
+;;;###autoload(autoload 'xwem-pager-move-down "xwem-pager" nil t)
+(define-xwem-command xwem-pager-move-down (&optional arg)
+  "Move one viewport down."
+  (xwem-interactive "p")
+  (xwem-pager-move 'down arg))
+
+;;;###autoload(autoload 'xwem-pager-move-left "xwem-pager" nil t)
+(define-xwem-command xwem-pager-move-left (&optional arg)
+  "Move one viewport left."
+  (xwem-interactive "p")
+  (xwem-pager-move 'left arg))
+
+;;;###autoload(autoload 'xwem-pager-move-right "xwem-pager" nil t)
+(define-xwem-command xwem-pager-move-right (&optional arg)
+  "Move one viewport right."
+  (xwem-interactive "p")
+  (xwem-pager-move 'right arg))
+
+(defun xwem-pager-move (dir &optional arg)
+  "Generic function to move to frame in DIR direction.
+DIR is one of `up', `down', `right' or `left'."
+  (unless arg (setq arg 1))
+  (xwem-frame-switch-nth
+   (case dir
+    (up (- (xwem-frame-num (xwem-frame-selected))
+           (* arg (car (xwem-pager-dim)))))
+    (down (+ (xwem-frame-num (xwem-frame-selected))
+             (* arg (car (xwem-pager-dim)))))
+    (left (- (xwem-frame-num (xwem-frame-selected)) arg))
+    (right (+ (xwem-frame-num (xwem-frame-selected)) arg)))))
+
+;;;###autoload
+(defun xwem-pager-install-bindings ()
+  "Install default bindings for 2D frames commands."
+  (xwem-global-set-key [(super h)] 'xwem-pager-move-left)
+  (xwem-global-set-key [(super t)] 'xwem-pager-move-down)
+  (xwem-global-set-key [(super n)] 'xwem-pager-move-up)
+  (xwem-global-set-key [(super s)] 'xwem-pager-move-right))
 
 
 (provide 'xwem-pager)


--- orig/dockapp/xwem-weather.el
+++ mod/dockapp/xwem-weather.el
@@ -45,6 +45,7 @@
 (require 'xwem-osd)
 (require 'xwem-interactive)
 (require 'xwem-help)
+(require 'xwem-compat)
 
 (defgroup xwem-weather nil
   "XWEM Weather options."
@@ -109,25 +110,6 @@
 Bindings:
 \\{xwem-weather-keymap}")
 
-(defvar xwem-weather-menu
-  '("Weather"
-    ["Show details" xwem-weather-show-details]
-    ["Update" xwem-weather-update]
-    "---"
-    ["Destroy" xwem-weather-remove])
-  "Menu to popup on `xwem-weather-popup-menu' command.")
-
-;;;###autoload(autoload 'xwem-weather-prefix "xwem-weather" nil nil 'keymap)
-(xwem-define-prefix-command 'xwem-weather-prefix t)
-(defvar xwem-weather-keymap
-  (let ((map (make-sparse-keymap)))
-    (define-key map ?d 'xwem-weather-show-details)
-    (define-key map ?u 'xwem-weather-update)
-    map)
-  "Keymap for weather commands.
-Bindings:
-\\{xwem-weather-keymap}")
-
 ;;; Internal variables
 
 (defvar xwem-weather-osd nil)


--- orig/lisp/xwem-clients.el
+++ mod/lisp/xwem-clients.el
@@ -1207,10 +1207,11 @@
   (setf (xwem-cl-state cl) 'destroyed)
 
   (xwem-method-on-kill cl)
-  (run-hook-with-args 'xwem-cl-destroy-hook cl)
+  (xwem-unwind-protect
+      (run-hook-with-args 'xwem-cl-destroy-hook cl)
 
-  (xwem-select-some-client)
-  (xwem-deffered-funcall 'xwem-unmake-client cl))
+    (xwem-select-some-client)
+    (xwem-deffered-funcall 'xwem-unmake-client cl)))
 
 ;;;###xwem-autoload
 (defun xwem-cl-apply-plist (cl nplist)


--- orig/lisp/xwem-desktop.el
+++ mod/lisp/xwem-desktop.el
@@ -52,11 +52,11 @@
   :group 'xwem)
 
 (defcustom xwem-desktop-goals
-  '(frames-config
-    (keymap . xwem-user-macros-prefix)
+  '((keymap . xwem-user-macros-prefix)
     (xwem-read-filename-history . 100)
     (xwem-launcher-history . 100)
-    (xwem-read-expression-history . 100))
+    (xwem-read-expression-history . 100)
+    (xwem-open-file-commands-alist . 1024))
   "*List of variables to save.
 Each element is eather symbol or cons cell in form.
 \(symbol . maxsize\)."
@@ -74,6 +74,15 @@
                         (number :tag "Max Size"))))
   :group 'xwem-desktop)
 
+(defcustom xwem-desktop-onetime-goals
+  '((frames-config . "frames-config"))
+  "One time goals to save."
+  :type '(repeat (choice (const :tag "Frames config" frames-config)
+                         (cons :tag "Variable"
+                               (symbol :tag "Custom Symbol")
+                               (number :tag "Max Size"))))
+  :group 'xwem-desktop)
+
 ;;; Internal variables
 
 (defun xwem-desktop-save-element (el &optional buffer)
@@ -160,6 +169,27 @@
 
   (load-file file))
 
+;;;###autoload(autoload 'xwem-desktop-save-onetime "xwem-desktop" nil t)
+(define-xwem-command xwem-desktop-save-onetime ()
+  "Save onetime goals if necessary."
+  (xwem-interactive)
+  (mapc (lambda (gg)
+          (let ((file (expand-file-name (cdr gg) xwem-dir)))
+            (unless (file-exists-p file)
+              (let ((xwem-desktop-goals (list (car gg))))
+                (xwem-desktop-save file)))))
+        xwem-desktop-onetime-goals))
+
+;;;###autoload(autoload 'xwem-desktop-load-onetime "xwem-desktop" nil t)
+(define-xwem-command xwem-desktop-load-onetime ()
+  "Load onetime goals."
+  (xwem-interactive)
+  (mapc (lambda (gg)
+          (let ((file (expand-file-name (cdr gg) xwem-dir)))
+            (when (file-exists-p file)
+              (load-file file))))
+        xwem-desktop-onetime-goals))
+
 
 (provide 'xwem-desktop)
 


--- orig/lisp/xwem-frame.el
+++ mod/lisp/xwem-frame.el
@@ -191,6 +191,11 @@
   :type 'boolean
   :group 'xwem-frame)
 
+(defcustom xwem-frame-keep-number nil
+  "*Non-nil mean frames keeps their numbers when intermediate frame destroyed."
+  :type 'boolean
+  :group 'xwem-frame)
+
 ;; Hooks
 (defcustom xwem-frame-select-hook nil
   "*Hooks to call when new frame just selected."
@@ -264,12 +269,13 @@
 ;;;###xwem-autoload
 (defun xwem-frames-list (&optional type)
   "Return list of xwem frames of TYPE.
-Default TYPE is 'desktop."
-  (unless type
-    (setq type 'desktop))
+If TYPE is ommited - list of frames of any type is returned."
   (remove* nil xwem-frames-list
            :test (lambda (f1 f2)
-                   (not (eq (xwem-frame-type f2) type)))))
+                   (not (and (xwem-frame-p f2)
+                             (not (eq (xwem-frame-state f2) 'destroyed))
+                             (or (null type)
+                                 (eq (xwem-frame-type f2) type)))))))
 
 ;;; Frame macros
 (defmacro xwem-frame-link-insert-after (frame1 frame2)
@@ -521,9 +527,15 @@
     ;; Setup rootwin's geometry
     (xwem-frame-setup-root-win frame)
 
-    ;; Add to the end of frames list
-    (setq xwem-frames-list
-          (append xwem-frames-list (list frame)))
+    ;; Find an empty place in xwem-frames-list or add to the end of
+    ;; frames list.
+    (let ((allframes xwem-frames-list))
+      (while (and allframes (xwem-frame-p (car allframes)))
+        (setq allframes (cdr allframes)))
+      (if allframes
+          (setcar allframes frame)
+        (setq xwem-frames-list
+              (append xwem-frames-list (list frame)))))
 
     ;; Handle as client, i.e. make frame to be embedded
     (when (xwem-frame-embedded-p frame)
@@ -649,7 +661,7 @@
 ;;;###xwem-autoload
 (defun xwem-frames-fini ()
   "Finialize frames."
-  (mapc 'xwem-frame-destroy xwem-frames-list))
+  (mapc 'xwem-frame-destroy (xwem-frames-list)))
 
 ;;;###autoload(autoload 'xwem-make-frame "xwem-frame" "" t)
 (define-xwem-command xwem-make-frame (type &optional arg)
@@ -670,7 +682,7 @@
 
 (defun xwem-frame-find (how arg)
   "Find frame by ARG. HOW is search type, one of 'xwin 'win 'cl or 'name."
-  (let ((flist xwem-frames-list)
+  (let ((flist (xwem-frames-list))
         (rf nil))
 
     (while flist
@@ -727,7 +739,7 @@
     (setq type 'any))
 
   ;; First try linkaged frames
-  (let ((allframes xwem-frames-list)
+  (let ((allframes (xwem-frames-list))
         (oframe (xwem-frame-link-next frame)))
     (unless (xwem-frame-mapped-p oframe)
       (setq oframe (xwem-frame-link-prev frame)))
@@ -753,17 +765,8 @@
 ;;;###xwem-autoload
 (defun xwem-frame-num (frame)
   "Return FRAME index in `xwem-frames-list'."
-  (unless (xwem-frame-p frame)
-    (error 'xwem-error "Invalid frame" frame))
-
-  (let ((fl (xwem-frames-list))
-        (num 0))
-    (while fl
-      (if (eq frame (car fl))
-          (setq fl nil)
-        (setq num (+ 1 num))
-        (setq fl (cdr fl))))
-  num))
+  (- (length xwem-frames-list)
+     (length (memq frame xwem-frames-list))))
 
 (defun xwem-frame-xy-in-p (x y frame)
   "Return non-nil if point at X Y is in FRAME."
@@ -774,7 +777,7 @@
 
 (defun xwem-frame-at (x y)
   "Return frame which contain point at X Y."
-  (let ((fl xwem-frames-list))
+  (let ((fl (xwem-frames-list)))
     (while (and fl (not (xwem-frame-xy-in-p x y (car fl))))
       (setq fl (cdr fl)))
     (car fl)))
@@ -847,7 +850,8 @@
     (xwem-frame-link-remove frame)
 
     ;; Now Remove FRAME from frame list
-    (setq xwem-frames-list (delq frame xwem-frames-list))
+    (unless xwem-frame-keep-number
+      (setq xwem-frames-list (delq frame xwem-frames-list)))
 
     ;; If frame is not selected it mean that it was embedded
     (if (and select-other (xwem-frame-p oframe) (not (eq oframe frame)))
@@ -875,29 +879,27 @@
            (XReparentWindow (xwem-dpy) (xwem-cl-xwin fcl) (xwem-rootwin)
                             (X-Geom-width (xwem-rootgeom))
                             (X-Geom-height (xwem-rootgeom)))
-           (xwem-withdraw fcl)
-;           (setf (xwem-cl-win cl) nil)
-;           (xwem-client-change-state cl 'iconified)
-           )
+           (xwem-withdraw fcl))
          (xwem-frame-clients frame))
 
     ;; Destroy any X wins
-    (unless (eq (xwem-frame-state frame) 'destroed)
+    (unless (eq (xwem-frame-state frame) 'destroyed)
       (XDestroySubwindows (xwem-dpy) (xwem-frame-xwin frame))
-      (XDestroyWindow (xwem-dpy) (xwem-frame-xwin frame)))
+      (XDestroyWindow (xwem-dpy) (xwem-frame-xwin frame))
+      (setf (xwem-frame-state frame) 'destroyed))
 
+    ;; If we are embedded frame than emulate our destroing
     (when (xwem-cl-p embed-cl)
-      ;; If we are embedded frame than emulate our destroing
       (xwem-cl-destroy embed-cl))
 
-    ;; Remove frame and select other
+    ;; Remove frame from frames list and select another frame
     (xwem-frame-remove frame t)
 
-    ;; Now run on-destroy hooks
-    (run-hook-with-args 'xwem-frame-destroy-hook frame)
-
-    ;; Mark FRAME as non valid for referencing.
-    (X-invalidate-cl-struct frame)))
+    (xwem-unwind-protect
+        ;; Now run on-destroy hooks
+        (run-hook-with-args 'xwem-frame-destroy-hook frame)
+      ;; Mark FRAME as non valid for referencing.
+      (X-invalidate-cl-struct frame))))
     
 (defun xwem-frame-hconfigure (frame xev)
   "FRAME just received ConfigureNotify event XEV."
@@ -949,7 +951,7 @@
          (xwem-frame-hkeybutton frame xev))
 
         (:X-DestroyNotify
-        (setf (xwem-frame-state frame) 'destroed)
+        (setf (xwem-frame-state frame) 'destroyed)
         (xwem-frame-total-remove frame))
 
         (:X-ClientMessage (xwem-frame-hclient frame xev))
@@ -1005,7 +1007,7 @@
                                    '(initially-unmapped t))
                                  (xwem-frame-properties frame))
                    :winconfig (xwem-window-configuration frame)))
-                xwem-frames-list)))
+                (xwem-frames-list))))
 
 ;;;###xwem-autoload
 (defun xwem-set-frame-configuration (frame-config &optional no-delete)
@@ -1032,7 +1034,7 @@
                      (xwem-frame-saved-winconfig sframe)))
 
                 (setq frames-to-delete (cons frame frames-to-delete)))))
-          xwem-frames-list)
+          (xwem-frames-list))
 
     (if no-delete
         (mapc 'xwem-frame-hide frames-to-delete)
@@ -1136,11 +1138,11 @@
   "Switch to ARG next frame."
   (xwem-interactive "p")
 
-  (let ((frame (nth arg (memq (xwem-frame-selected) xwem-frames-list))))
+  (let ((frame (nth arg (memq (xwem-frame-selected) (xwem-frames-list)))))
     (when (and xwem-frame-rolling-switch
                (not (xwem-frame-p frame)))
       ;; Assume first frame if there no next
-      (setq frame (car xwem-frames-list)))
+      (setq frame (car (xwem-frames-list))))
 
     (unless (xwem-frame-p frame)
       (error 'xwem-error "Invalid frame"))
@@ -1154,11 +1156,11 @@
   (xwem-interactive "p")
 
   (let ((frame (nth arg (memq (xwem-frame-selected)
-                              (reverse xwem-frames-list)))))
+                              (reverse (xwem-frames-list))))))
     (when (and xwem-frame-rolling-switch
                (not (xwem-frame-p frame)))
       ;; Assume last frame if there no previous
-      (setq frame (car (last xwem-frames-list))))
+      (setq frame (car (last (xwem-frames-list)))))
 
     (unless (xwem-frame-p frame)
       (error 'xwem-error "Invalid frame"))
@@ -1427,9 +1429,7 @@
 (define-xwem-command xwem-frame-showroot ()
   "Show root window, i.e. unmap all xwem frames."
   (xwem-interactive)
-
-  (mapc 'xwem-frame-unmap xwem-frames-list)
-
+  (mapc 'xwem-frame-unmap (xwem-frames-list))
   (xwem-select-client nil))
 
 ;;;###autoload(autoload 'xwem-frame-hide "xwem-frame" "" t)


--- orig/lisp/xwem-interactive.el
+++ mod/lisp/xwem-interactive.el
@@ -211,7 +211,7 @@
   "Read for frame prompting PROMPT and return xwem frame.
 FRAMES is a list of frames to select from, default is `xwem-frames-list'."
   (unless frames
-    (setq frames xwem-frames-list))
+    (setq frames (xwem-frames-list)))
 
   (with-xwem-read-from-minibuffer
    (let* ((frms (mapcar (lambda (frm)


--- orig/lisp/xwem-keyboard.el
+++ mod/lisp/xwem-keyboard.el
@@ -958,7 +958,8 @@
 
 (defun xwem-kbd-echo-keys-timer (&rest not-used)
   "Timer to call when there a need to show command keys."
-  (xwem-kbd-echo-command-keys)
+  (when (> (length xwem-kbd-scheduled-keys) 0)
+    (xwem-kbd-echo-command-keys))
   (setq xwem-kbd-scheduled-timer nil))
 
 ;;;###xwem-autoload
@@ -984,16 +985,16 @@
 ;;;###xwem-autoload
 (defun xwem-kbd-stop-command-keys-echoing ()
   "Stop echoing."
-  (setq xwem-kbd-scheduled-keys [])
-  (setq xwem-kbd-echoing-keys nil)
-
-  (xwem-deffered-funcall
-   (lambda ()
-     (when xwem-kbd-scheduled-timer
-       (disable-timeout xwem-kbd-scheduled-timer)
-       (setq xwem-kbd-scheduled-timer nil))))
+  (when xwem-kbd-scheduled-timer
+    (disable-timeout xwem-kbd-scheduled-timer)
+    (setq xwem-kbd-scheduled-timer nil))
+  
+  (unless xwem-kbd-echoing-keys
+    (xwem-clear-message 'keys))
+  (xwem-clear-message 'keys-continuator)
 
-  (xwem-clear-message 'keys-continuator))
+  (setq xwem-kbd-scheduled-keys []
+        xwem-kbd-echoing-keys nil))
 
 ;;;###xwem-autoload
 (defun xwem-kbd-fixup-keymap (keymap)


--- orig/lisp/xwem-misc.el
+++ mod/lisp/xwem-misc.el
@@ -957,26 +957,27 @@
 
   ;; Create temporary buffer for shell command output
   (let ((tbuf (get-buffer-create (generate-new-buffer-name " *temp-buf*")))
-        dontkill)
+        (dontkill nil)
+        status)
     (unwind-protect
         (with-current-buffer tbuf
-          (call-process shell-file-name nil tbuf nil
-                        shell-command-switch command)
-
-          (if arg
-              (xwem-kbd-add-pending-keys
-               (buffer-substring
-                (point-min) (- (point-max)
-                               (if (> (prefix-numeric-value arg) 4) 1 0))))
-
-            (if (= 1 (count-lines (point-min) (point-max)))
-                (xwem-message 'info (buffer-substring (point-min) (point-max)))
-
-              (xwem-special-popup-frame tbuf)
-              (setq dontkill t))))
+          (setq status (call-process shell-file-name nil tbuf nil
+                                     shell-command-switch command))
+          (cond (arg
+                 (xwem-kbd-add-pending-keys
+                  (buffer-substring
+                   (point-min) (- (point-max)
+                                  (if (> (prefix-numeric-value arg) 4) 1 0)))))
+                ((= (point-max) (point-min))
+                 (xwem-message 'info "Process exit status: %d" status))
+                ((= 1 (count-lines (point-min) (point-max)))
+                 (xwem-message 'info (buffer-substring (point-min) 
(point-max))))
+                (t
+                 (xwem-special-popup-frame tbuf)
+                 (setq dontkill t))))
       (unless dontkill
         (kill-buffer tbuf)))))
-    
+
 ;;;###autoload(autoload 'xwem-mini-calc "xwem-misc" nil t)
 (define-xwem-command xwem-mini-calc (expr &optional arg)
   "Calculate expression EXPR.


--- orig/lisp/xwem-mouse.el
+++ mod/lisp/xwem-mouse.el
@@ -231,7 +231,7 @@
                              (vector
                               (concat "Frame " (int-to-string fn) ": " 
(xwem-frame-name el))
                               `(xwem-frame-switch-nth ,fn))))
-                         xwem-frames-list))))
+                         (xwem-frames-list)))))
 
         (list "Clients" :filter
               (lambda (not-used)


--- orig/lisp/xwem-netwm.el
+++ mod/lisp/xwem-netwm.el
@@ -266,7 +266,7 @@
   (XChangeProperty (xwem-dpy) (xwem-rootwin)
                    (XInternAtom (xwem-dpy) _NET_NUMBER_OF_DESKTOPS)
                    XA-cardinal X-format-32 X-PropModeReplace
-                   (list (length (xwem-frames-list)))))
+                   (list (length (xwem-frames-list 'desktop)))))
 
 (defun xwem-nwm-set-desk-geometry (&optional frame &rest notused)
   "Set _NET_DESKTOP_GEOMETRY."


--- orig/lisp/xwem-struct.el
+++ mod/lisp/xwem-struct.el
@@ -184,8 +184,10 @@
   `(xwem-frame-set-property ,frame 'inner-border-width 
,new-inner-border-width))
 
 (defsubst xwem-frame-alive-p (frame)
-  "Return non-nil if FRAME is alive XWEM frame, i.e. which is in 
`xwem-frames-list'."
-  (memq frame xwem-frames-list))
+  "Return non-nil if FRAME is alive XWEM frame."
+  (and (xwem-frame-p frame)
+       (memq frame xwem-frames-list)
+       (not (eq (xwem-frame-type frame) 'destroyed))))
 
 (defsubst xwem-frame-mapped-p (frame)
   "Return non-nil if xwem FRAME is mapped."




<Prev in Thread] Current Thread [Next in Thread>
  • Summary for xwem--main--2.1--patch-18, Zajcev Evgeny <=