#!/usr/bin/python2.4
########################################################################
#
# Time-stamp: <2006-06-07 13:53:24 Jeremy Hankins>
#
# TODO:
#
#    - mount wmiifs?
#
#    - Native monitors?
#
########################################################################

import modwmii, time, subprocess, os, sys

# {{{ Variables

key_mod   = 'Mod4'
key_up    = 'k'
key_down  = 'j'
key_left  = 'h'
key_right = 'l' 

font = '-misc-fixed-bold-r-normal--*-140-*-*-*-*-iso10646-1'

clr_dim_green = '#AACCAA #333333 #336633'
clr_act_green = '#AACCAA #111111 #336633'
clr_dim_blue  = '#AAAACC #333333 #333366'
clr_act_blue  = '#AAAACC #111111 #333366'
clr_dim_red   = '#CCAAAA #333333 #663333'
clr_act_red   = '#CCAAAA #111111 #663333'

clr_normal = clr_dim_green
clr_select = clr_act_red
clr_bar    = clr_act_blue

tag_rules = """/XMMS.*/ -> ~
/Gimp.*/ -> ~
/MPlayer.*/ -> ~
/wm.*/ -> ~
/qw.exe.*/ -> quicken
/Firefox-bin.*/ -> www
/.*/ -> !
/.*/ -> main
"""

wmiidir_priv = os.environ["HOME"] + "/.wmii-3"
wmiidir_glob = "/etc/X11/wmii-3"

# Order is important:
wmiidirs = (wmiidir_priv, wmiidir_glob)

# }}}
# {{{ Key bindings

# These strings are eval'd on Key events.  Would it make sense to compile them?

mod_keys = {
    key_left  : 'wm.write("/view/ctl", "select prev")',
    key_right : 'wm.write("/view/ctl", "select next")',
    key_up    : 'wm.write("/view/sel/ctl", "select prev")',
    key_down  : 'wm.write("/view/sel/ctl", "select next")',
    "space"   : 'wm.write("/view/ctl", "select toggle")',
    "d"       : 'wm.write("/view/sel/mode", "default")',
    "s"       : 'wm.write("/view/sel/mode", "stack")',
    "m"       : 'wm.write("/view/sel/mode", "max")',
    "a"       : 'wm.run_menu(wm.proglist(wmiidirs), path = "%s:%s:" % wmiidirs + os.environ["PATH"])',
    "r"       : 'wm.run_menu(wm.proglist(os.environ["PATH"].split(":")))',
    "g"       : 'wm.write("/ctl", "view %s" % wm.menu(wm.read("/tags")))',
    "t"       : 'wm.show_class(r"^Emacs:", "wmiisetsid emacs")',
    "w"       : 'wm.show_class(r"^Firefox-bin:", "wmiisetsid firefox")',
    "c"       : 'wm.show_title(r"^shell$", "wmiisetsid myterm -title shell")',
    "x"       : 'wm.bg("wmiisetsid xscreensaver-command -lock")',
    "Up"      : 'wm.bg("wmiisetsid amixer set Master 5%+ >/dev/null 2>&1")',
    "Down"    : 'wm.bg("wmiisetsid amixer set Master 5%- >/dev/null 2>&1")'
    }

mod_shift_keys = {
    key_left  : 'wm.write("/view/sel/sel/ctl", "sendto prev")',
    key_right : 'wm.write("/view/sel/sel/ctl", "sendto next")',
    key_up    : 'wm.write("/view/sel/sel/ctl", "swap up")',
    key_down  : 'wm.write("/view/sel/sel/ctl", "swap down")',
    "space"   : 'wm.write("/view/sel/sel/ctl", "sendto toggle")',
    "c"       : 'wm.write("/view/sel/sel/ctl", "kill")',
    "t"       : 'wm.write("/view/sel/sel/tags", wm.menu(wm.read("/tags")))'
    }

mod_ctrl_keys = {
    key_left  : 'wm.write("/view/sel/sel/ctl", "swap prev")',
    key_right : 'wm.write("/view/sel/sel/ctl", "swap next")',
    key_up    : 'wm.write("/view/sel/sel/ctl", "swap up")',
    key_down  : 'wm.write("/view/sel/sel/ctl", "swap down")'
    }

# }}}
# {{{ Utility functions

# Having the time on messages is sometimes useful for debugging...

def warn(message):
    """ Print a warning to stderr, with timestamp.
    """
    stamp = time.strftime("%T")
    print >>sys.stderr, "%s: %s" % (stamp, message)

# }}}
# {{{ Initialize

wm = modwmii.wmii()

sucess = False
while not sucess:
    try:
        wm.write("/event", "Start wmiirc\n")
        sucess = True
    except wmiiError:
        time.sleep(1)

events = wm.event()

# }}}
# {{{ WM settings

# Some subprocesses (e.g., status monitors & wmiimenu) use these:
os.environ['WMII_FONT'] = font
os.environ['WMII_NORMCOLORS'] = clr_normal
os.environ['WMII_SELCOLORS'] = clr_select
os.environ['WMII_BARCOLORS'] = clr_bar

os.environ['DIM_GREEN'] = clr_dim_green
os.environ['ACT_GREEN'] = clr_act_green
os.environ['DIM_BLUE'] = clr_dim_blue
os.environ['ACT_BLUE'] = clr_act_blue
os.environ['DIM_RED'] = clr_dim_red
os.environ['ACT_RED'] = clr_act_red

subprocess.call(("xsetroot", "-solid", "#333333"))

wm.write("/def/border", "2")
wm.write("/def/font", font)
wm.write("/def/selcolors", clr_select)
wm.write("/def/normcolors", clr_normal)
wm.write("/def/colmode", "stack")
wm.write("/def/colwidth", "0")
wm.write("/def/rules", tag_rules)

wm.write("/def/grabmod", key_mod)
wm.write("/def/keys",
         "\n".join(map(lambda s: "-".join([key_mod, s]),
                       mod_keys.keys()) +
                   map(lambda s: "-".join([key_mod, "Shift", s]),
                       mod_shift_keys.keys()) +
                   map(lambda s: "-".join([key_mod, "Control", s]),
                       mod_ctrl_keys.keys()) +
                   [""]))

# }}}
# {{{ Monitors

# These should be wait()'ed for -- they spawn zombies.

os.spawnlp(os.P_NOWAIT, "status")
#os.spawnlp(os.P_NOWAIT, "status_mail")
#os.spawnlp(os.P_NOWAIT, "status_dgs")
#os.spawnlp(os.P_NOWAIT, "status_acpi")

# }}}
# {{{ Event loop

while True:
    args = events.read().split()

    if args[0] == "Start" and args[1] == "wmiirc":
        events.close()
        sys.exit(0)

    elif args[0] == "BarClick":
        wm.write("/ctl" "view %s" % args[1])

    elif args[0] == "Key":
        args = args[1].split("-")

        if len(args) == 2:
            eval(mod_keys[args[1]])
        elif args[1] == "Shift":
            eval(mod_shift_keys[args[2]])
        elif args[1] == "Control":
            eval(mod_ctrl_keys[args[2]])


# }}}

# Local Variables:
# folded-file:t
# End:

