[wmii] wmii-3 configuration - in Ruby

From: Suraj N. Kurapati <skurapat_AT_ucsc.edu>
Date: Fri, 02 Jun 2006 16:17:19 -0700

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello,

I've finally configured wmii-3 to my liking, so I thought I'd share
my configuration (written in Ruby) with the wmii community. Both
files reside in my ~/.wmii-3 directory.

Some enhancements to the default configuration are:

- - Select any client via wmiimenu ("#{MENU}a")

- - Select & sendto views as shown on the bar (see below)

- - Toggle maximization of the current client ("#{SEND}m")

- - Rename an entire view ("#{SEND}r")

- - Cycle to left view ("#{SELECT}comma")

- - Cycle to right view ("#{SELECT}period")

Some differences from the default configuration are:

- - The numeric select ($MODKEY-[0-9]) and sendto
($MODKEY-Shift-[0-9]) shortcuts operate on views shown on the bar,
instead of absolute tag names. They also correspond to the
conventional horizontal arrangement of number keys: 1234567890 (left
to right).

For example, suppose the bar shows two views: [foo][bar]. When you
input the "select 2" shortcut, the [bar] view is selected, instead
of the nonexistent [2] view. Likewise, when you input the "sendto 1"
shortcut, a client is sent to the [foo] view is selected, instead of
the nonexistent [1] view.

When you sendto a nonexistent view, the view is created by wmii, as
expected.

- - The shortcut keys are friendly for a Kinesis Advantage keyboard
with Dvorak layout. :-P

Cheers.

P.S. Many thanks for the great WM! :-)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

iD8DBQFEgMb+mV9O7RYnKMcRAo3kAJ9CH6yEOeo6loROasVEfikO38hphQCfWi1C
yLARlPs/rsLXejCq4yx9X+Q=
=uzGK
-----END PGP SIGNATURE-----

#!/usr/bin/ruby -w
# wmii-3 configuration, written in Ruby.

$: << File.dirname(__FILE__)
require 'wmii'

# WM STARTUP
# give wmiiwm a chance to start and terminate other wmiirc
sleep 1 until Wmii.write('/event', "Start wmiirc\n") == 0

# UI CONFIGURATION
ENV['WMII_FONT'] = '-misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1'
ENV['WMII_SELCOLORS']='#ffffff #285577 #4c7899'
ENV['WMII_NORMCOLORS']='#222222 #eeeeee #666666'

# WM CONFIGURATION
Wmii.write '/def/border', 2
Wmii.write '/def/font', ENV['WMII_FONT']
Wmii.write '/def/selcolors', ENV['WMII_SELCOLORS']
Wmii.write '/def/normcolors', ENV['WMII_NORMCOLORS']
Wmii.write '/def/colmode', 'default'
Wmii.write '/def/colwidth', 0

# TAGGING RULES
Wmii.write '/def/rules', <<EOF
/QEMU.*/ -> ~
/jEdit.*/ -> code
/.*thunderbird.*/ -> mail
/XMMS.*/ -> ~
/Gimp.*/ -> ~
/MPlayer.*/ -> ~
/.*/ -> !
/.*/ -> 1
EOF

# MISC CONFIGURATION
system 'xsetroot -solid "#333333"'
system 'status &'

PROGRAM_MENU = Wmii.findPrograms(*ENV['PATH'].split(':')).join("\n")
ACTION_MENU = Wmii.findPrograms('/home/sun/dry/apps/wmii/etc/wmii-3', '~/.wmii-3').join("\n")

# KEY CONFIGURATION
MODKEY='Mod1'
UP='t'
DOWN='n'
LEFT='h'
RIGHT='s'

SELECT="#{MODKEY}-Control-"
SEND="#{SELECT}m,"
SWAP="#{SELECT}w,"
LAYOUT="#{SELECT}z,"
MENU="#{SELECT}"
PROGRAM="#{SELECT}"

