Subject: Re: Patch to allow multiple window names in conditions

From: Norman Yarvin <[email-masked]>
Date: Wed, 2 Jun 2004 04:17:04 -0400

Craig wrote:

>>     Next (Netscape konqueror Mozilla*) WarpToWindow 99 90
>
>This is a nice implementation of an "OR" rule, is there any way of specifying
>and "AND" rule? For example, a rule to match a window with Class "Netscape" 
>and Title "local*". Now that multiple window names can be read, why not
>include one.
>
>For example, i would want these to this expression
>All (Netscape) ThisWindow (local*) ...
>to be reduced to 
>All (Netscape local*)
>
>But this is exactly the syntax used by this patch, hence it means "OR".
>By default, all other conditions must be true, so i propose an alternate
>syntax for window name/class/resource "OR" conditions:
>All (Netscape |konqueror |Mozilla*) ...
>
>Perhaps it's not worth the effort?
>I just thought it was a little counter-intuitive.

Once you add the possibility of "AND" as well as "OR", you get into the
realm of boolean expressions, which require a parser.  For instance, if
someone can write the above, he'd naturally expect to be able to write

	Netscape local* |konqueror |Mozilla*

which presumably would be parsed with the normal boolean precedence, as

	(Netscape AND local*) OR konqueror OR Mozilla*

That sort of parser would be about thirty times as much work for me; and
I figured "OR" was far more useful than "AND" -- it was certainly the
only thing I wanted for my own use.

>This also works well with "not" commands:
>All (Netscape |konqueror |Mozilla* !Opera) ...
>will match all browsers except opera if "!Opera" is read as an "AND NOT"
>(which is subtly different to the patch syntax's implied "OR NOT")

Actually NOTs are all "AND NOT", in the patch; just leave off the '|'s,
and that line'll work fine.  (Yeah, the logic for mixing wanted
window-names with unwanted window-names is a bit confusing; my first
version of the patch, which was implemented differently, simply refused
to accept such mixtures.)  Perhaps a better way of describing it would be
to say that NOTs take priority: if any name with '!' in front of it
matches, then the condition fails, no matter what else matches or doesn't
match.

>I guess one could implement an "OR NOT" rule, but i strongly doubt the 
>usefulness of it.

Yeah, I too figured "AND NOT" was much more useful than "OR NOT".

The way I've used this patch is to program a bunch of hotkeys for
specific windows or classes of windows, and then add one final hotkey for
"all other windows":

Key F1          A  N    Next (CurrentGlobalPage xterm1) goto-window            
Key F2          A  N    Next (CurrentGlobalPage xterm2) goto-window
Key F3          A  N    Next (CurrentGlobalPage xterm3) goto-window
Key F4          A  N    Next (CurrentGlobalPage emacs) goto-window
Key F5          A  N    Next (CurrentGlobalPage Netscape konqueror Mozilla \   
                                                mozilla-bin) goto-window    
Key F6          A  N    Next (CurrentGlobalPage xdvi xpdf Xpdf gv acroread) \
                                                goto-window
Key F7          A  N    Next (CurrentGlobalPage xv ee Gimp) goto-window
Key F8          A  N    Next (CurrentGlobalPage !xterm1 !xterm2 !xterm3 \
                                          !emacs !Netscape !konqueror \
                                          !xdvi !xpdf !gv !acroread !xv !ee \
                                          !Gimp !Mozilla !mozilla-bin) \
                                                goto-window             

>I'd imagine a _full_ implementation of this would require a linked list
>of linked lists so one can specify multiple OR conditions eg.:
>All (Netscape |konqueror  http* |file* !http://www.google*)
>would match all netscape and konqueror windows with titles that start with 
>either http or file but not showing google. Note the "not google" rule needn't
>be applied to a specific list as its evaluation to true anywhere negates the
>rule.

Uh, there you're reversing the normal rule of boolean precedence, which
gives AND a higher precedence than OR.  With the normal rule, that'd be
parsed as

	Netscape OR (konqueror AND http*) OR
			(file* AND NOT http://www.google*)

whereas you want

	(Netscape OR konqueror) AND (http* OR file*) AND NOT http://www.google*

This sort of thing is why I think the only sensible next step would be a
full-blown boolean-expression parser, which would accept parentheses as
well as AND, OR, and NOT operators, and store the boolean expression as a
tree structure.  (No, I'm too lazy to write such a thing; I don't have
any use for it.)

-- 
Norman Yarvin						http://yarchive.net
--
Visit the official FVWM web page at <URL:http://www.fvwm.org/>.
To unsubscribe from the list, send "unsubscribe fvwm-workers" in the
body of a message to [email-masked].
To report problems, send mail to [email-masked]