aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples/data/uzbl/plugins/mode.py
blob: e7705a01d9809b485dd5896476829925fdcc02f3 (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import sys
import re

__export__ = ['set_mode', 'get_mode']

UZBLS = {}

DEFAULTS = {
  'mode': '',
  'default': '',
  'modes': {
    'insert': {
      'forward_keys': True,
      'keycmd_events': False,
      'modcmd_updates': False,
      'indicator': 'I'},
    'command': {
      'forward_keys': False,
      'keycmd_events': True,
      'modcmd_updates': True,
      'indicator': 'C'}}}

_RE_FINDSPACES = re.compile("\s+")


def error(msg):
    sys.stderr.write("mode plugin: error: %s\n" % msg)


def add_instance(uzbl, *args):
    UZBLS[uzbl] = dict(DEFAULTS)


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


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

    return UZBLS[uzbl]


def get_mode_config(uzbl, mode):
    modes = get_mode_dict(uzbl)['modes']
    if mode not in modes:
        modes[mode] = {}

    return modes[mode]


def get_mode(uzbl):
    return get_mode_dict(uzbl)['mode']


def key_press(uzbl, key):
    if key != "Escape":
        return

    set_mode(uzbl)


def set_mode(uzbl, mode=None):
    mode_dict = get_mode_dict(uzbl)
    if mode is None:
        if not mode_dict['default']:
            return error("no default mode to fallback on")

        mode = mode_dict['default']

    config = uzbl.get_config()
    if 'mode' not in config or config['mode'] != mode:
        config['mode'] = mode

    mode_dict['mode'] = mode
    mode_config = get_mode_config(uzbl, mode)

    for (key, value) in mode_config.items():
        if key not in config:
            config[key] = value

        elif config[key] != value:
            config[key] = value

    if 'mode_indicator' not in mode_config:
        config['mode_indicator'] = mode

    uzbl.clear_keycmd()
    uzbl.event("MODE_CHANGED", mode)


def config_changed(uzbl, key, value):
    if key == 'default_mode':
        mode_dict = get_mode_dict(uzbl)
        mode_dict['default'] = value
        if value and not mode_dict['mode']:
            set_mode(uzbl, value)

    elif key == 'mode':
        if not value:
            value = None

        set_mode(uzbl, value)


def mode_config(uzbl, args):

    split = map(unicode.strip, _RE_FINDSPACES.split(args.lstrip(), 1))
    if len(split) != 2:
        return error("invalid MODE_CONFIG syntax: %r" % args)

    mode, set = split
    split = map(unicode.strip, set.split('=', 1))
    if len(split) != 2:
        return error("invalid MODE_CONFIG set command: %r" % args)

    key, value = split
    mode_config = get_mode_config(uzbl, mode)
    mode_config[key] = value

    if get_mode(uzbl) == mode:
        uzbl.set(key, value)


def load_reset(uzbl, *args):
    config = uzbl.get_config()
    if 'reset_on_commit' not in config or config['reset_on_commit'] == '1':
        set_mode(uzbl)


def toggle_modes(uzbl, modes):

    modelist = [s.strip() for s in modes.split(' ') if s]
    if not len(modelist):
        return error("no modes specified to toggle")

    mode_dict = get_mode_dict(uzbl)
    oldmode = mode_dict['mode']
    if oldmode not in modelist:
        return set_mode(uzbl, modelist[0])

    newmode = modelist[(modelist.index(oldmode)+1) % len(modelist)]
    set_mode(uzbl, newmode)


def init(uzbl):

    connects = {'CONFIG_CHANGED': config_changed,
      'INSTANCE_EXIT': del_instance,
      'INSTANCE_START': add_instance,
      'KEY_PRESS': key_press,
      'MODE_CONFIG': mode_config,
      'LOAD_START': load_reset,
      'TOGGLE_MODES': toggle_modes}

    uzbl.connect_dict(connects)