panty 0.2.0

Fast gVim summoner
Documentation

use std::collections::LinkedList;
use std::sync::Arc;
use std::sync::Mutex;
use std::thread;
use x11::xlib::Window;

use gvim;


#[derive(Clone)]
pub struct Stock {
    pub window: Window,
    pub servername: String
}


pub type Stocks = Arc<Mutex<LinkedList<Stock>>>;



pub fn collect(stocks: Stocks, n: usize) {
    let names = gvim::new_servernames(n);
    for servername in names {
        let stocks = stocks.clone();
        thread::spawn(move || {
            let window = gvim::spawn_secretly(&servername);
            {
                let mut stocks = stocks.lock().unwrap();
                stocks.push_back(Stock {window: window, servername: servername});
            }
        });
    }
}


pub fn emit(stocks: Stocks) -> Stock {
    loop {
        {
            let mut m_stocks = stocks.lock().unwrap();
            match m_stocks.pop_front() {
                Some(stock) => return stock,
                None => ()
            }
        }
    }
}


pub fn renew(stocks: Stocks, max_stocks: usize) {
    let killees = {
        let mut stocks = stocks.lock().unwrap();
        tap!((*stocks).clone() => stocks.clear())
    };

    thread::spawn(move || {
        with_display!(display => {
            for killee in killees {
                trace!("kill: {}", killee.servername);
                kill_window(display, killee.window);
            }
        });
        collect(stocks, max_stocks);
    });
}