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."
|