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/WorkspaceCmd.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/WorkspaceCmd.cc')
-rw-r--r-- | src/WorkspaceCmd.cc | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/WorkspaceCmd.cc b/src/WorkspaceCmd.cc index 536019c..5498b38 100644 --- a/src/WorkspaceCmd.cc +++ b/src/WorkspaceCmd.cc | |||
@@ -33,6 +33,8 @@ | |||
33 | #include "WindowCmd.hh" | 33 | #include "WindowCmd.hh" |
34 | 34 | ||
35 | #include "FbTk/KeyUtil.hh" | 35 | #include "FbTk/KeyUtil.hh" |
36 | #include "FbTk/CommandRegistry.hh" | ||
37 | #include "FbTk/stringstream.hh" | ||
36 | 38 | ||
37 | #ifdef HAVE_CMATH | 39 | #ifdef HAVE_CMATH |
38 | #include <cmath> | 40 | #include <cmath> |
@@ -42,6 +44,8 @@ | |||
42 | #include <algorithm> | 44 | #include <algorithm> |
43 | #include <functional> | 45 | #include <functional> |
44 | 46 | ||
47 | using std::string; | ||
48 | |||
45 | void WindowListCmd::execute() { | 49 | void WindowListCmd::execute() { |
46 | if (m_pat.error()) { | 50 | if (m_pat.error()) { |
47 | m_cmd->execute(); | 51 | m_cmd->execute(); |
@@ -66,6 +70,20 @@ void WindowListCmd::execute() { | |||
66 | } | 70 | } |
67 | } | 71 | } |
68 | 72 | ||
73 | FbTk::BoolCommand *SomeCmd::parse(const string &command, const string &args, | ||
74 | bool trusted) { | ||
75 | BoolCommand *boolcmd = | ||
76 | FbTk::CommandRegistry::instance().parseBoolLine(args, trusted); | ||
77 | if (!boolcmd) | ||
78 | return 0; | ||
79 | if (command == "some") | ||
80 | return new SomeCmd(FbTk::RefCount<FbTk::BoolCommand>(boolcmd)); | ||
81 | return new EveryCmd(FbTk::RefCount<FbTk::BoolCommand>(boolcmd)); | ||
82 | } | ||
83 | |||
84 | REGISTER_BOOLCOMMAND_PARSER(some, SomeCmd::parse); | ||
85 | REGISTER_BOOLCOMMAND_PARSER(every, SomeCmd::parse); | ||
86 | |||
69 | bool SomeCmd::bool_execute() { | 87 | bool SomeCmd::bool_execute() { |
70 | BScreen *screen = Fluxbox::instance()->keyScreen(); | 88 | BScreen *screen = Fluxbox::instance()->keyScreen(); |
71 | if (screen != 0) { | 89 | if (screen != 0) { |
@@ -108,6 +126,37 @@ bool EveryCmd::bool_execute() { | |||
108 | return true; | 126 | return true; |
109 | } | 127 | } |
110 | 128 | ||
129 | namespace { | ||
130 | |||
131 | FbTk::Command *parseWindowList(const string &command, | ||
132 | const string &args, bool trusted) { | ||
133 | int opts; | ||
134 | string pat; | ||
135 | FocusableList::parseArgs(args, opts, pat); | ||
136 | if (command == "attach") | ||
137 | return new AttachCmd(pat); | ||
138 | else if (command == "nextwindow") | ||
139 | return new NextWindowCmd(opts, pat); | ||
140 | else if (command == "nextgroup") { | ||
141 | opts |= FocusableList::LIST_GROUPS; | ||
142 | return new NextWindowCmd(opts, pat); | ||
143 | } else if (command == "prevwindow") | ||
144 | return new PrevWindowCmd(opts, pat); | ||
145 | else if (command == "prevgroup") { | ||
146 | opts |= FocusableList::LIST_GROUPS; | ||
147 | return new PrevWindowCmd(opts, pat); | ||
148 | } | ||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | REGISTER_COMMAND_PARSER(attach, parseWindowList); | ||
153 | REGISTER_COMMAND_PARSER(nextwindow, parseWindowList); | ||
154 | REGISTER_COMMAND_PARSER(nextgroup, parseWindowList); | ||
155 | REGISTER_COMMAND_PARSER(prevwindow, parseWindowList); | ||
156 | REGISTER_COMMAND_PARSER(prevgroup, parseWindowList); | ||
157 | |||
158 | }; // end anonymous namespace | ||
159 | |||
111 | void AttachCmd::execute() { | 160 | void AttachCmd::execute() { |
112 | BScreen *screen = Fluxbox::instance()->keyScreen(); | 161 | BScreen *screen = Fluxbox::instance()->keyScreen(); |
113 | if (screen != 0) { | 162 | if (screen != 0) { |
@@ -140,6 +189,21 @@ void PrevWindowCmd::execute() { | |||
140 | screen->cycleFocus(m_option, &m_pat, true); | 189 | screen->cycleFocus(m_option, &m_pat, true); |
141 | } | 190 | } |
142 | 191 | ||
192 | FbTk::Command *GoToWindowCmd::parse(const string &command, | ||
193 | const string &arguments, bool trusted) { | ||
194 | int num, opts; | ||
195 | string args, pat; | ||
196 | FbTk_istringstream iss(arguments.c_str()); | ||
197 | iss >> num; | ||
198 | string::size_type pos = arguments.find_first_of("({"); | ||
199 | if (pos != string::npos && pos != arguments.size()) | ||
200 | args = arguments.c_str() + pos; | ||
201 | FocusableList::parseArgs(args, opts, pat); | ||
202 | return new GoToWindowCmd(num, opts, pat); | ||
203 | } | ||
204 | |||
205 | REGISTER_COMMAND_PARSER(gotowindow, GoToWindowCmd::parse); | ||
206 | |||
143 | void GoToWindowCmd::execute() { | 207 | void GoToWindowCmd::execute() { |
144 | BScreen *screen = Fluxbox::instance()->keyScreen(); | 208 | BScreen *screen = Fluxbox::instance()->keyScreen(); |
145 | if (screen != 0) { | 209 | if (screen != 0) { |
@@ -149,6 +213,24 @@ void GoToWindowCmd::execute() { | |||
149 | } | 213 | } |
150 | } | 214 | } |
151 | 215 | ||
216 | FbTk::Command *DirFocusCmd::parse(const string &command, | ||
217 | const string &args, bool trusted) { | ||
218 | if (command == "focusup") | ||
219 | return new DirFocusCmd(FocusControl::FOCUSUP); | ||
220 | else if (command == "focusdown") | ||
221 | return new DirFocusCmd(FocusControl::FOCUSDOWN); | ||
222 | else if (command == "focusleft") | ||
223 | return new DirFocusCmd(FocusControl::FOCUSLEFT); | ||
224 | else if (command == "focusright") | ||
225 | return new DirFocusCmd(FocusControl::FOCUSRIGHT); | ||
226 | return 0; | ||
227 | } | ||
228 | |||
229 | REGISTER_COMMAND_PARSER(focusup, DirFocusCmd::parse); | ||
230 | REGISTER_COMMAND_PARSER(focusdown, DirFocusCmd::parse); | ||
231 | REGISTER_COMMAND_PARSER(focusleft, DirFocusCmd::parse); | ||
232 | REGISTER_COMMAND_PARSER(focusright, DirFocusCmd::parse); | ||
233 | |||
152 | void DirFocusCmd::execute() { | 234 | void DirFocusCmd::execute() { |
153 | BScreen *screen = Fluxbox::instance()->keyScreen(); | 235 | BScreen *screen = Fluxbox::instance()->keyScreen(); |
154 | if (screen == 0) | 236 | if (screen == 0) |
@@ -159,18 +241,51 @@ void DirFocusCmd::execute() { | |||
159 | screen->focusControl().dirFocus(*win, m_dir); | 241 | screen->focusControl().dirFocus(*win, m_dir); |
160 | } | 242 | } |
161 | 243 | ||
244 | REGISTER_COMMAND(addworkspace, AddWorkspaceCmd); | ||
245 | |||
162 | void AddWorkspaceCmd::execute() { | 246 | void AddWorkspaceCmd::execute() { |
163 | BScreen *screen = Fluxbox::instance()->mouseScreen(); | 247 | BScreen *screen = Fluxbox::instance()->mouseScreen(); |
164 | if (screen != 0) | 248 | if (screen != 0) |
165 | screen->addWorkspace(); | 249 | screen->addWorkspace(); |
166 | } | 250 | } |
167 | 251 | ||
252 | REGISTER_COMMAND(removelastworkspace, RemoveLastWorkspaceCmd); | ||
253 | |||
168 | void RemoveLastWorkspaceCmd::execute() { | 254 | void RemoveLastWorkspaceCmd::execute() { |
169 | BScreen *screen = Fluxbox::instance()->mouseScreen(); | 255 | BScreen *screen = Fluxbox::instance()->mouseScreen(); |
170 | if (screen != 0) | 256 | if (screen != 0) |
171 | screen->removeLastWorkspace(); | 257 | screen->removeLastWorkspace(); |
172 | } | 258 | } |
173 | 259 | ||
260 | namespace { | ||
261 | |||
262 | FbTk::Command *parseIntCmd(const string &command, const string &args, | ||
263 | bool trusted) { | ||
264 | int num = 1; | ||
265 | FbTk_istringstream iss(args.c_str()); | ||
266 | iss >> num; | ||
267 | if (command == "nextworkspace") | ||
268 | return new NextWorkspaceCmd(num); | ||
269 | else if (command == "prevworkspace") | ||
270 | return new PrevWorkspaceCmd(num); | ||
271 | else if (command == "rightworkspace") | ||
272 | return new RightWorkspaceCmd(num); | ||
273 | else if (command == "leftworkspace") | ||
274 | return new LeftWorkspaceCmd(num); | ||
275 | else if (command == "workspace") | ||
276 | // workspaces appear 1-indexed to the user, hence the minus 1 | ||
277 | return new JumpToWorkspaceCmd(num - 1); | ||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | REGISTER_COMMAND_PARSER(nextworkspace, parseIntCmd); | ||
282 | REGISTER_COMMAND_PARSER(prevworkspace, parseIntCmd); | ||
283 | REGISTER_COMMAND_PARSER(rightworkspace, parseIntCmd); | ||
284 | REGISTER_COMMAND_PARSER(leftworkspace, parseIntCmd); | ||
285 | REGISTER_COMMAND_PARSER(workspace, parseIntCmd); | ||
286 | |||
287 | }; // end anonymous namespace | ||
288 | |||
174 | void NextWorkspaceCmd::execute() { | 289 | void NextWorkspaceCmd::execute() { |
175 | BScreen *screen = Fluxbox::instance()->mouseScreen(); | 290 | BScreen *screen = Fluxbox::instance()->mouseScreen(); |
176 | if (screen != 0) | 291 | if (screen != 0) |
@@ -210,6 +325,7 @@ void JumpToWorkspaceCmd::execute() { | |||
210 | } | 325 | } |
211 | } | 326 | } |
212 | 327 | ||
328 | REGISTER_COMMAND(arrangewindows, ArrangeWindowsCmd); | ||
213 | 329 | ||
214 | /** | 330 | /** |
215 | try to arrange the windows on the current workspace in a 'clever' way. | 331 | try to arrange the windows on the current workspace in a 'clever' way. |
@@ -335,6 +451,8 @@ void ArrangeWindowsCmd::execute() { | |||
335 | } | 451 | } |
336 | } | 452 | } |
337 | 453 | ||
454 | REGISTER_COMMAND(showdesktop, ShowDesktopCmd); | ||
455 | |||
338 | void ShowDesktopCmd::execute() { | 456 | void ShowDesktopCmd::execute() { |
339 | BScreen *screen = Fluxbox::instance()->mouseScreen(); | 457 | BScreen *screen = Fluxbox::instance()->mouseScreen(); |
340 | if (screen == 0) | 458 | if (screen == 0) |
@@ -349,6 +467,8 @@ void ShowDesktopCmd::execute() { | |||
349 | } | 467 | } |
350 | } | 468 | } |
351 | 469 | ||
470 | REGISTER_COMMAND(closeallwindows, CloseAllWindowsCmd); | ||
471 | |||
352 | void CloseAllWindowsCmd::execute() { | 472 | void CloseAllWindowsCmd::execute() { |
353 | BScreen *screen = Fluxbox::instance()->mouseScreen(); | 473 | BScreen *screen = Fluxbox::instance()->mouseScreen(); |
354 | if (screen == 0) | 474 | if (screen == 0) |