Re: FVWM: How I select windows by name from the keyboard: a recipe

2012-07-24 Thread Thomas Adam
On Sun, Feb 12, 2012 at 02:32:41AM -0500, Chris Siebenmann wrote:
  As a followup to asking about how to do this a while back on the
 mailing list (and then asking a related question more recently), I'm
 sharing with the list how I have put this together.

Have a look at this:

https://github.com/seanpringle/simpleswitcher

It might drastically reduce a lot of the complexity.  :)

-- Thomas Adam



FVWM: How I select windows by name from the keyboard: a recipe

2012-02-11 Thread Chris Siebenmann
 As a followup to asking about how to do this a while back on the
mailing list (and then asking a related question more recently), I'm
sharing with the list how I have put this together.

The goal: allow me to select terminal windows from the keyboard in a
manner similar to searching for text in a browser: hit a key, start
typing a window name, and have some form of autocompletion. I don't
feel the need to do anything clever if several terminal windows have
the same name and I pick it; which window gets selected can be random.

The tools you'll need in addition to FVWM:
- xwininfo for getting window information. I think this is pretty
  standard to have installed.
- dmenu, http://tools.suckless.org/dmenu/, for handling the general
  selection process.
  I have made a patch for dmenu that adds shell-like partial
  autocompletion, which is very useful for this and which my scripts
  assume:
  http://lists.suckless.org/dev/1202/10851.html

I have a core driver script that I call 'term-front':

#!/bin/sh
# Keyboard selection of terminal windows with completion based on window
# name, via dmenu.
# dmenu will appear at the bottom of the screen.

# Generate a list of unique names of terminal windows.
genwins() {
xwininfo -root -tree |
egrep ': \([^)]* (XTerm|Gnome-terminal|9term)\)  [0-9]' |
awk '{print $2}' | sed -e 's/^//' -e 's/:$//' | sort -u
}

# run dmenu to get the answer; exit if dmenu aborted.
win=$(genwins | dmenu -b -P -p win -t) || exit 1

# pass the selected window to my ToWindow function in FVWM.
echo Function ToWindow \$win\ | FvwmCommand -c
exit 0

(You may want to customize what font dmenu uses with '-fn ...'. My
actual script runs a frontend script for dmenu that sets the font
and my preferred dmenu colours; I omitted it here for simplicity.)

In my FVWM config file I have the following relevant bits (in addition
to starting the FvwmCommandS module as part of FVWM startup, so that
FvwmCommand works):

# Invoke terminal selection (ie term-front) via F4.
# Stealing F4 may not be to everyone's tastes; customize to suit.
Key F4  A N Exec exec term-front

# Aggregate all terminal windows together by turning on State 2 for them.
Style XTerm   State 2
Style Gnome-terminal  State 2
Style 9term   State 2

# Assist function for window selection via the keyboard.
# Only matches terminal windows (ie windows with State 2 on).
# Invoked as 'Function ToWindow whatever'.
# - if the current window is $0, do nothing
# - if there is no window $0, do nothing.
# - otherwise deiconfy, focus, raise, and warp pointer to window.
DestroyFunc ToWindow
AddToFunc ToWindow
+ I Current (State 2, $0) Break
+ I Next (State 2, $0) ToWindow2

DestroyFunc ToWindow2
AddToFunc ToWindow2
+ I Iconify False
+ I Focus
+ I Raise
+ I WarpToWindow 80 20

A longer writeup of this with more blathering can be found at:
http://utcc.utoronto.ca/~cks/space/blog/unix/FvwmKeyboardWindows
http://utcc.utoronto.ca/~cks/space/blog/unix/FvwmStatesUndertood

You should read both (if you read them at all) because the second
contains a valuable improvement after I finally understood States
right. I have to thank Thomas Adam for finally getting some important
stuff about States through my evidently thick skull.

- cks