Hi Michael,

Great thank to you,
I think now I am near to the thing I was trying.

yes I am utilizing `window-tags.lisp's tags
(but as I have explained what I were trying, I need to run X client A from
using `run-shell-command' type command
and next time similar command fired it will only raise X client A, as it is
client server architecture,

I am capturing `cmd' text  all space remove for  tag and  recognizing its  X
client by its xwin:_NET_WM_PID
property. and associating the X client with tag that I have prepared.)

I am trying
(defcommand run-shell-command-tag (cmd) ((:shell "/bin/sh -c "))
  (run-prog *shell-program* :args (list "-c" cmd) :wait nil))
(add-hook *new-window-hook* #'(lambda (w) (tag-window (remove #\Space
*last-cmd*) w)))
(defcommand-alias texec run-shell-command-tag)

(defun wpid (w)
  (let ((pid (xlib:get-property (window-xwin w) :_NET_WM_PID)))
    (message pid)))

(add-hook *new-window-hook* #'wpid)
!error
But here I am getting

(#pid) fell through ETYPECASE expression, Wanted (string simple-string)
!error, Could someone care to tell me pointer how to handle

(xlib:get-property (window-xwin w) :_NET_WM_PID)) 's value.

How make it simple string or number, or how to treat it.

Regard,
-
On Fri, Jul 31, 2009 at 11:10 AM, Michael Raskin <38a93...@rambler.ru>wrote:

> Sharad Pratap wrote:
> > I am able to find contrib/tags.lisp, I were seen in
> > http://ftp.twaren.net/Unix/NonGNU/stumpwm/stumpwm-latest.tgz
> > and in blitz's github 's stumpwm-latest,
>
> Er. After the Savannah crash Shawn said that the module will be synced
> up once Savannah is back up. It even was in Svannah repo briefly. No
> reasons for choice between contrib/ and src/ were given, but I agree
> that "contrib-by-default" is reasonable.
>
> Now the module is not there. So I attach a copy. Shawn, this copy
> supersedes all the previous ones.
>
> > Please let me know where I can find it, and wanted that when I run exec
> > or run-or-raise
> > with that the new window created I wanted it should be tagged with
> > execution of exec or run-or-raise
> > not manually.
>
> You need a handler for new-window-hook.
>
> (stumpwm:add-hook 'stumpwm:*new-window-hook* 'my-new-window-custos)
>
> You will need to tag the new window with the number of the current group
> in it.
>
> ;; Current file copyright (C) 2009 Michael Raskin
>
> ;;  This file is part of stumpwm.
> ;;
> ;; stumpwm is free software; you can redistribute it and/or modify
> ;; it under the terms of the GNU General Public License as published by
> ;; the Free Software Foundation; either version 2, or (at your option)
> ;; any later version.
>
> ;; stumpwm is distributed in the hope that it will be useful,
> ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
> ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ;; GNU General Public License for more details.
>
> ;; You should have received a copy of the GNU General Public License
> ;; along with this software; see the file COPYING.  If not, write to
> ;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
> ;; Boston, MA 02111-1307 USA
>
> (in-package :stumpwm)
>
> ; Window tags. Window tags are special window properties (stored in X11
> window properties)
> ; that can be used for window manipulations. They can survive temporary WM
> change and allow
> ; more flexible classification of windows than selecting window groups for
> them.
>
> ; String parsing for commands
>
> (defun string-split-by-spaces (x)
>  (if (not x) nil
>    (if (listp x) (mapcar 'string-upcase x)
>      (cl-ppcre:split " " (string-upcase x)))))
>
> ; Basic operations
>
> (defcommand window-tags (&optional (argwin nil)) ()
>            "Show window tags"
>        (let* ((win (or argwin (current-window)))
>               (tags (xlib:get-property (window-xwin win) :STUMPWM_TAGS))
>               (tagstring (utf8-to-string tags))
>               (taglist
>                 (if tags (string-split-by-spaces tagstring) nil)))
>          (if argwin taglist (message "Tags: ~{~%~a~}" taglist))))
>
> (defun (setf window-tags) (newtags &optional (argwin nil))
>  "Set the window tag set for a window"
>        (let*
>          ((win (or argwin (current-window)))
>           (tagstring (format nil "~{~a ~}" (mapcar 'string-upcase
> newtags))))
>          (xlib:change-property (window-xwin win)
>                                :STUMPWM_TAGS
>                                (string-to-utf8 tagstring)
>                                :UTF8_STRING 8)))
>
> (defun clear-tags-if (clearp &optional (argwin nil))
>  "Remove tags matched by predicate"
>  (let*
>    ((win (or argwin (current-window)))
>     (new-tags (remove-if clearp (window-tags win))))
>    (setf (window-tags win) new-tags)))
>
> ; Commands for basic operations
>
> (defcommand clear-tags (&optional (argtags nil) (argwin nil)) (:rest :rest)
>            "Remove specified or all tags"
>            (let*
>              ((tags (string-split-by-spaces argtags))
>               (condition (if tags (lambda(x) (find x tags :test 'equalp))
> (lambda (x) t))))
>              (clear-tags-if condition argwin)))
>
> (defcommand clear-all-tags () ()
>            "Remove all tags and start afresh"
>            (mapcar (lambda(x) (clear-tags nil x)) (screen-windows
> (current-screen))))
>
> (defcommand tag-window (argtag &optional (argwin nil)) ((:rest "Tag to set:
> ") :rest)
>            "Add a tag to current window"
>            (let*
>              ((win (or argwin (current-window)))
>               (tag (string-split-by-spaces argtag)))
>              (setf (window-tags win) (union tag (window-tags win) :test
> 'equalp))))
>
> (defcommand all-tags () ()
>            "List all windows with their tags"
>            (let ((*suppress-echo-timeout* t))
>              (message
>                "Window list: ~{~%~{[ ~a ] ( ~a | ~a | ~a ) ~% ->~{~a,
> ~}~}~}"
>                (mapcar
>                  (lambda(x)
>                    (list
>                      (window-title x)
>                      (window-class x)
>                      (window-res x)
>                      (window-role x)
>                      (window-tags x)))
>                  (screen-windows (current-screen))))))
>
> ; Selection of tags and windows by tags
>
> (defun tags-from (argtags &optional (argwindow nil))
>  "Check whether (current) window has one of the specified tags.
>  Tag T is implicitly assigned to all windows."
>  (let*
>    ((tags (string-split-by-spaces argtags))
>     (window (or argwindow (current-window)))
>     (wtags (union (list "T") (window-tags window) :test 'equalp)))
>    (intersection tags wtags :test 'equalp)))
>
> (defun select-by-tags (argtags &optional (without nil))
>  "Select windows with (without) one of the specified tags
>  (any of the specified tags) from current screen. Tag T
>  is implicitly assigned to every window"
>  (let*
>    ((tags (string-split-by-spaces argtags))
>     (condition (lambda(w) (tags-from tags w)))
>     (windows (screen-windows (current-screen))))
>    (if without
>      (remove-if condition windows)
>      (remove-if-not condition windows))))
>
> ; Window manipulations using tags
>
> ; General function
>
> (defun move-windows-to-group (windows &optional (arggroup nil))
>  "Move all windows from the list to the group"
>  (let*
>    ((group
>       (if (stringp arggroup)
>         (or
>           (find-group (current-screen) arggroup)
>           (add-group (current-screen) arggroup))
>         (or arggroup (current-group)))))
>    (mapcar (lambda (w) (move-window-to-group w group)) windows)))
>
> ; And convenient instances
>
> (defcommand pull-tag (argtag) ((:rest "Tag(s) to pull: "))
>            "Pull all windows with the tag (any of the tags) to current
> group"
>            (move-windows-to-group (select-by-tags (string-split-by-spaces
> argtag))))
>
> (defcommand push-without-tag (argtag) ((:rest "Tag(s) needed to stay in the
> group: "))
>            "Push windows not having the tag (any of the tags) to
> .tag-store"
>            (move-windows-to-group (select-by-tags (string-split-by-spaces
> argtag) T) ".tag-store"))
>
> (defcommand push-tag (argtag) ((:rest "Tag(s) to push: "))
>            "Push windows having the tag (any of the tags) to .tag-store"
>            (move-windows-to-group (select-by-tags (string-split-by-spaces
> argtag)) ".tag-store"))
>
> (defcommand pull+push (argtag) ((:rest "Tag(s) to select: "))
>            "Pull all windows with the tag, push all without"
>            (pull-tag argtag)
>            (push-without-tag argtag))
>
> (defcommand push-window () ()
>            "Push window to tag store"
>            (move-windows-to-group (list (current-window)) ".tag-store"))
>
> ; Manage window numbers by tags..
>
> (defun window-number-from-tag (window)
>  "Find a numeric tag, if any, and parse it"
>  (let*
>    ((tags (window-tags window))
>     (numtag (find-if (lambda(x) (cl-ppcre:scan "^[0-9]+$" x)) tags))
>     (num (and numtag (parse-integer numtag))))
>    num))
>
> (defcommand number-by-tags () ()
>            "Every window tagged <number> will have a chance to have that
> number.
>            The remaining windows will have packed numbers"
>
>            ; First, assign impossible numbers.
>            (mapcar
>              (lambda(x)
>                (setf (window-number x) -1))
>              (group-windows (current-group)))
>            ; Now try to assign numbers to windows holding corresponding
> tags.
>            (mapcar
>              (lambda (x)
>                (let*
>                  ((num (window-number-from-tag x))
>                   (occupied (mapcar 'window-number (group-windows
> (current-group)))))
>                  (if (and num (not (find num occupied)))
>                    (setf (window-number x) num))))
>              (group-windows (current-group)))
>            ; Give up and give smallest numbers possible
>            (repack-window-numbers
>              (mapcar 'window-number
>                      (remove-if-not
>                        (lambda(x) (equalp (window-number x)
> (window-number-from-tag x)))
>                        (group-windows (current-group))))))
>
> (defcommand tag-visible (&optional (argtags nil)) (:rest)
>            "IN-CURRENT-GROUP or another specified tag will be assigned to
> all windows
>            in current group and only to them"
>            (let*
>              (
>               (tags (if (or (equalp argtags "") (not argtags))
> "IN-CURRENT-GROUP" argtags)))
>              (mapcar (lambda (x) (clear-tags tags x)) (screen-windows
> (current-screen)))
>              (mapcar (lambda (x) (tag-window tags x)) (group-windows
> (current-group)))))
>
> (defcommand raise-tag (tag) ((:rest "Tag to pull: "))
>            "Make window current by tag"
>            (let*
>              ((window (car (select-by-tags tag))))
>              (if window
>                (progn
>                  (move-window-to-group window (current-group))
>                  (really-raise-window window)
>                  window)
>                nil)))
>
>
>


-- 
Regard
        (`
        _) h a r a d
_______________________________________________
Stumpwm-devel mailing list
Stumpwm-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/stumpwm-devel

Reply via email to