Location: lg@xxxxxxxxxxxxxx http://arch.xwem.org/2005/
Revision: xwem--main--2.2--patch-1
Archive: lg@xxxxxxxxxxxxxx
Creator: Zajcev Evgeny <lg@xxxxxxxx>
Date: Tue Mar 7 02:26:57 MSK 2006
Standard-date: 2006-03-06 23:26:57 GMT
Renamed-files: .arch-ids/Makfile.CVS.id .arch-ids/Makefile.CVS.id
Makfile.CVS Makefile.CVS
Modified-files: Makefile extra/xwem-frametrans.el
extra/xwem-gamma.el extra/xwem-keytt.el
extra/xwem-vert.el extra/xwem-vline.el
lisp/xwem-clients.el lisp/xwem-desktop.el
lisp/xwem-keyboard.el lisp/xwem-launcher.el
lisp/xwem-netwm.el lisp/xwem-register.el
lisp/xwem-struct.el
New-patches: lg@xxxxxxxxxxxxxx/xwem--main--2.2--patch-47
lg@xxxxxxxxxxxxxx/xwem--main--2.2--patch-1
Summary: client configuration, and minor fixes
Keywords: desktop, register, vline
* Makefile: sxemacs as default XEMACS
* lisp/xwem-desktop.el (xwem-desktop-file): [new] File where
`xwem-desktop-goals' to store. By default ~/.xwem/.desktop
* lisp/xwem-desktop.el (xwem-desktop-goals): [addon] frames-config,
clients-config added. THIS IS EXPERIMENTAL, Please report bugs!
* lisp/xwem-desktop.el (xwem-desktop-onetime-goals): [change] Save
frames-config to "~/.xwem/.desktop.frames"
* lisp/xwem-desktop.el (xwem-desktop-save-element): [addon] Support for
clients-config
* lisp/xwem-launcher.el (xwem-launcher-function): [change] Use
`xwem-execute-program-expecting' as default launcher.
* lisp/xwem-launcher.el (xwem-proc-name-format): [new]
* lisp/xwem-launcher.el (xwem-execute-program): [change] BUFFER-NAME
argument removed, to make `xwem-execute-program' and
`xwem-execute-program-expecting' be of same arguments.
* lisp/xwem-launcher.el (xwem-execute-program-expecting): [change]
Accept only CMD argument.
* lisp/xwem-launcher.el (xwem-execute-program-expecting-1): [new] Former
`xwem-execute-program-expecting'
* lisp/xwem-register.el (xwem-register-client-config): [new] Save clients
configuration to register.
* lisp/xwem-register.el (xwem-register-jump): [addon] Jump to clients
configuration support added.
* extra/xwem-keytt.el (xwem-keytt-firefox-keymap): [addon] `C-x 5 2' to
create new firefox frame.
* extra/xwem-vline.el: Display current column. Support dragging vline
with mouse to change current column.
* added files
{arch}/xwem/xwem--main/xwem--main--2.2/lg@xxxxxxxxxxxxxx/patch-log/patch-47
{arch}/xwem/xwem--main/xwem--main--2.2/lg@xxxxxxxxxxxxxx/patch-log/patch-1
* renamed files and symlinks
.arch-ids/Makfile.CVS.id
=> .arch-ids/Makefile.CVS.id
Makfile.CVS
=> Makefile.CVS
* modified files
--- orig/Makefile
+++ mod/Makefile
@@ -70,7 +70,7 @@
# Programs and their flags.
ifndef XEMACS
-XEMACS = xemacs
+XEMACS = sxemacs
endif
XEMACS_FLAGS = -batch -no-autoloads
INSTALL = install
--- orig/extra/xwem-frametrans.el
+++ mod/extra/xwem-frametrans.el
@@ -1,6 +1,6 @@
;;; xwem-frametrans.el --- Transparency frames support.
-;; Copyright (C) 2004,2005 by XWEM Org.
+;; Copyright (C) 2004-2006 by XWEM Org.
;; Author: Zajcev Evgeny <zevlg@xxxxxxxxx>
;; Created: Thu Dec 2 10:35:14 MSK 2004
--- orig/extra/xwem-gamma.el
+++ mod/extra/xwem-gamma.el
@@ -1,6 +1,6 @@
;;; xwem-gamma.el --- XWEM addon used to adjust gamma.
-;; Copyright (C) 2004,2005 by XWEM Org.
+;; Copyright (C) 2004-2006 by XWEM Org.
;; Author: Zajcev Evgeny <zevlg@xxxxxxxxx>
;; Steve Youngs <steve@xxxxxxxxxxxxx>
--- orig/extra/xwem-keytt.el
+++ mod/extra/xwem-keytt.el
@@ -159,6 +159,7 @@
(application "mozilla")))
xwem-keytt-firefox-keymap t)
(xwem-keytt-define-universal-argument-commands xwem-keytt-firefox-keymap)
+(define-key xwem-keytt-firefox-keymap (kbd "C-x 5 2") (kbd "<self-insert>
C-n")) ; new window
(define-key xwem-keytt-firefox-keymap (kbd "C-x C-c") (kbd "<self-insert> M-f
q")) ; quit
(define-key xwem-keytt-firefox-keymap (kbd "C-x C-f") (kbd "<self-insert>
C-l")) ; open url
(define-key xwem-keytt-firefox-keymap (kbd "C-x C-s") (kbd "<self-insert>
C-s")) ; save url
--- orig/extra/xwem-vert.el
+++ mod/extra/xwem-vert.el
@@ -1,6 +1,6 @@
;;; xwem-vert.el --- Support for vertical text.
-;; Copyright (C) 2004,2005 by XWEM Org.
+;; Copyright (C) 2004-2006 by XWEM Org.
;; Author: Zajcev Evgeny <zevlg@xxxxxxxxx>
;; Created: Tue Sep 14 22:51:27 GMT 2004
--- orig/extra/xwem-vline.el
+++ mod/extra/xwem-vline.el
@@ -27,13 +27,31 @@
;;; Commentary:
-;; Vertical minor mode. Add some commentary here.
+;; This is minor mode which enables nifty vertical line in the client
+;; application at the specified column. When vertical line is
+;; displayed you can interactively move it to any column using
+;; click-and-drag.
+
+;; To enable vline minor mode in current client simply do
+;; C-H-x xwem-vline-minor-mode RET
+
+;; By default vertical line is displayed at `fill-column'. Use prefix
+;; argument to `xwem-vline-minor-mode' command to specify particular
+;; column.
+
+;; You can configure vertical lines for different clients by altering
+;; `xwem-vline-config' custom variable.
+
+;;; Bugs:
+
+;; - Does not track change of clients height
;;; Code:
(require 'xwem-modes)
+(require 'xwem-osd)
-(defcustom xwem-vline-width 1
+(defcustom xwem-vline-width 2
"*Width in pixels of vertical line."
:type 'number
:group 'xwem-modes)
@@ -57,6 +75,44 @@
(xwem-make-variable-client-local 'xwem-vline-minor-mode)
+(defun xwem-vline-set-column (xwin new-column)
+ "Set new column."
+ (X-Win-put-prop xwin 'vline-column new-column)
+ (let* ((xoff (* (X-Win-get-prop xwin 'vline-column-width) new-column))
+ (osd (X-Win-get-prop xwin 'vline-osd))
+ (clwid (X-Text-width
+ (xwem-dpy) (X-Gc-font (xwem-osd-gc osd))
+ (int-to-string new-column))))
+ (XMoveWindow (X-Win-dpy xwin) xwin xoff 0)
+
+ (xwem-osd-move osd (- xoff (/ clwid 2) -1) 0)
+ (xwem-osd-text osd (int-to-string new-column))))
+
+(defun xwem-vline-events-handler (xdpy xwin xev)
+ "Handle incoming event."
+ (X-Event-CASE xev
+ (:X-ButtonPress
+ (let ((old-x (X-Event-xbutton-root-x xev))
+ (col-wid (X-Win-get-prop xwin 'vline-column-width))
+ x)
+ (XGrabPointer xdpy xwin
+ (Xmask-or XM-ButtonMotion XM-ButtonRelease
XM-ButtonPress))
+ (xwem-unwind-protect
+ (while (= (X-Event-type (setq xev (xwem-next-event)))
+ X-MotionNotify)
+ (setq x (X-Event-xmotion-root-x xev))
+ (when (>= (abs (- x old-x)) col-wid)
+ (xwem-vline-set-column
+ xwin (+ (X-Win-get-prop xwin 'vline-column)
+ (/ (- x old-x) col-wid)))
+ (setq old-x (- x (% (- x old-x) col-wid)))))
+ (XUngrabPointer xdpy))))
+
+ (:X-DestroyNotify
+ (xwem-osd-destroy (X-Win-get-prop xwin 'vline-osd))
+ (X-Win-EventHandler-rem xwin 'xwem-vline-events-handler))
+ ))
+
;;;###autoload(autoload 'xwem-turn-on-vline "xwem-vline" nil t)
(define-xwem-command xwem-turn-on-vline
(client &optional color column column-width)
@@ -88,24 +144,35 @@
(unless vline-xwin
(setq vline-xwin
- (XCreateWindow (xwem-dpy) (xwem-cl-xwin client)
- 0 0 1 1 0
- nil nil nil
- :event-mask 0))
- (xwem-cl-put-sys-prop client 'vline-xwin vline-xwin))
-
- (XMoveResizeWindow (xwem-dpy) vline-xwin xoff 0 xwem-vline-width
- (X-Geom-height (xwem-cl-xgeom client)))
- (XChangeWindowAttributes
- (xwem-dpy) vline-xwin
- :background-pixel
- (XAllocColor
- (xwem-dpy) (XDefaultColormap (xwem-dpy))
- (xwem-make-color color)))
- (XClearArea (xwem-dpy) vline-xwin
- 0 0 1 (X-Geom-height (xwem-cl-xgeom client)) nil)
- (XMapWindow (xwem-dpy) vline-xwin))
+ (XCreateWindow
+ (xwem-dpy) (xwem-cl-xwin client)
+ 0 0 xwem-vline-width
+ (X-Geom-height (xwem-cl-xgeom client)) 0
+ nil nil nil
+ :background-pixel
+ (XAllocColor (xwem-dpy) (XDefaultColormap (xwem-dpy))
+ (xwem-make-color color))
+ :cursor (xwem-make-cursor X-XC-sb_h_double_arrow)
+ :event-mask (Xmask-or XM-ButtonPress XM-StructureNotify)))
+ (X-Win-EventHandler-add-new vline-xwin 'xwem-vline-events-handler 100
+ (list X-ButtonPress X-DestroyNotify))
+ (xwem-cl-put-sys-prop client 'vline-xwin vline-xwin)
+
+ ;; Create OSD displaying current column
+ (let ((osd (xwem-osd-create (xwem-dpy) 0 0 100 100 (xwem-cl-xwin
client))))
+ (xwem-osd-set-color osd color)
+ (xwem-osd-set-font osd (or (plist-get vc :font)
+ (xwem-face-font 'default)))
+ (X-Win-put-prop vline-xwin 'vline-osd osd)))
+
+ ;; Setup properties
+ (X-Win-put-prop vline-xwin 'vline-column column)
+ (X-Win-put-prop vline-xwin 'vline-column-width column-width)
+
+ (xwem-vline-set-column vline-xwin column)
+ (XMapWindow (xwem-dpy) vline-xwin)
+ (xwem-osd-show (X-Win-get-prop vline-xwin 'vline-osd)))
(xwem-turn-on-minor-mode client 'xwem-vline-minor-mode))))
;;;###autoload(autoload 'xwem-turn-off-vline "xwem-vline" nil t)
--- orig/lisp/xwem-clients.el
+++ mod/lisp/xwem-clients.el
@@ -466,6 +466,10 @@
Set only if using windowing managing model."
:type 'number)
+(define-xwem-client-property executed-command nil
+ "Command used to start client."
+ :type 'string)
+
;; X Properties stuff
(defmacro xwem-cl-XProperty-get (cl prop-atom-string)
@@ -662,38 +666,33 @@
"Send config info to window."
(let ((clgeom (xwem-cl-xgeom cl))
(win (xwem-cl-xwin cl)))
- (if (featurep 'ffi-xlib)
- ;; TODO: Remove `eval'
- (eval '(XSendEvent (xwem-dpy) win nil XM-StructureNotify
- (let ((xev (make-ffi-object 'XConfigureEvent)))
- (setf (XConfigureEvent->type xev) X-ConfigureNotify
- (XConfigureEvent->event xev) (X-Win-id win)
- (XConfigureEvent->window xev) (X-Win-id win)
- (XConfigureEvent->above xev) X-None
- (XConfigureEvent->x xev) (X-Geom-x clgeom)
- (XConfigureEvent->y xev) (X-Geom-y clgeom)
- (XConfigureEvent->width xev) (X-Geom-width clgeom)
- (XConfigureEvent->height xev) (X-Geom-height
clgeom)
- (XConfigureEvent->border_width xev) (X-Geom-width
clgeom))
- (ffi-address-of xev))))
-
- (XSendEvent (xwem-dpy) win nil XM-StructureNotify
- (X-Create-message
- (list [1 X-ConfigureNotify] ;type
- [1 nil] ;detail
- [2 2806] ;seq
- [4 (X-Win-id win)] ;event
- [4 (X-Win-id win)] ;window
- [4 X-None] ;above sibling
- (vector 2 (X-Geom-x clgeom)) ; shutup compiler
- [2 (X-Geom-y clgeom)]
- [2 (X-Geom-width clgeom)]
- [2 (X-Geom-height clgeom)]
- [2 (X-Geom-border-width clgeom)] ;XXX
- [1 nil] ;pad override
- [1 nil] ;pad
- )))
- )))
+ (xwem-XSendEvent
+ (xwem-dpy) win nil XM-StructureNotify
+ (X-Create-message
+ (list [1 X-ConfigureNotify] ;type
+ [1 nil] ;detail
+ [2 2806] ;seq
+ [4 (X-Win-id win)] ;event
+ [4 (X-Win-id win)] ;window
+ [4 X-None] ;above sibling
+ (vector 2 (X-Geom-x clgeom)) ; shutup compiler
+ [2 (X-Geom-y clgeom)]
+ [2 (X-Geom-width clgeom)]
+ [2 (X-Geom-height clgeom)]
+ [2 (X-Geom-border-width clgeom)] ;XXX
+ [1 nil] ;pad override
+ [1 nil]))
+ (let ((xev (make-ffi-object 'XConfigureEvent)))
+ (setf (XConfigureEvent->type xev) X-ConfigureNotify
+ (XConfigureEvent->event xev) (X-Win-id win)
+ (XConfigureEvent->window xev) (X-Win-id win)
+ (XConfigureEvent->above xev) X-None
+ (XConfigureEvent->x xev) (X-Geom-x clgeom)
+ (XConfigureEvent->y xev) (X-Geom-y clgeom)
+ (XConfigureEvent->width xev) (X-Geom-width clgeom)
+ (XConfigureEvent->height xev) (X-Geom-height clgeom)
+ (XConfigureEvent->border_width xev) (X-Geom-width clgeom))
+ (ffi-address-of xev)))))
;;;###xwem-autoload
@@ -1157,29 +1156,28 @@
;;;###xwem-autoload
(defun xwem-client-sendmsg-atom (cl atom &optional time)
"Send Client message to client CL."
- (if (featurep 'ffi-xlib)
- ;; TODO: Remove `eval'
- (eval '(XSendEvent (xwem-dpy) (xwem-cl-xwin cl) nil 0
- (let ((xev (make-ffi-object 'XClientMessageEvent)))
- (setf (XClientMessageEvent->type xev) X-ClientMessage
- (XClientMessageEvent->format xev) X-format-32
- (XClientMessageEvent->window xev) (X-Win-id
(xwem-cl-xwin cl))
- (XClientMessageEvent->message_type xev) (X-Atom-id
(X-Atom-find-by-name (xwem-dpy) "WM_PROTOCOLS")))
- (ffi-store xev (ffi-slot-offset 'XClientMessageEvent
'data) 'long (X-Atom-id atom))
- (ffi-store xev (+ (ffi-slot-offset 'XClientMessageEvent
'data) 4)
- 'long (or time X-CurrentTime))
- (ffi-address-of xev))))
-
- (XSendEvent (xwem-dpy) (xwem-cl-xwin cl) nil 0
- (X-Create-message
- (list [1 X-ClientMessage] ; type
- [1 X-format-32] ; format
- [2 1000] ; XXX seq
- [4 (X-Win-id (xwem-cl-xwin cl))] ; window
- [4 (X-Atom-id (X-Atom-find-by-name (xwem-dpy)
"WM_PROTOCOLS"))]
- [4 (X-Atom-id atom)]
- [4 (or time X-CurrentTime)]
- [4 nil])))))
+ (xwem-XSendEvent
+ (xwem-dpy) (xwem-cl-xwin cl) nil 0
+ (X-Create-message
+ (list [1 X-ClientMessage] ; type
+ [1 X-format-32] ; format
+ [2 1000] ; XXX seq
+ [4 (X-Win-id (xwem-cl-xwin cl))] ; window
+ [4 (X-Atom-id (X-Atom-find-by-name (xwem-dpy) "WM_PROTOCOLS"))]
+ [4 (X-Atom-id atom)]
+ [4 (or time X-CurrentTime)]
+ [4 nil]))
+ (let ((xev (make-ffi-object 'XClientMessageEvent)))
+ (setf (XClientMessageEvent->type xev) X-ClientMessage
+ (XClientMessageEvent->format xev) X-format-32
+ (XClientMessageEvent->window xev) (X-Win-id (xwem-cl-xwin cl))
+ (XClientMessageEvent->message_type xev)
+ (X-Atom-id (X-Atom-find-by-name (xwem-dpy) "WM_PROTOCOLS")))
+ (ffi-store xev (ffi-slot-offset 'XClientMessageEvent 'data)
+ 'long (X-Atom-id atom))
+ (ffi-store xev (+ (ffi-slot-offset 'XClientMessageEvent 'data) 4)
+ 'long (or time X-CurrentTime))
+ (ffi-address-of xev))))
(defun xwem-client-delete-window (cl)
"Close xwem client CL in safe manner.
@@ -1558,16 +1556,14 @@
(unless (xwem-cl-alive-p cl)
(error 'xwem-error "Invalid client"))
- (let ((cmd (or (xwem-client-property cl 'executed-command)
- (xwem-hints-wm-command (xwem-cl-hints cl))))
+ (let ((cmd (xwem-client-command cl))
(mspec (xwem-cl-manage-spec cl)))
-
;; Check command for validity
(when (or (not (stringp cmd)) (string= cmd ""))
(error 'xwem-error "Invalid command: " cmd))
(while (> arg 0)
- (xwem-execute-program-expecting
+ (xwem-execute-program-expecting-1
cmd (car mspec) (append (cadr mspec)
(when (xwem-cl-win cl)
`(expect-win ,(xwem-win-id (xwem-cl-win
cl))))))
@@ -1579,30 +1575,23 @@
With prefix ARG, make horizontal split instead of vertical if split
really needed."
(xwem-interactive "P")
+ (unless cl (setq cl (xwem-cl-selected)))
+ (when (or (not (xwem-cl-p cl))
+ (not (xwem-win-p (xwem-cl-win cl))))
+ (error 'xwem-error "Can't run copy of invalid client"))
- (let ((cl (or cl (xwem-cl-selected)))
- cmd own)
- (when (or (not (xwem-cl-p cl))
- (not (xwem-win-p (xwem-cl-win cl))))
- (error 'xwem-error "Can't run copy of invalid client"))
-
- (setq cmd (xwem-hints-wm-command (xwem-cl-hints cl)))
- (setq own (xwem-window-other 1 (xwem-cl-win cl)))
-
+ (let ((cmd (xwem-client-command cl))
+ (own (xwem-window-other 1 (xwem-cl-win cl))))
(when cmd
;; Check is there split needed
- (when (eq own (xwem-win-selected))
+ (when (xwem-win-selected-p own)
(if arg
(xwem-window-split-horizontally 0)
(xwem-window-split-vertically 0))
(setq own (xwem-win-next (xwem-win-selected))))
- ;; Install expectance in hope it will be managed by generic
- ;; manage type, or some other type that suppors expectances.
- (xwem-manda-add-expectance `(nil (expect-win ,(xwem-win-id own))
(command ,cmd)))
-
- ;; Finnaly run command
- (xwem-execute-program cmd))))
+ (xwem-execute-program-expecting-1
+ cmd nil `(expect-win ,(xwem-win-id own))))))
;;;###autoload(autoload 'xwem-client-run-copy-other-frame "xwem-clients" "" t)
(define-xwem-command xwem-client-run-copy-other-frame (arg &optional cl)
@@ -1610,30 +1599,20 @@
If prefix ARG is specified, create embedded frame, if creation is
needed at all."
(xwem-interactive "P")
-
- (let ((cl (or cl (xwem-cl-selected)))
- cmd ofr)
-
- (when (or (not (xwem-cl-p cl))
- (not (xwem-frame-p (xwem-cl-frame cl))))
- (error 'xwem-error "Can't run copy of invalid client"))
-
- (setq cmd (xwem-hints-wm-command (xwem-cl-hints cl)))
- (setq ofr (xwem-frame-other (xwem-cl-frame cl)))
+ (unless cl (setq cl (xwem-cl-selected)))
+ (when (or (not (xwem-cl-p cl))
+ (not (xwem-frame-p (xwem-cl-frame cl))))
+ (error 'xwem-error "Can't run copy of invalid client"))
+ (let ((cmd (xwem-client-command cl))
+ (ofr (xwem-frame-other (xwem-cl-frame cl))))
(when cmd
(unless (xwem-frame-p ofr)
(setq ofr (xwem-make-frame-1 (or (and arg 'embedded) 'desktop)
:noselect t)))
-
- ;; Setup expectance
- (xwem-manda-add-expectance
- `(nil (expect-win ,(xwem-win-id (xwem-frame-selwin ofr))) (command
,cmd)))
-
- ;; Finnaly run command
- (xwem-execute-program cmd)
-
- ;; And select frame
- (xwem-select-frame ofr))))
+ (let ((cl (xwem-execute-program-expecting-1
+ cmd nil `(expect-win ,(xwem-win-id (xwem-frame-selwin
ofr))))))
+ (when (xwem-cl-alive-p cl)
+ (xwem-select-client cl))))))
(defun xwem-cl-prog-geom (cl)
"Get program specified geometry for CL."
@@ -2105,6 +2084,13 @@
(xwem-client-kill cl arg)))
;;; Applications navigation
+(defun xwem-client-command (&optional cl)
+ "Return CL's command."
+ (unless cl
+ (setq cl (xwem-cl-selected)))
+ (or (xwem-client-property cl 'executed-command)
+ (xwem-cl-wm-command cl)))
+
;;;###xwem-autoload
(defun xwem-client-application (&optional cl)
"Retun CL's application entry from `xwem-applications-alist'."
@@ -2587,13 +2573,58 @@
xwem-client-local-variables)))
;;; Clients configurations
+;;;###xwem-autoload
+(defun xwem-client-config-match (config cl)
+ "Return non-nil if CONFIG represents CL."
+ (and (= (X-Win-id (xwem-cl-xwin cl)) (xwem-cl-config-xwin-id config))
+ (string= (xwem-client-command cl) (xwem-cl-config-command config))))
+
+;;;###xwem-autoload
(defun xwem-client-configuration ()
"Return current clients configuration."
- )
+ (let (seen-groups)
+ (delete*
+ nil (mapcar #'(lambda (cl)
+ (unless (or (xwem-dummy-client-p cl)
+ (string= (xwem-client-command cl) "")
+ (and (X-WMHints-wingroup-p
+ (xwem-cl-wm-hints cl))
+ (memq (X-WMHints-window-group
+ (xwem-cl-wm-hints cl))
+ seen-groups)))
+ ;; Put CL's group leader to SEEN-GRUOPS
+ (when (X-WMHints-wingroup-p
+ (xwem-cl-wm-hints cl))
+ (setq seen-groups
+ (cons (X-WMHints-window-group
+ (xwem-cl-wm-hints cl)) seen-groups)))
+ (make-xwem-cl-config
+ :selected-p (xwem-cl-selected-p cl)
+ :xwin-id (X-Win-id (xwem-cl-xwin cl))
+ :command (xwem-client-command cl)
+ :manage-type (xwem-cl-manage-type cl)
+ :properties (xwem-client-properties cl))))
+ (copy-list xwem-clients)))))
+;;;###xwem-autoload
(defun xwem-set-client-configuration (config)
"Set client configuration to CONFIG."
- )
+ (let ((cl-to-select (xwem-cl-selected)))
+ (mapc #'(lambda (clconf)
+ (unless (find clconf xwem-clients :test
#'xwem-client-config-match)
+ ;; Start application represented by CLCONF
+ (let ((ncl (xwem-execute-program-expecting-1
+ (xwem-cl-config-command clconf)
+ (xwem-cl-config-manage-type clconf)
+ (xwem-cl-config-properties clconf))))
+ (when (xwem-cl-config-selected-p clconf)
+ (setq cl-to-select ncl))
+ ;; XXX fix CONFIG's xwin-id
+ (setf (xwem-cl-config-xwin-id clconf)
+ (X-Win-id (xwem-cl-xwin ncl)))
+ )))
+ config)
+ (xwem-select-client cl-to-select)))
(provide 'xwem-clients)
--- orig/lisp/xwem-desktop.el
+++ mod/lisp/xwem-desktop.el
@@ -51,12 +51,20 @@
:prefix "xwem-desktop-"
:group 'xwem)
+(defcustom xwem-desktop-file (expand-file-name ".desktop" xwem-dir)
+ "File used to store xwem desktop information."
+ :type 'file
+ :group 'xwem)
+
(defcustom xwem-desktop-goals
'((keymap . xwem-user-macros-prefix)
(xwem-read-filename-history . 100)
(xwem-launcher-history . 100)
(xwem-read-expression-history . 100)
- (xwem-open-file-commands-alist . 1024))
+ (xwem-open-file-commands-alist . 1024)
+
+ frames-config
+ clients-config)
"*List of variables to save.
Each element is eather symbol or cons cell in form.
\(symbol . maxsize\)."
@@ -75,7 +83,7 @@
:group 'xwem-desktop)
(defcustom xwem-desktop-onetime-goals
- '((frames-config . "frames-config"))
+ '((frames-config . ".desktop.frames"))
"One time goals to save."
:type '(repeat (choice (const :tag "Frames config" frames-config)
(cons :tag "Variable"
@@ -94,6 +102,11 @@
;; Store frames configuration here
(xwem-frame-config-dump1 (xwem-frame-configuration) buffer t))
+ ((eq el 'clients-config)
+ ;; Store clients configuration
+ (princ (format "(add-hook 'xwem-after-init-wins-hook (lambda ()
(xwem-set-client-configuration (quote %S))))"
+ (xwem-client-configuration)) buffer))
+
((symbolp el)
(princ "\n;; Symbol value\n" buffer)
(princ (concat "(setq " (symbol-name el) " "
@@ -138,11 +151,9 @@
;;;###autoload(autoload 'xwem-desktop-save "xwem-desktop" nil t)
(define-xwem-command xwem-desktop-save (&optional file)
"Save things described in `xwem-desktop-goals' into FILE.
-Defaultly FILE is ~/.xwem/xwem-desktop.el"
+If FILE is ommited, `xwem-desktop-file' is used."
(xwem-interactive "FSave xwem desktop to: ")
- (unless file
- (setq file (expand-file-name "xwem-desktop.el" xwem-dir)))
-
+ (unless file (setq file xwem-desktop-file))
(with-temp-buffer
(erase-buffer)
(insert
@@ -161,13 +172,11 @@
;;;###autoload(autoload 'xwem-desktop-load "xwem-desktop" nil t)
(define-xwem-command xwem-desktop-load (&optional file)
"Load saved desktop from FILE.
-Default FILE is ~/.xwem/xwem-desktop.el."
+If FILE is ommited, `xwem-desktop-file' is used."
(xwem-interactive "FLoad xwem desktop from: ")
-
- (unless file
- (setq file (expand-file-name "xwem-desktop.el" xwem-dir)))
-
- (load-file file))
+ (unless file (setq file xwem-desktop-file))
+ (when (file-exists-p file)
+ (load-file file)))
;;;###autoload(autoload 'xwem-desktop-save-onetime "xwem-desktop" nil t)
(define-xwem-command xwem-desktop-save-onetime ()
--- orig/lisp/xwem-keyboard.el
+++ mod/lisp/xwem-keyboard.el
@@ -849,47 +849,44 @@
(let (keycode keymods)
(mapc #'(lambda (key)
- (setq keymods (butlast key))
- ;; Now calculade key KEYCODE maybe add shift modifier
- (setq keycode (xwem-kbd-xksym->xkcode
- (xwem-kbd-emacs->xksym (car (last key)))))
- (setq keymods (nconc keymods (cdr keycode)))
- (setq keycode (car keycode))
-
- (if (featurep 'ffi-xlib)
- (eval '(XSendEvent (xwem-dpy) (xwem-cl-xwin client)
- nil XM-KeyPress
- (let ((xev (make-ffi-object 'XEvent)))
- (setf (XKeyEvent->type xev) X-KeyPress
- (XKeyEvent->keycode xev) keycode
- (XKeyEvent->time xev) X-CurrentTime
- (XKeyEvent->root xev) (X-Win-id
(xwem-rootwin))
- (XKeyEvent->window xev) (X-Win-id
(xwem-cl-xwin client))
- (XKeyEvent->state xev)
(xwem-kbd-emods->xmodmask keymods)
- (XKeyEvent->same_screen xev) 1
- (XKeyEvent->x xev) 0
- (XKeyEvent->y xev) 0
- (XKeyEvent->x_root xev) 0
- (XKeyEvent->y_root xev) 0)
- (ffi-address-of xev))))
-
- (XSendEvent (xwem-dpy) (xwem-cl-xwin client)
- nil XM-KeyPress
- (X-Create-message
- (list [1 X-KeyPress] ;type
- [1 keycode] ;detail
- [2 2806] ; XXX seq
- [4 X-CurrentTime] ; time
- [4 (X-Win-id (xwem-rootwin))] ; root
- [4 (X-Win-id (xwem-cl-xwin client))] ;
event
- [4 X-None] ; child
- [2 0] ; root-x
- [2 0] ; root-y
- [2 0] ; event-x
- [2 0] ; event-y
- [2 (xwem-kbd-emods->xmodmask keymods)] ;
state
- [1 t] ; same-screen
- [1 nil])))))
+ (setq keymods (butlast key)
+ ;; Now calculade key KEYCODE maybe add shift
+ ;; modifier
+ keycode (xwem-kbd-xksym->xkcode
+ (xwem-kbd-emacs->xksym (car (last key))))
+ keymods (nconc keymods (cdr keycode))
+ keycode (car keycode))
+
+ (xwem-XSendEvent
+ (xwem-dpy) (xwem-cl-xwin client) nil XM-KeyPress
+ (X-Create-message
+ (list [1 X-KeyPress] ;type
+ [1 keycode] ;detail
+ [2 2806] ; XXX seq
+ [4 X-CurrentTime] ; time
+ [4 (X-Win-id (xwem-rootwin))] ; root
+ [4 (X-Win-id (xwem-cl-xwin client))] ; event
+ [4 X-None] ; child
+ [2 0] ; root-x
+ [2 0] ; root-y
+ [2 0] ; event-x
+ [2 0] ; event-y
+ [2 (xwem-kbd-emods->xmodmask keymods)] ; state
+ [1 t] ; same-screen
+ [1 nil]))
+ (let ((xev (make-ffi-object 'XEvent)))
+ (setf (XKeyEvent->type xev) X-KeyPress
+ (XKeyEvent->keycode xev) keycode
+ (XKeyEvent->time xev) X-CurrentTime
+ (XKeyEvent->root xev) (X-Win-id (xwem-rootwin))
+ (XKeyEvent->window xev) (X-Win-id (xwem-cl-xwin
client))
+ (XKeyEvent->state xev) (xwem-kbd-emods->xmodmask
keymods)
+ (XKeyEvent->same_screen xev) 1
+ (XKeyEvent->x xev) 0
+ (XKeyEvent->y xev) 0
+ (XKeyEvent->x_root xev) 0
+ (XKeyEvent->y_root xev) 0)
+ (ffi-address-of xev))))
keys))))
;;;###xwem-autoload
--- orig/lisp/xwem-launcher.el
+++ mod/lisp/xwem-launcher.el
@@ -59,9 +59,16 @@
:type 'boolean
:group 'xwem-launcher)
-(defcustom xwem-launcher-function 'xwem-execute-program
- "Function to be used to execute external program."
- :type 'function
+(defcustom xwem-launcher-function 'xwem-execute-program-expecting
+ "Function to be used to execute external program.
+If you are having problems with
+default\(`xwem-execute-program-expecting'\) value, set it to
+`xwem-execute-program'."
+ :type '(choice (function :tag "Expecting clients (default)"
+ xwem-execute-program-expecting)
+ (function :tag "Non-expecting clients"
+ xwem-execute-program)
+ (function :tag "User defined launcher"))
:group 'xwem-launcher)
(defcustom xwem-launcher-use-nohup nil
@@ -183,7 +190,7 @@
(setq xwem-launcher-shell-completion-table
(apply 'nconc
(mapcar #'(lambda (dir)
- (mapcar 'list (directory-files dir nil nil t t)))
+ (mapcar #'list (directory-files dir nil nil t t)))
exec-path)))))
(defun xwem-launcher-shell-complete (&optional undo mode)
@@ -267,17 +274,49 @@
(xwem-interactive "eRun command: ")
(xwem-execute-program command))
+(defconst xwem-proc-name-format "xwem-job-%d")
+
(defun xwem-next-job-number ()
"Return next job number for use by xwem."
(let ((job-number 1))
- (while (get-process (format "xwem-run-%d" job-number))
+ (while (get-process (format xwem-proc-name-format job-number))
(setq job-number (1+ job-number)))
job-number))
+(defun xwem-program-sentinel (process msg)
+ "Called when PROCESS changed state to MSG."
+ (let ((ms (match-data))) ; barf
+ (unwind-protect
+ (let ((msg (cond ((string= msg "finished\n") "Done")
+ ((string-match "^exited" msg)
+ (concat "Exit " (substring msg 28 -1)))
+ ((zerop (length msg)) "Continuing")
+ (t (concat (upcase (substring msg 0 1))
+ (substring msg 1 -1))))))
+ (when xwem-launcher-beep-done
+ (xwem-play-sound 'ready))
+ (xwem-message 'note "Job [%s] %s '%s'" (process-name process)
+ msg (mapconcat #'identity
+ (process-command process) " "))
+ (if (null (buffer-name (process-buffer process)))
+ (set-process-buffer process nil) ; WHY? Olin.
+
+ (if (memq (process-status process) '(signal exit))
+ (with-current-buffer (process-buffer process)
+ (let ((at-end (eobp)))
+ (save-excursion
+ (goto-char (point-max))
+ (insert ?\n msg ?\x20
+ (substring (current-time-string) 11 19) ?\n))
+ (if at-end (goto-char (point-max))))
+ (set-buffer-modified-p nil)))))
+ (store-match-data ms))))
+
;;;###autoload
-(defun xwem-execute-program (command &optional buffer-name)
- "Execute COMMAND in buffer with BUFFER-NAME.
-Unlike `background' do not use shell."
+(defun xwem-execute-program (command)
+ "Execute COMMAND with output directed some buffer.
+Much like `background', but do not use shell.
+This function can be used as `xwem-launcher-function'."
(let* ((cmdargs
;; Do it under `condition-case', due to split-string
;; args-out-of-range bug.
@@ -292,12 +331,9 @@
(cdr cmdargs)))
(emacs-env (getenv "EMACS"))
(job-number (xwem-next-job-number))
- (job-name (format "xwem-run-%d" job-number))
+ (job-name (format xwem-proc-name-format job-number))
+ (buffer-name (format " *%s*" job-name))
proc)
-
- (unless buffer-name
- (setq buffer-name (format " *%s*" job-name)))
-
(with-current-buffer (get-buffer-create buffer-name)
(if xwem-launcher-forced-pwd
(setq default-directory
@@ -326,44 +362,16 @@
(cond (proc (set-process-sentinel proc 'xwem-program-sentinel)
(xwem-message 'note "Job [%d] '%s' PID=%d"
job-number command (process-id proc))))
- (setq mode-name "XWEM-Run")
+ (setq mode-name "XWEM-Job")
;; Restore our Emacs environment variable to its previous state.
(setenv "EMACS" emacs-env)
proc)))
-(defun xwem-program-sentinel (process msg)
- "Called when PROCESS changed state to MSG."
- (let ((ms (match-data))) ; barf
- (unwind-protect
- (let ((msg (cond ((string= msg "finished\n") "Done")
- ((string-match "^exited" msg)
- (concat "Exit " (substring msg 28 -1)))
- ((zerop (length msg)) "Continuing")
- (t (concat (upcase (substring msg 0 1))
- (substring msg 1 -1))))))
- (when xwem-launcher-beep-done
- (xwem-play-sound 'ready))
- (xwem-message 'note "Job [%s] %s '%s'" (process-name process)
- msg (mapconcat #'identity
- (process-command process) " "))
- (if (null (buffer-name (process-buffer process)))
- (set-process-buffer process nil) ; WHY? Olin.
-
- (if (memq (process-status process) '(signal exit))
- (with-current-buffer (process-buffer process)
- (let ((at-end (eobp)))
- (save-excursion
- (goto-char (point-max))
- (insert ?\n msg ?\x20
- (substring (current-time-string) 11 19) ?\n))
- (if at-end (goto-char (point-max))))
- (set-buffer-modified-p nil)))))
- (store-match-data ms))))
-
;;;###xwem-autoload
-(defun xwem-execute-program-expecting (cmd &optional manage-type cl-plist
non-block)
+(defun xwem-execute-program-expecting-1
+ (cmd &optional manage-type cl-plist non-block)
"Execute CMD expecting till client will be managed.
MANAGE-TYPE specifies which manage type to use in expectance.
CL-PLIST is properties for expected client.
@@ -372,23 +380,28 @@
(let* ((job-num (xwem-next-job-number))
(expt (list manage-type
- (nconc (list 'job-num job-num) cl-plist)
- '(eval t)))
- ccls)
+ (plist-put cl-plist 'job-num job-num)
+ '(eval t))))
(xwem-manda-add-expectance expt)
(xwem-execute-program cmd)
(unless non-block
+ ;; Wait till client gets managed
(while (memq expt xwem-manage-expectances)
(dispatch-event (next-event)))
- ;; Find a client
- (setq ccls xwem-clients)
- (while (and ccls (not (= job-num
- (or (xwem-client-property (car ccls) 'job-num)
-1))))
- (setq ccls (cdr ccls)))
- (when (car ccls)
- (xwem-client-set-property (car ccls) 'executed-command cmd))
- (car ccls))))
+ ;; Find a client and set its `executable-command' property
+ ((lambda (cl)
+ (when cl
+ (xwem-client-set-property cl 'executed-command cmd))
+ cl)
+ (find job-num xwem-clients :test #'= :key
+ #'(lambda (cl) (or (xwem-client-property cl 'job-num) -1)))))))
+
+;;;###xwem-autoload
+(defun xwem-execute-program-expecting (command)
+ "Execute COMMAND expecting new client to manage.
+This function can be used as `xwem-launcher-function'."
+ (xwem-execute-program-expecting-1 command))
(defun xwem-execute-program-other-win (cmd type &optional select-p)
"Execute CMD in other XWEM window, making TYPE split if needed.
@@ -396,7 +409,7 @@
If SELECT-P is non-nil - select newly created client.
Return newly created client."
(let ((own (xwem-window-other 1))
- (cl (xwem-execute-program-expecting cmd 'dummy)))
+ (cl (xwem-execute-program-expecting-1 cmd 'dummy)))
(when (xwem-cl-alive-p cl)
(when (xwem-win-only-one-p own)
(let ((xwem-win-split-hook nil)) ; Omit split hooks
@@ -425,7 +438,7 @@
If SELECT-P is non-nil select newly managed client."
(let* ((oframe (or (xwem-frame-other (xwem-frame-selected))
(xwem-make-frame-1 'desktop :noselect t)))
- (cl (xwem-execute-program-expecting
+ (cl (xwem-execute-program-expecting-1
cmd nil `(expect-win ,(xwem-win-id (xwem-frame-selwin
oframe))))))
(when select-p
(xwem-select-client cl))
@@ -435,7 +448,7 @@
"Execute CMD in linkaged frame or in embedded XWEM frame."
(let* ((oframe (or (xwem-frame-other (xwem-frame-selected) 'linkage)
(xwem-make-frame-1 'embedded :noselect t)))
- (cl (xwem-execute-program-expecting
+ (cl (xwem-execute-program-expecting-1
cmd nil `(expect-win ,(xwem-win-id (xwem-frame-selwin
oframe))))))
(when select-p
(xwem-select-client cl))
@@ -510,7 +523,7 @@
(xwem-interactive "_eLaunch program: \nP")
(cond ((listp arg)
- (xwem-execute-program-expecting
+ (xwem-execute-program-expecting-1
cmd nil `(expect-win ,(xwem-win-id (xwem-win-selected)))))
((numberp arg)
--- orig/lisp/xwem-netwm.el
+++ mod/lisp/xwem-netwm.el
@@ -255,19 +255,6 @@
(if state
(list (XInternAtom (xwem-dpy) state))
nil)))
-
-(defun xwem-nwm-apply-state (xwin state)
- (XSendEvent (xwem-dpy) (xwem-rootwin) nil XM-SubstructureRedirect
- (X-Create-message
- (list [1 X-ClientMessage]
- [1 32] ; format
- [2 5555] ; seq XXX
- [4 (X-Win-id xwin)]
- [4 (X-Atom-id (XInternAtom (xwem-dpy) _NET_WM_STATE))]
- [4 1]
- [4 (X-Atom-id (XInternAtom (xwem-dpy) state))]
- [4 0]
- [8 nil]))))
(defun xwem-nwm-set-supported (&rest notused)
"Set _NET_SUPPORTED root window property."
--- orig/lisp/xwem-register.el
+++ mod/lisp/xwem-register.el
@@ -143,6 +143,15 @@
(xwem-register-set reg (list 'XWEM-FRAME-CONFIG
(xwem-frame-configuration)))))
+;;;###autoload(autoload 'xwem-register-client-config "xwem-register" "" t)
+(define-xwem-command xwem-register-client-config (register)
+ "Store clients configuration to REGISTER."
+ (xwem-interactive "kClients Configuration to register: ")
+
+ (let ((reg (event-key register)))
+ (xwem-register-set reg (list 'XWEM-CLIENT-CONFIG
+ (xwem-client-configuration)))))
+
;;;###autoload(autoload 'xwem-register-jump "xwem-register" "" t)
(define-xwem-command xwem-register-jump (register &optional arg)
"Jump to REGISTER.
@@ -169,6 +178,9 @@
(xwem-set-frame-configuration
(cadr rval) xwem-registers-frame-config-no-delete))
+ ((and (listp rval) (eq 'XWEM-CLIENT-CONFIG (car rval)))
+ (xwem-set-client-configuration (cadr rval)))
+
(t (xwem-message 'todo "Hanle register value: %S" rval)))
)))
@@ -216,8 +228,16 @@
(xwem-frame-name frame)))
(insert (format " dead")))))
((and (listp rval) (eq 'XWEM-FRAME-CONFIG (car rval)))
- (insert " FRAME-CONFIG")))
- (insert "\n")))
+ (insert " FRAME-CONFIG"))
+ ((and (listp rval) (eq 'XWEM-CLIENT-CONFIG (car rval)))
+ (insert (format " CLIENT-CONFIG %d clients/ %d alive"
+ (length (cadr rval))
+ (length (delete* nil (mapcar #'(lambda
(conf)
+ (memq
t (mapcar #'(lambda (cl)
+
(xwem-client-config-match conf cl))
+
xwem-clients)))
+ (cadr
rval)))))))))
+ (insert "\n"))
xwem-registers))
(let ((map (copy-keymap help-mode-map)))
--- orig/lisp/xwem-struct.el
+++ mod/lisp/xwem-struct.el
@@ -495,6 +495,14 @@
"Set CL's WM_PROTOCOLS to PROTOCOLS."
`(setf (xwem-hints-wm-protocols (xwem-cl-hints ,cl)) ,protocols))
+;; Client configuration
+(defstruct xwem-cl-config
+ selected-p
+ xwin-id
+ command
+ manage-type
+ properties)
+
;;;; Minibuffer
(defstruct xwem-minib
@@ -675,6 +683,11 @@
(XDeleteProperty (xwem-dpy) ,xwin
(XInternAtom (xwem-dpy) ,prop-atom-string))))
+;;; XSendEvent workaround
+(defmacro xwem-XSendEvent (dpy win propagate ev-mask event-native event-ffi)
+ (if (featurep 'ffi-xlib)
+ `(XSendEvent ,dpy ,win ,propagate ,ev-mask ,event-ffi)
+ `(XSendEvent ,dpy ,win ,propagate ,ev-mask ,event-native)))
(provide 'xwem-struct)
|