aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/keys.lua172
-rw-r--r--src/Keys.cc122
2 files changed, 170 insertions, 124 deletions
diff --git a/data/keys.lua b/data/keys.lua
index aa21145..2c526be 100644
--- a/data/keys.lua
+++ b/data/keys.lua
@@ -1,137 +1,137 @@
1-- click on the desktop to get menus 1-- click on the desktop to get menus
2default_keymode:addBinding('OnDesktop Mouse1', 'HideMenus') 2default_keymode['OnDesktop Mouse1'] = 'HideMenus'
3default_keymode:addBinding('OnDesktop Mouse2', 'WorkspaceMenu') 3default_keymode['OnDesktop Mouse2'] = 'WorkspaceMenu'
4default_keymode:addBinding('OnDesktop Mouse3', 'RootMenu') 4default_keymode['OnDesktop Mouse3'] = 'RootMenu'
5 5
6-- scroll on the desktop to change workspaces 6-- scroll on the desktop to change workspaces
7default_keymode:addBinding('OnDesktop Mouse4', 'PrevWorkspace') 7default_keymode['OnDesktop Mouse4'] = 'PrevWorkspace'
8default_keymode:addBinding('OnDesktop Mouse5', 'NextWorkspace') 8default_keymode['OnDesktop Mouse5'] = 'NextWorkspace'
9 9
10-- scroll on the toolbar to change current window 10-- scroll on the toolbar to change current window
11default_keymode:addBinding('OnToolbar Mouse4', 'PrevWindow {static groups} (iconhidden=no)') 11default_keymode['OnToolbar Mouse4'] = 'PrevWindow {static groups} (iconhidden=no)'
12default_keymode:addBinding('OnToolbar Mouse5', 'NextWindow {static groups} (iconhidden=no)') 12default_keymode['OnToolbar Mouse5'] = 'NextWindow {static groups} (iconhidden=no)'
13 13
14-- alt + left/right click to move/resize a window 14-- alt + left/right click to move/resize a window
15default_keymode:addBinding('OnWindow Mod1 Mouse1', 'MacroCmd {Raise} {Focus} {StartMoving}') 15default_keymode['OnWindow Mod1 Mouse1'] = 'MacroCmd {Raise} {Focus} {StartMoving}'
16default_keymode:addBinding('OnWindowBorder Move1', 'StartMoving') 16default_keymode['OnWindowBorder Move1'] = 'StartMoving'
17 17
18default_keymode:addBinding('OnWindow Mod1 Mouse3', 'MacroCmd {Raise} {Focus} {StartResizing NearestCorner}') 18default_keymode['OnWindow Mod1 Mouse3'] = 'MacroCmd {Raise} {Focus} {StartResizing NearestCorner}'
19default_keymode:addBinding('OnLeftGrip Move1', 'StartResizing bottomleft') 19default_keymode['OnLeftGrip Move1'] = 'StartResizing bottomleft'
20default_keymode:addBinding('OnRightGrip Move1', 'StartResizing bottomright') 20default_keymode['OnRightGrip Move1'] = 'StartResizing bottomright'
21 21
22-- alt + middle click to lower the window 22-- alt + middle click to lower the window
23default_keymode:addBinding('OnWindow Mod1 Mouse2', 'Lower') 23default_keymode['OnWindow Mod1 Mouse2'] = 'Lower'
24 24
25-- control-click a window's titlebar and drag to attach windows 25-- control-click a window's titlebar and drag to attach windows
26default_keymode:addBinding('OnTitlebar Control Mouse1', 'StartTabbing') 26default_keymode['OnTitlebar Control Mouse1'] = 'StartTabbing'
27 27
28-- double click on the titlebar to shade 28-- double click on the titlebar to shade
29default_keymode:addBinding('OnTitlebar Double Mouse1', 'Shade') 29default_keymode['OnTitlebar Double Mouse1'] = 'Shade'
30 30
31-- left click on the titlebar to move the window 31-- left click on the titlebar to move the window
32default_keymode:addBinding('OnTitlebar Mouse1', 'MacroCmd {Raise} {Focus} {ActivateTab}') 32default_keymode['OnTitlebar Mouse1'] = 'MacroCmd {Raise} {Focus} {ActivateTab}'
33default_keymode:addBinding('OnTitlebar Move1 ', 'StartMoving') 33default_keymode['OnTitlebar Move1 '] = 'StartMoving'
34 34
35-- middle click on the titlebar to lower 35-- middle click on the titlebar to lower
36default_keymode:addBinding('OnTitlebar Mouse2', 'Lower') 36default_keymode['OnTitlebar Mouse2'] = 'Lower'
37 37
38-- right click on the titlebar for a menu of options 38-- right click on the titlebar for a menu of options
39default_keymode:addBinding('OnTitlebar Mouse3', 'WindowMenu') 39default_keymode['OnTitlebar Mouse3'] = 'WindowMenu'
40 40
41-- alt-tab 41-- alt-tab
42default_keymode:addBinding('Mod1 Tab', 'NextWindow {groups} (workspace=[current])') 42default_keymode['Mod1 Tab'] = 'NextWindow {groups} (workspace=[current])'
43default_keymode:addBinding('Mod1 Shift Tab', 'PrevWindow {groups} (workspace=[current])') 43default_keymode['Mod1 Shift Tab'] = 'PrevWindow {groups} (workspace=[current])'
44 44
45-- cycle through tabs in the current window 45-- cycle through tabs in the current window
46default_keymode:addBinding('Mod4 Tab', 'NextTab') 46default_keymode['Mod4 Tab'] = 'NextTab'
47default_keymode:addBinding('Mod4 Shift Tab', 'PrevTab') 47default_keymode['Mod4 Shift Tab'] = 'PrevTab'
48 48
49-- go to a specific tab in the current window 49-- go to a specific tab in the current window
50default_keymode:addBinding('Mod4 1', 'Tab 1') 50default_keymode['Mod4 1'] = 'Tab 1'
51default_keymode:addBinding('Mod4 2', 'Tab 2') 51default_keymode['Mod4 2'] = 'Tab 2'
52default_keymode:addBinding('Mod4 3', 'Tab 3') 52default_keymode['Mod4 3'] = 'Tab 3'
53default_keymode:addBinding('Mod4 4', 'Tab 4') 53default_keymode['Mod4 4'] = 'Tab 4'
54default_keymode:addBinding('Mod4 5', 'Tab 5') 54default_keymode['Mod4 5'] = 'Tab 5'
55default_keymode:addBinding('Mod4 6', 'Tab 6') 55default_keymode['Mod4 6'] = 'Tab 6'
56default_keymode:addBinding('Mod4 7', 'Tab 7') 56default_keymode['Mod4 7'] = 'Tab 7'
57default_keymode:addBinding('Mod4 8', 'Tab 8') 57default_keymode['Mod4 8'] = 'Tab 8'
58default_keymode:addBinding('Mod4 9', 'Tab 9') 58default_keymode['Mod4 9'] = 'Tab 9'
59 59
60-- open a terminal 60-- open a terminal
61default_keymode:addBinding('Mod1 F1', 'Exec xterm') 61default_keymode['Mod1 F1'] = 'Exec xterm'
62 62
63-- open a dialog to run programs 63-- open a dialog to run programs
64default_keymode:addBinding('Mod1 F2', 'Exec fbrun') 64default_keymode['Mod1 F2'] = 'Exec fbrun'
65 65
66-- volume settings, using common keycodes 66-- volume settings, using common keycodes
67-- if these don't work, use xev to find out your real keycodes 67-- if these don't work, use xev to find out your real keycodes
68default_keymode:addBinding('176', 'Exec amixer sset Master,0 1+') 68default_keymode['176'] = 'Exec amixer sset Master,0 1+'
69default_keymode:addBinding('174', 'Exec amixer sset Master,0 1-') 69default_keymode['174'] = 'Exec amixer sset Master,0 1-'
70default_keymode:addBinding('160', 'Exec amixer sset Master,0 toggle') 70default_keymode['160'] = 'Exec amixer sset Master,0 toggle'
71 71
72-- current window commands 72-- current window commands
73default_keymode:addBinding('Mod1 F4', 'Close') 73default_keymode['Mod1 F4'] = 'Close'
74default_keymode:addBinding('Mod1 F5', 'Kill') 74default_keymode['Mod1 F5'] = 'Kill'
75default_keymode:addBinding('Mod1 F9', 'Minimize') 75default_keymode['Mod1 F9'] = 'Minimize'
76default_keymode:addBinding('Mod1 F10', 'Maximize') 76default_keymode['Mod1 F10'] = 'Maximize'
77default_keymode:addBinding('Mod1 F11', 'Fullscreen') 77default_keymode['Mod1 F11'] = 'Fullscreen'
78 78
79-- open the window menu 79-- open the window menu
80default_keymode:addBinding('Mod1 space', 'WindowMenu') 80default_keymode['Mod1 space'] = 'WindowMenu'
81 81
82-- exit fluxbox 82-- exit fluxbox
83default_keymode:addBinding('Control Mod1 Delete', 'Exit') 83default_keymode['Control Mod1 Delete'] = 'Exit'
84 84
85-- change to previous/next workspace 85-- change to previous/next workspace
86default_keymode:addBinding('Control Mod1 Left', 'PrevWorkspace') 86default_keymode['Control Mod1 Left'] = 'PrevWorkspace'
87default_keymode:addBinding('Control Mod1 Right', 'NextWorkspace') 87default_keymode['Control Mod1 Right'] = 'NextWorkspace'
88 88
89-- send the current window to previous/next workspace 89-- send the current window to previous/next workspace
90default_keymode:addBinding('Mod4 Left', 'SendToPrevWorkspace') 90default_keymode['Mod4 Left'] = 'SendToPrevWorkspace'
91default_keymode:addBinding('Mod4 Right', 'SendToNextWorkspace') 91default_keymode['Mod4 Right'] = 'SendToNextWorkspace'
92 92
93-- send the current window and follow it to previous/next workspace 93-- send the current window and follow it to previous/next workspace
94default_keymode:addBinding('Control Mod4 Left', 'TakeToPrevWorkspace') 94default_keymode['Control Mod4 Left'] = 'TakeToPrevWorkspace'
95default_keymode:addBinding('Control Mod4 Right', 'TakeToNextWorkspace') 95default_keymode['Control Mod4 Right'] = 'TakeToNextWorkspace'
96 96
97-- change to a specific workspace 97-- change to a specific workspace
98default_keymode:addBinding('Control F1', 'Workspace 1') 98default_keymode['Control F1'] = 'Workspace 1'
99default_keymode:addBinding('Control F2', 'Workspace 2') 99default_keymode['Control F2'] = 'Workspace 2'
100default_keymode:addBinding('Control F3', 'Workspace 3') 100default_keymode['Control F3'] = 'Workspace 3'
101default_keymode:addBinding('Control F4', 'Workspace 4') 101default_keymode['Control F4'] = 'Workspace 4'
102default_keymode:addBinding('Control F5', 'Workspace 5') 102default_keymode['Control F5'] = 'Workspace 5'
103default_keymode:addBinding('Control F6', 'Workspace 6') 103default_keymode['Control F6'] = 'Workspace 6'
104default_keymode:addBinding('Control F7', 'Workspace 7') 104default_keymode['Control F7'] = 'Workspace 7'
105default_keymode:addBinding('Control F8', 'Workspace 8') 105default_keymode['Control F8'] = 'Workspace 8'
106default_keymode:addBinding('Control F9', 'Workspace 9') 106default_keymode['Control F9'] = 'Workspace 9'
107default_keymode:addBinding('Control F10', 'Workspace 10') 107default_keymode['Control F10'] = 'Workspace 10'
108default_keymode:addBinding('Control F11', 'Workspace 11') 108default_keymode['Control F11'] = 'Workspace 11'
109default_keymode:addBinding('Control F12', 'Workspace 12') 109default_keymode['Control F12'] = 'Workspace 12'
110 110
111-- send the current window to a specific workspace 111-- send the current window to a specific workspace
112default_keymode:addBinding('Mod4 F1', 'SendToWorkspace 1') 112default_keymode['Mod4 F1'] = 'SendToWorkspace 1'
113default_keymode:addBinding('Mod4 F2', 'SendToWorkspace 2') 113default_keymode['Mod4 F2'] = 'SendToWorkspace 2'
114default_keymode:addBinding('Mod4 F3', 'SendToWorkspace 3') 114default_keymode['Mod4 F3'] = 'SendToWorkspace 3'
115default_keymode:addBinding('Mod4 F4', 'SendToWorkspace 4') 115default_keymode['Mod4 F4'] = 'SendToWorkspace 4'
116default_keymode:addBinding('Mod4 F5', 'SendToWorkspace 5') 116default_keymode['Mod4 F5'] = 'SendToWorkspace 5'
117default_keymode:addBinding('Mod4 F6', 'SendToWorkspace 6') 117default_keymode['Mod4 F6'] = 'SendToWorkspace 6'
118default_keymode:addBinding('Mod4 F7', 'SendToWorkspace 7') 118default_keymode['Mod4 F7'] = 'SendToWorkspace 7'
119default_keymode:addBinding('Mod4 F8', 'SendToWorkspace 8') 119default_keymode['Mod4 F8'] = 'SendToWorkspace 8'
120default_keymode:addBinding('Mod4 F9', 'SendToWorkspace 9') 120default_keymode['Mod4 F9'] = 'SendToWorkspace 9'
121default_keymode:addBinding('Mod4 F10', 'SendToWorkspace 10') 121default_keymode['Mod4 F10'] = 'SendToWorkspace 10'
122default_keymode:addBinding('Mod4 F11', 'SendToWorkspace 11') 122default_keymode['Mod4 F11'] = 'SendToWorkspace 11'
123default_keymode:addBinding('Mod4 F12', 'SendToWorkspace 12') 123default_keymode['Mod4 F12'] = 'SendToWorkspace 12'
124 124
125-- send the current window and change to a specific workspace 125-- send the current window and change to a specific workspace
126default_keymode:addBinding('Control Mod4 F1', 'TakeToWorkspace 1') 126default_keymode['Control Mod4 F1'] = 'TakeToWorkspace 1'
127default_keymode:addBinding('Control Mod4 F2', 'TakeToWorkspace 2') 127default_keymode['Control Mod4 F2'] = 'TakeToWorkspace 2'
128default_keymode:addBinding('Control Mod4 F3', 'TakeToWorkspace 3') 128default_keymode['Control Mod4 F3'] = 'TakeToWorkspace 3'
129default_keymode:addBinding('Control Mod4 F4', 'TakeToWorkspace 4') 129default_keymode['Control Mod4 F4'] = 'TakeToWorkspace 4'
130default_keymode:addBinding('Control Mod4 F5', 'TakeToWorkspace 5') 130default_keymode['Control Mod4 F5'] = 'TakeToWorkspace 5'
131default_keymode:addBinding('Control Mod4 F6', 'TakeToWorkspace 6') 131default_keymode['Control Mod4 F6'] = 'TakeToWorkspace 6'
132default_keymode:addBinding('Control Mod4 F7', 'TakeToWorkspace 7') 132default_keymode['Control Mod4 F7'] = 'TakeToWorkspace 7'
133default_keymode:addBinding('Control Mod4 F8', 'TakeToWorkspace 8') 133default_keymode['Control Mod4 F8'] = 'TakeToWorkspace 8'
134default_keymode:addBinding('Control Mod4 F9', 'TakeToWorkspace 9') 134default_keymode['Control Mod4 F9'] = 'TakeToWorkspace 9'
135default_keymode:addBinding('Control Mod4 F10', 'TakeToWorkspace 10') 135default_keymode['Control Mod4 F10'] = 'TakeToWorkspace 10'
136default_keymode:addBinding('Control Mod4 F11', 'TakeToWorkspace 11') 136default_keymode['Control Mod4 F11'] = 'TakeToWorkspace 11'
137default_keymode:addBinding('Control Mod4 F12', 'TakeToWorkspace 12') 137default_keymode['Control Mod4 F12'] = 'TakeToWorkspace 12'
diff --git a/src/Keys.cc b/src/Keys.cc
index aa040b2..f741be6 100644
--- a/src/Keys.cc
+++ b/src/Keys.cc
@@ -147,6 +147,8 @@ public:
147 static void initKeys(FbTk::Lua &l); 147 static void initKeys(FbTk::Lua &l);
148 static int addBinding(lua::state *l); 148 static int addBinding(lua::state *l);
149 static int newKeyMode(lua::state *l); 149 static int newKeyMode(lua::state *l);
150 static int index(lua::state *l);
151 static int newindex(lua::state *l);
150 152
151 bool equalExact(const RefKey &x) { 153 bool equalExact(const RefKey &x) {
152 return type == x->type && key == x->key && context == x->context 154 return type == x->type && key == x->key && context == x->context
@@ -194,7 +196,7 @@ public:
194 static FbTk::Lua::RegisterInitFunction registerInitKeys; 196 static FbTk::Lua::RegisterInitFunction registerInitKeys;
195}; 197};
196 198
197int Keys::t_key::addBinding(lua::state *l) 199int Keys::t_key::newindex(lua::state *l)
198{ 200{
199 l->checkstack(2); 201 l->checkstack(2);
200 202
@@ -203,33 +205,43 @@ int Keys::t_key::addBinding(lua::state *l)
203 205
204 RefKey k = *l->checkudata<RefKey>(1, keymode_metatable); 206 RefKey k = *l->checkudata<RefKey>(1, keymode_metatable);
205 207
206 if(! l->isstring(2)) {
207 throw KeyError(_FB_CONSOLETEXT(Keys, Bad2ndArg, "2nd argument is not a string.",
208 "2nd argument is not a string."));
209 }
210 vector<string> val; 208 vector<string> val;
211 FbTk::StringUtil::stringtok(val, l->tostring(-2).c_str()); 209 FbTk::StringUtil::stringtok(val, l->checkstring(2).c_str());
212 210
213 if(! (l->isstring(3) || l->isfunction(3)) ) { 211 RefKey k2;
214 throw KeyError(_FB_CONSOLETEXT(Keys, Bad3rdArg, "3rd argument is not a command.", 212 try {
215 "3rd argument is not a command.")); 213 k2 = *l->checkudata<RefKey>(3, keymode_metatable);
216 } 214 }
217 FbTk::RefCount<FbTk::Command<void> > cmd; 215 catch(lua::check_error &) {
218 if(l->isstring(3)) 216 k2.reset(new t_key);
219 cmd.reset(FbTk::CommandParser<void>::instance().parse(l->tostring(-1))); 217
220 else { 218 if(l->isstring(3))
221 l->pushvalue(3); 219 k2->m_command.reset(FbTk::CommandParser<void>::instance().parse(l->tostring(-1)));
222 cmd.reset(new FbCommands::LuaCmd(*l)); 220 else if(l->isfunction(3)) {
221 l->pushvalue(3);
222 k2->m_command.reset(new FbCommands::LuaCmd(*l));
223 } else if(l->isnil(3))
224 k2.reset();
225 else {
226 throw KeyError(_FB_CONSOLETEXT(Keys, Bad3rdArg, "3rd argument is not a command.",
227 "3rd argument is not a command."));
228 }
223 } 229 }
224 230
225 FindPair p = k->findBinding(val, true); 231 FindPair p = k->findBinding(val, true);
226 232 if(k2) {
227 k = *p.first; 233 RefKey t = *p.first;
228 k->m_command = cmd; 234 k2->type = t->type;
229 k->keylist.clear(); 235 k2->mod = t->mod;
236 k2->key = t->key;
237 k2->context = t->context;
238 k2->isdouble = t->isdouble;
239 *p.first = k2;
240 } else
241 p.second.keylist.erase(p.first);
230 } 242 }
231 catch(std::runtime_error &e) { 243 catch(std::runtime_error &e) {
232 cerr << "addBinding: " << e.what() << endl; 244 cerr << "keymode newindex: " << e.what() << endl;
233 } 245 }
234 246
235 return 0; 247 return 0;
@@ -244,6 +256,42 @@ int Keys::t_key::newKeyMode(lua::state *l) {
244 } return 1; 256 } return 1;
245} 257}
246 258
259int Keys::t_key::index(lua::state *l) {
260 l->checkstack(2);
261
262 try {
263 l->checkargno(2);
264
265 RefKey k = *l->checkudata<RefKey>(1, keymode_metatable);
266
267 string str = l->checkstring(2);
268
269 if(str == "activate")
270 l->pushfunction(&setKeyModeWrapper);
271 else {
272 vector<string> val;
273 FbTk::StringUtil::stringtok(val, str.c_str());
274
275 FindPair p = k->findBinding(val, false);
276 if(p.first == p.second.keylist.end())
277 l->pushnil();
278 else {
279 l->createuserdata<RefKey>(*p.first); {
280 l->rawgetfield(lua::REGISTRYINDEX, keymode_metatable);
281 l->setmetatable(-2);
282 }
283 }
284
285 }
286 }
287 catch(std::runtime_error &e) {
288 cerr << "keymode index: " << e.what() << endl;
289 l->pushnil();
290 }
291
292 return 1;
293}
294
247void Keys::t_key::initKeys(FbTk::Lua &l) { 295void Keys::t_key::initKeys(FbTk::Lua &l) {
248 l.checkstack(3); 296 l.checkstack(3);
249 lua::stack_sentry s(l); 297 lua::stack_sentry s(l);
@@ -252,13 +300,11 @@ void Keys::t_key::initKeys(FbTk::Lua &l) {
252 l.pushdestructor<RefKey>(); 300 l.pushdestructor<RefKey>();
253 l.rawsetfield(-2, "__gc"); 301 l.rawsetfield(-2, "__gc");
254 302
255 l.newtable(); { 303 l.pushfunction(&index);
256 l.pushfunction(&addBinding); 304 l.rawsetfield(-2, "__index");
257 l.rawsetfield(-2, "addBinding");
258 305
259 l.pushfunction(&setKeyModeWrapper); 306 l.pushfunction(&newindex);
260 l.rawsetfield(-2, "activate"); 307 l.rawsetfield(-2, "__newindex");
261 } l.rawsetfield(-2, "__index");
262 } l.pop(); 308 } l.pop();
263 309
264 newKeyMode(&l); 310 newKeyMode(&l);
@@ -549,18 +595,18 @@ void Keys::loadDefaults(FbTk::Lua &l) {
549 fbdbg<<"Loading default key bindings"<<endl; 595 fbdbg<<"Loading default key bindings"<<endl;
550 596
551 l.loadstring( 597 l.loadstring(
552 "default_keymode:addBinding('OnDesktop Mouse1', 'HideMenus')\n" 598 "default_keymode['OnDesktop Mouse1'] = 'HideMenus'\n"
553 "default_keymode:addBinding('OnDesktop Mouse2', 'WorkspaceMenu')\n" 599 "default_keymode['OnDesktop Mouse2'] = 'WorkspaceMenu'\n"
554 "default_keymode:addBinding('OnDesktop Mouse3', 'RootMenu')\n" 600 "default_keymode['OnDesktop Mouse3'] = 'RootMenu'\n"
555 "default_keymode:addBinding('OnTitlebar Mouse3', 'WindowMenu')\n" 601 "default_keymode['OnTitlebar Mouse3'] = 'WindowMenu'\n"
556 "default_keymode:addBinding('Mod1 OnWindow Mouse1', 'MacroCmd {Focus} {Raise} {StartMoving}')\n" 602 "default_keymode['Mod1 OnWindow Mouse1'] = 'MacroCmd {Focus} {Raise} {StartMoving}'\n"
557 "default_keymode:addBinding('OnTitlebar Mouse1', 'MacroCmd {Focus} {Raise} {ActivateTab}')\n" 603 "default_keymode['OnTitlebar Mouse1'] = 'MacroCmd {Focus} {Raise} {ActivateTab}'\n"
558 "default_keymode:addBinding('OnTitlebar Move1', 'StartMoving')\n" 604 "default_keymode['OnTitlebar Move1'] = 'StartMoving'\n"
559 "default_keymode:addBinding('OnLeftGrip Move1', 'StartResizing bottomleft')\n" 605 "default_keymode['OnLeftGrip Move1'] = 'StartResizing bottomleft'\n"
560 "default_keymode:addBinding('OnRightGrip Move1', 'StartResizing bottomright')\n" 606 "default_keymode['OnRightGrip Move1'] = 'StartResizing bottomright'\n"
561 "default_keymode:addBinding('OnWindowBorder Move1', 'StartMoving')\n" 607 "default_keymode['OnWindowBorder Move1'] = 'StartMoving'\n"
562 "default_keymode:addBinding('Mod1 Tab', 'NextWindow (workspace=[current])')\n" 608 "default_keymode['Mod1 Tab'] = 'NextWindow (workspace=[current])'\n"
563 "default_keymode:addBinding('Mod1 Shift Tab', 'PrevWindow (workspace=[current])')\n" 609 "default_keymode['Mod1 Shift Tab'] = 'PrevWindow (workspace=[current])'\n"
564 ); 610 );
565 l.call(0, 0); 611 l.call(0, 0);
566} 612}