aboutsummaryrefslogtreecommitdiff
path: root/src/FbCommands.cc
diff options
context:
space:
mode:
authorMathias Gumz <akira at fluxbox dot org>2013-01-31 08:13:45 (GMT)
committerMathias Gumz <akira at fluxbox dot org>2013-01-31 08:14:06 (GMT)
commitdc47491533e0ca7cf5a5386a10e68fbaf873e9db (patch)
tree4ee0c68722207189912a106d3f77e9cab52e65a8 /src/FbCommands.cc
parent716532dd47d718cb548da5f65b53a8b744ce235f (diff)
downloadfluxbox_pavel-dc47491533e0ca7cf5a5386a10e68fbaf873e9db.zip
fluxbox_pavel-dc47491533e0ca7cf5a5386a10e68fbaf873e9db.tar.bz2
Adds 'ClientPatternTest' command
ClientPatterns might be tricky to get right. Instead of fiddling around in either the keys-file or the apps-file and restarting fluxbox to see if the changes had any effect / matched the right windows, 'ClientPatternTest' and the fluxbox-remote should make this easier: $> fluxbox-remote "clientpatterntest (title=.*vim*)" This causes fluxbox to store the list of matched windows in the _FLUXBOX_ACTION_RESULT property onto the rootwindow. This property might then be read by: $> xprop -root _FLUXBOX_ACTION_RESULT or $> fluxbox-remote result The format of the list is: win_id \t title_of_window \n win_id is '-1' when fluxbox wasn't able to parse the given ClientPattern. win_id is '0' when there are no windows matching the given ClientPattern.
Diffstat (limited to 'src/FbCommands.cc')
-rw-r--r--src/FbCommands.cc82
1 files changed, 75 insertions, 7 deletions
diff --git a/src/FbCommands.cc b/src/FbCommands.cc
index b0289b8..eb7fbfd 100644
--- a/src/FbCommands.cc
+++ b/src/FbCommands.cc
@@ -445,13 +445,12 @@ REGISTER_UNTRUSTED_COMMAND_WITH_ARGS(bindkey, FbCommands::BindKeyCmd, void);
445BindKeyCmd::BindKeyCmd(const string &keybind):m_keybind(keybind) { } 445BindKeyCmd::BindKeyCmd(const string &keybind):m_keybind(keybind) { }
446 446
447void BindKeyCmd::execute() { 447void BindKeyCmd::execute() {
448 if (Fluxbox::instance()->keys() != 0) { 448 Keys* keys = Fluxbox::instance()->keys();
449 if (Fluxbox::instance()->keys()->addBinding(m_keybind)) { 449 if (keys && keys->addBinding(m_keybind)) {
450 ofstream ofile(Fluxbox::instance()->keys()->filename().c_str(), ios::app); 450 ofstream ofile(keys->filename().c_str(), ios::app);
451 if (!ofile) 451 if (!ofile)
452 return; 452 return;
453 ofile<<m_keybind<<endl; 453 ofile<<m_keybind<<endl;
454 }
455 } 454 }
456} 455}
457 456
@@ -542,4 +541,73 @@ void DeiconifyCmd::execute() {
542 }; 541 };
543} 542}
544 543
544
545REGISTER_COMMAND_WITH_ARGS(clientpatterntest, FbCommands::ClientPatternTestCmd, void);
546
547void ClientPatternTestCmd::execute() {
548
549 std::vector< const FluxboxWindow* > matches;
550 std::string result;
551 std::string pat;
552 int opts;
553 ClientPattern* cp;
554 Display* dpy;
555 Atom atom_utf8;
556 Atom atom_fbcmd_result;
557 Fluxbox::ScreenList::const_iterator screen;
558 const Fluxbox::ScreenList screens(Fluxbox::instance()->screenList());
559
560 dpy = Fluxbox::instance()->display();
561 atom_utf8 = XInternAtom(dpy, "UTF8_STRING", False);
562 atom_fbcmd_result = XInternAtom(dpy, "_FLUXBOX_ACTION_RESULT", False);
563
564 FocusableList::parseArgs(m_args, opts, pat);
565 cp = new ClientPattern(pat.c_str());
566
567 if (!cp->error()) {
568
569 const FocusableList* windows;
570 FocusControl::Focusables::const_iterator wit;
571 FocusControl::Focusables::const_iterator wit_end;
572
573 for (screen = screens.begin(); screen != screens.end(); screen++) {
574
575 windows = FocusableList::getListFromOptions(**screen, opts|FocusableList::LIST_GROUPS);
576 wit = windows->clientList().begin();
577 wit_end = windows->clientList().end();
578
579 for ( ; wit != wit_end; wit++) {
580 if (typeid(**wit) == typeid(FluxboxWindow) && cp->match(**wit)) {
581 matches.push_back(static_cast<const FluxboxWindow*>(*wit));
582 }
583 }
584 }
585
586 if (!matches.empty()) {
587 std::vector< const FluxboxWindow* >::const_iterator win;
588 for (win = matches.begin(); win != matches.end(); win++) {
589 result += "0x";
590 result += FbTk::StringUtil::number2HexString((*win)->clientWindow());
591 result += "\t";
592 result += (*win)->title().logical();
593 result += "\n";
594 }
595 } else {
596 result += "0\n";
597 }
598 } else {
599 result = "-1\t";
600 result += FbTk::StringUtil::number2String(cp->error_col());
601 result += "\n";
602 }
603
604
605 // write result to _FLUXBOX_ACTION_RESULT property
606 for (screen = screens.begin(); screen != screens.end(); screen++) {
607 (*screen)->rootWindow().changeProperty(atom_fbcmd_result, atom_utf8, 8,
608 PropModeReplace, (unsigned char*)result.c_str(), result.size());
609 }
610}
611
612
545} // end namespace FbCommands 613} // end namespace FbCommands