xwem-patches
[Top] [All Lists]

Summary for xwem--main--2.2--patch-1

From: Zajcev Evgeny <lg@xxxxxxxx>
Subject: Summary for xwem--main--2.2--patch-1
Date: Tue, 7 Mar 2006 02:26:59 +0300
Sender: xwem-patches-bounces@xxxxxxxx
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)
 



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