1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import os
18 import cPickle
19
20 import libxyz.ui as uilib
21
22 from libxyz.core.plugins import BasePlugin
23 from libxyz.core import UserData
24 from libxyz.core.utils import ustring
25 from libxyz.exceptions import PluginError
26 from libxyz.exceptions import XYZRuntimeError
27
29 """
30 Terminal keycodes handling
31 """
32
33 NAME = u"keycodes"
34 AUTHOR = u"Max E. Kuznecov ~syhpoon <syhpoon@syhpoon.name>"
35 VERSION = u"0.1"
36 NAMESPACE = u"core"
37
38 BRIEF_DESCRIPTION = u"Setup terminal keycodes"
39
40 FULL_DESCRIPTION = u"keycodes plugin is used to properly "\
41 u"configure terminal keycodes.\n"\
42 u"For each terminal type keycodes are stored "\
43 u"independently. Terminal type determined by examining "\
44 u"TERM environment variable."
45
46 HOMEPAGE = u"xyzcmd.syhpoon.name"
47 EVENTS = [("show",
48 "Fires upon showing dialog"),
49 ]
50
52 super(XYZPlugin, self).__init__(xyz)
53
54 self.export(self.learn_keys)
55 self.export(self.delete_keys)
56 self.export(self.get_keys)
57
58 self._keysfile = "keycodes"
59 self._keyssubdir = "data"
60 self._terminal = None
61
62 self._ud = UserData()
63
64 self._keys = uilib.Keys()
65
66 self.keys = (("F1", self._keys.F1),
67 ("F2", self._keys.F2),
68 ("F3", self._keys.F3),
69 ("F4", self._keys.F4),
70 ("F5", self._keys.F5),
71 ("F6", self._keys.F6),
72 ("F7", self._keys.F7),
73 ("F8", self._keys.F8),
74 ("F9", self._keys.F9),
75 ("F10", self._keys.F10),
76 ("F11", self._keys.F11),
77 ("F12", self._keys.F12),
78 ("F13", self._keys.F13),
79 ("F14", self._keys.F14),
80 ("F15", self._keys.F15),
81 ("F16", self._keys.F16),
82 ("F17", self._keys.F17),
83 ("F18", self._keys.F18),
84 ("F19", self._keys.F19),
85 ("F20", self._keys.F20),
86 ("BACKSPACE", self._keys.BACKSPACE),
87 ("END", self._keys.END),
88 ("UP", self._keys.UP),
89 ("DOWN", self._keys.DOWN),
90 ("LEFT", self._keys.LEFT),
91 ("RIGHT", self._keys.RIGHT),
92 ("HOME", self._keys.HOME),
93 ("PAGE UP", self._keys.PAGE_UP),
94 ("PAGE DOWN", self._keys.PAGE_DOWN),
95 ("INSERT", self._keys.INSERT),
96 ("TAB", self._keys.TAB),
97 )
98
99
100
102 self._terminal = os.getenv("TERM") or "DEFAULT"
103
104
105
107 """
108 Show LearnKeys dialog
109 """
110
111 self.fire_event("show")
112 _title = _(u"%s - %s" % (self.NAME, self.VERSION))
113
114 _pressed = self._load_data()
115
116 if self._terminal not in _pressed:
117 _pressed[self._terminal] = {}
118
119 _msg = _(u"Please press key %s\nPress ENTER to skip key\n"\
120 u"Press ESCAPE to quit dialog")
121
122 for _label, _key in self.keys:
123 _m = _msg % _label
124 _p = uilib.MessageBox(self.xyz, self.xyz.top, _m, _title).show()
125
126 if _p == [] or _p[0] == self._keys.ENTER:
127 continue
128
129 if _p[0] == self._keys.ESCAPE:
130 break
131
132 _cur = _pressed[self._terminal]
133 _tkey = tuple(_p)
134
135 if _p[0] != _key or (_tkey in _cur and tuple(_p[0]) !=_cur[_tkey]):
136 _cur[_tkey] = _key
137
138 _ask_msg = _(u"Save learned keys?")
139
140 if uilib.YesNoBox(self.xyz, self.xyz.top, _ask_msg, _title).show():
141
142 self._save_data(_pressed)
143
144
145
147 """
148 Delete learned keycodes data.
149 If all is True, delete all saved data for all terminal types,
150 otherwise delete only current terminal type data.
151 """
152
153 if all:
154 try:
155 self._ud.delfile(self._keysfile, self._keyssubdir)
156 except XYZRuntimeError, e:
157 pass
158 else:
159 _data = self._load_data()
160
161 if self._terminal in _data:
162 del _data[self._terminal]
163
164 try:
165 self._save_data(_data)
166 except PluginError, e:
167 pass
168
169
170
172 """
173 Return saved keycodes data as dictionary.
174 If all is True, return all saved data for all terminal types,
175 otherwise return only current terminal type data.
176 """
177
178 _data = self._load_data()
179
180 if not all:
181 try:
182 _data = _data[self._terminal]
183 except KeyError:
184 _data = {}
185
186 return _data
187
188
189
191 """
192 Store learned keycodes
193 """
194
195 try:
196 _file = self._ud.openfile(self._keysfile, "wb", self._keyssubdir)
197 except XYZRuntimeError, e:
198 raise PluginError(_(u"Unable to open file: %s" % ustring(str(e))))
199
200 try:
201 cPickle.dump(data, _file)
202 except cPickle.PicklingError:
203 _file.close()
204 raise PluginError(_(u"Unable to save learned data"))
205 else:
206 _file.close()
207
208
209 self.xyz.input.update(data[self._terminal])
210
211
212
214 """
215 Load stored keycodes
216 """
217
218 _data = {}
219
220 try:
221 _file = self._ud.openfile(self._keysfile, "rb", self._keyssubdir)
222 except XYZRuntimeError, e:
223
224 pass
225 else:
226 _data = cPickle.load(_file)
227 _file.close()
228
229 return _data
230