aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples/data/uzbl/scripts/plugins/on_event.py
blob: ccfab4ca91324d4c9ac82064048c1c4c5fdc0537 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
'''Plugin provides arbitrarily binding uzbl events to uzbl commands.
   You can use $1,$2 to refer to the arguments appearing in the relevant event messages

For example:
  request ON_EVENT LINK_HOVER 'set SELECTED_URI = $1'
  this will set the SELECTED_URI variable which you can display in your statusbar
'''

import sys
import re
from event_manager import config

__export__ = ['get_on_events', 'on_event']

UZBLS = {}

def echo(msg):
    if config['verbose']:
        print 'on_event plugin:', msg


def error(msg):
    sys.stderr.write('on_event plugin: error: %s\n' % msg)


def add_instance(uzbl, *args):
    UZBLS[uzbl] = {}


def del_instance(uzbl, *args):
    if uzbl in UZBLS:
        del UZBLS[uzbl]


def get_on_events(uzbl):
    if uzbl not in UZBLS:
        add_instance(uzbl)

    return UZBLS[uzbl]


def expand(cmd, args):
    '''Replaces "%s %s %s.." with "arg1 arg2 arg3..".

    This could be improved by specifing explicitly which argument to substitue
    for what by parsing "$@ $0 $1 $2 $3.." found in the command string.'''

    if '%s' not in cmd or not len(args):
        return cmd

    if len(args) > 1:
        for arg in args:
            cmd = cmd.replace('%s', str(arg), 1)

    else:
        cmd = cmd.replace('%s', str(args[0]))

    return cmd


def event_handler(uzbl, *args, **kargs):
    '''This function handles all the events being watched by various
    on_event definitions and responds accordingly.'''

    events = get_on_events(uzbl)
    event = kargs['on_event']
    if event not in events:
        return

    commands = events[event]
    for cmd in commands:
        cmd = expand(cmd, args)
        uzbl.send(cmd)


def on_event(uzbl, event, cmd):
    '''Add a new event to watch and respond to.'''

    events = get_on_events(uzbl)
    if event not in events:
        uzbl.connect(event, event_handler, on_event=event)
        events[event] = []

    cmds = events[event]
    if cmd not in cmds:
        cmds.append(cmd)


def parse_on_event(uzbl, args):
    '''Parse ON_EVENT events and pass them to the on_event function.

    Syntax: "event ON_EVENT <EVENT_NAME> commands"
    '''

    split = args.split(' ', 1)
    if len(split) != 2:
        return error("invalid ON_EVENT syntax: %r" % args)

    event, cmd = split
    on_event(uzbl, event, cmd)


def init(uzbl):
    connects = {'ON_EVENT': parse_on_event,
      'INSTANCE_START': add_instance,
      'INSTANCE_EXIT': del_instance}

    for (event, handler) in connects.items():
        uzbl.connect(event, handler)