SHORTCUTS = {
        "#{SELECT}#{LEFT}" => proc {Wmii.write '/view/ctl', 'select prev'},
        "#{SELECT}#{RIGHT}" => proc {Wmii.write '/view/ctl', 'select next'},
        "#{SELECT}#{DOWN}" => proc {Wmii.write '/view/sel/ctl', 'select next'},
        "#{SELECT}#{UP}" => proc {Wmii.write '/view/sel/ctl', 'select prev'},
        "#{SELECT}space" => proc {Wmii.write '/view/ctl', 'select toggle'},

        "#{SELECT}comma" => proc {Wmii.cycleView :left},
        "#{SELECT}period" => proc {Wmii.cycleView :right},

        "#{LAYOUT}w" => proc {Wmii.write '/view/sel/mode', 'default'},
        "#{LAYOUT}v" => proc {Wmii.write '/view/sel/mode', 'stack'},
        "#{LAYOUT}m" => proc {Wmii.write '/view/sel/mode', 'max'},
        "#{LAYOUT}z" => proc {Wmii.write '/view/0/sel/geom', '0 0 east south'},

        "#{MENU}i" => proc {system(Wmii.showMenu(ACTION_MENU) << '&')},
        "#{MENU}e" => proc {system(Wmii.showMenu(PROGRAM_MENU) << '&')},
        "#{MENU}v" => proc {Wmii.showView `wmiir read /tags | wmiimenu`},

        "#{MENU}a" => proc do
                # prepare a list of menu choices
                choices = Wmii.read('/client').inject([]) do |acc, id|
                        tags = `wmiir read /client/#{id}/tags`
                        name = `wmiir read /client/#{id}/name`.downcase

                        acc << format("%d. [%s] %s", id, tags, name)
                end

                # show the menu and focus the chosen client
                target = Wmii.showMenu(choices.join("\n"))

                unless target.empty?
                        Wmii.showClient target.scan(/\d+/).first
                end
        end,

        "#{PROGRAM}x" => proc {system 'terminal &'},
        "#{PROGRAM}k" => proc {system 'firefox &'},
        "#{PROGRAM}j" => proc {system 'nautilus --no-desktop &'},

        "#{SEND}#{LEFT}" => proc {Wmii.write '/view/sel/sel/ctl', 'sendto prev'},
        "#{SEND}#{RIGHT}" => proc {Wmii.write '/view/sel/sel/ctl', 'sendto next'},
        "#{SEND}space" => proc {Wmii.write '/view/sel/sel/ctl', 'sendto toggle'},
        "#{SEND}Delete" => proc {Wmii.write '/view/sel/sel/ctl', 'kill'},
        "#{SEND}t" => proc {Wmii.write '/view/sel/sel/tags', `wmiir read /tags | wmiimenu`},

        # toggle maximizing the current client to full screen
        "#{SEND}m" => proc do
                SHORTCUTS["#{SEND}space"].call
                SHORTCUTS["#{LAYOUT}z"].call
        end,

        # rename the current view
        # NOTE: columns & layouts are not preserved
        "#{SEND}r" => proc do
                old = `wmiir read /view/name`
                new = Wmii.showMenu(`wmiir read /tags`)

                unless new.empty?
                        Wmii.renameView old, new
                        Wmii.showView new
                end
        end,

        "#{SWAP}#{LEFT}" => proc {Wmii.write '/view/sel/sel/ctl', 'swap prev'},
        "#{SWAP}#{RIGHT}" => proc {Wmii.write '/view/sel/sel/ctl', 'swap next'},
        "#{SWAP}#{DOWN}" => proc {Wmii.write '/view/sel/sel/ctl', 'swap down'},
        "#{SWAP}#{UP}" => proc {Wmii.write '/view/sel/sel/ctl', 'swap up'},
}

        # keyboard access to views shown as labels on the WM bar
        10.times do |i|
                # associate '1' with the leftmost label, instead of '0'
                k = (i - 1) % 10

                SHORTCUTS["#{SELECT}#{i}"] = proc {Wmii.showView(Wmii.read('/tags')[k] || i)}
                SHORTCUTS["#{SEND}#{i}"] = proc {Wmii.write '/view/sel/sel/tags', (Wmii.read('/tags')[k] || i)}
        end

Wmii.write '/def/grabmod', MODKEY
Wmii.write '/def/keys', SHORTCUTS.keys.join("\n")

# EVENT LOOP
IO.popen('wmiir read /event') do |io|
        while event = io.readline.chomp
                type, arg = event.split

                p event, type, arg if $DEBUG

                case type
                        when 'Start'
                                exit if arg == 'wmiirc'

                        when 'BarClick'
                                Wmii.showView arg

                        when 'Key'
                                SHORTCUTS[arg].call
                end
        end
end

Received on Sat Jun 03 2006 - 01:17:38 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 16:07:37 UTC