|
@@ -0,0 +1,64 @@
|
|
|
+use comm;
|
|
|
+use comm::Channel;
|
|
|
+use config::Config;
|
|
|
+use std::io;
|
|
|
+
|
|
|
+pub fn external(tx: &Channel, _cfg: &Config) {
|
|
|
+ let mut line = String::new();
|
|
|
+ loop {
|
|
|
+ line.clear();
|
|
|
+ io::stdin().read_line(&mut line).ok().expect("Failed to read line");
|
|
|
+ let kind = line.remove(0);
|
|
|
+ let line = line.trim();
|
|
|
+
|
|
|
+ match kind {
|
|
|
+ 'T' => comm::send(tx, "title", line),
|
|
|
+ 'M' => comm::send(tx, "cmus", &format!("%{{A:cmus:}}{}%{{A}}", line)),
|
|
|
+ 'W' => comm::send(tx, "desktops", &parse_bspwm(line)),
|
|
|
+ _ => ()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+fn parse_bspwm(line: &str) -> String {
|
|
|
+ let mut out = String::new();
|
|
|
+ let mut monitor_count = 0;
|
|
|
+ let mut monitor_selected = false;
|
|
|
+
|
|
|
+ let elems = line.split(':');
|
|
|
+ for elem in elems {
|
|
|
+ let mut chars = elem.chars();
|
|
|
+ let kind = chars.next().unwrap();
|
|
|
+ let name = chars.collect::<String>();
|
|
|
+
|
|
|
+ if kind == 'M' || kind == 'm' {
|
|
|
+ out = format!("{}%{{S{num}}}", out, num = monitor_count);
|
|
|
+ monitor_count += 1;
|
|
|
+ monitor_selected = kind.is_uppercase();
|
|
|
+ }
|
|
|
+ else if kind == 'L' {
|
|
|
+ }
|
|
|
+ else if kind == 'G' {
|
|
|
+ }
|
|
|
+ else if kind == 'T' {
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ let desktop = format!("%{{A:w{name}:}} {name} %{{A}}", name = name);
|
|
|
+ if kind.is_uppercase() {
|
|
|
+ if monitor_selected {
|
|
|
+ out = format!("{}%{{B#66CC66}}{}%{{B-}}", out, desktop);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ out = format!("{}%{{B#666666}}{}%{{B-}}", out, desktop);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if kind == 'U' || kind == 'u' {
|
|
|
+ out = format!("{}%{{B#CC0033}}{}%{{B-}}", out, desktop);
|
|
|
+ }
|
|
|
+ else if kind == 'O' || kind == 'o' {
|
|
|
+ out = format!("{}{}", out, desktop);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ out
|
|
|
+}
|