diff options
author | markt <markt> | 2007-12-13 05:48:00 (GMT) |
---|---|---|
committer | markt <markt> | 2007-12-13 05:48:00 (GMT) |
commit | 8b7464046cea5e521ac46811591b0fce0c45aca1 (patch) | |
tree | 09df752f426a249ae15375a626a98436c8727593 /src/CurrentWindowCmd.cc | |
parent | daca07edafc2e75eb9ee04d35fe80759308a8583 (diff) | |
download | fluxbox-8b7464046cea5e521ac46811591b0fce0c45aca1.zip fluxbox-8b7464046cea5e521ac46811591b0fce0c45aca1.tar.bz2 |
added FbTk::CommandRegistry, decentralized command parsing, and made them auto-register
Diffstat (limited to 'src/CurrentWindowCmd.cc')
-rw-r--r-- | src/CurrentWindowCmd.cc | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/src/CurrentWindowCmd.cc b/src/CurrentWindowCmd.cc index 78f3aa1..33d8e8a 100644 --- a/src/CurrentWindowCmd.cc +++ b/src/CurrentWindowCmd.cc | |||
@@ -31,6 +31,95 @@ | |||
31 | #include "WinClient.hh" | 31 | #include "WinClient.hh" |
32 | 32 | ||
33 | #include "FocusControl.hh" | 33 | #include "FocusControl.hh" |
34 | #include "FbTk/CommandRegistry.hh" | ||
35 | #include "FbTk/stringstream.hh" | ||
36 | #include "FbTk/StringUtil.hh" | ||
37 | |||
38 | #include <string> | ||
39 | #include <vector> | ||
40 | |||
41 | namespace { | ||
42 | |||
43 | FbTk::Command *createCurrentWindowCmd(const std::string &command, | ||
44 | const std::string &args, bool trusted) { | ||
45 | if (command == "minimizewindow" || command == "minimize" || command == "iconify") | ||
46 | return new CurrentWindowCmd(&FluxboxWindow::iconify); | ||
47 | else if (command == "maximizewindow" || command == "maximize") | ||
48 | return new CurrentWindowCmd(&FluxboxWindow::maximizeFull); | ||
49 | else if (command == "maximizevertical") | ||
50 | return new CurrentWindowCmd(&FluxboxWindow::maximizeVertical); | ||
51 | else if (command == "maximizehorizontal") | ||
52 | return new CurrentWindowCmd(&FluxboxWindow::maximizeHorizontal); | ||
53 | else if (command == "raise") | ||
54 | return new CurrentWindowCmd(&FluxboxWindow::raise); | ||
55 | else if (command == "raiselayer") | ||
56 | return new CurrentWindowCmd(&FluxboxWindow::raiseLayer); | ||
57 | else if (command == "lower") | ||
58 | return new CurrentWindowCmd(&FluxboxWindow::lower); | ||
59 | else if (command == "lowerlayer") | ||
60 | return new CurrentWindowCmd(&FluxboxWindow::lowerLayer); | ||
61 | else if (command == "activate" || command == "focus") | ||
62 | return new CurrentWindowCmd((void (FluxboxWindow::*)())&FluxboxWindow::focus); | ||
63 | else if (command == "close") | ||
64 | return new CurrentWindowCmd(&FluxboxWindow::close); | ||
65 | else if (command == "killwindow" || command == "kill") | ||
66 | return new CurrentWindowCmd(&FluxboxWindow::kill); | ||
67 | else if (command == "shade" || command == "shadewindow") | ||
68 | return new CurrentWindowCmd(&FluxboxWindow::shade); | ||
69 | else if (command == "shadeon" ) | ||
70 | return new CurrentWindowCmd(&FluxboxWindow::shadeOn); | ||
71 | else if (command == "shadeoff" ) | ||
72 | return new CurrentWindowCmd(&FluxboxWindow::shadeOff); | ||
73 | else if (command == "stick" || command == "stickwindow") | ||
74 | return new CurrentWindowCmd(&FluxboxWindow::stick); | ||
75 | else if (command == "toggledecor") | ||
76 | return new CurrentWindowCmd(&FluxboxWindow::toggleDecoration); | ||
77 | else if (command == "nexttab") | ||
78 | return new CurrentWindowCmd(&FluxboxWindow::nextClient); | ||
79 | else if (command == "prevtab") | ||
80 | return new CurrentWindowCmd(&FluxboxWindow::prevClient); | ||
81 | else if (command == "movetableft") | ||
82 | return new CurrentWindowCmd(&FluxboxWindow::moveClientLeft); | ||
83 | else if (command == "movetabright") | ||
84 | return new CurrentWindowCmd(&FluxboxWindow::moveClientRight); | ||
85 | else if (command == "detachclient") | ||
86 | return new CurrentWindowCmd(&FluxboxWindow::detachCurrentClient); | ||
87 | else if (command == "windowmenu") | ||
88 | return new CurrentWindowCmd(&FluxboxWindow::popupMenu); | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | REGISTER_COMMAND_PARSER(minimizewindow, createCurrentWindowCmd); | ||
93 | REGISTER_COMMAND_PARSER(minimize, createCurrentWindowCmd); | ||
94 | REGISTER_COMMAND_PARSER(iconify, createCurrentWindowCmd); | ||
95 | REGISTER_COMMAND_PARSER(maximizewindow, createCurrentWindowCmd); | ||
96 | REGISTER_COMMAND_PARSER(maximize, createCurrentWindowCmd); | ||
97 | REGISTER_COMMAND_PARSER(maximizevertical, createCurrentWindowCmd); | ||
98 | REGISTER_COMMAND_PARSER(maximizehorizontal, createCurrentWindowCmd); | ||
99 | REGISTER_COMMAND_PARSER(raise, createCurrentWindowCmd); | ||
100 | REGISTER_COMMAND_PARSER(raiselayer, createCurrentWindowCmd); | ||
101 | REGISTER_COMMAND_PARSER(lower, createCurrentWindowCmd); | ||
102 | REGISTER_COMMAND_PARSER(lowerlayer, createCurrentWindowCmd); | ||
103 | REGISTER_COMMAND_PARSER(activate, createCurrentWindowCmd); | ||
104 | REGISTER_COMMAND_PARSER(focus, createCurrentWindowCmd); | ||
105 | REGISTER_COMMAND_PARSER(close, createCurrentWindowCmd); | ||
106 | REGISTER_COMMAND_PARSER(killwindow, createCurrentWindowCmd); | ||
107 | REGISTER_COMMAND_PARSER(kill, createCurrentWindowCmd); | ||
108 | REGISTER_COMMAND_PARSER(shade, createCurrentWindowCmd); | ||
109 | REGISTER_COMMAND_PARSER(shadewindow, createCurrentWindowCmd); | ||
110 | REGISTER_COMMAND_PARSER(shadeon, createCurrentWindowCmd); | ||
111 | REGISTER_COMMAND_PARSER(shadeoff, createCurrentWindowCmd); | ||
112 | REGISTER_COMMAND_PARSER(stick, createCurrentWindowCmd); | ||
113 | REGISTER_COMMAND_PARSER(stickwindow, createCurrentWindowCmd); | ||
114 | REGISTER_COMMAND_PARSER(toggledecor, createCurrentWindowCmd); | ||
115 | REGISTER_COMMAND_PARSER(nexttab, createCurrentWindowCmd); | ||
116 | REGISTER_COMMAND_PARSER(prevtab, createCurrentWindowCmd); | ||
117 | REGISTER_COMMAND_PARSER(movetableft, createCurrentWindowCmd); | ||
118 | REGISTER_COMMAND_PARSER(movetabright, createCurrentWindowCmd); | ||
119 | REGISTER_COMMAND_PARSER(detachclient, createCurrentWindowCmd); | ||
120 | REGISTER_COMMAND_PARSER(windowmenu, createCurrentWindowCmd); | ||
121 | |||
122 | }; // end anonymous namespace | ||
34 | 123 | ||
35 | void WindowHelperCmd::execute() { | 124 | void WindowHelperCmd::execute() { |
36 | if (WindowCmd<void>::window() || FocusControl::focusedFbWindow()) | 125 | if (WindowCmd<void>::window() || FocusControl::focusedFbWindow()) |
@@ -68,6 +157,44 @@ void CurrentWindowCmd::real_execute() { | |||
68 | (fbwindow().*m_action)(); | 157 | (fbwindow().*m_action)(); |
69 | } | 158 | } |
70 | 159 | ||
160 | namespace { | ||
161 | |||
162 | FbTk::Command *parseIntCmd(const string &command, const string &args, | ||
163 | bool trusted) { | ||
164 | int num = (command == "sethead" ? 0 : 1); | ||
165 | FbTk_istringstream iss(args.c_str()); | ||
166 | iss >> num; | ||
167 | if (command == "sethead") | ||
168 | return new SetHeadCmd(num); | ||
169 | else if (command == "tab") | ||
170 | return new GoToTabCmd(num); | ||
171 | else if (command == "sendtonextworkspace") | ||
172 | return new SendToNextWorkspaceCmd(num); | ||
173 | else if (command == "sendtoprevworkspace") | ||
174 | return new SendToPrevWorkspaceCmd(num); | ||
175 | else if (command == "taketonextworkspace") | ||
176 | return new TakeToNextWorkspaceCmd(num); | ||
177 | else if (command == "taketoprevworkspace") | ||
178 | return new TakeToPrevWorkspaceCmd(num); | ||
179 | else if (command == "sendtoworkspace") | ||
180 | // workspaces appear 1-indexed to the user, hence the minus 1 | ||
181 | return new SendToWorkspaceCmd(num-1); | ||
182 | else if (command == "taketoworkspace") | ||
183 | return new TakeToWorkspaceCmd(num-1); | ||
184 | return 0; | ||
185 | } | ||
186 | |||
187 | REGISTER_COMMAND_PARSER(sethead, parseIntCmd); | ||
188 | REGISTER_COMMAND_PARSER(tab, parseIntCmd); | ||
189 | REGISTER_COMMAND_PARSER(sendtonextworkspace, parseIntCmd); | ||
190 | REGISTER_COMMAND_PARSER(sendtoprevworkspace, parseIntCmd); | ||
191 | REGISTER_COMMAND_PARSER(taketonextworkspace, parseIntCmd); | ||
192 | REGISTER_COMMAND_PARSER(taketoprevworkspace, parseIntCmd); | ||
193 | REGISTER_COMMAND_PARSER(sendtoworkspace, parseIntCmd); | ||
194 | REGISTER_COMMAND_PARSER(taketoworkspace, parseIntCmd); | ||
195 | |||
196 | }; // end anonymous namespace | ||
197 | |||
71 | void SetHeadCmd::real_execute() { | 198 | void SetHeadCmd::real_execute() { |
72 | fbwindow().setOnHead(m_head); | 199 | fbwindow().setOnHead(m_head); |
73 | } | 200 | } |
@@ -127,6 +254,8 @@ void GoToTabCmd::real_execute() { | |||
127 | (*it)->focus(); | 254 | (*it)->focus(); |
128 | } | 255 | } |
129 | 256 | ||
257 | REGISTER_COMMAND(startmoving, StartMovingCmd); | ||
258 | |||
130 | void StartMovingCmd::real_execute() { | 259 | void StartMovingCmd::real_execute() { |
131 | const XEvent &last = Fluxbox::instance()->lastEvent(); | 260 | const XEvent &last = Fluxbox::instance()->lastEvent(); |
132 | if (last.type == ButtonPress) { | 261 | if (last.type == ButtonPress) { |
@@ -135,6 +264,41 @@ void StartMovingCmd::real_execute() { | |||
135 | } | 264 | } |
136 | } | 265 | } |
137 | 266 | ||
267 | FbTk::Command *StartResizingCmd::parse(const string &cmd, const string &args, | ||
268 | bool trusted) { | ||
269 | FluxboxWindow::ResizeModel mode = FluxboxWindow::DEFAULTRESIZE; | ||
270 | std::vector<string> tokens; | ||
271 | FbTk::StringUtil::stringtok<std::vector<string> >(tokens, args); | ||
272 | if (!tokens.empty()) { | ||
273 | string arg = FbTk::StringUtil::toLower(tokens[0]); | ||
274 | if (arg == "nearestcorner") | ||
275 | mode = FluxboxWindow::QUADRANTRESIZE; | ||
276 | else if (arg == "nearestedge") | ||
277 | mode = FluxboxWindow::NEARESTEDGERESIZE; | ||
278 | else if (arg == "center") | ||
279 | mode = FluxboxWindow::CENTERRESIZE; | ||
280 | else if (arg == "topleft") | ||
281 | mode = FluxboxWindow::TOPLEFTRESIZE; | ||
282 | else if (arg == "top") | ||
283 | mode = FluxboxWindow::TOPRESIZE; | ||
284 | else if (arg == "topright") | ||
285 | mode = FluxboxWindow::TOPRIGHTRESIZE; | ||
286 | else if (arg == "left") | ||
287 | mode = FluxboxWindow::LEFTRESIZE; | ||
288 | else if (arg == "right") | ||
289 | mode = FluxboxWindow::RIGHTRESIZE; | ||
290 | else if (arg == "bottomleft") | ||
291 | mode = FluxboxWindow::BOTTOMLEFTRESIZE; | ||
292 | else if (arg == "bottom") | ||
293 | mode = FluxboxWindow::BOTTOMRESIZE; | ||
294 | else if (arg == "bottomright") | ||
295 | mode = FluxboxWindow::BOTTOMRIGHTRESIZE; | ||
296 | } | ||
297 | return new StartResizingCmd(mode); | ||
298 | } | ||
299 | |||
300 | REGISTER_COMMAND_PARSER(startresizing, StartResizingCmd::parse); | ||
301 | |||
138 | void StartResizingCmd::real_execute() { | 302 | void StartResizingCmd::real_execute() { |
139 | const XEvent &last = Fluxbox::instance()->lastEvent(); | 303 | const XEvent &last = Fluxbox::instance()->lastEvent(); |
140 | if (last.type == ButtonPress) { | 304 | if (last.type == ButtonPress) { |
@@ -147,6 +311,33 @@ void StartResizingCmd::real_execute() { | |||
147 | } | 311 | } |
148 | } | 312 | } |
149 | 313 | ||
314 | FbTk::Command *MoveCmd::parse(const string &command, const string &args, | ||
315 | bool trusted) { | ||
316 | FbTk_istringstream is(args.c_str()); | ||
317 | int dx = 0, dy = 0; | ||
318 | is >> dx >> dy; | ||
319 | |||
320 | if (command == "moveright") | ||
321 | dy = 0; | ||
322 | else if (command == "moveleft") { | ||
323 | dy = 0; | ||
324 | dx = -dx; | ||
325 | } else if (command == "movedown") { | ||
326 | dy = dx; | ||
327 | dx = 0; | ||
328 | } else if (command == "moveup") { | ||
329 | dy = -dx; | ||
330 | dx = 0; | ||
331 | } | ||
332 | return new MoveCmd(dx, dy); | ||
333 | } | ||
334 | |||
335 | REGISTER_COMMAND_PARSER(move, MoveCmd::parse); | ||
336 | REGISTER_COMMAND_PARSER(moveright, MoveCmd::parse); | ||
337 | REGISTER_COMMAND_PARSER(moveleft, MoveCmd::parse); | ||
338 | REGISTER_COMMAND_PARSER(moveup, MoveCmd::parse); | ||
339 | REGISTER_COMMAND_PARSER(movedown, MoveCmd::parse); | ||
340 | |||
150 | MoveCmd::MoveCmd(const int step_size_x, const int step_size_y) : | 341 | MoveCmd::MoveCmd(const int step_size_x, const int step_size_y) : |
151 | m_step_size_x(step_size_x), m_step_size_y(step_size_y) { } | 342 | m_step_size_x(step_size_x), m_step_size_y(step_size_y) { } |
152 | 343 | ||
@@ -156,6 +347,28 @@ void MoveCmd::real_execute() { | |||
156 | fbwindow().y() + m_step_size_y); | 347 | fbwindow().y() + m_step_size_y); |
157 | } | 348 | } |
158 | 349 | ||
350 | FbTk::Command *ResizeCmd::parse(const string &command, const string &args, | ||
351 | bool trusted) { | ||
352 | FbTk_istringstream is(args.c_str()); | ||
353 | int dx = 0, dy = 0; | ||
354 | is >> dx >> dy; | ||
355 | if (command == "resizehorizontal") | ||
356 | dy = 0; | ||
357 | else if (command == "resizevertical") { | ||
358 | dy = dx; | ||
359 | dx = 0; | ||
360 | } | ||
361 | |||
362 | if (command == "resizeto") | ||
363 | return new ResizeToCmd(dx, dy); | ||
364 | return new ResizeCmd(dx, dy); | ||
365 | } | ||
366 | |||
367 | REGISTER_COMMAND_PARSER(resize, ResizeCmd::parse); | ||
368 | REGISTER_COMMAND_PARSER(resizeto, ResizeCmd::parse); | ||
369 | REGISTER_COMMAND_PARSER(resizehorizontal, ResizeCmd::parse); | ||
370 | REGISTER_COMMAND_PARSER(resizevertical, ResizeCmd::parse); | ||
371 | |||
159 | ResizeCmd::ResizeCmd(const int step_size_x, const int step_size_y) : | 372 | ResizeCmd::ResizeCmd(const int step_size_x, const int step_size_y) : |
160 | m_step_size_x(step_size_x), m_step_size_y(step_size_y) { } | 373 | m_step_size_x(step_size_x), m_step_size_y(step_size_y) { } |
161 | 374 | ||
@@ -170,6 +383,53 @@ void ResizeCmd::real_execute() { | |||
170 | fbwindow().resize(w, h); | 383 | fbwindow().resize(w, h); |
171 | } | 384 | } |
172 | 385 | ||
386 | FbTk::Command *MoveToCmd::parse(const string &cmd, const string &args, | ||
387 | bool trusted) { | ||
388 | typedef std::vector<string> StringTokens; | ||
389 | StringTokens tokens; | ||
390 | FbTk::StringUtil::stringtok<StringTokens>(tokens, args); | ||
391 | |||
392 | if (tokens.size() < 2) | ||
393 | return 0; | ||
394 | |||
395 | unsigned int refc = MoveToCmd::UPPER|MoveToCmd::LEFT; | ||
396 | int dx = 0, dy = 0; | ||
397 | |||
398 | if (tokens[0][0] == '*') | ||
399 | refc |= MoveToCmd::IGNORE_X; | ||
400 | else | ||
401 | dx = atoi(tokens[0].c_str()); | ||
402 | |||
403 | if (tokens[1][0] == '*' && ! (refc & MoveToCmd::IGNORE_X)) | ||
404 | refc |= MoveToCmd::IGNORE_Y; | ||
405 | else | ||
406 | dy = atoi(tokens[1].c_str()); | ||
407 | |||
408 | if (tokens.size() >= 3) { | ||
409 | tokens[2] = FbTk::StringUtil::toLower(tokens[2]); | ||
410 | if (tokens[2] == "left" || tokens[2] == "upperleft" || tokens[2] == "lowerleft") { | ||
411 | refc |= MoveToCmd::LEFT; | ||
412 | refc &= ~MoveToCmd::RIGHT; | ||
413 | } else if (tokens[2] == "right" || tokens[2] == "upperright" || tokens[2] == "lowerright") { | ||
414 | refc |= MoveToCmd::RIGHT; | ||
415 | refc &= ~MoveToCmd::LEFT; | ||
416 | } | ||
417 | |||
418 | if (tokens[2] == "upper" || tokens[2] == "upperleft" || tokens[2] == "upperright") { | ||
419 | refc |= MoveToCmd::UPPER; | ||
420 | refc &= ~MoveToCmd::LOWER; | ||
421 | } else if (tokens[2] == "lower" || tokens[2] == "lowerleft" || tokens[2] == "lowerright") { | ||
422 | refc |= MoveToCmd::LOWER; | ||
423 | refc &= ~MoveToCmd::UPPER; | ||
424 | } | ||
425 | } | ||
426 | |||
427 | return new MoveToCmd(dx, dy, refc); | ||
428 | |||
429 | } | ||
430 | |||
431 | REGISTER_COMMAND_PARSER(moveto, MoveToCmd::parse); | ||
432 | |||
173 | MoveToCmd::MoveToCmd(const int step_size_x, const int step_size_y, const unsigned int refc) : | 433 | MoveToCmd::MoveToCmd(const int step_size_x, const int step_size_y, const unsigned int refc) : |
174 | m_step_size_x(step_size_x), m_step_size_y(step_size_y), m_refc(refc) { } | 434 | m_step_size_x(step_size_x), m_step_size_y(step_size_y), m_refc(refc) { } |
175 | 435 | ||
@@ -205,11 +465,40 @@ void ResizeToCmd::real_execute() { | |||
205 | fbwindow().resize(m_step_size_x, m_step_size_y); | 465 | fbwindow().resize(m_step_size_x, m_step_size_y); |
206 | } | 466 | } |
207 | 467 | ||
468 | REGISTER_COMMAND(fullscreen, FullscreenCmd); | ||
469 | |||
208 | FullscreenCmd::FullscreenCmd() { } | 470 | FullscreenCmd::FullscreenCmd() { } |
209 | void FullscreenCmd::real_execute() { | 471 | void FullscreenCmd::real_execute() { |
210 | fbwindow().setFullscreen(!fbwindow().isFullscreen()); | 472 | fbwindow().setFullscreen(!fbwindow().isFullscreen()); |
211 | } | 473 | } |
212 | 474 | ||
475 | FbTk::Command *SetAlphaCmd::parse(const string &command, const string &args, | ||
476 | bool trusted) { | ||
477 | typedef std::vector<string> StringTokens; | ||
478 | StringTokens tokens; | ||
479 | FbTk::StringUtil::stringtok<StringTokens>(tokens, args); | ||
480 | |||
481 | int focused, unfocused; | ||
482 | bool relative, un_rel; | ||
483 | |||
484 | if (tokens.empty()) { // set default alpha | ||
485 | focused = unfocused = 256; | ||
486 | relative = un_rel = false; | ||
487 | } else { | ||
488 | relative = un_rel = (tokens[0][0] == '+' || tokens[0][0] == '-'); | ||
489 | focused = unfocused = atoi(tokens[0].c_str()); | ||
490 | } | ||
491 | |||
492 | if (tokens.size() > 1) { // set different unfocused alpha | ||
493 | un_rel = (tokens[1][0] == '+' || tokens[1][0] == '-'); | ||
494 | unfocused = atoi(tokens[1].c_str()); | ||
495 | } | ||
496 | |||
497 | return new SetAlphaCmd(focused, relative, unfocused, un_rel); | ||
498 | } | ||
499 | |||
500 | REGISTER_COMMAND_PARSER(setalpha, SetAlphaCmd::parse); | ||
501 | |||
213 | SetAlphaCmd::SetAlphaCmd(int focused, bool relative, | 502 | SetAlphaCmd::SetAlphaCmd(int focused, bool relative, |
214 | int unfocused, bool un_relative) : | 503 | int unfocused, bool un_relative) : |
215 | m_focus(focused), m_unfocus(unfocused), | 504 | m_focus(focused), m_unfocus(unfocused), |
@@ -240,6 +529,8 @@ void SetAlphaCmd::real_execute() { | |||
240 | fbwindow().setUnfocusedAlpha(m_unfocus); | 529 | fbwindow().setUnfocusedAlpha(m_unfocus); |
241 | } | 530 | } |
242 | 531 | ||
532 | REGISTER_BOOLCOMMAND_WITH_ARGS(matches, MatchCmd); | ||
533 | |||
243 | bool MatchCmd::real_execute() { | 534 | bool MatchCmd::real_execute() { |
244 | return m_pat.match(winclient()); | 535 | return m_pat.match(winclient()); |
245 | } | 536 | } |